CvMat,Mat和IplImage之间的转化和拷贝(转载)
来源:互联网 发布:mac os 10.13iso镜像 编辑:程序博客网 时间:2024/06/09 20:59
《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);