🎯 基于 OpenMV 的矩形识别与 STM32 串口通信(电子设计大赛实用教程)
一、前言
在本科生电子设计大赛中,经常会遇到图像识别相关的任务,例如:
- 识别 矩形框(如识别一个 A4 纸、黑色标记框等);
- 将识别结果传输到 STM32 单片机,用于后续控制(舵机、移动小车、机械臂等)。
很多同学会用 OpenMV 来做图像处理,因为它开箱即用、Python 脚本开发方便,能快速实现视觉任务。再配合 STM32,就能完成 感知 + 控制 的闭环。
今天我就带大家梳理一份完整的 OpenMV 矩形识别 + STM32 串口通信 的实例代码,并讲解核心思路,帮助大家快速上手。
二、整体思路
1. OpenMV 端(负责“看”)
- 使用摄像头拍摄画面。
- 利用
find_blobs()
方法寻找黑色区域,并筛选出符合 矩形特征 的目标。 - 计算矩形的 中心点坐标,并绘制出来。
- 将坐标通过 UART 串口 发给 STM32。
2. STM32 端(负责“动”)
- 接收 OpenMV 发来的坐标字符串。
- 解析坐标数据(例如
CENTER:160,120
)。 - 可以基于坐标进行舵机或电机的控制(例如居中跟踪)。
这样,OpenMV 负责 视觉识别,STM32 负责 运动控制,两者结合就能完成各种电子设计大赛任务。
三、OpenMV 代码详解
下面是完整的 OpenMV 代码(已加详细注释),功能:
👉 识别 A4 比例的矩形目标,并实时将中心点坐标通过串口发送给 STM32。
import sensor, image, time, math
from pyb import UART# ================== 初始化串口 ==================
uart = UART(3, 9600) # 使用 UART3,波特率 9600
uart.init(9600, bits=8, parity=None, stop=1)# ================== 初始化摄像头 ==================
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) # 关闭自动白平衡# ================== 参数设置 ==================
MIN_AREA = 2000 # 最小矩形面积
MAX_AREA = 40000 # 最大矩形面积
A4_RATIO = 1.414 # A4纸长宽比 √2
A4_RATIO_INV = 0.707 # 1/√2
RATIO_TOLERANCE = 0.6 # 长宽比容差# 黑色检测阈值(在 LAB 色彩空间)
BLACK_THRESHOLD = [(0, 30, -128, 127, -128, 127)]# ================== 判断矩形函数 ==================
def is_valid_rectangle(blob):rect = blob.rect()w, h