【雕爷学编程】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可以通过手势控制实现交互性和智能性的应用。下面将从专业的视角,详细解释OpenMV Cam手势控制的主要特点、应用场景以及需要注意的事项。

主要特点:

手势识别功能:OpenMV Cam内置了手势识别的算法和函数库,能够实时识别人类手势动作。学生可以利用这些功能,实现手势控制相关的应用,如手势识别游戏、手势控制机器人等。
实时性和灵敏度:OpenMV Cam具备实时采集和处理图像的能力,可以快速响应手势动作。这种实时性和灵敏度有助于提高用户体验,使手势控制更加流畅和自然。
简单易用的编程接口:OpenMV Cam基于MicroPython编程语言,提供了简单易用的编程接口,使学生能够快速上手,实现手势控制应用。学生可以通过编写少量的代码,完成手势识别和相关功能的开发。
开放性和可扩展性:OpenMV Cam是一个开放的平台,可以支持用户扩展和定制手势识别功能。学生可以根据自己的需求,开发新的手势识别算法或者与其他硬件模块进行联动,实现更多创新性的手势控制应用。

应用场景:

交互式游戏:OpenMV Cam的手势控制功能适用于交互式游戏的开发。学生可以利用手势识别算法,设计并实现各种类型的手势控制游戏,如音乐游戏、体感游戏等,提高游戏的娱乐性和互动性。
智能家居控制:手势控制可以用于智能家居系统的控制。学生可以利用OpenMV Cam的手势识别功能,实现灯光、窗帘、电视等设备的手势控制,提升家居系统的智能化和人机交互体验。
机器人控制:手势控制可以应用于机器人的控制和导航。学生可以将OpenMV Cam与机器人平台相结合,利用手势识别功能实现机器人的手势控制,如手势导航、手势指令等,提高机器人的智能性和灵活性。

需要注意的事项:

算法准确性:手势识别算法的准确性对于实现良好的手势控制应用至关重要。教师应该指导学生深入了解手势识别算法的原理,并进行实验和调试,确保算法的准确性和稳定性。
数据集和模型训练:手势识别算法通常需要依靠大量的手势数据集和模型训练。教师可以引导学生了解数据集的收集方法和模型训练的步骤,帮助他们构建适合自己项目需求的数据集和模型。
用户交互设计:手势控制应用的用户体验很大程度上取决于良好的交互设计。教师应该关注学生在交互设计方面的能力培养,引导他们思考如何设计合理的手势动作和对应的功能,以及如何提供友好的用户反馈。

综上所述,MicroPython的OpenMV Cam手势控制具有手势识别功能、实时性和灵敏度、简单易用的编程接口以及开放性和可扩展性。它适用于交互式游戏、智能家居控制和机器人控制等多个应用场景。在使用过程中需要注意手势识别算法的准确性、数据集和模型训练,以及用户交互设计的优化。通过合理的教学指导和实践,OpenMV Cam手势控制可以帮助学生掌握手势识别技术,培养创新思维和交互设计能力,推动智能化应用的发展。

案例1:手势识别

import sensor, image, time
from machine import I2C, Pin
from micropython import const

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

i2c = I2C(scl=Pin(22), sda=Pin(21))

while(True):
    img = sensor.snapshot()
    # 将图像转换为灰度图像
    gray = img.to_grayscale()
    # 使用OpenMV的内置手势识别算法进行手势识别
    gesture = openmv_gesture_detection(gray)
    # 如果检测到手势,则执行相应的操作
    if gesture:
        print("Gesture detected!")
        break
    time.sleep(1000)

要点解读:这个程序首先设置了摄像头的参数,然后进入一个无限循环。在循环中,它不断地获取摄像头的图像,并将图像转换为灰度图像。然后,它使用OpenMV的内置手势识别算法来检测手势。如果检测到手势,则打印一条消息并退出循环。

案例2:手势控制

import sensor, image, time
from machine import I2C, Pin
from micropython import const

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

i2c = I2C(scl=Pin(22), sda=Pin(21))

while(True):
    img = sensor.snapshot()
    # 将图像转换为灰度图像
    gray = img.to_grayscale()
    # 使用OpenMV的内置手势识别算法进行手势识别
    gesture = openmv_gesture_detection(gray)
    # 如果检测到手势,则执行相应的操作
    if gesture:
        # 如果检测到的是“拳头”,则拍照
        if gesture == "fist":
            camera.capture()
        # 如果检测到的是“OK”手势,则发送一条消息
        elif gesture == "ok":
            print("OK gesture detected!")
        break
    time.sleep(1000)

要点解读:这个程序与第一个程序类似,但是它添加了对手势的控制。如果检测到的是“拳头”手势,它会拍照。如果检测到的是“OK”手势,它会发送一条消息。

案例3:手势跟踪

import sensor, image, time
from machine import I2C, Pin
from micropython import const

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

i2c = I2C(scl=Pin(22), sda=Pin(21))

tracking_gesture = None

while(True):
    img = sensor.snapshot()
    # 将图像转换为灰度图像
    gray = img.to_grayscale()
    # 使用OpenMV的内置手势识别算法进行手势识别
    gesture = openmv_gesture_detection(gray)
    # 如果检测到新的手势,则更新跟踪的手势
    if gesture != tracking_gesture:
        tracking_gesture = gesture
        # 如果检测到的是“拳头”,则显示一个圆圈
        if gesture == "fist":
            image.draw_circle(gray, (100, 100), 50)
        # 如果检测到的是“OK”手势,则显示一个勾号
        elif gesture == "ok":
            image.draw_cross(gray, (100, 100), (150, 150))
    # 等待一段时间,然后继续检测手势
    time.sleep(100)

要点解读:这个程序与第二个程序类似,但是它添加了对手势的跟踪。它使用一个变量tracking_gesture来跟踪当前正在跟踪的手势。如果检测到新的手势,它会更新tracking_gesture并显示相应的图标。

案例4:手势控制移动机器人

import sensor, image, time, math  
  
# 机器人移动速度  
speed = 10  
  
# 机器人方向控制函数  
def move(direction):  
    if direction == "forward":  
        # 向前移动  
        left_motor.set(-speed)  
        right_motor.set(speed)  
    elif direction == "backward":  
        # 向后移动  
        left_motor.set(speed)  
        right_motor.set(-speed)  
    elif direction == "left":  
        # 向左移动  
        left_motor.set(-speed)  
        right_motor.set(speed)  
        robot.turn_left(math.pi/4)  
    elif direction == "right":  
        # 向右移动  
        left_motor.set(speed)  
        right_motor.set(-speed)  
        robot.turn_right(math.pi/4)  
    else:  
        # 停止移动  
        left_motor.set(0)  
        right_motor.set(0)  
  
# 获取手势图像,并检测手势类型  
while True:  
    img = sensor.snapshot()  
    gesture = img.get_Gesture()  
    if gesture == "rock_right":  
        move("right")  
    elif gesture == "rock_left":  
        move("left")  
    elif gesture == "wave_in":  
        move("forward")  
    elif gesture == "wave_out":  
        move("backward")

案例5:手势控制LED灯的开关

import sensor, image, time, machine  
  
# LED灯引脚定义  
led = machine.Pin(5, machine.Pin.OUT)  
  
# 获取手势图像,并检测手势类型  
while True:  
    img = sensor.snapshot()  
    gesture = img.get_Gesture()  
    if gesture == "palm":  
        led.off()  # 关闭LED灯  
    elif gesture == "摇滚":  
        led.on()   # 打开LED灯

案例6:手势控制机械臂的旋转

以下是一个使用MicroPython和OpenMV Cam来控制机械臂旋转的基本示例。这个示例假设你有一个可以接受两个指令的机械臂:顺时针旋转90度(或任何指定的角度)和逆时针旋转90度。这个代码可能需要你根据你的硬件设备进行修改。

import sensor, image, time, math  
  
# 假设你的机械臂控制器接收的是电角度(电气角度,不是机械角度),需要转换  
# 360度机械角度 = 256个电度数  
# 每个度数对应的电度数 = 256 / 360  
degrees_to_electric = 256 / 360  
  
# 初始化机械臂控制器(假设这个函数存在)  
def init_robot():  
    global robot  
    # 这里假设有一个全局变量 robot,它是你的机械臂控制器  
    # 你需要用你的机械臂控制器初始化函数替换这个,例如 robot = Adafruit_RobotArm()  
  
# 顺时针旋转90度  
def rotate_clockwise():  
    global robot  
    robot.set_speed(1) # 设置机械臂速度,根据实际情况修改  
    robot.move(90 * degrees_to_electric) # 乘上转换系数,得到电度数  
  
# 逆时针旋转90度  
def rotate_counterclockwise():  
    global robot  
    robot.set_speed(-1) # 设置机械臂速度,根据实际情况修改  
    robot.move(-90 * degrees_to_electric) # 乘上转换系数,得到电度数  
  
# 获取手势图像,并检测手势类型和旋转方向  
init_robot() # 初始化机械臂控制器  
while True:  
    img = sensor.snapshot()  
    gesture = img.get_Gesture()  
    if gesture == "rock_right": # 向左旋转一定角度(逆时针)  
        rotate_counterclockwise()  
    elif gesture == "rock_left": # 向右旋转一定角度(顺时针)  
        rotate_clockwise()

这个代码只是一个基本的示例,你可能需要根据你的硬件和特定的应用进行修改。此外,OpenMV Cam的手势识别可能并不完全准确,你可能需要一些额外的逻辑来处理误检。例如,你可能想要检查手势是否在特定的区域内,或者连续检测到相同的手势才进行动作。

案例7:手势识别:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def gesture_recognition():
    while True:
        img = sensor.snapshot()
        # 执行手势识别算法
        # 获取识别结果
        # 执行相应的操作

gesture_recognition()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行手势识别。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个gesture_recognition()函数,用于手势识别。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行手势识别算法,可以使用机器学习模型或计算机视觉算法进行手势识别。
获取识别结果,并根据结果执行相应的操作,如控制机器人、调整音量等。
在主程序中,调用gesture_recognition()函数进行手势识别。

案例8:手势追踪:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def gesture_tracking():
    while True:
        img = sensor.snapshot()
        # 执行手势追踪算法
        # 获取追踪结果
        # 执行相应的操作

gesture_tracking()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行手势追踪。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个gesture_tracking()函数,用于手势追踪。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行手势追踪算法,可以使用计算机视觉算法或运动跟踪算法进行手势追踪。
获取追踪结果,并根据结果执行相应的操作,如跟踪物体、控制游戏等。
在主程序中,调用gesture_tracking()函数进行手势追踪。

案例9:手势控制:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)

def gesture_control():
    while True:
        img = sensor.snapshot()
        # 执行手势识别或追踪算法
        # 获取识别或追踪结果
        # 根据结果执行相应的控制操作

gesture_control()

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行手势控制。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个gesture_control()函数,用于手势控制。
在函数中,使用sensor.snapshot()函数获取当前图像。
执行手势识别或追踪算法,获取识别或追踪结果。
根据识别或追踪结果执行相应的控制操作,如控制机器人运动、调整灯光亮度等。
在主程序中,调用gesture_control()函数进行手势控制。
这些示例代码可以帮助你开始使用MicroPython和OpenMV Cam进行手势控制。你可以根据实际需求自定义手势识别或追踪算法,并根据识别或追踪结果执行相应的控制操作。记得在运行代码之前,确保你已正确设置了OpenMV Cam的硬件和软件环境。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值