• OpenCV-C++ Mat对象的使用


    这一篇文章中主要介绍有关Mat类的使用,主要包括:

    • 通过构造函数定义Mat对象;
    • Mat对象常用属性以及方法
    • 创建一个空白图像并进行赋值
    • 创建一个小数组

    通过构造函数定义Mat对象

    Mat中提供了很多的构造函数,这里使用两种方式:

    Mat(Size size, int type);
    Mat(int rows, int cols, int type, const Scalar& s);
    

    第一种方式的示例如下:

    // 1. 通过构造函数定义Mat对象
    Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象
    dst = Scalar(127, 0, 255); // 填充值
    
    // 显示图像
    namedWindow("dst image", WINDOW_AUTOSIZE);
    imshow("dst image", dst);
    waitKey(0);
    

    结果如下图所示:

    当然,其中构造函数的两个参数也可以来自已有Mat对象,如:

    Mat dst = Mat(src.size(), src.type());
    

    第二种使用构造函数定义Mat对象的示例如下:

    // 2. 通过构造函数定义Mat对象
    Mat dst = Mat(128, 128, CV_8UC3, Scalar(0, 0, 255));
    

    Mat对象常用属性以及方法

    1. 展示以下Mat对象常用的属性:
    // 1. 通过构造函数定义Mat对象
    Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象
    dst = Scalar(127, 0, 255); // 填充值
    
    // 3. Mat对象常用属性
    int rows = dst.rows;  // 获取矩阵行
    int cols = dst.cols;	// 获取矩阵列
    int dims = dst.dims;	// 获取矩阵维度
    printf("rows: %d, cols: %d, dims: %d
    ", rows, cols, dims);
    

    输出:

    rows: 128, cols: 128, dims: 2
    

    需要注意的是,OpenCV中维度dims与通道channels是两个不同概念:

    • 维度dims表示矩阵的维度,如上面示例是(128 imes 128)大小的矩阵,它的维度是2;

    • 通过channels表示矩阵中每个元素有几个值,这个示例是3个值,通道数为3;ix

    1. 演示一些Mat对象常用的方法:
    // 4. Mat对象常用方法
    int channels = dst.channels();  // 获取矩阵元素通道数
    int depth = dst.depth();  // 获取每个像素的深度,0: CV_8U, 1: CV_8S,...
    bool isEmpty = dst.empty();
    printf("channels: %d, depth: %d, isEmpty: %d 
    ", channels, depth, isEmpty);
    

    输出:

    channels: 3, depth: 0, isEmpty: 0 
    
    1. 演示一下如何复制Mat对象

    分成两种情况,一种是对原始对象多了一个tmp暂存对象,原始对象改变,tmp对象也改变;另一种是完全构造一个新Mat对象;

    第一种,有两种方式,分别是:使用赋值运算符和使用Mat类复制构造函数;

    // 5. 复制Mat对象
    // 5.1. tmp对象与原始对象绑定
    Mat tmp = src;  // 通过赋值运算符
    Mat tmp2(src);  // 通过复制构造函数
    

    第二种,通过Mat::clone()copyTo()方法:获得一个全新的Mat对象;

    // 5.2 获得一个新的Mat对象
    Mat dst1 = src.clone();
    Mat dst2;
    src.copyTo(dst2);
    
    1. .prt访问矩阵元素

    获取图像第一行的第一个元素:

    // 6. prt的使用
    const uchar * firstRowElement = src.ptr<uchar>(0);
    printf("First Row Element: %d
    ", *firstRowElement);
    
    1. 其他方法
    // 7. 其他方法
    Mat dstOther1 = Mat::zeros(src.size(), src.type());  // 创建全1矩阵
    Mat dstOther2 = Mat::ones(src.size(), src.type());  // 创建零矩阵
    Mat dstOther3 = Mat::eye(src.size(), src.type()); // 创建单位矩阵
    
    Mat dstOther4 = Mat:: zeros(2, 2, CV_8UC1);
    

    创建一个空白图像并进行赋值

    1. 创建一个空白图像,并进行赋值, 方法如下:
    // 8. 创建空白图像并进行赋值
    Mat emptyImage; // 创建Mat对象
    emptyImage.create(src.size(), src.type());
    emptyImage = Scalar(0, 0, 255);
    
    1. 创建多维数组

      // 9. 创建多维数组
      int sz[3] = {3, 2, 2}; // 三维矩阵,3x2x2
      Mat dstMultiMat(3, sz, CV_8UC1, Scalar::all(0));
      

    表示创建一个三维((3 imes 2 imes 2))的矩阵,通道数为1,并全部以0填充;

    创建小数组

    用于创建一些kernel,用于图像的掩模计算:

    // 10. 创建小数组
    Mat smallMat = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    cout << smallMat << endl;
    

    输出:

    [0, -1, 0;
     -1, 5, -1;
     0, -1, 0]
    
  • 相关阅读:
    HTML5程序设计web workers API 学习笔记
    HTML5 拖拽API 学习笔记
    2013.03.23这天的一点感触和计划
    localStorage实现返回到原位置以及pjax的反思
    HTML5 localStorage浅谈
    javascript学习之函数对象简介
    display:-webkit-box
    由登录表单的用户体验细节说开
    前端和用户体验
    Laravel实践step1,一个简单的crud
  • 原文地址:https://www.cnblogs.com/chenzhen0530/p/14619058.html
Copyright © 2020-2023  润新知