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

我尝试先用相同的类型初始化 mImagemTemplate,但仍然没有成功。有什么建议吗?先谢谢了。

错误告诉您图像和模板的类型不同。

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() 或同时转储图像和模板。