Hello world
OpenMV H7 Plusimport csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # 等待画面稳定
csi0.auto_gain(False) # 固定增益,减少颜色变化
csi0.auto_whitebal(False) # 固定白平衡
# LAB 阈值:L 下限、L 上限、A 下限、A 上限、B 下限、B 上限
# 以下仅为起始值,请在现场光照下重新调整
thresholds = [
(30, 100, 15, 127, 15, 127), # 红色
(30, 100, -64, -8, -32, 32), # 绿色
]
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for blob in img.find_blobs(thresholds, pixels_threshold=200):
img.draw_rectangle(blob.rect, color=(255, 0, 0))
img.draw_cross((blob.cx, blob.cy)) # 标出色块中心
print(clock.fps(), "fps")
找到指定颜色的色块
按 LAB 阈值寻找红色、绿色区域,用矩形标出色块,用十字标出中心。
- 每组阈值依次是 L 最小值、L 最大值、A 最小值、A 最大值、B 最小值、B 最大值,不是 RGB 数值。
- 示例中的两组数值只是调试起点。保持现场光照,在 IDE 的阈值编辑器中选取目标颜色,再替换对应数值。
- pixels_threshold=200 会过滤匹配像素少于 200 的色块。改得更小能保留小目标,也容易把噪声留下。
动手前看一眼
先等画面稳定,再关闭自动增益和白平衡。换环境后重新调阈值;仅凭颜色检测不能保证识别到的就是某个特定物体。
import csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # 等待画面稳定
csi0.auto_gain(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# 遍历本帧检测到的二维码
for code in img.find_qrcodes():
img.draw_rectangle(code.rect, color=(255, 0, 0))
print(code.payload) # 输出二维码中的内容
print(clock.fps(), "fps")
读取二维码中的文字
对准二维码,检测成功后用红框标出位置,并把解码得到的内容打印到 IDE 终端。
- find_qrcodes() 使用内置解码器,不需要训练或模型文件。
- code.rect 是二维码的外接矩形,code.payload 是解码内容;5.0.1 使用属性读取,不在后面加括号。
- 同一张二维码停留在画面中时,每帧都可能再次输出。这份入门示例没有增加去重逻辑。
动手前看一眼
让二维码完整进入画面,保留白边并避免反光。若码点太密,先靠近或调整对焦,再考虑提高图像分辨率。
import csi
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.GRAYSCALE) # 条码检测使用灰度图
csi0.framesize(csi.VGA)
csi0.window((640, 80)) # 只扫描画面中央的窄条区域
csi0.snapshot(time=2000) # 等待画面稳定
csi0.auto_gain(False)
csi0.auto_whitebal(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
for code in img.find_barcodes():
img.draw_rectangle(code.rect, color=(0, 255, 0))
print(code.payload, "质量值:%d" % code.quality)
print(clock.fps(), "fps")
扫描一维条形码
从画面中央取一条灰度区域,读取常见一维条码,在终端显示内容与解码质量值。
- VGA 为 640 × 480,window((640, 80)) 只保留中央的 640 × 80 区域。让条码横向完整落在这条区域内。
- find_barcodes() 使用固件内置解码器,支持 EAN、UPC、Code 39、Code 128 等常见一维格式。
- code.payload 是条码内容,code.quality 是解码器给出的相对质量值,不是百分比。PDF417 不在这里的支持范围内。
动手前看一眼
让黑白条纹尽量竖直、左右留白完整,避免包装反光。窄窗口适合横放的条码;倾斜较大时,可增大窗口高度后再试。
import csi
import image
import math
import time
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000) # 等待曝光、增益和白平衡稳定
csi0.auto_gain(False)
csi0.auto_whitebal(False)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# H7 Plus 的 5.0.1 固件支持 TAG36H11 标签族
for tag in img.find_apriltags(families=image.TAG36H11):
img.draw_detection(tag, color1=(255, 0, 0),
color2=(0, 255, 0))
angle = math.degrees(tag.rotation) # 弧度转为角度
print("编号:%d,旋转:%.1f 度" % (tag.id, angle))
print(clock.fps(), "fps")
识别标签的位置与编号
把 TAG36H11 标签放到镜头前,在画面中标出标签,在终端查看编号和旋转角度。
- 使用固件内置的 AprilTag 检测器,不需要下载模型。H7 Plus 的此版本启用了 TAG36H11 标签族。
- 先采图等待 2 秒,再关闭自动增益和白平衡,让检测时的画面更稳定。
- rotation 返回弧度,math.degrees() 将其换算为角度。这里显示的是画面内旋转,不是已标定的实际距离。
动手前看一眼
使用清晰、完整的 TAG36H11 标签,保留四周白边。识别不到时,先调整距离和对焦,让标签在画面中足够大。
import csi
import time
import ml
from ml.postprocessing.mediapipe import BlazeFace
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.VGA)
csi0.window((400, 400)) # 取正方形窗口作为模型输入
csi0.snapshot(time=2000) # 等待画面稳定
# 加载固件内置的人脸检测模型
model = ml.Model(
"/rom/blazeface_front_128.tflite",
postprocess=BlazeFace(threshold=0.4),
)
clock = time.clock()
while True:
clock.tick()
img = csi0.snapshot()
# 每项结果依次为:矩形框、得分、六个关键点
for rect, score, keypoints in model.predict([img]):
img.draw_rectangle(rect, color=(0, 0, 255))
ml.utils.draw_keypoints(img, keypoints,
color=(255, 0, 0))
print(clock.fps(), "fps")
框出人脸与六个关键点
使用 H7 Plus 固件内置的 BlazeFace 模型,在画面中绘制人脸框和眼、鼻、嘴、耳部关键点。
- 从 /rom/blazeface_front_128.tflite 加载模型。官方 OPENMV4P 5.0.1 的 ROM 文件清单包含此文件。
- 从 VGA 画面取 400 × 400 的正方形窗口;predict([img]) 的每项结果包含矩形框、得分和关键点。
- threshold=0.4 是筛选检测结果的得分阈值。提高阈值会减少低分结果,也可能漏掉人脸。人脸检测不判断人物身份。
动手前看一眼
H7 Plus 使用 CPU 推理,实际速度以板上打印的 fps 为准。若提示找不到模型,请先确认板卡固件是 OPENMV4P 5.0.1,且 /rom 文件完整。
条形码 / 二维码生成
OpenMV H7 Plus正在加载生成器…
ⓘ 数字、英文字母和常用英文符号;自动选择 A/B/C 编码。