【雕爷学编程】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使用MicroPython编程语言,拥有简单易用的编程接口。它提供了丰富的颜色检测相关函数和方法,开发者可以通过编写简洁的代码实现颜色检测功能,无需深入了解底层图像处理算法。

实时性和低功耗:OpenMV Cam具备实时性和低功耗的特点。它采用高效的图像处理算法和硬件设计,能够在实时场景下进行快速的颜色检测,并且具有较低的功耗,适合应用于资源有限的嵌入式系统和移动设备。

应用场景:

机器人导航和定位:OpenMV Cam的颜色检测功能可应用于机器人导航和定位系统中。通过识别特定颜色的标志物或地标,机器人可以进行自主导航和定位,实现精准的路径规划和目标定位。

自动化控制和检测:OpenMV Cam的颜色检测功能可用于自动化控制和检测领域。例如,在流水线上,通过检测产品的特定颜色,可以实现自动分类、分拣和检测缺陷等任务。

教育和科研实验:OpenMV Cam的颜色检测功能可用于教育和科研实验中。学生和研究人员可以利用其简单易用的编程接口和实时颜色检测能力,进行图像处理和计算机视觉相关的教学和研究。

需要注意的事项:

光照条件:颜色检测对光照条件较为敏感,不同的光照条件可能导致颜色的变化。在使用OpenMV Cam进行颜色检测时,需要考虑光照的影响,并进行光照的校准和调整,以确保颜色检测的准确性和稳定性。

背景干扰:颜色检测可能受到背景干扰的影响。在实际应用中,背景中可能存在与目标颜色相似的元素,这可能导致误检或漏检。在开发中需要针对具体场景进行算法优化和参数调整,减少背景干扰的影响。

颜色选择和标定:颜色检测需要事先选择和标定目标颜色。选择合适的颜色范围和标定参数对于准确的颜色检测非常重要。在使用OpenMV Cam进行颜色检测时,需要根据实际需求选择适合的颜色范围,并进行标定和调试,以获得较好的检测效果。

总结来说,MicroPython的OpenMV Cam通过颜色感知和分析,提供了简单易用的颜色检测功能。它适用于机器人导航和定位、自动化控制和检测,以及教育和科研实验等应用场景。在使用时需要注意光照条件、背景干扰以及颜色选择和标定等因素。

案例1:使用OpenMV Cam进行颜色检测

解析:在这个案例中,我们使用OpenMV Cam来检测特定颜色的物体。首先,我们需要导入pyb模块,然后初始化摄像头对象。接着,我们循环捕获图像帧,并使用颜色过滤算法(如HSV颜色空间)来检测特定颜色的物体。最后,我们将检测到的物体位置显示在图像上。

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 定义颜色过滤函数
def color_filter(img, lower_red, upper_red):
    hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
    mask = cv2.inRange(hsv, lower_red, upper_red)
    return mask

# 主循环
while True:
    img = sensor.snapshot()
    mask = color_filter(img, (30, 100, 100), (70, 255, 255))
    # 在图像上绘制检测到的物体位置
    for i in range(mask.shape[0]):
        for j in range(mask.shape[1]):
            if mask[i, j]:
                cv2.circle(img, (j, i), 5, (0, 0, 255), -1)
    cv2.imshow('color detection', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

要点解读:在这个案例中,我们使用了颜色过滤算法来进行颜色检测。颜色过滤算法是一种基于颜色空间的颜色检测方法,它通过提取图像中的颜色特征来检测目标物体。我们还使用了OpenMV Cam的snapshot()函数来捕获图像帧,并使用cv2.circle()函数在图像上绘制检测到的物体位置。此外,我们还使用了OpenMV Cam的putText()函数将物体位置显示在图像上。

案例2:使用OpenMV Cam进行肤色检测

解析:在这个案例中,我们使用OpenMV Cam来检测人的肤色。首先,我们需要导入pyb模块,然后初始化摄像头对象。接着,我们循环捕获图像帧,并使用肤色检测算法(如YCrCb颜色空间)来检测人的肤色。最后,我们将检测到的肤色信息显示在图像上。

import sensor, image, time

# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)

# 定义肤色检测函数
def skin_detection(img):
    ycrcb = cv2.cvtColor(img, cv2.COLOR_RGB2YCrCb)
    # 在这里添加肤色检测算法
    # ...
    return skin_info

# 主循环
while True:
    img = sensor.snapshot()
    skin_info = skin_detection(img)
    # 在图像上绘制检测到的肤色信息
    cv2.putText(img, str(skin_info), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
    cv2.imshow('skin detection', img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

要点解读:在这个案例中,我们使用了肤色检测算法来进行肤色检测。肤色检测算法是一种基于颜色空间的颜色检测方法,它通过提取图像中的颜色特征来检测目标物体。我们还使用了OpenMV Cam的snapshot()函数来捕获图像帧,并使用cv2.putText()函数在图像上绘制检测到的肤色信息。此外,我们还使用了OpenMV Cam的putText()函数将肤色信息显示在图像上。

案例3:使用OpenMV Cam和颜色阈值实现红色物体检测

import sensor, image, time  
  
sensor.reset()  
sensor.set_pixformat(sensor.RGB565)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 200)  
  
threshold = (200, 255, 200)  # 红色颜色阈值  
line_thickness = 2  
  
while(True):  
    img = sensor.snapshot()  
    img.binary([threshold])  # 对图像进行颜色阈值处理  
    contours = img.find_contours()  # 查找轮廓  
    for contour in contours:  
        img.draw_rectangle(contour.rect(), line_thickness, color = (255, 0, 0))  # 在图像上绘制红色矩形框  
    print(img)

在这个程序中,我们使用了OpenMV Cam和颜色阈值实现了红色物体检测功能。首先,我们初始化了摄像头,并将其设置为RGB模式和QVGA分辨率。然后,我们设置了红色颜色阈值和线条粗细。进入循环后,我们不断获取摄像头的图像,使用颜色阈值处理查找红色物体。如果找到了红色物体,则在图像上绘制相应的矩形框。最后,我们将图像打印出来。需要注意的是,颜色阈值需要根据实际情况进行调整,以确保检测的准确性。

案例4:使用OpenMV Cam和颜色跟踪实现颜色块追踪

import sensor, image, time  
  
sensor.reset()  
sensor.set_pixformat(sensor.RGB565)  
sensor.set_framesize(sensor.QVGA)  
sensor.skip_frames(time = 200)  
  
threshold1 = (200, 255, 200)  # 红色颜色阈值1  
threshold2 = (0, 255, 200)  # 绿色颜色阈值2  
line_thickness = 2  
track_color = (255, 0, 0)  # 追踪颜色为红色  
track_threshold = 30  # 追踪阈值  
track_area_threshold = 100  # 追踪区域阈值  
  
while(True):  
    img = sensor.snapshot()  
    blobs = img.find_blobs([threshold1, threshold2], pixels_threshold=1000, area_threshold=1000, merge=True, margin=10)  # 在图像中查找红色和绿色颜色块  
    if blobs:  
        blob = max(blobs, key=lambda x: x.area())  # 找到面积最大的颜色块  
        if blob.area() > track_area_threshold:  # 判断颜色块面积是否大于追踪区域阈值  
            center_x = int(blob.center()[0])  
            center_y = int(blob.center()[1])  
            if abs(center_x - track_x) > track_threshold or abs(center_y - track_y) > track_threshold:  # 判断颜色块中心位置是否超过追踪阈值  
                track_x = center_x  
                track_y = center_y  
                img.draw_circle((track_x, track_y), 8, color=track_color)  # 在图像上绘制追踪圆点  
    print(img)

在这个程序中,我们使用了OpenMV Cam和颜色跟踪实现了颜色块追踪功能。首先,我们初始化了摄像头,并将其设置为RGB模式和QVGA分辨率。然后,我们设置了红色和绿色颜色阈值、线条粗细、追踪颜色、追踪阈值和追踪区域阈值。进入循环后,我们不断获取摄像头的图像,使用颜色阈值处理查找红色和绿色颜色块。如果找到了颜色块,则找到面积最大的颜色块,并判断其面积是否大于追踪区域阈值。如果是,则判断颜色块中心位置是否超过追踪阈值。如果是,则更新追踪位置,并在图像上绘制相应的圆点。最后,我们将图像打印出来。需要注意的是,颜色和位置阈值需要根据实际情况进行调整,以确保追踪的准确性。

案例5:目标颜色检测:

import sensor
import image
import time
import pyb

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

while True:
    img = sensor.snapshot()

    # 定义目标颜色范围
    target_color = (255, 0, 0)  # 蓝色

    # 进行颜色检测
    blobs = img.find_blobs([target_color])

    # 若检测到目标颜色
    if blobs:
        for blob in blobs:
            # 获取目标颜色区域的中心坐标
            center_x = blob.cx()
            center_y = blob.cy()
            print("Target detected at ({}, {})".format(center_x, center_y))

    print("FPS:", clock.fps())

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行颜色检测。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
定义目标颜色范围,例如蓝色。
使用img.find_blobs([target_color])进行颜色检测,返回检测到的目标颜色区域。
如果检测到目标颜色区域,可以进行进一步处理,例如获取目标区域的中心坐标,并进行相应的操作。

案例6:多颜色检测:

import sensor
import image
import time
import pyb

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

while True:
    img = sensor.snapshot()

    # 定义目标颜色范围
    color_ranges = [(30, 100, -64, -8, -32, 32),  # 红色
                    (0, 30, 0, 64, -128, 0)]     # 绿色

    # 进行多颜色检测
    blobs = []
    for color_range in color_ranges:
        blobs += img.find_blobs([color_range])

    # 若检测到目标颜色
    if blobs:
        for blob in blobs:
            # 获取目标颜色区域的中心坐标
            center_x = blob.cx()
            center_y = blob.cy()
            print("Target detected at ({}, {})".format(center_x, center_y))

    print("FPS:", clock.fps())

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行多颜色检测。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
定义多个目标颜色范围,例如红色和绿色。
使用img.find_blobs([color_range])进行多颜色检测,返回检测到的目标颜色区域。
如果检测到目标颜色区域,可以进行进一步处理,例如获取目标区域的中心坐标,并进行相应的操作。

案例7:颜色追踪:

import sensor
import image
import time
import pyb

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

motor_left = pyb.Pin('P7', pyb.Pin.OUT_PP)
motor_right = pyb.Pin('P8', pyb.Pin.OUT_PP)

while True:
    img = sensor.snapshot()

    # 定义目标颜色范围
    target_color = (255, 0, 0)  # 蓝色

    # 进行颜色检测
    blobs = img.find_blobs([target_color])

    # 若检测测到目标颜色
    if blobs:
        largest_blob = max(blobs, key=lambda b: b.area())
        center_x = largest_blob.cx()
        center_y = largest_blob.cy()

        # 根据目标位置控制电机运动
        if center_x < img.width() // 2:
            motor_left.high()
            motor_right.low()
        else:
            motor_left.low()
            motor_right.high()

    print("FPS:", clock.fps())

要点解读:
该程序使用OpenMV Cam的sensor和image模块进行颜色追踪。
在示例中,首先对摄像头进行初始化设置,包括像素格式、帧大小等。
在主循环中,使用sensor.snapshot()获取当前图像。
定义目标颜色范围,例如蓝色。
使用img.find_blobs([target_color])进行颜色检测,返回检测到的目标颜色区域。
如果检测到目标颜色区域,可以进行进一步处理,例如找到最大的目标区域,并根据目标位置控制电机运动。

这些示例代码演示了如何在MicroPython和OpenMV Cam中进行颜色检测的实际应用。可以根据具体需求,调整目标颜色范围、处理逻辑等,以适应不同的场景和应用。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值