OpenCV:IplImage与Mat,使用哪个?

时间:2010-07-12 20:30:32

标签: opencv

我对OpenCV很新(现在大约2个月)。我有Bradski和Kaehler的“学习OpenCV”一书。我的问题是,如果我想以2.0+的方式做所有事情,我应该何时使用矩阵(Mat)以及何时应该使用IplImage?

Bradky的书预先声明它是基于OpenCV 2.0编写的,并且它主要在其示例代码中使用IplImage,但是最新的在线文档使得它听起来像Mat现在是图像的全能数据类型,掩码等,有点像Matlab中的基本矩阵。这让我想知道IplImage是否应该被认为是过时的。

那么,在编写新代码时,我是否应该完全避免使用IplImages?或者IplImages允许我做的重要事情是Mats不这样做吗?

感谢。

11 个答案:

答案 0 :(得分:73)

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

新的Mat结构是C ++结构的一部分。显然它是面向对象的。此外,它为您管理所有内存!它保留了对它的引用的跟踪。然后引用数变为零,它会自动解除分配。这是一个极好的功能!

转到Mat。如果您使用的是具有智能感知功能的IDE(在您键入时会删除可能的函数,变量等列表),那么将代码从IplImage内容转换为Mat内容应该很容易< / p>

答案 1 :(得分:16)

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

转到Mat

答案 2 :(得分:12)

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

  

C ++界面的主要缺点是许多嵌入式   此时的开发系统仅支持C.因此,除非   你是针对嵌入式平台,没有必要使用   旧的方法(除非你是一个受虐狂的程序员而且你在问   麻烦)。

答案 3 :(得分:7)

感谢您的帮助。

自从发布此问题以来,我发现以Mat为参数的函数可以直接在IplImage参数的位置使用Mat,这使得它很容易如果代码已经分解为方便的函数,则以块的形式更新代码。只需将函数参数从IplImage*更改为Mat,然后将该函数修改为Mat即可。调用该函数的其他代码应该仍然可以正常工作(根据我的经验)。

答案 4 :(得分:2)

快速更新:

随着OpenCV 4的出现,该问题的答案将更加直接,因为IplImage及其现在称为“旧版C API”的所有内容都将逐步删除。 In OpenCV 4.0 "alpha", IplImage is already gone - as is CvMat

因此,如果您使用的是OpenCV4.0 +,请使用Mat类 ...,因为您没有选择的余地。

[NB:当然,如果您仍使用旧版本的OpenCV,则此问题仍然有意义。]

答案 5 :(得分:1)

我建议马特。垃圾收集是自动的,因此应用程序更可靠,内存泄漏更少。此外,Mat是一种更新的数据存储方式,所以如果你是新手,刚开始使用OpenCV,Mat就更新了,需要不那么仔细的编码才能完成一个完整的应用程序。

兼容性是Mat将会变得更糟糕的一件事.IplImage可以使用更长时间,因此与大多数事物具有更强的兼容性。我相信你也可以使用IplImage和Mat,如果没有,IplImage&gt; Mat也很简单。

由于Iplimage可以使用更长时间,因此您可能会找到更多样本。

这是我的两分钱: 作为使用OpenCV进行视觉处理的新手(仍在学习技巧),选择一个,Mat或IplImage,并且真正擅长它。但是,至少要学习对方的基础知识,以便在需要使用与另一个不兼容的功能时知道该怎么做。

但要重复一遍,如果你是新手,请尝试从Mat开始。由于它是一个较新的实现,它更容易学习和正确!

答案 6 :(得分:1)

Mat更容易使用。它将图像表示为矩阵。 它也更快。 我会推荐Mat over IplImage。

答案 7 :(得分:0)

Iplimage是Opencv中C接口的一些结构,Mat更适合C ++程序,支持一些C ++样式,如ref参数和流操作符等。虽然它们都是面向对象的编程,但Mat本身包含的方法多于Iplimage像创建和发布一样,Ipliamge会调用一些cvXXX接口来完成。此外,Mat是Opencv2的一个新结构,我认为它是旧的开发的象征。我希望它有所帮助。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

我在2012年左右开始使用opencv。所以我开始使用Mat,它功能强大且易于使用。但是为了阅读或重用这些旧的&#34;代码,我不得不知道关于iplimages,它也很容易使用。 但是未来就是Mat,我想。并且不要忘记在CLASS中使用Mat,这意味着,你不需要释放Mat.On另一方面,你应该释放一个implimage。 我的英语很差,抱歉。

答案 10 :(得分:-2)

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

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

比使用

快得多
Mat image;
image.at<uchar>(x,y) = ...;

快5倍左右。其中一些可能是因为我使用嵌套的X,Y循环用于Mat和单个循环用于IplImage。但是如果你必须编写任何直接在像素上工作的例程,我会坚持使用IplImage。