跳到主要内容

摄像头

前言

从前面的基础实验我们熟悉了K210基于MicroPython的编程方法,但那可以说是只发挥了K210冰山一角的性能应用,摄像头是整个机器视觉应用的基础。今天我们就通过示例代码来看看CanMV K210是如何使用摄像头的。

实验目的

学习官方自带的hello wrold例程,理解K210摄像头基本编程和配置原理。

实验讲解

在CanMV IDE中打开 零一科技(01Studio)MicroPython开发套件配套资料\02-示例程序\5.CanMV K210\2.机器视觉\1.摄像头应用 目录下的camera.py文件。

camera1

打开后发现编辑框出现了相关代码,我们可以先直接跑一下代码看看实验现象,连接CanMV K210,点击运行,可以发右图上方出现了摄像头实时采集的图像。(由于K210通过串口方式跟IDE交互,官方降低IDE缓冲区显示图像质量,推荐通过LCD显示会更清晰。)

CanMV机器视觉库代码大部分都是参考OpenMV移植过来,已经将所有的摄像头功能封装到sersor模块中,用户可以通过调用函数轻松使用。这也是使用MicroPython编程的魅力所在。

sensor对象

构造函数

import sensor

摄像头对象,通过import直接调用。

使用方法

sensor.reset()

初始化摄像头。


sensor.set_hmirror(enable)

设置摄像头水平镜像。

  • enable: 格式。
    • 1 : 开启水平镜像;
    • 0 : 关闭水平镜像。

sensor.set_vflip(enable)

设置摄像头垂直翻转。

  • enable: 格式。
    • 1 : 开启垂直翻转;
    • 0 : 关闭垂直翻转。

提示:通过设置摄像头的水平镜像和垂直翻转组合可以实现任意画面变换。


sensor.set_pixformat(pixformat)

设置像素格式。

  • pixformat: 格式。
    • sensor.RGB565 : 每像素为16位(2字节),5位用于红色,6位用于绿色,5位用于蓝色,处理速度比灰度图像要慢。
    • sensor.GRAYSCAL : 灰度图像,每像素8位(1字节),处理速度快。

sensor.set_framesize(framesize)

设置每帧大小(即图像尺寸)。

  • framesize: 帧尺寸。
    • sensor.QQVGA : 160x120;
    • sensor.QVGA : 320x240(一般建议使用这个,跟LCD尺寸一样);
    • sensor.VGA : 640x480;

sensor.skip_frames([n, time])

摄像头配置后跳过n帧或者等待时间time让其变稳定。n:跳过帧数;time:等待时间,单位ms。(如果n和time均没指定,则默认跳过300毫秒的帧。)


sensor.snapshot()

使用相机拍摄一张照片,并返回 image 对象。

更多用法请阅读官方文档:
https://developer.canaan-creative.com/canmv/main/canmv/library/canmv/sensor.html

clock对象

我们再来看看本例程用于计算FPS(每秒帧数)的clock模块。

构造函数

clock=time.clock()

构建一个时钟对象。

使用方法

clock.tick()

开始追踪运行时间。


clock.fps()

停止追踪运行时间,并返回当前FPS(每秒帧数)。在调用该函数前始终首先调用 clock.tick() 。

更多用法请阅读官方文档:
https://developer.canaan-creative.com/canmv/main/canmv/library/micropython/utime.html#clock


我们来看看代码的编写流程图:

参考代码

# Hello World 例程

# 欢迎使用 CanMV IDE!
#
# 1. 将开发板连接到电脑;
# 2. 在工具->选择开发板下选择合适的开发板;
# 3. 点击连接并选择串口;
# 4. 连接成功后点击绿色按钮开始运行!
#
#翻译和注释:01Studio

import sensor, image, time, lcd

lcd.init(freq=15000000) #初始化LCD
sensor.reset() #复位和初始化摄像头,执行sensor.run(0)停止。
sensor.set_vflip(1) #将摄像头设置成后置方式(所见即所得)
sensor.set_hmirror(1) #GC0328摄像头(如果使用ov2640摄像头,注释此行。)

sensor.set_pixformat(sensor.RGB565) # 设置像素格式为彩色 RGB565 (或灰色)
sensor.set_framesize(sensor.QVGA) # 设置帧大小为 QVGA (320x240)
sensor.skip_frames(time = 2000) # 等待设置生效.
clock = time.clock() # 创建一个时钟来追踪 FPS(每秒拍摄帧数)

while(True):

clock.tick() # 更新 FPS 时钟.
img = sensor.snapshot() # 拍摄一个图片并保存.
#img.draw_string(0, 0, 'FPS: '+str(clock.fps()), color = (255, 255,255), scale = 3,mono_space = False)
lcd.display(img) # 在LCD上显示
print(clock.fps()) # 注意: 当 K210 连接到 IDE 时候,运行速度减半,因此当断开 IDE 时 FPS 会提升。

实验结果

点击运行代码,可以看到在右边显示摄像头实时拍摄情况,下方则显示RGB颜色直方图。

camera2

点击左下角串口终端,可以看到软件弹出串口打印串口,实时显示当前的FPS(每秒帧数)值约为15帧。

camera3

同样可以看到LCD实时显示摄像头采集的图像.

camera4

通过禁用CanMV IDE缓冲区图像显示可以提高开发板的FPS(每秒帧率)。

camera5

camera6

通过本实验,我们了解了摄像头sensor模块以及时间time模块的原理和应用,可以看到CanMV将摄像头功能封装成sensor模块,用户不必关注底层代码编可以轻松使用。