回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕动手做】CanMV K230 AI视觉识别模块之使用摄像头显示 简单

头像 驴友花雕 2025.11.04 4 0

00 (1).jpg
00 (2).jpg
00 (3).jpg

什么是 CanMV K230?
CanMV K230是一款高性价比的RISC-V边缘AI平台,凭借低功耗、强视觉处理能力和开放的开发生态,成为嵌入式AI开发的理想选择,尤其适合需要快速部署视觉与AI功能的创客、中小企业及教育场景。CanMV 是一套 AI 视觉开发平台,K230 是其核心芯片。该模块结合了图像采集、AI推理、边缘计算等能力,适合嵌入式视觉应用开发。

CanMV:类似 OpenMV 的图像处理框架,支持 Python 编程,简化视觉识别开发流程。
K230 芯片:嘉楠科技推出的 AIoT SoC,采用 RISC-V 架构,内置第三代 KPU(AI加速单元),算力高达 6 TOPS,性能是 K210 的 13.7 倍。

 

00 (4).jpg

知识点
摄像头显示并非单一技术,而是 “摄像头图像采集→信号处理→屏幕显示” 的完整流程,核心是将摄像头捕捉的实时或存储的图像 / 视频,通过设备(如手机、电脑、监控屏)呈现出来,实现 “所见即显” 的可视化效果。

1、核心流程:从采集到显示的 4 个关键步骤
整个过程需硬件与软件协同,每一步直接影响最终显示效果:
图像采集(摄像头硬件端)
摄像头的图像传感器(如 CMOS、CCD)将光信号(镜头捕捉的场景)转换为电信号,生成原始图像数据(RAW 格式,未经处理)。
信号处理(芯片 / 算法端)
图像处理芯片(如手机的 ISP 图像信号处理器)对原始数据进行优化,包括降噪、白平衡、自动曝光、对焦校正等,将 RAW 格式转换为可识别的图像格式(如 JPEG、YUV)。
数据传输(接口 / 协议端)
处理后的图像数据通过接口或协议传输到显示模块,常见方式包括:
设备内传输:手机 / 相机通过内部总线(如 MIPI)直接传至屏幕。
外部传输:监控摄像头通过网线(TCP/IP)、HDMI 线传至显示器 / 硬盘录像机(NVR)。
屏幕显示(显示模块端)
显示面板(如 LCD、OLED)接收数据后,按像素解析并输出图像,完成 “采集→显示” 的闭环。

2、关键技术指标(影响显示效果)
这些指标同时关联摄像头硬件和显示设备,共同决定最终呈现的清晰度、流畅度:
分辨率匹配
摄像头分辨率(如 2K、4K)需与显示设备分辨率(如屏幕 2K、4K)匹配,否则会出现拉伸变形或清晰度损失(例:4K 摄像头接 1080P 屏幕,显示效果仍为 1080P)。
帧率同步
摄像头帧率(如 30fps、60fps,指每秒采集的图像数量)需与屏幕刷新率(如 60Hz、120Hz)同步,否则会出现画面卡顿、拖影(游戏 / 运动场景需 60fps 以上)。
延迟控制
从摄像头采集到屏幕显示的时间差,称为 “显示延迟”。实时场景(如视频通话、监控)需延迟<100ms,专业场景(如直播、手术监控)需<50ms。
色彩还原
摄像头的色彩采样率(如 4:4:4、4:2:0)与屏幕的色域(如 sRGB、DCI-P3)需匹配,否则会出现色彩偏差(例:摄像头拍的 “红色”,屏幕显示偏橙)。

3、典型应用场景(按使用目的分)
不同场景对 “采集→显示” 的需求差异较大,核心是平衡清晰度、延迟和成本:
消费电子:手机视频通话(需低延迟、720P/1080P 分辨率)、相机实时取景(需高色彩还原、无延迟)、电脑视频会议(依赖摄像头与显示器分辨率匹配)。
安防监控:监控摄像头 + NVR + 显示器(需 24 小时稳定显示、支持多画面分割,分辨率多为 1080P/4K)、家用智能摄像头(手机远程显示,需低流量 + 清晰)。
专业领域:直播(摄像头采集→编码器→电脑 / 大屏显示,需高帧率 + 低延迟)、医疗手术(内窥镜摄像头→医用显示器,需高分辨率 + 精准色彩)、工业检测(工业摄像头→工控屏,需抗干扰 + 稳定显示)。

4、常见问题与解决方案
显示画面模糊
原因:摄像头分辨率低于显示设备、镜头脏污、传输过程中数据压缩过度。
解决:更换高分辨率摄像头、清洁镜头、使用无损传输协议(如 HDMI 2.1、网线直连)。
画面卡顿 / 延迟高
原因:摄像头帧率低、传输带宽不足(如 WiFi 信号弱)、设备处理性能不足。
解决:提升摄像头帧率(如 30fps→60fps)、优化网络(如用有线连接)、升级图像处理芯片。
色彩偏差
原因:摄像头与屏幕色域不匹配、摄像头白平衡未校准。
解决:在设备设置中统一色域(如均设为 sRGB)、手动校准摄像头白平衡。

 

31.jpg
32.jpg
33.jpg

【花雕动手做】CanMV K230 AI视觉识别模块之使用摄像头显示
在IDE的帧缓冲区中显示摄像头捕获到的图像
我们用CanMV IDE打开例程代码,将K230用usb连接到电脑上
点击CanMV IDE左下角的运行按钮,可以看到IDE右上角的帧缓冲区中显示了摄像头捕获到的图像

 

33-.jpg

 

项目测试实验代码
 

代码
#【花雕动手做】CanMV K230 AI视觉识别模块之使用摄像头显示

# 导入必要的模块:时间、操作系统、垃圾回收
# (Import necessary modules: time, os, garbage collection)
import time, os, gc

# 导入媒体相关模块:传感器、显示、媒体管理
# (Import media-related modules: sensor, display, media manager)
from media.sensor import *
from media.display import *
from media.media import *

# 定义图像宽度和高度常量
# (Define image width and height constants)
WIDTH = 640
HEIGHT = 480

# 初始化传感器变量为空
# (Initialize sensor variable as None)
sensor = None

try:
    # 使用默认配置构造传感器对象
    # (Construct a Sensor object with default configuration)
    sensor = Sensor()

    # 传感器复位 - 恢复到初始状态
    # (Reset the sensor - restore to initial state)
    sensor.reset()

    # 设置水平镜像(当前被注释)- 左右翻转图像
    # (Set horizontal mirror - currently commented out - flip image left-right)
    # sensor.set_hmirror(False)

    # 设置垂直翻转(当前被注释)- 上下翻转图像
    # (Set vertical flip - currently commented out - flip image up-down)
    # sensor.set_vflip(False)

    # 设置通道0的输出尺寸 - 配置摄像头分辨率
    # (Set channel 0 output size - configure camera resolution)
    sensor.set_framesize(width=WIDTH, height=HEIGHT)

    # 设置通道0的输出格式为RGB565 - 16位彩色格式
    # (Set channel 0 output format to RGB565 - 16-bit color format)
    sensor.set_pixformat(Sensor.RGB565)

    # 使用IDE作为输出目标初始化显示 - 同时显示到屏幕和IDE
    # (Initialize display using IDE as output target - display to both screen and IDE)
    Display.init(Display.ST7701, width=WIDTH, height=HEIGHT, to_ide=True)

    # 初始化媒体管理器 - 准备媒体处理资源
    # (Initialize the media manager - prepare media processing resources)
    MediaManager.init()

    # 启动传感器运行 - 开始摄像头采集
    # (Start the sensor running - begin camera capture)
    sensor.run()

    # 创建时钟对象用于计算帧率 - 性能监控
    # (Create a clock object to calculate frames per second - performance monitoring)
    fps = time.clock()

    # 主循环 - 持续捕获和显示图像
    # (Main loop - continuously capture and display images)
    while True:
        # 帧率计时器tick - 记录时间点
        # (Tick the FPS timer - record time point)
        fps.tick()

        # 检查是否应该退出程序 - 响应中断信号
        # (Check if the program should exit - respond to interrupt signals)
        os.exitpoint()

        # 从传感器获取一帧图像 - 捕获当前画面
        # (Capture a frame from the sensor - capture current scene)
        img = sensor.snapshot()

        # 在屏幕上显示结果图像 - 输出到显示屏
        # (Display the resulting image on screen - output to display)
        Display.show_image(img)

        # 执行垃圾回收 - 释放内存防止泄漏
        # (Perform garbage collection - free memory to prevent leaks)
        gc.collect()

        # 短暂延时5毫秒 - 控制帧率,减少CPU负载
        # (Brief delay of 5 milliseconds - control frame rate, reduce CPU load)
        time.sleep_ms(5)

        # 打印当前帧率 - 显示性能信息
        # (Print the current frames per second - show performance information)
        print(fps.fps())

except KeyboardInterrupt as e:
    # 捕获键盘中断异常(用户手动停止)- Ctrl+C退出
    # (Catch keyboard interrupt exception - user manually stops - Ctrl+C to exit)
    print("user stop")
except BaseException as e:
    # 捕获所有其他异常 - 硬件错误、配置问题等
    # (Catch all other exceptions - hardware errors, configuration issues, etc.)
    print(f"Exception '{e}'")
finally:
    # 无论如何都执行清理工作 - 确保资源正确释放
    # (Perform cleanup regardless of how the program exits - ensure proper resource release)

    # 停止传感器运行(如果传感器对象存在)- 关闭摄像头
    # (Stop the sensor if the sensor object exists - turn off camera)
    if isinstance(sensor, Sensor):
        sensor.stop()

    # 反初始化显示 - 关闭显示驱动
    # (Deinitialize the display - shut down display driver)
    Display.deinit()

    # 设置退出点,允许进入睡眠模式 - 节能设置
    # (Set exit point to enable sleep mode - power saving setting)
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)

    # 短暂延时100毫秒 - 确保资源完全释放
    # (Brief delay of 100 milliseconds - ensure complete resource release)
    time.sleep_ms(100)

    # 释放媒体缓冲区 - 清理媒体资源
    # (Release media buffer - clean up media resources)
    MediaManager.deinit()

代码解读:

程序总体功能
这是一个完整的摄像头实时显示程序,用于在CanMV K230模块上捕获摄像头画面并实时显示在屏幕上。

硬件初始化流程
1. 模块导入
python
import time, os, gc
from media.sensor import *
from media.display import *
from media.media import *
time: 用于延时和帧率计算
os: 系统操作和退出点管理
gc: 垃圾回收,防止内存泄漏
media.sensor: 摄像头传感器控制
media.display: 显示控
media.media: 媒体资源管理

2. 摄像头初始化配置
python
sensor = Sensor()          # 创建传感器对象
sensor.reset()             # 复位摄像头
sensor.set_framesize(width=WIDTH, height=HEIGHT)  # 设置分辨率640x480
sensor.set_pixformat(Sensor.RGB565)  # 设置图像格式为16位RGB
sensor.run()               # 启动摄像头
RGB565格式说明:
每个像素占用2字节(16位)
红色5位 + 绿色6位 + 蓝色5位
相比RGB888(24位)节省内存,适合嵌入式设备

3. 显示系统初始化
python
Display.init(Display.ST7701, width=WIDTH, height=HEIGHT, to_ide=True)
MediaManager.init()
ST7701: 显示屏驱动芯片型号
to_ide=True: 同时输出到IDE和物理屏幕,方便调试

主循环工作流程
实时图像处理流水线:
text
摄像头采集 → 图像捕获 → 显示输出 → 性能监控 → 内存清理
详细步骤:
python
while True:
   fps.tick()                    # 1. 记录时间点
   os.exitpoint()               # 2. 检查退出信号
   img = sensor.snapshot()      # 3. 捕获一帧图像
   Display.show_image(img)      # 4. 显示图像
   gc.collect()                 # 5. 垃圾回收
   time.sleep_ms(5)             # 6. 控制帧率
   print(fps.fps())             # 7. 打印帧率
性能优化特性
1. 帧率控制
time.sleep_ms(5):每帧延时5ms,控制最大帧率约200FPS
防止CPU过载,平衡性能与功耗

2. 内存管理
gc.collect():定期触发垃圾回收
防止内存碎片和泄漏,确保长期稳定运行

3. 帧率监控
time.clock():高精度计时器
实时计算并显示FPS,便于性能调优

异常处理机制
三级保护机制:
python
try:
   # 主程序逻辑
except KeyboardInterrupt:    # 用户主动中断(Ctrl+C)
   print("user stop")
except BaseException:        # 其他所有异常
   print(f"Exception '{e}'")
finally:                     # 无论如何都会执行
   # 资源清理代码
资源清理流程
安全关闭顺序:
停止摄像头:sensor.stop()
关闭显示:Display.deinit()
设置睡眠模式:os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
释放媒体资源:MediaManager.deinit()

可扩展功能
注释掉的配置选项:
python
# sensor.set_hmirror(False)   # 水平镜像
# sensor.set_vflip(False)     # 垂直翻转
这些功能可用于:
前置摄像头镜像处理
适应不同的摄像头安装方向

预期运行效果
启动阶段:初始化摄像头和显示,打印配置信息
运行阶段:实时显示摄像头画面,控制台输出帧率(如:30.5)
退出阶段:用户按Ctrl+C,安全释放所有资源

调试技巧
帧率过低:检查摄像头连接、分辨率设置
白屏/黑屏:检查显示初始化、摄像头供电
内存错误:调整gc.collect()频率或移除延时

这是一个典型的嵌入式视觉应用基础框架,为后续的图像处理、AI识别等功能提供了稳定的视频流基础。

实验串口返回情况

 

34.jpg

 

实验场景图  动态图

 

35.jpg
36.jpg
37 (1).jpg
37 (2).jpg
37 (3).jpg
37 (4).jpg
37 (5).jpg
00232--.gif
00232---.gif

评论

user-avatar
icon 他的勋章
    展开更多