1、CvMat之間的複製
//注意:深拷貝 - 單獨分配空間,兩者相互獨立 CvMat* a; CvMat* b = cvCloneMat(a); //copy a to b
2、Mat之間的複製
//注意:淺拷貝 - 不復制數據只創建矩陣頭,數據共享(更改a,b,c的任意一個都會對另外2個產生同樣的作用) Mat a; Mat b = a; //a "copy" to b Mat c(a); //a "copy" to c //注意:深拷貝 Mat a; Mat b = a.clone(); //a copy to b Mat c; a.copyTo(c); //a copy to c
3、CvMat轉Mat
//使用Mat的構造函數:Mat::Mat(const CvMat* m, bool copyData=false); 默認情況下copyData爲false CvMat* a; //注意:以下三種效果一致,均爲淺拷貝 Mat b(a); //a "copy" to b Mat b(a, false); //a "copy" to b Mat b = a; //a "copy" to b //注意:當將參數copyData設爲true後,則爲深拷貝(複製整個圖像數據) Mat b = Mat(a, true); //a copy to b
4、Mat轉CvMat
//注意:淺拷貝 Mat a; CvMat b = a; //a "copy" to b //注意:深拷貝 Mat a; CvMat *b; CvMat temp = a; //轉化爲CvMat類型,而不是複製數據 cvCopy(&temp, b); //真正複製數據 cvCopy使用前要先開闢內存空間
==========IplImage與上述二者間的轉化和拷貝===========
1、IplImage之間的複製
這個不贅述了,就是cvCopy與cvCloneImage使用區別,貼張網上的圖:
2、IplImage轉Mat
//使用Mat的構造函數:Mat::Mat(const IplImage* img, bool copyData=false); 默認情況下copyData爲false IplImage* srcImg = cvLoadImage("Lena.jpg"); //注意:以下三種效果一致,均爲淺拷貝 Mat M(srcImg); Mat M(srcImg, false); Mat M = srcImg; //注意:當將參數copyData設爲true後,則爲深拷貝(複製整個圖像數據) Mat M(srcImg, true);
3、Mat轉IplImage
//注意:淺拷貝 - 同樣只是創建圖像頭,而沒有複製數據 Mat M; IplImage img = M; IplImage img = IplImage(M); //深拷貝 cv::Mat img2; IplImage imgTmp = img2; IplImage *input = cvCloneImage(&imgTmp);
4、IplImage轉CvMat
//法一:cvGetMat函數 IplImage* img; CvMat temp; CvMat* mat = cvGetMat(img, &temp); //深拷貝 //法二:cvConvert函數 CvMat *mat = cvCreateMat(img->height, img->width, CV_64FC3); //注意height和width的順序 cvConvert(img, mat); //深拷貝
5、CvMat轉IplImage
//法一:cvGetImage函數 CvMat M; IplImage* img = cvCreateImageHeader(M.size(), M.depth(), M.channels()); cvGetImage(&M, img); //深拷貝:函數返回img //也可寫成 CvMat M; IplImage* img = cvGetImage(&M, cvCreateImageHeader(M.size(), M.depth(), M.channels())); //法二:cvConvert函數 CvMat M; IplImage* img = cvCreateImage(M.size(), M.depth(), M.channels()); cvConvert(&M, img); //深拷貝