图像存储容器

 

💡大纲

⭕一个处理图像的程序需要通过某种方式获取图像,同时以某种类型存放在某个容器中,并通过某种形式展示给用户

👉这里将介绍图像存储容器的创建与使用,将详细讲解Mat的操作方式以及其支持的运算

👉目标:在程序中灵活使用Mat类型变量

一、Mat类介绍

💡在计算机中数字图像以矩阵的形式储存,矩阵中每一个元素都代表一定的图像信息。所以想要对图像进行处理,从矩阵数据中提取更多的信息,就需要掌握如何操作矩阵信息

⚠️在早期的Opencv中,使用IplImage的C语言结构体来储存图像信息,但是该结构体在程序结束时需要手动释放,不安全

⚠️引入C++接口后,提供Mat类来存储图像信息,利用自动内存管理技术很好的解决了旧版本的问题,可以自动分配内存,不存在内存泄漏

  • Mat类是一种图像数据结构。用来保存矩阵类型的数据信息,包括向量、矩阵、灰度或彩色图像等数据

  • Mat类分为矩阵头和指向存储数据的矩阵指针两部分

(一)矩阵头与矩阵指针

👉矩阵头中包含矩阵的尺寸存储方法地址引用次数

👉矩阵头的大小是一个常数,不会随着矩阵尺寸大小而改变

👉在绝大多数情况下矩阵头大小远小于矩阵中数据量的大小,因此图像复制和传递过程中主要的开销是存放矩阵数据。为了解决这个问题,在OpenCV中复制和传递图像时,只是复制了矩阵头和指向存储数据的指针,因此在创建Mat类时可以先创建矩阵头后赋值数据

 Mat a; // 创建一个名为a的矩阵头
 a = imread(“test.jpg”); // 向a中赋值图像数据,并将a中的矩阵指针指向该图像的像素数据
 Mat b=a; // 复制矩阵头,并命名为b

⚠️当删除a变量时,b变量并不会指向一个空数据,只有当两个变量都删除后,才会释放矩阵数据。因为矩阵头中引用次数标记了引用某个矩阵数据的次数,只有当矩阵数据引用次数为0的时候才会释放矩阵数据

(二)Mat类可以存放的数据类型

👉Mat类可以存储的数据类型包含double、float、uchar、unsigned char以及自定义的模板等

👉下列代码:声明一个存放指定double类型的Mat类变量

 Mat A = Mat_<double>(3,3); // 创建一个3*3的矩阵用于存放double类型数据

⚠️ 需要注意的是,一张图片的像素值的最大值决定图片质量。如果用8位无符号整数去存储16位图像,会造成严重的图像颜色失真或造成数据错误。为了避免在不同环境下因变量位数长度不同而造成程序执行问题,OpenCV根据数值变量存储位数长度定义了数据类型

  • OpenCV中的数据类型与取值范围

<
数据类型 具体类型 取值范围
CV_8U 8位无符号整数 0~255
CV_8S 8位符号整数 -128~127
CV_16U 16位无符号整数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值