OpenCV:IplImage与Mat,使用哪种?

OpenCV:IplImage与Mat,使用哪种?,opencv,Opencv,我是OpenCV的新手(大约2个月了)。我有布拉德斯基和凯勒的《学习OpenCV》一书。我的问题是,如果我想以2.0+的方式做每件事,我应该在什么时候使用Matrix(Mat)以及什么时候使用IplImage Bradky的书在前面(前言)指出,它是基于OpenCV 2.0编写的,并且在其示例代码中主要使用IplImage,但最近的在线文档使它听起来像是Mat现在是图像、掩码等的一种全面数据类型,有点像Matlab中的基本矩阵。这让我怀疑IplImage是否应该被视为过时 那么,在编写新代码时,

我是OpenCV的新手(大约2个月了)。我有布拉德斯基和凯勒的《学习OpenCV》一书。我的问题是,如果我想以2.0+的方式做每件事,我应该在什么时候使用Matrix(Mat)以及什么时候使用IplImage

Bradky的书在前面(前言)指出,它是基于OpenCV 2.0编写的,并且在其示例代码中主要使用IplImage,但最近的在线文档使它听起来像是Mat现在是图像、掩码等的一种全面数据类型,有点像Matlab中的基本矩阵。这让我怀疑IplImage是否应该被视为过时

那么,在编写新代码时,我应该完全避免使用IplImages吗?或者有什么重要的东西是我的限制允许我做的,而垫子却不允许


谢谢。

我强烈建议使用
Mat
。我已经用了一段时间了,它很棒。成员函数和矩阵表达式比处理
IplImage
简单得多,正如您所说,它是一种包罗万象的数据类型


选择
Mat

IplImage
从一开始就在OpenCV中。它是OpenCV的C接口的一部分。您需要自己为
IplImage
结构分配和取消分配内存。(还记得
cvReleaseImage
命令吗?)

<>新的<代码> Mat < /C>结构是C++结构的一部分。显然,它是面向对象的。此外,它还为您管理所有内存!它记录对它的引用。然后引用数变为零,它会自动解除分配。这是一个极好的特性


选择
Mat
。如果您使用的是具有Intellisense的IDE(它会在键入时下拉可能的函数、变量等的列表),那么将代码从
IplImage
thingy转换为
Mat
thingy应该很容易。

我认为这实际上取决于您要运行应用程序的平台。如果您正在为嵌入式系统开发应用程序,则更可能使用C。在这种情况下,您必须使用
IplImage
。引述:

< C++接口的主要缺点是许多嵌入式 目前开发系统只支持C。因此,除非 如果您的目标是嵌入式平台,那么使用 旧方法(除非你是一个受虐狂程序员 麻烦)

谢谢你的帮助


在发布这个问题之后,我还发现,一个以
Mat
作为参数的函数可以直接使用
IplImage
来代替
Mat
参数,这使得如果代码已经分解成方便的函数,则可以很容易地成批更新代码。只需将函数参数从
IplImage*
更改为
Mat
,然后修改函数以在
Mat
上工作。其他调用该函数的代码应该仍然可以正常工作(根据我的经验)。

在编写Blob检测例程时 我注意到使用

IplImage* img;
uchar* image_src = (uchar*)img->imageData;
image_src[x+y*width] = ...;
比使用

Mat image;
image.at<uchar>(x,y) = ...;
Mat图像;
在(x,y)=。。。;

大约快5倍。其中一些可能是因为我对Mat使用了嵌套的X,Y循环,而对IplImage使用了单个循环。但是,如果你必须编写任何直接基于像素的例程,我会坚持使用IplImage

> IPLICOM是Opencv C接口的一些结构,MAT更适合C++程序,支持一些C++风格,如REF参数和流运算符等。虽然它们都是面向对象编程,但MAT比IPLICOM做的方法包括创建和释放,包括更多的方法。Ipliamge将调用一些cvXXX接口来完成。此外,Mat是Opencv2的新结构,我认为这是旧结构发展的象征。我希望它有帮助

我建议用垫子。垃圾收集是自动的,因此应用程序更可靠,内存泄漏更少。此外,Mat是一种较新的数据存储方式,因此,如果您是一名新手,刚开始使用OpenCV,Mat是较新的,并且需要较少仔细的编码来创建完整的应用程序

兼容性是Mat会稍微差一点的一件事。IplImage的可用时间更长,因此与大多数事物具有更大的兼容性。我相信您也可以将IplImage与Mat一起使用,如果没有,IplImage>Mat的执行也非常简单

由于Iplimage已经提供了更长的时间,您可能会发现更多的样本选择

这是我的两分钱: 作为OpenCV视觉处理方面的新手(仍在学习技巧),选择一个、Mat或IplImage并真正擅长它。但是,至少要学习另一个函数的基本知识,这样当您需要使用与另一个函数不兼容的函数时,您就知道该怎么做了


但我要重复一次,如果你是新手,试着从Mat开始。因为它是一个较新的实现,所以更容易学习和正确使用

垫子越来越容易使用。它将图像表示为矩阵。 它也更快。
我建议使用Mat而不是IplImage。

我认为使用cv::Mat更方便。它更通用。我们可以看到IplImage是cv::Mat的一个子集。IplImage的默认数据类型为无符号整数,而cv::Mat的默认数据类型为双精度。因此,使用Mat进行任何类型的数学运算都要容易得多

大约在2012年左右,我开始使用opencv。因此,我开始使用Mat,它功能强大且易于使用。但要阅读或重用这些“旧”代码,我必须了解一些关于iplimages的知识,它也易于使用。 但我认为未来是垫子。在课堂上不要忘记垫子,这意味着,你不需要释放垫子。另一方面,你应该释放一张图片。 对不起,我的英语很差。

快速更新:

随着的出现,这个问题的答案将更加简单明了,因为IplImage和所有他们现在称之为“遗留C API”的东西将