(修改)IplImage, CvMat,cv::Mat之间的转换

来源:互联网 发布:淘宝上电脑主机 编辑:程序博客网 时间:2024/06/04 18:15
Overview:总结下它们之间的不同
1. IplImage 和 CvMat 是C语言的struct。 而cv::Mat 是c++中的结构。
2.IplImage 是针对图像来的。它的成员处理row,column以外,还有nChannel, aiphaChannel, depth 等图像才有的信息。而CvMat和cv::Mat 针对矩阵,方便了矩阵操作,当然cv::Mat 作为c++的类,可以帮你去管理内存的分配,这样就不用自己去create和release了,比cvMat要方便。

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

2.Mat 读取图像
Mat mat imread (".//input.jpg" CV_8UC1 );

3.CvMat  转Mat(亲测可用)
CvMat *a ;
Mat b = Mat(a, true);

4. CvMat 转 IplImage
IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
cvGetImage(matI,img);
cvSaveImage("rice1.bmp",img);

5.IplImage 转 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 );

6.IplImage* 转 Mat

IplImage* pImg = cvLoadImage("lena.jpg");
cv::Mat img(pImg,0); //0是不复制影像,也就是pImg与img的data共用同个记忆体位置,header各自有 

7.Mat 转 IplImage

cv::Mat img;
IplImage image(img);

8.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); //正确,这样也可

0 0