opencv 中对图像的处理是最基本的操作, 一般的图像类型为 IplImage 类型, 但是当我们对图像进行处理的时候, 多数都是对像素矩阵进行处理, 所以这三个类型之间的转换会对我们的工作带来便利
Mat 类型较 CvMat 和 IplImage 有更强的矩阵运算能力, 支持常见的矩阵运算 (参照 Matlab 中的各种矩阵运算), 所以将 IplImage 类型和 CvMat 类型转换为 Mat 类型更易于数据处理. opencv 中对图像的处理是最基本的操作, 一般的图像类型为 IplImage 类型, 但是当我们对图像进行处理的时候, 多数都是对像素矩阵进行处理, 所以这三个类型之间 opencv 中对图像的处理是最基本的操作, 一般的图像类型为 IplImage 类型, 但是当我们对图像进行处理的时候, 多数都是对像素矩阵进行处理, 所以这三个类型之间的转换会对我们的工作带来便利
Mat 类型较 CvMat 和 IplImage 有更强的矩阵运算能力, 支持常见的矩阵运算 (参照 Matlab 中的各种矩阵运算), 所以将 IplImage 类型和 CvMat 类型转换为 Mat 类型更易于数据处理.
Mat 类型可用于直接存储图像信息, 通过函数 imread,imwrite,imshow 等实现 (与 Matlab 中的函数相似), 似乎在某种程度上可以取代 IplImage 类型.
(1) 将 IplImage 类型转换到 Mat 类型
Mat::Mat(const IplImage* img, bool copyData=false);
默认情况下, 新的 Mat 类型与原来的 IplImage 类型共享图像数据, 转换只是创建一个 Mat 矩阵头. 当将参数 copyData 设为 true 后, 就会复制整个图像数据.
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg); // IplImage* ->Mat 共享数据
// or : Mat mtx = iplImg;
(2) 将 Mat 类型转换到 IplImage 类型
同样只是创建图像头, 而没有复制数据.
例:
IplImage ipl_img = img; // Mat -> IplImage
(3) 将 CvMat 类型转换为 Mat 类型
与 IplImage 的转换类似, 可以选择是否复制数据.
Mat::Mat(const CvMat* m, bool copyData=false);
(4) 将 Mat 类型转换为 CvMat 类型
与 IplImage 的转换类似, 不复制数据, 只创建矩阵头.
例:
// 假设 Mat 类型的 imgMat 图像数据存在
CvMat cvMat = imgMat; // Mat -> CvMat 的转换会对我们的工作带来便利
Mat 类型较 CvMat 和 IplImage 有更强的矩阵运算能力, 支持常见的矩阵运算 (参照 Matlab 中的各种矩阵运算), 所以将 IplImage 类型和 CvMat 类型转换为 Mat 类型更易于数据处理.
Mat 类型可用于直接存储图像信息, 通过函数 imread,imwrite,imshow 等实现 (与 Matlab 中的函数相似), 似乎在某种程度上可以取代 IplImage 类型.
(1) 将 IplImage 类型转换到 Mat 类型
Mat::Mat(const IplImage* img, bool copyData=false);
默认情况下, 新的 Mat 类型与原来的 IplImage 类型共享图像数据, 转换只是创建一个 Mat 矩阵头. 当将参数 copyData 设为 true 后, 就会复制整个图像数据.
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg); // IplImage* ->Mat 共享数据
// or : Mat mtx = iplImg;
(2) 将 Mat 类型转换到 IplImage 类型
同样只是创建图像头, 而没有复制数据.
例:
IplImage ipl_img = img; // Mat -> IplImage
(3) 将 CvMat 类型转换为 Mat 类型
与 IplImage 的转换类似, 可以选择是否复制数据.
Mat::Mat(const CvMat* m, bool copyData=false);
(4) 将 Mat 类型转换为 CvMat 类型
与 IplImage 的转换类似, 不复制数据, 只创建矩阵头.
例:
// 假设 Mat 类型的 imgMat 图像数据存在
CvMat cvMat = imgMat; // Mat -> CvMat
Mat 类型可用于直接存储图像信息, 通过函数 imread,imwrite,imshow 等实现 (与 Matlab 中的函数相似), 似乎在某种程度上可以取代 IplImage 类型.
(1) 将 IplImage 类型转换到 Mat 类型
Mat::Mat(const IplImage* img, bool copyData=false);
默认情况下, 新的 Mat 类型与原来的 IplImage 类型共享图像数据, 转换只是创建一个 Mat 矩阵头. 当将参数 copyData 设为 true 后, 就会复制整个图像数据.
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg); // IplImage* ->Mat 共享数据
// or : Mat mtx = iplImg;
(2) 将 Mat 类型转换到 IplImage 类型
同样只是创建图像头, 而没有复制数据.
例:
IplImage ipl_img = img; // Mat -> IplImage
(3) 将 CvMat 类型转换为 Mat 类型
与 IplImage 的转换类似, 可以选择是否复制数据.
Mat::Mat(const CvMat* m, bool copyData=false);
(4) 将 Mat 类型转换为 CvMat 类型
与 IplImage 的转换类似, 不复制数据, 只创建矩阵头.
例:
// 假设 Mat 类型的 imgMat 图像数据存在
CvMat cvMat = imgMat; // Mat -> CvMat
来源: http://lib.csdn.net/article/opencv/36833