2014年1月20日 星期一

[轉] IpImage 與 cvImage, cvMat 與 cv::Mat

小飛:基本上看這篇文章獲益良多,先轉過來

Overview:總結下它們之間的不同
1. IpImage 和 cvMat 是C語言的struct。 而cvImage和cv::Mat 是c++中的結構。
2. cvImage 是 IpImage 的C++的wrapper,相當於IpImage的智能指針。cvImage 現在已經deprecated了。甚至已經被移到頭文件#include <legacy/legacy.hpp> 裡。盡管我不知道為啥deprecated,可能是應為陷阱太多的緣故把。
3. IpImage 是針對圖像來的。它的成員處理row,column以外,還有nChannel, aiphaChannel, depth 等圖像才有的信息。而cvMat和cv::Mat 針對矩陣,方便了矩陣操作,當然cv::Mat 作為c++的類,可以幫你去管理內存的分配,這樣就不用自己去create和release了,比cvMat要方便。

下面主要介紹下IpImage 和 cv::Mat 的文件IO操作以及他們之間的相互轉化
1. IpImage 的文件IO
#include
#include
#include
IplImage * src_Img = NULL;
src_Img = cvLoadImage( ".//input.jpg" , CV_LOAD_IMAGE_GRAYSCALE );
cvReleaseImage (& src_Img);

2.IpImage 轉 cvMat
cvMat好像不能直接從文件中讀取,要從IpImage轉化而來。
IplImage * src_Img = NULL;
src_Img = cvLoadImage( ".//input.jpg" , CV_LOAD_IMAGE_GRAYSCALE );
cvMat *src_mat = cvCreateMat(src_Img->height, src_Img->width);
cvConvert (src_Img , src_mat );
cvReleaseImage (& src_Img);
cvReleaseMat (&src_mat );

3. cvMat 轉 IpImage
IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
cvGetImage(matI,img);
cvSaveImage("rice1.bmp",img);

4. Mat 讀取圖像
Mat mat = imread (".//input.jpg" , CV_8UC1 );

5. Mat 轉 CvMat
OpenCV 裡面很多函數例如cvZeros 等的輸入參數都是CvArr *. Mat 是不能直接轉CvArray的
Mat m = imread("input.jpg", CV_8UC1);
cvZeros(&m); // 錯誤
*****************
CvMat m1 = m; //淺拷貝, 不會復制數據,只會指向m中的數據
cvZeros(&m); //正確
********************
cvZero (&(CvMat ) mat); //正確,這樣也可

ADGuard