我正在尝试使用OpenCV和Java(不是原生)在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的大小在我创建时并不重要,因为它是由模板匹配函数设置的。
在将其转换为 bmp 之前,是否需要将 mResult mat 转换为某些内容?
在将mat转换为mat之前,是否需要将 bmp 转换为某些内容?
答案 0 :(得分:2)
您需要将位图转换为RGBA格式,反之亦然。也许你需要看看这里:https://groups.google.com/group/android-opencv/和这里:Java openCV - Error while conevrting Bitmap to Mat
答案 1 :(得分:2)
问题是matchTemplate()
结果是浮点单通道Mat
所以我需要规范化mResult载体。
解决方案是:
void TemplateMatch(){
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);
}