K230 MicroPython 使用 UVC 摄像头

Viewed 127

问题描述


各位开发者小伙伴们,K230又添新技能!现在,基于 MicroPython 的 K230 开发板正式支持 UVC 摄像头啦!通过全新的 UVC 模块,轻松实现USB摄像头的检测、配置与图像采集,为视觉识别、智能设备开发等场景打开更多可能!

image.png

一、环境准备

请参考如下链接,从 gitee 或者 github 上获取最新的 SDK 代码,编译IMG ,并烧录到我们的开发板里面:
SDK 获取:
https://developer.canaan-creative.com/k230_canmv/zh/main/zh/userguide/how_to_build.html
USB 烧录:
https://mp.weixin.qq.com/s/qzES8iwQZJqqohGyWenFlQ

二、UVC 模块

UVC(USB Video Class)是通用的 USB 摄像头协议,K230 的 UVC 模块提供了一套简洁高效的API,支持单摄像头操作,涵盖设备检测、分辨率/帧率配置、视频流控制、图像捕获等核心功能。

IMG 自带 UVC 参考代码,路径(csc demo 是启用硬件解码功能),目前只支持MJPEG模式:
/CanMV/sdcard/examples/02-Media/uvc.py
/CanMV/sdcard/examples/02-Media/uvc_with_csc.py

三、核心功能速览

1. 摄像头检测:一键确认设备连接

from media.uvc import UVC
plugin, devinfo = UVC.probe()
print(f"摄像头检测: {'已连接' if plugin else '未连接'}, 设备信息: {devinfo}")

返回值:plugin(布尔值,是否检测到设备)、devinfo(设备厂家+产品信息),轻松判断摄像头是否就绪。
image.png

2. 视频模式配置:自定义分辨率与帧率

# 创建视频模式(640x480分辨率,MJPEG格式,30fps)
mode = UVC.video_mode(640, 480, UVC.FORMAT_MJPEG, 30)
# 选择并应用模式
succ, actual_mode = UVC.select_video_mode(mode)
print(f"模式设置: {'成功' if succ else '失败'}, 实际生效模式: {actual_mode.width}x{actual_mode.height}@{actual_mode.fps}fps")

支持格式:FORMAT_MJPEG(低带宽,适合实时传输)

3.视频流控制:轻松启动/停止图像采集


# 启动视频流(支持硬件解码优化)
UVC.start(delay_ms=0, cvt=True)  # cvt=True启用硬件解码JPEG解码引擎,解码为NV12格式
# 捕获单帧图像(超时时间1秒)
frame = UVC.snapshot(timeout_ms=1000)
# 停止流并释放资源
UVC.stop()

硬件解码:通过 cvt=True 开启硬件加速,将 snapshot 获取的图像硬件解码为 NV12 格式,提升图像转换效率,减轻 CPU 负担。

四、完整示例

场景1:软件解码(1080p@30fps摄像头,显示帧率在8左右)

在start UVC设备后,直接调用 CPU色域转换函数 to_rgb565, 之后直接显示。


import time
from media.display import *
from media.uvc import *

# 初始化显示设备
Display.init(Display.ST7701, 800, 480, to_ide=True)
# 检测摄像头
while True:
    plugin, dev = UVC.probe()
if plugin:
        print(f"检测到USB摄像头: {dev}")
break
# 配置并启动摄像头
mode = UVC.video_mode(640, 480, UVC.FORMAT_MJPEG, 30)
UVC.select_video_mode(mode)
UVC.start()

try:
while True:
  img = UVC.snapshot()  # 捕获帧
  if img:
        img = img.to_rgb565()  # 转换为屏幕显示格式
        Display.show_image(img)  # 实时显示图像
        img.__del__() #释放资源,避免内存泄露
finally:
    # 资源释放

场景2:硬件解码(1080p@30fps摄像头,显示帧率30左右)

硬件解码需要调用不同的硬件模块对其进行JPEG解压缩和色域转换,在start UVC设备后,调用CSC硬件模块进行色域转换,之后送去显示。


from nonai2d import CSC  # 硬件色彩空间转换器
csc = CSC(0, CSC.PIXEL_FORMAT_RGB_565)  # 初始化硬件转换

# 启动时启用硬件解码(cvt=True)
UVC.start(cvt=True)
while True:
    img = UVC.snapshot()
    if img:
        img = csc.convert(img)  # 硬件加速转换色彩空间
        Display.show_image(img)
        print(f"当前FPS: {clock.fps()}")  # 实时监控帧率

image.png

五、玩转 UVC 摄像头的小技巧

1. 模式枚举:

通过 UVC.list_video_mode() 获取摄像头支持的所有分辨率/帧率组合,避免手动配置不兼容的模式:


for i, mode in enumerate(UVC.list_video_mode()):
    print(f"模式{i}: {mode.width}x{mode.height} {mode.format}@{mode.fps}fps")

image.png

2. 性能优化:

优先使用 FORMAT_MJPEG 压缩格式降低带宽占用,搭配硬件解码(cvt=True)提升实时性,适合无人机、机器人等边缘计算场景。

六、应用场景

  • 智能安防:实时采集监控画面,结合AI算法实现人脸检测、异常行为识别。
  • 工业视觉:搭配工业摄像头,完成零件缺陷检测、尺寸测量等自动化任务。
  • 消费电子:开发智能相框、互动玩具,通过摄像头实现手势控制、图像识别交互。

七、立即体验

现在,只需一块 K230 开发板、一个 UVC 摄像头(如常见的罗技C 系列、树莓派摄像头转接 USB 款),即可开启视觉开发之旅!完整API文档已同步更新至官方开发者平台。
参考文档:
https://developer.canaan-creative.com/k230_canmv/zh/main/zh/api/mpp/media_uvc.html

1 Answers