zoukankan      html  css  js  c++  java
  • OpenCV中Mat的使用

    一、数字图像存储概述

    数字图像存储时,我们存储的是图像每个像素点的数值,对应的是一个数字矩阵。

    二、Mat的存储

    1、OpenCV1基于C接口定义的图像存储格式IplImage*,直接暴露内存,如果忘记释放内存,就会造成内存泄漏。

    2、从OpenCV2开始,开始使用Mat类存储图像,具有以下优势:

    (1)图像的内存分配和释放由Mat类自动管理

    (2)Mat类由两部分数据组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。Mat在进行赋值和拷贝时,只复制矩阵头,而不复制矩阵,提高效率。如果矩阵属于多个Mat对象,则通过引用计数来判断,当最后一个使用它的对象,则负责释放矩阵。

    (3)可以使用clone和copyTo函数,不仅复制矩阵头还复制矩阵。

    三、Mat创建

    1、使用Mat构造函数

    Mat test(2,2,CV_8UC3,Scalar(0,0,255));

    2、使用Mat构造函数2

    int sizes[3] = {2,2,2};

    Mat test(3,sizes,CV_8UC3,Scalar::all(0));

    3、为已存在的IplImage指针创建信息头

    IplImage* img = cvLoadImage("1.jpg",1);

    Mat test(img);

    4、利用create函数

    Mat test;

    test.create(4,4,CV_8UC2);

    5、采用Matlab形式的初始化方式

    (1)Mat me = Mat::eye(4,4,CV_64F);

    (2)Mat mo = Mat::ones(2,2,CV_32F);

    (3)Mat mz = Mat::zeros(3,3,CV_8UC1);

    注:元素类型,即CV_[位数][带符号与否][类型前缀]C[通道数]

    四、Mat中相关成员的意义

    1、data

    Mat对象中的一个指针,指向存放矩阵数据的内存(uchar* data)

    2、dims

    矩阵的维度,3*4的矩阵维度为2维,3*4*5的矩阵维度为3维

    3、channels

    矩阵通道,矩阵中的每一个矩阵元素拥有的值的个数,比如说 3 * 4 矩阵中一共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3 通道的,即 channels = 3。常见的是一张彩色图片有红、绿、蓝三个通道。

    4、depth

    深度,即每一个像素的位数,也就是每个通道的位数。在opencv的Mat.depth()中得到的是一个0 – 6的数字,分别代表不同的位数:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 },可见 0和1都代表8位, 2和3都代表16位,4和5代表32位,6代表64位。

    5、elemSize

    矩阵中每个元素的大小,每个元素包含channels个通道。如果Mat中的数据的数据类型是CV_8U那么elemSize = 1;是CV_8UC3那么elemSize = 3,是CV_16UC2那么elemSize = 4。

    6、elemSize1

    矩阵中数据类型的大小,即elemSize/channels,也就是depth对应的位数。

    7、step

    是一个数组,定义了矩阵的布局,参考下图

    若矩阵有n维,则step数组大小为n

    step[n-1] = elemSize(每个矩阵元素的数据大小)

    step[n-2] = size(1维)*elemSize

    step[n-3] = size(2维)*size(1维)*elemSize

    ...

    step[0] = size(n-1维)*size(n-2维)*...size(1维)*elemSize

    8、step1

    step1也是一个数组,为step/elemSize1,若矩阵有n维,则step1[n-1] = channels。

    9、type

    矩阵元素的类型,即创建Mat时传递的类型,例如CV_8UC3、CV_16UC2等。

  • 相关阅读:
    JSP简单练习-数组应用实例
    Android中的动画具体解释系列【4】——Activity之间切换动画
    php学习之道:WSDL具体解释(三)
    破解电信光猫(个人真实经验)
    POj 1879 Tempus et mobilius Time and motion (模拟+群)
    使用mysql-mmm实现MySQL高可用集群
    德克萨斯扑克_百度百科
    姜饼屋_百度百科
    阿根廷探戈----中英文对照
    波尔卡舞_百度百科
  • 原文地址:https://www.cnblogs.com/hxing/p/9711748.html
Copyright © 2011-2022 走看看