1. Mat结构的使用
Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵的指针。矩阵头的尺寸是常数值,但是矩阵的本身的尺寸会依据图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此在程序创建副本时,大的开销是由矩阵造成的,而不是信息头。Opencv是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是常有的事。除非万不得已,不应该进行大图像的复制,因为这会降低程序的运行速度。
显示创建Mat对象的七种方法:
(1) 使用Mat()构造函数
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
Cout<<”M=”<<endl<<” ”<<M<<endl<<endl;,
对于二维多通道图像,首先要定义其尺寸,即行数和列数。然后,需要指定存储元素的数据类型以及每个矩阵点的通道数。为此,依据下面的规则有多种定义:
CV_[位数][带符号与否][类型前缀]C[通道数]
比如CV_8UC3表示使用8位的unsigned char型,每个像素由三个元素组成三通道。而预先定义的通道数可以多达四通道
(2) 在C\C++中通过构造函数进行初始化
Int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC,Scalar::all(0));
(3) 为已经存在的IplImage指针创建信息头
IplImage* img = cvLoadImage(“1.jpg”,1);
Mat mtx(img);
(4) 利用Create()函数
M.create(4,4,CV_8UC(2));
需要注意的是,此创建方法不能为矩阵设定初始值,只是在改变尺寸时重新为矩阵数据开辟内存而已。
(5) 采用Matlab的初始化方式
采用Matlab形式的初始化方式:zero(),ones(),eyes()。
Mat E = Mat::eye(4,4,CV_64F);
Mat O= Mat::ones(2,2,CV_32F);
Mat Z = Mat::zeros(3,3,CV_8UC1);
(6) 对小矩阵使用逗号分隔式初始化函数
Mat C=(Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
(7) 位已经存在的对象创建新的信息头
Mat RowClone=C.row(1).clone();
2. 常用数据结构和函数
(1) 点的表示方法
Point类数据结构表示了二维坐标系下的点,即由其图像坐标x和y指定的2D点。用法如下:
Point point;
point.x=10;
point.y=8;
或者
Point.point=Point(10,8);
另外,在OpenCV中有如下的定义:
typedef Point_ Point2i;
typedef Point_ Point2f;
typedef Point2i Point;
所以,Point_,Point2i,Point互相等价,Point_,Point2f互相等价。
(2) 颜色的表示方法
Scalar()表示具有4个元素的数组,在OPENCV中被大量用于传递像素值,如RGB颜色值。而RGB颜色值为三个参数,其实对于Scalar函数来说,如果用不到第四个参数,则不用写出来;若只写三个参数,OPENCV会认为我们就想表示三个参数。
如果给出以下颜色参数表达式:Scalar(a,b,c)
那么定义的RGB颜色值:红色分量为c,绿色分量为b,蓝色分量为a。
(3) 尺寸的表示方法
可以用XXX.width和XXX.height来分别表示其宽度和高度
下面给出一个示例,
Size(5,5);//构造出的Size宽度和高度都为5,即XXX.width和XXX.height都为5
(4) 矩形的表示方法
Rect类的成员变量有x、y、width、height,分别为左上角点的坐标和矩形的宽和高。常用的成员函数有:
Size()返回值为Size; area()返回矩形的面积; contains(Point)判断点是否在矩形内; inside(Rect)函数判断矩形是否在该矩形内; tl()返回左上角点的坐标; br()返回右下角点的坐标。值得注意的是,如果想求两个矩形的交集和并集,可以用如下格式:
Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;
(5) 颜色空间转换:cvtColor()函数
cvtColor()函数是Opencv里的颜色空间转换函数,可以实现RGB颜色向HSV、HIS等颜色空间的转换,也可以转换为灰度图像。
Void cvtColor(InputArray src,OutputArray dst,int code, int dstCn=0)
第一个参数为输入图像,第二个参数为输出图像,第三个参数为颜色空间转换的标识符,第四个参数为目标图像的通道数,若该参数是0,表示目标图像取原图像的通道数。下面是一个调用示例:
//此句代码的OpenCV2版为:
cvtColor(srcImage,dstImage,CV_GRAY2BGR);//转换原始图为灰度图
//此句代码的OpenCV3版为:
cvtColor(srcImage,dstImage,COLOR_GRAY2BGR);//转换原始图为灰度图
3. 基本图形的绘制
涉及函数如下:
~用于绘制直线的line函数
~用于绘制椭圆的ellipse函数
~用于绘制矩形的rectangle函数
~用于绘制圆的circle函数
~用于绘制多边形的fillPoly函数