OpenCV错误:templmatch.cpp中的断言失败CvException

时间:2013-06-19 10:02:47

标签: android opencv match

有人可以解释一下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);

我在Android中编程,使用opencv4android库,最后一个版本。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

因此,假设roiMainActivity.tpl的类型相同(它们都必须是8位或32位浮点)。 roiMainActivity.tpl都应该有1个频道。

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