cv::Mat括号操作符复制或引用感兴趣的区域吗?



本文档在cv::Mat上定义了一个括号运算符,该运算符将cv::Rect类型的感兴趣的矩形区域作为参数:

Mat cv::Mat::operator() (const Rect & roi) const

但是文档没有解释操作符的语义。它是否复制了感兴趣的区域?还是在创建的新Mat中引用它?

如果我改变原来的Mat,新的Mat也会改变吗?

我猜它是复制的,因为roi在大多数情况下不是一个连续的内存块。但是文档中没有明确地说明这一点,所以我只是想确保它没有使用一些特殊的内存技巧,最终将两个Mats耦合在一起。

这是一个引用,除非你显式地复制数据。


您可以使用一个小示例来看到这一点:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
    Rect r(0,0,2,2);
    Mat1b mat(3,3, uchar(0));
    cout << mat << endl;
    // mat
    // 0 0 0
    // 0 0 0
    // 0 0 0
    Mat1b submat_reference1(mat(r));
    submat_reference1(0,0) = 1;
    cout << mat << endl;
    cout << submat_reference1 << endl;
    // mat 
    // 1 0 0
    // 0 0 0
    // 0 0 0
    // submat_reference1
    // 1 0
    // 0 0
    Mat1b submat_reference2 = mat(r);
    submat_reference2(0, 0) = 2;
    cout << mat << endl;
    cout << submat_reference1 << endl;
    cout << submat_reference2<< endl;
    // mat
    // 2 0 0
    // 0 0 0
    // 0 0 0
    // submat_reference1 = submat_reference2
    // 2 0
    // 0 0

    Mat1b submat_deepcopy = mat(r).clone();
    submat_deepcopy(0,0) = 3;
    cout << mat << endl;
    cout << submat_reference1 << endl;
    cout << submat_reference2 << endl;
    cout << submat_deepcopy << endl;
    // mat      
    // 2 0 0
    // 0 0 0
    // 0 0 0
    // submat_reference1 = submat_reference2
    // 2 0
    // 0 0
    // submat_deepcopy 
    // 3 0 
    // 0 0
    return 0;
}

相关内容

  • 没有找到相关文章

最新更新