【雕爷学编程】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作为编程语言,提供了简洁而灵活的编程接口。教师和学生可以利用Python语言轻松编写手势识别的应用程序,并通过OpenMV Cam的API进行图像采集、处理和手势识别的控制。
可扩展性和定制性:OpenMV Cam具备良好的可扩展性和定制性。除了内置的手势识别功能外,教师和学生还可以结合其他传感器和模块,如深度摄像头、惯性测量单元等,进一步扩展和定制手势识别系统的功能。

应用场景:

人机交互系统:OpenMV Cam的手势识别功能适用于各种人机交互系统。例如,通过手势识别,用户可以使用自然的手势动作来控制设备或执行特定的操作,如手势开关灯、手势调节音量等。
教育和学习:OpenMV Cam的手势识别功能可以应用于教育和学习领域。教师可以设计基于手势识别的实验或项目,帮助学生理解图像处理和机器学习的原理,并培养创新思维和实践能力。
创客和科研项目:OpenMV Cam的手势识别功能为创客和科研项目提供了便利。教师和学生可以利用手势识别功能开展创新性的项目,如智能机器人、智能监控等,探索和应用先进的视觉技术。

需要注意的事项:

数据集和模型训练:手势识别算法的性能与数据集和模型训练密切相关。教师和学生在使用OpenMV Cam的手势识别功能时,可能需要收集和标注相关的手势数据,并进行模型训练和优化,以提高手势识别的准确性和稳定性。
环境条件和背景干扰:手势识别算法对环境条件和背景干扰敏感。在使用OpenMV Cam进行手势识别时,需要注意光照条件、背景干扰等因素对手势识别的影响,尽量选择良好的环境条件并进行干扰的消除或补偿。
用户界面和反馈机制:在设计和实现手势识别系统时,需要考虑用户界面和反馈机制。教师和学生应关注用户操作的友好性和反馈的及时性,以提升用户体验和交互效果。

综上所述,MicroPython的OpenMV Cam的手势识别功能具备高性能、快速响应和低功耗等主要特点。它适用于人机交互系统、教育和学习、创客和科研项目等应用场景。在使用过程中,需要注意数据集和模型训练、环境条件和背景干扰,以及用户界面和反馈机制等事项。这些注意事项将有助于实现高效准确的手势识别系统,并提升用户体验和交互效果。

案例一:检测剪刀手

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)

threshold = 30
flip = False
rotation = True
scale = True

while True:
    img = sensor.snapshot()
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) > 500:
            print("检测到剪刀手")
            break
    time.sleep(100)

要点解读:首先导入所需的库,然后设置摄像头参数,接着在循环中不断获取图像并进行处理。通过调用openmv_gesture_detection()函数,可以检测到图像中的手势。当检测到剪刀手时,输出提示信息。

案例二:检测挥手

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)

threshold = 30
flip = False
rotation = True
scale = True

while True:
    img = sensor.snapshot()
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) > 500:
            print("检测到挥手")
            break
    time.sleep(100)

要点解读:与剪刀手案例类似,首先导入所需的库,然后设置摄像头参数,接着在循环中不断获取图像并进行处理。通过调用openmv_gesture_detection()函数,可以检测到图像中的手势。当检测到挥手时,输出提示信息。

案例三:检测点头

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)

threshold = 30
flip = False
rotation = True
scale = True

while True:
    img = sensor.snapshot()
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
    contours, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) > 500:
            print("检测到点头")
            break
    time.sleep(100)

要点解读:与剪刀手和挥手案例类似,首先导入所需的库,然后设置摄像头参数,接着在循环中不断获取图像并进行处理。通过调用openmv_gesture_detection()函数,可以检测到图像中的手势。当检测到点头时,输出提示信息。

案例四:通过手势控制LED的开关

import sensor, image, time, machine  
  
# 设置传感器和图像参数  
sensor.reset()  
sensor.set_pixformat(sensor.GRAYSCALE)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 2000)  
  
# 初始化LED  
led = machine.Pin(5, machine.Pin.OUT)  
  
# 定义手势类别和对应的操作  
gestures = {  
    "W": ("led", 0), # 开启LED  
    "V": ("led", 1)  # 关闭LED  
}  
  
while True:  
    img = sensor.snapshot()  
    result = img.find_blobs([gestures["W"], gestures["V"]], threshold = 120)  
    if result:  
        blob = result[0]  
        x1, y1, w1, h1 = blob.rect()  
        if blob.class_label() == "W":  
            led.value(0) # 开启LED  
        elif blob.class_label() == "V":  
            led.value(1) # 关闭LED  
    time.sleep(0.1)

要点解读:
这个程序通过定义一个名为gestures的字典来映射手势类别(W和V)和对应的操作(在这里是LED的开关)。在主循环中,程序拍摄一张快照并使用find_blobs方法来检测手势。如果检测到任何手势,它将根据手势类别来执行相应的操作(在这里是开启或关闭LED)。time.sleep(0.1)语句用于降低循环的频率,以避免浪费处理器资源。

案例五:通过手势控制舵机的旋转

import sensor, image, time, omv, omv.vision as vision  
from omv.drivers import ServoDriver  
  
# 设置传感器和图像参数  
sensor.reset()  
sensor.set_pixformat(sensor.GRAYSCALE)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 2000)  
stream = sensor.snapshot().get_stream()  
vision_pipe = vision.Pipeline()  
vision_pipe.load_model("gestures/circle") # 加载圆形手势模型  
servo_driver = ServoDriver() # 初始化舵机驱动器  
servo_driver.open("servo1") # 打开连接的舵机接口  
  
while True:  
    img = sensor.snapshot()  
    result = vision_pipe.apply(img)  
    if result:  
        blob = result[0]  
        x1, y1, w1, h1 = blob.rect()  
        if blob.class_label() == "circle": # 如果检测到圆形手势  
            servo_driver.write(40) # 将舵机旋转到40度位置  
    img.show()

要点解读:
这个程序通过ServoDriver来连接和控制舵机,使用OpenMV Cam来检测圆形手势。如果检测到圆形手势,程序将通过ServoDriver将舵机旋转到40度位置。需要注意的是,这个例子中的舵机接口名称和服务器应用程序的名称可能需要根据您的实际硬件进行修改。此外,您还可以通过修改vision_pipe.load_model语句加载其他手势模型来识别的手势。

案例六:通过手势控制机器人的移动
以下是一个示例代码,该代码使用Python编程语言,通过OpenMV Cam来检测手势并对机器人进行相应的移动控制。此示例假设您使用的是turtle库来控制机器人的移动。

import sensor, image, time, omv, turtle  
from omv.drivers.usb_serial import SerialPort  
from omv.drivers.usb_cam import UsbCam  
from omv.vision import VisionThread  
from omv.turtle import Turtle  
  
# 设置串口连接  
port = SerialPort()  
port.open("/dev/ttyACM0") # 串口设备路径可能需要根据您的设备进行修改  
  
# 设置摄像头连接并启动视觉线程  
cam = UsbCam()  
cam.open(0) # 摄像头设备路径可能需要根据您的设备进行修改  
vision_thread = VisionThread()  
vision_thread.start()  
  
# 初始化turtle对象用于控制机器人的移动  
t = turtle.Turtle()  
  
# 定义手势类别和对应的操作  
gestures = {  
    "up": ("move", 100), # 上移  
    "down": ("move", -100), # 下移  
    "left": ("move", -100, "left"), # 左移  
    "right": ("move", 100, "right") # 右移  
}  
  
while True:  
    img = sensor.snapshot()  
    result = img.find_blobs([gestures["up"], gestures["down"], gestures["left"], gestures["right"]], threshold = 120)  
    if result:  
        blob = result[0]  
        x1, y1, w1, h1 = blob.rect()  
        if blob.class_label() == "up": # 如果检测到上移手势  
            t.penup()  
            t.sety(t.ycor() + 50) # y坐标增加50个像素点,即向上移动50个像素点  
            t.pendown()  
        elif blob.class_label() == "down": # 如果检测到下移手势  
            t.penup()  
            t.sety(t.ycor() - 50) # y坐标减少50个像素点,即向下移动50个像素点  
            t.pendown()  
        elif blob.class_label() == "left": # 如果检测到左移手势  
            t.penup()  
            t.setx(t.xcor() - 50) # x坐标减少50个像素点,即向左移动50个像素点  
            t.pendown()  
        elif blob.class_label() == "right": # 如果检测到右移手势  
            t.penup()  
            t.setx(t.xcor() + 50) # x坐标增加50个像素点,即向右移动50个像素点  
            t.pendown()  
    img.show()

这段代码将通过OpenMV Cam的手势识别控制turtle对象移动。注意,这个例子中的移动距离(50个像素点)是固定的,您可能需要根据实际情况调整这个值。如果您使用的是其他机器人控制库或框架,代码可能需要进行相应的修改。

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

import sensor
import image
import time
import pyb

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

def openmv_gesture_detection():
    gesture_threshold = 5

    while True:
        img = sensor.snapshot()
        objects = img.find_gestures()

        if objects:
            for obj in objects:
                if obj.magnitude() > gesture_threshold:
                    perform_gesture_action(obj)

def perform_gesture_action(gesture):
    print("Gesture detected!")
    # 在此处添加控制机器人移动的代码
    # 根据不同的手势,控制机器人向前、向后、左转或右转等

openmv_gesture_detection()

要点解读:
该程序使用OpenMV Cam进行手势识别,并根据手势控制机器人的移动。
使用OpenMV Cam的sensor和image模块进行图像处理和手势检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个openmv_gesture_detection()函数,用于手势识别。
在函数中,获取当前图像并进行手势检测。
如果检测到手势,并且手势的振幅超过设定的阈值,则触发手势检测事件。
在perform_gesture_action()函数中,根据检测到的手势执行相应的机器人移动控制操作。

案例八:手势控制智能家居设备:

import sensor
import image
import time
import pyb

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

def openmv_gesture_detection():
    gesture_threshold = 5

    while True:
        img = sensor.snapshot()
        objects = img.find_gestures()

        if objects:
            for obj in objects:
                if obj.magnitude() > gesture_threshold:
                    perform_gesture_action(obj)

def perform_gesture_action(gesture):
    print("Gesture detected!")
    # 在此处添加控制智能家居设备的代码
    # 根据不同的手势,控制灯光、温度、窗帘等智能设备

openmv_gesture_detection()

要点解读:
该程序使用OpenMV Cam进行手势识别,并根据手势控制智能家居设备的功能(如灯光、温度、窗帘等)。
使用OpenMV Cam的sensor和image模块进行图像处理和手势检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个openmv_gesture_detection()函数,用于手势识别。
在函数中,获取当前图像并进行手势检测。
如果检测到手势,并且手势的振幅超过设定的阈值,则触发手势检测事件。
在perform_gesture_action()函数中,根据检测到的手势执行相应的智能家居设备控制操作。

案例九:手势控制游戏互动:

import sensor
import image
import time
import pyb

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

def openmv_gesture_detection():
    gesture_threshold = 5

    while True:
        img = sensor.snapshot()
        objects = img.find_gestures()

        if objects:
            for obj in objects:
                if obj.magnitude() > gesture_threshold:
                    perform_gesture抱歉,我在给出第三个代码示例时发生了截断。以下是完整的第三个示例,手势控制游戏互动:

```python
import sensor
import image
import time
import pyb

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

def openmv_gesture_detection():
    gesture_threshold = 5

    while True:
        img = sensor.snapshot()
        objects = img.find_gestures()

        if objects:
            for obj in objects:
                if obj.magnitude() > gesture_threshold:
                    perform_gesture_action(obj)

def perform_gesture_action(gesture):
    print("Gesture detected!")
    # 在此处添加游戏互动的代码
    # 根据不同的手势,触发游戏中的动作或事件

openmv_gesture_detection()

要点解读:
该程序使用OpenMV Cam进行手势识别,并根据手势控制游戏互动。
使用OpenMV Cam的sensor和image模块进行图像处理和手势检测。
初始化摄像头设置,包括像素格式和帧大小等。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
定义了一个openmv_gesture_detection()函数,用于手势识别。
在函数中,获取当前图像并进行手势检测。
如果检测到手势,并且手势的振幅超过设定的阈值,则触发手势检测事件。
在perform_gesture_action()函数中,根据检测到的手势执行游戏中的相应动作或事件。
这些示例代码可以帮助您理解如何使用MicroPython和OpenMV Cam进行手势识别,并在不同的应用场景中实现相应的功能。请注意,具体的手势定义、手势检测算法和相应的动作或事件逻辑可能需要根据您的实际需求进行调整和修改。

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

在这里插入图片描述
附录:
OpenMV英文官网
https://openmv.io/

OpenMV中国官方代理(星瞳科技):
https://book.openmv.cc/

OpenMV Cam 教程:
https://docs.singtown.com/micropython/zh/latest/openmvcam/openmvcam/tutorial/index.html

MicroPython 和 OpenMV Cam 中文文档
https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值