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);

  • 相关阅读:
    数据排序
    (一)Spark简介Java&Python版Spark
    醒 了
    祈福
    可以接受失败,但不选择放弃
    烦中偷乐
    Yahoo! UI Library入门
    文章内容的简单优化方法
    Asp.Net网站速度优化
    ASP.NET实现GZIP压缩优化
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6559493.html
Copyright © 2011-2022 走看看