【问题标题】:Conversion from IplImage* to cv::MAT从 IplImage* 到 cv::MAT 的转换
【发布时间】:2013-04-02 05:58:56
【问题描述】:

我搜索了将 IplImage* 转换为 Mat,但所有答案都是关于转换为 cvMat。

怎么样,我能做到吗? Mat和cvMat有什么区别?

提前致谢

【问题讨论】:

标签: c++ opencv iplimage mat


【解决方案1】:

推荐的方式是cv::cvarrToMat函数

cv::Mat - 是 OpenCV 2.x 的基础数据结构

CvMat - 是 cv::Mat 的旧 C 模拟

【讨论】:

    【解决方案2】:

    查看Mat documentation

    // converts old-style IplImage to the new matrix; the data is not copied by default
    Mat(const IplImage* img, bool copyData=false);
    

    【讨论】:

    • 这个构造函数将在库的下一次重大更新中完全从 API 中移除
    • @AndreyKamaev 你确定吗?那么这个构造函数不应该被标记为弃用吗?
    【解决方案3】:

    这是一个很好的解决方案

    Mat(const IplImage* img, bool copyData=false);
    

    【讨论】:

    • afaik 较新的 OpenCV 版本 (3.x) 不再支持此构造函数。
    • 好久不见了 :)
    • 一个curent question与这个答案相关联,所以我只想提一下:)
    • @Micka 对于 OpenCV 3.x,您可以使用 cv::cvarrToMat(ipl*)。下面的答案回答了这个问题:)
    【解决方案4】:

    作为记录:查看 core/src/matrix.cpp 似乎确实构造函数 cv::Mat(IplImage*) 已经消失了。

    但我找到了这个替代方案:

    IplImage * ipl = ...;
    cv::Mat m = cv::cvarrToMat(ipl);  // default additional arguments: don't copy data.
    

    【讨论】:

    【解决方案5】:
    • cv::Mat 或 Mat,两者相同。

    • Mat 有一个操作符 CvMat(),所以简单的赋值就可以了

    将 Mat 转换为 CvMat

    Mat mat = ---------;
    CvMat cvmat = mat;
    

    将 CVMat 转换为 Mat

    Mat dst = Mat(cvmat, true);  
    

    将 Mat 转换为 IplImage*

    >单频道

    IplImage* image = cvCloneImage(&(IplImage)mat); 
    

    > 三通道

    IplImage* image = cvCreateImage(cvSize(mat.cols, mat.rows), 8, 3);
    IplImage ipltemp = mat;
    cvCopy(&ipltemp, image);
    

    希望这对您有所帮助。干杯:)

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2012-06-16
      相关资源
      最近更新 更多