Opencv的数据结构:Point、Size、Rect、Scalar、Ar
大多数据结构都在cxtypes.h这个头文件里定义
1、Point系列,点的表示:
Point:表示图像中的点 (x,y)都是整型变量,即图像中点的 坐标,图像的原点一般在图像的左上角
Point2D32f:二维空间中的点 (x,y)是float型
Point3D32f:三维空间中的点
构造函数:PointXXXX( )。注意,这是c风格的代码,构造函数是内联函数,并不是c++中的类的构造函数一样。
2、Size系列,尺寸的表示:
Size:图像的尺寸(整型)
Size2D32f:如果想用浮点型。
3、矩形的表示,Rect:用来表示图像的部分区域,4个参数,矩形的左上角的坐标(x,y),矩形的长、宽
4、颜色表示,Scalar包含4个浮点成员,可以用来表示表示B,G,R,alpha; 有三个构造函数:Scalar,RealScalar,ScalarAll
Scalar对四个变量都赋值
RealScalar只对四个变量的第0个赋值,其他都为0
ScalarAll对四个变量都赋相同的值
5、Arr: Arr->Mat->lmage 三个继承关系
1. Vec类
1.1 基本概念
Vec是一个模板类,主要用于存储数值向量。
1.2 用法
(1)可用它来定义任意类型的向量
Vec
(2)使用[]访问Vec向量成员
myVector[0]=0;
(3)可使用以下预定义的类型
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
typedef Vec
(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)向量定义与元素的访问
// Vec
cv::Vec
for(int i=0; i
cout<<"myVector= "<
(2)基本运算
cv::Vec
for(int i=0; i
v3[i] = i+1;
}
v1 = v2 + v3;
cout<<"v2 = "<
2. Scalar类
2.1 基本概念
Scalar是一个从Vec类引出的模板类,是一个可存放4个元素的向量,广泛用于传递和读取图像中的像素值。
2.2 用法
可使用[]访问Scalar值。或使用如下方式定义BGR三个通道的值。
cv:: Scalar( B, G, R )
2.3 示例代码
(1)cv::Scalar结构
cv::Scalar myScalar;
myScalar = cv::Scalar(0,255,0);
cout<<"myScalar = "<
运行结果:
(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
cout<<"B chanel of pixel is = "<
运行结果:
Color()可以实现RGB向HSV、HSI等颜色空间的转换,也可以转换为灰度图像。
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);
或者
cv::Point pt(10,8);
(2)或使用如下预定义:
typedef Point_
typedef Point2i Point;
typedef Point_
typedef Point_
(3)基本运算
pt1 = pt2 + pt3;
pt1 = pt2 - pt3;
pt1 = pt2 * a;
pt1 = a * pt2;
pt1 += pt2;
pt1 -= pt2;
pt1 *= a;
double value = norm(pt); // L2 norm
pt1 == pt2;
pt1 != pt2;
3.3 示例代码
(1)设置坐标点
// Point
cv::Point pt;
pt.x = 278;
pt.y = 269;
//或者
//cv::Point pt (278,269);
cv::Scalar pix = pImg.at
cout<<"pix("<
(2)各类运算
cv::Point pt1(10,20);
cv::Point pt2(2,3);
cout<<"pt1 = "<
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 示例代码
// Size
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 = "<
运行结果:
5. Rect类
5.1 基本概念
Rect是另一个用于定义2维矩形的模板类。它由两个参数定义:
矩形左上角坐标: (x,y)
矩形的宽和高: width, height
Rect可以用来定义图像的ROI区域。
Rect类的成员变量有x,y,width,height,分别为左上角点的坐标和矩形的宽和高。
常用的成员函数有:
Size()返回值为Size;
area()返回矩形的面积;
contains(Point)判断点是否在矩形内;
inside(Rect)函数判断矩形是否在改矩形内;
tl()返回左上角点坐标;
br()返回右下角点坐标。
求两个矩形的交集和并集:
Rect rect = rect1 & rect2;
Rect rect = rect1 | rect2;
矩形进行平移操作和缩放操作:
Rect rectShift = rect +point;
Rect rectScale = rect+size;
5.2 用法
cv::Rect rect(x, y, width, height);