基于OpenMV的颜色追踪与串口通信

引言

        在现代嵌入式系统中,视觉处理技术扮演着越来越重要的角色。OpenMV摄像头模块以其低成本、高性能的特点,广泛应用于机器人、无人机、智能家居等领域。本文将介绍如何使用OpenMV摄像头进行颜色追踪,并通过串口将追踪到的目标位置信息发送给外部设备。

硬件准备

  1. OpenMV摄像头模块:本文使用的是OpenMV H7 Plus,它具有强大的图像处理能力和丰富的接口。

  1. USB线:用于连接OpenMV摄像头到计算机,进行程序烧录和调试。

  1. 外部设备:如Arduino、STM32等,用于接收OpenMV通过串口发送的数据。

软件环境

  1. OpenMV IDE:用于编写、调试和烧录OpenMV的Python代码。

  1. Python:OpenMV使用MicroPython作为其编程语言,因此需要对Python有一定的了解。

代码实现

以下是实现颜色追踪并通过串口发送数据的Python代码:

1. 导入模块

python

import sensor, image, time
from pyb import UART
  • sensor: 用于初始化和配置摄像头。
  • image: 用于图像处理和颜色识别。
  • time: 用于添加延迟,控制循环速度。
  • from pyb import UART

    • from pyb import UART 语句用于从 pyb 库中导入 UART 模块。这意味着我们可以在代码中直接使用 UART 类,而不需要每次都写 pyb.UART
  • UART 类

    • UART 类提供了对UART接口的控制和操作。通过实例化 UART 类,我们可以配置和使用UART接口进行数据的发送和接收。

2.串口初始化

python

uart = UART(3, 9600)

       这里我们初始化了串口,使用的是UART3,波特率为9600。

3.颜色阈值设置

python

red_threshold = (25, 100, -116, 127, 23, 127)

通过设置LAB颜色空间的阈值,我们可以定义要追踪的颜色范围。在这个例子中,我们追踪的是红色。

可以使用OpenMV IED 软件里的工具,机器视觉,阈值编辑器,将需要识别的颜色白覆盖

4.摄像头初始化

python

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False)
sensor.set_auto_whitebal(False)
  • sensor.reset(): 重置摄像头,确保其处于初始状态。
  • sensor.set_pixformat(sensor.RGB565): 设置图像的像素格式为 RGB565,即每个像素使用 16 位表示,其中 5 位用于红色,6 位用于绿色,5 位用于蓝色。
  • sensor.set_framesize(sensor.QVGA): 设置图像的分辨率为 QVGA,即 320x240 像素。
  • sensor.skip_frames(time=2000): 跳过一些帧,使图像稳定。time=2000 表示跳过 2000 毫秒(2 秒)的帧。

5.帧率追踪

python      

clock = time.clock()
  • 我们使用time.clock()来追踪帧率,以便在调试时了解程序的运行效率。

6.最小色块面积阈值

MIN_BLOB_AREA = 100
  • 我们设置了一个最小色块面积阈值,只有面积大于这个阈值的色块才会被处理。

7.主循环

while True:
    clock.tick()
    img = sensor.snapshot()
    blobs = img.find_blobs([red_threshold])
    if blobs:
        for b in blobs:
            if b.pixels() > MIN_BLOB_AREA:
                img.draw_rectangle(b.rect(), color=(255, 0, 0))
                img.draw_cross(b.cx(), b.cy(), color=(255, 0, 0))
                data = "%d,%d\n" % (b.cx(), b.cy())
                uart.write(data)
    print(clock.fps())
    print(data)

在主循环中,我们不断获取图像,查找符合颜色阈值的色块,并在图像上绘制矩形框和中心点十字。如果色块的面积大于设定的最小阈值,我们将色块的中心坐标通过串口发送出去。最后,我们打印帧率和发送的数据,以便调试。

8.完整程序

import sensor, image, time
from pyb import UART

# 初始化串口,波特率为115200
uart = UART(3, 9600)

# 颜色追踪的例子,一定要控制环境的光,保持光线是稳定的。
red_threshold = (25, 100, -116, 127, 23, 127)
# 设置红色的阈值,括号里面的数值分别是L A B 的最大值和最小值(minL, maxL, minA,
# maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需
# 设置(min, max)两个数字即可。

sensor.reset()  # 初始化摄像头
sensor.set_pixformat(sensor.RGB565)  # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA)  # 使用 QQVGA 速度快一些
sensor.skip_frames(time=2000)  # 跳过2000ms,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False)  # 关闭自动增益。在颜色识别中,一定要关闭自动增益。
sensor.set_auto_whitebal(False)  # 关闭白平衡。在颜色识别中,一定要关闭白平衡。

clock = time.clock()  # 追踪帧率

MIN_BLOB_AREA = 100  # 最小色块面积阈值

while True:
    clock.tick()  # 记录时间以追踪帧率
    img = sensor.snapshot()  # 从感光芯片获得一张图像

    blobs = img.find_blobs([red_threshold])

    if blobs:
        for b in blobs:
            if b.pixels() > MIN_BLOB_AREA:
                img.draw_rectangle(b.rect(), color=(255, 0, 0))  # 画出矩形框
                img.draw_cross(b.cx(), b.cy(), color=(255, 0, 0))  # 画出中心点十字

                # 通过串口发送色块中心的位置
                data = "%d,%d\n" % (b.cx(), b.cy())
                uart.write(data)

    # 打印帧率
   # print(clock.fps())
    print(data)

实验与调试

  1. 环境准备

    • 确保OpenMV摄像头和外部设备通过串口连接。
    • 调整环境光线,确保光线稳定,以提高颜色识别的准确性。
  2. 运行代码

    • 将代码烧录到OpenMV摄像头中,并运行。
    • 观察OpenMV IDE中的图像输出,确保颜色识别和绘制矩形框、中心点十字的功能正常。
  3. 串口通信测试

    • 使用串口调试工具(如PuTTY)监听外部设备的串口,确保能够接收到OpenMV发送的坐标数据。

视频展示

看左下角X,Y轴数据,这是Openmv通过串口走的格式

基于OpenMV的颜色追踪与串口通信

结论

通过本文的介绍和代码实现,我们展示了如何使用OpenMV摄像头进行颜色追踪,并通过串口将追踪到的目标位置信息发送给外部设备。这种方法在机器人导航、目标追踪等应用中具有广泛的应用前景。通过调整颜色阈值和环境光线,可以进一步提高颜色识别的准确性和稳定性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值