目录
OpenCV中设计和定义了大量的基本数据结构,使用这些数据结构,可以很方便的实现相应地算法。其中这些数据结构主要使用类模板来实现,并提供了基本的数据属性和基本的操作。
提示:读者必须具备一定的C/C++基础,并且建议读者在学习下面的知识点的时候,不要以一次性掌握其内容为主,而是对其进行了解;只有当在写程序的时候,需要时再去查找相关细节知识点,多用就熟悉了。
1.各种类模板
(1)二维点Point_类模板
提示:Point_类模板中定义了公有数据成员x和y,并且重载了+,-,=,==,+=四个基本的操作。
例如:
#include<iostream> #include<opencv2/core.hpp> #include<opencv2/highgui.hpp> using namespace cv; using namespace std; typedef Point_<int>Point2i; typedef Point_<float>Point2f; typedef Point_<double>Point2d; int main() { //创建两个对象,并且调用构造函数进行初始化 Point2f a(0.3,0.2),b(0.1,0.5); //将a和b进行运算的结果赋值给c Point2f p = (a + b) * 10; cout<<"point.x = "<<p.x<<" point.y = "<<p.y<<endl; return 0; }
(2)三维点Point3_类模板
typedef Point3_<int>Point3i;
typedef Point3_<float>Point3f;
typedef Point3_<double>Point3d;
(3)尺寸Size_类模板
typedef Size_<int>Size2i;
typedef Size_<int>Size2f;
(4)矩形Rect_类模板
Rect_类模板的示例为矩形区域(x,y,width,height),其中(x,y)表示左上角坐标,范围为[x,x + width),[y, y + height)。
常见的一些操作:
- 矩形偏移:rect = rect +(-) point
- 改变大小:
- rect = rect +(-) size
- rect += point
- rect -= point
- rect += size
- rect -= size;
- 矩形交集:rect = rect1 & rect2
- 包含最小的矩形:
- rect = rect1 | rect2
- rect &= rect1
- rect |= rect1
- rect == rect1
- rect != rect1
比如下面的矩形进行偏移(其他操作类似):
#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
using namespace std;
typedef Point_<int>Point2i;
typedef Point_<float>Point2f;
typedef Point_<double>Point2d;
typedef Point3_<int>Point3i;
typedef Point3_<float>Point3f;
typedef Point3_<double>Point3d;
typedef Size_<int>Size2i;
typedef Size_<int>Size2f;
typedef Rect_<int>Rect2i;
typedef Rect_<float>Rect2f;
int main()
{
//创建两个对象,并且调用构造函数进行初始化
Rect2i rect1(1,2,3,4),rect2(3,4,5,6);//表示矩形a的左上角坐标为(1,2),宽高为(3,4),同理b
//将a和b进行运算的结果赋值给c
Point2i p1(1,2),p2(2,3);
cout<<"矩形rect1偏移之前的坐标: ("<<rect1.x<<","<<rect1.y<<")"<<endl;
cout<<"矩形rect2偏移之前的坐标: ("<<rect2.x<<","<<rect2.y<<")"<<endl;
cout<<"------------------------------------------------------"<<endl;
//对矩形进行偏移
rect1 = rect1 + p1;
rect2 = rect2 + p2;
cout<<"矩形rect1偏移之后的坐标: ("<<rect1.x<<","<<rect1.y<<")"<<endl;
cout<<"矩形rect2偏移之后的坐标: ("<<rect2.x<<","<<rect2.y<<")"<<endl;
return 0;
}
(5)旋转矩形RotatedRect类模板
旋转矩形RotatedRect有中心,边长,旋转角度3个成员组成,用户可以访问这三个成员也可以使用points函数返回它的四个顶点,使用boundingRect求出它的外接矩形(非旋转)。比如:
RotatedRect rRect = RotatedRect(Point2f(100,100),Size2f(100,50),30);
(6)小矩阵Matx类模板
#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
using namespace std;
typedef Matx<float,1,2>Matx12f;//构造一个矩阵大小为1行,2列
typedef Matx<double,1,2>Matx12d;//构造一个矩阵大小为1行,2列
typedef Matx<float,1,6>Matx16f;//构造一个矩阵大小为1行,6列
typedef Matx<double,1,6>Matx16d;//构造一个矩阵大小为1行,6列
typedef Matx<float,2,1>Matx21f;//构造一个矩阵大小为2行,1列
typedef Matx<double,2,1>Matx21d;//构造一个矩阵大小为2行,1列
typedef Matx<int,2,2>Matx22i;//构造一个矩阵大小为2行,2列
typedef Matx<float,2,2>Matx22f;//构造一个矩阵大小为2行,2列
typedef Matx<double,2,2>Matx22d;//构造一个矩阵大小为2行,2列
int main()
{
//创建两个对象,并且调用构造函数进行初始化
Matx12f mat1(1,2);//初始化mat1[0][0] = 1,mat1[0][1] = 2
int m = mat1.rows;
int n = mat1.cols;
cout<<"矩阵大小为1 x 2"<<endl;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
cout<<mat1(i,j)<<" ";
}
cout<<endl;
}
cout<<"------------------------------------------------------"<<endl;
Matx22d mat2(1,2,3,4);//mat2[0][0] = 1,mat2[0][1] = 2,mat2[1][0] = 3,mat2[1][1] = 4
m = mat2.rows;
n = mat2.cols;
cout<<"矩阵大小为2 x 2"<<endl;
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
cout<<mat2(i,j)<<" ";
}
cout<<endl;
}
return 0;
}
(7)短向量Vec类模板
短向量Vec支持加减,数乘,相等和不等运算。
#include<iostream>
#include<opencv2/core.hpp>
#include<opencv2/highgui.hpp>
using namespace cv;
using namespace std;
typedef Vec<uchar,2>Vec2b;
typedef Vec<int,2>Vec2i;
typedef Vec<int,3>Vec3i;
typedef Vec<float,3>Vec3f;
typedef Vec<double,3>Vec3d;
int main(){
Vec2i vec1(0),vec2(1);
Vec3f vec3(1,2,3),vec4(1);
cout<<"向量1输出: "<<endl;
int size = vec1.rows;
for(int i = 0; i < size; i++)cout<<vec1[i]<<" ";
cout<<endl;
cout<<"------------------------------------"<<endl;
cout<<"向量2输出: "<<endl;
size = vec2.rows;
for(int i = 0; i < size; i++)cout<<vec2[i]<<" ";
cout<<endl;
cout<<"------------------------------------"<<endl;
cout<<"向量3输出: "<<endl;
size = vec3.rows;
for(int i = 0; i < size; i++)cout<<vec3[i]<<" ";
cout<<endl;
cout<<"------------------------------------"<<endl;
cout<<"向量4输出: "<<endl;
size = vec4.rows;
for(int i = 0; i < size; i++)cout<<vec4[i]<<" ";
cout<<endl;
cout<<"------------------------------------"<<endl;
return 0;
}
(8)四维向量Scalar_类模板
Scalar_类模板是Vec<tp,4>派生得到的,是一个4元组,通常用来传递像素,比如:
typedef Scalar_<double>Scalal;
(9)Range类模板
Range类模板用来指定连续的子序列,比如矩阵的一部分。
(10)cv::Mat类模板
这部分单独写一章来讲,内容比较多。
参考书籍:
《数字图像处理基础》