0

有人可以解释一下 logcat 中的这个错误是什么意思?

 06-19 11:52:56.198: ERROR/cv::error()(8272): OpenCV Error: Assertion failed (corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1) in void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int), file /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/templmatch.cpp, line 70
 06-19 11:52:56.208: ERROR/AndroidRuntime(8272): FATAL EXCEPTION: Thread-2151
    CvException [org.opencv.core.CvException: /home/reports/ci/slave/50-SDK/opencv/modules/imgproc/src/templmatch.cpp:70: error: (-215) corrsize.height <= img.rows + templ.rows - 1 && corrsize.width <= img.cols + templ.cols - 1 in function void cv::crossCorr(const cv::Mat&, const cv::Mat&, cv::Mat&, cv::Size, int, cv::Point, double, int)
    ]
    at org.opencv.imgproc.Imgproc.matchTemplate_0(Native Method)
    at org.opencv.imgproc.Imgproc.matchTemplate(Imgproc.java:7226)
    at com.micaela.myapp.Eye.match(Eye.java:256)
    at com.micaela.myapp.Eye.access$100(Eye.java:22)
    at com.micaela.myapp.Eye$3.run(Eye.java:146)
    at java.lang.Thread.run(Thread.java:856)

在这段代码中调用了这个异常:

 Mat res;
    if ((roi.height() > MainActivity.tpl.height()) && (roi.width() > MainActivity.tpl.width())) {
        res = new Mat(new Size(roi.cols() - MainActivity.tpl.cols() + 1, roi.rows() - MainActivity.tpl.rows() + 1), CvType.CV_32FC1);
        Imgproc.matchTemplate(roi, MainActivity.tpl, res, Imgproc.TM_SQDIFF);
        if (left) {
            return new Point((eyeRect.x + this.roi.width() - matchRect.x - Math.round(Core.minMaxLoc(res).maxLoc.x + (MainActivity.tpl.width() / 2))),
                    (Math.round(Core.minMaxLoc(res).maxLoc.y + (MainActivity.tpl.height() / 2)) + matchRect.y + eyeRect.y));
        } else {
            return new Point((Math.round(Core.minMaxLoc(res).maxLoc.x + (MainActivity.tpl.width() / 2)) + matchRect.x + eyeRect.x), (Math.round(Core.minMaxLoc(res).maxLoc.y + (MainActivity.tpl.height() / 2)) + matchRect.y + eyeRect.y));
        }
    }

在:

Imgproc.matchTemplate(roi, MainActivity.tpl, res, Imgproc.TM_SQDIFF);

我正在使用最新版本的 opencv4android 库在 Android 中编程。

4

2 回答 2

1

确保所有参数matchTemplate()的大小和类型都正确。来自 OpenCV 文档:

  • image – 搜索运行的图像。它必须是 8 位或 32 位浮点数。
  • templ - 搜索的模板。它必须不大于源图像并且具有相同的数据类型。

因此,请使 sur与(它们都必须是 8 位或 32 位浮点)roi具有相同的类型。并且都应该有 1 个频道。MainActivity.tplroiMainActivity.tpl

另外,我认为您不必res;分配res = new Mat(new Size(roi.cols() - MainActivity.tpl.cols() + 1, roi.rows() - MainActivity.tpl.rows() + 1), CvType.CV_32FC1);. 我认为,如果未分配,它将在您调用时自动创建matchTemplate(尽管res建议分配以提高速度)。

于 2013-06-19T13:20:16.770 回答
1

您的模板大小似乎小于 1x1 像素。OpenCV 无法处理空模板。

于 2013-06-19T12:21:35.410 回答