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

一、环境准备
请参考如下链接,从 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(设备厂家+产品信息),轻松判断摄像头是否就绪。

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()}") # 实时监控帧率

五、玩转 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")

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