OpenMV是专为机器视觉设计的微控制器,内置摄像头和图像处理芯片,可以直接运行Python视觉程序。配合小车底盘,就可以做出一台会追踪目标的智能小车。
一、硬件准备
OpenMV H7 Plus(或OpenMV Cam M7) × 1
二轮或四轮小车底盘 × 1
L298N电机驱动模块 × 1
Arduino或STM32(作为下位机执行电机控制)
OpenMV的串口连接下位机
7.4V锂电池
二、接线方式
OpenMV通过串口(UART3:P4=TX,P5=RX)与下位机通信:
OpenMV P4(TX) → 下位机 RX
OpenMV P5(RX) → 下位机 TX
注意电平匹配:OpenMV H7 Plus为3.3V电平,可直接接Arduino(5V也能识别)。如果是STM32则完全兼容。
三、OpenMV颜色追踪程序
# OpenMV 红色目标追踪程序
import sensor, image, time
from pyb import UART
# 初始化摄像头
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
sensor.skip_frames(time=2000)
sensor.set_auto_gain(False) # 关闭自动增益,颜色更稳定
sensor.set_auto_whitebal(False)
# 初始化串口(P4 TX, P5 RX)
uart = UART(3, 9600)
# 定义红色阈值(LAB色彩空间)
# 需要在OpenMV IDE中调试确定具体数值
red_threshold = (30, 100, 15, 127, -10, 127)
# 图像中心横坐标
IMG_CENTER_X = 160
clock = time.clock()
while(True):
clock.tick()
img = sensor.snapshot()
# 寻找红色色块
blobs = img.find_blobs([red_threshold], pixels_threshold=50, area_threshold=50)
if blobs:
# 取最大的色块
largest_blob = max(blobs, key=lambda b: b.area())
# 在图像上画框
img.draw_rectangle(largest_blob.rect())
img.draw_cross(largest_blob.cx(), largest_blob.cy())
# 计算偏差
error = largest_blob.cx() - IMG_CENTER_X
# 根据偏差发送控制指令
if abs(error) < 20:
cmd = "F\n" # 正对目标,前进
elif error > 0:
cmd = "R\n" # 目标偏右,右转
else:
cmd = "L\n" # 目标偏左,左转
else:
cmd = "S\n" # 没找到目标,停止/搜索
uart.write(cmd)
print(cmd.strip())
四、下位机电机控制代码
下位机接收串口指令,解析后控制电机。指令格式沿用蓝牙遥控的字符指令:F前进、B后退、L左转、R右转、S停止。
这里可以用之前蓝牙遥控那篇文章的Arduino代码,或者用STM32的串口中断接收代码。
五、调试颜色阈值
颜色阈值是OpenMV追踪的关键。在OpenMV IDE中:
1. 打开工具 → 机器视觉 → 阈值编辑器。
2. 将摄像头对准要追踪的颜色目标(红色小球、绿色标志物等)。
3. 在阈值编辑器中调整LAB三个通道的上下限,直到图像中只选中目标颜色。
4. 将得到的阈值填入代码。
不同光线环境下阈值可能需要重新调整,建议在目标使用场景的光线下进行调试。
六、常见问题
Q:颜色追踪不稳定,目标丢失?
A:光线变化会影响颜色识别。建议在固定光线环境下使用,或者使用自动曝光但关闭自动白平衡。
Q:小车追目标时左右震荡?
A:偏差死区(代码里的20像素)可以适当调大。也可以在控制中加入PID,让转向量随偏差大小渐变。

微信联系
淘宝联系