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

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

[复制链接]
【花雕动手做】CanMV K230 AI视觉之摄像头图像垂直翻转图2

【花雕动手做】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

驴友花雕  高级技神
 楼主|

发表于 2 小时前

【花雕动手做】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视觉之摄像头图像垂直翻转图1

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

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

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

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

【花雕动手做】CanMV K230 AI视觉识别模块之摄像头图像垂直翻转

API 描述
  1. sensor.set_vflip
复制代码

描述
配置图像传感器是否进行垂直翻转。

语法
  1. sensor.set_vflip(enable)
复制代码

参数
参数名称          描述                                                                          输入/输出
enable         True 开启垂直翻转功能 False 关闭垂直翻转功能          输入

返回值
返回值        描述
无         
举例
  1. sensor.set_vflip(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_vflip(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_vflip(True)
复制代码

功能:启用摄像头垂直翻
效果:图像上下翻转,顶部变为底部,底部变为顶部
技术原理:在传感器硬件层面重新映射像素读取顺序

与水平镜像的区别:
水平镜像:左右翻转(镜像效果)
垂直翻转:上下翻转(倒置效果)

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

3. 应用场景
摄像头倒置安装:当摄像头物理安装方向与期望显示方向相反时
特殊显示需求:需要倒置显示效果的创意应用
图像预处理:为后续计算机视觉算法准备特定方向的图像数据
多摄像头系统:统一不同安装位置摄像头的显示方向

4. 硬件级翻转优势
性能高效:在传感器层面完成翻转,不占用CPU资源
无质量损失:相比软件翻转,保持图像原始质量
实时性好:不影响帧率,适合实时视频处理

技术要点
配置时机的重要性
python
  1. sensor.reset()  # 先重置
  2. sensor.set_vflip(True)  # 再设置翻转
复制代码

必须在sensor.reset()之后、sensor.run()之前设置翻转参数,确保配置生效。

资源管理策略
异常安全:使用try-except-finally确保任何情况下资源都能正确释放
条件判断:isinstance(sensor, Sensor)确保只有成功初始化的传感器才会被停止
延时等待:time.sleep_ms(100)给系统足够时间完成资源释放

可扩展性
可以结合水平镜像实现更复杂的图像变换:

python
  1. # 同时启用水平和垂直翻转(180度旋转)
  2. sensor.set_hmirror(True)
  3. sensor.set_vflip(True)
复制代码

这个程序展示了CanMV K230模块在硬件层面处理图像变换的能力,代码结构清晰,资源管理完善,是学习摄像头编程的良好示例。




回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 2 小时前

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

实验场景图

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

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

【花雕动手做】CanMV K230 AI视觉之摄像头图像垂直翻转图2
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail