opencv的基本数据结构

时间:2024-05-19 09:33:14

常用的OpenCV的基本数据结构包括以下六种:

1--Vec--向量模板类

2--Scalar类

3--Point类

4--Size类

5--Rect类

6--RotatedRect类--旋转类

7--Range类


6.1 基本概念

最后一个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。


6.2 用法

旋转矩形类的构造函数:

[cpp] view plain copy
  1. RotatedRect(const Point2f& center, const Size2f& size, float angle);  

参数:

  • center:中心点坐标Point2f类型
  • size:矩形的宽度和高度,Size2f类型
  • angle:顺时针方向的旋转角度(单位°),float类型

opencv的基本数据结构

1. Vec


1.1 基本概念

         Vec是一个向量模板类,主要用于存储数值向量。


1.2 用法


(1)可用它来定义任意类型的向量

[cpp] view plain copy
  1. Vec<double, 8> myVector; // 定义一个存放8个double型变量的向量  

    Vec<int,n>---就是用类型int和将向量模板类做一个实例化,实例化为一个具体的类.其中,第一个参数int--表示Vec中存储的为int型;第二个参数n为一个整型值,表示Vec每个对象中存储n个int值,也就是---n维向量(列向量) 。

(2)使用[]访问Vec向量成员         

[cpp] view plain copy
  1. myVector[0]=0;  

 (3)可使用以下预定义的类型

[cpp] view plain copy
  1. typedef Vec<uchar, 2> Vec2b;   //Vec2b---表示每个Vec2b对象中,可以存储2个char(字符型)数据 
  2. typedef Vec<uchar, 3> Vec3b;   //Vec3b---表示每一个Vec3b对象中,可以存储3个char(字符型)数据                          //比如可以用这样的对象,去存储RGB图像中的一个像素点 
  3. typedef Vec<uchar, 4> Vec4b;   //Vec4b---表示每一个Vec4b对象中,可以存储4个字符型数据,
  4. //可以用这样的类对象去存储---4通道RGB+Alpha的像中的像素点
  5. typedef Vec<short, 2> Vec2s;  //Vec2s---表示这个类的每一个类对象,
  6. //可以存储2个short int(短整型)的数据
  7. typedef Vec<short, 3> Vec3s;  
  8. typedef Vec<short, 4> Vec4s;  
  9. typedef Vec<int, 2> Vec2i;  
  10. typedef Vec<int, 3> Vec3i;  
  11. typedef Vec<int, 4> Vec4i;  
  12. typedef Vec<float, 2> Vec2f;  
  13. typedef Vec<float, 3> Vec3f;  
  14. typedef Vec<float, 4> Vec4f;  
  15. typedef Vec<float, 6> Vec6f;  
  16. typedef Vec<double, 2> Vec2d;  
  17. typedef Vec<double, 3> Vec3d;  
  18. typedef Vec<double, 4> Vec4d;  
  19. typedef Vec<double, 6> Vec6d;  

(4)Vec支持的运算如下:

[cpp] view plain copy
  1. v1 = v2 + v3  
  2. v1 = v2 - v3  
  3. v1 = v2 * scale  
  4. v1 = scale * v2  
  5. v1 = -v2  
  6. v1 += v2  
  7. v1 == v2, v1 != v2  
  8. norm(v1) (euclidean norm)  

1.3 示例代码


(1)向量定义与元素的访问

[cpp] view plain copy
  1. // Vec  
  2.      cv::Vec<double, 8>  myVector;  
  3.      for(int i=0; i<myVector.rows;i++)  
  4.           myVector[i] = i;  
  5.      cout<<"myVector= "<<myVector<<endl;  
  6.      cout<<"myVector[0]= "<<myVector[0]<<endl;  
  7.      cout<<"myVector[3]= "<<myVector[3]<<endl;  

运行结果:

opencv的基本数据结构

opencv的基本数据结构

(2)基本运算

[cpp] view plain copy
  1. cv::Vec<int, 6> v1,v2,v3;  
  2.         for(int i=0; i<v2.rows;i++){ //v2.rows返回向量v2的行数  
  3.                     v2[i] = i;  
  4.                     v3[i] = i+1;  
  5.              }  
  6.          
  7.         v1 = v2 + v3;  
  8.         cout<<"v2       = "<<v2<<endl;  
  9.         cout<<"v3       = "<<v3<<endl;  
  10.         cout<<"v1=v2+v3= "<<v1<<endl;  
  11.         cout<<"v1=v2*2  = "<<v2*2<<endl;  
  12.         cout<<"v1=-v2   = "<<-v2<<endl;  
  13.         cout<<"v1==v2   = "<<(v1==v2)<<endl;  
  14.         cout<<"v1!=v2   = "<<(v1!=v2)<<endl;  
  15.         cout<<"norm(v2)= "<<norm(v2)<<endl;  

运行结果:

opencv的基本数据结构

2. Scalar

2.1 基本概念

Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值

2.2 用法

可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。

[cpp] view plain copy
  1. cv:: Scalar( B, G, R )  

2.3 示例代码

(1)cv::Scalar结构

[cpp] view plain copy
  1. cv::Scalar myScalar;  
  2.     myScalar = cv::Scalar(0,255,0);  
  3.     cout<<"myScalar = "<<myScalar<<endl;  
  4.     system("pause");  

 运行结果:

opencv的基本数据结构

opencv的基本数据结构

  1.  //【3】这个默认构造函数的四个参数分别表示RGB+Alpha颜色中的:  
  2.                 //【1】v0---表示RGB中的------blue-----B---蓝色分量  
  3.                 //【2】v1---表示RGB中的------Green----G---绿色分量  
  4.                 //【3】v2---表示RGB中的------Red------R---红色分量  
  5.                 //【4】v3---表示Alpha---------------------透明色分量

(2)读取彩色图像像素值

彩色图像的每个像素对应三个部分:RGB三个通道。因此包含彩色图像的cv::Mat类会返回一个向量,向量中包含三个8位的数值。OpenCV为这样的短向量定义了一种类型,即我们上述的cv::Vec3b。这个向量包含三个无符号字符(unsigned character)类型的数据。

OpenCV存储通道次序为:蓝色、绿色、红色即BGR。因此,访问彩色像素中元素的方法如下:

[cpp] view plain copy
  1. cv::Mat pImg = cv::imread("Lena.jpg",1);  
  2.     if(!pImg.data)  
  3.         return 0;  
  4.     int x = 100, y = 100;  
  5.     cv::Scalar pixel=pImg.at<Vec3b>(x,y);  
  6.     cout<<"B chanel of pixel is = "<<pixel.val[0]<<endl;  
  7.     cout<<"G chanel of pixel is = "<<pixel.val[1]<<endl;  
  8.     cout<<"R chanel of pixel is = "<<pixel.val[2]<<endl;  
  9.     system("pause");  


 运行结果:

opencv的基本数据结构

3. Point


3.1 基本概念

常用于表示2维坐标(x,y)

3.2 用法

(1)图像坐标

对图像而言,我们可以这样定义:

[cpp] view plain copy
  1. cv::Point pt;  
  2. pt.x = 10;  
  3. pt.y = 8;  
或者

[cpp] view plain copy
  1. cv::Point pt =  Point(10, 8);  

或者

[cpp] view plain copy
  1. cv::Point pt(10,8);  

(2)或使用如下预定义:

[cpp] view plain copy
  1. typedef Point_<int> Point2i;  //二维整型点类
  2. typedef Point2i Point;  
  3. typedef Point_<float> Point2f; // 二维单精度浮点型点类
  4. typedef Point_<double> Point2d;//二维双精度浮点型点类 
  5. typedef Point3_<int> Point3i;//三维整型点类
  6. typedef Point3_<float> Point3f; // 三维单精度浮点型点类
  7. typedef Point3_<double> Point3d;// 三维双精度浮点型点类 

(3)基本运算

[cpp] view plain copy
  1. pt1 = pt2 + pt3;  
  2. pt1 = pt2 - pt3;  
  3. pt1 = pt2 * a;  
  4. pt1 = a * pt2;  
  5. pt1 += pt2;  
  6. pt1 -= pt2;  
  7. pt1 *= a;  
  8. double value = norm(pt); // L2 norm  
  9. pt1 == pt2;  
  10. pt1 != pt2;  


3.3 示例代码


(1)设置坐标点

[cpp] view plain copy
  1. // Point  
  2.     cv::Point pt;  
  3.     pt.x = 278;  
  4.     pt.y = 269;  
  5.     //或者  
  6.     //cv::Point  pt (278,269);  
  7.     cv::Scalar pix = pImg.at<Vec3b>(pt);  //获取BGR三通道图片在点(278,269)处每个通道的像素值
  8.     cout<<"pix("<<pt.x<<","<<pt.y<<") = "<<pix<<endl;  

 运行结果:

opencv的基本数据结构

(2)各类运算

[cpp] view plain copy
  1. cv::Point pt1(10,20);  
  2.     cv::Point pt2(2,3);  
  3.     cout<<"pt1     = "<<pt1<<endl;  
  4.     cout<<"pt2     = "<<pt2<<endl;  
  5.     cout<<"pt1+pt2 = "<<pt1+pt2<<endl;  
  6.     cout<<"pt1+=pt2= "<<(pt1+=pt2)<<endl;  
  7.     cout<<"pt1-pt2 = "<<pt1-pt2<<endl;  
  8.     cout<<"pt2*2   = "<<pt2*2<<endl;  

 运行结果:

opencv的基本数据结构


4. Size


4.1 基本概念

模板类Size可表示一幅图像或一个矩形的大小。它包含宽、高2个成员:width , height,还有一个有用的面积函数area()。

4.2 用法

[cpp] view plain copy
  1. cv::Size size(int w, int h);  
  2. //或者  
  3. cv::Size size;  
  4. size.width = w;  
  5. size.height = h;  

4.3 示例代码

[cpp] view plain copy
  1. // Size  
  2.     cv::Size size1(6,3);  
  3.     cv::Size size2;  
  4.     size2.width = 4;  
  5.     size2.height = 2;  
  6.     cv::Mat mat1(size1,CV_8UC1,cv::Scalar(0));  
  7.     cv::Mat mat2(size2,CV_8UC3,cv::Scalar(1,2,3));  
  8.     cout<<"mat1 = "<<endl<<mat1<<endl;  
  9.     cout<<endl<<"mat2 = "<<endl<<mat2<<endl;  
  10.     system("pause");  

 运行结果:

opencv的基本数据结构

5. Rect


5.1 基本概念

Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:

  • 矩形左上角坐标: (x,y)
  • 矩形的宽和高: width, height

Rect可以用来定义图像的ROI区域。


5.2 用法

[cpp] view plain copy
  1. cv::Rect rect(x, y, width, height);  


5.3 示例代码

[cpp] view plain copy
  1. // Rect  
  2.     cv::Mat pImg = imread("Lena.jpg",1);  
  3.     cv::Rect  rect(180,200,200,200);//(x,y)=(180,200),w=200,height=200  
  4.     cv::Mat  roi = cv::Mat(pImg, rect);  
  5.     cv::Mat  pImgRect = pImg.clone();  
  6.     cv::rectangle(pImgRect,rect,cv::Scalar(0,255,0),2);  //在原图中画一个矩形
  7.     cv::imshow("original image with rectangle",pImgRect);  
  8.     cv::imshow("roi",roi);  
  9.     cv::waitKey();  
运行结果:

opencv的基本数据结构opencv的基本数据结构

6. RotatedRect

6.1 基本概念

这个基本数据类是一种特殊的矩形称为RotatedRect。这个类通过中心点,宽度和高度和旋转角度来表示一个旋转的矩形。

6.2 用法

旋转矩形类的构造函数:

[cpp] view plain copy
  1. RotatedRect(const Point2f& center, const Size2f& size, float angle);  

参数:

  • center:中心点坐标Point2f类型
  • size:矩形的宽度和高度,Size2f类型
  • angle:顺时针方向的旋转角度(单位°),float类型

opencv的基本数据结构

6. Range

6.1 基本概念

用来指定连续的子序列。比如矩阵的一部分,其定义如下:

[cpp] view plain copy
  1. class CV_EXPORTS Range
  2. {
  3. public:
  4. Range();
  5. Range(int _start, int _end);
  6. int size() const;
  7. bool empty() const;
  8. static Range all();
  9. operactor CvSlice() const;
  10.        
  11. int start,end;
  1. } ;

6.2 示例

取A的全部行,和 1到180列

[cpp] view plain copy
  1. Mat A=imread("b.jpg",CV_LOAD_IMAGE_COLOR); 
  2. Mat B=A(Range::all(),Range(1,180));












[cpp] view plain copy
  1. RotatedRect(const Point2f& center, const Size2f& size, float angle);