OpenCV学习笔记 之 IplImage*和Mat

Ipllmage,CvMat,Mat的关系:

        opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。

IplImage

      在OpenCV中IplImage是表示一个图像的结构体,也是从OpenCV1.0到目前最为重要的一个结构;在之前的图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口。

Mat

     Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数。

 

Mat和IplImage的区别如下:

分类

C风格

C++风格

图像存储格式

IplImage*和

CvMat

cv::Mat或者

Using namespace cv;

Mat...

接口

CvSize

CvVideoCapture

IplImage, CvMat

cvQueryFrame

cvShowImage

cvLoadImage

Size

VideoCapture

Mat

(operator)

imshow

imread

特点

使用IplImage时需要手动管理内存,例如使用cvCreateImage(),cvReleaseImage()等函数创建和释放内存,而且使用不熟练的时候我们会发现IplImage经常出现内存异常,当使用熟练时,程序规模较小时,IplImage没有问题的,可是一旦代码变得越来越大,他就会越来越来挣扎着处理这一切而不是着眼于实际解决自己的开发目标。

命名空间可以简化函数的书写。

Cvrect和Rect以及cvresize和resize都是表示同一个东西,前者都是指cvrect,后者都是指cvresize。使用命名空间后,可以简化为rest以及resize

 

使用Mat的第一件事是:不再需要手动分配其内存大小,当不需要使用它的时候也不再需要手动释放它。

Mat使用的是c++结构,c++中类的概念,在opencv2.0以上,引入例如C++接口,类的使用,使得代码变得更加简洁(c++中类使用. ,c中结构使用->)。

个人:Ipllmage就是C语言风格的编码。Mat就是C++风格的编码

 

 

 

你可能感兴趣的:(opencv)