一、数字图像存储概述

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

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

mat 释放_OpenCV中Mat总结相关推荐

  1. matlab 存mat文件,matlab中mat文件简单存/取

    >>abc=[,,,,,]; >>save data save file_name:命令可以将当前项目中变量的值保存到file_name中去,这里的data文件就是mat文件. ...

  2. opencv mat 修改_OpenCV中initUndistortRectifyMap函数存在bug原因探究

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 3D视觉工坊的第52篇文章 最近在运行如下一段代码时,生成的mapx和mapy有点异常. 代码片段如下 ...

  3. mat 释放_Opencv - 释放内存将cv :: Mat引用计数器更改为零

    如果你试图释放这样的内存,你将不会成功.查看源代码(请参阅下文),如果recount为NULL,则不执行解除分配.实际上,当用指向用户分配数据的指针构造Mat时,refcount被设置为NULL. i ...

  4. matlab如何新建mat文件_matlab中mat文件的生成和读取

    1.mat文件的生成 (1)直接在Matlab中创建并保存矩阵数据 打开Matlab软件,点击左上角文件(File),然后点击新建(new),选择变量(Variable),就新建了一个mat文件. 点 ...

  5. mat 释放_Square Ma?mat住宅区:释放公共空间,连接社区居民

    Maïmat广场位于法国图卢兹以南26公里的Muret区,其设计以1960年代盛行的"Grands Ensembles"(大规模社会住宅)模式为基础.Maïmat广场的更新项目围绕 ...

  6. OpenCV中Mat数据结构使用举例

    #include "stdafx.h" #include <string> #include <iostream> #include <opencv2 ...

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

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

  8. C++ Opencv中Mat的操作

    Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针.OpenCV使用引用计数机制. ...

  9. mat 释放_c++ - OpenCV无法释放Mat *内存 - 堆栈内存溢出

    绝对可以使用cv :: Mat指针,但是(与所有指针一样)您必须格外小心地删除创建的对象,以再次释放分配的内存. 在您的示例代码中,尚不清楚是否将在任何地方删除其指针在函数中返回的对象. 如果不是这种 ...

最新文章

  1. Nat. Mach. Intell. | 利用条件循环神经网络生成特定性质分子
  2. webpack源码分析之三:loader
  3. loadrunner-4-3报告摘要
  4. 标签的属性和样式属性有什么区别
  5. 计算机网络复习_物理层
  6. netflix_Netflix的Polynote
  7. Git missing Change-Id in commit message footer解决方法
  8. 拼接的html点击事情不触发,关于在vue中拼接html的问题,点击事件无法执行
  9. 数组 -- removeElement -- 图解
  10. 从零基础入门Tensorflow2.0 ----七、36. 文本生成之---2. 构建模型
  11. 年底将至 怎么向国外客户开口催单 附话术模板
  12. 尚硅谷Java8 新特性学习笔记
  13. BIG5, GB(GB2312, GBK, ...), Unicode编码, UTF8, WideChar, MultiByte, Char说明与区别
  14. CSS字体样式设置、CSS文本样式设置
  15. 3D劲舞游戏 Dance Mixer 简体中文汉化版+常见问题(更新1.1补丁 汉化)
  16. R语言dplyr包bind_cols函数把两个dataframe数据的列横向合并起来、最终列数为原来两个dataframe列数的加和(Combine Data Frames)
  17. 照相机模型与增强现实
  18. 前端拓展:如何开发一个 Chrome 插件?
  19. excel 删除多余回车
  20. 打光在绘画中的重要性有多重要?

热门文章

  1. 使用 History API 构建 JavaScript 路由器
  2. Centos中Samba共享目录无法访问
  3. SUPPORTED TYPESCRIPT VERSIONS: >=3.3.1 <4.5.0
  4. 最大似然位同步算法总结
  5. Linux命令行与shell脚本编程之笔记(3)
  6. 泡沫破裂的经济学原理
  7. go-zero创建报required as: github.com/tal-tech/go-zero
  8. 关于js关闭窗口的事件和用法
  9. 阿里云服务器搭建使用教程(四)域名使用及备案
  10. 事件分发机制Android,宅家36天咸鱼翻身入职腾讯,复习指南