您的位置:首页 > 理论基础 > 数据结构算法

Opencv3编程入门第四章--Opencv 数据结构与基本绘图

2020-01-15 05:11 141 查看

Opencv 数据结构与基本绘图

  • Opencv格式化输出方法
  • 输出其他常用数据结构
  • 常用数据结构和函数
  • 基础图像容器 Mat

    Mat优点及注意事项

    • Mat优点
      – 不用手动开辟空间
      – 不需要手动释放空间

    要点1. Mat = 矩阵头+一个指向存储所有像素值的矩阵

    要点2. 拷贝构造函数只复制信息头和矩阵指针,而不复制矩阵,即赋值运算符和拷贝构造函数(构造函数)只复制信息头,例【Mat B(A) or C = A】

    要点3. 使用函数clone()或者copyTo()来复制一个图像的矩阵【深拷贝】

    像素值的存储方式

    1. RGB【显示屏】
    2. HSV/HLS 【对光照不敏感】
    3. YCrCb 【JPEG】
    4. CIE Lab 【用来度量2个颜色的距离】

    显式创建Mat对象方法

    1. 使用Mat()构造函数
    Mat M(2,2,CV_8UC3, Scalar(0,0,0255))
    输出:
    [  0,   0, 255,   0,   0, 255;
    0,   0, 255,   0,   0, 255]

    tips: CV_[位数][带符号与否][类型前缀]C[通道数]

    1. 在C/C++中通过构造函数进行初始化
    int sz[3] = {2,2,2};
    Mat L(3,sz,CV_8UC,Scalar::all(0));
    1. 利用Create()函数
    M.create(4,4,CV_8UC(2));
    cout<<"M="<<endl<<" "<< M << endl << endl;

    该方法不能为矩阵设置初值,知识在盖面尺寸是重新为矩阵数据开辟内存而已。

    1. 对小矩阵使用逗号分隔式初始化函数
    Mat C = (Mat_<double>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
    cout << "C=" << endl << " " << endl << endl
    1. 为已存在的对象创建信息头
    Mat RowClone = C.row(1).clone();
    count << "RowClone = " << endl << "" << RowClone << endl << endl;

    Opencv格式化输出方法

    int main()
    {
    Mat M(10, 3, CV_8UC3);
    randu(M, Scalar::all(0), Scalar::all(255));//随机
    cout << "r(Opencv默认风格)=" << M << ";" << endl << endl;
    waitKey(0);
    return 0;
    }
    输出:
    r(Opencv默认风格)=[ 91,   2,  79, 179,  52, 205, 236,   8, 181;
    239,  26, 248, 207, 218,  45, 183, 158, 101;
    102,  18, 118,  68, 210, 139, 198, 207, 211;
    181, 162, 197, 191, 196,  40,   7, 243, 230;
    45,   6,  48, 173, 242, 125, 175,  90,  63;
    90,  22, 112, 221, 167, 224, 113, 208, 123;
    214,  35, 229,   6, 143, 138,  98,  81, 118;
    187, 167, 140, 218, 178,  23,  43, 133, 154;
    150,  76, 101,   8,  38, 238,  84,  47,   7;
    117, 246, 163, 237,  69, 129,  60, 101,  41];

    输出其他常用数据结构

    1. 定义和输出二维点
    Point2f p(6,2);
    cout << p << ";\n" << endl;  // [6,2]
    1. 定义和输出三维点
    Point3f p3f(8,2,0);
    cout << p3f << ";\n" << endl;
    1. 定义和输出基于Mat的std::vector
    vector<float> v;
    v.push_back(3);
    v.push_back(4);
    cout <<Mat(v) << ";\n" << endl;

    4.定义和输出std::vector点

    vector<Point2f> points(20);
    for (size_t i = 0; i < points.size(); ++i)
    points[i] = Point2f((float)(i*5),(float)(i%7));
    cout <<points ;

    常用数据结构和函数

    1. 点的表示
    Point point
    point.x = 10;
    point.y = 8;
    1. 颜色的表示:Scalar类
      Scalar(a,b,c)
    2. 尺寸的表示:Size类
      Size(5,5);
    3. Rect类
      contains(Point)判断点是否在矩阵内;
      inside(Rect)判断矩阵是否在该矩阵内;
      tl()返回左上角点坐标;
      br()返回右下角坐标;
    4. 颜色空间转换:cvtColor()函数
    cvtColor(src,dst,CV_RGB2GRAY);
    //将输入图像的RGB颜色通道转为GRAY,然后将GRAY形式的图像传给dst;

    6.基本图形的绘制
    【ToDo】待整理
    基本图形的绘制.

    • 点赞
    • 收藏
    • 分享
    • 文章举报
    KK_THREESTEP 发布了12 篇原创文章 · 获赞 0 · 访问量 967 私信 关注
    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: