假设我有一个名为cv::Mat1b
的100x100 image
。然后我做:
cv::Mat1b subImage = image(cv::Rect(0,0,49,49));
将image
的左上角变为subImage
。然后说我将subImage
传递给一个函数,比如cv::findContours
。结果轮廓是相对于image
还是subImage
?也就是说,findContours()
知道subImage
实际上是一个子图像吗?或者,所有OpenCV函数都将subImage
这样提取出来作为"完整图像"然后调用者有责任将提取区域的角添加到轮廓像素的每个坐标(在本例中为),以获得原始image
中解释的轮廓?
答案 0 :(得分:1)
子图像被视为完整图像,子图像上调用的函数不知道它不是一个完整的图像。
然而,findcontour函数确实采用了ROI坐标的可选参数,以便相对于整个图像返回轮廓坐标。或者,您可以简单地为每个轮廓点添加偏移量
答案 1 :(得分:1)
如果将subImage声明为:
Mat1b subImage = image(cv::Rect(0,0,49,49));
然后subImage
将被任何OpenCV函数视为完整的Mat对象。
但是,subImage
中所做的任何更改都会反映在image
的相应部分中。
如果您要从subImage
中排除image
中所做的更改,您应该使用:
Mat1b subImage = image(cv::Rect(0,0,49,49)).clone();
现在您的subImage
未指向image