c++版本opencv(04.认识Mat对象-05.Mat对象创建与使用-06.遍历与访问每个像素-)

c++版本opencv(04.认识Mat对象-05.Mat对象创建与使用-06.遍历与访问每个像素-)


来自网易云课堂贾志刚老师

一、04.认识Mat对象-

在这里插入图片描述
在这里插入图片描述
对计算机来说,他的脸部的这一小个块,他就有这么多的一串数字来表示。所以对计算机来说,整个图像其实就是一个二维的矩阵,就是里面都是很多数据,这个Mat呢,就是用来存储这些数据的一个对象,那么这些数据就是图像。所以MAT是用来存储数据的,哎,存储这些图像啊,信息的一个内存的对象。那这个对象呢,最主要的是一些矩阵,就是matrix。

在open CV当中用来。把读取I’MV的读取到的图像文件的信息来存起来的那一个数据结构,
在这里插入图片描述
那有了MAT之后呢,我们就可以看看我们的MAT。既然已经存在了,我们可以读取它,那它有哪些信息呢?我们可以使用,其实MAT的主要信息呢,对于一张图像来说,哎,我们很直观的就要知道它的宽,高,然后还知道它是不是彩色图像,那是不是彩色图像,我们通过它的通道数这一个来判断,如果它是单通道的,一般都是灰度图像,如果它是多个通道数的,那么一般都是彩色图像。那么我们可以通过这些来获取,所以在这一个MAT,它的内存里面是怎么样的一个存储的呢?它的这些头部信息就包含了图像的宽,高。然后还有一些类型数据类型啊等等其他一些信息,然后像这些所有的数据信息,每个像素值的部分,就像我们这边的这些像素值的部分,就是它的数据部分。所以MAT在内存当中的结构呢,大致可以分为两块,一块是它的头部存储了一些原数据的信息,那这些原数据包括它的宽高、位数、深度等等,那数据部分呢,就是它的像素数据,那么我们一般比较感兴趣就是寻找它的像素数据,那么我们想改变图像上面的信息,我们就要改变像素数据部分才可以。当我们读了一个图像之后呢,我们把它复制给另外一个mat对象的时候,会发生一个什么事情呢?那就变成这两个mat对象都指向它同一个data block,它的数据部分并没有改变,它只是进行了一个地址的一个指向。那当我们使用拷贝或者克隆这个API的时候呢,它就会完完全创建一个新的Mat对象,跟原来的那个Mat对象就是是两个内存的mat对象存在了。
在这里插入图片描述
在这里插入图片描述
那首先呢,我们会获取图像的宽度,那这个src,它的宽度就是我们的src.cols,那么它的高度就是src.rows,然后就是我们有多少个几个纬度,就是src.channels(),其实就是通道数目。那有了这些值之后呢,我们就可以printf,就是把它打印出来的意思。%d它是通配符,通配符就是说你要输入一个变量,或者是来通配它的。通配符后面跟d,就是说这个数据的类型是什么,这是一个int型的。我们还可以给他一个什么换横的符号\n。他就会把这个三给打印出来,然后我们就知道它到底是一个几通道的什么样的图像。它就是宽度是1024,高度是1024,然后是就是通道是有三个通道的图。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二,05.Mat对象创建与使用-

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
mat对象第一个表示高度,第二个表示宽度,第三个表示通道数!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述
天生纯黑色图像!
在这里插入图片描述
t4本质还是一张图,t5就是单独的一张图存在了!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结赋值时候,赋值后的图改变会影响原图,但是拷贝后的图片改变不会影响原图!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第二种拷贝方式!
在这里插入图片描述
在这里插入图片描述

三,06.遍历与访问每个像素-

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
其实是分为两种方式,一种我们可以把所有的像素数据看成一个数组,按照数组呢,我们去根据行号跟列号去在这个二维数组里面去获得每个像素点的,一个VC3B的这种结构啊,根据它的通道数目的不一样,它可能获取出来每个像素点是一个字节或者是三个字节,那这种方式呢,我们首先要判断一下。如果这个图的我们该怎么做。

那首先呢,我们来看一下通道数等于三的,通道数等于三的时候呢,我们有一个API,这一个src里面叫做at。这个是它的型别VC3B,这个VC3B是什么,就是当我们是字节类型的数据的时候是三通道的话,我们通过VC3B获得,如果三通道的它不是字节类型的,它是in型的,那我们就通过VC3I来获得,另外一个还有VC3F,它顾名思义是浮点数类型的数据,我们就通过这种方式获得,那这里面来给他两个index,一个是行的index,一个是列的index,这样的话我们就确定了数组。像素点那个唯一的位置,那获取了这个像素呢,我们就可以。这个就叫做VC3b这个PIXEL就是我们那个像素点的像素了。

那我们获取了它之后,如果说我们想要获取三通道的值,我们都知道我们可以通过pixel点通道数来获取这个三通道的一个呃像素呃值,它的顺序是BGR3个通道的顺序,所以我们就可以通过blue我们pixel。哎,这个里面就是它的blue。就是我们的pixel。就是它那在下面我们不用写了,我们来拷贝一下,拷贝比较快一点,后面我们会经常采用这种方式呢,那这种方式的话是有一个缺陷,就是千万不要忘记改一些东西,否则的话它会出错,那这是三通的,我们这么处理。

单通道的其实是什么呢?通道的就是灰度类型的图像,它就是一个uchar类型,所以我们这边的话就是一个u。或者int PV pixel value还就可以了,因为它是单通道的,它有没有通道顺序,这一处没有,所以我们去把它这个通道给改变了,那改变了之后呢。其实我们还可以对它赋值

拷贝一下这种方式呢,主要是利于我复制,实际上呢,我们在这边呢,我们还继续去频繁的访问这个像素是不对的,我们应该就是这一次访问一次,然后这边把它构造成一个VC3B,然后再去访问一次,那我这样做的目标呢,就是让大家看的看的更清楚一点。

那这一种像素的遍历方式呢,我们就称为基于数组的便利方式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一个是基于我们的指针进行遍历,另外一种方式是基于数组进行遍历,上面的呢,这个就是基于数组进行遍历,那基于数组进行遍历呢,我们要知道每一个像素点。彩色图像的每一个像素点,它的数据类型是什么?VC3B,诶,这是最粗浅的一个认识,那么后面呢,当你的图像的数据类型变化的时候,那你的每一个像素点的数据类型也会跟着变化。对于灰度图像来说,它就是Uchar

相对于我们进行指针方式的话,就会省去一些烦恼啊,无论它的图像类型是什么,它的数据类型就是什么,然后我们就可以对用指针对它进行遍历,然后获取一个一个值,哎,这个的话相对来说是一个很高效的方法,我们每次哎通过指针内存地址访问呢,是一种高效存储IO读写的一个方式,那所以在实际做项目中呢,推荐大家用这种,但是呢,我在所有的课程当中呢,我会尽量用这一种啊,原因是什么?我们在教学的过程当中,尽量要让大家看明白,就是每一个像素是如何运动,或者如何工作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值