繁体   English   中英

OpenCV:IplImage与Mat,使用哪个?

[英]OpenCV: IplImage versus Mat, which to use?

我是OpenCV的新手(大约2个月了)。 我有一本Bradski和Kaehler的《 Learning OpenCV》。 我的问题是,如果我想以2.0+的方式进行所有操作,什么时候应该使用矩阵(Mat),什么时候应该使用IplImage?

Bradky的书在前言(前言)中说,它是基于OpenCV 2.0编写的,并且在其示例代码中主要使用IplImage,但是最新的在线文档使其听起来像Mat现在是图像,遮罩等的全部数据类型。 ,有点像Matlab中的基本矩阵 这让我想知道IplImage是否应该被视为过时的。

因此,编写新代码时是否应该完全避免使用IplImages? 还是IplImages允许我做Mats不能做的重要事情?

谢谢。

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

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

Mat 如果您使用的是具有Intellisense的IDE,那么将代码从IplImage转换为Mat转换应该很容易(键入时会列出可能的函数,变量等)

我强烈建议您使用Mat 我已经使用了一段时间了,它很棒。 成员函数和矩阵表达式使事情比处理IplImage更简单,并且正如您所说的那样,这是一个万能的数据类型。

Mat

我会说这实际上取决于您要在其上运行应用程序的平台。 如果您正在为嵌入式系统开发应用程序,则您更有可能使用C。在这种情况下,您将不得不使用IplImage 引用本教程

C ++接口的主要缺点是目前许多嵌入式开发系统仅支持C。因此,除非您以嵌入式平台为目标,否则没有必要使用旧方法(除非您是受虐狂程序员,并且您正在询问(麻烦)。

谢谢您的帮助。

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

快速更新:

随着OpenCV 4的问世,随着IplImage及其现在称为“旧版C API”的所有内容将逐步删除,该问题的答案将变得更加简单。 在OpenCV 4.0“ alpha”中,IplImage已经消失了-CvMat也已经消失了

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

[注意:当然,如果您仍使用旧版本的OpenCV,则此问题仍然相关。]

我建议马特。 垃圾收集是自动的,因此应用程序更可靠,内存泄漏更少。 此外,Mat是一种较新的数据存储方式,因此,如果您是新手,则从OpenCV开始,Mat就是较新的,并且不需要花费很多心思即可编写完整的应用程序。

兼容性是Mat会变得更差的一件事。IplImage的可用时间越来越长,因此与大多数事物都具有更大的兼容性。 我相信您也可以将IplImage与Mat一起使用,如果不能,则IplImage> Mat也非常容易执行。

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

这是我的两分钱:作为使用OpenCV进行视觉处理的新秀(仍在学习中的技巧),选择Mat或IplImage中的一个,并真的很擅长。 但是,至少要学习另一种的基础知识,这样您才能知道如果需要使用与另一种不兼容的功能该怎么做。

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

垫变得越来越容易使用。 它将图像表示为矩阵。 它也更快。 我会推荐Mat而不是IplImage。

Iplimage是Opencv中C接口的某种结构,Mat更适合C ++程序,并支持某些C ++样式,例如ref参数和流运算符等。尽管它们都是面向对象的编程,但Mat本身比Iplimage包含的方法更多。创建和发布,Ipliamge会调用某些cvXXX接口来完成。 而且,Mat是Opencv2的新结构,我认为这是旧结构发展的象征。 希望对您有所帮助。

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

我大约在2012年左右开始使用opencv。因此我开始使用Mat,它功能强大且易于使用。但是要读取或重用这些“古老的”代码,我必须熟悉iplimages,这很容易使用,也。 我认为未来是Mat。不要忘记CLASS中的Mat,这意味着您不需要释放Mat。另一方面,您应该释放一个印象。 对不起,我的英语不好。

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

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

比使用快得多

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

快约5倍。 这可能是因为我对Mat使用了嵌套的X,Y循环,对IplImage使用了单个循环。 但是,如果您必须编写直接在像素之外工作的例程,我会坚持使用IplImage。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM