因此,我正在使用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, ...]
而且我的問題是:
- 爲什麼
mResult
大小比mImage
較小,儘管已經聲明該mResult
大小是基於mImage
大小? - 事實證明,通過使用
CV_8UC1
類型,內容只有黑色和白色可供選擇,而mResult應該有浮點值,但Utils.matToBitmap
方法不支持大於CV_8UC1
,CV_8UC3
,並CV_8UC4
其他墊類型。有沒有什麼辦法顯示CV_32FC1
位圖,它顯示mResult
的真實灰度?
opencv文檔說:'結果 - 比較結果的地圖。它必須是單通道32位浮點。如果圖像是W \ times H並且templ是w \ times h,那麼結果是(W-w + 1)\ times(H-h + 1).'所以我猜你的模板的大小是[69,83]? ? – Micka