8浏览
查看: 8|回复: 3

[项目] 【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转

[复制链接]
本帖最后由 驴友花雕 于 2025-11-6 08:36 编辑

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图1

什么是 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 视觉之摄像头图像水平翻转图3

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图2

驴友花雕  高级技神
 楼主|

发表于 3 小时前

【花雕动手做】CanMV K230 AI视觉之摄像头图像水平翻转

知识点
摄像头图像翻转是调整摄像头对采集的图像进行方向调整(如上下颠倒、左右镜像)的处理,常用于修正因摄像头安装角度(如倒置、侧装)或硬件特性导致的画面方向异常,确保显示的图像符合人眼视觉习惯。

1、常见的翻转类型(按方向划分)
水平翻转(左右镜像)图像沿垂直中轴线对称反转,类似照镜子的效果(左变右、右变左)。▶ 适用场景:摄像头镜头朝向错误(如自拍时画面左右颠倒)、视频通话时对方看到的画面与自己动作镜像(需矫正为正向)。
垂直翻转(上下颠倒)图像沿水平中轴线反转,画面上下颠倒(顶部变底部、底部变顶部)。▶ 适用场景:摄像头倒装(如监控摄像头为隐藏安装而倒置固定在天花板)、硬件驱动默认输出方向错误(如部分 USB 摄像头初始画面颠倒)。
旋转(90°/180°/270°)严格来说属于 “旋转” 而非单纯 “翻转”,但常被归为同类调整。通过顺时针或逆时针旋转图像,解决摄像头侧装(如竖屏设备中横装的摄像头)导致的画面倾斜问题。▶ 适用场景:车载摄像头侧装、竖屏显示器搭配横置摄像头(如手机竖拍时画面需要旋转 90°)。

2、实现方式(硬件 / 软件层面)
图像翻转的处理可在采集端或显示端完成,具体方式取决于设备功能:
1. 硬件层面(摄像头 / 芯片自带功能)
部分摄像头内置翻转电路或通过 ISP(图像信号处理器)直接输出翻转后的图像,无需额外软件处理,延迟更低(如监控摄像头的 “倒装模式”,在硬件中预设垂直翻转)。
原理:在图像传感器输出原始数据后,通过芯片内部逻辑调整像素排列顺序(如垂直翻转时,将第 1 行像素与最后 1 行对调)。
2. 软件层面(系统 / 应用程序处理)
若硬件不支持,可通过软件算法对图像数据进行翻转,常见于手机、电脑等设备:
系统级设置:在摄像头驱动或设备设置中勾选 “水平翻转”“垂直翻转”(如 Windows 的 “相机” 应用设置、Android 的摄像头参数配置)。
应用级处理:视频软件(如 OBS 直播软件、Zoom 会议软件)通过图像算法实时翻转画面(如调用 OpenCV 的flip函数,参数控制翻转方向)。
原理:通过代码遍历图像像素矩阵,重新排列像素位置(例如水平翻转时,交换每行的左右像素;垂直翻转时,交换每列的上下像素)。

3、典型应用场景
监控摄像头:倒装在天花板时,通过垂直翻转让画面恢复正向(避免观看者仰头 “歪脖子”)。
手机 / 平板自拍:前置摄像头默认输出镜像画面(符合人眼习惯),但部分场景(如扫码)需关闭镜像(水平翻转)以确保二维码正常识别。
直播 / 视频会议:主播通过水平翻转修正画面左右颠倒,让观众看到与实际动作一致的方向。
工业检测:摄像头斜向安装时,通过旋转调整画面至正向,便于机器视觉算法分析(如检测产品缺陷时需画面方向统一)。

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图2

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图3

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】CanMV K230 AI视觉之摄像头图像水平翻转

【花雕动手做】CanMV K230 AI视觉识别模块之摄像头图像水平翻转(镜像)

描述
配置图像传感器是否进行水平镜像。

语法
sensor.set_hmirror(enable)

参数
参数名称           描述                                                                        输入/输出
enable         True 开启水平镜像功能 False 关闭水平镜像功能        输入

返回值
返回值        描述
无         
举例
sensor.set_hmirror(True)

项目测试实验代码

  1. #【花雕动手做】CanMV K230 AI视觉识别模块之摄像头图像水平翻转(镜像)
  2. """
  3. Camera preview demo
  4. 摄像头预览演示
  5. This script initializes camera sensor, displays preview and handles cleanup
  6. 本脚本初始化摄像头传感器、显示预览并处理清理工作
  7. """
  8. import sys
  9. import uos as os  # 导入操作系统接口模块,重命名为os
  10. import time
  11. from media.sensor import *  # 导入传感器模块
  12. from media.display import *  # 导入显示模块
  13. from media.media import *   # 导入媒体管理模块
  14. def init_sensor():
  15.     """
  16.     Initialize camera sensor with specified configuration
  17.     使用指定配置初始化摄像头传感器
  18.    
  19.     功能:配置摄像头参数并返回传感器对象
  20.     关键配置:设置水平镜像为True,实现图像左右翻转
  21.     """
  22.     sensor = Sensor()  # 创建传感器实例
  23.    
  24.     # Reset sensor to default state
  25.     # 将传感器重置为默认状态
  26.     # 作用:清除之前的配置,确保从干净状态开始
  27.     sensor.reset()
  28.     # Configure channel 1 output format to 640x480 RGB565
  29.     # 配置通道1输出格式为640x480 RGB565
  30.     # 参数说明:
  31.     # width=640, height=480 - 设置图像分辨率
  32.     # chn=CAM_CHN_ID_1 - 指定使用通道1
  33.     sensor.set_framesize(width=640, height=480, chn=CAM_CHN_ID_1)
  34.    
  35.     # 设置像素格式为RGB565
  36.     # RGB565特点:每个像素16位(5位红+6位绿+5位蓝),节省内存
  37.     sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1)
  38.     # 关键功能:启用水平镜像(水平翻转)
  39.     # 设置为True时,图像会左右翻转,就像照镜子一样
  40.     # 应用场景:前置摄像头、需要镜像显示的场合
  41.     sensor.set_hmirror(True)
  42.    
  43.     return sensor  # 返回配置好的传感器对象
  44. def main():
  45.     """
  46.     Main function to run camera preview
  47.     运行摄像头预览的主函数
  48.    
  49.     功能:主程序流程,包含初始化、运行和清理
  50.     """
  51.     sensor = None  # 初始化传感器变量,便于异常处理
  52.    
  53.     try:
  54.         # Initialize camera sensor
  55.         # 初始化摄像头传感器
  56.         sensor = init_sensor()  # 调用初始化函数获取传感器对象
  57.         
  58.         # Initialize virtual display with 640x480 resolution
  59.         # 初始化640x480分辨率的虚拟显示
  60.         # 参数说明:
  61.         # Display.ST7701 - 显示屏驱动型号
  62.         # width=640, height=480 - 显示分辨率,与摄像头分辨率匹配
  63.         # to_ide=True - 同时输出到IDE,便于调试和观察
  64.         Display.init(Display.ST7701, width=640, height=480, to_ide=True)
  65.         # Initialize media management
  66.         # 初始化媒体管理
  67.         # 作用:分配和管理媒体处理所需的系统资源
  68.         MediaManager.init()
  69.         
  70.         # Start sensor operation
  71.         # 启动传感器运行
  72.         # 作用:开始摄像头数据采集流程
  73.         sensor.run()
  74.         # Main loop to capture and display frames
  75.         # 捕获和显示帧的主循环
  76.         # 功能:持续捕获图像并显示,形成实时预览
  77.         while True:
  78.             # Capture frame from channel 1
  79.             # 从通道1捕获帧
  80.             # 返回值img:包含图像数据的对象
  81.             img = sensor.snapshot(chn=CAM_CHN_ID_1)
  82.             
  83.             # Display captured frame
  84.             # 显示捕获的帧
  85.             # 作用:将图像数据发送到显示设备
  86.             Display.show_image(img)
  87.             
  88.     except KeyboardInterrupt:
  89.         # 处理键盘中断(Ctrl+C)
  90.         print("User interrupted the program")
  91.         print("用户中断了程序")
  92.         
  93.     except Exception as e:
  94.         # 处理其他所有异常
  95.         print(f"An error occurred: {str(e)}")
  96.         print(f"发生错误: {str(e)}")
  97.         
  98.     finally:
  99.         # Cleanup section
  100.         # 清理部分 - 无论是否发生异常都会执行
  101.         
  102.         # Stop sensor if initialized
  103.         # 如果传感器已初始化则停止
  104.         # 作用:安全停止摄像头采集,释放硬件资源
  105.         if isinstance(sensor, Sensor):
  106.             sensor.stop()
  107.             
  108.         # Deinitialize display
  109.         # 反初始化显示
  110.         # 作用:关闭显示驱动,释放显示资源
  111.         Display.deinit()
  112.         # Enable sleep mode
  113.         # 启用睡眠模式
  114.         # 作用:允许系统进入低功耗状态
  115.         os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
  116.         time.sleep_ms(100)  # 短暂延时确保资源完全释放
  117.         
  118.         # Release media resources
  119.         # 释放媒体资源
  120.         # 作用:清理媒体管理器分配的所有资源
  121.         MediaManager.deinit()
  122. if __name__ == "__main__":
  123.     # 程序入口点
  124.     main()  # 调用主函数启动程序
复制代码


代码核心功能解析
1. 水平镜像实现
python
  1. sensor.set_hmirror(True)
复制代码


功能:启用摄像头水平镜像
效果:图像左右翻转,如同照镜子

应用场景:
前置摄像头应用
需要镜像显示的场合
文字识别前的预处理

2. 图像处理流水线
text
摄像头采集 → 水平镜像处理 → RGB565格式转换 → 显示输出

3. 资源管理特点
异常安全:使用try-except-finally确保资源正确释放
渐进式初始化:按顺序初始化各组件
完整清理:确保所有硬件资源都被正确释放

4. 关键参数说明
分辨率:640×480 - 平衡性能与清晰度
像素格式:RGB565 - 节省内存的16位彩色格式
显示模式:ST7701驱动 + IDE输出 - 便于调试

技术要点
镜像设置的时机
在sensor.reset()之后立即设置set_hmirror(True),确保在数据流开始前就配置好镜像参数。

资源释放顺序
严格按照以下顺序清理:
停止传感器
关闭显示
释放媒体资源

这个程序展示了如何在CanMV K230模块上实现基本的摄像头镜像功能,代码结构清晰,异常处理完善,适合作为计算机视觉项目的基础模板。


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】CanMV K230 AI视觉之摄像头图像水平翻转

实验场景图

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图1

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图2

【花雕动手做】CanMV K230 AI 视觉之摄像头图像水平翻转图3
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail