zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Lucene in action 笔记 case study
    关于Restful Web Service的一些理解
    Lucene in action 笔记 analysis篇
    Lucene in action 笔记 index篇
    Lucene in action 笔记 term vector
    Lucene in action 笔记 search篇
    博客园开博记录
    数论(算法概述)
    DIV, IFRAME, Select, Span标签入门
    记一个较困难的SharePoint性能问题的分析和解决
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6559493.html
Copyright © 2011-2022 走看看