前言知识
在OpenCV中我们处理视频是先将视频保存成图像,然后再处理图像,将处理完的图像再生成视频这样子操作的。但是OpenCV中常见的图像操作有关容器有Mat,cvMat,IplImage等。在这些中,我们在选择的时候应该将哪一种作为处理图像的容器呢?
- Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。Mat类型侧重于计算,数学性高,OpenCV对Mat类型的计算也进行了优化。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。
- CvMat和IplImage类型更侧重于“图像”,OpenCV对其中的图像操作(缩放,单通道提取,图像阈值操作等)进行了优化。
- CvMat和IplImage的定义是结构体,而Mat的定义是类。从类型上就使得他们有很大的区别。结构体大多都是成员变量,而类中有成员变量、成员函数和重载函数。所以Mat利用自身的一些成员函数就可以进行很多的处理,但是CvMat和IplImage还需要一些辅助的函数去处理图片。
接下来再简单看一下如何初始化定义这三种类型的图像。
- Mat
Mat image = imread(const string& filename, intflags = 1);
- 这里第一个参数需要我们填写载入图片的名字,如果图片跟程序文件不在同一个文件夹下还需要加入图片的路径。
第二个参数定义的是指定一个加载图像的颜色类型。取0时为灰度图;取1时为彩色图像;取2时,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回;取4时,代表保持颜色通道不变。
- CvMat
CvMat* image = cvCreateMat(int rows, int cols, int type);
- IplImage
IplImage* image = cvLoadImage(const char* filename, int iscolor = 1)
- 第一个参数还是读取图片的名字。
- 第二个参数读取图片的方式,而其中每个方式所定义的数字与imread相同,如果观察源码不难发现,其实cvLoadImage在使用时调用了imread函数。
这里需要注意一点,当使用完定义的CvMat和IplImage时,得需要分别使用cvReleaseImage(&image)、cv