我在这里看到了一些与我的错误相关的问题,例如 this和 this我知道如果图像和模板没有相同的数据类型,我无法执行 Imgproc.matchTemplate()
方法。但我仍然对如何知道我正在使用什么类型的 Mat
感到困惑。
下面是我从示例 here 改编而来的代码:
for (int i = 0; i < 24; i++) {
arrDraw[i] = getResources().getIdentifier("let" + i, "drawable", getPackageName());
}
Mat mImage = input.submat(bigRect);
for (int i = 0; i < 24; i++) {
Mat mTemplate = Utils.loadResource(this, arrDraw[i], Highgui.CV_LOAD_IMAGE_COLOR);
Mat mResult = new Mat(mImage.rows(), mImage.cols(), CvType.CV_32FC1);
Imgproc.matchTemplate(mImage, mTemplate, mResult, match_method);
Core.normalize(mResult, mResult, 0, 1, Core.NORM_MINMAX, -1, new Mat());
... // further process
}
所以基本上我想做的是从 inputFrame
的 submat 中获取 mImage
并将模板过程与其他 24 张图片进行匹配,并确定哪一个具有最佳值(value)(最低或最高)。然而错误表明了这一点。
OpenCV Error: Assertion failed ((img.depth() == CV_8U || img.depth() == CV_32F) && img.type() == templ.type()) in void cv::matchTemplate(cv::InputArray, cv::InputArray, cv::OutputArray, int), file /home/reports/ci/slave_desktop/50-SDK/opencv/modules/imgproc/src/templmatch.cpp, line 249
我尝试首先使用相同的类型初始化mImage
和mTemplate
,但仍然没有成功。有什么建议吗?先谢谢了。
最佳答案
错误告诉您图像和模板具有不同的类型。
Assertion failed ... img.type() == templ.type() ....
我愿意打赌(少量)mTemplate
是订购的 CV_8UC3 BGR。
从您发布的代码中,无法判断 mImage
的类型是什么,尽管如果它是从相机帧中提取的,并且如果您执行了以下操作:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat inputFrame = inputFrame.rgba();
....
}
那么它很可能是 CV_8UC4 BGRA 订购的。这不是同一类型。
另外,我不确定 submat() 的行为是 3D 还是 4D 输入矩阵,我认为它设计为仅在 2D 矩阵上操作,因此您可能会发现它返回 2D 矩阵 (CV_8UC2)或者一些未定义的怪异。
我建议您尝试在 matchTemplate( ... )< 之前转储
调用。type()
和 depth()
或图像和模板
关于android - OpenCV Android - 匹配模板错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30181134/