CvMat,Mat和IplImage之间的转化和拷贝(转载)

《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 共用同一矩阵数据;如果值是 trueMat 会新申请内存,然后将 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);
 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值