opencv从入门到放弃(2)——认识Mat之前先来认识它们四兄弟

我们知道在c/c++语言中有int,float,double,char等基本数据类型,但这些在使用的时候还远远不够,所以在opencv中又定义了很多便于图形学计算的数据类型

目录

 

一、Point

1.定义

2.直接受Point类支持的操作

3.代码演示 

 二、Scalar

1.定义

2.直接受Scalar类支持的操作 

3.代码演示  

 三、Size

1.定义

2.直接受Size类支持的操作  

 3.代码演示  

 四、Rect

1.定义

2.直接受Rect类支持的操作   

3.Rect对象覆写的操作符 

4.作业 

五、总结 


一、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,我们将在下一篇对它深入讲解

猜你喜欢

转载自blog.csdn.net/qq_40238526/article/details/90514224