【雕爷学编程】MicroPython手册之 OpenMV Cam HSV颜色识别

在这里插入图片描述
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是一种在嵌入式系统上运行的Python编程语言版本,而OpenMV Cam则是一款基于MicroPython的开源机器视觉平台。OpenMV Cam提供了一套丰富的图像处理功能,其中包括HSV(色相、饱和度、亮度)颜色识别。

主要特点:

简化的编程接口:MicroPython语言易于学习和使用,使得开发者可以轻松地在OpenMV Cam上实现颜色识别功能。通过简单的代码,可以配置相机的设置、捕捉图像并进行基于HSV颜色空间的识别。

HSV颜色空间识别:HSV颜色空间是一种更直观和易于分析的颜色表示方法。它将颜色分为色相、饱和度和亮度三个维度,相对于RGB颜色空间来说,更适合用于颜色识别。OpenMV Cam提供了直接在HSV颜色空间下进行颜色识别的功能,可以通过设置阈值范围来筛选感兴趣的颜色。

实时性能:OpenMV Cam采用了高性能的图像传感器和处理器,能够在实时场景中进行快速的图像处理和颜色识别。这使得它在需要实时反馈的应用场景中具有优势,比如机器人导航、自动化生产线和智能监控等。

应用场景:

机器人导航:OpenMV Cam可以用于机器人导航中的颜色识别。通过检测特定颜色的标志物或标记,机器人可以确定自己的位置、方向或执行特定任务。

自动化生产线:在自动化生产线上,OpenMV Cam可以用于颜色识别来检测产品的状态或执行质量控制。它可以识别产品上的特定颜色标记,以判断产品是否符合要求或者需要进行进一步处理。

智能监控:OpenMV Cam可以用于智能监控系统中的颜色识别。通过识别特定颜色的物体,如人或车辆,可以实现入侵检测、交通流量统计等功能。

需要注意的事项:

色彩环境:HSV颜色识别对于环境光线的变化比较敏感,因此在使用OpenMV Cam进行颜色识别时,需要注意环境光照的影响。光线强烈或阴暗的情况下,颜色识别的准确性可能会下降。

阈值设置:OpenMV Cam的颜色识别功能需要设置适当的HSV阈值范围。阈值的选择对于识别结果的准确性至关重要。需要根据具体应用场景和对象的颜色特征进行调整。

物体形状和尺寸:OpenMV Cam的颜色识别是基于像素级别的图像处理,对于物体的形状和尺寸并不敏感。如果应用场景需要考虑物体的形状和尺寸信息,可能需要进一步的图像处理算法。

总结起来,MicroPython的OpenMV Cam提供了基于HSV颜色识别的图像处理功能,具有简化的编程接口、实时性能和广泛的应用场景。使用时需要注意光照环境、阈值设置和物体形状尺寸等因素,以确保颜色识别的准确性和可靠性。

案例一:实时捕获并显示彩色图像


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)

clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    # 将图像转换为HSV格式
    img = img.to_colorspace(sensor.HSV)
    # 获取图像中的最大和最小值以及对应的坐标
    h, s, v = img.get_hsv()
    x, y = img.get_rect()
    # 在图像上绘制最大和最小值对应的颜色矩形
    img.draw_rectangle(x, y, x+10, y+10, fill=(255, 0, 0))
    img.draw_rectangle(x, y, x+10, y+10, fill=(0, 255, 0))
    img.draw_rectangle(x, y, x+10, y+10, fill=(0, 0, 255))
    # 显示图像
    lcd.display(img)

解读:这个程序首先初始化摄像头,设置图像格式、尺寸、增益和白平衡。然后在一个无限循环中,不断捕获图像并将其转换为HSV格式。接着,获取图像中的最大和最小值以及对应的坐标,并在图像上绘制这些颜色的矩形。最后,显示处理后的图像。

案例二:检测特定颜色的物体

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)

clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()
    # 将图像转换为HSV格式
    img = img.to_colorspace(sensor.HSV)
    # 获取图像中的最大和最小值以及对应的坐标
    h, s, v = img.get_hsv()
    x, y = img.get_rect()
    # 判断当前像素是否为特定颜色(例如红色)
    if v > 100:
        img.draw_rectangle(x, y, x+10, y+10, fill=(255, 0, 0))
    # 显示图像
    lcd.display(img)

解读:这个程序与第一个案例类似,但在处理图像时,增加了一个条件判断,用于检测特定颜色的物体。在这个例子中,我们检测红色物体。如果当前像素的亮度值大于100,我们认为它是红色的,并在图像上绘制一个红色的矩形。

案例三:根据颜色识别进行目标跟踪

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)

clock = time.clock()
tracker = None

while(True):
    clock.tick()
    img = sensor.snapshot()
    # 将图像转换为HSV格式
    img = img.to_colorspace(sensor.HSV)
    # 获取图像中的最大和最小值以及对应的坐标
    h, s, v = img.get_hsv()
    x, y = img.get_rect()
    # 如果跟踪器不存在,则创建一个新的跟踪器
    if tracker is None:
        tracker = image.ImageTrackerLowLevel(img.width(), img.height())
        tracker.init(img.get_rect())
    # 更新跟踪器的位置
    tracker.update((x, y))
    # 在图像上绘制跟踪器的边框
    img.draw_rectangle(tracker.rect())
    # 根据颜色识别进行目标跟踪
    if v > 100:
        # 如果当前像素是特定颜色(例如红色),则跟踪该像素
        tracker.start_tracking(image.ImageTrackerCSRT::COLOR)
    else:
        # 否则,停止跟踪该像素
        tracker.stop_tracking()
    # 显示图像
    lcd.display(img)

解读:这个程序与前两个案例类似,但在处理图像时,增加了一个跟踪器对象。当检测到特定颜色的物体时,我们开始跟踪该像素;否则,停止跟踪。这样,我们可以实现根据颜色识别进行目标跟踪的功能。

案例四:颜色识别计数器

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待设置生效  
  
threshold = (100, 100, 100, 255) # 设置HSV颜色阈值  
  
while(True):  
    img = sensor.snapshot() # 拍摄图像  
    img.hsv() # 将图像转换为HSV格式  
    mask = img.get_threshold(threshold) # 应用阈值得到掩码  
    for contour in mask.contours():  
        img.draw_rectangle(contour.rect(), color = (255, 0, 0), thickness = 2) # 在矩形区域上画红色边框  
        img.draw_text(str(len(mask.contours())), (10, 10), color = (0, 0, 255), font_size = 14) # 显示矩形数量  
        sensor.snapshot().show() # 显示结果

这个程序通过设定HSV颜色阈值来识别图像中的特定颜色,并对满足阈值的区域进行计数。在每个区域上画一个红色边框,并在图像左上角显示区域的数量。

案例五:颜色跟踪器

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待设置生效  
  
threshold = (100, 100, 100, 255) # 设置HSV颜色阈值  
  
while(True):  
    img = sensor.snapshot() # 拍摄图像  
    img.hsv() # 将图像转换为HSV格式  
    mask = img.get_threshold(threshold) # 应用阈值得到掩码  
    contour = mask.largest_contour() # 获取最大轮廓  
    if contour:  
        rect = contour.rect() # 获取矩形区域  
        img.draw_rectangle(rect, color = (255, 0, 0), thickness = 2) # 在矩形区域上画红色边框  
        sensor.snapshot().show() # 显示结果

这个程序与上一个类似,但它只识别最大的满足阈值的区域,并在该区域上画一个红色边框。它可以在视频流中实时跟踪特定颜色的物体。

案例六:色块检测器

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待设置生效  
  
threshold = (100, 100, 100, 255) # 设置HSV颜色阈值  
  
while(True):  
    img = sensor.snapshot() # 拍摄图像  
    img.hsv() # 将图像转换为HSV格式  
    mask = img.get_threshold(threshold) # 应用阈值得到掩码  
    for contour in mask.contours():  
        rect = contour.rect() # 获取矩形区域  
        avg_color = img.get_color(rect) # 获取矩形区域的平均颜色  
        if avg_color[0] > 120 or avg_color[1] > 120 or avg_color[2] < 80: # 如果颜色偏绿或偏蓝,则认为是色块  
            img.draw_rectangle(rect, color = (255, 0, 0), thickness = 2) # 在矩形区域上画红色边框  
    sensor.snapshot().show() # 显示结果

这段代码的作用是检测图像中特定颜色的色块,并在每个色块上画一个红色边框。HSV颜色阈值可以通过修改threshold变量来调整。如果某个区域的平均颜色偏绿或偏蓝,就会被认为是色块。如果需要进一步调整色块检测的准确性,可以尝试调整HSV颜色阈值或修改判断色块的条件。

案例七:简单颜色识别:

import sensor
import image

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

red_threshold = (30, 100, 15, 127, 15, 127)  # HSV阈值

while True:
    img = sensor.snapshot()
    img.binary([red_threshold])
    blobs = img.find_blobs([red_threshold])

    if blobs:
        for b in blobs:
            img.draw_rectangle(b.rect())
            img.draw_cross(b.cx(), b.cy())

要点解读:
通过sensor模块设置OpenMV Cam的配置,如图像格式、帧大小等。
设置颜色阈值red_threshold,该阈值用于指定要识别的颜色范围。这里使用了HSV颜色空间的阈值。
在循环中,获取图像快照并将其转换为二值图像,通过binary函数根据颜色阈值进行二值化处理。
使用find_blobs函数查找二值图像中的色块(颜色区域)。
如果找到色块,则在图像上绘制矩形和十字形标记。

案例八:颜色追踪与反馈:

import sensor
import image
import time
from pyb import LED

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

red_threshold = (30, 100, 15, 127, 15, 127)  # HSV阈值
led = LED(1)  # 初始化LED(可选)

while True:
    img = sensor.snapshot()
    img.binary([red_threshold])
    blobs = img.find_blobs([red_threshold])

    if blobs:
        most_pixels = 0
        largest_blob = None
        for blob in blobs:
            if blob.pixels() > most_pixels:
                most_pixels = blob.pixels()
                largest_blob = blob

        img.draw_rectangle(largest_blob.rect())
        img.draw_cross(largest_blob.cx(), largest_blob.cy())

        # 根据色块位置调整反馈
        if largest_blob.cx() < 100:
            print("Turn left")
            # 在此处执行反馈动作,如控制电机转向等
            led.on()  # 亮起LED(可选)
        elif largest_blob.cx() > 220:
            print("Turn right")
            # 在此处执行反馈动作,如控制电机转向等
            led.off()  # 关闭LED(可选)

要点解读:
除了颜色识别部分与第一个案例类似外,这个程序还添加了反馈机制。
使用for循环遍历所有检测到的色块,并找到最大的色块。
在图像上绘制最大色块的矩形和十字形标记。
根据最大色块的位置进行反馈。如果色块的中心位置在特定范围内,执行相应的动作,如打印信息、控制LED灯、控制电机等。

案例九:多颜色识别与分类:

import sensor
import image
import time

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)

color_thresholds = [
    (30, 100, 15, 127, 15, 127),  # 红色阈值
    (70, 100, -64, -8, -32, 32),  # 绿色阈值
    # 可以继续添加更多的颜色阈值
]

while True:
    img = sensor.snapshot()

    for i, threshold in enumerate(color_thresholds):
        blobs = img.find_blobs([threshold])

        if blobs:
            for blob in blobs:
                img.draw_rectangle(blob.rect())
                img.draw_cross(blob.cx(), blob.cy())
                print("Detected color", i+1)

    time.sleep(100)
  • 在这个案例中,添加了一个包含多个颜色阈值的列表color_thresholds,每个阈值对应一种颜色。
  • 在循环中,对每个颜色阈值进行颜色识别。
  • 对于每个阈值,使用find_blobs函数查找图像中的色块,并将这些色块与相应的颜色关联起来。
  • 对于每个检测到的色块,可以执行相应的操作,如在图像上绘制矩形和十字形标记,或执行特定的反馈动作。以上提供的代码仅为参考,实际应用中可能需要根据具体需求进行适当的调整和修改。此外,OpenMV Cam还提供了许多其他功能和API,可以根据具体情况进行进一步探索和利用。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值