14浏览
查看: 14|回复: 4

[项目] 【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示

[复制链接]
【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图1

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图3

什么是 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 倍。


【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图2

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图4

驴友花雕  高级技神
 楼主|

发表于 5 小时前

【花雕动手做】CanMV K230 AI视觉模块之摄像头显示

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

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)、手动校准摄像头白平衡。

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图1

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图3

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图2

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 小时前

【花雕动手做】CanMV K230 AI视觉模块之摄像头显示

本帖最后由 驴友花雕 于 2025-11-4 19:16 编辑

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

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图1

项目测试实验代码
  1. #【花雕动手做】CanMV K230 AI视觉识别模块之使用摄像头显示
  2. # 导入必要的模块:时间、操作系统、垃圾回收
  3. # (Import necessary modules: time, os, garbage collection)
  4. import time, os, gc
  5. # 导入媒体相关模块:传感器、显示、媒体管理
  6. # (Import media-related modules: sensor, display, media manager)
  7. from media.sensor import *
  8. from media.display import *
  9. from media.media import *
  10. # 定义图像宽度和高度常量
  11. # (Define image width and height constants)
  12. WIDTH = 640
  13. HEIGHT = 480
  14. # 初始化传感器变量为空
  15. # (Initialize sensor variable as None)
  16. sensor = None
  17. try:
  18.     # 使用默认配置构造传感器对象
  19.     # (Construct a Sensor object with default configuration)
  20.     sensor = Sensor()
  21.     # 传感器复位 - 恢复到初始状态
  22.     # (Reset the sensor - restore to initial state)
  23.     sensor.reset()
  24.     # 设置水平镜像(当前被注释)- 左右翻转图像
  25.     # (Set horizontal mirror - currently commented out - flip image left-right)
  26.     # sensor.set_hmirror(False)
  27.     # 设置垂直翻转(当前被注释)- 上下翻转图像
  28.     # (Set vertical flip - currently commented out - flip image up-down)
  29.     # sensor.set_vflip(False)
  30.     # 设置通道0的输出尺寸 - 配置摄像头分辨率
  31.     # (Set channel 0 output size - configure camera resolution)
  32.     sensor.set_framesize(width=WIDTH, height=HEIGHT)
  33.     # 设置通道0的输出格式为RGB565 - 16位彩色格式
  34.     # (Set channel 0 output format to RGB565 - 16-bit color format)
  35.     sensor.set_pixformat(Sensor.RGB565)
  36.     # 使用IDE作为输出目标初始化显示 - 同时显示到屏幕和IDE
  37.     # (Initialize display using IDE as output target - display to both screen and IDE)
  38.     Display.init(Display.ST7701, width=WIDTH, height=HEIGHT, to_ide=True)
  39.     # 初始化媒体管理器 - 准备媒体处理资源
  40.     # (Initialize the media manager - prepare media processing resources)
  41.     MediaManager.init()
  42.     # 启动传感器运行 - 开始摄像头采集
  43.     # (Start the sensor running - begin camera capture)
  44.     sensor.run()
  45.     # 创建时钟对象用于计算帧率 - 性能监控
  46.     # (Create a clock object to calculate frames per second - performance monitoring)
  47.     fps = time.clock()
  48.     # 主循环 - 持续捕获和显示图像
  49.     # (Main loop - continuously capture and display images)
  50.     while True:
  51.         # 帧率计时器tick - 记录时间点
  52.         # (Tick the FPS timer - record time point)
  53.         fps.tick()
  54.         # 检查是否应该退出程序 - 响应中断信号
  55.         # (Check if the program should exit - respond to interrupt signals)
  56.         os.exitpoint()
  57.         # 从传感器获取一帧图像 - 捕获当前画面
  58.         # (Capture a frame from the sensor - capture current scene)
  59.         img = sensor.snapshot()
  60.         # 在屏幕上显示结果图像 - 输出到显示屏
  61.         # (Display the resulting image on screen - output to display)
  62.         Display.show_image(img)
  63.         # 执行垃圾回收 - 释放内存防止泄漏
  64.         # (Perform garbage collection - free memory to prevent leaks)
  65.         gc.collect()
  66.         # 短暂延时5毫秒 - 控制帧率,减少CPU负载
  67.         # (Brief delay of 5 milliseconds - control frame rate, reduce CPU load)
  68.         time.sleep_ms(5)
  69.         # 打印当前帧率 - 显示性能信息
  70.         # (Print the current frames per second - show performance information)
  71.         print(fps.fps())
  72. except KeyboardInterrupt as e:
  73.     # 捕获键盘中断异常(用户手动停止)- Ctrl+C退出
  74.     # (Catch keyboard interrupt exception - user manually stops - Ctrl+C to exit)
  75.     print("user stop")
  76. except BaseException as e:
  77.     # 捕获所有其他异常 - 硬件错误、配置问题等
  78.     # (Catch all other exceptions - hardware errors, configuration issues, etc.)
  79.     print(f"Exception '{e}'")
  80. finally:
  81.     # 无论如何都执行清理工作 - 确保资源正确释放
  82.     # (Perform cleanup regardless of how the program exits - ensure proper resource release)
  83.     # 停止传感器运行(如果传感器对象存在)- 关闭摄像头
  84.     # (Stop the sensor if the sensor object exists - turn off camera)
  85.     if isinstance(sensor, Sensor):
  86.         sensor.stop()
  87.     # 反初始化显示 - 关闭显示驱动
  88.     # (Deinitialize the display - shut down display driver)
  89.     Display.deinit()
  90.     # 设置退出点,允许进入睡眠模式 - 节能设置
  91.     # (Set exit point to enable sleep mode - power saving setting)
  92.     os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  93.     # 短暂延时100毫秒 - 确保资源完全释放
  94.     # (Brief delay of 100 milliseconds - ensure complete resource release)
  95.     time.sleep_ms(100)
  96.     # 释放媒体缓冲区 - 清理媒体资源
  97.     # (Release media buffer - clean up media resources)
  98.     MediaManager.deinit()
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 小时前

【花雕动手做】CanMV K230 AI视觉模块之摄像头显示

本帖最后由 驴友花雕 于 2025-11-4 19:23 编辑

代码解读:

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

硬件初始化流程
1. 模块导入
python
  1. import time, os, gc
  2. from media.sensor import *
  3. from media.display import *
  4. from media.media import *
复制代码


time: 用于延时和帧率计算
os: 系统操作和退出点管理
gc: 垃圾回收,防止内存泄漏
media.sensor: 摄像头传感器控制
media.display: 显示控
media.media: 媒体资源管理

2. 摄像头初始化配置
python
  1. sensor = Sensor()          # 创建传感器对象
  2. sensor.reset()             # 复位摄像头
  3. sensor.set_framesize(width=WIDTH, height=HEIGHT)  # 设置分辨率640x480
  4. sensor.set_pixformat(Sensor.RGB565)  # 设置图像格式为16位RGB
  5. sensor.run()               # 启动摄像头
复制代码


RGB565格式说明:
每个像素占用2字节(16位)
红色5位 + 绿色6位 + 蓝色5位
相比RGB888(24位)节省内存,适合嵌入式设备

3. 显示系统初始化
python
  1. Display.init(Display.ST7701, width=WIDTH, height=HEIGHT, to_ide=True)
  2. MediaManager.init()
复制代码


ST7701: 显示屏驱动芯片型号
to_ide=True: 同时输出到IDE和物理屏幕,方便调试

主循环工作流程
实时图像处理流水线:
text
摄像头采集 → 图像捕获 → 显示输出 → 性能监控 → 内存清理
详细步骤:
python
  1. while True:
  2.     fps.tick()                    # 1. 记录时间点
  3.     os.exitpoint()               # 2. 检查退出信号
  4.     img = sensor.snapshot()      # 3. 捕获一帧图像
  5.     Display.show_image(img)      # 4. 显示图像
  6.     gc.collect()                 # 5. 垃圾回收
  7.     time.sleep_ms(5)             # 6. 控制帧率
  8.     print(fps.fps())             # 7. 打印帧率
复制代码


性能优化特性
1. 帧率控制
time.sleep_ms(5):每帧延时5ms,控制最大帧率约200FPS
防止CPU过载,平衡性能与功耗

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

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

异常处理机制
三级保护机制:
python
  1. try:
  2.     # 主程序逻辑
  3. except KeyboardInterrupt:    # 用户主动中断(Ctrl+C)
  4.     print("user stop")
  5. except BaseException:        # 其他所有异常
  6.     print(f"Exception '{e}'")
  7. finally:                     # 无论如何都会执行
  8.     # 资源清理代码
复制代码


资源清理流程
安全关闭顺序:
停止摄像头:sensor.stop()
关闭显示:Display.deinit()
设置睡眠模式:os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
释放媒体资源:MediaManager.deinit()

可扩展功能
注释掉的配置选项:
python
  1. # sensor.set_hmirror(False)   # 水平镜像
  2. # sensor.set_vflip(False)     # 垂直翻转
复制代码


这些功能可用于:
前置摄像头镜像处理
适应不同的摄像头安装方向

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

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

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

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 3 小时前

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

实验串口返回情况

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图1

实验场景图  动态图

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图3


【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图2

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图4

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图5

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图6

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图7

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图8

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图9

【花雕动手做】CanMV K230 AI 视觉模块之摄像头显示图10


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail