Mat 与 IplImage 和 CvMat 的转换
在 OpenCV 2 中虽然引入了方便的 Mat 类,出于兼容性的考虑,OpenCV 依然是支持 C 语言接口的 IplImage 和 CvMat 结构。如果你要与以前的代码兼容,将会涉及 Mat 与 IplImage 和 CvMat 的转换。
1、 Mat 转为 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 对象提前释放。
2、 IplImage 和 CvMat 格式转为 Mat
Mat 类有两个构造函数,可以实现 IplImage 和 CvMat 到 Mat 的转换。这两个函数都有一个参数copyData。 如果copyData的值是false, 那么Mat将与IplImage或 CvMat 共用同一矩阵数据; 如果值是 true, Mat 会新申请内存, 然后将 IplImage或 CvMat 的数据复制到 Mat 的数据区。
如果共用数据,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);
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】