相机选型
DIY相机首先是要确定使用的相机型号。兼容树莓派,画质好一些的,目前主要有两款:一是Raspberry Pi Camera Module 3,二是Raspberry Pi HQ Camera。
下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等特性,视场角为75度,1200万像素。
Raspberry Pi Camera Module 3使用的是索尼imx708传感器。此款传感器曾搭载在如OPPO Find X2等旗舰手机上。imx708传感器的参数如下表所示:
传感器 | imx708 |
---|---|
分辨率 | 11.9MP |
画幅大小 | 1/2.43 (传感器对角尺寸7.4mm) |
有效像素数 | 4608(H) 2592(V) |
单个像素大小 | 1.4m 1.4m |
接口 | MIPI CSI-2 Interface |
快门类型 | 滚动快门 |
帧率 | 2304x1296p56, 2304x1296p30, HDR 1536x864p120 |
输出格式 | RAW10 |
其中说一下滚动快门。Rolling Shutter(滚动快门)是一种相机传感器工作方式,与其对立的是 Global Shutter(全局快门)。
在 Rolling Shutter 中,相机传感器会逐行地从顶部到底部逐个曝光,就像一个滚动的帘子一样。这意味着在一次曝光过程中,不同行的像素会有微小的时间差。
这种方式在拍摄运动速度较慢或相机固定时通常不会出现问题。然而,当拍摄快速移动的物体或相机本身在移动时,Rolling Shutter 可能会导致图像中出现奇怪的扭曲效果,这被称为“滚动快门效应”。
相比之下,Global Shutter 会在同一时间瞬间曝光整个图像传感器,而不是逐行进行。这意味着在拍摄运动物体或相机移动时,Global Shutter 不会导致扭曲效应,但相机可能会更昂贵,因为实现全局快门技术的传感器通常较复杂。
因此,在选择相机时,要考虑拍摄条件,如果你需要拍摄快速运动的物体,可能需要优先选择支持 Global Shutter 的相机。
第二款Raspberry Pi HQ Camera的优点是CMOS与镜头分离,可以根据需要搭载不同的镜头,比如长焦镜头、变焦镜头等,其使用imx477传感器。这款camera的详细信息等我们用时,再做详细说明。(主要是价格不菲,CMOS+镜头要小1k)。
除了考虑camera,还要考虑与树莓派的兼容性。下表是一个不同传感器与树莓派主板和驱动的对应关系。
从表中可以看到,imx708传感器,只支持libcamera驱动,而不是之前的旧的raspicam驱动。使用libcamera驱动,意味着我们在安装树莓派系统时,对应的Debian version要高于_Bullseye_,例如我用的就是Debian version: 12 (bookworm)系统。
拍照测试
使用bookworm系统的话,系统安装完成后,libcamera库是直接可以使用的。树莓派也会自动连接camera。但是首先确认/boot/config.txt
文件的内容如下面的文件内容所示,尤其是camera_auto_detect=1
项。对于树莓派camera module3来说,树莓派是可以自动检测的,不需要我们手动指定dtoverlay
,后续我们用树莓派HQ camera的时候,其使用imx477传感器,这时候需要我们手动指定一下dtoverlay
的型号。
# For more options and information see
# http://rptl.io/configtxt
# Some settings may impact device functionality. See link above for details
# Uncomment some or all of these to enable the optional hardware interfaces
#dtparam=i2c_arm=on
#dtparam=i2s=on
#dtparam=spi=on
# Enable audio (loads snd_bcm2835)
dtparam=audio=on
# Additional overlays and parameters are documented
# /boot/firmware/overlays/README
# Automatically load overlays for detected cameras
camera_auto_detect=1
# Automatically load overlays for detected DSI displays
display_auto_detect=1
# Automatically load initramfs files, if found
auto_initramfs=1
# Enable DRM VC4 V3D driver
dtoverlay=vc4-kms-v3d
max_framebuffers=2
# Don't have the firmware create an initial video= setting in cmdline.txt.
# Use the kernel's default instead.
disable_fw_kms_setup=1
# Run in 64-bit mode
arm_64bit=1
# Disable compensation for displays with overscan
disable_overscan=1
# Run as fast as firmware / board allows
arm_boost=1
[cm4]
# Enable host mode on the 2711 built-in XHCI USB controller.
# This line should be removed if the legacy DWC2 controller is required
# (e.g. for USB device mode) or if USB support is not required.
otg_mode=1
[all]
然后我们更新下系统
sudo apt update
sudo apt upgrade
预览camera流
直接使用libcamera-hello程序打开摄像头预览
sudo libcamera-hello -t 0
-t
表示camera流持续多长时间,0
表示一直持续。
拍摄照片
可以使用libcamera-jpeg
命令拍摄图片。
libcamera-jpeg -o test.jpg
这个拍摄指令会显示一个5秒左右的预览串口,然后拍摄一张全像素的JPEG图像,保存为test.jpg。
另外,树莓派的libcamera驱动会针对不同的摄像头模块调用一个调谐文件,调谐文件中提供了各种参数,调用摄像头的时候,libcamera会调用调谐文件中的参数,结合算法对图像进行处理最终输出成预览画面。由于libcamera驱动只能自动感光芯片信号,但是摄像头的最终显示效果还会受整个模块的影响,调谐文件的使用就是为了可以灵活处理不同模块的摄像头,调整提高图像质量。
在这里,我们调用系统中提供的针对imx708的调谐文件。
libcamera-jpeg -o test1.jpg --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx708.json
但是通过使用faststone软件对比,两张图片的成像并没有什么差距。调谐文件同样适用于其他的libcamera指令。
还可以指定出图的分辨率以及预览窗口的预览时间。-t 2000
指2s的预览时间。
libcamera-jpeg -o test.jpg -t 2000 --width 640 --height 480
曝光补偿和曝光增益
树莓派的AEC/AGX算法允许程序指定曝光补偿,也就是通过设置EV数值来调整图像的亮度。比如:
libcamera-jpeg --ev -0.5 -o darker.jpg
libcamera-jpeg --ev 0 -o normal.jpg
libcamera-jpeg --ev 0.5 -o brighter.jpg
我们对如下的名词进行解释:
AEC(Automatic Exposure Control)和 AGX(Automatic Gain Control)是图像处理中常用的两种自动控制算法,它们通常用于相机或摄像机系统中,以调整图像的曝光和增益,以确保在不同光照条件下获得合适的图像质量。
- AEC(自动曝光控制):AEC 算法通过调整快门速度(曝光时间)来控制图像的亮度。在低光条件下,它会增加曝光时间以提高亮度,而在高光条件下,它会减少曝光时间以避免图像过曝。
- AGX(自动增益控制):AGX 算法通过调整图像的放大倍数来控制亮度。它可以在光线较暗的情况下增加图像信号的放大程度,以提高亮度。
EV代表曝光值(Exposure Value),它是一个相机设置,用于调整照片的曝光水平。EV值的变化会影响相机的快门速度、光圈和ISO等参数,从而改变照片的亮度和细节。
EV值是一个以对数形式表示的指标,通常以“EV +/- 数值”表示,例如+1 EV 或 -2 EV。EV值的变化一般以1/3或1/2 EV为单位进行调整。
正的EV值表示相机会增加曝光,使图像变亮。负的EV值表示相机会减少曝光,使图像变暗。
曝光补偿常用于情况复杂、光照条件变化或拍摄者希望在相机自动设置之外进行调整的情况。例如,在拍摄对比度很高的场景时,你可能会使用曝光补偿来避免过曝或欠曝的情况。
我们上面3张照片通过调整EV值来实现不同的曝光等级。下表是上面3张图片的exif信息。
照片 | 快门 | ISO |
---|---|---|
normal.jpg | 0.025s(1/40) | 112 |
brighter.jpg | 0.030s(1/33) | 130 |
darker.jpg | 0.017s(1/57) | 112 |
通过这3张照片的快门和ISO数据,可以看到我们通过调整EV值获得的不同曝光程度的照片,是通过调整快门和ISO数据得到的。
我们再来看一下libcamera通过控制增益来实现不同亮度的图片的。
libcamera-jpeg -o normal.jpg -t 2000 --shutter 服务器托管25000 --gain 0
libcamera-jpeg -o brighter.jpg -t 2000 --shutter 25000 --gain -1
libcamera-jpeg -o darker.jpg -t 2000 --shutter 25000 --gain 1
我们通过--gain
参数控制曝光增益,使用--shutter
将快门时间固定在25ms。
照片名 | 图片 | ISO |
---|---|---|
brighter.jpg | 1600 | |
normal.jpg | 205 | |
darker.jpg | 112 |
树莓派的camera module 3设想模组,光圈大小是不可调节的,快门速度我们也固定为了25ms,目前只有ISO是可调节的。可见--gain
参数也是通过控制ISO的值来得到不同曝光水平的照片的。
libcamera-still,更多的出图控制策略
可以像libcamera-jpeg
一样,使用
libcamera-still -o test.jpg
得到一张图片。与libcamera-jpeg
得到的图片基本一致,图片占用的存储空间也一致。
libcamera-still
可以通过-e
参数指定不同的编码器,实现不同的格式保存。可以支持png和bmp编码,也支持直接不带编码或者任何图像格式地将RGB或者YUV像素的二进制转储保存成文件。如果是直接保存RGB或者YUV数据,程序在服务器托管读取此类文件的时候必须了解文件的像素排列方式。
libcamera-still -e png -o test.png
libcamera-still -e bmp -o test.bmp
libcamera-still -e rgb -o test.data
libcamera-still -e yuv420 -o test_yuv.data
png和jpg是两种常用的格式,这里介绍一下他们的区别:
PNG(Portable Network Graphics)和JPEG(Joint Photographic Experts Group)是两种常见的图像文件格式,它们在某些方面有着明显的区别。
- 压缩算法:
- PNG使用无损压缩算法,保留了所有图像细节,不会损失图像质量。这使得PNG格式适用于需要保留高质量细节的场景,比如图形设计、线条图像等。
- JPEG使用有损压缩算法,通过消除图像中的一些细节和色彩信息来减小文件大小,从而降低了图像质量。这使得JPEG适用于照片等需要较小文件大小的情况。
- 颜色深度:
- PNG 支持索引色、灰度、RGB和RGBA等多种颜色模式,同时支持16位和8位深度的颜色,适用于各种色彩丰富的图像。
- JPEG 主要用于保存照片,通常以8位RGB模式存储。
- 透明度:
- PNG 支持完全透明和半透明,能够在图像中创建复杂的透明效果,适用于图形设计等需要透明背景的场景。
- JPEG 不支持透明度,它只能显示实色背景。
- 文件大小:
- JPEG 文件通常比同样分辨率和质量的PNG文件小得多,因为它是有损压缩的,可以在一定程度上减小文件大小。
- PNG 文件相对较大,因为它是无损压缩的,会保留所有的图像细节。
- 适用场景:
- PNG 适用于需要保留高质量细节、有透明度要求或者需要无损压缩的图像,比如图形设计、图标、线条图像等。
- JPEG 适用于照片和其他需要较小文件大小的场景。
综上所述,选择使用PNG还是JPEG取决于图像的具体用途和要求。如果需要保留高质量细节、支持透明度或者需要无损压缩,那么PNG是一个更好的选择。如果主要是保存照片或者需要较小的文件大小,那么JPEG可能更适合。
可以看到,jpg文件的大小是1.2M,但是png文件的大小就到了10.7M。但是从对比图看,png相比jpg,没有明显的画质优势。
点击DIY相机(一)libcamera库 – 古月居可查看全文
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
以下是Spring Boot中常用的注解及其详细解释以及相应的代码示例: @SpringBootApplication: 这个注解用于标识一个Spring Boot应用的主类。它整合了 @Configuration,@EnableAutoConfigurati…