从IplImage*到cv::MAT的转换

25

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

那么,我该怎么做?Mat 和 cvMat 有什么区别?

提前致谢。


关于cvMat和Mat,请参见以下链接: https://dev59.com/E2gu5IYBdhLWcg3w2KfM - Barshan Das
5个回答

44

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

但是我找到了这个替代方法:

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

这是本答案的原始来源... - M_N1

14

这里有一个好的解决方案

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

4
据我所知,较新的OpenCV版本(3.x)不再支持此构造函数。 - Micka
已经很长时间了 :) - Houssam Badri
这个回答与一个当前的问题相关联,所以我想提一下 :) - Micka
8
您可以使用cv::cvarrToMat(ipl *)来适用于OpenCV 3.x版本。以下回答解决了此问题 :) - mojiiz

11
推荐的方法是使用 cv::cvarrToMat 函数。 cv::Mat 是OpenCV 2.x的基本数据结构。 CvMatcv::Mat 的旧C模拟。

5

请查看Mat文档以获取更多关于Mat的信息。

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

2
这个构造函数将会在下一个库的主要更新中完全从API中移除。 - Andrey Kamaev
@AndreyKamaev 你确定吗?这个构造函数不应该被标记为弃用吗? - Antonio

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

希望这可以帮助你。干杯 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接