《OpenCV》入门教程:
3.11 Mat 与 IplImage
和 CvMat 的转换
在 OpenCV 2
中虽然引入了方便的 Mat
类, 出于兼容性的考虑, OpenCV
依
然是支持 C 语言接口的
IplImage 和
CvMat 结构。如果你要与以前的代码兼容,
将会涉及 Mat 与
IplImage 和
CvMat 的转换。
3.11.1Mat 转为
IplImage 和 CvMat
格式
假如你有一个以前写的函数,函数的定义为:
void mycvOldFunc(IplImage * p, ...);
函数的参数需要 IplImage
类型的指针。 Mat
转为 IplImage,可以用简单的等
号赋值操作来进行类型转换,这样实现:
Mat img(Size(320, 240), CV_8UC3);
...
IplImage iplimg = img; //转为
IplImage 结构
mycvOldFunc( & iplimg, ...);//对
iplimg 取地址
如果要转为 CvMat
类型,操作类似:
CvMat cvimg = img; //转为
CvMat 结构
需要特别注意的是,类型转换后, IplImage
和 CvMat
与 Mat
共用同一矩阵数
据,而 IplImage 和
CvMat 没有引用计数功能,如果上例中的
img 中数据被释放,
iplimg 和
cvimg 也就失去了数据。 因此要牢记不可将
Mat 对象提前释放。
3.11.2IplImage 和
CvMat 格式转为 Mat
Mat 类有两个构造函数,可以实现
IplImage 和
CvMat 到
Mat 的转换。这两
个函数都有一个参数 copyData。如果
copyData的值是
false,那么
Mat将与
IplImage
或 CvMat
共用同一矩阵数据;如果值是 true,
Mat 会新申请内存,然后将
IplImage
或 CvMat
的数据复制到 Mat
的数据区。
43
如果共用数据, Mat
也将不会使用引用计数来管理内存,需要开发者自己来
管理。本书建议做此转换是将参数置为 true,这样内存管理变得简单。
Mat::Mat(const CvMat* m, bool copyData=false)
Mat::Mat(const IplImage* img, bool copyData=false)
例子代码如下:
IplImage * iplimg = cvLoadImage("lena.jpg");
Mat im(iplimg, true);