02 📷HelloWord和IDE工具介绍
这节课先认识 HelloWorld 程序。它相当于一个基础框架,后续代码都可以在它的基础上编写。
1. 程序框架
import csi # 导入模块
import time
csi0 = csi.CSI() # 创建实例
csi0.reset() # 初始化
csi0.pixformat(csi.RGB565) # 设置像素格式
csi0.framesize(csi.QVGA) # 设置分辨率
csi0.snapshot(time=2000) # 等待工作两秒
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot() # <--- 重点!
print(clock.fps())
程序可以分成三部分:最上面导入功能模块,中间进行初始化,下面是一个 while 大循环。
这和之前的 STM32 开发很像:导入模块类似于 include 头文件,while True 类似于 while(1)。循环前的初始化代码只执行一次,循环里的代码则不断重复执行。
2. 导入模块
import csi 导入 csi 模块。上一节把 OpenMV 分成了摄像头模组和底板两部分,csi 模块封装了图像传感器的配置与采图功能,我们可以通过里面的函数配置 OV5640。
import time 导入计时模块,后面会用它计算帧率。
3. 初始化
创建实例与复位
csi0 = csi.CSI() 创建一个摄像头接口对象,名字叫作 csi0。后面的 csi0.reset() 对图像传感器进行复位和初始化。
像素格式与分辨率
csi0.pixformat(csi.RGB565) 设置像素格式。图像由一个个像素点构成,OpenMV 常用的格式是彩色 RGB565 和灰度 GRAYSCALE,基础课会详细介绍两者的区别。
csi0.framesize(csi.QVGA) 设置每帧图像的分辨率。QVGA 表示宽 320 个像素、高 240 个像素。
OV5640 支持多种分辨率。分辨率越低,像素点越少,处理所需的算力通常越小,但包含的图像信息也越少,需要根据具体场景选择。
等待参数稳定
csi0.snapshot(time=2000) 会阻塞约 2000 毫秒,在这段时间内持续采图并跳过这些帧,结束后不返回图像对象。
前面配置的参数需要运行一段时间才能稳定下来,因此先让摄像头工作两秒,再开始后面的操作。
clock = time.clock() 创建名为 clock 的计时对象,用来统计循环帧率。
4. 循环采图与帧率
每次循环先调用 clock.tick(),再通过 img = csi0.snapshot() 获取一帧图像。
采图时,图像传感器输出的数据通过 DMA 搬运到 SDRAM 图像缓冲区。snapshot() 返回一个 image.Image 对象,用变量 img 保存;后面的图像处理就是围绕这个对象进行的。
clock.tick() 记录循环计时,clock.fps() 根据计时统计帧率。最后通过 print() 把结果经 USB 输出到 IDE 下方的串口终端。
5. IDE 预览与直方图
IDE 右侧的图像预览通过单独的预览缓冲区传输。OpenMV 将用于预览的图像复制到该缓冲区,再通过 USB 传给 IDE;它与程序中 img 对应的图像缓冲区需要区分开。
右下角的直方图可以查看图像的颜色分布,常用的是 LAB 色彩空间。
图中的 L 表示亮度,a 对应红绿方向,b 对应蓝黄方向。
下一节先学习常用的 Python 写法,基础课再继续介绍成像与采图。