摄像头软件
本文档介绍如何将支持的摄像头模块与我们的软件工具 配合使用。所有 Raspberry Pi 摄像头都可以使用我们的软件工具录制高分辨率照片和全高清 1080p 视频(或更好)。
Raspberry Pi 生产多种官方摄像头模块,包括
- 最初的 500 万像素摄像头模块 1(已停产)
- 800 万像素 摄像头模块 2,带或不带红外滤镜
- 1200 万像素 摄像头模块 3,有标准镜头和广角镜头,带或不带红外滤光镜
- 1200 万像素的 高质量摄像头,配有 CS 和 M12 卡口,可与外置镜头配合使用
- 160 万像素 全局快门摄像头,用于快速动态摄影
- 1200 万像素的 AI摄像头,使用索尼IMX500成像传感器,为任何摄像头应用提供低延迟、高性能的AI功能
有关摄像机硬件的更多信息,请参阅摄像头硬件文档。
首先,安装摄像头模块。然后,按照本节中的指南使用你的摄像头模块。
rpicam-apps
Raspberry Pi OS Bookworm 将摄像头捕捉应用程序从 libcamera-\*
更名为 rpicam-*
。符号链接允许用户暂时使用旧名称。** 尽快采用新的应用程序名称。** Bookworm之前的 Raspberry Pi OS 版本仍使用 libcamera-*
名称。
Raspberry Pi 提供了一小套示例 rpicam-apps
。这些建立在 libcamera
基础上的 CLI 应用程序可以从摄像头捕捉图像和视频。这些应用程序包括
rpicam-hello
: 相当于摄像头的 "hello world",可启动摄像头预览流并显示在屏幕上。rpicam-jpeg
: 运行预览窗口,然后捕捉高分辨率静态图像。rpicam-still
: 模拟原始raspistill
应用程序的许多功能。rpicam-vid
: 捕捉视频。rpicam-raw
: 直接从传感器捕捉原始(未经处理的拜尔)帧。rpicam-detect
: 默认不内置,但如果用户在 Raspberry Pi 上安装了 TensorFlow Lite,则可以内置。在检测到特定物体时捕获 JPEG 图像。
最新版本的 Raspberry Pi OS 包含五个基本的 rpicam-apps
,因此即使在刚安装 Raspberry Pi OS 的情况下,您也可以使用摄像头 录制图像和视频。
用户可以创建自己的基于 rpicam
的应用程序,并根据自己的要求定制功能。rpicam-apps`源代码在 BSD-2-Clause 许可下免费提供。
libcamera
libcamera
是一个开源软件库,目的是在 Arm 处理器上直接从 Linux 操作系统支持摄像头系统。在 Broadcom GPU 上运行的专有代码被最小化。有关 libcamera
的更多信息,请参阅 libcamera网站。
libcamera
提供了一个 C++ API 配置摄像头,然后允许应用程序请求图像帧。这些图像缓冲区位于系统内存中,可直接传递给静态图像编码器(如 JPEG)或视频编码器(如 h.264)。libcamera
本身并不编码或显示图像:该功能请使用 rpicam-apps
。
您可以在 libcamera 官方资源库中找到源代码。Raspberry Pi OS 发行版使用 fork 来控制更新。
在 libcamera
核心之下,我们提供了一个自定义管道处理程序。libcamera
使用这一层来驱动 Raspberry Pi 上的传感器和图像信号处理器(ISP)。libcamera
包含一系列图像处理算法(IPA),包括自动曝光/增益控制(AEC/AGC)、自动白平衡(AWB)和自动镜头阴影校正(ALSC)。
Raspberry Pi 的 libcamera
支持以下摄像头:
- 官方摄像头:
- OV5647 (V1)
- IMX219 (V2)
- IMX708 (V3)
- IMX477 (HQ)
- IMX500 (AI)
- IMX296 (GS)
- 第三方传感器:
- IMX290
- IMX327
- IMX378
- IMX519
- OV9281
要扩展对新传感器的支持,请查看为 libcamera 做贡献。
rpicam-hello
rpicam-hello
会短暂显示一个预览窗口,其中包含所连接摄像头的视频画面。要使用 rpicam-hello
显示五秒钟的预览窗口,请在终端中运行以下命令:
rpicam-hello
您可以使用 timeout
选项传递一个可选的持续时间(以毫秒为单位)。值为 0
时,预览将无限期运行:
rpicam-hello --timeout 0
使用终端中的 Ctrl+C
或预览窗口上的关闭按钮停止 rpicam-hello
。
显示图像传感器预览
大多数 rpicam-app
都会在窗口中显示预览图像。如果没有活动的桌面环境,预览图像会使用 Linux 直接渲染管理器 (DRM) 直接绘制到显示器上。否则,rpicam-apps
会尝试使用桌面环境。这两种路径都使用零拷贝 GPU 缓冲区共享:因此不支持 X 转发。
如果运行 X 窗口服务器并希望使用 X 转发 ,请使用 qt-preview
标志在 Qt窗口中呈现预览窗口。Qt 预览窗口比其他预览窗口占用更多资源。
使用 Gtk2 的旧系统在与 OpenCV 链接时可能会产生 Glib-GObject
错误,无法显示 Qt 预览窗口。在这种情况下,以 root 用户身份编辑文件 /etc/xdg/qt5ct/qt5ct.conf
,将包含 style=gtk2
的行替换为 style=gtk3
。
要完全禁止预览窗口,请使用 nopreview
标志:
rpicam-hello -n
info-text
选项使用 %
指令在窗口标题栏上显示图像信息。例如,以下命令显示当前的红色和蓝色增益值:
rpicam-hello --info-text "red gain %rg, blue gain %bg"
有关指令的完整列表,请参阅 info-text
参考资料。
rpicam-jpeg
rpicam-jpeg
可以帮助你捕捉 Raspberry Pi 设备上的图像。
要捕获全分辨率的 JPEG 图像并将其保存到名为 test.jpg
的文件中,请运行以下命令:
rpicam-jpeg --output test.jpg
你会看到一个五秒钟的预览窗口。然后,rpicam-jpeg
会捕获全分辨率的 JPEG 图像并保存。
使用 timeout
选项可更改预览窗口的显示时间。width
和height
选项可改变保存图像的分辨率。例如,以下命令显示预览窗口 2 秒钟,然后捕捉并保存分辨率为 640×480 像素的图像:
rpicam-jpeg --output test.jpg --timeout 2000 --width 640 --height 480
rpicam-still
和 rpicam-jpeg
一样,rpicam-still
可以帮助你在 Raspberry Pi 设备上捕捉图像。
与 rpicam-jpeg
不同,rpicam-still
支持传统的 raspistill
应用程序中提供的许多选项。
要捕获全 分辨率的 JPEG 图像并将其保存到名为 test.jpg
的文件中,请运行以下命令:
rpicam-still --output test.jpg
编码器
rpicam-still
可以保存多种格式的图像,包括png
、bmp
以及 RGB 和 YUV 二进制像素转储。要读取这些二进制转储,任何读取文件的应用程序都必须理解像素排列。
使用 encoding
选项指定输出格式。传递给 output
的文件名对输出文件类型没有影响。
要捕捉全分辨率 PNG 图像并将其保存到名为 test.png
的文件中,请运行以下命令:
rpicam-still --encoding png --output test.png
有关指定图像格式的更多信息,请参阅 encoding
选项参考。
捕捉原始图像
原始图像是由图像传感器直接生成的图像,图像信号处理器(ISP)或中央处理器尚未对其进行任何处理。彩色图像传感器通常使用 Bayer 格式。使用 raw
选项捕捉原始图像。
要捕捉图像并将其保存到名为 test.jpg
的文件中,同时将图像的原始版本保存到名为 test.dng
的文件中,请运行以下命 令:
rpicam-still --raw --output test.jpg
rpicam-still
以 DNG(Adobe Digital Negative,Adobe 数字负片)格式保存原始图像。要确定原始图像的文件名,rpicam-still
使用与输出文件相同的名称,但扩展名改为.dng
。要处理 DNG 图像,请使用 Dcraw 或 RawTherapee 等应用程序。
DNG 文件包含图像拍摄的元数据,包括黑电平、白平衡信息和 ISP 用于生成 JPEG 的色彩矩阵。使用 ExifTool 查看 DNG 元数据。以下输出显示了存储在 Raspberry Pi 使用 HQ 摄像机拍摄的原始图像中的典型元数据:
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 : rpicam-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
要计算模拟增益,请用 ISO 数字除以 100。
自动白平衡 (AWB) 算法会确定一个单一的校准光源,并始终标为 D65
。
捕捉长时间曝光
要拍摄长时间曝光的图像,请禁用自动曝光/增益控制 (AEC/AGC) 和自动白平衡 (AWB)。否则,这些算法将迫使用户在收敛时等待若干帧。
要禁用这些算法,请为增益和 AWB 提供明确的值。由于长时间曝光已经耗费了大量时间,使用 immediate
选项完全跳过预览阶段通常是合理的。
要执行 100 秒曝光捕捉,请运行以下命令:
rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
要查找 Raspberry Pi 官方摄像头的最大曝光时间,请参阅 摄像头硬件规格。
创建延时视频
要创建延时视频,可定期捕捉静态图像,例如每分钟捕捉一次,然后使用应用程序将图片拼接成视频。
- rpicam-still 延时模式
- cron
要使用 rpicam-still
的内置延时模式,请使用 timelapse
选项。该选项接受一个值,代表你希望 Raspberry Pi 在两次捕捉之间等待的时间,单位为毫秒。
首先,创建一个存放延时照片的目录:
mkdir timelapse
运行以下命令创建 30 秒的延时,每两秒记录一张照片,将输出保存到 image0001.jpg
至 image0013.jpg
中:
rpicam-still --timeout 30000 --timelapse 2000 -o timelapse/image%04d.jpg
您还可以使用 cron
自动执行延时。首先,创建名为 timelapse.sh
的脚本,其中包含以下命令。将<username>
占位符替换为 Raspberry Pi 上的用户账户名:
#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
rpicam-still -o /home/<username>/timelapse/$DATE.jpg
然后,使脚本可执行:
chmod +x timelapse.sh
创建 timelapse
目录,保存延时摄影图片:
mkdir timelapse
打开 crontab 进行编辑:
crontab -e
在编辑器中打开该文件后,添加以下行以计划每分钟捕获一次图像,用主用户账户的用户名替换占位符 <username>
:
* * * * /home/<username>/timelapse.sh 2>&1
保存并退出后,您将看到以下信息:
crontab: installing new crontab
要停止为延时拍摄图像,请从 crontab 中删除上述行。
将图像拼接在一起
有了一系列延时照片后,您可能想将它们合成一段视频。在 Raspberry Pi 上使用 ffmpeg
可以做到这一点。
首先,安装 ffmpeg
:
sudo apt install ffmpeg
在 crontimelapse
目录下运行以下命令,将 JPEG 文件转换为 mp4 视频:
ffmpeg -r 10 -f image2 -pattern_type glob -i 'timelapse/*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4
上述命令使用以下参数:
-r 10
:将输出视频的帧频(赫兹值)设置为每秒十帧-f image2
:设置ffmpeg
从模式指定的图像文件列表中读取文件-pattern_type glob
: 使用通配符模式(globbing)来解释用-i
输入的文件名-i 'timelapse/*.jpg'
: 指定输入文件与timelapse
目录中的 JPG 文件匹配-s 1280x720
:缩放至 720p-vcodec libx264
使用软件 x264 编码器。timelapse.mp4
输出视频文件的名称。
有关 ffmpeg
选项的更多信息,请在终端运行 ffmpeg --help
。
rpicam-vid
rpicam-vid
可以帮助你在 Raspberry Pi 设备上捕获视频。rpicam-vid
会显示一个预览窗口,并将编码后的比特流写入指定输出。这将产生一个未打包的视频比特流,它未被任何容器(如 mp4 文件)格式包裹。
如果可用,rpicam-vid
会使用硬件 H.264 编码。
例如,以下命令将一段 10 秒钟的视频写入名为 test.h264
的文件:
rpicam-vid -t 10s -o test.h264
您可以用 VLC 和其他视频播放器播放生成的文件:
$ vlc test.h264
在 Raspberry Pi 5 上,您可以为输出文件指定 mp4
文件扩展名,直接输出为 MP4 容器格式:
rpicam-vid -t 10s -o test.mp4
编码器
rpicam-vid
支持动态 JPEG 以及未压缩和未格式化的 YUV420:
rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg
rpicam-vid -t 10000 --codec yuv420 -o test.data
codec
选项决定输出格式,而不是输出文件的扩展名。
segment
选项会将输出文件分割成不同大小的片段(以毫秒为单位)。通过指定非常短(1 毫秒)的片段,可以方便地将动态 JPEG 流分解为单个 JPEG 文件。例如,以下命令将 1 毫秒的片段与输出文件名中的计数器相结合,为每个片段生成一个新的文件名:
rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
捕捉高帧率视频
要尽量减少高帧率(> 60fps)视频的丢帧,请尝试以下配置调整:
- 使用
--level 4.2
将 H.264 target level 设置为 4.2。 - 将
denoise
选项设置为cdn_off
,禁用软件色彩去噪处理。 - 使用
nopreview
禁用显示窗口,以释放一些额外的 CPU 周期。 - 在
/boot/firmware/config.txt
中设置force_turbo=1
,以确保在视频捕获过程中 CPU 时钟不会节流。更多信息,请参阅force_turbo
文档。 - 使用
--width 1280 --height 720
或更低的分辨率调整 ISP 输出分辨率,以实现帧速率目标。 - 在 Raspberry Pi 4 上,可以通过在
/boot/firmware/config.txt
中添加gpu_freq=550
或更高值来超频 GPU 以提高性能。更多详情,请参阅 超频文档。
以下命令演示了如何实现 1280×720 120fps 视频:
rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
libav 与 rpicam-vid 的集成
rpicam-vid
可以使用 ffmpeg
/libav
后端编解码器对音频和视频流进行编码。您既可以将这些流保存到文件中,也可以通过网络进行流式传输。如果存在,libav
会使用硬件 H.264 视频编码。
要启用 libav
后端,在 codec
选项中加入 libav
值。
rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi
rpicam-raw
rpicam-raw
直接从传感器以原始贝叶帧的形式记录视频。它不会显示预览窗口。要将两秒钟的原始片段录制到名为 test.raw
的文件中,请运行以下命令:
rpicam-raw -t 2000 -o test.raw
rpicam-raw
直接输出没有任何格式信息的原始帧。应用程序会将像素格式和图像尺寸打印到终端窗口,以帮助用户解释像素数据。
默认情况下,rpicam-raw
会将原始图像输出到一个可能非常大的文件中。使用 %05d
directive 选项将每个原始图像帧引导到单独的文件中,使每个图像帧的文件名都是唯一的:
rpicam-raw -t 2000 --segment 1 -o test%05d.raw
如果使用快速存储设备,rpicam-raw
能以 10fps 的速度将 18MB 的 1200 万像素 HQ 相机帧写入磁盘。rpicam-raw
无法将输出帧格式化为 DNG 文件;如需该功能,请使用 rpicam-still
。使用低于 Class10 的 framerate
选项可避免丢帧:
rpicam-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
有关原始格式的更多信息,请参阅 mode
文档。
rpicam-detect
Raspberry Pi OS 不包含 rpicam-detect
。不过,如果你安装了 安装 TensorFlow Lite,就可以构建 rpicam-detect
。有关详细信息,请参阅 rpicam-apps
构建说明。运行 meson
时不要忘记传递 -Denable_tflite=enabled
。
rpicam-detect
会显示一个预览窗口,并使用经过训练的 Google MobileNet v1 SSD(单次检测器)神经网络监控内容,该网络可使用 Coco 数据集识别约 80 类对象。rpicam-detect
能识别人、车、猫和许多其他物体。
每当 rpicam-detect
检测到目标对象时,它就 会捕获一张全分辨率的 JPEG 文件。然后返回监控预览模式。
有关模型使用的一般信息,请参阅 TensorFlow Lite 对象检测器 部分。例如,您可以在外出时偷偷监视您的猫:
rpicam-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat
配置
大多数用例都能自动运行,无需更改摄像头配置。不过,有些常见的使用情况确实需要对配置进行调整,其中包括
- 第三方摄像头(制造商说明应解释必要的配置更改(如有)
- 将非标准驱动程序或覆盖层与正式的 Raspberry Pi 摄像头一起使用
Raspberry Pi OS 可在 /boot/firmware/config.txt
中识别以下覆盖层。
摄像头模块 | 在 /boot/firmware/config.txt 中设置 |
---|---|
V1 摄像头 (OV5647) | dtoverlay=ov5647 |
V2 摄像头(IMX219) | dtoverlay=imx219 |
HQ 摄像头 (IMX477) | dtoverlay=imx477 |
GS 摄像头 (IMX296) | dtoverlay=imx296 |
摄像头模块 3 (IMX708) | dtoverlay=imx708 |
IMX290 和 IMX327 | dtoverlay=imx290,clock-frequency=74250000 或 dtoverlay=imx290,clock-frequency=37125000 (这两个模块共享 imx290 内核驱动程序;有关正确频率,请参阅模块供应商的说明) |
IMX378 | dtoverlay=imx378 |
OV9281 | dtoverlay=ov9281 |
要使用这些覆盖层之一,必须禁用摄像头自动检测功能。要禁用自动检测,请在 /boot/firmware/config.txt
中设置 camera_auto_detect=0
。如果 config.txt
中已经有一行指定了 camera_auto_detect
值,请将该值改为 0
。使用 sudo reboot
重启 Raspberry Pi,加载所作更改。
使用调谐文件调整摄像头行为
Raspberry Pi 的 libcamera
实现为每个摄像头都包含一个调谐文件。该文件控制算法和硬件,以生成最佳图像质量。libcamera
只能确定使用的传感器,而不能确定模块。因此,某些模块需要覆盖调校文件。tuning-file
选项指定覆盖。您也可以复制和更改现有的调谐文件来定制摄像机的行为。
例如,无红外滤镜(NoIR)版本的传感器使用的自动白平衡(AWB)设置与标准版本不同。在 Raspberry Pi 5 或更高版本上,您可以使用以下命令为 IMX219 传感器指定 NoIR 调谐文件:
rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json
Raspberry Pi 5 之前的 Raspberry Pi 型号使用不同的调谐文件。在这些设备上,请使用存储在 /usr/share/libcamera/ipa/rpi/vc4/
中的文件。
libcamera
为许多摄像头(包括第三方型号)维护调谐文件。例如,您可以在 se327m12.json
中找到 Soho Enterprises SE327M12 的调谐文件。
使用多台摄像机
rpicam-apps
具有对多摄像头的基本支持。您可以通过以下方式将多个摄像头连接到 Raspberry Pi:
- 对于 Raspberry Pi 计算模块,您可以将两个摄像头直接连接到 Raspberry Pi 计算模块的 I/O 板上。有关详细信息,请参阅 计算模块文档。使用这种方法,您可以_同时使用两个摄像头_。
- 对于 Raspberry Pi 5,您可以使用双 MIPI 接口将两个摄像头直接连接到电路板上。