【问题标题】:Does cv::Mat_ maintain its ROI?cv::Mat_ 是否保持其投资回报率?
【发布时间】:2016-11-15 03:05:20
【问题描述】:

假设我有一个 100x100 cv::Mat1b,名为 image。然后我做:

cv::Mat1b subImage = image(cv::Rect(0,0,49,49));

image的左上角变成subImage。然后说我将subImage 传递给一个函数,比如cv::findContours。生成的轮廓是否与imagesubImage 相关?也就是说,findContours() 是否知道subImage 实际上是一个子图像?或者所有 OpenCV 函数只是将像这样提取的subImage 视为“完整图像”,然后调用者负责将提取区域的角添加到轮廓像素的每个坐标(在本例中)以得到原始image中解释的轮廓?

【问题讨论】:

    标签: c++ opencv opencv3.0


    【解决方案1】:

    子图像被视为完整图像,在子图像上调用的函数不知道它不是完整图像。

    findcontour 函数确实采用 ROI 坐标的可选参数,以便返回相对于完整图像的轮廓坐标或者您可以简单地为每个轮廓点添加偏移量

    【讨论】:

    • 啊,我现在看到了这个论点,很有趣。最好确认默认情况下,尽管没有任何东西会假设图像可能是子图像。
    • @DavidDoria,这些函数不会以不同的方式处理子图像(尽管存在数据以确定它们是子图像) findcontour 是一种特殊情况,因为您经常希望使用轮廓来执行此操作
    【解决方案2】:

    如果你声明 subImage 为:

    Mat1b subImage = image(cv::Rect(0,0,49,49));
    

    然后subImage 将被任何 OpenCV 函数视为一个完整的 Mat 对象。 但是,在subImage 中所做的任何更改也将反映在image 的相应部分中。

    如果您想从image 中排除在subImage 中所做的更改,您应该使用:

    Mat1b subImage = image(cv::Rect(0,0,49,49)).clone();
    

    现在你有一个subImage 不指向image

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多