OpenCV图像拷贝方法与注意点(=、copy、clone)

来源:互联网 发布:茶叶推广方案 知乎 编辑:程序博客网 时间:2024/06/01 08:52

下面介绍三种OpenCV复制图像的方法:

方法1、重载运算符=

使用重载运算符“=”进行的拷贝是一种浅拷贝,虽然它们有不同的矩阵头,但是二者共享相同的内存空间,二者内容相互关联,任何一个变量变化的同时另一个变量也随之改变。

/*OpenCV v1版本*/IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 IplImage img_copy = img_origin;  // 直接赋值,浅拷贝/*OpenCV v2之后版本*/Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图 Mat img_copy = img_origin; 

方法2、cvCopy

cvCopy的原型是:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask CV_DEFAULT(NULL) );
OpenCV官网关于cvCopy函数的介绍
在使用这个函数之前,必须先用cvCreateImage()一类的函数开辟一段内存,然后传递给dst。cvCopy会把src中的数据复制到dst的内存中。这是一种深拷贝,真正地拷贝了一个新的图像矩阵,此时二者相互之间没有影响,但是如果设置了ROI、COI,copy只会复制ROI、COI区域的内容。

/*OpenCV v1版本*/IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 IplImage img_copy = cvCreateImage(Size(img_origin->width, img_origin ->height), img_origin ->depth, img_origin ->nChannels); // 开辟一个新的内存空间,图像的大小、深度与颜色通道与原图保持一致cvCopy(img_origin, img_copy);  // 拷贝图像/*OpenCV v2之后版本*/Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图 Mat img_copy;img_origin.copyTo(img_copy);  //在拷贝数据前会有一步img_copy.create(this->size , this->type)  

方法3、cvCloneImage

cvCloneImage的原型是:
IplImage* cvCloneImage( const IplImage* image );
OpenCV官网关于cvCloneImage函数的介绍
在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好图像里面的数据,然后返回这段内存中的数据。clone是把所有的都复制过来,不论你是否设置了ROI、COI等影响,clone都会原封不动的克隆过来。用clone复制后,如果源图像在内存中消失,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变。

/*OpenCV v1版本*/IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 IplImage img_copy = cvCloneImage(img_origin);/*OpenCV v2之后版本*/Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图Mat img_copy = img_origin.clone();
0 0
原创粉丝点击