4

我正在尝试使用带有 Java 的 OpenCV(而不是本机)在 Android 上创建模板匹配函数。

我的问题是显示图像。mattoBitmap类有效(在 Java 中),但如果我想转换模板匹配函数的结果,我会FATAL EXCEPTION在调用该Utils.matToBitmap函数时得到一个。

下面是相关代码:

void TemplateMatch() {

    mFind = new Mat(256, 192, CvType.CV_8UC4);
    Input = new Mat(256, 192, CvType.CV_8UC4);

    mResult = new Mat(217, 153, CvType.CV_8UC4); // (bmp2 size is 40)

    Utils.bitmapToMat(bmp2, mFind);
    Utils.bitmapToMat(bmp1, Input);

    Imgproc.matchTemplate(mFind, Input, mResult, Imgproc.TM_SQDIFF);

    bmp3 = Bitmap.createBitmap(mResult.cols(), mResult.rows(), conf);

    Utils.matToBitmap(mResult, bmp3);

    iv2.setImageBitmap(bmp3);

}

据我所知,mResult 的大小在创建时并不重要,因为它是由模板匹配函数随后设置的。

在将mResult mat转换为bmp之前,是否需要将其转换为某种东西?

我需要先将bmp转换为某种东西,然后才能将 mat 转换为它吗?

4

2 回答 2

2

您需要将位图转换为 RGBA 格式,反之亦然。也许你需要看看这里:https ://groups.google.com/group/android-opencv/和这里:Java openCV - 将位图转换为 Mat 时出错

于 2012-12-16T12:00:57.887 回答
2

问题是matchTemplate()结果是一个浮点单通道 Mat 所以我需要对 mResult 向量进行归一化。解决方案是:

无效模板匹配(){

mFind=new Mat(256, 192, CvType.CV_8UC4); 
Input = new Mat(256, 192, CvType.CV_8UC4); 

Mat mResult8u = new Mat(256, 192, CvType.CV_8UC4); 

mResult = new Mat(217, 153, CvType.CV_8UC4); 

Utils.bitmapToMat(bmp2, mFind);
Utils.bitmapToMat(bmp1, Input);


Imgproc.matchTemplate(mFind, Input, mResult, Imgproc.TM_SQDIFF) ;
bmp3= Bitmap.createBitmap(mResult.cols(),  mResult.rows(),Bitmap.Config.ARGB_8888);
Core.normalize(mResult, mResult8u, 0, 255, Core.NORM_MINMAX, CvType.CV_8U);
Utils.matToBitmap(mResult8u, bmp3);
iv2.setImageBitmap(bmp3);

}
于 2012-12-18T09:30:29.837 回答