1、 在计算机看来,图像只是一堆亮度各异的点;一副黑白的尺寸为M X N 的图像可以用一个M X N 的矩阵来表示;矩阵中的元素表示这个位置上的像素的亮度,数值越大表示该点越亮。
2、 一般来说,灰度图用2维矩阵表示,彩色(多通道)图像用3维矩阵(M X N X 3)表示;对于图像显示来说,目前大部分设备都是用无符号8位整数(类型为CV_8U)表示像素亮度。
3、 Mat:图像类,通用矩阵类,可以用于创建和操作多维矩阵。
4、 Mat 类可用构造函数创建图像,或采用creat()函数创建图像。
5、 模版类Vec,表示一个向量,可用于矩阵元素的表达。
6、 像素值的读取:(1)at()函数:实现读取矩阵中的某个像素,或对某个像素进行赋值;优缺点:代码的可读性高,但效率并不很高,如果要遍历图像,并不推荐使用at()函数。
(2)迭代器(iterator):遍历方便;
(3)指针(ptr):运行效率高,可靠性不高。
7、选取图像局部区域的方法:如果将局部区域赋值给新的Mat对象,新的对象与原式对象公用相同的数据区域,并不申请新的内存,因此执行速率都比较快;(1)单行或单列选取:row()函数和col()函数;
(2)选取多行或多列:Rang类:Rang(star,end)(注:包含star ,不含end)或Rang::all();
(3)选取感兴趣区域:一种是使用构造函数,如:Mat img(Size(320,240),CV_8UC3);Mat rot(img,Rect(10,10,100,100))或Mat rot(img,Rang(10,100),Rang(10,100));另外一种是使用括号运算符:Mat rot=img(Rect(10,10,100,100))或Mat rot=img(Rang(10,100),Rang(10,100));
(4)选取对角线元素:diag(int d);当d = 0时,表示主对角线;当d >0时,表示主对角线下方第d条次对角线;当d<0时,表示主对角线上方第d条次对角线;
8、Mat类的内存管理:Mat类由两部分组成:矩阵头(矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵的指针;为了解决矩阵数据传递过大的问题,Opencv使用了引进计数机制;其思路是让每个Mat对象都有自己的矩阵头信息,但多个Mat对象可以共享同一个矩阵数据,即让多个矩阵指针指向同一地址。
9、格式转换:
(1)Mat转换为IplImage 和CvMat格式:直接通过赋值操作完成;
(2)IplImage 和CvMat转换为Mat格式:通过构造函数完成。
10、读取图像文件:
Mat imread(const string & filename, int flags);
Flags >0时,返回3通道图像;
Flags=0 时,返回单通道图像;
Flags<0 时,则不对图像进行通道转换。
11、写入图像文件:
Bool imwrite(conststring& filename, InputArray image, const vector<int> & params =vector<int>());
参数params:JPEG表示图像质量,取值范围:0到100,默认95;
PNG:表示压缩级别,取值范围0到9,默认是3;
PPM,PGM,PBM:表示文件是以二进制还是纯文本方式存储,取值为1时,表示二进制方式存储,默认为1。
注意:在保存文件时,如果文件已经存在,imwrite()函数不会进行提醒,将会直接覆盖以前的文件。
12、读取视频类:VidieoCapture 既可以从视频读取图像,又可以从摄像头读取图像;可以通过其构造函数打开资源或通过其方法open()函数打开资源,open()函数会调用released()函数,先释放已经打开的视频,再打开新视频。
13、写视频类:Videowriter(文件名,编解码器,帧频,宽度,高度);