一、数字图像存储概述

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

二、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等。

OpenCV中Mat总结相关推荐

  1. OpenCV中Mat的属性

    OpenCV中Mat的属性 最近在做一OpenCV的图像轮廓检验,但当用到霍夫变换时才发现对Mat的属性了解不足.Mat在OpenCV中的地位是及其重要的,因此有必要做一个总结. 大体上来说,Mat是 ...

  2. Opencv中Mat的data数据只定义为uchar*类型,

    opencv中Mat的数据定义为指向uchar 的指针,而构造函数又提供了许多其他类型. 其实数据在内存中是一维存储的,而图像基本结构是二维的,3D图像还会是三维的:同时,彩色图像还有多个channe ...

  3. C++下的OpenCV中Mat类型存储的图像格式

    在调用CV进行图像处理时,经常涉及图像格式转换,经常出现原始图像输入后CV_32F与ushort之间的数据差异导致程序报错,可使用std::cout << "dilated_ty ...

  4. opencv中Mat究竟是什么?

    opencv中Mat究竟是什么?(试着运行一下两个代码) 首先看opencv是怎么显示一张图的 : //#include "stdafx.h"#include <opencv ...

  5. opencv获取mat的指针_数字图像处理之opencv中Mat数据操作

    数字图像处理其实就是处理二维矩阵数据.利用opencv来学习处理算法是一种比较好的方式.学习opencv,主要就是调用其中的图像处理函数来实现各种操作.如果要得到想要的处理结果,还需要对图像处理算法有 ...

  6. opencv java水平投影_使用OpenCv中Mat进行水平投影与垂直投影并实现字符切分

    由于要做图像的处理,所以最近在学习Opencv的相关知识,学习了Opencv中的Mat对象,查阅了网上的资料,了解了相关知识.现在实现了一个使用Mat对象来进行图像的水平投影与垂直投影,并在此基础之上 ...

  7. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  8. OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  9. Opencv中 Mat矩阵中属性【随笔记】

    Opencv Mat矩阵中data.size.depth.elemSize.step等属性的理解 data: uchar类型的指针,指向Mat数据矩阵的首地址.可以理解为标示一个房屋的门牌号: dim ...

最新文章

  1. 独家 | 浅析机器学习中的自由度
  2. 【 MATLAB 】filter 函数介绍(一维数字滤波器)
  3. TZOJ--3560: Ordered Fractions (枚举)
  4. 各种排序算法的讲解与代码实现
  5. 前端学习(3272):js中this的使用箭头函数
  6. java jdk myeclipse_java初体验(JDK+myeclipse)
  7. java实现人字拼,人字拼地板拼法大全
  8. 中电信推大学生3G上网套餐
  9. nginx基于tcp负载均衡
  10. 论文笔记:图像分割——ExFuse DFN
  11. 如何正确使用Pandas库提升项目的运行速度?
  12. matlab实现LSB图像水印的嵌入与提取
  13. #include ““和#include <>区别
  14. 苏州木渎计算机课程培训,苏州木渎H5/web全栈开发培训
  15. windows7旗舰版的好处
  16. linux --- 2.常用命令 , python3, django安装
  17. LeetCode 07: T48. 旋转图像 (中等); T54. 螺旋矩阵(中等); T240. 搜索二维矩阵 II (中等)
  18. 开发工具:2022个人开发工具清单,你都用过吗?
  19. 1000以内完数Java程序
  20. Python-Python编码规范(PEP8)

热门文章

  1. access2003安装包百度云_阿里云服务器安装JDK与配置环境详细步骤
  2. linux ls in*,35 ls Command Examples in Linux (The Complete Guide)
  3. linux 中文文件名不能下载不了,linux 64位系统 mod_encoding解决中文文件名不能下载问题...
  4. 线程id 获取线程名称_016 线程及初步网络编程
  5. html不继承父级背景色,javascript – 如何获取从父元素继承的计算背景颜色样式...
  6. 七桥问题属于计算机科学方法论中的,计算机科学与技术方法论-计算学科中的科学问题ppt...
  7. 地址栏地址 获取_直播源获取工具,支持斗鱼、虎牙、B站、企鹅电竞、YY、抖音、西瓜直播!...
  8. java实现简易聊天窗口先运行服务器还是客户端_一个简易聊天功能的服务器端和客户端源码...
  9. oracle二阶段事物,分布式事务 两阶段提交 (2PC)
  10. java 倒序分页_翻动100万级的数据(自定义的MSSQL分页查询过程)