?? 基于 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