1.分类
基本数据结构(basic data types)
辅助数据结构(Helper object)
大型数据结构(Large array object):mat
STL数据结构:vector,pair
2.基础数据结构:Point、Scalar、Size、cv::Rect、RotatedRect、Matx
3.点Point
3.1Point构造
cv::Point2i p; //定义点p为2位的整形,例如(x,y) x和y取整形数据
cv::Point3f p; //定义点p为3位的浮点型,例如(a,b,c),abc取float数据
cv::Point3f p2(p1); //拷贝构造,将p1拷贝给p2
cv::Point2i p(x0,x1); //赋值构造,x0和x1直接取int型数据
cv::Point3d p(x0,x1,x2); //赋值构造,x0,x1,x2直接取double类型数据
3.2Point取值
int i=p.x; //取Point2i的x坐标
float f=p.y; //Point2f的y坐标
3.3Point函数
p.inside(r); //判断p是否在r中
cv::Point2i p=Point2i(10,10);
cv::Point2i p1=Point2i(200,200);
cv::Recti2i r=Rect2i(0,0,100,100);
bool b=p.inside(r);
bool b1=p1.inside(r);
4. 4位double类型Scalar:n.数量,标量
cv::Scalar是四位双浮点数的点集合 4位double
Scalar(255)表示全白,Scalar(g,b,r)表示一个GBR色彩只是它功能的一种
4.1Scalar构造
cv::Scalar s; //空构造
cv::Scalar s2(s1); //拷贝构造 将s1赋值给s2
cv::Scalar s(x0); //赋值构造
cv::Scalar s(x0,x1,x2,x3); //赋值构造
4.2Scalar函数
s1.mul(s2); //乘法 每一位分别相乘
Scalar s(255,255,255);
Scalar s2(10,100,255);
Scalar ss=s.mul(s2);
5.尺寸Size
5.1Size构造
cv::Size sz; //空构造
cv::Size2i sz; //2位int型
cv::Size2f sz; //2位float型
cv::Size sz2(sz1); //将sz1拷贝给sz2
cv::Size2f sz(w,h); //赋值构造,w和h分别对应属性width和height
5.2取值
sz.width; //取宽度
sz.height; //取高度
size不能够和老的数据结构相互转换。
6.平行矩形Rect
6.1Rect构造
cv::Rect r; //空构造
cv::Rect r2(r1); //拷贝构造,将r1赋值给r2
cv::Rect(x,y,w,h); //x,y左上角的点坐标 w,h矩形的宽高
cv::Rect(p,sz); //p指矩形左上角的点,sz的width和height就是矩形的宽高
cv::Rect(p1,p2); //p1指矩形左上角的点,p2指矩形右下角的点
Size size=Size(10,10);
cv::Rect r1(0,0,100,100);
cv::Rect r2(p,size);
cv::Rect r3(p,p2);
6.2Rect取值
r.x; //取左上角x坐标
r.y; //取左上角y坐标
r.width; //取矩形的宽度
r.height; //取矩形的高度
6.3Rect函数
r.area(); //面积
r.tl(); //左上点,top left
r.br(); //右下点,bottom right
r.contain(p); //r是否包含点p <==> p.inside(r); //p点是否存在于r内
6.4Rect几何运算
cv::Rect r3=r1&r2; //交运算
cv::Rect r3=r1|r2; //并运算
cv::Rect rs=r+s; //r偏移一个size
bool eq=(r1==r2); //判断r1、r2是否严格相等
7.旋转矩形RotatedRect
7.1RotatedRect构造
cv::RotatedRect rr(); //空构造
cv::RotatedRect rr2(rr1); //拷贝构造,将rr1赋值给rr2
cv::RotatedRect(p1,p2,p3); //赋值构造,p1,p2,p3必须是矩形的三个点,否则报错
cv::RotatedRect(p,sz,theta); //p为中心点,sz为sz,theta为角度 角度是0~360
cv::RotatedRect rr1=cv::RotatedRect(p,size,45);
7.2RotatedRect取值
rr.center; rr.size; rr.angle;
rr.points(pts(4)); //获得4个角点的值
Point2i p_rr=rr.center;
Size p_size=rr1.size;
float p_angle=rr1.rangle;
Point2f pts[4]; //点的数组,长度是4,数据类型为float
rr.points(pts); //执行完之后,pts内四个点就是矩形rr1的四个角点
8.矩阵Matrax
Mat可以任意维的,Matx是确定维数的。 特点:quick
8.1Matx构造
cv::Matx33f m33f; cv::Matx43d m43d; //空构造
cv::Matx22d m22d(n22d); //拷贝构造
Matx33f m(1,2,3
4,5,6
7,8,9); //赋值构造
cv::Matx m33f=cv::Matx33f::all(x); //eg:x=6,三行三列全部都是6
cv:Matx m23d=cv::Matx23d::zeros(); //6个0
cv::Matx m16f=cv::Matx16f::ones(); //ones是全是1的意思
cv::Matx m33f=cv::Matx33f::eye(); //单位矩阵的意思。(1,0,0
0,1,0
0,0,1)
8.2Matx取值
m(i,j); m(i); //取值
double d23=m23d(1,2); //第2行第3列
float f16=m16f(0,0); //第1行第1列
Matx13f m13f=m33f.row(2); //第3行
Matx31f m31f=m33f.col(2); //第3列
8.3Matx基本计算
m1=m0; //赋值
m0*m1; //相乘
m0+m1; //相加
m0-m1; //相见
m*a; //矩阵乘以一个常数
a*m; //一个常数乘以一个矩阵
m/a; //矩阵除以一个常数,a不等于0
8.4Matx操作计算
n44f=m44f.t(); //转置
标量乘与点乘要求相乘的两个矩阵结构必须是一样的,标量乘必须是一维的。
m1.mul(m2); //点乘
标量乘 (a1,a2,a3,a4)*(b1,b2,b3,b4)=a1*b1+a2*b2+a3*b3+a4*b4;
向量乘可以3*3与3*1. 向量乘用的符号*
向量乘 (a00,a01 (b00,b01,b02 (a00*b00+a01*b10,a00*b01+a01*b11,a00*b02+a01*b12
a10,a11 * b10,b11,b12) = a10*b00+a11*b10,a10*b01+a11*b11,a10*b02+a11*b12
a20,a21) a20*b00+a21*b10,a20*b01+a21*b11,a20*b02+a21*b12)
1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; //opencv引用 5 using namespace std; //C++标准库函数 6 7 int main(int argc, char** argv[]) 8 { 9 //图片数据 10 Mat src = imread("F:/OpenCV/模拟图像/002.jpg"); //不加读取参数,默认彩色图像 11 imshow("src", src); 12 //points 13 cv::Point2i p = Point2i(10, 10); 14 cv::Point2i p2 = Point2i(200, 200); 15 cv::Point2f p1 = Point2f(0, 0); 16 cv::Point2f p3 = Point2f(10, 10); 17 cv::Point2f p4 = Point2f(200, 200); 18 cv::Rect2i r = Rect2i(0, 0, 100, 100); 19 bool b = p.inside(r); //判断点是否在矩形中 20 bool b2 = p2.inside(r); 21 //scalar 22 Scalar s(255, 255, 255); 23 Scalar s2(10, 100, 255); 24 Scalar ss; 25 ss = s.mul(s2); 26 //rect 27 Size size = Size(100, 100); 28 cv::Rect r1(0, 0, 100, 100); //赋值构造 29 cv::Rect r2(p, size); 30 cv::Rect r3(p, p2); 31 Size sos(10, 10); 32 cv::Rect r4 = r1 & r2; 33 bool eq = (r1 == r2); //这里的是否相等是严格的相等,不仅仅是面积 34 //rotatedrect 35 Point2f pf1 = Point2f(0, 0); 36 Point2f pf2 = Point2f(10, 0); 37 Point2f pf3 = Point2f(6, 10); 38 //cv::RotatedRect rr2 = cv::RotatedRect(pf1, pf2, pf3); 39 cv::RotatedRect rr1 = cv::RotatedRect(p, size, 45); // 创建数据结构 40 Point2i p_rr = rr1.center; 41 Size p_size = rr1.size; 42 float p_angle = rr1.angle; 43 Point2f pts[4]; 44 rr1.points(pts); 45 //matx 46 Matx33f m(1, 2, 3, 47 4, 5, 6, 48 7, 8, 9); 49 cv::Matx23d m23d = cv::Matx23d::zeros(); 50 cv::Matx16f m16f = cv::Matx16f::ones(); 51 cv::Matx33f m33f = cv::Matx33f::eye(); 52 cv::Matx33f randu33f = cv::Matx33f::randu(0, 1); 53 double d23 = m23d(1, 2); 54 float f16 = m16f(0, 0); 55 Matx13f m13f = m33f.row(2); 56 Matx31f m31f = m33f.col(2); 57 waitKey(); 58 return 0; 59 }