OpenCV Mat的总结

Posted xmr183729

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenCV Mat的总结相关的知识,希望对你有一定的参考价值。

一.数字图像的储存

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

2.Mat的储存

1.OPENCV1基于C接口定义的图像存储格式Ipllmage*,直接暴露内存,如果忘记释放内存,就会造成

内存泄漏。

二.从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.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等。

 

 

 

 
 
 

以上是关于OpenCV Mat的总结的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV阶段总结扩充。

OpenCV Mat数据类型及位数总结(转载)

关于OpenCV中常见函数用法总结

opencv-Mat数据类型及位数总结

OpenCV中Mat的属性

Opencv中数据结构Mat的相关属性