OpenMV 简示例代码模板 + 入门学习路线

单片机/PLC wes 18 hours ago (2026-07-30) 13 views
📑 本文导航

简介

本文通过一些简单的示例代码来介绍OpenMV入门开发开发应用。

固件建议:使用最新稳定固件;IDE 和固件版本保持一致;OpenMV4‑H7 R2 直接复制运行,其他型号按需微调分辨率。 开发板默认串口:UART1,引脚 P4 (TX)、P5 (RX);3.3V 电平,接 STM32/Arduino 记得共地。

前置说明

  1. 打开 OpenMV‑IDE → 文件→示例脚本,官方自带海量例程。
  2. 调颜色阈值:IDE 顶部「工具‑机器视觉阈值编辑器」,框选目标物体,直接复制 HSV 阈值代码。
  3. 所有例程可以直接保存到板子,脱机运行

例程 1:颜色色块识别 find_blobs(竞赛最常用,循迹、颜色追踪)

功能:识别指定颜色色块,输出色块坐标、大小;串口把坐标发送给单片机。
python
# 颜色识别基础模板 find_blobs
import sensor, image, time, pyb
# 串口初始化 UART1 P4 TX P5 RX
uart = pyb.UART(1, 115200)
# 摄像头初始化
sensor.reset()
sensor.set_pixformat(sensor.RGB565) #彩色图像
sensor.set_framesize(sensor.QVGA) #320×240,速度最快,竞赛首选
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) #关闭自动增益!颜色识别必关
sensor.set_auto_whitebal(False) #关闭自动白平衡!颜色识别必关
clock = time.clock()
# ========== HSV阈值,用IDE阈值编辑器获取 ==========
# (Lmin,Lmax, Amin,Amax,Bmin,Bmax)
red_threshold = (10, 80, 20, 127, 0, 127)
while(True):
 clock.tick()
 img = sensor.snapshot()
 # find_blobs(阈值,像素过滤,合并相邻色块)
 blobs = img.find_blobs([red_threshold], pixels_threshold=20, area_threshold=20, merge=True)
 if blobs:
 #取面积最大色块
 max_blob = max(blobs, key=lambda b: b.pixels())
 #画出色块框和中心十字,方便调试观察
 img.draw_rectangle(max_blob.rect())
 img.draw_cross(max_blob.cx(), max_blob.cy())
 cx = max_blob.cx() #色块中心X坐标 0~319
 cy = max_blob.cy() #色块中心Y坐标 0~239
 w = max_blob.w()
 h = max_blob.h()
 #打印到IDE控制台
 print("cx:%d, cy:%d, w:%d, h:%d"%(cx,cy,w,h))
 #串口发送字符串,单片机解析
 uart.write("%d,%d\r\n"%(cx, cy))
 #print(clock.fps()) #打印帧率
实战要点:
  • set_auto_gain(False)set_auto_whitebal(False)必须关闭,光线一变阈值直接失效。
  • pixels_threshold过滤噪点小色块,环境噪声大就调大。
  • ROI 用法:img.find_blobs(..., roi=(x,y,w,h))只处理画面一小块,提高速度。

ROI 使用示例片段(只看画面下半部分,小车巡线)

python
roi = (0,160,320,80) #x起点,y起点,宽,高,只看图片底部
blobs = img.find_blobs([red_threshold], roi=roi, pixels_threshold=20, area_threshold=20, merge=True)

例程 2:AprilTag 标签识别(定位、角度、距离,电赛高频)

使用 36h11 标签库,网上直接打印 AprilTag36h11 标签。输出 ID、x/y/z 平移、旋转角度。
python
import sensor, image, time, pyb
uart = pyb.UART(1,115200)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(2000)
clock = time.clock()
# 镜头参数,OpenMV4‑H7 R2默认参数,换镜头必须修改
f_x = (2.8 / 3.984) * 160
f_y = (2.8 / 2.952) * 120
c_x = 160 * 0.5
c_y = 120 * 0.5
while(True):
 clock.tick()
 img = sensor.snapshot()
 #apriltag36h11家族
 tags = img.find_apriltags(fx=f_x, fy=f_y, cx=c_x, cy=c_y)
 for tag in tags:
 img.draw_rectangle(tag.rect(), color = (255,0,0))
 img.draw_cross(tag.cx(), tag.cy(), color=(0,255,0))
 tag_id = tag.id()
 tx = tag.x_translation()
 ty = tag.y_translation()
 tz = tag.z_translation()
 rot = tag.rotation()
 print("ID:%d X:%.2f Y:%.2f Z:%.2f Rot:%.2f"%(tag_id,tx,ty,tz,rot))
 uart.write("T:%d,%.2f,%.2f,%.2f\r\n"%(tag_id,tx,ty,tz))
 #print(clock.fps())
注意:更换镜头必须修改镜头内参,否则距离角度计算不准。

例程 3:QR 二维码识别

python
import sensor, image, time, pyb
uart = pyb.UART(1,115200)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(2000)
while(True):
 img = sensor.snapshot()
 codes = img.find_qrcodes()
 if codes:
 data = codes[0].payload()
 print(data)
 uart.write(data+"\r\n")
 img.draw_rectangle(codes[0].rect())

例程 4:串口简单通信协议说明(和 STM32/Arduino 对接)

上面示例使用简单文本协议,格式示例:160,120\r\n 单片机接收逻辑:
  1. 串口接收缓冲区读到 \r\n代表一帧结束
  2. 按逗号分割字符串,转数字得到 cx、cy。
不建议用 I2C 大量传输图像数据,容易卡顿;实时项目优先 UART 115200。

OpenMV 硬件串口引脚

  • UART1:P4 (TX),P5 (RX) 最常用
  • UART2:P1(TX),P0(RX)  3y4.net
通信必须共地!GND 接到单片机 GND,否则数据乱码。

OpenMV 完整入门学习路线(由浅入深)

阶段 1:基础环境搭建(1‑2 天)

  1. 安装 OpenMV‑IDE,安装对应固件,完成板子连接、图片预览。
  2. 学会 IDE 工具:阈值编辑器、帧缓冲区、截图。
  3. MicroPython 基础语法:变量、循环、if、简单串口操作。
OpenMV 只是硬件,语法就是 MicroPython,不需要学完整 Python。

阶段 2:熟悉硬件(1 天)

  • 供电、引脚定义;3.3V IO;全局快门 vs 卷帘快门区别;镜头更换。
  • 学会使用 LED、定时器、PWM、串口。
OpenMV不适合驱动电机,识别交给外部单片机控制电机。

阶段 3:核心视觉 API 练习(重中之重,3‑7 天)

按顺序练习官方示例:
  1. find_blobs 色块识别(最重要,掌握 HSV、关闭自动增益白平衡、ROI)
  2. 形状检测:直线、圆、轮廓
  3. AprilTag 标签识别(理解坐标系、平移旋转)
  4. QR / 条形码识别
  5. 图像预处理:二值化、滤波、裁剪、绘图
  6. 帧差分运动检测
练习任务:做一个颜色追踪,串口输出坐标;做 AprilTag 识别输出位置。

阶段 4:实战工程优化(竞赛必学)

  1. 降噪:像素阈值过滤、ROI 局部处理、降低分辨率提升帧率
  2. 光照问题:固定曝光,增加外部补光灯;避免强光直射镜头
  3. 通信协议设计:串口收发数据,和外部单片机联调
  4. 异常处理:识别不到目标时代码不能卡死,要有默认值
python
#识别不到色块保护示例
if blobs:
 cx = max_blob.cx()
else:
 cx = -1 #识别不到输出‑1,单片机判断‑1代表无目标

阶段 5:进阶方向

  1. FOMO 轻量 AI 目标检测,训练自己数据集(OpenMV N6/AE3 硬件 NPU 效果最好,H7 性能有限)
  2. 模板匹配 find_template(),识别固定图案数字
  3. SD 卡保存图片日志
  4. Mavlink 对接无人机飞控

阶段 6:做完整项目

智能车循迹、颜色分拣机械臂、AprilTag 定位小车。

高频踩坑清单

  1. ❗颜色识别漂移:忘记关闭自动增益、自动白平衡。
  2. ❗数据乱码:单片机和 OpenMV 没有共地。
  3. ❗运动物体识别错位:买错卷帘快门型号;竞赛高速运动必须 H7‑R2 全局快门。
  4. ❗帧率很低:用高分辨率做实时识别,优先 QVGA。
  5. ❗内存溢出:不要一直拍照保存图片不释放,H7 内存只有 1MB。
  6. ❗镜头更换后 AprilTag 距离不准:没有修改镜头内参。
  7. ❗光照一变识别失效:算法解决不了光照,优先硬件加补光遮光结构。