【雕爷学编程】MicroPython手册之 OpenMV Cam 实时拍摄

在这里插入图片描述
MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器。与常规Python相比,MicroPython解释器体积小(仅100KB左右),通过编译成二进制Executable文件运行,执行效率较高。它使用了轻量级的垃圾回收机制并移除了大部分Python标准库,以适应资源限制的微控制器。

MicroPython主要特点包括:
1、语法和功能与标准Python兼容,易学易用。支持Python大多数核心语法。
2、对硬件直接访问和控制,像Arduino一样控制GPIO、I2C、SPI等。
3、强大的模块系统,提供文件系统、网络、图形界面等功能。
4、支持交叉编译生成高效的原生代码,速度比解释器快10-100倍。
5、代码量少,内存占用小,适合运行在MCU和内存小的开发板上。
6、开源许可,免费使用。Shell交互环境为开发测试提供便利。
7、内置I/O驱动支持大量微控制器平台,如ESP8266、ESP32、STM32、micro:bit、掌控板和PyBoard等。有活跃的社区。

MicroPython的应用场景包括:
1、为嵌入式产品快速构建原型和用户交互。
2、制作一些小型的可 programmable 硬件项目。
3、作为教育工具,帮助初学者学习Python和物联网编程。
4、构建智能设备固件,实现高级控制和云连接。
5、各种微控制器应用如物联网、嵌入式智能、机器人等。

使用MicroPython需要注意:
1、内存和Flash空间有限。
2、解释执行效率不如C语言。
3、部分库函数与标准版有差异。
4、针对平台优化语法,订正与标准Python的差异。
5、合理使用内存资源,避免频繁分配大内存块。
6、利用原生代码提升速度关键部位的性能。
7、适当使用抽象来封装底层硬件操作。

总体来说,MicroPython让Python进入了微控制器领域,是一项重要的创新,既降低了编程门槛,又提供了良好的硬件控制能力。非常适合各类物联网和智能硬件的开发。
在这里插入图片描述
OpenMV Cam 是一款小型、低功耗的微控制器板,可以让你在现实世界中使用机器视觉轻松实现应用程序。你可以使用高级 Python 脚本(由 MicroPython 操作系统提供)而不是 C/C++ 对 OpenMV Cam 进行编程。OpenMV Cam 的技术参数包括以下几个方面:

1、处理器:OpenMV Cam H7 Plus 使用 STM32H743II ARM Cortex M7 处理器,运行频率为 480 MHz,具有 32MB SDRAM + 1MB SRAM 和 32 MB 外部闪存 + 2 MB 内部闪存。OpenMV Cam M4 V2 使用 STM32F427VG ARM Cortex M4 处理器,运行频率为 180 MHz,具有 256KB RAM 和 1 MB 闪存。
2、图像传感器:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都使用 OV7725 图像传感器,能够在分辨率高于 320x240 时以 75 FPS 拍摄 320x240 8 位灰度图像或 320x240 16 位 RGB565 图像,在分辨率低于 320x240 时能够以 150 FPS 拍摄。
3、I/O 接口:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都具有以下 I/O 接口:
(1)全速 USB (12Mbs) 接口,连接到电脑。当插入 OpenMV Cam 后,你的电脑会出现一个虚拟 COM 端口和一个“U盘”。
(2)μSD 卡槽能够进行 100Mbs 读/写,使你的 OpenMV Cam 能够录制视频,并把机器视觉的素材从 μSD 卡提取出来。
(3)SPI 总线的运行速度高达 54Mbs,使你可以简单地把图像流数据传给 LCD 扩展板、WiFi 扩展板,或者其他控制器。
(4)I2C 总线(高达 1Mb/s)、CAN 总线(高达 1Mb/s)和异步串行总线(TX/RX,高达 7.5Mb/s),用于与其他控制器或传感器连接。
(5)一个 12 位 ADC 和一个 12 位 DAC。
(6)所有 I/O 引脚上都有中断和 PWM(板上有 9 或者10个 I/O 引脚)。
4、LED:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了一个 RGB LED(三色)和两个高亮的 850nm IR LED(红外)。
5、镜头:OpenMV Cam H7 Plus 和 OpenMV Cam M4 V2 都配备了标准 M12 镜头接口和一个默认的 2.8 毫米镜头。如果你想在 OpenMV Cam 上使用更专业的镜头,你可以轻松购买并自行安装。

在这里插入图片描述
MicroPython的OpenMV Cam支持实时拍摄功能,可以通过编写MicroPython代码来实现实时捕捉图像和视频。

主要特点:

快速实时性:OpenMV Cam具有较高的实时性能,可以实时捕捉图像和视频。它配备了高性能的图像处理器和传感器,能够以稳定的帧率捕捉和处理图像,实现实时拍摄功能。

多种分辨率和格式:OpenMV Cam支持多种分辨率和图像格式的实时拍摄。您可以根据应用需求选择合适的分辨率和格式,从而满足不同场景下的拍摄要求。

灵活的图像处理:OpenMV Cam内置了丰富的图像处理函数和算法,包括滤波、边缘检测、颜色识别等功能。这使得实时拍摄不仅限于简单的图像捕捉,还可以进行实时图像处理和分析。

简化开发:MicroPython编程语言简单易学,适合初学者和教育领域使用。OpenMV Cam提供了友好的编程接口和示例代码,使得实时拍摄功能的开发和调试变得更加简单和便捷。

应用场景:

视觉监测和跟踪:OpenMV Cam的实时拍摄功能可以应用于视觉监测和跟踪系统。例如,可以将其用于无人机的视觉导航,实时捕捉周围环境的图像并进行实时分析和处理,从而实现精确定位和避障。

教学和科研:实时拍摄功能可以用于教学和科研项目。学生和研究人员可以利用OpenMV Cam进行实时图像采集和处理的实验和研究,探索计算机视觉、图像处理等相关领域的知识。

视频监控:OpenMV Cam可以用于实时视频监控系统,例如室内安防系统或工业生产线的监测。通过实时拍摄和分析,可以及时发现异常情况并采取相应的措施。

需要注意的事项:

存储空间:实时拍摄功能可能需要大量的存储空间来存储捕捉的图像或视频。在使用OpenMV Cam进行实时拍摄时,需要确保有足够的存储空间来存储数据,或者使用外部存储设备进行扩展。

电源供应:实时拍摄功能对电源供应的要求较高,特别是在长时间拍摄或连续拍摄的情况下。在使用OpenMV Cam进行实时拍摄时,需要确保有稳定的电源供应,以避免电量不足或电源中断导致的问题。

处理性能:实时拍摄和处理图像可能需要一定的计算资源。在进行实时拍摄时,需要评估OpenMV Cam的处理性能,确保其能够满足所需的实时处理要求。

总结来说,MicroPython的OpenMV Cam的实时拍摄功能具有快速实时性、灵活的图像处理以及简化开发等特点。它适用于视觉监测和跟踪、教学和科研以及视频监控等场景。在使用时需要注意存储空间、电源供应和处理性能等因素,并根据具体需求和场景进行参数配置和优化。

案例一:简单的实时拍摄程序

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    print(img) # 打印照片

要点解读:
初始化摄像头,设置像素格式和帧大小。在一个无限循环中,使用snapshot()函数实时拍摄照片,并打印照片。

案例二:实时拍摄并在LCD屏幕上显示图像

import sensor, image, time, lcd  
  
lcd.init() # 初始化LCD屏幕  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    lcd.display(img) # 在LCD屏幕上显示图像

要点解读:
首先初始化LCD屏幕和摄像头,设置像素格式和帧大小。在一个无限循环中,使用snapshot()函数实时拍摄照片,并使用display()函数在LCD屏幕上显示图像。

案例三:实时拍摄并检测人脸

import sensor, image, time, facedetect  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
face_cascade = facedetect.Cascade('haarcascade_frontalface_default.xml') # 加载人脸检测器  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    faces = face_cascade.find(img) # 检测人脸  
    if len(faces) > 0: # 如果检测到了人脸  
        for face in faces: # 在每个检测到的人脸周围绘制矩形框  
            img.draw_rectangle(face.rect(), color = (255, 0, 0), thickness = 2)  
    print(img) # 打印标记了人脸的照片

要点解读:
首先初始化摄像头,设置像素格式和帧大小。加载人脸检测器,这里使用的是OpenCV提供的Haar级联分类器。在一个无限循环中,使用snapshot()函数实时拍摄照片,并使用find()函数检测人脸。如果检测到了人脸,则在每个检测到的人脸周围绘制矩形框,并使用draw_rectangle()函数绘制矩形框。最后打印标记了人脸的照片。

案例四:实时显示摄像头画面

import sensor, image, time

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

while(True):
    img = sensor.snapshot() # 获取一帧图像
    lcd.display(img) # 在LCD上显示图像
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD

要点解读:首先导入 sensor、image 和 time 模块。然后初始化传感器并设置像素格式和帧大小。接着等待2秒,让红外接收器稳定。在 while 循环中,不断获取一帧图像并在LCD上显示出来,每隔30毫秒更新一次LCD。

案例五:实时拍摄照片并保存到SD卡

import sensor, image, time, os

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

while(True):
    img = sensor.snapshot() # 获取一帧图像
    img.save("photo_{}.bmp".format(int(time.time()))) # 将图像保存为BMP格式
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD
    os.system("ls /sd/") # 查看SD卡中的文件列表

要点解读:首先导入 sensor、image、time 和 os 模块。然后初始化传感器并设置像素格式和帧大小。接着等待2秒,让红外接收器稳定。在 while 循环中,不断获取一帧图像并将其保存为BMP格式的照片,同时每隔30毫秒更新一次LCD,并查看SD卡中的文件列表。

案例六:实时显示摄像头画面并录制视频

import sensor, image, time, cv2

sensor.reset() # 初始化传感器
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为QVGA
sensor.skip_frames(time = 2000) # 等待2秒,让红外接收器稳定

fourcc = cv2.VideoWriter_fourcc(*'XVID') # 定义视频编码格式
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) # 创建视频写入对象

while(True):
    img = sensor.snapshot() # 获取一帧图像
    img.save("photo_{}.bmp".format(int(time.time()))) # 将图像保存为BMP格式
    time.sleep_ms(30) # 每隔30毫秒更新一次LCD
    ret, frame = cap.read() # 从摄像头读取一帧图像
    out.write(frame) # 将图像写入视频文件
    cv2.imshow('frame', frame) # 在窗口中显示图像
    if cv2.waitKey(1) & 0xFF == ord('q'): # 如果按下q键则退出程序
        break
out.release() # 释放视频写入对象
cv2.destroyAllWindows() # 关闭所有窗口

要点解读:首先导入 sensor、image、time、cv2 模块。然后初始化传感器并设置像素格式和帧大小。接着等待2秒,让红外接收器稳定。在 while 循环中,不断获取一帧图像并将其保存为BMP格式的照片,同时每隔30毫秒更新一次LCD,并从摄像头读取一帧图像并将其写入视频文件。最后在窗口中显示图像,如果按下q键则退出程序。

案例七:实时显示摄像头图像:

import sensor
import image
import lcd

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

while True:
    img = sensor.snapshot()
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor模块和lcd模块实时显示摄像头图像。
使用lcd.init()初始化LCD显示屏。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat(sensor.RGB565)设置图像像素格式为RGB565。
使用sensor.set_framesize(sensor.QVGA)设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)开始摄像头图像流。
在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()捕获摄像头图像,并将其存储在变量img中。
使用lcd.display(img)在LCD显示屏上显示图像。

案例八:实时检测并显示图像中的人脸:

import sensor
import image
import lcd
import time
import uos
from fpioa_manager import *

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

# 加载人脸检测模型
model_path = "/sd/models/face_detection/face_detection.kmodel"
fm.register(board_info.PIN9, fm.fpioa.GPIOHS0)
time.sleep(1)
lcd.clear()

try:
    face_detect = KPUClassify(model_path)
except Exception as e:
    print(e)

while True:
    img = sensor.snapshot()
    # 进行人脸检测
    faces = face_detect.detect(img)
    for face in faces:
        # 在图像上绘制人脸框
        img.draw_rectangle(face.rect(), color=(255, 0, 0))
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor模块、lcd模块和KPU模块实时检测并显示图像中的人脸。
使用lcd.init()初始化LCD显示屏。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat(sensor.RGB565)设置图像像素格式为RGB565。
使用sensor.set_framesize(sensor.QVGA)设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)开始摄像头图像流。
在try-except块中,加载人脸检测模型(在SD卡上的路径为/sd/models/face_detection/face_detection.kmodel)。
在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()捕获摄像头图像,并将其存储在变量img中。
使用人脸检测模型face_detect对图像进行人脸检测,将检测到的人脸存储在变量faces中。
对于每个检测到的人脸,使用img.draw_rectangle(face.rect(), color=(255, 0, 0))在图像上绘制人脸框,颜色为红色。
使用lcd.display(img)在LCD显示屏上显示带有人脸框的图像。

案例九:实时计算图像帧率:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)

frame_count = 0
start_time = time.time()

while True:
    img = sensor.snapshot()
    frame_count += 1
    if frame_count % 100 == 0:
        current_time = time.time()
        elapsed_time = current_time - start_time
        fps = frame_count / elapsed_time
        print("FPS:", fps)

要点解读:
该程序使用OpenMV Cam的sensor模块实时计算图像帧率。
使用sensor.reset()重置摄像头传感器。
使用sensor.set_pixformat(sensor.RGB565)设置图像像素格式为RGB565。
使用sensor.set_framesize(sensor.QVGA)设置图像帧大小为QVGA(320x240)。
使用sensor.run(1)开始摄像头图像流。
初始化帧计数frame_count为0,并记录程序开始时间start_time。
在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()捕获摄像头图像,并将其存储在变量img中。

每捕获100帧图像,执行以下操作:
获取当前时间current_time。
计算已经过的时间elapsed_time,即当前时间减去程序开始时间。
计算帧率fps,即帧数除以已经过的时间。
使用print()输出帧率。

这些示例代码提供了使用MicroPython和OpenMV Cam进行实时拍摄的基本框架。你可以根据自己的需求修改和扩展这些代码,例如添加图像处理算法、与其他传感器或模块进行交互等。

请注意,以上案例只是为了拓展思路,可能存在错误或不适用的情况。不同的硬件平台、使用场景和MicroPython版本可能会导致不同的使用方法。在实际编程中,您需要根据您的硬件配置和具体需求进行调整,并进行多次实际测试。确保正确连接硬件并了解所使用的传感器和设备的规范和特性非常重要。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值