【雕爷学编程】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具有较高的实时性能,可以实时捕捉图像并进行颜色追踪。这使得它适合于需要快速响应和实时处理的应用场景,例如机器人导航、自动跟踪等。

简化开发:MicroPython编程语言简单易学,适合初学者和教育领域使用。OpenMV Cam提供了友好的编程接口和示例代码,使得颜色追踪的开发和调试变得更加简单和便捷。

应用场景:

机器人导航:在机器人导航中,颜色追踪可以用于识别特定颜色的标记或路标,从而帮助机器人进行定位和导航。例如,在机器人足球比赛中,可以通过识别特定颜色的球和球门来进行目标追踪和射门。

自动化控制:颜色追踪可以应用于自动化控制系统中,用于检测和追踪特定颜色的物体。例如,在流水线上,可以通过颜色追踪来定位和跟踪工件,实现自动化的物料处理和分拣。

教育和科研项目:OpenMV Cam作为教育和科研的工具,颜色追踪功能可以用于进行各种实验和教学示范。通过编写MicroPython代码实现颜色追踪,可以帮助学生理解图像处理、计算机视觉和机器学习等概念。

需要注意的事项:

光线条件:颜色追踪对光线条件敏感。不同的光线条件可能会对颜色的识别和追踪效果产生影响。在使用颜色追踪功能时,需要注意光线的均匀性和强度,以获得更准确的结果。

色彩校准:为了获得准确的颜色追踪结果,可能需要进行色彩校准。色彩校准可以帮助系统适应不同的光照条件和环境变化,提高颜色追踪的准确性和鲁棒性。

物体形状和背景:颜色追踪通常是基于物体的颜色信息进行的,因此物体的形状和背景可能会对追踪效果产生影响。在应用中,需要注意物体的形状和背景与所追踪颜色的区分度,以避免误判或追踪失败的情况。

总结来说,MicroPython的OpenMV Cam的颜色追踪功能可以识别和追踪指定颜色的物体,在机器人导航、自动化控制、教育和科研等领域具有广泛的应用。它具有颜色识别、实时性能和简化开发等主要特点。在使用时需要注意光线条件、色彩校准以及物体形状和背景等因素。颜色追踪功能可以帮助实现物体定位、导航和自动化控制等任务,同时也适用于教育和科研领域的实验和教学示范。

案例一:使用HSV颜色空间进行颜色追踪

import sensor, image, time
from pyb import HSV

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

while True:
    img = sensor.snapshot() # 捕获一帧图像
    hsv = img.to_hsv() # 将图像转换为HSV颜色空间
    if hsv[2] > 100: # 如果饱和度大于100
        img.draw_rectangle((50, 50, 100, 100), color=170, thickness=4) # 在图像上绘制一个矩形
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序首先导入了sensor、image、time和pyb.HSV模块。然后初始化摄像头,设置像素格式为RGB565,帧大小为320x240,并等待设置生效,延时2秒。接着进入一个无限循环,不断捕获摄像头的图像。每次捕获到图像后,将其转换为HSV颜色空间,并检查饱和度是否大于100。如果饱和度大于100,就在图像上绘制一个矩形,颜色为170(黄色)。最后延时100毫秒。

案例二:使用颜色阈值进行颜色追踪

import sensor, image, time
from pyb import THRESH_BINARY

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

threshold = (30, 100, 15, 127, 15, 127) # 设置颜色阈值

while True:
    img = sensor.snapshot() # 捕获一帧图像
    img.binary([threshold]) # 对图像进行二值化处理,根据颜色阈值进行分割
    if img.pixel(50, 50) == 1: # 如果(50, 50)位置的颜色值为1
        img.draw_rectangle((50, 50, 100, 100), color=170, thickness=4) # 在图像上绘制一个矩形
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序与第一个案例类似,只是使用了颜色阈值进行颜色追踪。首先导入了sensor、image、time和pyb.THRESH_BINARY模块。然后初始化摄像头,设置像素格式为RGB565,帧大小为320x240,并等待设置生效,延时2秒。接着定义了一个颜色阈值元组。在无限循环中,不断捕获摄像头的图像。每次捕获到图像后,对其进行二值化处理,根据颜色阈值进行分割。如果(50, 50)位置的颜色值为1,就在图像上绘制一个矩形,颜色为170(黄色)。最后延时100毫秒。

案例三:使用颜色距离进行颜色追踪

import sensor, image, time
from pyb import COLOR_RED, COLOR_GREEN, COLOR_BLUE, THRESH_BINARY

sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 设置像素格式为RGB565
sensor.set_framesize(sensor.QVGA) # 设置帧大小为320x240
sensor.skip_frames(time = 2000) # 等待设置生效,延时2秒

colors = {
    'red': (COLOR_RED, THRESH_BINARY),
    'green': (COLOR_GREEN, THRESH_BINARY),
    'blue': (COLOR_BLUE, THRESH_BINARY)
}

while True:
    img = sensor.snapshot() # 捕获一帧图像
    for color, threshold in colors.items():
        if img.get_pixel(50, 50)[color] > threshold: # 如果(50, 50)位置的当前颜色值大于阈值
            img.draw_rectangle((50, 50, 100, 100), color=170, thickness=4) # 在图像上绘制一个矩形
    time.sleep_ms(100) # 延时100毫秒

解读:这个程序与第二个案例类似,只是使用了颜色距离进行颜色追踪。首先导入了sensor、image、time和pyb.COLOR_RED、pyb.COLOR_GREEN、pyb.COLOR_BLUE和pyb.THRESH_BINARY模块。然后初始化摄像头,设置像素格式为RGB565,帧大小为320x240,并等待设置生效,延时2秒。接着定义了一个颜色字典,包含了红、绿、蓝三种颜色及其对应的阈值。在无限循环中,不断捕获摄像头的图像。每次捕获到图像后,遍历颜色字典,检查(50, 50)位置的当前颜色值是否大于阈值。如果大于阈值,就在图像上绘制一个矩形,颜色为170(黄色)。最后延时100毫秒。

案例四:单个颜色追踪:

import sensor
import image
import time

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

red_threshold = (30, 100, 15, 127, 15, 127)  # 设置红色阈值

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

    if blobs:
        for blob in blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
    
    time.sleep(10)

要点解读:
该程序使用OpenMV Cam的sensor模块和image模块进行颜色追踪。
使用sensor.reset()重置传感器设置。
使用sensor.set_pixformat(sensor.RGB565)设置像素格式为RGB565。
使用sensor.set_framesize(sensor.QVGA)设置帧大小为QVGA。
使用sensor.skip_frames(time=2000)跳过2秒钟的帧以使传感器稳定。
定义了一个红色阈值red_threshold,用于识别红色物体。阈值格式为(minR, maxR, minG, maxG, minB, maxB)。

在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()获取当前图像。
使用img.find_blobs([red_threshold])查找满足红色阈值的物体区域。
如果找到物体区域(blobs),则对每个区域进行以下操作:
使用img.draw_rectangle(blob.rect())在图像上绘制矩形框标记物体区域。
使用img.draw_cross(blob.cx(), blob.cy())在图像上绘制十字标记物体的中心位置。
使用time.sleep(10)延迟10毫秒,以控制循环的执行速率。

案例五:多个颜色追踪:

import sensor
import image
import time

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

red_threshold = (30, 100, 15, 127, 15, 127)  # 红色阈值
blue_threshold = (0, 30, 0, 64, 128, 255)    # 蓝色阈值

while True:
    img = sensor.snapshot()
    red_blobs = img.find_blobs([red_threshold])
    blue_blobs = img.find_blobs([blue_threshold])

    if red_blobs:
        for blob in red_blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
    
    if blue_blobs:
        for blob in blue_blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
    
    time.sleep(10)

要点解读:
该程序使用OpenMV Cam的sensor模块和image模块进行多个颜色的追踪。
与第一个示例类似,设置了传感器和图像参数,以及红色和蓝色的阈值。
在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()获取当前图像。
使用img.find_blobs([red_threshold])查找满足红色阈值的物体区域。
使用img.find_blobs([blue_threshold])查找满足蓝色阈值的物体区域。

如果找到红色物体区域(red_blobs),则对每个区域进行以下操作:
使用img.draw_rectangle(blob.rect())在图像上绘制矩形框标记物体区域。
使用img.draw_cross(blob.cx(), blob.cy())在图像上绘制十字标记物体的中心位置。
如果找到蓝色物体区域(blue_blobs),则对每个区域进行类似的操作。
使用time.sleep(10)延迟10毫秒,以控制循环的执行速率。

案例六:颜色追踪与位置输出:

import sensor
import image
import time

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

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

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

    if blobs:
        for blob in blobs:
            img.draw_rectangle(blob.rect())
            img.draw_cross(blob.cx(), blob.cy())
            print("Detected red object at X:%d, Y:%d" % (blob.cx(), blob.cy()))
    
    time.sleep(10)

要点解读:
该程序使用OpenMV Cam的sensor模块和image模块进行颜色追踪,并输出物体的位置信息。
与前两个示例类似,设置了传感器和图像参数,以及红色的阈值。

在一个无限循环中,使程序持续执行以下操作:
使用sensor.snapshot()获取当前图像。
使用img.find_blobs([red_threshold])查找满足红色阈值的物体区域。
如果找到物体区域(blobs),则对每个区域进行以下操作:
使用img.draw_rectangle(blob.rect())在图像上绘制矩形框标记物体区域。
使用img.draw_cross(blob.cx(), blob.cy())在图像上绘制十字标记物体的中心位置。
使用print()函数输出物体的位置信息,即物体的中心坐标。
使用time.sleep(10)延迟10毫秒,以控制循环的执行速率。

案例七:简单的颜色追踪程序

import sensor, image, time  
  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
threshold = (120, 255, 120, 255) # 设置颜色阈值,这里是绿色  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    blobs = img.find_blobs([threshold]) # 查找颜色块  
    if len(blobs) > 0: # 如果找到了颜色块  
        print(blobs[0].center()) # 打印颜色块中心坐标

要点解读:
首先初始化摄像头,设置像素格式和帧大小。
设置颜色阈值,这里使用的是RGB颜色空间,阈值为绿色。
在一个无限循环中,拍摄照片并查找颜色块。
如果找到了颜色块,则打印其中心坐标。

案例八:在LCD屏幕上显示颜色追踪结果

import sensor, image, time, lcd  
  
lcd.init() # 初始化LCD屏幕  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
threshold = (120, 255, 120, 255) # 设置颜色阈值,这里是绿色  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    blobs = img.find_blobs([threshold]) # 查找颜色块  
    if len(blobs) > 0: # 如果找到了颜色块  
        lcd.clear() # 清空LCD屏幕  
        lcd.draw_rectangle(blobs[0].rect(), lcd.COLOR_RED) # 在LCD屏幕上绘制颜色块边界框

要点解读:
首先初始化LCD屏幕和摄像头,设置像素格式和帧大小。
设置颜色阈值,这里使用的是RGB颜色空间,阈值为绿色。
在一个无限循环中,拍摄照片并查找颜色块。
如果找到了颜色块,则清空LCD屏幕并在其上绘制颜色块的边界框。使用draw_rectangle()函数绘制矩形。

案例九:使用颜色追踪控制机器人移动

import sensor, image, time, pyb, machine  
  
motor1 = machine.PWM(pyb.Pin('X1'), freq=100) # 初始化电机1引脚为PWM输出,频率为100Hz  
motor2 = machine.PWM(pyb.Pin('X2'), freq=100) # 初始化电机2引脚为PWM输出,频率为100Hz  
sensor.reset() # 初始化摄像头  
sensor.set_pixformat(sensor.RGB565) # 设置像素格式  
sensor.set_framesize(sensor.QVGA) # 设置帧大小  
sensor.skip_frames(time = 2000) # 等待摄像头稳定  
  
threshold = (120, 255, 120, 255) # 设置颜色阈值,这里是绿色  
speed = 1000 # 设置电机速度,这里是1000(占空比)  
  
while(True):  
    img = sensor.snapshot() # 拍摄照片  
    blobs = img.find_blobs([threshold]) # 查找颜色块  
    if len(blobs) > 0: # 如果找到了颜色块  
        x, y = blobs[0].center() # 获取颜色块中心坐标  
        if x < img.width() / 2: # 如果颜色块在图像左半部分  
            motor1.duty(speed) # 左电机前进  
            motor2.duty(0) # 右电机停止  
        else: # 如果颜色块在图像右半部分  
            motor1.duty(0) # 左电机停止  
            motor2.duty(speed) # 右电机前进  
    else: # 如果没有找到颜色块  
        motor1.duty(0) # 左电机停止  
        motor2.duty(0) # 右电机停止  
    time.sleep(100) # 延时100ms,以减少CPU的使用率

要点解读:
首先初始化电机引脚为PWM输出,并设置频率为100Hz。初始化摄像头,设置像素格式和帧大小。
设置颜色阈值,这里使用的是RGB颜色空间,阈值为绿色。设置电机速度,这里是1000(占空比)。
在一个无限循环中,拍摄照片并查找颜色块。如果找到了颜色块,则根据颜色块的位置控制电机前进或停止。如果没有找到颜色块,则两个电机都停止。使用duty()函数设置电机的占空比。
使用time.sleep()函数延时100ms,以减少CPU的使用率。

这些实际运用程序示例展示了如何使用MicroPython和OpenMV Cam进行颜色追踪。第一个示例演示了如何追踪单个颜色(红色),通过设置颜色阈值并使用img.find_blobs()进行物体检测。第二个示例展示了如何同时追踪多个颜色(红色和蓝色),通过设置不同的颜色阈值并分别使用img.find_blobs()进行物体检测。第三个示例展示了如何输出物体的位置信息,通过在图像上绘制矩形和十字标记,并使用print()函数输出物体的中心坐标。根据您的具体需求,您可以根据这些示例进行修改和扩展,以实现更复杂的颜色追踪功能和应用。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

驴友花雕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值