如何在OpenCV

时间:2019-07-01 17:37:27

标签: c++ opencv

我正在使用4.0.0版的OpenCV。我试图将一些图像拼接在一起并修剪生成的图像,虽然能够拼接图像,但无法修剪生成的图像。

我的程序不断中止,并出现以下错误:

  

libc ++ abi.dylib:以类型为cv :: Exception的未捕获异常终止:OpenCV(4.0.0)/Users/RAR/opencv/modules/core/src/umatrix.cpp:545:错误:(- 215:声明失败)0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function'UMat'

     

中止陷阱:6

该错误发生在下面的代码中的stitched = stitched(cv::boundingRect(c));行。

while (cv::countNonZero(sub) > 0) {
            cv::erode(minRect, minRect, cv::Mat());  // Erode the minimum rectangular mask
            cv::subtract(minRect, thresh, sub);  // Subtract the thresholded image from the minmum rectangular mask (count if there are any non-zero pixels left)
            std::vector<std::vector<cv::Point>> cnts4;
            cv::findContours(minRect.clone(), cnts4, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
            c = cnts4[0];
            for (auto iter = cnts4.begin(); iter != cnts4.end(); ++iter) {
                if (cv::contourArea(*iter) > cv::contourArea(c)) { // Finds the largest contour (the contour/outline of the stitched image)
                    c = *iter;
                }
            }

            stitched = stitched(cv::boundingRect(c));  // Extract the bounding box and use the bounding box coordinates to extract the final stitched images
}

为什么会出现此错误?

2 个答案:

答案 0 :(得分:1)

根据OP的评论:

stitched: cols: 4295 rows: 2867 bounding rect[4274 x 2845 from (11, 12)] 
stitched: cols: 4274 rows: 2845 bounding rect[4272 x 2843 from (12, 13)]

在第一种情况下,矩形尝试从(4274, 2845)图像中的(11, 12)提取大小stitched。这意味着它将(11, 12)(4285, 2857)的像素,这在stitched图像的边界内,因为stitched图像的大小为(4295, 2867)没问题

在第二种情况下,矩形尝试从(4272, 2843)图像中的(12, 13)提取大小stitched。这意味着它将像素从(12, 13)移到(4284, 2856),这超出了缝合图像的范围,因为stitched图像的大小为{{ 1}}。 问题

您要提取的子图像比更大的图像大得多。

  

(-215:声明失败)0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows

错误消息也表明了这一点。错误消息中的(4274, 2845)是指您尝试使用roi提取的子图像,而cv::boundingRect(c)m图像。此矩形的坐标超出了stitched图片的大小。

您可以通过手动设置矩形的坐标来进行测试。

stitched应该不会出错

您将收到stitched(cv::Rect(11, 12, cv::Size(4274, 2845)

错误

答案 1 :(得分:0)

最后的迭代是问题所在,因为它找不到任何轮廓。

也许您可以尝试类似的方法:

int nonZeroCount = 1;
while (nonZeroCount) 
{
    cv::erode(minRect, minRect, cv::Mat());
    cv::subtract(minRect, thresh, sub);
    nonZeroCount = cv::countNonZero(sub);
    if (nonZeroCount)
    {
        std::vector< std::vector<cv::Point> > cnts4;
        cv::findContours(minRect.clone(), cnts4, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
        c = cnts4[0];
        for (auto iter = cnts4.begin(); iter != cnts4.end(); ++iter) 
        {
            if (cv::contourArea(*iter) > cv::contourArea(c))
            {
                c = *iter;
            }
        }
        stitched = stitched(cv::boundingRect(c));
    }
}