OpenCV:IplImage与Mat,哪个使用?
我对OpenCV很新颖(大约2个月)。 我有Bradski和Kaehler的书“Learning OpenCV”。 我的问题是,如果我想以2.0以上的方式做所有事情,我应该什么时候使用matrix(Mat),什么时候应该使用IplImage?
Bradky的书提前说(前言)它是基于OpenCV 2.0编写的,而且它的代码中主要使用IplImage,但最近的在线文档使得它听起来像Mat现在是图像,蒙版等的全部数据types。 ,有点像Matlab中的基本matrix。 这让我想知道IplImage是否应该被视为过时。
那么,在编写新代码时,我应该完全避免IplImages? 还是有重要的东西,IplImages允许我做,而不是?
谢谢。
IplImage
从一开始就一直在OpenCV中。 它是OpenCV的C接口的一部分。 你需要自己分配和释放IplImage
结构的内存。 (记得cvReleaseImage
命令?)
新的Mat
结构是C ++结构的一部分。 所以显然它是面向对象的。 另外,它为你pipe理所有的记忆! 它保持对它的引用的跟踪。 然后引用的数量为零,它会自动释放。 这是一个非常棒的function!
去Mat
如果你正在使用一些有Intellisense的IDE(它会在你键入的时候下载一个可能的函数,variables等等)的列表,将代码从IplImage
thingy转换成Mat
thingy应该很容易。
我会强烈推荐使用Mat
。 我一直在使用它,这很好。 成员函数和matrixexpression式使得事情比处理IplImage
简单得多,正如你所说的,它是一个全面的数据types。
去Mat
!
我会说这实际上取决于你要运行你的应用程序的平台。 如果你正在开发一个embedded式系统的应用程序,你将更可能使用C.在这种情况下,你将不得不使用IplImage
。 从教程引用:
C ++接口的主要缺点是目前许多embedded式开发系统只支持C.因此,除非你是针对embedded式平台,否则使用旧的方法是没有意义的(除非你是一个受虐狂的程序员,为了麻烦)。
谢谢您的帮助。
我也发现,自从发布这个问题,一个带有Mat
作为参数的函数可以直接将IplImage
作为Mat
参数的地方,这样如果它已经被分解为方便的函数,就可以很容易地更新代码。 只需将函数参数从IplImage*
更改为Mat
,然后修改该函数以在Mat
上工作。 调用该函数的其他代码仍然可以正常工作(根据我的经验)。
我build议马特。 垃圾收集是自动的,因此应用程序更可靠,并且具有更less的内存泄漏。 另外,Mat是一种更新的数据存储方式,所以如果你是一个新手,刚刚从OpenCV开始,Mat更新,并且需要更less的编码来完成一个完整的应用程序。
兼容性是Mat将会变得更糟糕的一件事.IplImage可用时间更长,因此与大多数事物具有更好的兼容性。 我相信你也可以使用IplImage和Mat,如果没有,IplImage> Mat也很简单。
由于Iplimage已经有了更长的时间,您可能会发现更多的样本select。
这里是我的两分钱:作为OpenCV视觉处理中的新手(仍然在学习技巧),select一个Mat或IplImage,并且非常擅长。 但是,至less要学习其他的基础知识,所以如果你需要使用一个不兼容的函数,你就知道该怎么做。
但要重复自己,如果你是一个新手,尝试从马特开始。 由于它是一个较新的实现,所以学习和获得正确的代码更容易!
垫更容易和更容易使用。 它将图像表示为matrix。 它也更快。 我会build议Mat over IplImage。
Iplimage是Opencv中C接口的一些结构,Mat更适合于C ++程序,支持ref参数和stream操作等一些C ++风格。尽pipe它们都是面向对象的程序devise,但Mat包含的方法本身比Iplimage更多创build和释放,Ipliamge会调用一些cvXXX接口来完成。 而且,Mat是Opencv2的一个新结构,我认为这是旧的发展的象征。 我希望它帮助。
我相信使用cv :: Mat要方便得多。 它更通用。 我们可以看到IplImage是cv :: Mat的一个子集。 IplImage的默认数据types是无符号整数,而cv :: Mat的默认数据types是double。 所以使用Mat进行任何types的math运算都容易得多。
我开始在2012年左右开始使用opencv。所以我开始使用Mat,它function强大且易于使用。但是阅读或重用这些“旧”的代码,我不得不知道iplimages,这很容易使用,也。 但是,我认为未来是马特。不要忘记在一个CLASS中的马特,这意味着,你不需要释放一个马特。另一方面,你应该释放一个无足轻重。 我的英语很差,对不起。
在编写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单循环。 但是如果你必须编写任何直接closures像素的例程,我会坚持使用IplImage。