OpenCV基础类型
一、(像素)点(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+维度+类型
1 b- unsigned char 2 s- short int 3 i- 32-bit int 4 f- 32-bit float 5 d- 64-bit float
Point类的操作:
1 默认构造 Point2i p1;Point3f p2; 2 拷贝构造 Point3f p2(p1); 3 数值初始化 Point2i p1(x0,x1);Point3f p2(x0,x1,x2); 4 转换到Vector类型 (Vec3f) p; 5 成员访问 p.x; p.y; 6 点积运算 float x = p1.dot(p2); 7 双精度点积 double x = p1.ddot(p2); 8 向量积(仅适用三维) p1.cross(p2); 9 查询是否在某区域(rectangle)内(仅适用二维) p.inside(r); 10 注意: 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类操作
1 默认构造 Size sz;Size2i sz; Size2f p2; 2 拷贝构造 Size sz2(sz1); 3 数值初始化 Size sz(w,h); 4 成员访问 sz.width; sz.height; 5 计算区域面积 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类操作
1 默认构造 Rect r; 2 拷贝构造 Rect r2(r1); 3 数值初始化 Rect r(x, y, w , h); 4 点坐标及大小初始化构造 Rect r(p,sz); 5 两点初始化构造 Rect r(p1, p2); 6 成员访问 r.x; r.y; r.width; r.height; 7 计算区域面积 r.area(); 8 提取左上角点 r.tl(); 9 提取右下角点 r.br(); 10 判断点是否在某区域内 r.contains(p); 11 12 重载操作符对象间的运算: 13 矩形1与矩形2的交集 Rect r3 = r1 & r2; 14 包含矩形1与矩形2的最小矩形 Rect r3 = r1 | r2; 15 平移左上角坐标矩形大小不变 Rect r2 = r1 + p; 16 放大或缩小矩形大小,左上角点不变 Rect r2 = r1 + sz; 17 判断两个矩形是否相等 bool eq = ( r1 == r2);bool ne = ( r1 != r2);
操作计算演示:
1 #include <opencv2/core.hpp> 2 #include <iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 int main() 8 { 9 Rect r1(5, 5, 15, 10); 10 Rect r2(5, 5, 10, 5); 11 Rect r3 = r1 | r2; 12 Point p(2,3); 13 Rect r4 = r1 + p; 14 cout << "r3.width = " << r3.width << endl //15 15 << "r3.height= " << r3.height << endl //10 16 << "r3.area = " << r3.area() << endl; //150 17 cout << r3 << endl; //[ 15 x 10 from (5, 5)] 18 cout << r4 << endl; 19 return 0; 20 }
四、图像像素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://docs.opencv.org/master/db/da5/tutorial_how_to_scan_images.html
4.2 C++语言 Scalar类
Scalar类直接继承固定大小的向量Vector类,直接支持向量类的代数操作,成员访问及其它操作特性;
Scalar类的操作:
1 默认构造 Scalar s; 2 拷贝构造 Scalar s2(s1); 3 数值初始化 Scalar s(x0); Scalar s(x0,x1,x2,s3); 4 数组元素相乘 s1.mul(s2); 5 共轭 s1.conj();
五、补充部分
5.1 旋转矩形类 RotatedRect类
在OpenCV C++借口中少数不使用类模板实现的类型之一
相比Rect类,该类将Point2f称为中心点,Size2f称为大小,另外一个附加的float称为角度(表现为围绕中心点顺时针方向旋转的角度)
RotatedRect类操作
1 默认构造 RotatedRect rr(); 2 拷贝构造 RotatedRect rr2(rr1); 3 数值初始化 RotatedRect rr(p,sz,theta); 4 两点初始化 RotatedRect rr(p1,p2); 5 成员访问 rr.center; rr.size; rr.angle; 6 返回4角点坐标 rr.points(pts[4]);
5.2固定大小矩阵类 fixed matx类
fixed matx类是针对在编译期间已知其维度的且通常处理矩阵代数运算,在栈上分配空间
与其他类型的关系:
matx是其他基础类型的核心;
例如:fixed vector继承自fixed matrix;其它类(如Scalar类)继承自fixed vector,或者针对许多重要操作,它们都依赖于转换成fixed vector;
如果对象确实是一个大型阵列,比如图像或一组大型点阵列应该使用Mat类;
Matx类操作
1 默认构造 Matx33f m33f; Matx43d m43d; 2 拷贝构造 Matx22d m22d(n22d); 3 数值初始化 Matx21f m(x0,x1); Matx44d m(x0,x1,x2,x3...x15); 4 全指定元素 m33f = Matx33f::all(x); 5 零矩阵 m23d = Matx23d::zeros(); 6 一矩阵 m16f = Matx16f::ones(); 7 单位矩阵 m33f = Matx33f::eye(); 8 均匀分布矩阵 m33f = Matx33f::randu(min, max); 9 正态分布矩阵 m33f = Matx33f::nrandu(mean, variance); 10 成员访问 m(i,j), m(i)一个参数仅限于一维矩阵 11 矩阵代数运算 m1 = m0; m0*m1; m0 + m1; m0-m1; 12 数乘运算 m*a;a*m;m/a;
5.3固定大小向量类 fixed vector类
继承自fixed matrix类,可以看做matx类列数为一的别名;
该类的设计,便利性在于单顺序范文成员,并定义一些通常mat
声明:Vec{2,3,4,6}{b,s,w,i,f,d}
W- unsigned short
fixed Vector类操作
1 默认构造 Vec2s v2s; 2 拷贝构造 Vec3f u3f(v3f); 3 数值初始化 Vec2f v2f(x0,x1); 4 成员访问 v4f(i), v3w[i] 两种操作符都可以 5 向量积 v3f.cross(u3f);
Written at : 2018.06.23