c++和opencv小知识:opencv基础入门一(数据类型,Point,size,rect,Matx,vec)

opencv基础入门必备知识(Point,size,rect,Matx,vec)

要学好opencv,其必要的入门知识是对数据类型的认识,以及如何建立常用的类对象;

一、数据类型符号
b = unsighed char (无符号字符类型)
w = unsigned short (无符号短整型)
s = short (有符号短整型)
i = int
f =float
d =double
大家都知道,一个字节8位
64位编译器
char :1个字节
short : 2个字节
int: 4个字节
float: 4个字节
double: 8个字节

这些类型可以用static_cast(数据)做类型转换

其中:
1、有符号类型的数据可以存储负数,无符号类型的数据只能存储正数。
2、针对同一种类型,两者可以存储的数据空间大小是一样的,只是数据范围不一样。以 short 类型为例,unsigned short 存储的范围是 0~65535,signed short 存储的范围是 -32768~32767,两种类型的数据可以存储 65536 个数据。

在opencv中的使用:
如大家常见的:Vec4i, Matx33f, point2f, Rect2d 等

二、常见数据类的对象

在opencv中常见数据类的对象的使用如同c++中的int ,float double一样用在定义数据上,同时我们也要回归类的对象的本身上来,通过对象可以访问类的成员变量和成员函数,以及实例化对象;
我们知道在c++中初始化数据类型是:float a=1.1;
但在opencv中数据类是建立在类中的,应该准守构造函数初始化:

1、Point类

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	//值构造函数初始化
	Point p(1,3);
	//打印p数据类对象下的成员变量
	cout << p.x << endl;
	cout << p.y << endl;
	//默认构造函数
	Point p1;
	//赋值一
	p1 = p;
	//赋值二
	Point p2(p);
	cout << p1.x << endl;
	cout << p1.y << endl;
	cout << p2.x << endl;
	cout << p2.y << endl;
	waitKey(0);
	return 0;
}

说明: Point 等价于Point2i 等价于Point_< int >;
Point2i p (1,3);
Point_< int > p(1,3); 这是真实类模型,以上两个是typedef别名
还有:point2f , point_< float >
point2d , point_< double >
point3i , point_< int >
point3f , point_< float >
point3d , point_< double >
都是一个道理

其他的类都是一个道理了

2、Scalar类
它是一个四维点类,继承了所有的向量代数操作(mul)、成员访问函数([ ]), 此类一般用于图像像素取值。

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	Scalar s(2,3,4);
	cout << s[0] << endl;
	cout << s[1] << endl;
	cout << s[2] << endl;
	Scalar s1(1);
	Scalar s2(2, 3);
	Scalar s3(1, 3, 5,7);
	Scalar s4(s);
	
	waitKey(0);
	return 0;
}

3、size类
size类也一样,成员变量是width和height,,size类的别名有size2i, size2f(32位)

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	Size sz(12,10);
	cout << sz.width << endl;
	cout << sz.height << endl;
	//计算面积
	cout << sz.area() << endl;
	Size sz1(sz);
	
	waitKey(0);
	return 0;
}

4、Rect类
矩形类包含Point类的成员x和y(矩形左上角)和size类的成员width和height(代表矩形的大小),使用都是一样的

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	//构造函数初始化
	Rect r(1,3,10,10);
	//复制构造函数
	Rect r2(r);
	//由起始点和大小构造
	Point p(1, 3);
	Size s(10, 10);
	Rect r3(p, s);
	//通过对角点构造
	Point p1(2, 2);
	Point p2(5, 5);
	Rect r4(p1, p2);
	//计算面积
	cout << r.area() << endl;
	//提取左上角
	cout << r3.tl() << endl;
	//提取右下角
	cout << r4.br() << endl;
	waitKey(0);
	return 0;
}

5、RotetedRect类
旋转矩形,它包含了中心点Point2f,一个大小Size2f,和一个旋转角度float。其中浮点类型float的角度代表图形绕中心点旋转的角度;

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
	Point2f p(100, 100);//中心点
	Size2f sz(30,30);
	float theta = 30;
	RotatedRect rr(p,sz,theta);
	RotatedRect rr1(rr);
	//成员访问
	cout << rr.angle << rr.size << rr.center << endl;
	//重要的成员访问是访问四点坐标,可用来画出矩形
	Point2f vertices[4];
	rr.points(vertices);
	Mat src_img = imread("C:\\Users\\tudejiang\\Desktop\\1.jpg");
	line(src_img, (Point)vertices[0], (Point)vertices[1], Scalar(0));
	line(src_img, (Point)vertices[1], (Point)vertices[2], Scalar(0));
	line(src_img, (Point)vertices[2], (Point)vertices[3], Scalar(0));
	line(src_img, (Point)vertices[3], (Point)vertices[0], Scalar(0));
	imshow("src_img", src_img);
	waitKey(0);
	return 0;
}

在这里插入图片描述
6、固定向量Vec类
都是一个道理
Vec{2,3,4,6}{b,s,w,I,f,d}
vec2s v2s ;Vec6f v6f;
vec3f u3f(v3f)
v2s[ 0],v2s[ 1]

7、固定矩阵Matx类型
Matx{1,2,……}{1,2,……}{b,s,w,I,f,d}
例如;Matx33f m33f 是定义了一个3乘3的矩阵
Matx21f m(x0,x1);
Matx33f m33f = Mat33f::all(x);
Matx33f m33f = Mat33f::zeros(x);
这里有一个重点
在卷积核创建时候我们会用到

Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);

这是应为之前说的point2f 原本就是Point_< float >
因此Mat_< uchar >(3,3) 就是Matx33b

Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
Matx33d m33d(0, -1, 0, -1, 5, -1, 0, -1, 0);

7、range类
Range rng(0,4)包含0,1,2,3
一般用来初始化像素值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值