前言
打开 MaixPy IDE ,会出现 helloworld_1.py ,有如下代码:
代码语言:javascript复制# Hello World Example
#
# Welcome to the MaixPy IDE!
# 1. Conenct board to computer
# 2. Select board at the top of MaixPy IDE: `tools->Select Board`
# 3. Click the connect buttion below to connect board
# 4. Click on the green run arrow button below to run the script!
import sensor, image, time, lcd
lcd.init(freq=15000000)
sensor.reset() # Reset and initialize the sensor. It will
# run automatically, call sensor.run(0) to stop
sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
sensor.set_framesize(sensor.QVGA) # Set frame size to QVGA (320x240)
sensor.skip_frames(time = 2000) # Wait for settings take effect.
clock = time.clock() # Create a clock object to track the FPS.
while(True):
clock.tick() # Update the FPS clock.
img = sensor.snapshot() # Take a picture and return the image.
lcd.display(img) # Display on LCD
print(clock.fps()) # Note: MaixPy's Cam runs about half as fast when connected
# to the IDE. The FPS should increase once disconnected.
运行后在lcd上面显示的图像是倒着的,那么图像为什么是倒着的呢?
一、什么是摄像头?
我们都见过各种摄像头,比如
那么什么是摄像头,说到底,就是一个将光学信号转变成电信号的一个装置。在计算机视觉中,最简单的相机模型是小孔成像模型:
小孔模型是一种理想相机模型,没有考虑实际相机中存在的场曲、畸变等问题。但是在实际使用时,这些问题可以通过在标定的过程中引入畸变参数解决,所以小孔模型仍然是目前最广泛使用的相机模型。
这就是【前言】中图像为什么倒着的答案,小孔成像出来的是倒着的像。
图像透过镜头,照在一个感光芯片上,感光芯片可以把光照的波长和强度等信息转成计算机(数字电路)可以识别的数字信号。也就是在感光芯片上面的图像是倒着的,那么我们正常使用照相机照相时的图像是正着的,这里面存在着相关图像的处理。
二、如何实现图像旋转?
只需加一行代码:
代码语言:javascript复制img.rotation_corr(x_rotation=180,y_rotation=180)
各个参数含义:
img.rotation_corr()
这个函数可以实现图像旋转,结果加上之后出现如下错误。
串行终端提示:
代码语言:javascript复制Traceback (most recent call last):
File "<stdin>", line 23, in <module>
AttributeError: 'Image' object has no attribute 'rotation_corr'
MicroPython v0.5.0-123-g859098d on 2020-08-18; Sipeed_M1 with kendryte-k210
Type "help()" for more information.
新手上路总是会遇到各种问题,于是就开始想办法解决。
于是,试了一下官方文档中的一个 demo:
代码语言:javascript复制import sensor
import image
import lcd
import time
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
green_threshold = (0, 80, -70, -10, -0, 30)
while True:
img=sensor.snapshot()
blobs = img.find_blobs([green_threshold])
if blobs:
for b in blobs:
tmp=img.draw_rectangle(b[0:4])
tmp=img.draw_cross(b[5], b[6])
c=img.get_pixel(b[5], b[6])
lcd.display(img)
结果还是出现相同的问题,我想难不成官方文档里面也会有错误?于是开始怀疑是固件存在问题。我把这个 maixpy_v0.5.0_125_gd4bdb25.bin
固件下载到 Maix Bit
,然后运行代码就没问题了。
三、问题之源
看了我之前下载的固件:maixpy_v0.5.0_123_g859098d_minimum.bin
然而出厂默认的是: maixpy_v0.5.0_125_gd4bdb25.bin
所以,官方文档教程中的更新 MaixPy 固件就可以略过了,以免下错了固件。
MaixPy 文档中固件命名说明:
文件名 | 说明 | 备注 |
---|---|---|
maixpy_vx.y.z_x_xxx*.bin | 默认版本的 MaixPy 固件,包含了大多数功能, 支持连接 MaixPy IDE, | 出厂默认固件版本 |
maixpy_vx.y.z_x_xxx*_m5stickv.bin | 针对 M5Stickv 定制的固件, 支持连接 MaixPy IDE | — |
maixpy_vx.y.z_x_xxx*_with_lvgl.bin | MaixPy 固件, 支持连接 MaixPy IDE, 带 LVGL 版本.(LVGL是嵌入式 GUI 框架, 写界面的时候需要用到) | — |
maixpy_vx.y.z_x_xxx*_minimum.bin | MaixPy 固件最小集合,不支持 MaixPy IDE, 不包含OpenMV的相关算法和各种外设模块 | — |
maixpy_vx.y.z_x_xxx*_minimum_with_ide_support.bin | MaixPy 固件最小集合, 支持连接 MaixPy IDE, 不包含OpenMV的相关算法和各种外设模块 | 运行各种模型,建议使用这个 |
elf_maixpy_vx.y.z_x_xxx*.7z | elf 文件,普通用户不用关心,用于死机调试 | — |
face_model_at_0x300000.kfpkg | 人脸模型,放置在地址位 0x300000, 可以和.bin分开多次下载,不冲突 | — |
下载表格中的第一个固件就可以了
之前还下载了一个固件:maixpy_v0.5.0_123_g859098d_minimum_with_ide_support.bin
发现这个下进去直接就连接不上了。
所以,如果你在使用某个功能时, 发现提示错误,找不到库,可能是你使用了不包含这个功能的固件,比如 minimum
固件不包含 IDE 和 image.find_blobs
功能, 如果烧录了这个固件, 再去连接 IDE 就会连接失败, 使用 iamge.find_blobs
这个函数也会提示找不到函数定义
四、方法改进
使用
代码语言:javascript复制img.rotation_corr(x_rotation=180,y_rotation=180)
发现帧率变低
▲ 帧率低
改用
代码语言:javascript复制sensor.set_vflip(1) # flip the sensor
▲ 帧率正常
总结
- 摄像头感光芯片上的像是倒着的,要得到正的像要做相关处理
img.rotation_corr()
图像旋转;sensor.set_vflip(1)
摄像头翻转- 图像翻转处理后,帧率变低了,差不多是原来的一半
参考文献
[1]:MaixPy 文档 [2]:https://cn.bbs.sipeed.com/d/448-k210