OpenCV:IplImage与Mat,使用哪个?

SSi*_*ilk 57 opencv

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

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

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

谢谢.

Utk*_*nha 73

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

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

去吧Mat.如果您使用的是具有Intellisense的IDE,那么将代码从IplImagethingy转换为Matthingy 应该很容易(当您键入时,它会删除可能的函数,变量等列表)

  • Mat也有一些额外的矩阵操作功能.它比IplImage更通用,并且更容易用矩阵代数. (2认同)

Jac*_*cob 16

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

去吧Mat!


Sun*_*nny 12

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

C++界面的主要缺点是目前许多嵌入式开发系统只支持C.因此,除非你的目标是嵌入式平台,否则使用旧方法是没有意义的(除非你是一个受虐狂的程序员,你要问的是麻烦).


SSi*_*ilk 7

谢谢您的帮助.

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