目标
- 知道 opencv 处理图像数据的格式
- 介绍 mat 基础内容
- 知道 BGR 颜色 显示
- 颜色转换 BGR 到 灰度图像
开始
Opencv 主要是图像处理, 在进行图像处理的过程中有一个必须要解决的问题: 图像的内存存储, 最简单的方式就是使用二维数组来存储了. opencv 在1.0时代使用的是二维数组, 然后使用 IplImage
的指针指向数据起始的地址, 指针很强大, 但是对于新手不是很友好, 容易出现各种奇怪的问题…
opencv 从2.0 时代就开始使用 Mat 格式 来存储图像数据, 相当于从 C 版本的接口 升级到了 C++ 的接口, 到了后面就逐渐开始移除 C 接口了, 开始了 C++ 的接口, 不再需要自己去维护内存, 让它来做, 让我们不再去考虑太过底层的实现, 专注与我们自己的 算法实现上来…
VS2017 下面有一个插件 Image Watch, 可以在调试过程中查看 内存中的 opencv Mat 数据.
我们在VS 的调试过程中, 点击 视图--其他窗口--ImageWatch
会弹出窗口 我们能够看到图像的预览与实际, 点击可以使用滚轮进行放大, 比如
我们将其放大到一定程度就发现图像数据是一个一个的"格子", 也就是我们称为的像素,
对于我们原始的 lena 图像 就是一个 512 p x ∗ 512 p x 512px*512px 512px∗512px尺寸的图像
px 是 图像像素的单位, 可以理解为 512*512
个小格子
图像数据不是矢量数据, 不能够无限放大, 能够满足我们的日常实现即可
Mat 图像数据格式
一般来说, Mat 是一种对象, 有着相应的成员, 或者可以理解为属性, 可以理解为, 我们使用二维数组存储图像数据, 可以通过一些方法直接获取到这些二维数组的参数信息以及其他信息, 便于后续实现
比如 Mat类 常用的有以下几种1
- type: CV_8UC3 图像数据类型和通道数目
- depth: 图像的精度, 用于表示每一个像素每一个通道的精度值 8U 表示 无符号 2 8 2^8 28 精度, 最高256个灰度等级
- channels: 通道数目 表示图像每个像素的数目
- cols: 图像数据宽度 横向
- rows: 图像数据高度 纵向
- size(): 返回(cols, rows) 数据
- data: 指向二维数组的首地址, 指向图像数据最开始的地方
- step: = stride 表示图像数据每一行的字节大小
- …
不再意义列举, 常用的就这么多
成像系统
在数字成像系统概述 这篇文章中, 详细介绍了数字的成像系统2, 我们以这幅图为例
成像系统 满足高斯公式 1 u + 1 v = 1 f \frac{1}{u} + \frac{1}{v} = \frac{1}{f} u1+v1=f1,
传感器成像
我们只看成像传感器部分, 传感器实际上是分为了每一个很小的格子, 每一个格子都会受到光照, 根据光照强度不同, 产生不同的电压信号, 通过放大电路被我们采集便能够得到整幅图像的电压, 转换以下辨识我们得到的图像数据了,