常用的OpenCV的基本数据结构包括以下六种:
1--Vec--向量模板类
2--Scalar类
3--Point类
4--Size类
5--Rect类
6--RotatedRect类--旋转类
7--Range类
6.1 基本概念
最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。
6.2 用法
旋转矩形类的构造函数:
- RotatedRect(const Point2f& center, const Size2f& size, float angle);
参数:
- center:中心点坐标Point2f类型
- size:矩形的宽度和高度,Size2f类型
- angle:顺时针方向的旋转角度(单位°),float类型
1. Vec类
1.1 基本概念
Vec是一个向量模板类,主要用于存储数值向量。
1.2 用法
(1)可用它来定义任意类型的向量
Vec<int,n>---就是用类型int和将向量模板类做一个实例化,实例化为一个具体的类.其中,第一个参数int--表示Vec中存储的为int类型;第二个参数n为一个整型值,表示Vec每个对象中存储n个int值,也就是---n维向量(列向量) 。
(2)使用[]访问Vec向量成员
(3)可使用以下预定义的类型
- typedef Vec<uchar, 2> Vec2b; //
- typedef Vec<uchar, 3> Vec3b; //Vec3b---表示每一个Vec3b对象中,可以存储3个char(字符型)数据 //比如可以用这样的对象,去存储RGB图像中的
- typedef Vec<uchar, 4> Vec4b; //Vec4b---表示每一个Vec4b对象中,可以存储4个字符型数据,
- //可以用这样的类对象去存储---4通道RGB+Alpha的像中的像素点
- typedef Vec<short, 2> Vec2s; //Vec2s---表示这个类的每一个类对象,
- //可以存储2个short int(短整型)的数据
- typedef Vec<short, 3> Vec3s;
- typedef Vec<short, 4> Vec4s;
- typedef Vec<int, 2> Vec2i;
- typedef Vec<int, 3> Vec3i;
- typedef Vec<int, 4> Vec4i;
- typedef Vec<float, 2> Vec2f;
- typedef Vec<float, 3> Vec3f;
- typedef Vec<float, 4> Vec4f;
- typedef Vec<float, 6> Vec6f;
- typedef Vec<double, 2> Vec2d;
- typedef Vec<double, 3> Vec3d;
- typedef Vec<double, 4> Vec4d;
- typedef Vec<double, 6> Vec6d;
(4)Vec支持的运算如下:
- v1 = v2 + v3
- v1 = v2 - v3
- v1 = v2 * scale
- v1 = scale * v2
- v1 = -v2
- v1 += v2
- v1 == v2, v1 != v2
- norm(v1) (euclidean norm)
1.3 示例代码
(1)向量定义与元素的访问
-
- cv::Vec<double, 8> myVector;
- for(int i=0; i<myVector.rows;i++)
- myVector[i] = i;
- cout<<"myVector= "<<myVector<<endl;
- cout<<"myVector[0]= "<<myVector[0]<<endl;
- cout<<"myVector[3]= "<<myVector[3]<<endl;
运行结果:
(2)基本运算
- cv::Vec<int, 6> v1,v2,v3;
- for(int i=0; i<v2.rows;i++){
- v2[i] = i;
- v3[i] = i+1;
- }
-
- v1 = v2 + v3;
- cout<<"v2 = "<<v2<<endl;
- cout<<"v3 = "<<v3<<endl;
- cout<<"v1=v2+v3= "<<v1<<endl;
- cout<<"v1=v2*2 = "<<v2*2<<endl;
- cout<<"v1=-v2 = "<<-v2<<endl;
- cout<<"v1==v2 = "<<(v1==v2)<<endl;
- cout<<"v1!=v2 = "<<(v1!=v2)<<endl;
- cout<<"norm(v2)= "<<norm(v2)<<endl;
运行结果:
2. Scalar类
2.1 基本概念
Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。
2.2 用法
可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。
2.3 示例代码
(1)cv::Scalar结构
- cv::Scalar myScalar;
- myScalar = cv::Scalar(0,255,0);
- cout<<"myScalar = "<<myScalar<<endl;
- system("pause");
运行结果:
-
-
-
-
-
(2)读取彩色图像像素值
彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。
OpenCV存储通道次序为:蓝色、绿色、红色即BGR。因此,访问彩色像素中元素的方法如下:
- cv::Mat pImg = cv::imread("Lena.jpg",1);
- if(!pImg.data)
- return 0;
- int x = 100, y = 100;
- cv::Scalar pixel=pImg.at<Vec3b>(x,y);
- cout<<"B chanel of pixel is = "<<pixel.val[0]<<endl;
- cout<<"G chanel of pixel is = "<<pixel.val[1]<<endl;
- cout<<"R chanel of pixel is = "<<pixel.val[2]<<endl;
- system("pause");
运行结果:
3. Point类
3.1 基本概念
常用于表示2维坐标(x,y)。
3.2 用法
(1)图像坐标
对图像而言,我们可以这样定义:
- cv::Point pt;
- pt.x = 10;
- pt.y = 8;
或者
- cv::Point pt = Point(10, 8);
或者
(2)或使用如下预定义:
- typedef Point_<int> Point2i; //二维整型点类
- typedef Point2i Point;
- typedef Point_<float> Point2f; // 二维单精度浮点型点类
- typedef Point_<double> Point2d;//
- typedef Point3_<int> Point3i;//三维整型点类
- typedef Point3_<float> Point3f; // 三维单精度浮点型点类
- typedef Point3_<double> Point3d;//
(3)基本运算
- pt1 = pt2 + pt3;
- pt1 = pt2 - pt3;
- pt1 = pt2 * a;
- pt1 = a * pt2;
- pt1 += pt2;
- pt1 -= pt2;
- pt1 *= a;
- double value = norm(pt);
- pt1 == pt2;
- pt1 != pt2;
3.3 示例代码
(1)设置坐标点
-
- cv::Point pt;
- pt.x = 278;
- pt.y = 269;
-
-
- cv::Scalar pix = pImg.at<Vec3b>(pt); //获取BGR三通道图片在点(278,269)处每个通道的像素值
- cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;
运行结果:
(2)各类运算
- cv::Point pt1(10,20);
- cv::Point pt2(2,3);
- cout<<"pt1 = "<<pt1<<endl;
- cout<<"pt2 = "<<pt2<<endl;
- cout<<"pt1+pt2 = "<<pt1+pt2<<endl;
- cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;
- cout<<"pt1-pt2 = "<<pt1-pt2<<endl;
- cout<<"pt2*2 = "<<pt2*2<<endl;
运行结果:
4. Size类
4.1 基本概念
模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height,还有一个有用的面积函数area()。
4.2 用法
- cv::Size size(int w, int h);
-
- cv::Size size;
- size.width = w;
- size.height = h;
4.3 示例代码
-
- cv::Size size1(6,3);
- cv::Size size2;
- size2.width = 4;
- size2.height = 2;
- cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));
- cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));
- cout<<"mat1 = "<<endl<<mat1<<endl;
- cout<<endl<<"mat2 = "<<endl<<mat2<<endl;
- system("pause");
运行结果:
5. Rect类
5.1 基本概念
Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:
- 矩形左上角坐标: (x,y)
- 矩形的宽和高: width, height
Rect可以用来定义图像的ROI区域。
5.2 用法
- cv::Rect rect(x, y, width, height);
5.3 示例代码
-
- cv::Mat pImg = imread("Lena.jpg",1);
- cv::Rect rect(180,200,200,200);
- cv::Mat roi = cv::Mat(pImg, rect);
- cv::Mat pImgRect = pImg.clone();
- cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2); //在原图中画一个矩形
- cv::imshow("original image with rectangle",pImgRect);
- cv::imshow("roi",roi);
- cv::waitKey();
运行结果:
6. RotatedRect类
6.1 基本概念
这个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。
6.2 用法
旋转矩形类的构造函数:
- RotatedRect(const Point2f& center, const Size2f& size, float angle);
参数:
- center:中心点坐标Point2f类型
- size:矩形的宽度和高度,Size2f类型
- angle:顺时针方向的旋转角度(单位°),float类型
6. Range类
6.1 基本概念
用来指定连续的子序列。比如矩阵的一部分,其定义如下:
- class CV_EXPORTS Range
- {
- public:
- Range();
- Range(int _start, int _end);
- int size() const;
- bool empty() const;
- static Range all();
- operactor CvSlice() const;
-
- int start,end;
- } ;
6.2 示例
取A的全部行,和 1到180列:
- Mat A=imread("b.jpg",CV_LOAD_IMAGE_COLOR);
- Mat B=A(Range::all(),Range(1,180));
- RotatedRect(const Point2f& center, const Size2f& size, float angle);