模板匹配 - 为什么结果矩阵小于指定的?

时间:2015-05-18 07:08:13

标签: java android opencv image-processing template-matching

所以我使用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_8UC3CV_8UC4。有没有办法向位图显示CV_32FC1它显示mResult的实际灰度?

1 个答案:

答案 0 :(得分:1)

  

为什么mResult大小小于mImage尽管已经声明了   mResult大小是基于mImage大小?

由于模板匹配基本上是空间卷积,因此在使用高度为Hh的图像执行时,结果将为H-h+1。与结果宽度(W-w+1)相同。但在模板匹配后,您仍然可以resize将结果返回(mImage.rows(), mImage.cols())

  

事实证明,通过使用CV_8UC1类型,内容仅在   黑色或白色,而mResult应该具有浮动值,但是   Utils.matToBitmap方法不支持CV_8UC1以外的mat类型,   CV_8UC3和CV_8UC4。有没有办法将CV_32FC1显示到Bitmap   它显示了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());