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
一般用来初始化像素值