2015-05-18 51 views
1

因此,我正在使用OpenCVCameraView爲輸入圖像中的特定區域進行模板匹配。以下是我的代碼的樣子。模板匹配 - 爲什麼結果矩陣小於指定值?

Mat input; 
Rect bigRect = ...; //specific size 

public Mat onCameraFrame(CvCameraViewFrame inputFrame) { 
    input = inputFrame.rgba(); 
    ... 
} 

public void Template(View view) { 
    Mat mImage = input.submat(bigRect); 
    Mat mTemplate = Utils.loadResource(this, R.id.sample, Highgui.CV_LOAD_IMAGE_COLOR); 
    Mat mResult = new Mat(mImage.rows(), mImage.cols(), CvType.CV_32FC1); // I use the same size as mImage because mImage's size is already smaller than inputFrame 

    Imgproc.cvtColor(mImage, mImage, Imgproc.COLOR_RGBA2RGB); //convert is needed to make mImage and mTemplate to be the same type 

    Imgproc.matchTemplate(mImage, mTemplate, mResult, match_method);   
    Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 

    mResult.convertTo(mResult, CvType.CV_8UC1); // I convert the matrix because I need to show it to imageview via bitmap 

    Bitmap bmResult1 = Bitmap.createBitmap(mImage.width(), mImage.height(), Bitmap.Config.RGB_565); 
    Bitmap bmResult2 = Bitmap.createBitmap(mResult.width(), mResult.height(), Bitmap.Config.RGB_565); 
    Utils.matToBitmap(mImage, bmResult1); 
    Utils.matToBitmap(mResult, bmResult2); 
    ImageView1.setImageBitmap(bmResult1); 
    ImageView2.setImageBitmap(bmResult2); 
} 

的我試圖輸出使用toString()矩陣,並得到這些結果:

mImage: Mat [250*178*CV_8UC3, isCont=true, isSubmat=false, ...] 
mResult: Mat [180*94*CV_8UC1, isCont=true, usSubmat=false, ...] 

而且我的問題是:

  1. 爲什麼mResult大小比mImage較小,儘管已經聲明該mResult大小是基於mImage大小?
  2. 事實證明,通過使用CV_8UC1類型,內容只有黑色和白色可供選擇,而mResult應該有浮點值,但Utils.matToBitmap方法不支持大於CV_8UC1CV_8UC3,並CV_8UC4其他墊類型。有沒有什麼辦法顯示CV_32FC1位圖,它顯示mResult的真實灰度?
+0

opencv文檔說:'結果 - 比較結果的地圖。它必須是單通道32位浮點。如果圖像是W \ times H並且templ是w \ times h,那麼結果是(W-w + 1)\ times(H-h + 1).'所以我猜你的模板的大小是[69,83]? ? – Micka

回答

1

爲什麼mResult規模儘管已經宣佈 是mResult大小是根據mImage尺寸比mImage小嗎?

作爲模板匹配基本上是一個空間卷積,具有高度Hh的圖像執行時,結果將是H-h+1。與結果寬度相同(W-w+1)。但是您仍然可以將resize的結果返回到(mImage.rows(), mImage.cols())之後模板匹配。

事實證明,通過使用CV_8UC1類型,其內容只適用於 黑色或白色,而mResult應該有浮點值,但 Utils.matToBitmap方法不支持除CV_8UC1其他墊類型, CV_8UC3和CV_8UC4。有沒有什麼辦法可以顯示CV_32FC1到位圖, 它顯示了mResult的真實灰度?

關鍵是在這兩條線,我想:

Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat()); 
mResult.convertTo(mResult, CvType.CV_8UC1); // I convert the matrix because I need to show it to imageview via bitmap 

你就不能正常化它0到255之間取值?

Core.normalize(mResult, mResult, 0, 255, Core.NORM_MINMAX, -1, new Mat()); 
+0

調整結果如果結果可能會對解釋造成危險。除非你確切地知道你爲什麼想這麼做。 – Micka

+1

表示也許?我不知道。正如你所說,這可能不被推薦,但如果OP希望它達到那個尺寸,我只是指出瞭如何去做。 –

+1

我看了OpenCV教程[這裏](http://docs.opencv.org/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#results),它看起來像結果馬具有圖像墊一樣的尺寸所以我認爲它代表性更好。 –