- 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
💡大纲
⭕一个处理图像的程序需要通过某种方式获取图像,同时以某种类型存放在某个容器中,并通过某种形式展示给用户
👉这里将介绍图像存储容器的创建与使用,将详细讲解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位无符号整数 | <