基于立创开发板的庐山派摄像头使用教程(1)

ChangeCode
原创
发布时间: 2025-06-11 10:08:14 | 阅读数 0收藏数 0评论数 0
封面
随着嵌入式系统和人工智能技术的发展,图像处理和计算机视觉应用变得越来越普及。庐山派K230CanMV开发板凭借其强大的算力和丰富的外设接口,成为了众多开发者进行图像识别、机器学习等项目的理想选择。

准备工作:

材料:

材料名称
数量
备注
卢山派
1
摄像头模块
1
1

GC2093摄像头

镜头参数:


名称

参数

感光元件

GC2093

最大分辨率

1920x1080

最大帧率

60fps@full size

感光尺寸

1/2.9

该镜头为购买庐山派标准版即附送,无需额外购买,除非你需要用两个以上的摄像头。

购买链接: https://item.szlcsc.com/44319753.html



2

机械尺寸及引脚定义

镜头参数:


名称

参数

感光元件

GC2093

最大分辨率

1920x1080

最大帧率

60fps@full size

感光尺寸

1/2.9

该镜头为购买庐山派标准版即附送,无需额外购买,除非你需要用两个以上的摄像头。

购买链接: https://item.szlcsc.com/44319753.html



3

GC2093-200W摄像头


主要取决于你用那个,我的是GC2093摄像头


4

K230摄像头驱动方式

在立创·庐山派-K230-CanMV开发板中,Sensor模块的主要作用是负责获取图像数据。这个模块将光信号转化为数字信号,供后续图像处理算法使用。

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


图中,sensor 0sensor 1sensor 2 分别代表三个图像输入传感器设备;这些传感器主要用于将环境中的光信号转化为数字图像信号。在实际系统中,这些传感器可以安装在不同的位置,用来捕获来自不同视角或者区域的图像数据。比如说三路摄像头场景,车辆前后摄像检测各一路+驾驶仓内一路。也可以将CSI0+CSI1转接成一个4lane的接口用来接更高清的摄像头。

Camera Device 0Camera Device 1Camera Device 2 是用于处理传感器输入数据的核心单元。每个 Camera Device 可以独立完成图像数据捕获,格式转换及预处理等。传感器和Camera Device之间是多对多的关系,也就是说多个传感器输入可以灵活映射到不同的Camera Device。

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

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

三路图像输入

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

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

三路图像输出

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

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


5

import导入模块

要使用 摄像头 sensor,首先需要导入该模块:

from media.sensor import *
6

获取默认摄像头的图像

import time, os, sys

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的输出像素格式为RGB888
sensor.set_pixformat(Sensor.RGB888, chn=CAM_CHN_ID_0)

# 使用IDE的帧缓冲区作为显示输出
Display.init(Display.VIRT, width=1920, height=1080, to_ide=True)
# 初始化媒体管理器
MediaManager.init()
# 启动传感器
sensor.run()

while True:
os.exitpoint()

# 捕获通道0的图像
img = sensor.snapshot(chn=CAM_CHN_ID_0)
# 显示捕获的图像
Display.show_image(img)

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()

以上代码主要用于初始化并配置摄像头传感器,设置其输出格式和分辨率,然后在主循环中不断捕获图像并显示。首先,创建并重置传感器对象,设置输出分辨率为1920x1080(全高清),像素格式为RGB888。然后,初始化显示模块,将输出定向到IDE的虚拟帧缓冲区。接着,启动传感器,在无限循环中持续捕获图像并显示。程序在异常或中断时,会正确地停止传感器和显示模块,并释放相关资源。

将以上代码复制进CanMV IDE K230中,连接开发板后运行就能看到帧缓冲区里面的图像了

7

打印当前帧率

将默认摄像头座子(CSI2)上的摄像头拆下来,将它安装到CSI0或CSI1上面。

import time, os, sys

import utime
from media.sensor import *
from media.display import *
from media.media import *

#用CSI0接口的摄像头
sensor_id = 0
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的输出像素格式为RGB888
sensor.set_pixformat(Sensor.RGB888, chn=CAM_CHN_ID_0)

# 使用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()

和之前的代码基本一致,只是引入了clock.tick()来更新时钟,然后在循环末尾打印当前的帧率。

8

摄像头基础知识

图像传感器

图像传感器是摄像头的核心组件,负责将光信号转换为电信号,这样电子设备才能处理和存储这些信息。可以将其比喻为开发板的“眼睛”。目前常见的图像传感器类型有CCD和CMOS。庐山派开发板使用的GC2093摄像头是CMOS类型的传感器,相比OV5647的显示效果提升很大,而且目前OV5647都停产了,只有二手的芯片。

CMOS和CCD传感器的成像特点和使用场景对比表


特点


CMOS传感器


CCD传感器


信噪比和图像质量

- 现代CMOS噪声已大幅降低,图像质量接近甚至超越CCD

- 早期噪声较大,但技术进步已改善

- 高信噪比,图像质量高

- 低噪声表现优秀,适合弱光环境下的高质量成像

功耗和集成度

- 低功耗,适合电池供电设备

- 高集成度,可在芯片上集成图像处理电路和ADC,简化设计

- 高功耗,需要高电压驱动

- 低集成度,需外部电路支持,如模拟数字转换器(ADC)

数据读取速度

- 读取速度快,支持高帧率和全局快门

- 可随机访问像素,适合高速成像

- 读取速度较慢,电荷逐行转移

- 帧率和高速成像能力受限

制造成本

- 利用标准CMOS工艺制造,成本较低

- 成本较低便于大规模生产

- 制造工艺复杂,生产成本较高

- 价格相对昂贵

适用场景

- 消费电子产品:智能手机、平板电脑、数码相机等

- 安防监控:监控摄像头、行车记录仪等

- 汽车电子:倒车影像、驾驶辅助系统等

- 物联网和嵌入式系统:机器人、无人机等

- 专业摄影设备:高端数码相机、电影摄像机

- 科学研究:天文学、医学成像等

- 工业检测:精密测量、质量控制等

优点

- 低功耗- 高集成度

- 成本低- 读取速度快,支持高帧率

- 高图像质量- 低噪声,弱光性能优异

- 高信噪比

缺点

- 早期噪声较大(目前已大幅改善)

- 在极端弱光条件下可能不及CCD

- 高功耗- 成本高

- 读取速度慢,帧率受限

技术发展趋势

- 技术不断进步,背照式和堆栈式CMOS提升了性能

- 全局快门技术改善了图像失真问题

- 技术成熟,但市场份额逐渐被CMOS取代

- 主要应用在特定高端领域

选择建议

- 适合对成本、功耗和尺寸敏感的应用

- 需要高速成像和高集成度的设备

- 适合追求极高图像质量的专业领域

- 弱光环境下的高性能成像需求

注释:

  1. CMOS传感器在大多数应用中已成为主流选择,适合消费电子和需要高集成度的设备。是目前绝大多数的数码单反相机所用的图像传感器。
  2. CCD传感器仍在专业摄影、科学研究等需要卓越图像质量的领域占有重要地位。做智能车的用户可能会比较熟悉,应该用过那种线性CCD摄像头来进行巡线。


分辨率和帧率

  1. 分辨率:简单来说,分辨率就是图像的清晰度。它表示为图像的宽度和高度的像素数,例如1920x1080。这意味着图像有1920个像素的宽度和1080个像素的高度,我家里以及在公司使用的显示屏也就这个分辨率,就是平常所说的1080P屏幕。像素数越高,图像就越清晰,能展示的细节就越多。
  2. 帧率(FPS):帧率表示每秒钟摄像头可以捕捉并传输的图像数量。帧率越高,视频就越流畅。比如,电影通常是24fps,打游戏的话一般都得144Hz以上。我们的GC2093摄像头支持最高60fps的帧率,能提供非常流畅的图像,至少在嵌入式领域算是比较高的帧率了,毕竟嵌入式会落后计算机20年嘛。


焦距和视场角

  1. 焦距(EFL):焦距决定了摄像头能看到的范围,就像是人眼的视野。焦距越短,摄像头能看到的范围就越广,但看到的物体会显得较小。焦距越长,摄像头能看到的范围就越窄,但可以看得更远、更清楚。
  2. 视场角(View Angle):视场角是用角度来表示摄像头能看到的范围,包括:
  3. 对角线视角(D):从图像的一个角到对角线另一端的视角。
  4. 水平视角(H):摄像头水平方向能看到的范围。
  5. 垂直视角(V):摄像头垂直方向能看到的范围。

我们在板子上线的时候也会同步上架一款大镜头,可以旋转调焦的镜头,他就可以更换m12规格的其他镜头。如果我们使用广角镜头的话,视场角会比较大,能够拍摄到范围更广的场景,也会引入一定的摄像头畸变。


像素格式

像素格式是指图像数据的存储方式,它描述了每个像素如何表示颜色或亮度信息。选择合适的像素格式不仅影响图像的质量,还直接影响存储空间、数据传输速度和处理效率。


像素格式的分析

RGB565

  1. 定义:每个像素用16位表示,RGB通道分别分配5位、6位和5位。
  2. 红色 (R):5位,32级灰度。
  3. 绿色 (G):6位,64级灰度(由于人眼对绿色更敏感,绿色多分配了一位)。
  4. 蓝色 (B):5位,32级灰度。
  5. 特点:
  6. 数据量较小,仅16位(2字节)每像素。
  7. 支持基本的颜色表现,但颜色精度较低。
  8. 应用场景:
  9. 低功耗嵌入式设备,如手持设备、工业屏幕显示。
  10. 对图像质量要求不高但注重内存占用的场景。

RGB888

  1. 定义:每个像素用24位表示,RGB通道分别分配8位(即每种颜色256级灰度)。
  2. 红色 (R):8位。
  3. 绿色 (G):8位。
  4. 蓝色 (B):8位。
  5. 特点:
  6. 高颜色精度,适合高质量图像显示。
  7. 数据量较大,每像素3字节。
  8. 应用场景:
  9. 高分辨率图像处理。
  10. 用于显示要求高的场合,如智能手机屏幕、高清显示器。

RGBP888

  1. 定义:也叫分离的24位RGB格式,R、G、B通道数据分别存储在独立的内存区域中。
  2. 第一个内存块存储所有像素的R通道值。
  3. 第二个内存块存储所有像素的G通道值。
  4. 第三个内存块存储所有像素的B通道值。
  5. 特点:
  6. 更适合某些图像处理算法(如颜色分离、特征提取)。
  7. 数据访问更高效,但存储方式较复杂。
  8. 应用场景:
  9. 用于图像算法开发,如深度学习中的特征提取。
  10. 专业图像处理器的内部数据格式。

YUV420SP

  1. 定义:一种半平面 YUV 格式,主要用于视频压缩和处理。
  2. Y:表示亮度(Luminance)。
  3. U、V:表示色度(Chrominance),分别存储蓝色和红色的差异。
  4. 420:表示UV分量的分辨率为Y的1/4。
  5. 半平面:Y存储在一块连续内存中,UV分量交替存储在另一块连续内存中。
  6. 特点:
  7. 数据量小,压缩比高。
  8. 亮度和色度分开,便于色彩调整。
  9. 应用场景:
  10. 视频流处理和压缩,如H.264、H.265视频编码。
  11. 用于需要节省存储和带宽的实时视频传输场景。

GRAYSCALE

  1. 定义:灰度图,只有亮度信息,每像素用8位表示(256级灰度)。
  2. 无颜色信息,只有从黑到白的亮度变化。
  3. 特点:
  4. 数据量小,仅1字节每像素。
  5. 不包含色彩信息,但对亮度变化敏感。
  6. 应用场景:
  7. 图像识别和机器视觉,如边缘检测、特征提取。
  8. 黑白图像存储和处理。

优缺点简要对比


像素格式


每像素数据量


优点


缺点


典型应用


RGB565

2字节

数据量小,适合低功耗设备

颜色精度低

嵌入式显示屏、工业显示

RGB888

3字节

颜色精度高,适合高清显示

数据量大,占用更多内存

高清显示器、手机屏幕

RGBP888

3字节

更高效的通道访问

存储和处理较复杂

深度学习、专业图像处理

YUV420SP

1.5字节

压缩比高,适合视频传输

色彩精度不如RGB

视频流处理、实时视频传输

GRAYSCALE

1字节

数据量小,专注亮度处理

无颜色信息

机器视觉、图像识别


如何选择像素格式

  1. 性能与图像质量的平衡
  2. RGB565 和 YUV420SP 更注重性能,适合嵌入式场景。
  3. RGB888 和 RGBP888 更注重图像质量,适合高清显示或复杂算法。
  4. 存储和带宽限制
  5. 嵌入式设备通常内存和带宽有限,选择合适的像素格式可以降低资源占用。
  6. 理解格式的用途
  7. 如果需要处理彩色图像,优先选择 RGB 格式。
  8. 如果主要关注亮度变化,比如说巡线,可以选择 GRAYSCALE 格式。
  9. 实际开发经验
  10. 在图像处理或视频传输项目中,YUV420SP 是视频压缩的主流格式。
  11. 在AI模型中,经常会将RGB888转换为RGBP888格式,便于模型高效处理。

理解以上这些像素格式,我们就可以根据项目需求选择最合适的格式,提高项目的性能和效率。


镜像和翻转

在实际应用中,摄像头可能会因为安装方向的不同,导致拍摄的图像是倒置的或者是镜像的。为了让图像呈现正确的方向,我们就需要对图像进行镜像或翻转处理:

  1. 水平镜像(H-Mirror):将图像左右颠倒,就像看镜子里的自己。
  2. 垂直翻转(V-Flip):将图像上下颠倒,使上方的物体显示在下方。

通过镜像和翻转,就可以确保图像以正确的方向显示,方便观看和处理。


曝光和白平衡

  1. 曝光:曝光控制着传感器接收光线的时间,直接影响图像的亮度。曝光时间越长,传感器接收到的光线就越多,图像就会越亮;曝光时间越短,图像就会变暗。在光线不足的环境下,可以增加曝光时间来提高亮度。
  2. 白平衡:白平衡用于调整图像的色彩,使其看起来更加自然。不同的光源(如日光、白炽灯、荧光灯)会有不同的色温,影响图像的颜色表现。通过调整白平衡,可以纠正颜色偏差,使白色看起来真正是白色,从而使整个图像的颜色更加准确。

注意!

K230芯片内部自带ISP,如果需要调节摄像头的亮度,对比度,曝光时间等就需要将ISP的AE模块关掉,会导致成像效果变差,所以目前还没有能调节曝光和白平衡的API接口,目前用户无法直接操作。


阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载