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 }
OpenCV基本数据结构

相关文章: