我们知道在c/c++语言中有int,float,double,char等基本数据类型,但这些在使用的时候还远远不够,所以在opencv中又定义了很多便于图形学计算的数据类型
目录
一、Point
1.定义
顾名思义Point类就是点的类,它用于储存一个点的坐标信息,这个点可以是二维也可以是三维。它支持所有类型的点,如整型和浮点型等。在我们初始化Point类的时候可以指明这个Point类的类型,如cv::Point2i就是指这是一个二维的int(整数)类型的点,cv::Point3f就是指这是一个三维的float(浮点数)类型的点,当然类似的还有cv::Point3d,cv::Point3i,你可以从命名方式看出它们的类型point是点,而2就是说它属于几维,i、f、d就是int,float,double的缩写,后面你会发现这一命名方式将贯穿整个opencv的数据类型。
2.直接受Point类支持的操作
操作 示例 默认构造函数 cv::Point p;
cv::Point2i p;
cv::Point3i p;
复制构造函数 cv::Point3f p1(p2); 值构造函数 cv::Point2i p(x0,y0);
cv::Point3f p(x1,y1,z1);
成员访问 p.x,p.y 点乘 p1.dot(p2); //x1*x2+y1*y2 叉乘 p1.cross(p2); //x1*y2-x2*y1
3.代码演示
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { Point p1(1,2); Point2f p2(1.5, 2.5); Point3i p3(1, 2, 3); //访问Point成员变量x,y,z cout << "p1.x = " << p1.x << endl << "p1.y = " << p1.y << endl << endl; cout << "p2.x = " << p2.x << endl << "p2.y = " << p2.y << endl << endl; cout << "p3.x = " << p3.x << endl << "p3.y = " << p3.y << endl << "p3.z = " << p3.z << endl << endl; //复制p1到p4 Point p4(p1); cout << "执行Point p4(p1)之后,p4 = " << p4 << endl << endl; //执行点乘 int x = p1.dot(p4); cout << "执行p1.dot(p4),p1 * p4 = " << x << endl << endl; //执行叉乘 int y = p1.cross(p4); cout << "执行p1.cross(p4),p1 X p4 = " << y << endl << endl; system("pause"); return 0; }
执行结果:
二、Scalar
1.定义
cv::Scalar是一个四维点类,它的所有成员都是double类型。通常在opencv中用于定义色彩。
2.直接受Scalar类支持的操作
操作 示例 默认构造函数 cv::Scalar s; 复制构造函数 cv::Scalar s1(s2); 值构造函数 cv::Scalar s(x0);
cv::Scalar s(x0, x1, x2);//最常用
cv::Scalar s(x0, x1, x2, x3);
代码演示
代码中看不懂的部分不用担心,后面的教程都会教给大家,这个代码只是为了演示Scalar类的主要用法
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { //这里我们定义了一个500*500的图片,他是CV_8UC3类型 //Scalar(255,0,0)代表蓝色,他的三个位置分别代表BGR三色 Mat img1 = Mat(500, 500, CV_8UC3, Scalar(255, 0, 0)); imshow("蓝色", img1); //Scalar(0,255,0)代表绿色 Mat img2 = Mat(500, 500, CV_8UC3, Scalar(0, 255, 0)); imshow("绿色", img2); //Scalar(0,0,255)代表红色 Mat img3 = Mat(500, 500, CV_8UC3, Scalar(0, 0, 255)); imshow("红色", img3); waitKey(); return 0; }
执行结果:
三、Size
1.定义
Size总体来说和Point类很像,而且可以和Point类互相转换,区别就是Point使用x,y来访问,size使用width,height来访问,没错size就是用来定义大小的类,你可以把它看作是一个矩形,width,height就是它的宽和长,它的三个别名分别是cv::Size、cv::Size2i、cv::Size2f
2.直接受Size类支持的操作
操作 示例 默认构造函数 cv::Size sz;
cv::Size2i sz;
cv::Size2f sz;
复制构造函数 cv::Size sz1(sz2); 值构造函数 cv::Size sz(w,h);//w宽,h高 成员访问 sz.width; sz.height; 计算面积 sz.area();
3.代码演示
#include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; int main() { //定义9*8的大小 Size sz(9, 8); //输出宽和高 cout << "sz.width = " << sz.width << endl << "sz.height = " << sz.height << endl << endl; //输出面积 cout << "area = " << sz.area() << endl; system("pause"); return 0; }
执行结果:
四、Rect
1.定义
如果说Size像一个矩形,那么Rect就是一个真正的矩形,它是由Point和Size组合而成,其中Point代表了它的左上角坐标,Size代表它的大小。
2.直接受Rect类支持的操作
操作 示例 默认构造函数 cv::Rect r; 复制构造函数 cv::Rect r1(r2); 值构造函数 cv:Rect(x,y,w,h);//x,y是左上角坐标,w,h是宽和高 由起始点和大小构造 cv::Rect(p, sz);//p是左上角坐标,sz是宽和高 由两个对角构造 cv::Rect(p1, p2);//p1是左上角坐标,p2是右下角坐标 成员访问 r.x; r.y; r.width; r.height; 计算面积 r.area(); 提取左上角 r.tl(); 提取右下角 r.br(); 判断点p是否在矩形r内 r.contains(p);
3.Rect对象覆写的操作符
操作 示例 矩形r1,r2的交集 cv::Rect r3 = r1 & r2;
r1 &= r2;
同时包含矩形r1,r2的最小面积矩形 cv::Rect r3 = r1 | r2;
r1 |= r2;
平移矩形r x个数量 cv::Rect rx = r + x;
r += x;
扩大矩形r s个大小 cv::Rect rs = r + s;
r += s;
比较矩形r1,r2是否相等 bool eq = (r1 == r2); 比较矩形r1,r2是否不相等 bool eq = (r1 != r2);
4.作业
在学习一门技术的时候,最重要的就是阅读文档的能力,请你根据上面几个类的代码和Rect的介绍,模仿写出Rect的使用代码。
五、总结
上面四种数据类型是opencv中最常用的数据类型,它们四个在一起组成了opencv中最重要的类Mat,我们将在下一篇对它深入讲解