首页 > 其他分享 >【K230 CanMV】图像识别-摄像头获取图像 Sensor 函数全解析

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

时间:2024-12-01 12:57:59浏览次数:7  
标签:输出 图像识别 CAM 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()

标签:输出,图像识别,CAM,K230,CanMV,传感器,图像,sensor,摄像头
From: https://blog.csdn.net/weixin_64593595/article/details/144161326

相关文章

  • 深度学习1:从图像识别到自动驾驶:深度学习如何引领未来出行新趋势?
    文章目录导读一、机器学习与经验积累:一场智慧的碰撞二、深度学习的四大基石:数据模型目标函数与算法三、深度学习的应用场景:从多标签分类到强化学习四、深度学习的发展历程:从“重新发现”到“寒武纪大爆发”五、深度学习的成功案例:从智能助理到自动驾驶结语:迎接智......
  • 《DNK210使用指南 -CanMV版 V1.0》第四十章 YOLO2人手检测实验
    第四十章YOLO2人手检测实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正......
  • 使用Perl实现基本图像识别
    Perl是一种强大的编程语言,广泛用于文本处理和系统管理。虽然Perl本身并不专注于图像处理,但通过外部库(如Image::Magick),我们可以非常方便地进行图像识别和处理。以下示例展示如何使用Perl和Image::Magick库实现图像的边缘检测。环境准备安装Perl和Image::Magick:在大多......
  • 使用Perl实现图像识别
    Perl是一种强大的编程语言,广泛用于文本处理和系统管理。虽然Perl本身并不专注于图像处理,但通过外部库(如Image::Magick),我们可以非常方便地进行图像识别和处理。以下示例展示如何使用Perl和Image::Magick库实现图像的边缘检测。环境准备安装Perl和Image::Magick:在大多......
  • 使用F#实现基本图像识别
    F#是一种函数式编程语言,运行于.NET平台,具有强大的类型系统和高效的计算能力。虽然F#主要用于数据科学、并行计算等领域,但它同样可以与.NET库结合,进行高效的图像处理。在本示例中,我们将使用F#和OpenCV库来实现图像的边缘检测。环境准备安装.NETSDK:可以通过官网安装......
  • 使用Haskell语言实现基本图像识别
    Haskell是一种纯函数式编程语言,广泛应用于学术研究和高性能计算领域。它的惰性求值和强类型系统使得它在处理复杂的算法时非常高效。以下是使用Haskell语言实现Sobel边缘检测的代码示例。代码实现为了进行图像处理,Haskell提供了多个图像处理库,其中JuicyPixels和vector是常用的库......
  • 使用Lua语言实现基本图像识别
    Lua是一种轻量级、高效的脚本语言,广泛用于游戏开发和嵌入式系统。尽管Lua本身并不直接支持图像处理,但我们可以使用一些第三方库来实现图像的读取、处理和保存。在这个示例中,我们将使用LuaJIT和lImage库来处理图像,并实现基本的Sobel边缘检测。代码实现首先,确保安装了LuaJIT和lIma......
  • 使用Scala语言实现基本图像识别
    Scala是一种静态类型、函数式和面向对象的编程语言,它运行在JVM上,并且与Java高度兼容。Scala语言在数据处理和并发编程方面非常强大,下面是使用Scala语言实现Sobel边缘检测的代码示例。代码实现为了实现图像处理,我们将使用javax.imageio.ImageIO类来读取和保存图像,同时使用java.aw......
  • 使用Rust语言实现基本图像识别
    Rust是一种注重安全性和并发性的编程语言,适合进行高效的系统级开发。以下是使用Rust语言实现Sobel边缘检测的代码示例。代码实现为了实现图像处理,我们将使用image和ndarray库来处理图像数据。toml[dependencies]image="0.24.3"ndarray="0.15.4"Rust代码rustexterncr......
  • 使用Forth实现基本图像识别
    Forth是一种高效、简洁的编程语言,尽管主要用于嵌入式系统,但它也可以实现一些基础的图像处理任务。以下展示了如何使用Forth实现Sobel算子边缘检测。代码实现以下代码假设使用了一种支持图像处理的Forth环境,或者基于自定义的扩展实现。forth更多内容访问ttocr.com或联系143642......