Mat ,IplImage, CvMat 之间的转换的总结

本文详细介绍了OpenCV中Mat与IplImage之间的转换方法,包括如何利用构造函数进行转换,以及不同情况下的指针操作技巧。同时,还探讨了CvMat与IplImage之间的相互转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在新版本与旧版本之间纠结,到底是用Mat,还是Iplimage?   

        Mat 侧重于数据计算,而Iplimage注重于图像的处理。

因此,应根据具体需要灵活使用,那个好用用哪个,只要在两者之间进行转换即可。


一、派生关系:CvArr -> CvMat -> IplImage


   IplImageCvMat派生,而CvMatCvArr派生

   CvArr用作函数的参数,无论传入的是CvMatIplImage,内部都是按CvMat处理。



二、转换方式:


1.  IplImage,CvMat 向Mat  转换:

    主要利用Mat的构造函数

    Mat::Mat(const CvMat* m, bool copyData=false);

     因为IplImage是从CvMat派生而来,所以,两者的转换都采用该函数。其中,copyData表示是否复制数据。

    例:

             CvMat  mI  ;

          Mat  I=Mat(mI);

2. Mat  向  IplImage,CvMat 转换:

(1)文件头的复制,只创建文件头,不复制数据

         Mat  I;

         IplImage  pI = I;或  IplImage  pI IplImage (I);

         CvMat  mI  = I;


(2)指针转换,需要调用IplImage和CvMat运算符得到指针,为了得到指针需要使用&符号:

        Mat  I;

        IplImage*  pI = &I.operator IplImage(); 或 IplImage*  pI = &(IplImage(I));  

        CvMat*  mI = &I.operator CvMat();


3.CvMat 与 IplImage的转换

(1)CvMat 转向 IplImage

         CvMat*  mat_origin;//可以是一个CvMat * 或者是 IplImage *

         IplImage  img_buffer ;

         cvGetImage(mat_origin,&img_buffer);

(2) IplImage转向CvMat         

           法1只生成一个新的矩阵头,而数据都指向原来的地址

                     CvMat mathdr, 

                     *mat = cvGetMat( img, &mathdr );

                      其中, cvGetMat(const CvArr* arr, CvMat* header)

           法2CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
                    cvConvert( img, mat );

  


参考文章:

1.http://blog.youkuaiyun.com/wuxiaoyao12/article/details/7305848

2.http://www.cnblogs.com/xiangwengao/archive/2012/04/10/2440755.html

3.http://www.cnblogs.com/jeffery-zou/archive/2012/03/28/2421462.html




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值