【雕爷学编程】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提供了强大的机器视觉库和算法,可以实现交通标志的快速识别和分类。借助机器学习技术,可以训练模型来实现更准确的交通标志检测。
灵活的接口和扩展性: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)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

# 定义红绿灯检测函数
def traffic_light_detection():
    while True:
        img = sensor.snapshot()
        # 使用颜色阈值检测红绿灯
        red_threshold = (30, 100, 15, 127, 15, 127)
        green_threshold = (30, 100, 15, 127, 15, 127)
        lights = img.find_colors("Red", red_threshold, green_threshold)
        # 在检测到的红绿灯位置画矩形框
        for light in lights:
            img.draw_rectangle(light.rect(), color=(255, 0, 0))
        time.sleep(1000)

# 运行红绿灯检测程序
traffic_light_detection()

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

案例二:停车标志检测


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 stop_sign_detection():
    while True:
        img = sensor.snapshot()
        # 使用形状检测器检测停车标志
        sign = img.find_shapes("Rectangle", threshold=0.8)
        # 在检测到的停车标志位置画矩形框
        for sign in sign:
            img.draw_rectangle(sign.rect(), color=(0, 255, 0))
        time.sleep(1000)

# 运行停车标志检测程序
stop_sign_detection()

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

案例三:交通标志识别(仅作参考,实际应用中需要使用更复杂的模型)

import sensor, image, time
from machine import ADC, Pin
import utime
import network
import socket
import struct
import base64
import binascii
from PIL import Image
from io import BytesIO
from pyzbar.pyzbar import decode

# 设置摄像头参数
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 traffic_sign_recognition():
    while True:
        img = sensor.snapshot()
        # 将图像转换为灰度图并进行二值化处理
        img = img.to_grayscale()
        img = img > 128
        # 使用ZBar库识别交通标志
        decoded_objects = decode(img)
        for obj in decoded_objects:
            print("Detected sign:", obj.data.decode("utf-8"))
        time.sleep(1000)

# 运行交通标志识别程序
traffic_sign_recognition()

要点解读:这个程序首先导入所需的库,然后设置了摄像头的参数。接着定义了一个交通标志识别函数,该函数通过循环不断捕获图像并将图像转换为灰度图并进行二值化处理。然后使用ZBar库识别交通标志。最后,打印识别到的交通标志。其他部分与第三个案例类似。需要注意的是,这个示例代码仅作为参考,实际应用中需要使用更复杂的模型进行交通标志识别。

案例四:基于颜色阈值的交通标志检测

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)  # 红色阈值范围,表示禁止标志  
yellow_threshold = (200, 255, 0)  # 黄色阈值范围,表示警告标志  
green_threshold = (0, 255, 0)  # 绿色阈值范围,表示指示标志  
  
while True:  
    # 捕获图像数据并进行颜色阈值检测,识别交通标志  
    img = sensor.snapshot()  
    hsv_img = img.hsv()  
    red_areas = hsv_img.find_colors(red_threshold)  # 查找红色区域,表示禁止标志  
    yellow_areas = hsv_img.find_colors(yellow_threshold)  # 查找黄色区域,表示警告标志  
    green_areas = hsv_img.find_colors(green_threshold)  # 查找绿色区域,表示指示标志  
    if red_areas:  # 如果检测到红色区域,表示禁止标志  
        print("Stop sign detected")  
    elif yellow_areas:  # 如果检测到黄色区域,表示警告标志  
        print("Warning sign detected")  
    elif green_areas:  # 如果检测到绿色区域,表示指示标志  
        print("Indicator sign detected")

要点解读:
首先导入所需的模块,并初始化摄像头。这里将像素格式设置为RGB565。
设定颜色阈值范围,用于检测交通标志。这里设定了红色、黄色和绿色阈值范围,分别表示禁止标志、警告标志和指示标志。可以根据实际需求调整阈值范围。
在while循环中,不断捕获图像数据并进行颜色阈值检测,识别交通标志。使用hsv()函数将图像转换为HSV颜色空间进行颜色识别,并使用find_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  # 长宽比阈值,用于识别矩形交通标志  
  
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:  # 如果圆形度大于等于阈值,识别为圆形交通标志  
            print("Circular traffic sign detected")  
        elif aspect_ratio_value <= aspect_ratio:  # 如果长宽比小于等于阈值,识别为矩形交通标志  
            print("Rectangular traffic sign detected")

要点解读:
首先导入所需的模块,并初始化摄像头。这里将像素格式设置为灰度图像。
设定形状特征参数,用于检测交通标志。这里设定了二值化阈值范围、最小面积阈值、最大面积阈值、圆形度阈值和长宽比阈值等参数。可以根据实际需求调整这些参数。
在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)

stop_sign_cascade = image.HaarCascade("stop_sign_cascade.xml")

while True:
    img = sensor.snapshot()
    objects = img.find_features(stop_sign_cascade, threshold=0.5, scale_factor=1.5)
    
    if objects:
        for obj in objects:
            img.draw_rectangle(obj)
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行停止标志检测。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
加载停止标志级联分类器文件stop_sign_cascade.xml。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_features()函数检测图像中的停止标志,使用停止标志级联分类器进行检测。
使用img.draw_rectangle()函数在图像上绘制检测到的停止标志的边框。
使用lcd.display()将处理后的图像实时显示在LCD上。

案例七:限速标志检测:

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)

speed_limit_cascade = image.HaarCascade("speed_limit_cascade.xml")

while True:
    img = sensor.snapshot()
    objects = img.find_features(speed_limit_cascade, threshold=0.5, scale_factor=1.5)
    
    if objects:
        for obj in objects:
            img.draw_rectangle(obj)
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行限速标志检测。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
加载限速标志级联分类器文件speed_limit_cascade.xml。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_features()函数检测图像中的限速标志,使用限速标志级联分类器进行检测。
使用img.draw_rectangle()函数在图像上绘制检测到的限速标志的边框。
使用lcd.display()将处理后的图像实时显示在LCD上。

案例八:禁止标志检测:

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)

prohibition_sign_cascade = image.HaarCascade("prohibition_sign_cascade.xml")

while True:
    img = sensor.snapshot()
    objects = img.find_features(prohibition_sign_cascade, threshold=0.5, scale_factor=1.5)
    
    if objects:
        for obj in objects:
            img.draw_rectangle(obj)
    
    lcd.display(img)

要点解读:
该程序使用OpenMV Cam的sensor、image和lcd模块进行禁止标志检测。
首先对摄像头进行初始化设置,包括像素格式、帧大小等。
初始化LCD显示屏,并设置显示窗口大小。
使用sensor.skip_frames()函数跳过一些帧以使感光度稳定。
加载禁止标志级联分类器文件prohibition_sign_cascade.xml。
在主循环中,使用sensor.snapshot()获取当前图像。
使用img.find_features()函数检测图像中的禁止标志,使用禁止标志级联分类器进行检测。
使用img.draw_rectangle()函数在图像上绘制检测到的禁止标志的边框。
使用lcd.display()将处理后的图像实时显示在LCD上。
这些示例程序使用级联分类器文件(如XML文件)对图像中的交通标志进行检测。它们通过在图像上绘制检测到的标志边框,提供实时的交通标志检测功能。要注意的是,级联分类器的性能取决于训练数据和参数设置,可以根据具体需求进行调整。此外,这些示例程序还包括摄像头和LCD的初始化设置,以及实时显示检测结果的功能。你可以根据自己的需求进行修改和扩展。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值