【问题标题】:What's the difference between Mat::clone and Mat::copyTo?Mat::clone 和 Mat::copyTo 有什么区别?
【发布时间】:2019-01-21 23:59:35
【问题描述】:

我知道“copyTo”可以处理掩码。但是当不需要面具时,我可以同时使用两者吗?

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-clone

【问题讨论】:

  • 没有掩码都是一样的..
  • 谢谢。我应该阅读源代码而不仅仅是文档。

标签: opencv


【解决方案1】:

实际上,即使没有面具,它们也相同。

主要区别在于,当目标矩阵和源矩阵的类型和大小相同时,copyTo不会改变目标矩阵的地址,而clone会一直为目标矩阵分配一个新地址.

当在copyToclone 之前使用复制赋值运算符复制目标矩阵时,这一点很重要。例如,

使用copyTo

Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat3.copyTo(mat1);
cout << mat1 << endl;
cout << mat2 << endl;

输出:

[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]

使用clone

Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1;
Mat mat3 = Mat::zeros(1, 5, CV_32F);
mat1 = mat3.clone();
cout << mat1 << endl;
cout << mat2 << endl;

输出:

[0, 0, 0, 0, 0]
[1, 1, 1, 1, 1]

【讨论】:

    【解决方案2】:

    这是Mat::clone()函数的实现:

    inline Mat Mat::clone() const
    {
      Mat m;
      copyTo(m);
      return m;
    }
    

    因此,正如@rotating_image 所提到的,如果您不为copyTo() 功能提供mask,则它与clone() 相同。

    【讨论】:

    • 克隆和赋值有什么区别?喜欢:垫m1;垫 m2; m1 = m2;
    • Mat::clone() 后面的const 是什么?
    • 你写的不对。请参阅@yangjie 和 OpenCV 文档的以下答案:“指定操作掩码时,如果上面显示的 Mat::create 调用重新分配矩阵,则在复制数据之前将新分配的矩阵初始化为全零。”但是当您不提供掩码时,数据会被复制而不重新分配,这意味着指向该矩阵的其他 Mat 将修改值!
    【解决方案3】:

    Mat::copyTo 用于当您已经有一个目标cv::Mat 时(可能是或)已经分配了正确的数据大小。当您知道必须分配一个新的cv::Mat 时,Mat::clone 很方便。

    【讨论】:

      【解决方案4】:

      copyTo 不会在堆中分配新内存,这样更快。

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 2020-02-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2011-11-10
        • 1970-01-01
        • 2015-09-20
        • 1970-01-01
        相关资源
        最近更新 更多