(一)、OpenCV常用数据结构
1)、Point类
Point类数据结构表示二维坐标系的点,由坐标x, y指定的2D点,如:
Point pt;
pt.x = 20;
pt.y = 10;
其他类型:
Point
Point2d
Point2f
Point2i
Point3d
Point3f
Point3i
2)、Rect类
Rect类用来表示矩形,成员有x,y, width, height,常用的成员函数:
Size()返回值Size表示大小 tl()返回左上角坐标
area()返回矩形面积 br()返回右下角坐标
contains(Point)判断点是否在矩形内
Inside(Rect)判断矩形是否在该矩形内
求两个矩形的交集并集:
Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;
3)、Size类
Size表示区域大小,常用构造函数Size(int _width, int _height)
4)、Scalar类
Scalar()表示具有四个元素的数组,大量用来传递像素值,如RGB颜色,一般形式:
Scalar(double B, double G, double R, double Alpha)
如果用不到第四个则表示Scalar(B, G, R), 其中:
B—表示蓝色分量,G—表示绿色分量
R—表示红色分量,Alpha—表示透明度
注意:Scalar表示颜色顺序为BGR
Scalar(255, 0, 0) ----表示纯蓝色
Scalar(0, 255, 0) ----表示纯绿色
Scalar(0, 0, 255) ----表示纯红色
Scalar(255, 255, 0) ----表示青色
Scalar(0, 255, 255) ----表示黄色
(二)、Mat类
1)、基础图像容器Mat
我们可以借助很多方法来获取图像,但是存储到数字设备中记录的确实每个像素点的数值。
opencv2.x以上版本提供Mat结构来存储图像,优化了内存管理,不用手动开辟空间,也不必在不使用的时候立即释放,减少内存泄漏的风险。
2)、Mat类简介:
Mat是一个类,由两个数据部分组成:矩阵头(大小,通道,数据类型等)和数据块(像素值)。
Mat头部属性如:rows,cols,channels,data
data是一个指向数据块的指针,可以用如下方法判断图像是否为空:
if(!img.data) //图像数据为空
return;
3)Mat类操作
a、Mat类创建
Mat img; //创建无初始化矩阵
Mat img1(20,10,CV_8UC1); //创建20行10列类型为8位的单通道矩阵
Mat img2(Size(20,10),CV_8UC3); //创建20*10类型为8位的3通道矩阵
Mat img3(20,10,CV_8UC3,Scalar(0,255,0)); //创建10*20类型为8位的3通道矩阵
Mat img4(20,10,CV_8UC1,Scalar(255)); //创建10*20类型为8位的单通道矩阵
Mat img5(img4);
Mat img(100, 200, CV_8UC3, Scalar(0,255,0));
和原图像指向同一块数据:
Mat img2(img);
Mat img3 = img;
原图像的副本:
Mat img4 = img.clone();
Mat img 5;
img.copyTo(img5);
c、常用颜色空间
RBG颜色空间、HSV/HLS颜色空间、Lab颜色空间
转换所用函数cvtColor(src, dst, code)
CV_BGR2GRAY、CV_BGR2HSV、CV_BGR2Lab
(三)、颜色
RBG颜色空间,R/G/B取值范围[0,255]
HSV/HLS颜色空间,H取值范围[0,360],S/V取值范围[0,1]
Lab颜色空间,L取值范围[0,100],a/b取值范围[127,-128]