OpenCV Android - 匹配模板错误
OpenCV Android - error on match template
我在这里看到了一些与我的错误相关的问题,例如 this and 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
的子垫中取出 mImage
并将模板处理与其他 24 张图片进行匹配,然后决定哪个具有最佳值(最低或最高)。然而错误显示了这一点。
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 矩阵上运行,因此您可能会发现它 returns二维矩阵 (CV_8UC2) 或一些未定义的怪异现象。
我建议您在 matchTemplate( ... )
调用之前尝试转储 type()
和 depth()
或同时转储图像和模板。
我在这里看到了一些与我的错误相关的问题,例如 this and 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
的子垫中取出 mImage
并将模板处理与其他 24 张图片进行匹配,然后决定哪个具有最佳值(最低或最高)。然而错误显示了这一点。
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 矩阵上运行,因此您可能会发现它 returns二维矩阵 (CV_8UC2) 或一些未定义的怪异现象。
我建议您在 matchTemplate( ... )
调用之前尝试转储 type()
和 depth()
或同时转储图像和模板。