教程基于CanMV_K230_YAHBOOM_micropython_v1.8-13固件,跑OpenCV案例需要micropython_v1.8以上的固件
K230 上有两套视觉处理方案:cv_lite 和 cv2(OpenCV)。它们的关系和选择逻辑:
| cv_lite | cv2 (OpenCV) | |
|---|---|---|
| 调用方式 | 单个函数完成整个算法链 | 多步自由组合 |
| 典型代码 | cv_lite.rgb888_find_blobs(img, thr, area, ksize) | cvtColor → GaussianBlur → Canny → findContours |
| 灵活性 | 低(每个函数是黑盒) | 高(每一步可控可替换) |
| 可调试性 | 难(中间结果不可见) | 易(每步都能显示出来看) |
| 功能广度 | 约 15 个原子操作 | 50+ 标准 OpenCV 函数 |
| 学习价值 | 硬件厂商绑定 | 通用技能,和桌面 OpenCV 一致 |
| 适用场景 | 快速验证硬件、单一任务产线 | 算法开发、学习、原型验证 |
1. 标准 API,一次学会到处能用
K230 上的 cv2 是标准 OpenCV 的 MicroPython 移植——函数名、参数、常量都和桌面版一致。在 K230 上学会 cv2.Canny(),到了 PC/Raspberry Pi/Jetson 照样写。
2. 自由组合,不受封装限制
cv_lite 的 find_blobs 内部做了二值化+连通域+面积过滤——如果某个环节参数不合适,你换不了也看不到中间结果。cv2 让你自己搭管线:换个阈值方法、换种模糊、加个形态学,完全自定义。
3. 覆盖面广,一库走天下
50+ 函数覆盖了色彩转换、几何变换、阈值、滤波、边缘、形态学、轮廓、霍夫检测、模板匹配、算术运算、通道操作、绘图——基本覆盖了嵌入式视觉的全部需求。
如果你只需要"找个红色色块算距离"这种固定任务,cv_lite 一行代码更快、更省内存。它把全套流程编译成了 C 扩展,避免了 Python 层的多次调用开销。
K230 上的 OpenCV 是标准 OpenCV 的 MicroPython 移植版(import cv2),运行在 CanMV 固件之上。它提供了 OpenCV 核心图像处理函数,通过摄像头(Sensor)采集实时画面,在 IDE 中虚拟显示(Display)。
| 组件 | 说明 |
|---|---|
| 硬件 | YAHBOOM K230 开发板 + 摄像头模组 |
| 固件 | CanMV_K230_YAHBOOM_micropython_v1.8-13 |
| IDE | CanMV IDE 或 VS Code + CanMV 插件 |
| 分辨率 | 默认 640x480 |
参考网页K230 MicroPython Daily Build 下载中心

xxxxxxxxxximport time, os, sys, gcfrom media.sensor import * # 摄像头from media.display import * # 显示from media.media import * # 媒体管理import cv2 # OpenCVimport ulab.numpy as np # 轻量NumPy
# 初始化摄像头sensor = Sensor(width=1280, height=960, fps=90)sensor.reset()sensor.set_framesize(width=640, height=480)sensor.set_pixformat(Sensor.RGB888)
# 初始化显示Display.init(Display.ST7701, width=640, height=480, to_ide=True)sensor.run()time.sleep(0.5) # 等待传感器稳定
# 主循环try: while True: time.sleep_ms(10) # CPU yield(IDE可停止) img = sensor.snapshot() img_np = img.to_numpy_ref()
# cv2 图像处理 ... gray = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 80, 200)
# 灰度图显示 img_out = image.Image(640, 480, image.GRAYSCALE, alloc=image.ALLOC_REF, data=edges) Display.show_image(img_out) gc.collect()finally: sensor.stop() Display.deinit()| 输出类型 | 显示方法 |
|---|---|
| 彩色图 | cv2.xxx(img_np, ...) → Display.show_image(img) |
| 灰度图 | image.Image(W,H,image.GRAYSCALE,alloc=image.ALLOC_REF,data=out) → Display.show_image(img_out) |
| ⚠️ 彩色图 + image.Image | K230 不支持 image.Image(RGB888, ALLOC_REF, data=cv2_output) |
| 限制 | 说明 |
|---|---|
cv2.add 不支持标量广播 | 必须两个同尺寸数组 |
cv2.compare 需要 float64 | 标量必须是浮点型 |
HoughCircles 返回 (N,3) | 不是标准 OpenCV 的 (N,1,3) |
HoughLines 返回 (N,2) | 不是 (N,1,2) |
approxPolyDP 返回 (N,2) | 不是 (N,1,2) |
image.Image(RGB888, ALLOC_REF) | 只能用 sensor 原生 img 对象 |
np.float32 不存在 | ulab 只支持 np.float |
np.array() dtype 关键字 | 循环内可能报错,建议省略 |
cv2.putText 灰度图标量颜色 | 用 (255,) 元组而非 255 |
| 操作类型 | 640x480 帧率 | 优化手段 |
|---|---|---|
| 像素操作(flip/resize/threshold) | 50-80 fps | — |
| 局部卷积(blur/morphology/edge) | 15-30 fps | 缩小核尺寸 |
| 全局搜索(Hough/matchTemplate) | 3-10 fps | 降采样 320x240 处理 |
17 个可独立运行的摄像头 demo,每个对应一个原始 OpenCV 文件,覆盖 50+ cv2 函数。
xxxxxxxxxx01 基础变换 ──→ 08 绘图 ──→ 12 阈值│├──→ 10 模糊 ──→ 11 边缘│├──→ 02 形态学│├──→ 13 颜色分割 ──→ 03 形状分类 ──→ 07 轮廓分析 ──→ 04 角点│├──→ 05 霍夫圆 ──→ 06 霍夫线 ──→ 09 模板匹配│├──→ 14 像素变换├──→ 15 算术位运算└──→ 16 通道统计