Raspberry Pi Camera Module 3
- 介绍
- 开头先说,注意事项
- libcamera
- 感光芯片和驱动的兼容图
- 额外:不同module的对应的参数图
- 用bullseye系统测试摄像头
- 预览窗口
- 拍摄静态图片
- bayer raw图像获取
- 超长曝光
- 视频流
- raw视频流
- ref
介绍
树莓派镜像在Bullseye版本之后,底层的树莓派驱动由Raspicam切换成libcamera。libcamera是一个开源的软件栈(后面会称为驱动,方便理解),方便于第三方移植和开发自己的摄像头驱动。截止到20230207,官方已经针对libcamera提供了pycamera2库,方便用户使用Python程序调用。
开头先说,注意事项
-
该摄像头不支持buster系统,我一般用bullseye系统
-
Camera module 3,会开启自动对焦功能
libcamera
在libcamera内核的下面,树莓派提供了一个定制的pipe handler,libcamera使用这个layer来驱动树莓派本身的传感器和ISP(图像信号处理器)。
ISP包含了很多算法,是个算法集合,例如IPAs(图像处理算法),如AEC/AGC(自动曝光/增益控制),AWB(自动白平衡),ALSC(自动镜头阴影校正)等。
感光芯片和驱动的兼容图
额外:不同module的对应的参数图
用bullseye系统测试摄像头
如果使用的是最新的Raspberry Pi Camera Module 3 或者Raspberry Pi Global Shutter Camera,需要运行以下指令进行系统更新(需要联网操作).注意,只支持最新的bullseye系统
sudo apt-get update -y
sudo apt-get upgrade -y
如果使用的是OV9281, IMX290, IMX378, 或者非树莓派官方的IMX219和IMX477 摄像头需要另外配置config.txt 文件
sudo nano /boot/config.txt
改为如下:
camera_auto_detect=0
预览窗口
开始preview,以下是一直开着preview窗口
sudo libcamera-hello -t 0
拍摄静态图片
拍摄一张全像素的JPEG图像
libcamera-jpeg -o test.jpg
拍摄一张全像素的JPEG图像,保存为test.jpg
用户可以通过-t 参数来设置预览时间,同时可以通过–width 和 --height来设置拍摄图像的分辨率。例如:
libcamera-jpeg -o test.jpg --width 640 --height 480
所有的libcamera指令都允许用户自己设置快门时间和增益:
拍摄一张图像,拍摄中会曝光20ms并且摄像头增益被设置为1.5倍。
libcamera-jpeg -o test.jpg --width 640 --height 480 --shutter 20000 --gain 1.5
设置的增益参数,会首先设置感光芯片内部的模拟增益参数,如果设置的增益超过了驱动内置的最大的模拟增益的数值,会先设置芯片的最大模拟增益,然后将剩下的增益倍数作为数字增益来生效
数字增益是通过ISP(图像信号处理)来实现的,并非是直接调整芯片内置寄存器。正常情况下,默认的数字增益趋近于1.0,除非是有有以下三种情况。
- 整体的增益参数需求,也就是当模拟增益无法满足设定的增益参数需求的时候,会需要数字增益来做补偿
- 其中一个颜色增益小于1 (颜色增益是通过数字增益来实现的),在这种情况下, 最后获得增益就是稳定为 1/min(red_gain, blue_gain), 也就是实际是上应用了统一的数字增益, 且是其中一个颜色通道的增益值(非绿色通道)。
- AEC/AGC被修改了。如果AEC/AGC有变化的时候, 数值增益也会一定程度上会发生变化,从何来来消除任何波动,但是这种变化会被快速恢复到"正常"值.
bayer raw图像获取
原始图像(Raw image)图像就是直接图像传感器输出的图像, 没有经过任何ISP或者CPU处理。对于彩色相机传感器,一般来说原始图像的输出格式是Bayer. 注意原始图和我们之前说的位编码的RGB和YUV图像不同,RGB和YUV也是经过ISP处理后的图像的。
拍摄一张原始图像的指令:
libcamera-still -r -o test.jpg
原始图像一般是以DNG (Adobe digital Negative) 格式保存的,DNG格式可以兼容大部分标准程序, 比如dcraw 或者RawTherapee. 原始图像会被保存为.dng后缀的相同名字的文件,比如如果运行上面的指令,为被另存为test.dng,并同时生成一张jpeg文件。
DNG文件中包含了已图像获取有关的元数据, 比如白平衡数据,ISP颜色矩阵等, 下面是用exiftool工具显示的元数据编码信息:
File Name : test.dng
Directory : .
File Size : 24 MB
File Modification Date/Time : 2021:08:17 16:36:18+01:00
File Access Date/Time : 2021:08:17 16:36:18+01:00
File Inode Change Date/Time : 2021:08:17 16:36:18+01:00
File Permissions : rw-r--r--
File Type : DNG
File Type Extension : dng
MIME Type : image/x-adobe-dng
Exif Byte Order : Little-endian (Intel, II)
Make : Raspberry Pi
Camera Model Name : /base/soc/i2c0mux/i2c@1/imx477@1a
Orientation : Horizontal (normal)
Software : libcamera-still
Subfile Type : Full-resolution Image
Image Width : 4056
Image Height : 3040
Bits Per Sample : 16
Compression : Uncompressed
Photometric Interpretation : Color Filter Array
Samples Per Pixel : 1
Planar Configuration : Chunky
CFA Repeat Pattern Dim : 2 2
CFA Pattern 2 : 2 1 1 0
Black Level Repeat Dim : 2 2
Black Level : 256 256 256 256
White Level : 4095
DNG Version : 1.1.0.0
DNG Backward Version : 1.0.0.0
Unique Camera Model : /base/soc/i2c0mux/i2c@1/imx477@1a
Color Matrix 1 : 0.8545269369 -0.2382823821 -0.09044229197 -0.1890484985 1.063961506 0.1062747385 -0.01334283455 0.1440163847 0.2593136724
As Shot Neutral : 0.4754476844 1 0.413686484
Calibration Illuminant 1 : D65
Strip Offsets : 0
Strip Byte Counts : 0
Exposure Time : 1/20
ISO : 400
CFA Pattern : [Blue,Green][Green,Red]
Image Size : 4056x3040
Megapixels : 12.3
Shutter Speed : 1/20
超长曝光
- 首先需要禁用AEC/AGC和白平衡: 算法会导致图片在收敛的时候多等待很多帧数据
- 禁用这些算法需要另设置显式值,另外, 用户可以通过**–immediate设置来跳过预览过程**。
libcamera-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
视频流
libcamera-vid -t 10000 -o test.h264
raw视频流
libcamera-raw类似于视频录制程序,不同的地方时,libcamera-raw录制的是直接传感器输出的Bayer格式的数据,也就是原始图像数据。libcamera-raw不会显示预览窗口。
通常因为raw太大,进行分割存储
libcamera-raw -t 2000 --segment 1 -o test%05d.raw
ref
官网
微雪