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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目&#xff0c;通过学习FM调制过程熟悉信号处理的一个简单流程&#xff0c;进而熟悉…

论文笔记(五十九)A survey of robot manipulation in contact

A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念&#xff1a;应用实例&#xff1a; 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…

拥抱 OpenTelemetry:阿里云 Java Agent 演进实践

作者&#xff1a;陈承 背景 在 2018 年的 2 月&#xff0c;ARMS Java Agent 的第一个版本正式发布&#xff0c;为用户提供无侵入的的可观测数据采集服务。6 年后的今天&#xff0c;随着软件技术的迅猛发展、业务场景的逐渐丰富、用户规模的快速增长&#xff0c;我们逐渐发现过…

学习ASP.NET Core的身份认证(基于Session的身份认证3)

开源博客项目Blog中提供了另一种访问控制方式&#xff0c;其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式&#xff0c;测试程序中直接复用开源博客项目Blog中的相关类及接口定义&#xff0c;并在其上调整判断逻辑。   首先是接口A…

电子应用设计方案-31:智能AI音响系统方案设计

智能 AI 音响系统方案设计 一、引言 智能 AI 音响作为一种新兴的智能家居设备&#xff0c;通过融合语音识别、自然语言处理、音频播放等技术&#xff0c;为用户提供便捷的语音交互服务和高品质的音乐体验。本方案旨在设计一款功能强大、性能稳定、用户体验良好的智能 AI 音响系…

可变电阻和电位器

1.可变电阻和电位器 &#xff08;1&#xff09;可变电阻&#xff1a;阻值可以调整的电阻。 &#xff08;2&#xff09;电位器&#xff1a;为了获得某个电位&#xff08;电势、电压&#xff09;的器件。其本质就是在一个固定阻值的电阻中间增 加一个触点&#xff0c;滑动电阻的中…

RK3568平台开发系列讲解(PWM篇)PWM 子系统框架

🚀返回专栏总目录 文章目录 一、PWM 设备驱动层二、PWM 核心层三、PWM 适配器驱动层沉淀、分享、成长,让自己和他人都能有所收获!😄 📢整个 PWM 子系统可以用下面的框图来描述: 再上图中 PWM 子系统被划分为了三个层次, 分别为用户空间、 内核空间和硬件层, 内核空…

CSAPP Cache Lab(缓存模拟器)

前言 理解高速缓存对 C 程序性能的影响&#xff0c;通过两部分实验达成&#xff1a;编写高速缓存模拟器&#xff1b;优化矩阵转置函数以减少高速缓存未命中次数。Part A一开始根本不知道要做什么&#xff0c;慢慢看官方文档&#xff0c;以及一些博客&#xff0c;和B站视频&…

【趣味升级版】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 开始游戏 手动升级&#xff08;满100%即可升级&#xff09; 升级完成&#xff0c;即可解锁打怪模式 新增功能说明&#xff1a; 如何操作&#xff1a; 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建…

hadoop环境配置-vm安装+麒麟ubantu

一.VM版本 选择16版本&#xff0c;15版本存在windows蓝屏的情况&#xff0c;也不用设置HV等相关设置 激活下载参考下述博客&#xff1a;https://blog.csdn.net/matrixlzp/article/details/140674802 提前在bois打开SVM设置&#xff0c;不设置无法打开新建的虚拟机 ubantu下载…

会议直击|美格智能亮相2024紫光展锐全球合作伙伴大会,融合5G+AI共拓全球市场

11月26日&#xff0c;2024紫光展锐全球合作伙伴大会在上海举办&#xff0c;作为紫光展锐年度盛会&#xff0c;吸引来自全球的众多合作伙伴和行业专家、学者共同参与。美格智能与紫光展锐竭诚合作多年&#xff0c;共同面向5G、AI和卫星通信为代表的前沿科技&#xff0c;聚焦技术…

工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控

小T导读&#xff1a;在工业节能和智能化转型的浪潮中&#xff0c;蘑菇物联凭借其自研的灵知 AI 大模型走在行业前沿&#xff0c;为高能耗设备和公辅能源车间提供先进的 AI 解决方案。此次采访聚焦于蘑菇物联与 TDengine 的合作项目&#xff0c;通过 AI 云智控平台的建设&#x…

华为IPD流程学习之——深入解读123页华为IPD流程体系设计方法论PPT

该方案全面介绍了华为IPD流程体系设计方法论&#xff0c;包括流程体系建设的背景、理念、架构、核心特征、构建模型、与组织和战略的关系、运营机制、数字化转型以及流程管理组织等内容&#xff0c;旨在为企业提供一套系统的流程体系建设指导&#xff0c;以提升运营效率、质量和…

插入数据报错:Data truncation: Out of range value for column ‘id‘ at row 1

问题描述&#xff1a; 使用Mybatis-plus插入用户数据报错 错误&#xff1a; SQL: INSERT INTO t_user ( id, username, pwd ) VALUES ( ?, ?, ? ) Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column ‘id’ at …

IntelliJ+SpringBoot项目实战(十九)--在API接口中实现SpringSecurity登录并生成JWT的accessToken

在上节中实现了SpringBootJWT登录&#xff0c;但是介绍的登录是基于SpringSecurity的默认登录页实现的。但是项目开发目前很多都是前后端分离的&#xff0c;也就是VUEAPI接口的模式。所以我们需要实现在API接口中使用SpringSecurity登录。 首先需要在WebSecurityConfig中增加Au…

流水线并行,重计算:GPipe;1F1B(一前一后)调度机制

目录 GPipe 一、GPipe的背景与目的 二、GPipe的功能与特点 三、GPipe的应用与效果 四、GPipe的开源与可扩展性 1F1B(一前一后)调度机制 一、背景与基本概念 二、1F1B调度机制的要求 三、应用与挑战 GPipe 是一个基于Lingvo(Lingvo是Google基于TensorFlow二次开发的…

1-1 Gerrit实用指南

注&#xff1a;学习gerrit需要拥有git相关知识&#xff0c;如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统&#xff0c;它使用 Git 作为底层版本控制系统。Gerrit 的主要功…

基于TensorFlow的手写体数字识别训练与测试

需求&#xff1a; 选择一个最简单的细分方向&#xff0c;初步了解AI图像识别的训练、测试过程TensorFlow、PyTorch、c&#xff0c;三种代码方案&#xff0c;先从TensorFlow入手探讨最基本问题的优化问题 总结&#xff1a; 基于TensorFlow的python代码库自带了mnist 训练数据…

通信与网络基础

1.网络通信基本概念 通信&#xff1a;人、物通过某种介质和行为进行信息传递与交流 网络通信&#xff1a;终端设备之间通过计算机网络进行通信 两个终端通过网线传递文件 多个终端通过路由器传递文件 终端通过Internet下载文件 2.信息传递过程 图1-1 假定A计算机访问B的web…

[免费]SpringBoot+Vue景区订票(购票)系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue大景区订票(购票)系统&#xff0c;分享下哈。 项目视频演示 【免费】SpringBootVue景区订票(购票)系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 现代经济快节奏发展以及不断完善升级的信息…