初学opencv3.0版本,在学习的过程中遇到了需要将Mat与Iplimage之间混合使用,所以需要对其进行转换
第一种方法:
Mat image;
Iplimage a;
a=image;
使用的时候image可以自己加载或者创造,对于a,需要取地址:&a
例如:
cvCvtColor( const CvArr* src, CvArr* dst, int code );
正常情况下,我们定义iplimage* src;直接在函数里调用就可以了,一般我们定义了Mat类型的图像,在使用的时候,不需要手动释放,碰到这样需要调用指针的形参时,就需要在这里进行一个转换,方便使用,不使用需要释放内存的iplimage,避免忘记释放内存,导致内存泄露
该函数的前两个参数是指针,在需要对a进行转化的时候要,需要这样写:
cvCvtColor( &a, &a, code );
第二种方法:
Iplimage* image=cvLoadImage(“c\\img.jpg”);
Mat image1(iplImage,false);
后来发现官方给的转换函数,非常的方便,也给补上
我把这种方法定义为:
第三种方法:cvMat与Mat之间的转换
安装了OpenCV3.0.0之后,发现无法用网上盛传的方法的方法来将 IplImage* 转换为Mat格式了
而且编译的时候提示没有对应的函数.
然后查了一下源文件mat.h,果然已经没有了
Mat::Mat(const IplImage* img, bool copyData=false);
原来是官方在3.0.0版本去掉了这个函数.
百度一圈也没有解决办法(唉,尝鲜是要付出代价的啊)
不过好在在OpenCV官方论坛发现了大神的解决办法,贴出来,让大家少走弯路
IplImage * ipl = ...;
cv::Mat m = cv::cvarrToMat(ipl); // default additional arguments: don't copy data.
同样,依旧只拷贝信息头,用的同一个数据块
查了一下源代码头文件,是酱紫滴
//! converts array (CvMat or IplImage) to cv::Mat
CV_EXPORTS Mat cvarrToMat(const CvArr* arr, bool copyData=false,
bool allowND=true, int coiMode=0,
AutoBuffer<double>* buf=0);
原来新版本的这个函数同样还支持CvMat到Mat的转换,真是太方便了!