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

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

头像 驴友花雕 2025.11.06 4 0

00 (2).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

00 (3).jpg

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

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

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

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

 

41.jpg
42.jpg
43.jpg

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

API 描述
sensor.set_vflip

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

语法
sensor.set_vflip(enable)
参数
参数名称  描述                                                                        输入/输出
enable      True 开启垂直翻转功能 False 关闭垂直翻转功能   输入

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

项目测试实验代码

代码
#【花雕动手做】CanMV K230 AI视觉识别模块之摄像头图像垂直翻转
"""
Camera preview demo
摄像头预览演示

This script initializes camera sensor, displays preview and handles cleanup
本脚本初始化摄像头传感器、显示预览并处理清理工作
"""

import sys
import uos as os  # 导入操作系统接口模块,重命名为os
import time
from media.sensor import *  # 导入传感器模块
from media.display import *  # 导入显示模块
from media.media import *   # 导入媒体管理模块

def init_sensor():
    """
    Initialize camera sensor with specified configuration
    使用指定配置初始化摄像头传感器
    
    功能:配置摄像头参数并返回传感器对象
    关键配置:设置垂直翻转为True,实现图像上下翻转
    """
    sensor = Sensor()  # 创建传感器实例
    
    # Reset sensor to default state
    # 将传感器重置为默认状态
    # 作用:清除之前的配置,确保从干净状态开始
    sensor.reset()

    # Configure channel 1 output format to 640x480 RGB565
    # 配置通道1输出格式为640x480 RGB565
    # 参数说明:
    # width=640, height=480 - 设置图像分辨率
    # chn=CAM_CHN_ID_1 - 指定使用通道1
    sensor.set_framesize(width=640, height=480, chn=CAM_CHN_ID_1)
    
    # 设置像素格式为RGB565
    # RGB565特点:每个像素16位(5位红+6位绿+5位蓝),节省内存
    sensor.set_pixformat(Sensor.RGB565, chn=CAM_CHN_ID_1)

    # 关键功能:启用垂直翻转(上下翻转)
    # 设置为True时,图像会上下翻转
    # 应用场景:摄像头倒置安装、特殊显示需求
    sensor.set_vflip(True)
    
    return sensor  # 返回配置好的传感器对象

def main():
    """
    Main function to run camera preview
    运行摄像头预览的主函数
    
    功能:主程序流程,包含初始化、运行和清理
    """
    sensor = None  # 初始化传感器变量,便于异常处理
    
    try:
        # Initialize camera sensor
        # 初始化摄像头传感器
        sensor = init_sensor()  # 调用初始化函数获取传感器对象
        
        # Initialize virtual display with 640x480 resolution
        # 初始化640x480分辨率的虚拟显示
        # 参数说明:
        # Display.ST7701 - 显示屏驱动型号
        # width=640, height=480 - 显示分辨率,与摄像头分辨率匹配
        # to_ide=True - 同时输出到IDE,便于调试和观察
        Display.init(Display.ST7701, width=640, height=480, to_ide=True)

        # Initialize media management
        # 初始化媒体管理
        # 作用:分配和管理媒体处理所需的系统资源
        MediaManager.init()
        
        # Start sensor operation
        # 启动传感器运行
        # 作用:开始摄像头数据采集流程
        sensor.run()

        # Main loop to capture and display frames
        # 捕获和显示帧的主循环
        # 功能:持续捕获图像并显示,形成实时预览
        while True:
            # Capture frame from channel 1
            # 从通道1捕获帧
            # 返回值img:包含图像数据的对象
            img = sensor.snapshot(chn=CAM_CHN_ID_1)
            
            # Display captured frame
            # 显示捕获的帧
            # 作用:将图像数据发送到显示设备
            Display.show_image(img)
            
    except KeyboardInterrupt:
        # 处理键盘中断(Ctrl+C)
        print("User interrupted the program")
        print("用户中断了程序")
        
    except Exception as e:
        # 处理其他所有异常
        print(f"An error occurred: {str(e)}")
        print(f"发生错误: {str(e)}")
        
    finally:
        # Cleanup section
        # 清理部分 - 无论是否发生异常都会执行
        
        # Stop sensor if initialized
        # 如果传感器已初始化则停止
        # 作用:安全停止摄像头采集,释放硬件资源
        if isinstance(sensor, Sensor):
            sensor.stop()
            
        # Deinitialize display
        # 反初始化显示
        # 作用:关闭显示驱动,释放显示资源
        Display.deinit()

        # Enable sleep mode
        # 启用睡眠模式
        # 作用:允许系统进入低功耗状态
        os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
        time.sleep_ms(100)  # 短暂延时确保资源完全释放
        
        # Release media resources
        # 释放媒体资源
        # 作用:清理媒体管理器分配的所有资源
        MediaManager.deinit()

if __name__ == "__main__":
    # 程序入口点
    main()  # 调用主函数启动程序

代码核心功能解析
1. 垂直翻转实现
python
sensor.set_vflip(True)
功能:启用摄像头垂直翻
效果:图像上下翻转,顶部变为底部,底部变为顶部
技术原理:在传感器硬件层面重新映射像素读取顺序

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

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

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

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

技术要点
配置时机的重要性
python
sensor.reset()  # 先重置
sensor.set_vflip(True)  # 再设置翻转
必须在sensor.reset()之后、sensor.run()之前设置翻转参数,确保配置生效。

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

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

python
# 同时启用水平和垂直翻转(180度旋转)
sensor.set_hmirror(True)
sensor.set_vflip(True)
这个程序展示了CanMV K230模块在硬件层面处理图像变换的能力,代码结构清晰,资源管理完善,是学习摄像头编程的良好示例。

 

实验场景图

 

44.jpg
45 (1).jpg
45 (2).jpg

评论

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