当前位置: 首页 > article >正文

【K230 CanMV】图像识别-摄像头获取图像 Sensor 函数全解析

引言:随着图像处理技术的不断发展,摄像头在嵌入式系统中的应用越来越广泛,尤其是在智能监控、自动驾驶、机器人视觉等领域。K230作为一款高性能的嵌入式处理器,提供了强大的图像处理能力,支持多种类型的摄像头接入与图像采集功能。在使用K230进行图像识别应用时,了解和掌握图像传感器(Sensor)的工作原理与控制方法是至关重要的。本文章将详细解析K230平台下如何通过操作摄像头Sensor模块,进行图像获取与处理,帮助开发者深入理解K230摄像头架构及其相关功能。

目录

一、MIPI摄像头

二、K230的摄像头架构

三、Sensor 部分函数解析

1.构造函数

2.复位sensor

3.设置sensor指定通道的输出图像尺寸

4.配置指定通道的图像传感器输出图像格式

5.配置sensor是否进行垂直翻转

6.启动图像传感器的输出

7.停止sensor图像传感器输出

8.捕获sensor一帧图像数据

四、获取sensor的图像


一、MIPI摄像头

摄像头用的是立创商城的 GC2093 如下图所示。

特性/比较维度CMOS传感器CCD传感器
工作原理每个像素独立工作,利用晶体管直接进行信号转换与放大。光电信号通过一个连续的电荷传递链传输到信号输出端。
图像质量成像质量逐年提高,特别在低光环境下的性能不断优化。高动态范围和低噪声,特别在低光条件下表现出色。
功耗相对较低,适合移动设备和功耗敏感的应用。功耗较高,需要较大的电力支持,通常用于静态设备。
速度(帧率)通常较高,适合需要高速成像的应用,如视频流。帧率较低,但在高分辨率下仍能提供稳定的输出。
尺寸和集成度通常更小,更易于集成在紧凑的设备中。尺寸较大,集成度较低,通常用于单独的成像模块。
噪声水平相比 CCD,噪声较高,但随着技术进步有所改善。噪声较低,成像效果更为平滑,尤其在低光条件下。
动态范围动态范围在低光环境下较差,但在光照充足时表现较好。动态范围较广,适用于对高对比度要求的场景。
色彩还原在高光照条件下色彩还原较为准确,尤其是在高分辨率情况下。色彩还原优秀,特别适合在复杂光照条件下的拍摄。
成本相对较低,制造工艺成熟,成本优势明显。较高,制造工艺复杂且成本较高。
温度稳定性对温度变化的稳定性较差,可能导致信号失真。对温度变化的稳定性较好,能够更好地适应环境变化。
使用场景- 智能手机、数码相机、安防监控、无人机等。
- 高帧率视频、实时图像处理、低功耗设备。
- 专业相机、高端天文望远镜、医学影像设备等。
- 对图像质量要求极高、低光环境的成像。
优点- 成本低、功耗低、速度快、尺寸小。
- 适合大规模生产。
- 成像质量高,噪声低,动态范围广。
- 适合高质量成像要求。
缺点- 图像噪声较高、低光表现差。
- 动态范围有限。
- 成本高、功耗大、集成度差。

名称参数
焦距(EFL)4.3MM
光圈(F.NO)2.0
视场角(View Angle)D73°/H65°/V40°
畸变<0.5%

原理图如下所示,我们补充一下mipi线序的知识,如下为原理图中的2lane的案例。

如下为4lane的CSI 显示的接口,可以看出来数据差分线的个数变化。

二、K230的摄像头架构

K230芯片集成了两颗RISC-V处理器核心,双核玄铁C908,7nm 制程工艺,主频高达1.6GHz,是全球首款支持RISC-V Vector 1.0标准的商用SOC,配备第三代KPU处理单元,专为图像、视频、音频处理和AI加速设计,提供强劲的本地AI推理能力。支持三路MIPI CSI视频输入,最大分辨率可达4K。K230支持常见的AI计算框架如TensorFlow和PyTorch。下面是该处理器的框架图:

K230的Sensor模块API提供了对这些硬件的底层控制,模块负责图像采集与数据处理。该模块提供了一套高级 API,开发者可以利用这些接口轻松获取不同格式与尺寸的图像,而无需了解底层硬件的具体实现。其架构如下图所示:

图中,sensor 0sensor 1 和 sensor 2 分别代表三个图像输入传感器设备;这些传感器主要用于将环境中的光信号转化为数字图像信号。在实际系统中,这些传感器可以安装在不同的位置,用来捕获来自不同视角或者区域的图像数据。图中,sensor 0sensor 1 和 sensor 2 分别代表三个图像输入传感器设备;这些传感器主要用于将环境中的光信号转化为数字图像信号。在实际系统中,这些传感器可以安装在不同的位置,用来捕获来自不同视角或者区域的图像数据。

每个Camera Device支持 3个输出通道output channel 0output channel 1 和 output channel 2)。这些输出通道的主要功能是将处理后的图像数据并行传输到后续的算法模块或显示设备,同时也支持多种数据格式和尺寸。这样的架构设计,让K230能够支持多路图像数据的高效并行处理,非常适合实时性要求较高的AI视觉任务。

K230 的 sensor 模块最多支持三路图像传感器的同时接入,每一路均可独立完成图像数据的采集、捕获和处理。此外,每个视频通道可并行输出三路图像数据供后端模块进行进一步处理。实际应用中,具体支持的传感器数量、输入分辨率和输出通道数将受限于开发板的硬件配置和内存大小,因此需根据项目需求进行综合评估。

三路图像输入

同时接入3个传感器,适合多摄像头应用场景,比如:

  • 自动驾驶中的多视角检测。
  • 安防监控中的多区域捕获。
  • 工业检测中的多面检测。

三路图像输出

为每个输入提供并行的多通道输出,便于在不同模块中并发处理,比如:

  • 一路用于实时显示。
  • 一路用于AI算法推理。
  • 一路用于视频存储或回放。

三、Sensor 部分函数解析

如下为导入的包,不多赘述。

from media.sensor import *

1.构造函数

在图像处理应用中,用户通常需要首先创建一个 Sensor 对象。CanMV K230 软件可以自动检测内置的图像传感器,无需用户手动指定具体型号,只需设置传感器的最大输出分辨率和帧率。

sensor = Sensor(id, [width, height, fps])

参数

参数名称描述输入/输出说明
idcsi 端口,支持 0,1,2输入可选,庐山派开发板默认摄像头为CSI2
widthsensor 最大输出图像宽度输入可选,默认 1920
heightsensor 最大输出图像高度输入可选,默认 1080
fpssensor 最大输出图像帧率输入可选,默认 30

返回值

返回值描述
Sensor 对象传感器对象

 举例如下:

sensor = Sensor(0, [1920, 1080, 30])
  • sensor 是传感器对象。
  • 该传感器的 id0
  • 图像的分辨率是 1920x1080,即 1080p。
  • 摄像头的帧率是 30 帧每秒。
sensor = Sensor(1, [640, 480, 15])
  • sensor 是另一个传感器对象。
  • 该传感器的 id1
  • 图像的分辨率是 640x480,即 VGA 分辨率。
  • 摄像头的帧率是 15 帧每秒。
sensor = Sensor(2, [3840, 2160, 60])
  • sensor 是第三个传感器对象。
  • 该传感器的 id2
  • 图像的分辨率是 3840x2160,即 4K 分辨率。
  • 摄像头的帧率是 60 帧每秒。

2.复位sensor

sensor.reset()

3.设置sensor指定通道的输出图像尺寸

sensor.set_framesize(framesize=FRAME_SIZE_INVALID, chn=CAM_CHN_ID_0, alignment=0, **kwargs)
参数名称描述输入/输出
framesizesensor 输出图像尺寸输入
width【**kwargs】输出图像宽度,kw_arg输入
height 【**kwargs】输出图像高度,kw_arg输入
chnsensor 输出通道号输入

参数可选值:

  • 设置输出图像尺寸,【framesize】和【width or height】二选一

    • framesize

      • 图像帧尺寸分辨率
        Sensor.VGA640x480
        Sensor.HD1280x720
        Sensor.FHD1920x1080
    • width or height

      • 这个就是自己填分辨率就行。
  • 设置输出通道号

    • chn
      • 通道0:CAM_CHN_ID_0
      • 通道1:CAM_CHN_ID_1
      • 通道2:CAM_CHN_ID_2

 假设你想将摄像头的分辨率设置为 VGA(640x480),并选择通道 CAM_CHN_ID_0

sensor.set_framesize(framesize="FRAME_SIZE_VGA", chn="CAM_CHN_ID_0", alignment=0)

假设你要将摄像头的分辨率设置为 1080p(1920x1080),并选择第一个摄像头通道:

sensor.set_framesize(framesize="FRAME_SIZE_1080P", chn="CAM_CHN_ID_0", alignment=0)

如果你使用的摄像头支持 4K 分辨率(3840x2160)

sensor.set_framesize(framesize="FRAME_SIZE_4K", chn="CAM_CHN_ID_0", alignment=0)

有时你可能想设置一个自定义的分辨率(例如 1280x960)

sensor.set_framesize(framesize=(1280, 960), chn="CAM_CHN_ID_0", alignment=0)

4.配置指定通道的图像传感器输出图像格式

sensor.set_pixformat(pix_format, chn=CAM_CHN_ID_0)
参数名称描述输入/输出
pix_format输出图像格式(像素格式)输入
chnsensor 输出通道号输入

参数可选值:

  • 设置像素格式(如果想知道这些像素格式的具体定义,请看后续的摄像头基础知识部分)

    • 像素格式说明
      Sensor.RGB56516 位 RGB 格式
      Sensor.RGB88824 位 RGB 格式
      Sensor.RGBP888分离的 24 位 RGB
      Sensor.YUV420SP半平面 YUV
      Sensor.GRAYSCALE灰度图
  • 设置输出通道号

    • chn
      • 通道0:CAM_CHN_ID_0
      • 通道1:CAM_CHN_ID_1
      • 通道2:CAM_CHN_ID_2

 假设我们要设置摄像头为 RGB565 格式(常用于图像显示和处理),并且选择第一个摄像头通道:

sensor.set_pixformat(pix_format="PIXFORMAT_RGB565", chn="CAM_CHN_ID_0")

如果你的应用是视频处理,可能会选择 YUV422 格式,它通常用于压缩视频流并具有较低的带宽要求:

sensor.set_pixformat(pix_format="PIXFORMAT_YUV422", chn="CAM_CHN_ID_0")

如果你只需要处理黑白图像,可以选择 GRAYSCALE 格式,它会将图像转换为单通道的灰度图像,每个像素占 1 字节:

sensor.set_pixformat(pix_format="PIXFORMAT_GRAYSCALE", chn="CAM_CHN_ID_0")

 在图像存储或传输时,JPEG 格式通常用于压缩图像以减小文件大小:

sensor.set_pixformat(pix_format="PIXFORMAT_JPEG", chn="CAM_CHN_ID_0")

5.配置sensor是否进行垂直翻转

sensor.set_vflip(enable)

 True 开启垂直翻转功能
False 关闭垂直翻转功能

6.启动图像传感器的输出

sensor.run()

7.停止sensor图像传感器输出

sensor.stop()

8.捕获sensor一帧图像数据

sensor.snapshot(chn=CAM_CHN_ID_0)

四、获取sensor的图像

  • 初始化摄像头传感器和显示设备。
  • 设置摄像头的帧大小和像素格式,启动摄像头。
  • 初始化媒体管理器和时钟计算帧率。
  • 进入主循环,每次捕获图像并显示,同时计算和打印当前的帧率。
  • 在发生异常时(如用户中断或其他错误),进行异常处理。
  • 最终释放资源,清理摄像头、显示设备和媒体管理器,进入睡眠模式。
import time, os, sys
import utime
from media.sensor import *
from media.display import *
from media.media import *

sensor_id = 2
sensor = None

try:
    # 构造一个具有默认配置的摄像头对象
    sensor = Sensor(id=sensor_id)
    # 重置摄像头sensor
    sensor.reset()
    # 无需进行镜像翻转
    # 设置水平镜像
    # sensor.set_hmirror(False)
    # 设置垂直翻转
    # sensor.set_vflip(False)
    # 设置通道0的输出尺寸为1920x1080
    sensor.set_framesize(Sensor.FHD, chn=CAM_CHN_ID_0)
    # 设置通道0的输出像素格式为RGB565
    sensor.set_pixformat(Sensor.RGB888)
    # 使用IDE的帧缓冲区作为显示输出
    Display.init(Display.VIRT, width=1920, height=1080, to_ide=True)
    # 初始化媒体管理器
    MediaManager.init()
    # 启动传感器
    sensor.run()
    #构造clock
    clock = utime.clock()
    while True:
        os.exitpoint()
        #更新当前时间(毫秒)
        clock.tick()
        # 捕获通道0的图像
        img = sensor.snapshot(chn=CAM_CHN_ID_0)
        # 显示捕获的图像
        Display.show_image(img)
        #打印当前fps
        print("fps = ", clock.fps())

except KeyboardInterrupt as e:
    print("用户停止: ", e)
except BaseException as e:
    print(f"异常: {e}")
finally:
    # 停止传感器运行
    if isinstance(sensor, Sensor):
        sensor.stop()
    # 反初始化显示模块
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    # 释放媒体缓冲区
    MediaManager.deinit()


http://www.kler.cn/a/417576.html

相关文章:

  • Python基础知识:注释、变量以及数据类型、标识符和关键字、输入函数、输出函数、运算符、程序类型转换
  • 使用线性回归模型逼近目标模型 | PyTorch 深度学习实战
  • R语言 | 使用 ComplexHeatmap 绘制热图,分区并给对角线分区加黑边框
  • 图像分类与目标检测算法
  • 基于springboot的体质测试数据分析及可视化设计
  • C语言:深入了解指针3
  • 开源法律、政策和实践
  • ArcGIS栅格影像裁剪工具
  • R安装rgdal报错 解决办法
  • Android 引入 proto 项目及使用方法
  • 网络安全相关证书资料
  • linux环境下,导出conda和pip的安装包和对应版本
  • solana java 转账交易示例
  • 前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表
  • DDR3保姆级使用教程:ZYNQ 7010
  • 【嵌入式——QT】QT制作安装包
  • 什么是换电系统?驱动新能源汽车发展的“能源驿站”
  • 构造函数与析构函数错题汇总
  • pip 安装指定镜像源
  • ssm_mysql_考研指导平台
  • Linux进程间通信(上)
  • android-studio 下载并安装
  • 如何正确书写sh文件/sh任务?bash任务
  • 数据结构-最小生成树
  • vue3+ant design vue实现日期选择器默认显示当前年,并限制用户只能选择当前年及之前~
  • Astra+ 深度相机系统架构解析:组件功能、数据流和应用领域