[英]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.