我正在使用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
}
为什么会出现此错误?
答案 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));
}
}