OpenCV Mat 拷贝与ROI

Posted tiemaxiaosu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV Mat 拷贝与ROI相关的知识,希望对你有一定的参考价值。



(1)浅拷贝

  1. //注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)  
  2. Mat a;  
  3. Mat b = a; //a "copy" to b  
  4. Mat c(a); //a "copy" to c  
//注意:浅拷贝 -  不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用)
Mat a;
Mat b = a; //a "copy" to b
Mat c(a); //a "copy" to c

(2)深拷贝

  1. //注意:复制一个图像的ROI到另外一个图像的指定区域就简单多了。

    如opencv中给出的例子

    Rect r(1, 1, 10, 20); // 指定src 的 ROI子图像区域

    Mat dstroi =dst(Rect(0,10,r.width,r.height)); // 拿到 dst指定区域子图像的引用

    src(r).convertTo(dstroi, dstroi.type(), 1,0); // ROI子图像之间的复制

    此时,无需指定图像的ROI,计算也比较方便,清晰。
  2. Mat a;  
  3. Mat b = a.clone(); //a copy to b  
  4. Mat c;  
  5. a.copyTo(c); //a copy to c 

       6、src.convertTo(dst, type, scale, shift)

         当src.depth==dst.depth且noscale时,等同于copyTo(创建并复制);其他,转换并复制数据

(3)ROI

       复制一个图像的ROI到另外一个图像的指定区域就简单多了。如opencv中给出的例子

       Rect r(1, 1, 10, 20);  // 指定src 的 ROI子图像区域

       Mat dstroi =dst(Rect(0,10,r.width,r.height)); // 拿到 dst指定区域子图像的引用

       src(r).convertTo(dstroi, dstroi.type(), 1,0); // ROI子图像之间的复制

        此时,无需指定图像的ROI,计算也比较方便,清晰。

备注:

opencv矩阵赋值函数copyTo、clone、重载元算赋‘=’之间实现的功能相似均是给不同的矩阵赋值功能。

copyTo和clone函数基本相同,被赋值的矩阵和赋值矩阵之间空间独立,不共享同一空间。

但是重载元算赋‘=’,被赋值的矩阵和赋值矩阵之间空间共享,改变任一个矩阵的值,会同时影响到另一个矩阵。当矩阵作为函数的返回值时其功能和重载元算赋‘=’相同,赋值运算赋会给矩阵空间增加一次计数,所以函数变量返回后函数内部申请的变量空间并不会被撤销,在主函数中仍可以正常使用传递后的参数。







 











      以上是关于OpenCV Mat 拷贝与ROI的主要内容,如果未能解决你的问题,请参考以下文章

      Mat OpenCV Rect ROI:访问冲突

      关于opencv中cv::Mat设置roi

      OpenCV中Multidimesional cv::Mat的多维ROI

      OpenCV在限定的ROI中进行模版匹配问题,求指点!!

      opencv4opencv教程 C++ 4Mat对象(深拷贝:clone()copyTo(),create()创建图片,zeros()eye()初始化空白图像,Scalar()创建向量)

      opencv4opencv视频教程 C++ 5读写图像imreadimwrite读写像素at<>()修改像素值ROI区域选择(图像裁剪)RectVec3b与Vec3FCV_32F)