Opencv Mat与Iplimage的相互转换

1、将Mat转换为IplImage

//! converts header to IplImage; no data is copied
    operator IplImage() const;

举例:Mat img;

            IplImage *src;

             src=&IplImage(img);

2、将IplImage转换为Mat

//! converts old-style IplImage to the new matrix; the data is not copied by default
    Mat(const IplImage* img, bool copyData=false);

Ex. 
IplImage* pImg = cvLoadImage("lena.jpg");
cv::Mat img(pImg,0); //0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有


3、IplImageOpenCVC语言的图像类型;cv::Mat是OpenCV中C++语言的图像类型;

1. cv::Mat -> IplImage

cv::Mat matimg = cv::imread ("heels.jpg");

IplImage* iplimg;

*iplimg = IplImage(matimg);

2. IplImage -> cv::Mat

IplImage* iplimg = cvLoadImage("heels.jpg");

cv::Mat matimg;

matimg = cv::Mat(iplimg);


4、

OpenCV中的CvArr*的定义的一个空类型的指针,可以转换为其派生类CvMat和IplImage,那么如何将其转化为cv::Mat呢,其实很简单,只需要一行代码即可:

 

// CvArr *_img
cv::Mat img = cv::cvarrToMat(_img);
 
 
综合:

1、Mat, IplImage, CvMat, CvArr的关系:

1. opencv文档中明确声明,CvMat已经过时了(CvMat is now obsolete, consider using Mat instead)不建议用;

2. 派生关系:CvArr -> CvMat -> IplImage

3. Mat用的一套东西是imread,imshow等,有别于CvArr及其子类的cvLoadImage(),cvShowImage()...

 

 

 

2. 相互转换

所有代码已经过测试,但是这里我就示意一下,真正写的时候不要忘记初始化转化过去的变量。

 

2.1 Mat与IplImage相互转换

IplImage* src;

某文章说,转换应该是Mat m(src); 而这不会复制内容,真正能复制内容的是:

Mat -> IplImage:

1 Mat m;  
2 IplImage* transIplimage = cvCloneImage(&(IplImage) m); 

IplImage -> Mat

1 IplImage* transIplImage;  
2 Mat m = cvarrToMat(transIplImage,true);  

 

2.2 CvMat与IplImage相互转换

1 IplImage* transIplImage;  
2 CvMat* cvmat;  
3 cvGetMat(transIplImage,cvmat);  
4 cvGetImage(cvmat,transIplImage);  

 

2.3 Mat到CvMat

复制代码
1 Mat a;
2 
3 CvMat *b = cvCreateMat(..........);
4 
5 CvMat temp = a;
6 
7 cvCopy(&temp, b)
复制代码

 

2.4 CvMat到Mat

1 CvMat *a = cvCreateMat();
2 
3 Mat b = Mat(a, true);

 

3. (多通道)Mat, IplImage, CvMat的元素获取

单通道的网上很多,这里只写多通道:

3.1 IplImage

1 //i is the index of rows  
2 //j is the index of cols  
3 //c is the index of channel  
4 ((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c]  
5 CV_IMAGE_ELEM(pImg,uchar,i,3*j+c)   

3.2 Mat

复制代码
 1 Mat m;  
 2 int h = m.rows; int w = m.cols;  
 3 int nc = m.channels();    
 4 for (int i = 0;i<h;i++)  
 5 {  
 6     for(int j = 0;j<w;j++)  
 7     {  
 8         Vec3b& elem = m.at<Vec3b>(i,j);  
 9         for (int c = 0; c<nc; c++)  
10         {  
11             uchar uc = elem[c] ;//Mat(i,j) of channel c  
12         }  
13     }  
14 }  
复制代码

3.3 CvMat

1 CV_MAT_ELEM(cvmat,uchar,i,3*j+c) 

 

4. 验证获取元素代码(Mat转IplImage)

此代码只用于验证多通道元素获取没有错误,具体用的时候最好还是用opencv直接给的吧(见第3小节)

复制代码
 1 IplImage* cvcvt_mat2IplImage(Mat m)  
 2 {  
 3     int h = m.rows; int w = m.cols;  
 4     int nc = m.channels();  
 5     IplImage* pImg = cvCreateImage(cvSize(w,h),8,nc);  
 6       
 7     for (int i = 0;i<h;i++)  
 8     {  
 9         for(int j = 0;j<w;j++)  
10         {  
11             Vec3b& elem = m.at<Vec3b>(i,j);  
12             for (int c = 0; c<nc; c++)  
13             {  
14                 //以下两种都可以  
15                 //((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c] =  elem[c];  
16                 CV_IMAGE_ELEM(pImg,uchar,i,3*j+c) = elem[c];  
17             }  
18         }  
19     }  
20     return pImg;  
21 }  
复制代码


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: OpenCV中的MatIplImage是两种不同的图像数据结构。MatOpenCV 2.x版本引入的新的图像数据结构,而IplImageOpenCV 1.x版本中使用的图像数据结构。Mat是一个更加灵活和方便的图像容器,可以方便地进行图像处理和操作。而IplImage则是一个较为底层的图像结构,使用起来相对复杂一些。 在将Mat转换IplImage时,可以使用cvCloneImagecvCopy函数来进行转换cvCloneImage会创建一个新的IplImage对象,并将Mat的数据复制到新的IplImage中。而cvCopy则是将Mat的数据复制到已有的IplImage对象中。 在将IplImage转换Mat时,可以使用Mat的构造函数来进行转换。默认情况下,该构造函数会进行浅拷贝,只创建图像头而不复制数据。如果需要进行深拷贝,可以将copyData参数设为true。 需要注意的是,MatIplImage之间的转换只是创建了新的图像头,并没有复制图像数据。因此,在进行转换时需要确保原始图像数据的有效性。 #### 引用[.reference_title] - *1* [OpenCv Mat, IplImage 相互转换](https://blog.csdn.net/songzige/article/details/50916575)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [OpenCV MatIplImage比较以及相互转换](https://blog.csdn.net/u012260117/article/details/50932253)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值