【雕爷学编程】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支持多种接口和传感器,如GPIO、UART、I2C等,可与外部设备和传感器进行连接和通信,实现更丰富的功能扩展和应用。
小巧便携的设计:OpenMV Cam具有小巧轻便的设计,便于携带和安装在各种设备和系统中,适用于嵌入式系统和移动设备等场景。

应用场景:

视觉导航和跟踪: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)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

# 定义人脸检测函数
def face_detection():
    while True:
        img = sensor.snapshot()
        # 使用Haar级联分类器检测人脸
        faces = img.find_features(image.HaarCascade("haarcascade_frontalface_default.xml"))
        # 在检测到的人脸周围画矩形框
        for face in faces:
            img.draw_rectangle(face.rect(), color=(255, 0, 0))
        time.sleep(1000)

# 运行人脸检测程序
face_detection()

要点解读:这个程序首先导入所需的库,然后设置了摄像头的参数。接着定义了一个人脸检测函数,该函数通过循环不断捕获图像并使用Haar级联分类器检测人脸。最后,在检测到的人脸周围画矩形框。其他部分与第一个案例类似。

案例二:实时目标跟踪

import sensor, image, time

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

# 定义目标跟踪函数
def tracking():
    while True:
        img = sensor.snapshot()
        # 使用光流法计算目标的位置
        p = img.calc_gradients(orientations=image.ORIENTATION_TOPBOTTOM, angles=image.ANGLE_90)
        d = p[-1] - p[0]
        # 计算目标的中心点
        c = d / np.linalg.norm(d)
        # 在图像上绘制目标中心点
        img.draw_circle(int(c[0]), int(c[1]), 2, color=(0, 255, 0))
        time.sleep(1000)

# 运行目标跟踪程序
tracking()

要点解读:这个程序首先导入所需的库,然后设置了摄像头的参数。接着定义了一个目标跟踪函数,该函数通过循环不断捕获图像并使用光流法计算目标的位置。最后,在图像上绘制目标中心点。其他部分与第二个案例类似。

案例三:实时手势识别

import sensor, image, time
from machine import ADC, Pin

# 设置摄像头参数
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

# 定义手势识别函数
def gesture_recognition():
    while True:
        img = sensor.snapshot()
        # 将图像转换为灰度图
        img = img.to_grayscale()
        # 使用ADC模块读取手势传感器的值
        adc = ADC(Pin(34))
        value = adc.read()
        # 根据传感器值判断手势类型
        if value < 500:
            gesture = "None"
        elif value < 1000:
            gesture = "Up"
        elif value < 1500:
            gesture = "Down"
        elif value < 2000:
            gesture = "Left"
        else:
            gesture = "Right"
        # 在图像上显示手势类型
        img.draw_text(gesture, (10, 10), font=16, color=(255, 255, 255))
        time.sleep(1000)

# 运行手势识别程序
gesture_recognition()

要点解读:这个程序首先导入所需的库,然后设置了摄像头的参数。接着定义了一个手势识别函数,该函数通过循环不断捕获图像并将图像转换为灰度图。然后使用ADC模块读取手势传感器的值,并根据传感器值判断手势类型。最后,在图像上显示手势类型。其他部分与第三个案例类似。

案例四:基于颜色识别的物体计数

import sensor, image, time  
  
# 初始化摄像头  
sensor.reset()  
sensor.set_pixformat(sensor.RGB565)  
sensor.set_framesize(sensor.QVGA)  
sensor.set_hmirror(0)  
sensor.run(1)  
  
# 设定颜色阈值范围,用于识别物体  
red_threshold = (200, 255, 200)  # 红色阈值范围,表示物体颜色  
green_threshold = (0, 255, 0)  # 绿色阈值范围,用于去除背景干扰  
blue_threshold = (0, 0, 255)  # 蓝色阈值范围,用于去除阴影干扰  
  
count = 0  # 物体计数初始值为0  
  
while True:  
    # 捕获图像数据并进行颜色识别,统计物体数量  
    img = sensor.snapshot()  
    hsv_img = img.hsv()  
    red_count = hsv_img.count_colors(red_threshold)  
    green_count = hsv_img.count_colors(green_threshold)  
    blue_count = hsv_img.count_colors(blue_threshold)  
    count = red_count - green_count - blue_count  # 计算物体数量,去除背景和阴影干扰  
    print("Count:", count)  # 输出物体数量

要点解读:
首先导入所需的模块,并初始化摄像头。这里将像素格式设置为RGB565。
设定颜色阈值范围,用于识别物体。这里设定了红色阈值范围表示物体颜色,绿色阈值范围用于去除背景干扰,蓝色阈值范围用于去除阴影干扰。可以根据实际需求调整阈值范围。
在while循环中,不断捕获图像数据并进行颜色识别,统计物体数量。使用hsv()函数将图像转换为HSV颜色空间进行颜色识别,并使用count_colors()函数统计指定颜色范围内的像素数量。计算物体数量时,通过减去绿色和蓝色像素数量来去除背景和阴影干扰。最后输出物体数量。
该程序适用于基于颜色识别的物体计数,可以通过调整颜色阈值范围和算法来适应不同的物体和场景。

案例五:基于形状识别的物体分类

import sensor, image, time, math  
  
# 初始化摄像头  
sensor.reset()  
sensor.set_pixformat(sensor.GRAYSCALE)  
sensor.set_framesize(sensor.QVGA)  
sensor.set_hmirror(0)  
sensor.run(1)  
  
# 设定形状识别参数,用于分类物体  
threshold = (100, 255)  # 二值化阈值范围,用于提取物体轮廓  
min_area = 500  # 最小面积阈值,用于去除小面积噪声  
max_area = 5000  # 最大面积阈值,用于去除大面积噪声  
circularity = 0.8  # 圆形度阈值,用于识别圆形物体  
aspect_ratio = 1.5  # 长宽比阈值,用于识别矩形物体  
  
classes = {"Circle": 0, "Rectangle": 0}  # 物体分类计数器初始值为0  
  
while True:  
    # 捕获图像数据并进行形状识别,分类物体并计数  
    img = sensor.snapshot()  
    binary = img.binary([threshold])  # 二值化图像,提取物体轮廓  
    contours = binary.find_contours(min_area=min_area, max_area=max_area)  # 查找轮廓,去除噪声  
    for contour in contours:  
        area = contour.area()  # 计算轮廓面积  
        perimeter = contour.perimeter()  # 计算轮廓周长  
        circularity_value = 4 * math.pi * area / (perimeter ** 2)  # 计算圆形度  
        aspect_ratio_value = contour.bounding_box().width() / contour.bounding_box().height()  # 计算长宽比  
        if circularity_value >= circularity:  # 如果圆形度大于等于阈值,分类为圆形物体并计数  
            classes["Circle"] += 1  
        elif aspect_ratio_value <= aspect_ratio:  # 如果长宽比小于等于阈值,分类为矩形物体并计数  
            classes["Rectangle"] += 1  
    print("Circles:", classes["Circle"])  # 输出圆形物体数量  
    print("Rectangles:", classes["Rectangle"])  # 输出矩形物体数量

要点解读:
首先导入所需的模块,并初始化摄像头。这里将像素格式设置为灰度图像。
设定形状识别参数,用于分类物体。这里设定了二值化阈值范围、最小面积阈值、最大面积阈值、圆形度阈值和长宽比阈值等参数。可以根据实际需求调整这些参数。
在while循环中,不断捕获图像数据并进行形状识别,分类物体并计数。使用binary()函数将图像进行二值化处理,提取物体轮廓。使用find_contours()函数查找轮廓,并通过面积和周长计算圆形度和长宽比来判断物体的形状。根据判断结果将物体分类为圆形或矩形,并更新相应的计数器。最后输出圆形和矩形物体的数量。
该程序适用于基于形状识别的物体分类,可以通过调整形状识别参数和算法来适应不同的物体和场景。

案例六:颜色识别与跟踪:

import sensor
import image
import time
import lcd

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

while True:
    img = sensor.snapshot()
    blobs = img.find_blobs([(30, 100, -128, 127, -128, 127)], pixels_threshold=200)
    
    if blobs:
        for blob in blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行颜色识别与跟踪。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_blobs()函数寻找指定颜色范围内的色块。
使用img.draw_rectangle()和img.draw_cross()函数在图像上绘制色块的边框和中心点。
使用lcd.display()将处理后的图像实时显示在LCD上。

案例七:QR码识别与解码:

import sensor
import image
import time
import lcd

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

while True:
    img = sensor.snapshot()
    codes = img.find_qrcodes()
    
    if codes:
        for code in codes:
            img.draw_rectangle(code.rect())
            lcd.draw_string(code.x(), code.y(), code.payload(), lcd.WHITE, lcd.RED)
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行QR码识别与解码。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_qrcodes()函数寻找并识别图像中的QR码。
使用img.draw_rectangle()函数在图像上绘制QR码的边框。
使用lcd.draw_string()函数在LCD上显示QR码的内容。
使用lcd.display()将处理后的图像实时显示在LCD上。

案例8:AprilTag识别与姿态估计:

import sensor
import image
import time
import lcd

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

while True:
    img = sensor.snapshot()
    tags = img.find_apriltags()
    
    if tags:
        for tag in tags:
            img.draw_rectangle(tag.rect())
            img.draw_cross(tag.cx(), tag.cy())
            img.draw_string(tag.x(), tag.y(), "Tag ID: %d" % tag.id(), color=(255, 0, 0))
            img.draw_string(tag.x(), tag.y() + 10, "Rotation: %f" % tag.rotation(), color=(255, 0, 0))
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行AprilTag识别与姿态估计。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
在主循环中,使用sensor.snapshot()获取当前图像。

案例九:AprilTag识别与姿态估计(续):

tags = img.find_apriltags()
    
    if tags:
        for tag in tags:
            img.draw_rectangle(tag.rect())
            img.draw_cross(tag.cx(), tag.cy())
            img.draw_string(tag.x(), tag.y(), "Tag ID: %d" % tag.id(), color=(255, 0, 0))
            img.draw_string(tag.x(), tag.y() + 10, "Rotation: %f" % tag.rotation(), color=(255, 0, 0))
    
    lcd.display(img)

要点解读:
在主循环中,使用img.find_apriltags()函数寻找并识别图像中的AprilTag。
使用img.draw_rectangle()函数在图像上绘制AprilTag的边框。
使用img.draw_cross()函数在图像上绘制AprilTag的中心点。
使用img.draw_string()函数在图像上显示AprilTag的ID和旋转角度信息。
使用lcd.display()将处理后的图像实时显示在LCD上。
这些代码案例提供了MicroPython和OpenMV Cam在机器视觉应用中的一些基本功能示例,可以作为你开始开发自己项目的参考。你可以根据实际需求进行修改和扩展。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值