CanMV 正式适配 OpenCV 计算机视觉库

Viewed 72

问题描述


嘉楠K230/K230D平台正式在MicroPython支持OpenCV,经典图像处理算法开箱即用,嵌入式视觉开发门槛大幅下降。
image.png

一、什么是CanMV+OpenCV组合?

CanMV 是嘉楠面向 K230 系列打造的 MicroPython 快速开发框架,原生支持传感器采集、屏幕显示及 KPU 模型推理等核心能力。通过集成 OpenCV 封装,CanMV 接入定制版 cv2 模块,将常用 OpenCV 图像处理算法部署到 K230 开发板上,实现无需 C 语言交叉编译,仅使用 MicroPython 代码即可完成丰富的图像处理与 AI 应用开发

目前已适配全系列 K230、K230D 开发板,包括庐山派、立创开发板等量产硬件平台,助力开发者快速完成嵌入式视觉应用落地。

二、API覆盖多个功能模块

本次移植版OpenCV总计封装94个常用接口,覆盖图像处理全流程,日常视觉开发所需功能全部配齐:

imagecodecs——图像IO(4个)

imread/imwrite/imdecode/imencode,支持JPG、PNG、BMP读写,可直接从内存字节流编解码图片,适配摄像头缓存数据处理。

core——核心运算(23个)

图像加减乘、加权融合、位运算、通道拆分合并、颜色阈值筛选、图像翻转旋转、归一化等基础矩阵运算,轻松完成像素级处理。

imgproc——图像处理(65个,核心主力)

1.滤波降噪:高斯/均值/中值/双边滤波、自定义卷积核,实现画面平滑+边缘保留去噪;

2.形态运算:腐蚀、膨胀、开闭运算,优化二值图像噪点;

3.色彩变换:BGR↔GRAY/HSV/YUV/LAB等23种色域转换,颜色筛选一步到位;

4.轮廓分析:轮廓查找绘制、面积周长计算、最小外接矩形/圆、多边形拟合、形状匹配;

5.特征检测:Canny/Sobel边缘、Harris/Shi-Tomasi角点、霍夫直线/圆检测;

6.绘图工具:画线、矩形、圆形、填充多边形、屏幕文字绘制,调试标注超方便。

7.直方图、图像分割:直方图统计与对比、自适应阈值、分水岭分割、漫水填充、连通域标记,满足物料分拣、区域分割需求。

higugui——交互接口

waitKey按键监听,适配IDE串口交互调试。

三、K230专属优势:RVV加速

相较于通用嵌入式OpenCV,CanMV定制版针对K230架构深度优化,依托芯片RVV加速,部分算子处理速度提升数倍。同时完美打通image.Image ↔ ulab.ndarray数据互通,摄像头抓拍RGB888数据可使用to_numpy_ref()直接转为OpenCV可用的ulab.numpy数组,无需额外拷贝数据。

四、OpenCV VS OpenMV

烧录固件后,我们在/CanMV/sdcard/examples/25-Compare中提供了OpenCV和OpenMV在相同任务的对比脚本。脚本运行效果如下图所示:

image.png
image.png
image.png
image.png

OpenCV以强大的能力在效果和帧率上表现优异,是图像处理过程中不可或缺的重要模块。

五、示例代码(边缘检测)

# 摄像头实时边缘检测示例
# 使用 sensor 获取图像 → OpenCV Canny 边缘检测 → 绘制结果

import time, os, gc, sys
from media.sensor import *
from media.display import *
from media.media import *
import cv2
from ulab import numpy as np

DETECT_WIDTH  = 320
DETECT_HEIGHT = 240

sensor = None

def init_camera():
    global sensor
    sensor = Sensor(width=1280, height=960, fps=90)
    sensor.reset()
    sensor.set_framesize(width=DETECT_WIDTH, height=DETECT_HEIGHT)
    sensor.set_pixformat(Sensor.GRAYSCALE)
    sensor.run()
    time.sleep(0.5)

def detect_edges(img_np):
    """Canny 边缘检测并绘制"""
    blurred = cv2.GaussianBlur(img_np, (3, 3), 0)
    edges = cv2.Canny(blurred, 50, 80)
    return edges

def main():
    init_camera()
    Display.init(Display.VIRT, width=DETECT_WIDTH, height=DETECT_HEIGHT, to_ide=True)

    clock = time.clock()
    try:
        while True:
            clock.tick()
            img = sensor.snapshot()
            img_np = img.to_numpy_ref()
            edges = detect_edges(img_np)
            im_draw=image.Image(DETECT_WIDTH,DETECT_HEIGHT,image.GRAYSCALE,alloc=image.ALLOC_REF,data=edges)
            fps = clock.fps()
            im_draw.draw_string_advanced(10, 10,20, "OpenCV Edges Detection")
            im_draw.draw_string_advanced(10, 30,20, "FPS: %f" % fps)
            Display.show_image(im_draw)
            gc.collect()
    finally:
        if isinstance(sensor, Sensor):
            sensor.stop()
        Display.deinit()

if __name__ == "__main__":
    main()

复制代码到CanMV IDE即可直接运行,摄像头实时输出边缘效果图。

六、落地应用场景

🔹校园科创:巡线小车、颜色分拣、答题卡识别、物体轮廓检测实训;

🔹创客DIY:智能门锁、物料计数、工件瑕疵简易检测;

🔹工业小设备:零件尺寸粗测、圆形物料分拣、光源光斑检测;

🔹AI预处理:KPU推理前做图像降噪、裁剪、色域归一化,提升识别准确率。

七、OpenCV开发关键注意事项

  1. 接口栈限制:getAffineTransform/getPerspectiveTransform/grabCut/cornerSubPix四个函数受默认128KB线程栈约束,容易栈溢出,复杂场景建议降低分辨率或增大线程栈使用;

  2. 图像格式:OpenCV默认BGR排布,CanMV摄像头原生RGB888,读取后优先用cv2.COLOR_RGB2BGR转换,避免颜色偏色;

  3. 分辨率优化:实时处理建议320×240/640×480分辨率,高分辨率1280+会增加CPU开销,出现帧率下滑;

  4. 内存管控:循环采集图像时,增加gc.collect()主动回收内存,防止长时间运行内存泄漏;

  5. 插值与边界:缩放resize默认双线性插值,工业高精度测量场景改用INTER_AREA插值算法。

八、写在最后

OpenCV的落地补齐了CanMV在传统机器视觉领域的短板,KPU做AI深度学习+OpenCV做传统图像处理的组合正式成型,从简单颜色识别到复杂轮廓匹配全链路都能在K230实现。

固件下载路径https://kendryte-download.canaan-creative.com/developer/releases/canmv_k230_micropython/daily_build/

官方API文档https://www.kendryte.com/k230_canmv/zh/main/api/opencv/opencv.html

OpenCV封装方法测试Demo路径:/CanMV/sdcard/examples/24-OpenCV/

OpenCV和OpenMV对比Demo路径:/CanMV/sdcard/examples/25-Compare/

1 Answers

嘉楠开发者原文:https://mp.weixin.qq.com/s/UhxGSACNsArRhnqPu30UAQ