一,(像素)点 (x,y) 类型
1.1 C 语言 CvPoint 结构体
CvPoint 类型是一个包含两个 int 类型的结构体; 通常表示某像素点的坐标位置(x,y)
两个变体类型:
CvPoint2D32f 表示该点坐标 (x,y) 的数据类型时浮点型;
CvPoint3D32f 表示该点坐标 (x,y,z) 的数据类型时浮点型;
1.2 C++ 语言 Point 类
通过模板结构实现, 重载了向量 vector 类代数操作和组合操作
针对二维和三维存在两种模板结构体 Point, 数据类型可以为 int 或者 float 等等
点类型最大的好处是简单开销小, 我们很少对点类型数据进行数据操作, 而是用于转换为更多其他的结构类型, 例如向量类或者矩阵类;
点类型声明: Point + 维度 + 类型
- b- unsigned char
- s- short int
- i- 32-bit int
- f- 32-bit float
- d- 64-bit float
类型表示
Point 类的操作:
默认构造 Point2i p1;Point3f p2;
拷贝构造 Point3f p2(p1);
数值初始化 Point2i p1(x0,x1);Point3f p2(x0,x1,x2);
转换到 Vector 类型 (Vec3f) p;
成员访问 p.x; p.y;
点积运算 float x = p1.dot(p2);
双精度点积 double x = p1.ddot(p2);
向量积(仅适用三维) p1.cross(p2);
查询是否在某区域 (rectangle) 内(仅适用二维) p.inside(r);
注意: C++Point 类转换成 C 语言结构 CvPoint 需要注意浮点型数据直接转换为 CvPoint 会自动四舍五入(CvPoint 默认类型为 int);
二,(图像)大小类型 CvSize
2.1 C 语言 CvSize 结构体
CvSize 类型是一个包含两个 int 类型的结构体; 通常表示某图像 / 区域的宽高大小(width, height)
数据类型使用浮点型, 同样显示指定 CVSize2D32f
2.2 C++ 语言 Size 类
相比 Point 类,
1. 数据成员不同, Size 类成员为 width 和 height
2. 不能转换成固定大小的 Vector 类, 但 Vector 类和 Point 类可以转换成 Size 类
Size 类存在三种别名 Size == Size2i,Size2f
Size 类操作
默认构造 Size sz;Size2i sz; Size2f p2;
拷贝构造 Size sz2(sz1);
数值初始化 Size sz(w,h);
成员访问 sz.width; sz.height;
计算区域面积 sz.area();
三, 区域矩形大小类型 CvRect
3.1 C 语言 CvRect 结构体
CvRect 派生于 CvPoint 和 CvSize, 包含四个 int 成员: x,y,width,height;
3.2 C++ 语言 Rect 结构体
矩形类成员包含 Point 类成员的 x,y 表示矩形的左上角, Size 类成员 width 和 height 表示矩形的大小, Rect 类并不继承自 Point 或 Size;
Rect 类操作
默认构造 Rect r;
拷贝构造 Rect r2(r1);
数值初始化 Rect r(x, y, w , h);
点坐标及大小初始化构造 Rect r(p,sz);
两点初始化构造 Rect r(p1, p2);
成员访问 r.x; r.y; r.width; r.height;
计算区域面积 r.area();
提取左上角点 r.tl();
提取右下角点 r.br();
判断点是否在某区域内 r.contains(p);
重载操作符对象间的运算:
矩形 1 与矩形 2 的交集 Rect r3 = r1 & r2;
包含矩形 1 与矩形 2 的最小矩形 Rect r3 = r1 | r2;
平移左上角坐标矩形大小不变 Rect r2 = r1 + p;
放大或缩小矩形大小, 左上角点不变 Rect r2 = r1 + sz;
判断两个矩形是否相等 bool eq = ( r1 == r2);bool ne = ( r1 != r2);
操作计算演示:
- #include <opencv2/core.hpp>
- #include <iostream>
- using namespace std;
- using namespace cv;
- int main()
- {
- Rect r1(5, 5, 15, 10);
- Rect r2(5, 5, 10, 5);
- Rect r3 = r1 | r2;
- Point p(2,3);
- Rect r4 = r1 + p;
- cout << "r3.width =" << r3.width << endl //15
- << "r3.height=" << r3.height << endl //10
- << "r3.area =" << r3.area() << endl; //150
- cout << r3 << endl; //[ 15 x 10 from (5, 5)]
- cout << r4 << endl;
- return 0;
- }
四, 图像像素 RGBA 值 CvScalar
4.1 C 语言 CvScalar 结构体
内部存储了四个 double 型的值, 分别为 val[0],val[1],val[2],val[3], 我们通常用的是前三个, val[0],val[1],val[2]的含义分别是彩色照片的三个通道 BGR.R 是红色分量, G 是绿色分量, B 是蓝色分量, a 是 alpha;
图像存储的矩阵大小依赖于色彩空间的选用, 更准确的说取决于所使用的通道数, 在灰度图像中在内存描述如下:
对于多通道图像, 列包含与通道数量一样多的子列. 例如, 在 BGR 颜色系统的情况下:
来源: https://www.cnblogs.com/Shuqing-cxw/p/9217375.html