OpenCV中Mat、cvMat和IplImage类型转换

来源:互联网 发布:心理学书籍推荐 知乎 编辑:程序博客网 时间:2024/05/29 02:54

转载至《图像处理编程实例》,朱伟编著。

OpenCV2.X中图像容器一般有Mat、CvMat和IplImage,Mat是一个多维的密集数据数组,常用于进行计算性较高的矩阵、图像、直方图操作等。cvMat和IplImage是OpenCV1.x中提供的基于C语言版本的图像数据容器,侧重于图像数据本身的处理性能。在实际应用场景中,我们常常需要将不同的参数类型进行相互转换。

1、Mat转换为IplImage类型和CvMat类型

cv::Mat img;CvMat cvMatImg = img;IplImage IplImg = img;

需要注意的是,转换后Mat,IplImage和CvMat共享图像矩阵数据,传递的是矩阵头,并不复制数据,IplImage和CvMat就没有引用计数功能,如果上述代码中的img的数据被释放,cvMatImg和IplImage也就失去了相应数据。因此在进行上述转换后对IplImage和CvMat对象进行操作时,一定不能将转换前的Mat对象提前释放。

2、IplImage类型和CvMat类型转换为Mat类型

IplImage *IplImg = cvLoadImage("fruits.jpg");Mat img(IplImage, ture);

OpenCV2.x中提供Mat类兼容OpenCV1.x中IplImage和CvMat的两个构造函数:Mat::Mat(const CvMat* m, bool copyData = false)和Mat::Mat(const IplImage* img, bool copyData = false)。如果copyData的值是false,那么Mat将与IplImage或CvMat共用同一矩阵数据;如果copyData的值是true,Mat会新申请内存空间,然后将IplImage或CvMat的数据复制到Mat的数据区。

0 0
原创粉丝点击