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

news2025/2/12 8:22:28

引言:随着图像处理技术的不断发展,摄像头在嵌入式系统中的应用越来越广泛,尤其是在智能监控、自动驾驶、机器人视觉等领域。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.coloradmin.cn/o/2250987.html

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

相关文章

SQL优化与性能——数据库设计优化

数据库设计优化是提高数据库性能、确保数据一致性和支持业务增长的关键环节。无论是大型企业应用还是小型项目&#xff0c;合理的数据库设计都能够显著提升系统性能、减少冗余数据、优化查询响应时间&#xff0c;并降低维护成本。本章将深入探讨数据库设计中的几个关键技术要点…

用Python做数据分析环境搭建及工具使用(Jupyter)

目录 一、Anaconda下载、安装 二、Jupyter 打开 三、Jupyter 常用快捷键 3.1 创建控制台 3.2 命令行模式下的快捷键 3.3 运行模式下快捷键 3.4 代码模式和笔记模式 3.5 编写Python代码 一、Anaconda下载、安装 【最新最全】Anaconda安装python环境_anaconda配置python…

Jmeter测试工具的安装和使用,mac版本,jmeter版本5.2.1

Jmeter测试工具的安装和使用JSON格式请求 一、安装1、安装jdk包和设置java环境2、去官网下载Jmeter3、解压后&#xff0c;打开mac终端&#xff0c;进入apache-jmeter的bin文件开启jmeter 二、使用jmeter1、添加线程2、添加HTTP请求3、配置请求的协议、IP地址、端口号、请求方法…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性&#xff1a;技术背景 本企业网站在Windows操作系统中进行开发&#xff0c;并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

【初阶数据结构和算法】二叉树顺序结构---堆的定义与实现(附源码)

文章目录 一、堆的定义与结构二、堆的实现1.堆的初始化和销毁堆的初始化堆的销毁 2.向上调整算法和入堆向上调整算法入堆 3.向下调整算法和出堆顶数据向下调整算法出堆 4.堆的有效数据个数和判空堆的有效数据个数堆的判空 5.取堆顶数据 三、堆的源码 一、堆的定义与结构 本篇内…

黑马程序员Java笔记整理(day05)

1.面向对象编程 2.用法 3.对象是什么 4.对象在计算机中是啥 5.无参与有参构造器 小结: 6.this的作用 7.小结 8.封装 9.小结 10.实体类 11.小结 12.static 13.小结 14.static修饰方法 15.static应用前景 16.几个注意事项 17.java中可以直接用类的名字创建数组&#xff0c;如: M…

管理锻炼数据_创建类

● 这篇文章和大家一起学习创建类来管理我们的锻炼数据 ● 首先我们先创建这些类&#xff0c;然后讲锻炼数据中的数据写出来 class Workout {date new Date();constructor(coords, distance, duration) {this.coords coords;this.distance distance; //kmthis.duration du…

241127学习日志——[CSDIY] [InternStudio] 大模型训练营 [20]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…

qt QAnimationDriver详解

1、概述 QAnimationDriver是Qt框架中提供的一个类&#xff0c;它主要用于自定义动画帧的时间控制和更新。通过继承和实现QAnimationDriver&#xff0c;开发者可以精确控制动画的时间步长和更新逻辑&#xff0c;从而实现丰富和灵活的动画效果。QAnimationDriver与QAbstractAnim…

更多开源创新 挑战OpenAI-o1的模型出现和AI个体模拟突破

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

CSP-J初赛不会备考咋办?

以下备考攻略仅供参考&#xff0c;如需资料请私信作者&#xff01;求支持&#xff01; 目录 一、编程语言基础 1.语法知识 -变量与数据类型 -运算符 -控制结构 -函数 2.标准库的使用 -输入输出流 -字符串处理 -容器类&#xff08;可选&#xff09; 二、算法与数据结构 1.基…

电路基础——相量法

相量法 为什么要使用相量表示&#xff1f; 电路方程是微分方程&#xff1a; 电路的运算&#xff08;如KCL、KVL方程运算&#xff09;会涉及到两个正弦量的相加&#xff1a; 如下图所示同频率的正弦量相加仍得到同频率的正弦量&#xff0c;因此只需确定初相位和有效值。 基于上…

第七课 Unity编辑器创建的资源优化_UI篇(UGUI)

上期我们学习了简单的Scene优化&#xff0c;接下来我们继续编辑器创建资源的UGUI优化 UI篇&#xff08;UGUI&#xff09; 优化UGUI应从哪些方面入手&#xff1f; 可以从CPU和GPU两方面考虑&#xff0c;CPU方面&#xff0c;避免触发或减少Canvas的Rebuild和Rebatch&#xff0c…

如何使用ST7789展现图片?[ESP--4]

本节我们继续ESP和ST 7789的话题&#xff0c;这节课我们来学学如何展示图片,话不多说&#xff0c;先上效果 好&#xff0c;教程开始~前情提要&#xff0c;要看懂这篇&#xff0c;建议搭配楼主的前两期文章 使用ESP32驱动LCD-ST7789屏幕[ESP–2] 加速你的LCD-ST7789屏幕&#xf…

代码随想录day02--链表

移除链表元素 题目 地址&#xff1a;https://leetcode.cn/problems/remove-linked-list-elements/description/ 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路是使用虚拟节点的…

electron-updater软件自动检测更新 +无服务器本地测试

大家好&#xff0c;我是小黄。 今天分享一下如何0基础实现electron自动检测更新功能。 一. 安装 electron-updater 实现自动更新 安装依赖 electron-updater npm install electron-updater 二. 修改package.josn "publish": {"provider": "generi…

【Linux——实现一个简易shell】

黑暗中的我们都没有说话&#xff0c;你只想回家&#xff0c;不想你回家............................................................... 文章目录 前言 一、【shell工作过程】 二、【命令行参数】 2.1、【获取命令行参数】 1、【输出命令行提示符】 2、【输入命令行参数】 2…

【超全总结】深度学习分割模型的损失函数类别及应用场景

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

新增工作台模块,任务中心支持一键重跑,MeterSphere开源持续测试工具v3.5版本发布

2024年11月28日&#xff0c;MeterSphere开源持续测试工具正式发布v3.5版本。 在这一版本中&#xff0c;MeterSphere新增工作台模块&#xff0c;工作台可以统一汇总系统数据&#xff0c;提升测试数据的可视化程度并增强对数据的分析能力&#xff0c;为管理者提供测试工作的全局…

大模型训练核心技术RLHF

本文此次的主要内容是使用强化学习训练语言模型的过程&#xff0c;特别是通过人类反馈的强化学习&#xff08;RLHF&#xff09;技术来微调大语言模型。本文先介绍了预训练模型的使用&#xff0c;然后重点介绍了RLHF的第二阶段&#xff0c;即将下游任务以特定数据集的形式交给大…