cv :: Mat_是否保持其投资回报率?

时间:2016-11-15 03:05:21

标签: c++ opencv opencv3.0

假设我有一个名为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中解释的轮廓?

2 个答案:

答案 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