Camera software
Raspberry Pi相机介绍
Edit this on GitHub
现在有一些官方的Raspberry Pi相机模块。最初的500万像素型号 发布于2013年, 随后在2016年 发布了800万像素相机 模块2。最新的相机型号是2023年 发布的1200万像素相机 模块3。Raspberry Pi已经不再提供最初的5MP设备。
所有这些相机都有可见光和红外版本,而相机模块3也作为标准或宽FoV型号提供,共有四种不同的型号。
有关相机模块的更多详细信息,请参阅相机硬件 页面。
所有Raspberry Pi相机都能够拍摄高分辨率照片以及全高清1080p视频,并且可以完全编程控制。本文档介绍如何在各种场景中使用相机,以及如何使用各种软件工具。
安装好相机模块后,相机有多种使用方式。最简单的选择是使用提供的相机应用程序之一,如libcamera-still或libcamera-vid。
libcamera和libcamera-apps
Edit this on GitHub
简介
libcamera是一个新的软件库,旨在直接从Linux操作系统支持复杂的相机系统。就Raspberry Pi而言,它使我们能够直接从ARM处理器上运行的开源代码驱动相机系统。在Broadcom GPU上运行的专有代码,几乎完全被绕过,用户根本无法访问。
libcamera向应用程序提供C++ API,并在配置相机的级别工作,然后允许应用程序请求图像帧。这些图像缓冲区驻留在系统内存中,可以直接传递到静止图像编码器(如 JPEG)或视频编码器(如 h.264),尽管编码或显示图像等辅助功能严格超出了其libcamera本身的范围。
出于这个原因,Raspberry Pi提供了一小组示例libcamera-apps。这些是简单的应用程序,构建在libcamera之上,主要用于模拟构建在Broadcom专有GPU代码上的传统堆栈的功能(一些用户会将这些传统应用程序识别为raspstill和raspivid)。我们提供的应用有:
-
libcamera-hello 一个简单的“hello world”应用程序,可启动相机预览流并将其显示在屏幕上。
-
libcamera-jpeg 一个简单的应用程序,用于运行预览窗口,然后捕获高分辨率静止图像。
-
libcamera-still 一个更复杂的静止图像捕获应用程序,它模拟了raspistill 的更多功能。
-
libcamera-vid 视频捕获应用程序。
-
libcamera-raw 直接从传感器捕获原始(未处理的Bayer)帧的基本应用程序。
-
libcamera-detect 这个应用程序不是默认构建的,但是如果用户在他们的Raspberry Pi上安装了TensorFlow Lite,就可以构建它。当检测到特定对象时,它会捕获JPEG图像。
Raspberry Pi的libcamera-apps不仅是命令行应用程序,可以轻松地从相机中捕捉图像和视频,它们还是用户如何创建自己的基于libcamera的应用程序的示例,这些应用程序具有自定义功能,以满足自己的需求。libcamera-apps的源代码可以在https://github.com/raspberrypi/libcamera-apps.的BSD 2条款许可下免费获得
更多关于libcamera
libcamera
is an open source Linux community project. More information is available at the libcamera
website.
libcamera是一个开源的 Linux 社区项目。更多信息可在https://libcamera.org[libcamera网站]上找到。
libcamera源代码可以在官方的https://git.linuxtv.org/libcamera.git/[libcamera存储库]中找到并签出,尽管我们从一个https://github.com/raspberrypi/libcamera.git[fork]开始工作,这个fork允许我们控制何时获得libcamera更新。
在libcamera内核的下面,Raspberry Pi提供了一个自定义的管道处理程序,libcamera使用这个层来驱动Raspberry Pi本身上的传感器和ISP(图像信号处理器)。其中还有一部分是众所周知的控制算法,或libcamera术语中的IPAs(图像处理算法),如AEC/AGC(自动曝光/增益控制),AWB(自动白平衡),ALSC(自动镜头阴影校正)等。
所有这些代码都是开源的,现在运行在Raspberry Pi的ARM内核上。GPU上只有一个非常薄的代码层,它将Raspberry Pi自己的控制参数转换为Broadcom ISP的寄存器写入。
Raspberry Pi的libcamera实现不仅支持四个标准Raspberry Pi摄像机(OV5647或V1摄像机、IMX219或V2摄像机、IMX477或HQ摄像机以及IMX708或摄像机模块3),还支持第三方传感器,如IMX290、IMX327、OV9281、IMX378。Raspberry Pi渴望与那些希望libcamera直接支持其传感器的供应商合作。
此外,Raspberry Pi 为每个传感器提供了一个调整文件,可以对其进行编辑以更改 Raspberry Pi 硬件对从图像传感器接收的原始图像执行的处理,包括颜色处理、噪声抑制量或控制算法的行为等方面。
raspberry-pi-camera-guide.pdf[Tuning Guide for the Raspberry Pi cameras and libcamera]. 有关Raspberry Pi的libcamera更多信息,请参阅https://datasheets.raspberrypi.com/camera/raspberry-pi-camera-guide.pdf[Raspberry Pi相机和 libcamera 的调优指南]。
开始
首次使用相机
Note
|
在Raspberry Pi 3和运行Bullseye的早期设备上,您需要重新启用Glamor以使X-Windows硬件加速预览窗口工作。为此,在终端窗口输入sudo raspi-config,然后选择高级选项、Glamor和Yes。最后退出raspi-config,让它重启你的Raspberry Pi。 |
当运行基于Bullseye的Raspberry Pi操作系统时,已经安装了5个基本的libcamera应用程序。在这种情况下,官方的Raspberry Pi摄像头也会被自动检测并启用。
您可以通过输入以下内容来检查一切是否正常:
libcamera-hello
您应该会看到相机预览窗口约 5 秒钟。
仍在运行Buster的用户应该升级到Bullseye。那里不再支持新的基于 libcamera 的堆栈,任何仍在使用 Buster 的人都应该继续使用旧的相机堆栈。
Note
|
Raspberry Pi 3和更旧的设备可能默认没有使用正确的显示驱动程序。参考/boot/config.txt文件,确保dtoverlay=vc4-fkms-v3d或dtoverlay=vc4-kms-v3d当前处于活动状态。如果需要更改,请重新启动。 |
如果确实需要更改配置
在以下情况下,您可能需要更改/boot/config.txt文件中的相机配置:
-
您使用的是第三方相机(制造商的说明应说明您需要进行的更改)。
-
您使用的是官方的Raspberry Pi相机,但希望使用非标准的驱动程序/覆盖。
如果您确实需要添加自己的dtoverlay,目前可以识别以下内容。
相机模组 | 在 /boot/config.txt
|
---|---|
V1 camera (OV5647) |
|
V2 camera (IMX219) |
|
HQ camera (IMX477) |
|
GS camera (IMX296) |
|
Camera Module 3 (IMX708) |
|
IMX290 and IMX327 |
|
IMX378 |
|
OV9281 |
|
要覆盖自动摄像机检测,Bullseye 用户还需要删除条目camera_auto_detect=1(如果在config.txt文件中存在)。编辑此文件后,您的Raspberry Pi需要重新启动。
Note
|
设置camera_auto_detect=0将完全禁用启动时间检测。 |
libcamera-hello
libcamera-hello相当于相机的“Hello World”应用程序。它启动相机,显示预览窗口,而不执行任何其他操作。例如
libcamera-hello
应该会显示一个大约5秒钟的预览窗口。-t <持续时间>选项允许用户选择窗口显示的时间长度,其中<持续时间>以毫秒为单位。要无限期运行预览,请使用:
libcamera-hello -t 0
可以通过单击窗口的关闭按钮或在终端中使用Ctrl-C来停止预览。
选项
libcamera-apps使用第三方库来解释命令行选项。这包括长格式选项和短格式选项,长格式选项的选项名由多个以-开头的字符组成,短格式选项只能是以单个-开头的单个字符。在很大程度上,选择的选项名称与传统raspicam应用程序使用的名称相匹配,只是我们不能再用单个-来处理多字符选项名称。任何此类传统选项都已被删除,必须使用带-的长格式来代替。 这些选项大致分为 3 组,即常见选项、特定于静止图像的选项和用于视频编码的选项。它们在应用的所有应用程序中都以相同的方式受支持。 有关完整列表,请参阅命令行选项文档。
调优文件
Raspberry Pi的libcamera实现包括一个针对每种不同类型的相机模块的调整文件。这是一个描述或“调整”参数的文件,这些参数将被传递给算法和硬件以产生最佳图像质量。libcamera只能自动确定正在使用的图像传感器,而不是作为一个整体的模块——即使整个模块会影响“调整”。
因此,有时需要覆盖特定传感器的默认调整文件。 例如,NOIR(无红外滤光片)版本的传感器需要与标准版本不同的AWB设置,因此IMX219 NOIR应使用运行
libcamera-hello --tuning-file /usr/share/libcamera/ipa/raspberrypi/imx219_noir.json
如果您使用的是 Soho 企业 SE327M12 模块,则应使用
libcamera-hello --tuning-file /usr/share/libcamera/ipa/raspberrypi/se327m12.json
请注意,这也意味着用户可以复制现有的优化文件并根据自己的首选项对其进行更改,只要—tuning-file参数指向新版本即可。
最后,与其他libcamera-hello命令行选项一样,tuning-file参数同样适用于所有libcamera-apps。
预览窗口
大多数在窗口中显示libcamera-apps预览图像。当 X Windows 未运行时,它将使用 Linux DRM(直接渲染管理器)直接绘制到显示器,否则它将尝试使用 X Windows。两条路径都使用与 GPU 共享的零拷贝缓冲区,其结果是不支持 X 转发。
出于这个原因,还有第三种预览窗口,它确实支持 X 转发,并且可以通过该—qt-preview选项请求。此实现既不能受益于零拷贝缓冲区共享,也不能受益于 3D 加速,这使得它的计算成本很高(尤其是对于大型预览),因此通常不建议这样做。
Note
|
使用Gtk2的旧系统在与OpenCV链接时,可能会产生Glib-GObject错误,并且无法显示Qt预览窗口。在这种情况下,请(以root用户身份)编辑文件/etc/xdg/qt5ct/qt5ct.conf,并将包含style=gtk2的行替换为style=gtk3。 |
预览窗口可以使用-n (--nopreview) 选项完全禁止显示。
该—info-text选项允许用户请求使用“%指令”在窗口标题栏上显示某些有用的图像信息。例如
libcamera-hello --info-text "red gain %rg, blue gain %bg"
将显示当前的红色和蓝色增益值。
对于 HQ 相机,--info-text "%focus"用于显示对焦测量值,这将有助于对焦镜头。
命令行选项文档中提供了—info-text参数的完整说明。
libcamera-jpeg
libcamera-jpeg是一个简单的静态图像捕捉应用程序。它故意避开了libcamera-still的一些附加特性,后者试图更全面地模仿raspistill。因此,代码更容易理解,并且在实践中仍然提供了许多相同的功能。
要捕获全分辨率 JPEG 图像,请使用
libcamera-jpeg -o test.jpg
这将显示大约 5 秒的预览,然后将全分辨率 JPEG 图像捕获到test.jpg文件中。
该选项可用于更改预览显示的时间长度,和选项将更改捕获的静止图像的分辨率。例如-t <duration>--width—height -t <duration >选项可用于改变预览显示的时间长度,而- width和- height选项将改变捕获的静止图像的分辨率。例如
libcamera-jpeg -o test.jpg -t 2000 --width 640 --height 480
将捕获 VGA 大小的图像。
曝光控制
所有这些libcamera-apps都允许用户以固定的快门速度和增益运行相机。例如
libcamera-jpeg -o test.jpg -t 2000 --shutter 20000 --gain 1.5
将捕获曝光为 20 毫秒、增益为 1.5 倍的图像。请注意,增益将作为传感器内的模拟增益应用,直到达到内核传感器驱动程序允许的最大模拟增益,之后其余增益将作为数字增益应用。
Raspberry Pi 的 AEC/AGC 算法允许应用程序指定曝光补偿,即通过给定的停靠点数使图像变暗或变亮的能力,如下所示
libcamera-jpeg --ev -0.5 -o darker.jpg
libcamera-jpeg --ev 0 -o normal.jpg
libcamera-jpeg --ev 0.5 -o brighter.jpg
关于数字增益的进一步评论
数字增益由ISP(图像信号处理器)施加,而不是由传感器施加。数字增益将始终非常接近1.0,除非:
-
请求的总增益(通过—gain选件或相机调谐中的曝光配置文件)超过了传感器内可用作模拟增益的总增益。只有所需的额外增益将用作数字增益。
-
其中一个颜色增益小于 1(请注意,颜色增益也应用为数字增益)。在这种情况下,广告的数字增益将稳定为1 / min(red_gain,blue_gain)。这实际上意味着其中一个颜色通道 - 而不是绿色通道 - 正在应用统一数字增益。
-
AEC/AGC 正在发生变化。当AEC/AGC移动时,数字增益通常会在一定程度上变化,以试图消除任何波动,但它会很快恢复到其“正常”值。
libcamera-still
libcamera-still与libcamera-jpeg非常相似,但支持更多的传统raspistill选项。和以前一样,可以用
libcamera-still -o test.jpg
编码
libcamera-still允许以多种不同的格式保存文件。它支持png,bmp两者和编码。它还允许将文件另存为 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.data
请注意,保存图像的格式取决于-e(等效)--encoding选项,并且不会根据输出文件名自动选择。
原始图像捕获
原始图像是由图像传感器直接生成的图像,在ISP(图像信号处理器)或任何CPU内核对其应用任何处理之前。对于彩色图像传感器,这些通常是拜耳格式的图像。请注意,原始图像与我们之前看到的已处理但未编码的 RGB 或 YUV 图像有很大不同。
捕获原始图像使用
libcamera-still -r -o test.jpg
这里,-r选项(也叫- raw)表示捕获raw图像和JPEG图像。事实上,原始图像就是产生JPEG的精确图像。原始图像以DNG (Adobe Digital Negative)格式保存,并与许多标准应用程序兼容,如dcraw或RawTherapee。原始图像被保存到一个具有相同名称但扩展名为的文件中。dng,因此本例中为test.dng。
这些DNG文件包含有关图像捕获的元数据,包括黑电平,白平衡信息和ISP用于产生JPEG的颜色矩阵。这使得这些DNG文件更方便以后使用上述一些工具进行“手动”原始转换。“使用”exiftool显示编码到 DNG 文件中的所有元数据:
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
我们注意到只有一个校准光源(由AWB算法确定的光源,即使它总是被标记为“D65”),并且将ISO值除以100得到正在使用的模拟增益。
长时间曝光
为了拍摄曝光时间很长的图像,我们需要小心禁用AEC/AGC和AWB,否则这些算法将迫使用户在收敛时等待多个帧。禁用它们的方法是提供显式值。此外,可以使用该—immediate选项跳过捕获的整个预览阶段。
因此,要执行 100 秒曝光捕获,请使用
libcamera-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
作为参考,三款官方Raspberry Pi相机的最大曝光时间可以在此表中找到。
libcamera-vid
libcamera-vid是视频捕获应用程序。默认情况下,它使用Raspberry Pi的硬件H.264编码器。它将显示一个预览窗口,并将编码的比特流写入指定的输出。例如,要将 10 秒的视频写入文件,请使用
libcamera-vid -t 10000 -o test.h264
生成的文件可以播放vlc(以及其他应用程序)
vlc test.h264
请注意,这是一个未打包的视频比特流,它没有包装在任何类型的容器格式中(如mp4文件)。- save-pts选项可用于输出帧时间戳,以便随后使用mkvmerge等工具将比特流转换为适当的格式。
libcamera-vid -o test.h264 --save-pts timestamps.txt 然后,如果您想要一个 MKV 文件:
mkvmerge -o test.mkv --timecodes 0:timestamps.txt test.h264
编码
例如,支持运动JPEG,以及未压缩和未格式化的YUV420
libcamera-vid -t 10000 --codec mjpeg -o test.mjpeg
libcamera-vid -t 10000 --codec yuv420 -o test.data
在这两种情况下,--codec参数确定输出格式,而不是输出文件的扩展名。
该—segment参数将输出文件分解为段大小的块(以毫秒为单位)。这对于通过指定非常短(1毫秒)的段将运动 JPEG 流分解为单独的 JPEG 文件非常方便。
libcamera-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
请注意,输出文件名通常只有在我们避免每次都覆盖前一个文件时才明智,例如使用包含计数器的文件名(如上所述)。下面提供了有关输出文件名的更多信息。
网络流
Note
|
本节介绍来自libcamera-vid 的本机流式处理。但是,也可以使用 libav 后端进行网络流。有关更多详细信息,请参阅 libav 部分。 |
UDP
要使用UDP流式传输视频,请在Raspberry Pi(服务器)上使用
libcamera-vid -t 0 --inline -o udp://<ip-addr>:<port>
where <ip-addr>
is the IP address of the client, or multicast address (if appropriately configured to reach the client). On the client use (for example)
vlc udp://@:<port> :demux=h264
或者
ffplay udp://<ip-addr-of-server>:<port> -fflags nobuffer -flags low_delay -framedrop
具有相同的<port>值。
TCP
可以使用 TCP 流式传输视频。将Raspberry Pi用作服务器
libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>
和客户端
vlc tcp/h264://<ip-addr-of-server>:<port>
或者
ffplay tcp://<ip-addr-of-server>:<port> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
每秒 30 帧的低延迟流。
Raspberry Pi将等到客户端连接,然后开始流式传输视频。
RTSP
vlc在Raspberry Pi上对于格式化RTSP流很有用,尽管还有其他RTSP服务器可用。
libcamera-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
这可以播放
vlc rtsp://<ip-addr-of-server>:8554/stream1
或者
ffplay rtsp://<ip-addr-of-server>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
在所有情况下,服务器上的预览窗口(Raspberry Pi)都可以用-n(--no preview)选项取消。还要注意- inline选项的使用,它强制将流头信息包含在每个I(内部)帧中。这一点很重要,这样,如果客户端错过了流的开头,它就可以正确地理解流。
Note
|
最新版本的 VLC 似乎在播放 H.264 流时存在问题。我们建议使用上述ffplay命令进行播放,直到这些问题得到解决。 |
高帧率捕获
使用libcamera-vid捕获高帧率视频(通常超过 60 fps)同时最大限度地减少丢帧需要一些注意事项:
-
The H.264 target level must be set to 4.2 with the
--level 4.2
argument. 1.必须使用- level 4.2参数将 H.264目标级别设置为4.2。
2.软件颜色去噪处理必须与参数—denoise cdn_off一起关闭。
3.对于超过 100 fps 的速率,使用该-n选项禁用显示窗口将释放一些额外的 CPU 周期,以帮助避免丢帧。
-
建议在/boot/config.txt中设置force_turbo=1,以确保CPU时钟不会在视频捕获期间受到抑制。详情请见此处。
-
调整ISP输出分辨率—width 1280 --height 720或甚至更低的分辨率以实现您的帧速率目标。
6.在Pi 4上,您可以通过在/boot/config.txt中添加gpu_freq=550或更高版本来对GPU进行超频以提高性能,详细信息请参见https://www.raspberrypi.com/documentation/computers/config_txt.html#overclocking[此处。]
1280x720 120fps 视频编码的示例命令为:
libcamera-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
Libav 与 Libcamera-VID 的集成
libcamera-vid可以使用 FFMPEG/libav 编解码器后端对音频和视频流进行编码,并保存到本地文件或通过网络流式传输。目前,视频通过硬件H.264编码器进行编码,音频由许多可用的软件编码器进行编码。要列出可用的输出格式,请使用该ffmpeg -formats命令。
要启用 libav 后端,请使用—codec libav命令行选项。启用后,以下配置选项可用:
--libav-format, libav output format to be used <string>
设置要使用的 libav 输出格式。这些输出格式可以指定为容器(例如 mkv、mp4、avi)或流输出(例如 h264 或 mpegts)。如果未提供此选项,libav 将尝试从命令行参数-o指定的文件名推断输出格式。
示例:要将视频保存在 mkv 容器中,以下命令是等效的:
libcamera-vid --codec libav -o test.mkv libcamera-vid --codec libav --libav-format mkv -o test.raw
--libav-audio, Enable audio recording
设置此选项可与视频流一起启用音频编码。启用音频编码后,必须使用支持音频的输出格式(例如 mpegts、mkv、mp4)。
--audio-codec, Selects the audio codec <string>
选择用于编码的软件音频编解码器。默认情况下使用。要列出可用的音频编解码器,请使用该aacffmpeg -codec命令。
--audio-bitrate, Selects the audio bitrate <number>
设置音频编码比特率(以位/秒为单位)。
Example: 要使用mp2编解码器以16千位/秒的速度录制音频,请使用lib camera-vid-codec libav-o test.mp4-audio _ codec MP2-audio-bitrate 16384
--audio-samplerate, Set the audio sampling rate <number>
以 Hz 为单位设置音频采样率以进行编码。设置为 0(默认值)以使用输入采样率。
--audio-device, Chooses an audio recording device to use <string>
选择要用于音频录制的 ALSA 输入设备。可以使用以下命令获取音频设备字符串:
pi@pi4:~ $ pactl list | grep -A2 'Source #' | grep 'Name: ' Name: alsa_output.platform-bcm2835_audio.analog-stereo.monitor Name: alsa_output.platform-fef00700.hdmi.hdmi-stereo.monitor Name: alsa_output.usb-GN_Netcom_A_S_Jabra_EVOLVE_LINK_000736B1214E0A-00.analog-stereo.monitor Name: alsa_input.usb-GN_Netcom_A_S_Jabra_EVOLVE_LINK_000736B1214E0A-00.mono-fallback
--av-sync, Audio/Video sync control <number>
此选项可用于将音频样本时间戳相对于视频帧的给定值(以微秒为单位)移动。也可以使用负值。
使用 libav 进行网络流式传输
可以使用 libav 后端作为音频/视频的网络流源。为此,-o参数指定的输出文件名必须作为协议 url 提供,有关协议使用的更多详细信息,请参阅 ffmpeg 协议。一些例子:
使用 TCP 流式传输音频/视频
libcamera-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "tcp://0.0.0.0:1234?listen=1"
使用 UDP 流式传输音频/视频
libcamera-vid -t 0 --codec libav --libav-format mpegts --libav-audio -o "udp://<ip-addr>:<port>"
libcamera-raw
libcamera-raw
is like a video recording application except that it records raw Bayer frames directly from the sensor. It does not show a preview window. For a 2 second raw clip use
libcamera-raw -t 2000 -o test.raw
The raw frames are dumped with no formatting information at all, one directly after another. The application prints the pixel format and image dimensions to the terminal window so that the user can know how to interpret the pixel data.
By default the raw frames are saved in a single (potentially very large) file. As we saw previously, the --segment
option can be used conveniently to direct each to a separate file.
libcamera-raw -t 2000 --segment 1 -o test%05d.raw
In good conditions (using a fast SSD) libcamera-raw
can get close to writing 12MP HQ camera frames (18MB of data each) to disk at 10 frames per second. It writes the raw frames with no formatting in order to achieve these speeds; it has no capability to save them as DNG files (like libcamera-still
). If you want to be sure not to drop frames you could reduce the framerate slightly using the --framerate
option, for example
libcamera-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
libcamera-detect
libcamera-detect在任何Raspberry Pi OS发行版中都没有默认提供,但可以由安装了TensorFlow Lite安装了TensorFlow Lite的用户构建。在这种情况下,请参考libcamera-apps构建说明。您需要使用-DENABLE_TFLITE=1运行cmake。
此应用程序运行预览窗口并使用Google MobileNet v1 SSD(单次检测器)神经网络监控内容,该神经网络经过训练,可以使用Coco数据集识别大约80类对象。它应该识别人,汽车,猫和许多其他物体。 它首先运行预览窗口,每当检测到目标对象时,它都会执行全分辨率 JPEG 捕获,然后返回预览模式继续监视。它提供了几个不适用于其他地方的其他命令行选项:
--object <name>
使用给定的<name> .该名称应取自模型的标签文件。
--gap <number>
在捕获后至少等待这么多帧,然后再执行另一帧。这是必要的,因为神经网络不会在每一帧上运行,因此在考虑再次捕获之前,最好给它几帧以再次运行。
请参阅 TensorFlow Lite 对象检测器 部分,了解有关如何获取和使用此模型的更多一般信息。但举个例子,你可能会在外出时秘密监视你的猫:
libcamera-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat
通用命令行选项
除非另有说明,否则以下选项适用于所有具有相似或相同语义的libcamera-apps 。
--help, -h Print help information for the application
该—help选项使每个应用程序打印其完整的命令行选项集,并简要介绍每个选项,然后退出。
--version Print out a software version number
当所有libcamera-apps看到- version选项时,它们将打印出libcamera和libcamera-apps的版本字符串,然后退出,例如:
libcamera-apps build: ca559f46a97a 27-09-2021 (14:10:24) libcamera build: v0.0.0+3058-c29143f7
--list-cameras List the cameras available for use
--list-cameras将显示连接到主板的可用相机,可供应用程序使用。此选项还列出了每个相机支持的传感器模式。例如:
Available cameras ----------------- 0 : imx219 [3280x2464] (/base/soc/i2c0mux/i2c@1/imx219@10) Modes: 'SRGGB10_CSI2P' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop] 1640x1232 [41.85 fps - (0, 0)/3280x2464 crop] 1920x1080 [47.57 fps - (680, 692)/1920x1080 crop] 3280x2464 [21.19 fps - (0, 0)/3280x2464 crop] 'SRGGB8' : 640x480 [206.65 fps - (1000, 752)/1280x960 crop] 1640x1232 [41.85 fps - (0, 0)/3280x2464 crop] 1920x1080 [47.57 fps - (680, 692)/1920x1080 crop] 3280x2464 [21.19 fps - (0, 0)/3280x2464 crop] 1 : imx477 [4056x3040] (/base/soc/i2c0mux/i2c@1/imx477@1a) Modes: 'SRGGB10_CSI2P' : 1332x990 [120.05 fps - (696, 528)/2664x1980 crop] 'SRGGB12_CSI2P' : 2028x1080 [50.03 fps - (0, 440)/4056x2160 crop] 2028x1520 [40.01 fps - (0, 0)/4056x3040 crop] 4056x3040 [10.00 fps - (0, 0)/4056x3040 crop]
在上面的示例中,IMX219 传感器的索引为 0,IMX477 的索引为 1。传感器模式标识符采用以下形式:
S<Bayer order><Bit-depth>_<Optional packing> : <Resolution list>
对于上面示例中的 IMX219,所有模式都具有RGGB拜耳订购,并以列出的分辨率提供 8 位或 10 位 CSI2 打包读数。裁剪指定为 (<x>, <y>)/<宽度>x<高度>,其中 (x, y) 是传感器阵列中大小为宽度 x 高度的裁剪窗口的位置。单位保持本机传感器像素,即使传感器在合并或跳过模式下使用也是如此。
--camera Selects which camera to use <index>
-
camera选项将从提供的< index >值中选择要使用的摄像机。< index >值可以从-list-camera选项中获得。
--config, -c Read options from the given file <filename>
通常,选项是从命令行读取的,但是如果需要多个选项,将它们保存在文件中可能更方便。
例: libcamera-hello -c config.txt
这是一个文本文件,包含单独的键=值对行,例如:
timeout=99000 verbose=
请注意,即使对于隐式选项,也需要=号,而命令行中使用的-号被省略了。仅允许长格式选项(不接受t=99000)。
--timeout, -t Delay before application stops automatically <milliseconds>
该—timeout选项指定应用程序在停止之前运行的时间,无论是录制视频还是显示预览。在静止图像捕获的情况下,应用程序将在捕获输出图像之前显示预览窗口。
如果未指定,则默认值为 5000(5 秒)。值零会导致应用程序无限期运行。
例: libcamera-hello -t 0
预览窗口
--preview, -p Preview window settings <x,y,w,h>
设置预览窗口的大小和位置(X Windows 和 DRM 版本)。它不会影响从相机请求的图像的分辨率或纵横比。相机图像将缩放到预览窗口的大小以进行显示,并将采用柱子/信箱以适合。
例: libcamera-hello -p 100,100,500,500
--fullscreen, -f Fullscreen preview mode
强制预览窗口使用整个屏幕,并且窗口将没有边框或标题栏。同样,图像可能是柱子/信箱。
例 libcamera-still -f -o test.jpg
--qt-preview Use Qt-based preview window
预览窗口切换为使用基于 Qt 的实现。通常不建议使用此选项,因为它不再使用零拷贝缓冲区共享或 GPU 加速,因此非常昂贵,但是,它确实支持 X 转发(其他预览实现不支持)。
Qt 预览窗口不支持该—fullscreen选项。通常建议尽量保持预览窗口较小。
例 libcamera-hello --qt-preview
--nopreview, -n Do not display a preview window
预览窗口被完全禁止显示。
例 libcamera-still -n -o test.jpg
--info-text Set window title bar text <string>
提供的字符串设置为预览窗口的标题(在 X 窗口下运行时)。此外,该字符串可能包含许多%指令,这些指令被来自图像元数据的信息替换。允许的指令是
命令 | 替代 |
---|---|
%frame |
帧的序列号 |
%fps |
瞬时帧速率 |
%exp |
用于捕获图像的快门速度,以微秒为单位 |
%ag |
应用于传感器中图像的模拟增益 |
%dg |
ISP施加到图像上的数字增益 |
%rg |
应用于每个像素的红色分量的增益 |
%bg |
应用于每个像素的蓝色分量的增益 |
%focus |
图像的焦点指标,其中较大的值表示图像越清晰 |
%lp |
以屈光度为单位的当前镜头位置(1 /以米为单位的距离)。 |
%afstate |
自动对焦算法状态(空闲、扫描、对焦或失败之一)。 |
如果未提供,则- info-text字符串默认为“# % frame(% fps fps)exp % exp ag % ag DG % DG”。
例: libcamera-hello --info-text "Focus measure: %focus"
相机分辨率和读数
--width Capture image width <width> --height Capture image height <height>
这些数字指定由libcamera-still、libcamera-jpeg和libcamera-vid捕获的相机图像的输出分辨率。
对于libcamera-raw ,它会影响捕获的原始帧的大小。如果相机具有 2x2 像素合并读出模式,则指定不大于此像素合并模式的分辨率将导致捕获 2x2 像素合并原始帧。
对于libcamera-hello这些参数没有影响。
例子:
libcamera-vid -o test.h264 --width 1920 --height 1080将捕获 1080p 视频。
libcamera-still -r -o test.jpg --width 2028 --height 1520将捕获 2028x1520 分辨率的 JPEG。使用HQ相机时,传感器将以2x2像素合并模式驱动,因此捕获的test.dng原始文件将包含2028x1520原始拜耳图像。
--viewfinder-width Capture image width <width> --viewfinder-height Capture image height <height>
这些选项仅影响预览(意味着libcamera-hello以及libcamera-jpeg和libcamera-still的预览阶段),并指定预览窗口将从相机请求的图像大小。它们对拍摄的静态图像或视频没有影响。它们也不会影响预览窗口,因为它们会调整图像的大小以适合预览窗口。
例: libcamera-hello --viewfinder-width 640 --viewfinder-height 480
--rawfull Force sensor to capture in full resolution mode
该选项强制传感器以全分辨率读出模式进行静态和视频捕捉,而不考虑所要求的输出分辨率(由-宽度和-高度给出)。对libcamera-hello没有影响。
使用此选项通常会导致帧速率损失,因为分辨率较大的帧读出速度较慢。
示例:lib camera-raw-t 2000-segment 1-raw full-o test % 03d . raw将导致捕获多个全分辨率原始帧。在HQ摄像机上,每帧的大小约为18MB。如果没有- rawfull选项,默认的视频输出分辨率会导致选择2x2装箱模式,从而产生4.5MB的原始帧。
--mode Specify sensor mode, given as <width>:<height>:<bit-depth>:<packing>
此选项比- rawfull更通用,允许精确选择一种相机模式。应该通过给出其宽度、高度、位深度和包装来指定模式,用冒号分隔。这些数字不必精确,因为系统将选择它能找到的最接近的数字。此外,位深度和打包是可选的(分别默认为12和P表示“打包”)。例如:
-
4056:3040:12:P - 4056x3040分辨率,每像素12位,打包。这意味着原始图像缓冲区将被打包,以便 2 个像素值仅占用 3 个字节。
-
1632:1224:10- 1632x1224分辨率,每像素10位。它将默认为“打包”。10 位打包模式每 4 个字节存储 5 个像素。
-
2592:1944:10:U- 2592x1944分辨率,每像素10位,未打包。解压缩格式将以 2 个字节存储每个像素,在这种情况下,每个值的前 6 位为零。
-
3264:2448- 3264x2448分辨率。它将尝试选择默认的 12 位模式,但在 v2 相机的情况下没有,因此将选择 10 位模式。
-
mode选项影响视频录制和静止图像捕捉的模式选择。要在拍摄静止图像之前的预览阶段控制模式选择,请使用-取景器-模式选项。
-
--viewfinder-mode Specify sensor mode, given as <width>:<height>:<bit-depth>:<packing>
此选项与- mode选项相同,只是它仅适用于静止图像捕捉的预览阶段(也由libcamera-hello应用程序使用)。
--lores-width Low resolution image width <width> --lores-height Low resolution image height <height>
libcamera允许将第二个较低分辨率的图像流从相机系统传送到应用程序。该流可用于预览和视频模式(即libcamera-hello和libcamera-still的预览阶段,以及libcamera-vid),并且可用于图像分析等。对于静止图像捕捉,低分辨率图像流不可用。
低分辨率流与其他图像流具有相同的视野。如果为低分辨率流指定了不同的纵横比,则将挤压这些图像,以便像素不再是正方形。
在视频录制 (libcamera-vid) 期间,指定低分辨率流将禁用通常会发生的一些额外的颜色去噪处理。
例: libcamera-hello --lores-width 224 --lores-height 224
请注意,除非与图像后处理结合使用,否则低分辨率流不是特别有用。
--hflip Read out with horizontal mirror --vflip Read out with vertical flip --rotation Use hflip and vflip to create the given rotation <angle>
这些选项影响传感器的读取顺序,可用于水平镜像图像和/或垂直翻转图像。- rotation选项只允许值0或180,因此请注意,不支持90或270度旋转。而且,-旋转180°等同于- hflip - vflip。
例: libcamera-hello --vflip --hflip
--roi Select a crop (region of interest) from the camera <x,y,w,h>
-
roi(感兴趣区域)选项允许用户从传感器提供的全视野中选择特定作物。坐标被指定为可用视场的一部分,因此- roi 0,0,1,1将不会有任何影响。
该—roi参数实现了通常称为“数字变焦”的内容。
示例libcamera-hello --roi 0.25,0.25,0.5,0.5将精确选择从图像中心裁剪的像素总数的四分之一。
--hdr Run the camera in HDR mode (supported cameras only)
hdr选项使摄像机运行在HDR(高动态范围)模式。此选项仅适用于某些受支持的相机,包括Raspberry Pi相机模块3。
例如:lib camera-still-HDR-o hdr.jpg用于捕捉静态图像,或libcamera-vid - hdr -o hdr.h264用于捕捉视频。
用户也可以提供- hdr 0或- hdr 1,前者禁用hdr模式(相当于完全省略该选项),后者与单独使用- hdr相同。
Note
|
对于Raspberry Pi相机模块 3,非 HDR 模式包括通常的全分辨率 (12MP) 模式以及相当于半分辨率 2x2 像素合并 (3MP) 的模式。在HDR的情况下,只有单个半分辨率(3MP)模式可用,并且如果不重新启动相机应用程序,则无法在HDR和非HDR模式之间切换。 |
相机控制
以下选项会影响影响相机图像质量的图像处理和控制算法。
--sharpness Set image sharpness <number>
给定<number>调整图像清晰度。值零表示不应用锐化,值 1.0 使用默认锐化量,大于 1.0 的值使用额外锐化。
例:libcamera-still -o test.jpg --sharpness 2.0
--contrast Set image contrast <number>
给定<number>调整图像对比度。值零产生最小对比度,值 1.0 使用默认对比度量,大于 1.0 的值应用额外的对比度。
例:libcamera-still -o test.jpg --contrast 1.5
--brightness Set image brightness <number>
给定<number>调整图像亮度。值 -1.0 生成(几乎)黑色图像,值 1.0 生成几乎完全白色的图像,值 0.0 生成标准图像亮度。
请注意,亮度参数会添加(或减去)输出图像中所有像素的偏移量。该—ev选项通常更合适。
例:libcamera-still -o test.jpg --brightness 0.2
--saturation Set image colour saturation <number>
给定的调整颜色饱和度。值零生成灰度图像,值 1.0 使用默认的分色量,大于 1.0 的值应用额外的颜色饱和度。<number>
例: libcamera-still -o test.jpg --saturation 0.8
--ev Set EV compensation <number>
以光圈为单位设置图像的 EV 补偿,范围为 -10 到 10。默认值为 0。它通过提高或降低 AEC/AGC 算法尝试匹配的目标值来工作。
例: libcamera-still -o test.jpg --ev 0.3
--shutter Set the exposure time in microseconds <number>
快门时间固定为给定值。增益仍将允许变化(除非这也是固定的)。
请注意,如果照相机以太快而不允许的帧速率运行,则可能无法实现此快门时间。在这种情况下,该—framerate选项可用于降低帧速率。官方支持的Raspberry Pi的最大可能快门时间可以在此表中找到。
使用高于这些最大值的值将导致未定义的行为。相机也将具有不同的最小快门时间,尽管实际上这并不重要,因为它们都足够低,可以适当地曝光明亮的场景。
例: libcamera-hello --shutter 30000
--gain Sets the combined analogue and digital gains <number> --analoggain Synonym for --gain
这两个选项实际上是相同的,并且设置将要使用的组合模拟和数字增益。允许使用- analoggain格式,以便与传统的raspicam应用程序更加兼容。在传感器驱动器可以提供所需增益的情况下,将只使用模拟增益。一旦模拟增益达到最大允许值,超过该值的额外增益将作为数字增益提供。
请注意,在某些情况下,即使未超过模拟增益限值,数字增益也可能超过1。这可能发生在以下情况下
-
任一颜色增益都低于1.0,这将导致数字增益稳定为1.0 / min(red_gain,blue_gain)。这意味着应用于任何颜色通道的总数字增益都不会低于1.0,因为这会导致变色伪影。
-
当AEC/AGC变化时,数字增益可能会略有变化,但这种影响应该只是瞬态的。
--metering Set the metering mode <string>
设置 AEC/AGC 算法的计量模式。这可能是以下值之一
-
centre
- 中央重点测光(默认) -
spot
- 点测光 -
average
- 平均或全帧测光 -
custom
- 必须在摄像机调整文件中定义的自定义测光模式。
有关定义自定义测光模式以及如何在现有测光模式下调整区域权重的更多信息,请参阅 Raspberry Pi 相机和 libcamera 的调谐指南。
例: libcamera-still -o test.jpg --metering spot
--exposure Set the exposure profile <string>
曝光曲线可以是正常的、运动的或长的。改变曝光模式应该不会影响图像的整体曝光,但是运动模式倾向于选择更短的曝光时间和更大的增益来获得相同的最终结果。
可以在相机调整文件中编辑曝光配置文件。有关更多信息,请参阅 Raspberry Pi 相机和 libcamera 的调优指南 。
例: libcamera-still -o test.jpg --exposure sport
--awb Set the AWB mode <string>
此选项将 AWB 算法设置为命名 AWB 模式。有效模式包括:
模式名称 | 色温 |
---|---|
自动 |
2500K to 8000K |
白炽灯 |
2500K to 3000K |
钨 |
3000K to 3500K |
荧光 |
4000K to 4700K |
室内的 |
3000K to 5000K |
日光 |
5500K to 6500K |
多云 |
7000K to 8500K |
自定义 |
必须在相机调整文件中定义自定义范围 |
没有关闭AWB的模式,而是应使用该—awbgains选项指定固定的颜色增益。
请注意,这些值只是近似值,这些值可能会根据相机调整而变化。
有关AWB模式以及如何定义自定义模式的更多信息,请参阅https://datasheets.raspberrypi.com/camera/raspberry-pi-camera-guide.pdf[Raspberry Pi相机和libcamera的调整指南]。
例: libcamera-still -o test.jpg --awb tungsten
--awbgains Set fixed colour gains <number,number>
此选项接受红色和蓝色增益值,并直接使用它们来代替运行AWB算法。在此处设置非零值具有禁用 AWB 计算的效果。
例: libcamera-still -o test.jpg --awbgains 1.5,2.0
--denoise Set the denoising mode <string>
支持以下降噪模式:
-
auto
- 这是默认值。它始终支持标准空间降噪。它使用超快速的色彩去噪视频,并使用高质量的色彩去噪拍摄静止图像。预览根本不启用任何额外的色彩降噪。 -
off
- 禁用空间和色彩降噪。 -
cdn_off
- 禁用色彩降噪。 -
cdn_fast
- 使用快速色彩降噪。 -
cdn_hq
- 使用高质量的色彩降噪。由于吞吐量降低,不适合视频/取景器。
请注意,即使使用快速去色也会导致帧速率降低。高质量的色彩去噪通常会导致低得多的帧速率。
例: libcamera-vid -o test.h264 --denoise cdn_off
--tuning-file Specify the camera tuning to use <string>
这标识应使用的 JSON 格式优化文件的名称。调谐文件涵盖了图像处理的许多方面,包括 AEC/AGC、AWB、色彩渐晕校正、色彩处理、去噪等。
For more information on the camera tuning file, please consult the Tuning guide for the Raspberry Pi cameras and libcamera. 有关相机调谐文件的更多信息,请参阅https://datasheets.raspberrypi.com/camera/raspberry-pi-camera-guide.pdf[Raspberry Pi相机和 libcamera 的调优指南]。
例: libcamera-hello --tuning-file ~/my-camera-tuning.json
--autofocus-mode Specify the autofocus mode <string>
指定要使用的自动对焦模式,该模式可能是以下模式之一
-
默认(如果省略该选项,也是默认)-通常将相机置于连续自动对焦模式,除非给出了-镜头位置或-拍摄时自动对焦,在这种情况下选择手动模式
-
manual
- 根本不移动镜头,但可以使用选项—lens-position进行设置 -
auto
- 当相机启动时,除了自动对焦扫描之外,不移动镜头(对于libcamera-still,如果给定了自动对焦,则在拍摄之前) -
continuous
- 随着场景的变化自动调整镜头位置。
此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
--autofocus-range Specify the autofocus range <string>
指定自动对焦范围,可以是以下范围之一
-
normal
(默认值) - *normal
(默认值) - focuses from reasonably close to infinity -
macro
- 仅对焦于近处物体,包括相机支持的最近焦距 -
full
- 将专注于整个范围,从最接近的物体到无穷大。
此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
--autofocus-speed Specify the autofocus speed <string>
指定自动对焦速度,可以是
-
normal
(默认值) - 镜头位置将以正常速度更改 -
fast
- 镜头位置可能会变化得更快。
此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
--autofocus-window Specify the autofocus window
以x,y,width,height的形式指定自动对焦窗口,其中坐标以整个图像的比例给出。例如,-自动聚焦-窗口0.25,0.25,0.5,0.5将选择一个窗口,该窗口在每个维度上是输出图像大小的一半,并且居中。
默认值会导致算法在两个维度上使用输出图像的中间三分之一(即总图像面积的 1/9)。
此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
--lens-position Set the lens to a given position <string>
将镜头移动到固定焦距,通常以屈光度(单位 1 / 以米为单位的距离)给出。我们有
-
0.0 会将镜头移动到“无限远”位置
-
任何其他数字:将镜头移动到1 /数字位置,这样值2将聚焦在大约0.5m处
-
default
- 将镜头移动到与镜头的超焦距位置相对应的默认位置。
应该注意的是,镜头只能预期近似校准,并且不同相机模块之间可能存在差异。 此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
输出文件选项
--output, -o Output file name <string>
--output
设置要写入输出图像或视频的输出文件的名称。除了常规文件名外,这可能采用以下特殊值:
-
-
- 写给标准输出 -
udp://
- 以 this 开头的字符串将作为流式传输的网络地址 -
tcp://
- 以 this 开头的字符串将作为流式传输的网络地址 -
包含%d指令的字符串将作为文件名,其中 format 指令将替换为按打开的每个文件递增的计数。允许使用标准 C 格式指令修饰符。
例子:
lib camera-vid-t 100000-segment 10000-o chunk % 04d . h264以10秒的片段记录一个100秒的文件,其中每个文件都被命名为chunk.h264,但包含一个递增计数器。请注意,%04d将计数写入字符串,但通过添加前导零来填充总宽度至少为4个字符。
libcamera-vid -t 0 --inline -o udp://192.168.1.13:5000将 H.264 视频流式传输到端口 192 上的网络地址 168.1.13.5000。
--wrap Wrap output file counter at <number>
当输出到具有递增计数器的文件时(例如 %d在输出文件名中),当计数器达到此值时,将计数器包装回零。
例: libcamera-vid -t 0 --codec mjpeg --segment 1 --wrap 100 -o image%d.jpg
--flush Flush output files immediately
--flush
导致输出文件在写入每一帧后立即刷新到磁盘,而不是等待系统执行此操作。
例: libcamera-vid -t 10000 --flush -o test.h264
后处理选项
-
post-process-file选项指定一个JSON文件,该文件配置成像管道在摄像机图像到达应用程序之前对其应用的后处理。它可以被认为是对传统raspicam“图像效果”的替代。
后处理是一个大话题,它承认使用OpenCV和TensorFlowLite等第三方软件来分析和操作图像。有关更多信息,请参阅后处理部分。
例: libcamera-hello --post-process-file negate.json
如果negate.json文件配置正确,这可能会对映像应用“否定”效果。
仍然使用命令行选项
--quality, -q JPEG quality <number>
设置 JPEG 质量。100 表示最高质量,93 表示默认值。仅在保存 JPEG 文件时适用。
例: libcamera-jpeg -o test.jpg -q 80
--exif, -x Add extra EXIF tags <string>
给定的额外EXIF标签保存在JPEG文件中。仅在保存 JPEG 文件时适用。
使用libexif库支持EXIF,因此有一些相关的限制。特别是,libexif似乎可以识别许多标签,但不知道它们的正确格式。软件目前会将这些(在许多情况下是不正确的)视为ASCII,但会向终端打印一个警告。当我们遇到这些异常时,可以将它们添加到软件的已知异常表中。
显然,应用程序需要提供包含特定相机数据(如曝光时间)的EXIF标签。但是对于与相机无关的其他标签,一个合理的解决方法是使用类似exiftool .
例:libcamera-still -o test.jpg --exif IDO0.Artist=Someone
--timelapse Time interval between timelapse captures <milliseconds>
这将使libcamera-still进入定时模式,在该模式下,它将根据已设置的超时(- timeout或-t)运行,并在此期间以此处指定的间隔拍摄重复的图像。(lib camera-仅静止。)
示例:libcamera-still -t 100000 -o test%d.jpg --timelapse 10000每 10 秒捕获一个图像,持续约 100 秒。
--framestart The starting value for the frame counter <number>
将计数器值写入输出文件名时,这将指定计数器的起始值。
示例:lib camera-still-t 100000-o test % d . jpg-time lapse 10000-frame start 1每隔10s捕捉一个图像,持续约100s,从1而不是0开始。(lib camera-仅静止。)
--datetime Use date format for the output file names
使用当前日期和时间构造输出文件名,格式为 MMDDhhmmss.jpg,其中 MM = 2 位月份编号,DD = 2 位日期编号,hh = 2 位 24 小时数,mm = 2 位分钟数,ss = 2 位秒数。(仅。libcamera-still)
例:libcamera-still --datetime
--timestamp Use system timestamps for the output file names
使用当前系统时间戳(自 1970 年开始以来的秒数)作为输出文件名。(仅libcamera-still)
例:libcamera-still --timestamp
--restart Set the JPEG restart interval <number>
将 JPEG 重新启动间隔设置为给定值。默认值为零。
例:libcamera-still -o test.jpg --restart 20
--keypress, -k Capture image when Enter pressed
这会将libcamera-still切换到按键模式。当超时过期或在终端窗口中按下回车键时,它将捕获一个静止图像。键入x和Enter会导致libcamera-still退出而不进行采集。
例:libcamera-still -t 0 -o test.jpg -k
--signal, -s Capture image when SIGUSR1 received
这会将libcamera-still切换到信号模式。当超时过期或收到SIGUSR1时,它将捕获一幅静止图像。SIGUSR2将导致libcamera-still退出而不捕获。
例: libcamera-still -t 0 -o test.jpg -s &
然后 kill -SIGUSR1 $!
--thumb Set thumbnail parameters <w:h:q> or none
设置关联缩略图的尺寸和质量参数。默认值为 320x240 和质量 70。
例:libcamera-still -o test.jpg --thumb 640:480:80
可以给出该none值,在这种情况下,图像中根本不保存缩略图。
--encoding, -e Set the still image codec <string>
选择要使用的静止图像编码。有效的编码器包括:
-
jpg
- JPEG (默认) -
png
- PNG 格式 -
bmp
- BMP 格式 -
rgb
- 未压缩 RGB 像素的二进制转储 -
yuv420
- 未压缩的 YUV420 像素的二进制转储。
请注意,此选项决定了编码方式,因此输出文件名的扩展名将被忽略。但是,对于- datetime和- timestamp选项,文件扩展名取自上面列出的编码器名称。(lib camera-仅静止。)
例: libcamera-still -e png -o test.png
--raw, -r Save raw file
在通常的输出图像旁边保存一个DNG格式的原始拜耳文件。文件名通过将输出文件扩展名替换为. dng来给出。这些是标准的DNG文件,可以使用dcraw或RawTherapee等标准工具进行处理。(lib camera-仅静止。)
原始文件中的图像数据正是来自传感器的图像数据,ISP或其他任何东西都没有处理。保存在文件中的EXIF数据,除其他外,包括:
-
曝光时间
-
模拟增益(ISO 标签是所用模拟增益的 100 倍)
-
白平衡增益(即“作为镜头中性”值的倒数)
-
ISP 使用的颜色矩阵。
--latest Make symbolic link to latest file saved <string>
这会导致libcamera-still创建一个指向最近保存的文件的符号链接,从而使其更容易识别。(lib camera-仅静止。)
例:libcamera-still -t 100000 --timelapse 10000 -o test%d.jpg --latest latest.jpg
--autofocus-on-capture Whether to run an autofocus cycle before capture
如果设置,这将导致在捕获图像之前运行自动对焦循环。
如果没有指定自动对焦模式,或者设置为默认或手动,这将是唯一的自动对焦循环。
如果—autofocus-mode设置为auto ,则在预览窗口开始时将有一个额外的自动对焦周期。
如果—autofocus-mode设置为continuous ,则忽略此选项。
也可以使用。--autofocus-on-capture 1 代替—autofocus-on-capture 和—autofocus-on-capture 0作为完全省略参数的替代方法
例:libcamera-still --autofocus-on-capture -o test.jpg
此选项仅支持某些相机模块(例如Raspberry Pi相机模块 3)。
视频命令行选项
--quality, -q JPEG quality <number>
设置 JPEG 质量。100 表示最高质量,50 表示默认值。仅在以 MJPEG 格式保存时适用。
例:libcamera-vid --codec mjpeg -o test.mjpeg -q 80
--bitrate, -b H.264 bitrate <number>
设置 H.264 编码器的目标比特率(以位/秒为单位)。仅在以 H.264 格式编码时适用。
例:libcamera-vid -b 10000000 --width 1920 --height 1080 -o test.h264
--intra, -g Intra-frame period (H.264 only) <number>
将 H.264 比特流中 I(内部)帧的频率设置为帧数。默认值为 60。
例:libcamera-vid --intra 30 --width 1920 --height 1080 -o test.h264
--profile H.264 profile <string>
设置 H.264 配置文件。值可以是baseline main或high 。
例:libcamera-vid --width 1920 --height 1080 --profile main -o test.h264
--level H.264 level <string>
设置H.264级别。该值可以是4、4.1或4.2。
例:libcamera-vid --width 1920 --height 1080 --level 4.1 -o test.h264
--codec Encoder to be used <string>
这可以选择视频帧的编码方式。有效选项包括:
-
h264 - 使用 H.264 编码器(默认)
-
mjpeg - 使用 MJPEG 编码器
-
yuv420 - 输出未压缩的 YUV420 帧。
-
libav - 使用 libav 后端对音频和视频进行编码(有关更多详细信息,请参阅 libav 部分)。
例子:
libcamera-vid -t 10000 --codec mjpeg -o test.mjpeg
libcamera-vid -t 10000 --codec yuv420 -o test.data
--keypress, -k Toggle between recording and pausing
按Enter键将在录制视频流和不录制视频流(即丢弃视频流)之间切换libcamera-vid。应用程序在记录状态下启动,除非- initial选项另有指定。键入x和Enter会导致libcamera-vid退出。
例:libcamera-vid -t 0 -o test.h264 -k
--signal, -s Toggle between recording and pausing when SIGUSR1 received
SIGUSR1信号将在记录视频流和不记录视频流(即丢弃视频流)之间切换libcamera-vid。应用程序在记录状态下启动,除非- initial选项另有指定。SIGUSR2导致libcamera-vid退出。
例:
libcamera-vid -t 0 -o test.h264 -s
然后
kill -SIGUSR1 $!
--initial Start the application in the recording or paused state <string>
传递的值可以是record或pause,以分别在记录或暂停状态下启动应用程序。此选项应与- keypress或- signal一起使用,以便在两种状态之间切换。
例:libcamera-vid -t 0 -o test.h264 -k --initial pause
--split Split multiple recordings into separate files
此选项应与—keypress 或—signal 结合使用,并导致将每个录制会话(在暂停之间)写入单独的文件。
例:libcamera-vid -t 0 --keypress --split --initial pause -o test%04d.h264
--segment Write the video recording into multiple segments <number>
此选项会导致视频录制拆分到多个文件中,其中参数以毫秒为单位提供每个文件的大致持续时间。
一个方便的小技巧是传递一个非常小的持续时间参数(即- segment 1),这将导致每一帧被写入一个单独的输出文件。这使得“突发”JPEG采集(使用MJPEG编解码器)或“突发”raw帧采集(使用libcamera-raw)变得很容易。
例:libcamera-vid -t 100000 --segment 10000 -o test%04d.h264
--circular Write the video recording into a circular buffer of the given <size>
视频录制将写入循环缓冲区,当应用程序退出时,该缓冲区将写入磁盘。循环缓冲区的大小可以以兆字节为单位,默认为 4MB。
例:libcamera-vid -t 0 --keypress --inline --circular -o test.h264
--inline Write sequence header in every I frame (H.264 only)
此选项会导致将 H.264 序列标头写入每个 I(内部)帧。这很有帮助,因为这意味着客户端可以从任何 I 帧理解和解码视频序列,而不仅仅是从流的开头。建议将此选项用于将输出分解为多个部分 (--segment、--split、--circular) 或通过网络传输输出的任何输出类型。
例:libcamera-vid -t 0 --keypress --inline --split -o test%04d.h264
--listen Wait for an incoming TCP connection
此选项用于通过使用TCP/IP的网络进行流式传输。使用- listen将导致libcamera-vid在启动视频编码过程之前等待传入的客户端连接,然后视频编码过程将被转发到该客户端。
例:libcamera-vid -t 0 --inline --listen -o tcp://0.0.0.0:8123
--frames Record exactly this many frames <number>
精确记录<number>帧。指定非零值将覆盖任何超时。
例:libcamera-vid -o test.h264 --frames 1000
与Raspicam应用程序相比的差异
libcamera-apps虽然尝试模拟旧版Raspicam应用程序的大多数功能,但也存在一些差异。在这里,我们列出了用户可能会注意到的主要内容。
-
Boost program_options的使用不允许使用多字符短版本的选项,因此在存在这些选项的地方必须删除它们。长格式选项的名称相同,并保留任何单个字符的短格式。
-
libcamera-stil和libcamera-jpeg不在预览窗口中显示捕获图像。
-
libcamera执行自己的相机模式选择,因此不支持该—mode选项。它从请求的分辨率推断出相机模式。这方面的工作仍在进行中。
-
不支持旧版应用的以下功能,因为代码现在必须在 ARM 上运行。但请注意,其中许多效果现在由后处理后处理机制提供。
-
不透明度 (
--opacity
) -
图像效果 (
--imxfx
) -
色彩效果 (
--colfx
) -
注释 (
--annotate
,--annotateex
) -
动态范围压缩, 或者 DRC (
--drc
)
-
-
立体声(--stereo,--decimate和—3dswap)。目前在libcamera中不支持立体声。
-
没有图像稳定(--vstab)(尽管遗留实现似乎没有太大作用)。
-
没有演示模式 (--demo)。
-
支持的转换是不涉及换位的转换。因此,允许 180 度旋转,但不允许 90 度和 270 度旋转。
-
测光、曝光和AWB选项存在一些差异。特别是,传统应用程序将测光(我们的意思是“测光模式”)和曝光(我们现在指的是“曝光配置文件”)混为一谈。关于AWB,要将其关闭,您必须设置一对颜色增益(例如—awbgains 1.0,1.0)。
-
libcamera没有将AWB设置为“灰色世界”模式的机制,这对于“黑色”相机模块很有用。但是,提供了将AWB切换到正确模式的调优文件,因此,例如,您可以使用lib camera-hello-tuning-file/usr/share/lib camera/IPA/raspberrypi/imx 219 _ noir . JSON。
-
支持设置曝光时间(-快门)和模拟增益(-模拟增益或增益)。没有对数字增益的明确控制;如果要求的增益大于模拟增益本身可以提供的增益,就会出现这种情况。
-
libcamera对ISO没有了解,所以没有- ISO选项。用户应该计算对应于所需ISO值的增益(通常制造商会告诉您,例如,增益1对应于ISO 40),并使用- gain参数来代替。
-
尚不支持设置闪烁周期。
-
libcamera-仍然不支持连拍捕捉。事实上,因为JPEG编码不是多线程和流水线的,所以它会产生非常差的帧速率。相反,建议用户考虑在MJPEG模式下使用libcamera-vid(可以使用- segment 1将每一帧强制转换为单独的JPEG文件)。
-
libcamera对所有图像传感器使用开源驱动程序,因此启用或禁用传感器上 DPC(缺陷像素校正)的机制是不同的。默认情况下,imx477(总部凸轮)驱动程序启用传感器上的 DPC;要禁用它,用户应该以 root 身份输入
echo 0 > /sys/module/imx477/parameters/dpc_enable
后处理
libcamera-apps共享一个通用的后处理框架。这允许他们通过许多自定义图像处理和图像分析例程传递从相机系统接收的图像。每个这样的例程都称为后处理阶段,JSON文件中提供了对应运行哪些阶段以及它们可能具有的配置的确切描述。每个阶段及其源代码都提供了一个简短的示例 JSON 文件,显示如何启用它。
例如,简单否定阶段(“否定”图像中的所有像素,使浅色像素变暗,反之亦然)随一个negate.json文件一起提供,该文件配置后处理管道以运行它:
libcamera-hello --post-process-file /path/to/negate.json
Tip
|
示例JSON文件可以在libcamera-apps资源库的assets文件夹中找到,该资源库位于https://github . com/raspberrypi/lib camera-apps/tree/main/assets。 |
否定阶段特别简单,没有自己的配置参数,因此 JSON 文件只需命名阶段,无需进一步信息,它就会运行。因此negate.json包含
{ "negate": { } }
要运行多个后处理阶段,只需一起列出示例 JSON 文件的内容,并且这些阶段将按给定的顺序运行。例如,要运行 Sobel 阶段(将 Sobel 过滤器应用于图像),然后运行否定阶段,我们可以创建一个自定义 JSON 文件,其中包含
{ "sobel_cv": { "ksize": 5 }, "negate": { } }
Sobel阶段是使用OpenCV实现的,因此它的名字就叫CV。观察它如何拥有一个用户可配置的参数ksize,该参数指定要使用的过滤器的内核大小。在这种情况下,Sobel滤镜会在黑色背景上产生亮边,而“求反”阶段会将其转换为白色背景上的暗边,如图所示。
某些阶段实际上以某种方式改变了图像,这是它们的主要功能(例如否定)。其他主要用于图像分析,虽然它们可能在图像上指示某些内容,但它们真正做的只是生成有用的信息。出于这个原因,我们还有一种非常灵活的元数据形式,可以通过后处理阶段填充,这将一直传递到应用程序本身。
图像分析阶段通常更喜欢处理分辨率较低的图像。 libcamera-apps能够为应用程序提供由 ISP 硬件直接提供的现成低分辨率图像,这有助于提高性能。
此外,随着后处理框架的完全开放,Raspberry Pi 欢迎社区中新的和有趣的阶段的贡献,并很乐意将它们托管在我们的libcamera-apps存储库中。下面记录了当前可用的阶段。
NOTE:操作系统提供的libcamera-apps将在没有任何可选第三方库(如OpenCV或TensorFlow Lite)的情况下构建,这意味着依赖它们的某些后处理阶段将不会启用。要使用这些阶段,请按照说明为自己构建libcamera-apps。
negate
阶段
该negate阶段不需要第三方库。
在Raspberry Pi 3 设备或运行 4 位操作系统的Raspberry Pi 32 上,如果使用-DENABLE_COMPILE_FLAGS_FOR_TARGET=armv8-neon .(请参阅构建说明)。
negate阶段没有用户可配置的参数。
默认negate.json文件:
{ "negate": { } }
Example:
hdr
阶段
hdr阶段同时实现HDR(高动态范围)成像和DRC(动态范围压缩)。我们在这里使用的术语将 DRC 视为对单个图像进行操作,而 HDR 的工作原理是累积多个曝光不足的图像,然后执行与 DRC 相同的算法。
hdr阶段不依赖于第三方库,但是(像其他一些阶段一样)如果使用-den able _ COMPILE _ FLAGS _ FOR _ TARGET = arm V8-neon重新编译,可能会在运行32位操作系统的Raspberry Pi 3或Raspberry Pi 4设备上执行得更快(请参见构建说明)。具体来说,图像累积阶段将运行得更快,并导致更少的丢帧,尽管该过程的色调映射部分没有改变。
基本步骤是我们获取图像(在HDR的情况下可能是多个图像累积在一起)并应用边缘保留平滑过滤器来生成低通(LP)图像。我们将高通(HP)图像定义为LP图像与原始图像之间的差异。接下来,我们将全局色调图应用于 LP 图像并添加回 HP 图像。与将色调图直接应用于原始图像相比,此过程可防止我们挤压和丢失结果图像中的所有局部对比度。
值得注意的是,一旦ISP完成处理完图像,这一切都是使用完全处理的图像进行的。HDR通常在原始(Byer)域中进行时效果更好,因为信号仍然是线性的并且具有更大的位深度。我们希望在libcamera导出用于“重新处理”拜耳图像的API后实现此类功能,这些图像不是来自传感器,而是应用程序代码可以传入。
总之,用户可配置的参数大致分为三组:定义LP滤波器的参数,负责全局色调映射的参数,以及负责重新应用局部对比度的参数。
num_frames |
要累积的帧数。对于 DRC(在我们的术语中),这将取值 1,但对于多帧 HDR,我们建议使用诸如 8 的值。 |
lp_filter_strength |
低通IIR滤波器的系数。 |
lp_fiter_threshold |
一种分段线性函数,它将像素级别与被视为“有意义的细节”的阈值相关联。 |
global_tonemap_points |
输入图像直方图中的点和输出范围中我们希望将它们移动到的目标的列表。我们定义了分位数间平均值(q和宽度)、作为全输出范围(目标)的一部分的目标以及最大和最小增益,我们准备通过该最大和最小增益来移动测量的分位数间平均值(因为这防止我们过于剧烈地改变图像)。 |
global_tonemap_strength |
全局色调图的应用强度。 |
local_pos_strength |
分段线性函数,用于定义在添加回色调映射 LP 图像时应用于局部对比度的增益,以获得正(亮)细节。 |
local_neg_strength |
分段线性函数,用于定义在添加回色调映射 LP 图像时应用于局部对比度的增益,以获得负(暗)细节。 |
local_tonemap_strength |
应用于所有加回来的局部对比度的总增益。 |
local_colour_scale |
允许输出颜色或多或少受到强烈影响的因素。 |
我们注意到,通过更改global_tonemap_strength 和 local_tonemap_strength参数来最好地控制加工的整体强度。
Raspberry Pi 2 上的 3MP 图像需要 12 到 4 秒的完整处理时间。舞台仅在静止图像捕获上运行,它忽略预览和视频图像。特别是,当累积多个帧时,舞台“吞噬”输出图像,以便应用程序不会接收它们,最后仅通过组合和处理的图像发送。
DRC 的drc.json默认文件:
{ "hdr" : { "num_frames" : 1, "lp_filter_strength" : 0.2, "lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ], "global_tonemap_points" : [ { "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 1.5, "max_down": 0.7 }, { "q": 0.5, "width": 0.05, "target": 0.5, "max_up": 1.5, "max_down": 0.7 }, { "q": 0.8, "width": 0.05, "target": 0.8, "max_up": 1.5, "max_down": 0.7 } ], "global_tonemap_strength" : 1.0, "local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ], "local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ], "local_tonemap_strength" : 1.0, "local_colour_scale" : 0.9 } }
Example:
如果没有 DRC:
使用全强度 DRC:(使用libcamera-still -o test.jpg --post-process-file drc.json)
HDR 的默认hdr.json文件:
{ "hdr" : { "num_frames" : 8, "lp_filter_strength" : 0.2, "lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ], "global_tonemap_points" : [ { "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 5.0, "max_down": 0.5 }, { "q": 0.5, "width": 0.05, "target": 0.45, "max_up": 5.0, "max_down": 0.5 }, { "q": 0.8, "width": 0.05, "target": 0.7, "max_up": 5.0, "max_down": 0.5 } ], "global_tonemap_strength" : 1.0, "local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ], "local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ], "local_tonemap_strength" : 1.0, "local_colour_scale" : 0.8 } }
Example:
没有 HDR:
使用 HDR:(使用libcamera-still -o test.jpg --ev -2 --denoise cdn_off --post-process-file hdr.json)
motion_detect
阶段
motion_detect阶段通过分析低分辨率图像流中的帧来工作,必须对其进行配置才能使其工作。它将帧中的感兴趣区域(“roi”)与前一个帧的相应部分进行比较,如果有足够的像素足够不同,则将采取这些像素来指示运动。结果将添加到“motion_detect.result”下的元数据中。
此阶段不依赖于任何第三方库。
它具有以下可调参数。尺寸始终作为低分辨率图像大小的比例给出。
roi_x |
用于比较的感兴趣区域的 x 偏移量 |
roi_y |
用于比较的感兴趣区域的 y 偏移 |
roi_width |
用于比较的感兴趣区域的宽度 |
roi_height |
用于比较的感兴趣区域的高度 |
difference_m |
用于构造像素不同阈值的线性系数 |
difference_c |
用于根据阈值构造像素不同的阈值的常数系数 = difference_m * pixel_value + difference_c |
frame_period |
运动检测器将仅运行这么多帧 |
hskip |
像素测试按此量水平进行子采样 |
vksip |
像素测试按此量垂直子采样 |
region_threshold |
必须分类为不同的像素(或“区域”)的比例才能算作运动 |
verbose |
将消息打印到控制台,包括“运动”/“无运动”状态更改时 |
默认motion_detect.json配置文件:
{ "motion_detect" : { "roi_x" : 0.1, "roi_y" : 0.1, "roi_width" : 0.8, "roi_height" : 0.8, "difference_m" : 0.1, "difference_c" : 10, "region_threshold" : 0.005, "frame_period" : 5, "hskip" : 2, "vskip" : 2, "verbose" : 0 } }
注意,可以调整场difference_m和difference_c以及region_threshold的值,以使算法对运动或多或少地敏感。 如果需要减少计算量(也许您还有其他阶段需要更大的低分辨率图像),则可以使用 hskip和vskip 参数减少计算量。
若要使用该motion_detect阶段,可以输入以下示例命令:
libcamera-hello --lores-width 128 --lores-height 96 --post-process-file motion_detect.json
使用 OpenCV 进行后处理
Note
|
这些阶段都需要在您的系统上安装 OpenCV。您可能还需要使用 OpenCV 支持进行重建libcamera-apps - 请参阅自己构建 libcamera-app 的说明。 |
sobel_cv阶段
sobel_cv阶段具有以下用户可配置的参数:
ksize |
Sobel滤波器的内核大小 |
默认sobel_cv.json文件:
{ "sobel_cv": { "ksize": 5 } }
Example:
face_detect_cv阶段
此阶段使用 OpenCV Haar 分类器来检测图像中的人脸。它返回元数据中的人脸位置(在键“face_detect.results”下),并选择性地将它们绘制在图像上。
face_detect_cv阶段具有以下用户可配置的参数:
cascade_name |
可以找到 Haar 级联的文件的名称。 |
scaling_factor |
确定在图像中搜索人脸的比例范围。 |
min_neighbors |
计为面所需的最小重叠相邻要素数。 |
min_size |
最小面部尺寸。 |
max_size |
最大面部尺寸。 |
refresh_rate |
在尝试重新运行人脸检测器之前要等待多少帧。 |
draw_features |
是否在返回的图像上绘制人脸位置。 |
“face_detect_cv”阶段仅在预览和视频捕获期间运行;它忽略静止图像捕获。它在低分辨率流上运行,该流通常配置为大约 320x240 到 640x480 像素的分辨率。
默认face_detect_cv.json文件:
{ "face_detect_cv": { "cascade_name" : "/usr/local/share/OpenCV/haarcascades/haarcascade_frontalface_alt.xml", "scaling_factor" : 1.1, "min_neighbors" : 2, "min_size" : 32, "max_size" : 256, "refresh_rate" : 1, "draw_features" : 1 } }
Example:
annotate_cv阶段
此阶段允许将文本写入图像的上角。它允许与%--info-text参数相同的替换。
除了--info-text
标志之外,您还可以提供https://www.man7.org/linux/man-pages/man3/strftime.3.html[strftime]能够理解的任何标记来显示当前日期/时间。首先解释- info-text标记,然后strftime解释剩余的任何百分比标记。要在视频上获得日期时间标记,您可以使用%F %T %z (%F表示ISO-8601日期(2023-03-07),%T表示24小时本地时间(09:57:12),而%z表示与UTC (-0800)的时区差异。)
该阶段不输出任何元数据,但如果它在键“annotate.text”下找到元数据,它将写入此文本来代替 JSON 配置文件中的任何内容。这允许其他后处理阶段将其传递给要写入图像顶部的文本字符串。
annotate_cv阶段具有以下用户可配置的参数:
text |
要写入的文本字符串。 |
fg |
前景色。 |
bg |
背景颜色。 |
scale |
与文本大小成比例的数字。 |
thickness |
确定文本粗细的数字。 |
alpha |
覆盖背景像素时要应用的“alpha”量。 |
默认annotate_cv.json文件:
{ "annotate_cv" : { "text" : "Frame %frame exp %exp ag %ag dg %dg", "fg" : 255, "bg" : 0, "scale" : 1.0, "thickness" : 2, "alpha" : 0.3 } }
Example:
使用 TensorFlow Lite 进行后处理
Note
|
这些阶段需要安装导出C++ API的TensorFlow Lite(TFLite)库。不幸的是,TFLite 库通常不能方便地以这种形式分发,但是,可以下载它们的一个地方是 lindevs.comlindevs.com。请按照该页面上给出的安装说明进行操作。随后,您可能需要使用 TensorFlow Lite 支持重新编译libcamera-apps - 请按照说明为自己构建 libcamera-apps。 |
object_classify_tf
阶段
object_classify_tf使用 Google MobileNet v1 模型对相机图像中的对象进行分类。 它可以从需要解压缩的 https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_2018_08_02/mobilenet_v1_1.0_224_quant.tgz 中获得。您还需要可以在 https://storage.googleapis.com/download.tensorflow.org/models/mobilenet_v1_1.0_224_frozen.tgz 中找到labels.txt文件。
此阶段具有以下可配置参数。
top_n_results |
要显示多少个结果 |
refresh_rate |
重新运行模型之前必须经过的帧数 |
threshold_high |
置信度阈值(介于 0 和 1 之间),其中对象被视为存在 |
threshold_low |
置信度阈值,对象在作为匹配项丢弃之前必须低于该阈值 |
model_file |
tflite 模型文件的路径名 |
labels_file |
包含对象标签的文件的路径名 |
display_labels |
是否在图像上显示对象标签。请注意,这将导致插入annotate.text元数据,以便随后可以通过annotate_cv阶段呈现该文本 |
verbose |
将更多信息输出到控制台 |
示例文件object_classify_tf.json:
{ "object_classify_tf": { "top_n_results" : 2, "refresh_rate" : 30, "threshold_high" : 0.6, "threshold_low" : 0.4, "model_file" : "/home/pi/models/mobilenet_v1_1.0_224_quant.tflite", "labels_file" : "/home/pi/models/labels.txt", "display_labels" : 1 }, "annotate_cv" : { "text" : "", "fg" : 255, "bg" : 0, "scale" : 1.0, "thickness" : 2, "alpha" : 0.3 } }
此阶段在大小为 224x224 的低分辨率流图像上运行,因此可以按如下方式使用: libcamera-hello --post-process-file object_classify_tf.json --lores-width 224 --lores-height 224
pose_estimation_tf
阶段
pose_estimation_tf使用一个Google MobileNet v1模型posenet _ MobileNet _ v1 _ 100 _ 257 x257 _ multi _ kpt _ stripped . tflite,可以在https://github . com/QE engineering/tensor flow _ Lite _ Pose _ RPi _ 32-bits找到。
此阶段具有以下可配置参数。
refresh_rate |
重新运行模型之前必须经过的帧数 |
model_file |
tflite 模型文件的路径名 |
verbose |
将更多信息输出到控制台 |
还提供了单独的plot_pose_cv阶段,可以包含在 JSON 配置文件中,并将检测到的姿势绘制到主图像上。此阶段具有以下配置参数。
confidence_threshold |
确定抽取多少的置信水平。此数字可以小于零;有关更多信息,请参阅 GitHub 存储库。 |
示例文件pose_estimation_tf.json:
{ "pose_estimation_tf": { "refresh_rate" : 5, "model_file" : "posenet_mobilenet_v1_100_257x257_multi_kpt_stripped.tflite" }, "plot_pose_cv" : { "confidence_threshold" : -0.5 } }
此阶段在大小为 257x257 的低分辨率流图像上运行(但对于 YUV258 图像,必须向上舍入为 258x420),因此可以按如下方式使用:
libcamera-hello --post-process-file pose_estimation_tf.json --lores-width 258 --lores-height 258
object_detect_tf
阶段
object_detect_tf使用Google MobileNet v1 SSD(单发检测器)模型。可以从 https://storage.googleapis.com/download.tensorflow.org/models/tflite/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29.zip 下载模型和标签文件。
此阶段具有以下可配置参数。
refresh_rate |
重新运行模型之前必须经过的帧数 |
model_file |
tflite 模型文件的路径名 |
labels_file |
包含标签列表的文件的路径名 |
confidence_threshold |
最低置信度阈值,因为接受匹配项。 |
overlap_threshold |
确定要合并为单个匹配项的匹配项之间的重叠量。 |
verbose |
将更多信息输出到控制台 |
还提供了单独的object_detect_draw_cv阶段,可以包含在 JSON 配置文件中,并将检测到的对象绘制到主映像上。此阶段具有以下配置参数。
line_thickness |
边界框线的粗细 |
font_size |
用于标签的字体大小 |
示例文件object_detect_tf.json:
{ "object_detect_tf": { "number_of_threads" : 2, "refresh_rate" : 10, "confidence_threshold" : 0.5, "overlap_threshold" : 0.5, "model_file" : "/home/pi/models/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29/detect.tflite", "labels_file" : "/home/pi/models/coco_ssd_mobilenet_v1_1.0_quant_2018_06_29/labelmap.txt", "verbose" : 1 }, "object_detect_draw_cv": { "line_thickness" : 2 } }
此阶段在大小为 300x300 的低分辨率流图像上运行。以下示例将从 300x300 低分辨率图像的中心将 400x300 裁剪传递到检测器。
libcamera-hello --post-process-file object_detect_tf.json --lores-width 400 --lores-height 300
segmentation_tf
阶段
segmentation_tf使用Google MobileNet v1模型。模型文件可以从https://tfhub . dev/tensor flow/lite-model/deeplabv3/1/metadata/2下载?lite-format=tflite,而标签文件可以在assets文件夹中找到,名为segmentation_labels.txt。
此舞台在大小为 257x257 的图像上运行。由于 YUV420 图像必须具有均匀的尺寸,因此低分辨率图像的宽度和高度都应至少为 258 像素。舞台将 257x257 值的矢量添加到图像元数据中,其中每个值指示像素属于哪个类别(在标签文件中列出)。或者,可以将分割的表示绘制到图像的右下角。
此阶段具有以下可配置参数。
refresh_rate |
重新运行模型之前必须经过的帧数 |
model_file |
tflite 模型文件的路径名 |
labels_file |
包含标签列表的文件的路径名 |
threshold |
设置详细时,舞台会将具有该标签的像素数(在 257x257 图像中)超过此阈值的任何标签打印到控制台。 |
draw |
设置此值以将分割图绘制到图像的右下角。 |
verbose |
将更多信息输出到控制台 |
示例文件segmentation_tf.json:
{ "segmentation_tf": { "number_of_threads" : 2, "refresh_rate" : 10, "model_file" : "/home/pi/models/lite-model_deeplabv3_1_metadata_2.tflite", "labels_file" : "/home/pi/models/segmentation_labels.txt", "draw" : 1, "verbose" : 1 } }
本示例拍摄一个方形相机图像,并将其缩小到 258x258 像素的大小。事实上,当非方形图像被不均匀地挤压到 258x258 像素而不裁剪时,舞台也运行良好。下图显示了右下角的分割图。
libcamera-hello --post-process-file segmentation_tf.json --lores-width 258 --lores-height 258 --viewfinder-width 1024 --viewfinder-height 1024
编写自己的后处理阶段
libcamera-apps后处理框架不仅非常灵活,而且旨在使用户能够轻松创建自己的自定义后处理阶段。很容易包含OpenCV和TensorFlow Lite中已经可用的算法和例程。
我们热衷于接受和分发用户贡献的有趣的后处理阶段。
基本后处理阶段
后处理阶段有一个简单的API,用户可以通过从PostProcessingStage类派生来创建自己的API。下面列出了必须实现的成员函数,但请注意,对于简单阶段,某些函数可能是不必要的。
|
返回阶段的名称。这用于与 JSON 后处理配置文件中列出的阶段进行匹配。 |
|
此方法将从 JSON 文件中读取阶段的任何配置参数。 |
|
此方法使阶段有机会影响摄像机的配置,尽管通常不需要实现它。 |
|
这在配置摄像机后立即调用。这是检查阶段是否有权访问所需的流的好时机,并且还可以分配可能需要的任何资源。 |
|
相机启动时调用。此方法通常不是必需的。 |
|
此方法呈现已完成的相机请求以进行后期处理,并且需要进行必要的像素处理或图像分析。如果后处理框架不将此请求传递到应用程序,则该函数返回true。 |
|
在相机停止时调用。通常,阶段需要关闭可能正在运行的任何处理(例如,如果它启动了任何异步线程)。. |
|
拆除摄像机配置时调用。这通常用于取消分配在Configure方法中设置的任何资源。 |
编写自己的阶段的一些有用提示:
-
通常,该Process方法不应花费太长时间,因为它会阻塞成像管道并可能导致卡顿。当需要运行耗时的算法时,将它们委托给另一个异步线程可能会有所帮助。
-
将工作委派给另一个线程时,当前处理图像缓冲区的方式意味着需要复制它们。对于某些应用(如图像分析),使用“低分辨率”图像流而不是全分辨率图像可能是可行的。
-
后处理框架基于每帧添加多线程并行性。如果要在每一帧上运行,这有助于提高吞吐量。某些函数可能会在每个帧内提供并行性(例如 OpenCV 和 TFLite)。在这些情况下,最好序列化调用以抑制每帧并行性。
-
大多数流,尤其是低分辨率流,都具有 YUV420 格式。这些格式有时不适合OpenCV或TFLite,因此有时可能需要一个转换步骤。
-
当需要更改图像时,就地更改是最简单的策略。
-
任何阶段的实现都应始终包含RegisterStage调用。这将向系统注册您的新stage,以便在JSON文件中列出时可以正确地识别它。当然,您还需要将它添加到后处理文件夹的CMakeLists.txt中。
最简单的示例是 negate_stage.cpp,它“否定”图像(将黑白,反之亦然)。除了少量派生类样板文件外,它只包含六行代码。
接下来的复杂性是sobel_cv_stage.cpp 。这只使用几行OpenCV函数实现了Sobel过滤器。
TFLite 阶段
对于想要使用TensorFlowLite分析图像的阶段,我们提供TfStage基类。这提供了一定数量的样板代码,并且通过从此类派生来实现基于 TFLite 的新阶段变得更加容易。特别是,它将模型的执行委托给另一个线程,以便仍然保持完整的相机帧速率 - 它只是模型将以较低的帧速率运行。
TfStage类实现所有通常必须重新定义的公共PostProcessingStage方法,但Name方法除外,它仍然必须提供。然后它给出了下面的虚方法,派生类应该实现这些虚方法。
|
The base class reads the named model and certain other parameters like the |
|
The base class fetches the low resolution stream which TFLite will operate on, and the full resolution stream in case the derived stage needs it. This method is provided for the derived class to check that the streams it requires are present. In case any required stream is missing, it may elect simply to avoid processing any images, or it may signal a fatal error. |
|
The TFLite model runs asynchronously so that it can run "every few frames" without holding up the overall framerate. This method gives the derived stage the chance to read and interpret the model’s outputs, running right after the model itself and in that same thread. |
|
Here we are running once again in the main thread and so this method should run reasonably quickly so as not to hold up the supply of frames to the application. It is provided so that the last results of the model (which might be a few frames ago) can be applied to the current frame. Typically this would involve attaching metadata to the image, or perhaps drawing something onto the main image. |
For further information, readers are referred to the supplied example code implementing the ObjectClassifyTfStage
and PoseEstimationTfStage
classes.
多个相机使用
libcamera-apps中提供了对多个摄像机的基本支持。可以通过以下方式将多个相机连接到Raspberry Pi:
-
两个摄像头直接连接到Raspberry Pi计算模块板,有关更多详细信息,请参阅计算模块 文档。
-
使用视频多路复用板将两个或多个摄像机连接到非计算 Raspberry Pi 板,就像这个https://www.arducam.com/product/multi-camera-v2-1-adapter-raspberry-pi/[第三方产品]一样。
在后一种情况下,一次只能使用一个摄像头,因为两个摄像头都连接到一个Unicam端口。对于前者,两个相机可以同时运行。
要列出您的平台上所有可用的摄像机,请使用-list-camera命令行选项。要选择要使用的摄像机,请使用- camera <index >选项,并提供所请求摄像机的索引值。
Note
|
libcamera尚不提供立体相机支持。同时运行两台摄像机时,必须在单独的进程中运行它们。这意味着无法在它们之间同步传感器成帧或 3A 操作。作为一种解决方法,您可以通过 HQ (IMX477) 摄像机的外部同步信号同步摄像机,并在必要时将 3A 切换到手动模式。 |
libcamera和libcamera-apps包
为方便起见,提供了许多apt包。为了访问它们,我们建议您以 通常的方式使您的操作系统保持最新状态。
二进制包
有两个libcamera-apps包可用,其中包含必要的可执行文件:
-
libcamera-apps包含支持使用 X Windows 预览的完整应用程序。此软件包预装在Raspberry Pi OS的Bullseye版本中。
-
libcamera-apps-lite省略 X Windows 支持,只有 DRM 预览可用。此软件包预安装在Raspberry Pi OS Lite的Bullseye版本中。
对于Bullseye用户,官方Raspberry Pi相机应该会自动检测。其他用户将需要编辑他们的 /boot/config.txt 文件,如果他们以前没有这样做过。
依赖
这些应用程序依赖于许多名为 library-name<n 的库包>其中 <n> 是一个版本号(实际上是 ABI,或应用程序二进制接口,版本),在撰写本文时为零。因此,我们有以下内容:
-
libcamera0包包含libcamera库
-
libepoxy0包包含libepoxy库
这些将在需要时自动安装。
开发包
libcamera-apps可以自行重建,无需从头开始安装和构建libcamera和libepoxy。要实现这一点,应该安装以下软件包:
-
libcamera-dev包含必要的libcamera头文件和资源。
-
libepoxy-dev包含必要的libepoxy头文件和资源。只有当你想支持X11/GLES预览窗口时,你才需要它。
随后libcamera-apps可以从 GitHub 签出并重建。
编译`libcamera`和`libcamera-apps`
为自己构建`libcamera`和`libcamera-apps`可以带来以下好处。
-
您可以选择最新的增强功能和功能。
-
libcamera-apps可以针对运行32位操作系统的Raspberry Pi 3和Raspberry Pi 4设备进行额外优化。
-
您可以包括各种可选的 OpenCV 和/或 TFLite 后处理阶段(或添加您自己的)。
-
您可以自定义或添加您自己的应用程序从libcamera-apps派生。
Note
|
当在内存为1GB或更少的Raspberry Pi上构建时,存在设备可能耗尽交换空间并失败的风险。我们建议要么增加交换空间,要么用更少的线程构建(ninja和make的-j选项)。 |
不需要重新编译 libcamera`即可编译 `libcamera-apps
You can rebuild libcamera-apps
without first rebuilding the whole of libcamera
and libepoxy
. If you do not need support for the X11/GLES preview window then libepoxy
can be omitted entirely. Mostly this will include Raspberry Pi OS Lite users, and they must be sure to use -DENABLE_X11=0
when running cmake
later. These users should run:
您可以重新构建libcamera-apps,而无需首先重新构建整个libcamera和libepoxy。如果你不需要X11/GLES预览窗口的支持,那么libepoxy可以完全省略。这主要包括Raspberry Pi OS Lite用户,并且他们在以后运行cmake时必须确保使用-DENABLE_X11=0。这些用户应该运行:
sudo apt install -y libcamera-dev libjpeg-dev libtiff5-dev
所有其他用户应执行:
sudo apt install -y libcamera-dev libepoxy-dev libjpeg-dev libtiff5-dev
如果您想使用Qt预览窗口,请同时执行
sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5
如果要在libcamera-vid 中支持 libav,则必须安装其他库:
sudo apt install libavcodec-dev libavdevice-dev libavformat-dev libswresample-dev
现在直接进入构建 libcamera-app 的说明。Raspberry Pi OS Lite 用户应首先检查 git 是否已安装(sudo apt install -y git)。
构建libcamera
Rebuilding libcamera
from scratch should be necessary only if you need the latest features that may not yet have reached the apt
repositories, or if you need to customise its behaviour in some way.
只有当您获取不到“apt”库的最新功能,或者您需要以某种方式定制其行为时,才需要从头开始重建“libcamera”。
首先安装libcamera 的所有必需依赖项。
Note
|
Raspberry Pi OS Lite用户首先需要安装以下附加软件包,如果他们以前没有这样做过: |
sudo apt install -y python3-pip git sudo pip3 install jinja2
然后,所有用户都应安装以下内容:
sudo apt install -y libboost-dev sudo apt install -y libgnutls28-dev openssl libtiff5-dev sudo apt install -y qtbase5-dev libqt5core5a libqt5gui5 libqt5widgets5 sudo apt install -y meson sudo apt install -y cmake sudo pip3 install pyyaml ply sudo pip3 install --upgrade meson
In the meson
commands below we have enabled the gstreamer plugin. If you do not need this you can set -Dgstreamer=disabled
instead and the next pair of dependencies will not be required. But if you do leave gstreamer enabled, then you will need the following:
在下面的meson命令中,我们启用了gstreamer插件。如果不需要,可以改为设置-Dgstreamer=disabled,这样就不需要下一对依赖项了。但是如果您让gstreamer保持启用状态,那么您将需要以下内容:
sudo apt install -y libglib2.0-dev libgstreamer-plugins-base1.0-dev
现在我们可以检查并构建libcamera自己。我们查看了Raspberry Pi的libcamera分支,它跟踪官方存储库,但让我们可以准确控制何时选择新功能。
cd git clone https://github.com/raspberrypi/libcamera.git cd libcamera
接下来,我们建议Raspberry Pi OS Lite用户运行
meson build --buildtype=release -Dpipelines=raspberrypi -Dipas=raspberrypi -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=disabled -Ddocumentation=disabled -Dpycamera=enabled
Raspberry Pi OS的用户可以改用
meson build --buildtype=release -Dpipelines=raspberrypi -Dipas=raspberrypi -Dv4l2=true -Dgstreamer=enabled -Dtest=false -Dlc-compliance=disabled -Dcam=disabled -Dqcam=enabled -Ddocumentation=disabled -Dpycamera=enabled
Note
|
截至2023年5月6日,上游libcamera git树(https://git.libcamera.org/)中已经进行了目录重组。如果用户正在从这个树构建libcamera,请在上面的命令中将-Dpipelines = raspberrypi-Dipas = raspberrypi替换为-Dpipelines = rpi/vc4-Dipas = rpi/vc4。这个目录重组还没有进入Raspberry Pi lib camera repo(https://github . com/raspberrypi/lib camera . git),因此如果使用该repo,应该不加修改地使用上面的命令。 |
唯一的区别是后者还构建了qcam测试应用程序,它依赖于Qt和X Windows(在完成libcamera构建之后,用户可以运行build/src/qcam/qcam来验证libcamera是否正常工作)。
要完成libcamera构建,请运行
ninja -C build # use -j 2 on Raspberry Pi 3 or earlier devices sudo ninja -C build install
Note
|
在撰写本文时,libcamera还没有稳定的二进制接口。因此,如果你已经构建了libcamera,我们建议你也从头开始继续构建libcamera-apps。 |
构建libepoxy
libepoxy通常不需要重新构建,因为此库很少更改。但是,如果您确实想从头开始构建它,请按照以下说明进行操作。
首先安装必要的依赖项。
sudo apt install -y libegl1-mesa-dev
接下来,签出并构建libepoxy.
cd git clone https://github.com/anholt/libepoxy.git cd libepoxy mkdir _build cd _build meson ninja sudo ninja install
构建libcamera-apps
首先获取libcamera-apps 的必要依赖项。
sudo apt install -y cmake libboost-program-options-dev libdrm-dev libexif-dev
libcamera-apps生成过程从以下内容开始:
cd git clone https://github.com/raspberrypi/libcamera-apps.git cd libcamera-apps mkdir build cd build
此时,在决定传递什么额外的标志之后,您需要运行cmake。有效标志包括:
-
-DENABLE_COMPILE_FLAGS_FOR_TARGET=armv8-neon
- 在为运行32位操作系统的Raspberry Pi 3或Raspberry Pi 4设备构建时,您可以提供这个。某些后处理功能可能会运行得更快。 -
-DENABLE_DRM=1
or-DENABLE_DRM=0
- 启用或禁用DRM/KMS预览渲染。这就是当X Windows没有运行时实现预览窗口的原因。 -
-DENABLE_X11=1
or-DENABLE_X11=0
- 这将启用或禁用基于 X Windows 的预览。如果您的系统没有安装 X Windows,则应禁用此功能。 -
-DENABLE_QT=1
or-DENABLE_QT=0
- 这将启用或禁用对基于Qt的预览窗口实现的支持。如果您没有安装X Windows,或者您不打算使用基于Qt的预览窗口,那么您应该禁用它。基于Qt的预览通常是不推荐的,因为它在计算上是非常昂贵的,但是它确实与X显示转发一起工作。 -
-DENABLE_OPENCV=1
or-DENABLE_OPENCV=0
- 您可以选择其中之一来强制链接(或不链接)基于 OpenCV 的后处理阶段。如果启用它们,则必须在您的系统上安装 OpenCV。通常,如果OpenCV可用,它们将默认构建。 -
-DENABLE_TFLITE=1
or-DENABLE_TFLITE=0
- 选择其中之一以启用 TensorFlow Lite 后处理阶段(或不启用)。默认情况下,它们不会被启用。如果您启用它们,那么 TensorFlow Lite 必须在您的系统上可用。根据您构建和/或安装 TFLite 的方式,您可能需要调整post_processing_stages目录中的CMakeLists.txt文件。
对于Raspberry Pi操作系统用户,我们建议使用以下cmake命令:
cmake .. -DENABLE_DRM=1 -DENABLE_X11=1 -DENABLE_QT=1 -DENABLE_OPENCV=0 -DENABLE_TFLITE=0
对于Raspberry Pi OS Lite用户:
cmake .. -DENABLE_DRM=1 -DENABLE_X11=0 -DENABLE_QT=0 -DENABLE_OPENCV=0 -DENABLE_TFLITE=0
在这两种情况下,如果您在Raspberry Pi 3或Raspberry Pi 4上使用32位操作系统,请考虑-den able _ COMPILE _ FLAGS _ FOR _ TARGET = arm V8-neon。如果您已经安装了OpenCV并希望使用基于OPENCV的后处理阶段,请考虑-DENABLE_OPENCV=1。最后,如果您已经安装了TensorFlow Lite并希望在后处理阶段使用它,请考虑-DENABLE_TFLITE=1。
执行您选择的cmake命令后,整个过程以以下内容结束:
make -j4 # use -j1 on Raspberry Pi 3 or earlier devices sudo make install sudo ldconfig # this is only necessary on the first build
Note
|
如果您使用的是libcamera-apps已经作为apt包安装的映像,并且您希望从刚刚构建和安装它们的同一个终端窗口运行新的libcamera-apps可执行文件,您可能需要运行hash -r以确保在系统提供的文件上选择新的文件。 |
最后,如果您尚未这样做,请务必按照dtoverlay“入门”部分中的驱动程序说明进行操作(如果您在那里更改了任何内容,请重新启动)
了解和编写您自己的应用程序
libcamera-apps不应该是具有任何人可能需要的所有功能的全套所有应用程序。相反,它们应该易于理解,以便需要稍微不同行为的用户可以自己实现它。 所有应用程序都通过一个简单的事件循环来工作,该事件循环从相机系统接收带有一组新帧的消息。这组帧称为CompletedRequest .它包含从该单个相机帧派生的所有图像(因此除了全尺寸输出之外,可能是低分辨率图像),以及来自相机系统的元数据和来自后期处理系统的进一步元数据。
libcamera-hello
libcamera-hello是最容易理解的应用程序。它对相机图像做的唯一事情是从消息中提取CompletedRequestPtr(指向CompletedRequest的共享指针):
CompletedRequestPtr &completed_request = std::get<CompletedRequestPtr>(msg.payload);
并将其转发到预览窗口:
app.ShowPreview(completed_request, app.ViewfinderStream());
需要注意的一件重要事情是,每个完成的请求都必须被回收到摄像机系统,以便可以重用缓冲区,否则它将耗尽用于接收新摄像机帧的缓冲区。使用C++的共享指针和自定义删除机制,当所有对CompletedRequest的引用都被删除时,这个回收过程会自动发生。 因此,在libcamera-hello中,要将完整的请求返回到相机,必须发生两件事。
-
事件循环必须再次循环,以便删除包含对共享指针的引用的消息(msg在代码中)。
-
当调用ShowPreview时,预览线程接受对CompletedRequest的另一个引用,必须用新的CompletedRequest再次调用该线程,从而导致前一个线程被丢弃。
libcamera-vid
libcamera-vid与 libcamera-hello不同,但它向事件循环和预览中添加了编解码器。在事件循环开始之前,我们必须为该编码器配置一个回调,该回调说明包含编码图像数据的缓冲区会发生什么。
app.SetEncodeOutputReadyCallback(std::bind(&Output::OutputReady, output.get(), _1, _2, _3, _4));
在这里,我们将缓冲区发送到Output对象,该对象可以根据我们启动应用程序时的选择将其写入文件或通过网络发送。 编码器还获取对CompletedRequest的新引用,因此一旦事件循环、预览窗口和编码器都丢弃了它们的引用,CompletedRequest将自动回收到摄像机系统。
Python 绑定libcamera
Picamera2库 是基于libcamera的Picamera替代品,Picamera是Raspberry Pi传统相机堆栈的Python接口。Picamera2提供了一个易于使用的Python API。
有关 Picamera2 的文档可在 on Github 和 Picamera2 手册中找到。
安装
Picamera2仅在Raspberry Pi OS Bullseye(或更高版本)图像(32位和64位)上受支持。
Note
|
截至2022年9月,Picamera2预装在从Raspberry Pi下载的图片上。它可以在所有的Raspberry Pi板上运行,甚至可以运行到Pi 0,尽管在一些功能较弱的设备上,某些方面的性能可能会更差。 |
Picamera2 在以下设备上不受支持:
-
基于 Buster 或早期版本的映像。
-
Raspberry Pi操作系统旧版映像。
-
Bullseye(或更高版本)图像,其中旧相机堆栈已重新启用。
在Raspberry Pi OS映像上,Picamera2现在安装了所有GUI(Qt和OpenGL)依赖项。在Raspberry Pi OS Lite上,它是在没有GUI依赖项的情况下安装的,尽管预览图像仍然可以使用DRM / KMS显示。如果这些用户希望使用其他 X-Windows GUI 功能,他们将需要运行
sudo apt install -y python3-pyqt5 python3-opengl
Note
|
不需要对 Picamera2 本身进行任何更改。 |
如果您的映像未预装 Picamera2 apt,则推荐安装和更新 Picamera2。
$ sudo apt update sudo apt upgrade
此后,您可以使用以下方法安装Picamera2以及所有GUI(Qt和OpenGL)依赖项。
$ sudo apt install -y python3-picamera2
如果您不需要 GUI 依赖项,请使用
$ sudo apt install -y python3-picamera2 --no-install-recommends
Note
|
如果您之前已经使用pip安装了Picamera2,那么您也应该使用命令pip3 uninstall picamera2卸载它。 |
Note
|
如果已经安装了Picamera2,可以用sudo apt install-y python 3-picamera 2进行更新,或者作为完整系统更新的一部分(例如sudo apt升级)。 |
相机调整和支持第三方传感器
相机调整文件
应用于传感器帧的大部分图像处理都是由硬件ISP(图像信号处理器)完成的。这种处理由一组控制算法控制,这些算法又必须提供广泛的参数。这些参数专门针对每个传感器进行调优,并一起收集在称为相机调整文件的 JSON 文件中。
用户可以检查和编辑此调整文件。使用命令行选项`--tuning-file`,用户可以将系统指向完全自定义的相机调整文件。
[[3rd-party-sensors]] ==== 第三方传感器
libcamera可以在Raspberry Pi平台上支持第三方传感器(即Raspberry Pi官方支持的传感器以外的传感器)。为此,必须提供一个有效的开源传感器驱动程序,作者很乐意将其提交给 Linux 内核。`libcamera`需要添加几个额外的文件,其中提供内核驱动程序中可用的特定于设备的信息,包括前面讨论的相机调整文件。
Raspberry Pi 还提供了一个调优工具,可以从几个简单的校准图像自动生成调整文件。
这两个主题都超出了此处文档的范围,但是, Raspberry Pi相机和libcamera的调优指南中提供了完整的信息。
已知问题
我们注意到libcamera 和 libcamera-apps中的以下问题。
-
在Raspberry Pi 3(及更早的设备上),图形硬件只能支持最大2048x2048像素的图像,这限制了可以在预览窗口中调整大小的相机图像。实际上,这意味着大于 2048 像素的图像的视频编码(必须使用 h.264 以外的编解码器)将不支持或将生成损坏的预览图像。对于Raspberry Pi 4,限制为 4096 像素。我们建议暂时使用-n(无预览)选项。
-
预览窗口在使用 X 窗口时显示一些显示撕裂。这不太可能是可修复的。
获取帮助
如需进一步获取 libcamera
and the `libcamera-apps`帮助, 第一个地方通常是 Raspberry Pi 相机论坛. 在发布之前,最好:
-
确保您的软件是最新的。
-
如果您使用的是Buster,请升级到最新的操作系统,因为那里不再支持libcamera-apps。
-
记下您的操作系统版本 (uname -a)。
-
记下您的libcamera 和libcamera-apps 版本 (libcamera-hello --version)。
-
请报告您正在使用的相机模块的品牌和型号。请注意,当第三方摄像头模块供应商提供自己的软件时,我们通常无法提供任何支持,所有查询都应转回供应商。
-
还请提供有关您拥有哪种Raspberry Pi的信息,包括内存大小。
-
如果看起来可能相关,请包含应用程序控制台输出中的任何摘录。
当相机软件中可能存在特定问题(例如崩溃)时,在https://github.com/raspberrypi/libcamera-apps[libcamera-apps Github存储库]中创建问题可能更合适。同样,请尽可能包括所有有用的详细信息。
应用说明
Edit this on GitHub
创建延时摄影视频
要创建延时视频,您只需将 Raspberry Pi 配置为定期拍照,例如每分钟一次,然后使用应用程序将图片拼接成视频。有几种方法可以做到这一点。
使用libcamera-still或raspistill延时摄影模式
libcamera-still和raspistill都有内置的延时模式,使用- timelapse命令行开关。开关后的值是拍摄之间的时间,以毫秒为单位:
libcamera-still -t 30000 --timelapse 2000 -o image%04d.jpg
或
raspistill -t 30000 --timelapse 2000 -o image%04d.jpg
Note
|
输出文件名中的%04d:这表示文件名中您希望帧数出现的位置。例如,上面的命令将每两秒钟(2000毫秒)捕获一次,总时间为30秒(30000毫秒),被命名为image0001.jpg、image0002.jpg等等,一直到image0015.jpg。 %04d表示一个四位数,添加前导零以构成所需的位数。例如,%08d会产生一个八位数。如果不想要前导零,可以省略0。 如果输入的延时值为0,应用程序将尽快拍照。请注意,在两次拍摄之间至少会强制暂停大约30毫秒,以确保可以进行曝光计算。 |
使用cron实现自动化
定期自动拍照的一个好方法是使用cron。打开cron表进行编辑:
crontab -e
这将询问您想要使用哪个编辑器,或者在您的默认编辑器中打开。在编辑器中打开文件后,添加下面一行来安排每分钟拍摄一张照片(参考raspistill页面中的Bash脚本,尽管您可以使用lib camera——仍然以完全相同的方式):
* * * * * /home/pi/camera.sh 2>&1
保存并退出,您应该看到以下消息:
crontab: installing new crontab
确保您使用例如%04d来确保每个图像都被写入一个新文件:如果您不这样做,那么每个新图像都将覆盖前一个文件。
将图像拼接在一起
现在你需要把这些照片拼接成一个视频。你可以用ffmpeg在Raspberry Pi上做这个,但是处理会很慢。您可能更喜欢将图像文件传输到您的台式计算机或笔记本电脑上,并在那里制作视频。
首先,如果尚未安装,则需要安装ffmpeg。
sudo apt install ffmpeg
现在您可以使用该ffmpeg工具将 JPEG 文件转换为 mp4 视频:
ffmpeg -r 10 -f image2 -pattern_type glob -i 'image*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4
在Raspberry Pi 3上,每秒可以编码两帧多一点。其他Raspberry Pi型号的性能会有所不同。使用的参数包括:
-
-r 10在输出视频中将帧速率(Hz 值)设置为每秒 10 帧。
-
-f image2将 ffmpeg 设置为从模式指定的图像文件列表中读取。
-
-pattern_type glob导入图像文件时,使用通配符模式(globbing)来解释-i输入的文件名,在本例中为image*。jpg,其中*是图像编号。
-
-i 'image*.jpg’输入文件规范(以匹配捕获期间生成的文件)。
-
-s 1280x720缩放到 720p。您还可以使用 1920x1080 或更低的分辨率,具体取决于您的要求。
-
-vcodec libx264使用软件 x264 编码器。
-
timelapse.mp4输出视频文件的名称。
ffmpeg具有用于各种编码选项和其他设置的全面参数集。可以使用ffmpeg --help 列出这些内容。
使用Gstreamer
_Gstreamer_是一个用于读取、处理和播放多媒体文件的Linux框架。https://gstreamer.freedesktop.org/[gstreamer网站]上有很多信息和教程。这里我们展示了如何使用libcamera-vid(和类似的raspivid)通过网络传输视频。
在服务器上,我们需要libcamera-vid将编码的h.264比特流输出到stdout,并可以使用gstreamer fdsrc元素接收它。那么额外的gstreamer元素可以通过网络发送这个消息。例如,我们可以通过UDP链路在同一设备上简单地发送和接收流。在服务器上:
libcamera-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! udpsink host=localhost port=5000
对于客户端(在另一个控制台窗口中键入此内容),我们可以使用:
gst-launch-1.0 udpsrc address=localhost port=5000 ! h264parse ! v4l2h264dec ! autovideosink
使用 RTP
要使用 RTP 协议进行流式传输,您可以在服务器上使用:
libcamera-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! h264parse ! rtph264pay ! udpsink host=localhost port=5000
在客户端窗口中
gst-launch-1.0 udpsrc address=localhost port=5000 caps=application/x-rtp ! rtph264depay ! h264parse ! v4l2h264dec ! autovideosink
最后,我们举一个从一台机器流到另一台机器的例子。让我们假设客户端计算机具有 IP地址192.168.0.3 。在服务器(Raspberry Pi)上,管道是相同的,但对于目标地址:
libcamera-vid -t 0 -n --inline -o - | gst-launch-1.0 fdsrc fd=0 ! h264parse ! rtph264pay ! udpsink host=192.168.0.3 port=5000
如果客户端不是Raspberry Pi,它可能有不同的 gstreamer 元素可用。对于 Linux PC,我们可能会使用:
gst-launch-1.0 udpsrc address=192.168.0.3 port=5000 caps=application/x-rtp ! rtph264depay ! h264parse ! avdec_h264 ! autovideosink
`libcamerasrc`元素
libcamera提供了一个libcamerasrc gstreamer元素,可以直接用来代替libcamera-vid。在服务器上,您可以使用:
gst-launch-1.0 libcamerasrc ! capsfilter caps=video/x-raw,width=1280,height=720,format=NV12 ! v4l2convert ! v4l2h264enc extra-controls="controls,repeat_sequence_header=1" ! h264parse ! rtph264pay ! udpsink host=localhost port=5000
在客户端上,我们使用与以前相同的播放管道。
Using libcamera and Qt together
Qt is a popular application framework and GUI toolkit, and indeed libcamera-apps optionally makes use of it to implement a camera preview window.
However, Qt defines certain symbols as macros in the global namespace (such as slot
and emit
) and this causes errors when including libcamera files. The problem is common to all platforms trying to use both Qt and libcamera and not specific to Raspberry Pi. Nonetheless we suggest that developers experiencing difficulties try the following workarounds.
-
libcamera include files, or files that include libcamera files (such as libcamera-apps files), should be listed before any Qt header files where possible.
-
If you do need to mix your Qt application files with libcamera includes, replace
signals:
withQ_SIGNALS:
,slots:
withQ_SLOTS:
,emit
withQ_EMIT
andforeach
withQ_FOREACH
. -
Before any libcamera include files, add
#undef signals #undef slots #undef emit #undef foreach
-
If you are using qmake, add
CONFIG += no_keywords
to the project file. If using cmake, addSET(QT_NO_KEYWORDS ON)
.
We are not aware of any plans for the underlying library problems to be addressed.
V4L2 驱动程序
Edit this on GitHub
V4L2 驱动程序提供用于访问相机和编解码器功能的标准 Linux 接口。它们在系统启动时自动加载,但在某些非标准情况下,您可能需要显式加载相机驱动程序。
使用libcamera或传统堆栈时的驱动程序差异
在使用libcamera的系统上,/dev/video0和/dev/video1是Unicam(Raspberry Pi的CSI-2接收器)的V4L2驱动程序。Raspberry Pi有两个CSI-2接收器,每个接收器由其中一个设备节点管理。
在使用传统堆栈的系统上,/dev/video0是一个V4L2驱动程序,它使用GPU上的专有Broadcom驱动程序来访问完整的摄像机系统。没有/dev/video1。没有Unicam驱动程序,但有一个传统的MMAL Rawcam组件。
其他设备节点始终相同,下表中列出了这些节点。
/dev/videoX | Default Action |
---|---|
video10 |
视频解码 |
video11 |
视频编码 |
video12 |
简单的互联网服务提供商。可以在RGB / YUV格式之间进行转换和调整大小,也可以执行拜耳到RGB / YUV的转换 |
video13 |
输入到完全可编程的ISP。 |
video14 |
来自完全可编程ISP的高分辨率输出。 |
video15 |
完全可编程ISP的低结果输出。 |
video16 |
来自完全可编程的ISP的图像统计数据。 |
video19 |
HEVC 解码 |
使用驱动程序
有关使用此驱动程序的详细信息,请参阅 V4L2 文档 。
相机串行接口 2 (CSI2) “Unicam”
Edit this on GitHub
Raspberry Pi系列上使用的SoC都有两个相机接口,支持CSI-2 D-PHY 1.1或CCP2(紧凑型相机端口2)源。该接口的代号为“Unicam”。Unicam的第一个实例支持2个CSI-2数据通道,而第二个实例支持4个。每条通道可以以高达1Gbit/s(DDR,因此最大链路频率为500MHz)运行。
但是,Raspberry Pi的正常变体仅公开第二个实例,并且仅将2个数据通道路由到相机连接器。计算模块范围从两个外设路由出所有通道。
软件接口
有 3 个独立的软件接口可用于与 Unicam 外设通信:
固件
Note
|
此接口仅在使用旧版相机堆栈时可用。 |
闭源GPU固件具有Unicam驱动程序和三个摄像头传感器以及一个桥接芯片。它们是Raspberry Pi Camera v1.3(Omnivision OV5647),Raspberry Pi Camera v2.1(Sony IMX219),Raspberry Pi HQ相机(Sony IMX477),以及东芝TC358743 HDMI→CSI2桥接芯片不支持的驱动程序。不支持更新的相机,例如相机模块 3(索尼 IMX708)。
此驱动程序将源驱动程序、Unicam、ISP 和调谐器控制集成到一个完整的相机堆栈中,提供经过处理的输出图像。它可以通过MMAL,OpenMAX IL和V4L2使用bcm2835-v4l2内核模块。此接口仅支持Raspberry Pi相机。
MMAL rawcam 组件
Note
|
此接口仅在使用旧版相机堆栈时可用。 |
这是 V4L2 驱动程序可用之前的临时选项。MMAL 组件vc.ril.rawcam允许以与 V2L4 驱动程序相同的方式接收原始 CSI2 数据,但所有源配置都必须由用户空间通过源所需的任何接口完成。raspiraw应用程序可在https://github.com/raspberrypi/raspiraw[github]上使用。它使用此组件和OV2、IMX5647和ADV219M的标准I7282C寄存器集来支持流传输。
V4L2
Note
|
Unicam 的 V4L2 接口仅在使用libcamera 时可用。 |
有一个完全开源的内核驱动程序可用于Unicam块,是叫做 BCM2835-UNICAM 的内核模块。这接口到 V4L2 子设备驱动程序,为源提供原始帧。此 bcm2835-unicam 驱动程序控制传感器,并配置 CSI-2 接收器,以便外设将原始帧(在 Debayer 之后)写入 SDRAM,使 V4L2 交付给应用程序。除了能够将CSI-2拜耳格式解压缩为16位/像素之外,图像源(例如相机传感器)和将图像数据放置在SDRAM中的bcm2835-unicam之间没有图像处理。
|------------------------| | bcm2835-unicam | |------------------------| ^ | | |-------------| img | | Subdevice | | |-------------| v -SW/HW- | |---------| |-----------| | Unicam | | I2C or SPI| |---------| |-----------| csi2/ ^ | ccp2 | | |-----------------| | sensor | |-----------------|
Mainline Linux有一系列现有的驱动程序。Raspberry Pi内核树有一些额外的驱动程序和设备树覆盖来配置它们,这些驱动程序和设备树覆盖都已经过测试并确认可以工作。它们包括:
设备 | 类型 | 备注 |
---|---|---|
Omnivision OV5647 |
5MP Camera |
Original Raspberry Pi Camera |
Sony IMX219 |
8MP Camera |
Revision 2 Raspberry Pi camera |
Sony IMX477 |
12MP Camera |
Raspberry Pi HQ camera |
Sony IMX708 |
12MP Camera |
Raspberry Pi Camera Module 3 |
Toshiba TC358743 |
HDMI to CSI-2 bridge |
|
Analog Devices ADV728x-M |
Analog video to CSI-2 bridge |
No interlaced support |
Infineon IRS1125 |
Time-of-flight depth sensor |
Supported by a third party |
由于子设备驱动程序也是内核驱动程序,因此具有标准化的API,因此第三方可以自由地为他们选择的任何来源编写自己的驱动程序。
开发第三方驱动程序
这是推荐的通过Unicam接口的方法。
为打算与 bcm2835-unicam 模块一起使用的新设备开发驱动程序时,需要驱动程序和相应的设备树覆盖。理想情况下,驱动程序应提交到 linux 媒体 邮件列表进行代码审查并合并到主线中,然后移动到 Raspberry Pi 内核树 ,但可能会有的例外情况是驱动程序被审查并直接合并到 Raspberry Pi 内核。
请注意,所有内核驱动程序都是在GPLv2许可下授权的,因此源代码*必须*是可用的。只运输二进制模块违反了GPLv2许可证,Linux内核就是在GPL v2许可证下获得许可的。
bcm2835-unicam 旨在尝试适应当前在主线 Linux 内核中找到的所有类型的 CSI-2 源驱动程序。从广义上讲,这些可以分为相机传感器和桥接芯片。桥接芯片允许在其他格式和 CSI-2 之间进行转换。
相机传感器
相机传感器的驱动程序负责设备的所有配置,通常通过 I2C 或 SPI。通常,将现有驱动程序作为基础并根据需要对其进行修改通常更容易,而不是从头开始编写驱动程序。
IMX219 驱动程序是一个很好的起点。此驱动程序支持 8 位和 10 位Bayer读出,因此枚举帧格式和帧大小稍微复杂一些。
传感器通常支持 V4L2 用户控件。并非所有这些控件都需要在驱动程序中实现。IMX219 驱动程序仅实现下面列出的一小部分,其实现由imx219_set_ctrl函数处理。
-
V4L2_CID_PIXEL_RATE
/V4L2_CID_VBLANK
/V4L2_CID_HBLANK
: 允许应用程序设置帧速率。 -
V4L2_CID_EXPOSURE
: 以线条为单位设置曝光时间。应用程序需要使用V4L2_CID_PIXEL_RATE
,V4L2_CID_HBLANK
, 和帧宽度来计算行时间。 -
V4L2_CID_ANALOGUE_GAIN
: 以传感器特定单位表示的模拟增益。 -
V4L2_CID_DIGITAL_GAIN
: 传感器特定单元中的可选数字增益。 -
V4L2_CID_HFLIP / V4L2_CID_VFLIP
: 水平或垂直翻转图像。请注意,此操作可能会更改帧中数据的Bayer顺序,就像 imx219 上的情况一样。 -
V4L2_CID_TEST_PATTERN
/V4L2_CID_TEST_PATTERN_*
:支持从传感器输出各种测试模式。这对调试很有用。 如果是 IMX219,其中许多控件直接映射到传感器本身的寄存器写入。
可以在 libcamera 的https://git.linuxtv.org/libcamera.git/tree/Documentation/sensor_driver_requirements.rst[传感器驱动程序要求]以及 Raspberry Pi 相机调整指南的第 3 章中找到进一步的指导。
桥接芯片
这些设备将传入的视频流(例如HDMI或复合)转换为Raspberry Pi CSI-2接收器可以接受的CSI-2流。
处理桥接芯片更为复杂,因为与相机传感器不同,它们必须响应输入信号并将其报告给应用程序。
处理桥接芯片的机制可以大致分为模拟或数字。
在下面的部分中使用`ioctl`时,`ioctl`名称中的`S`表示它是一个set函数,而`G`是一个get函数,并且`_ENUM`枚举一组允许的值。
模拟视频源
模拟视频源使用标准`ioctls`来检测和设置视频标准。 VIDIOC_G_STD
, VIDIOC_S_STD
, VIDIOC_ENUMSTD
, and VIDIOC_QUERYSTD
选择错误的标准通常会导致图像损坏。设定标准通常也会设定V4L2捕获队列的分辨率。它不能通过FMT视频设置。一般来说,通过`VIDIOC_QUERYSTD`请求检测到的标准,然后在流式传输之前用`VIDIOC_S_STD`设置它是一个好主意。
数字视频源
对于HDMI等数字视频源,有一组备用调用允许指定所有数字时序参数 (VIDIOC_G_DV_TIMINGS
, VIDIOC_S_DV_TIMINGS
, VIDIOC_ENUM_DV_TIMINGS
, and VIDIOC_QUERY_DV_TIMINGS
).。
与模拟网桥一样,计时通常会固定V4L2捕获队列的分辨率,在流式传输之前调用`VIDIOC_S_DV_TIMINGS`和`VIDIOC_QUERY_DV_TIMINGS`的结果应确保格式正确。
根据桥接芯片和驱动器的不同,输入源的变化可能会通过`VIDIOC_SUBSCRIBE_EVENT`和`V4L2_EVENT_SOURCE_CHANGE`报告给应用。
当前支持的设备
Raspberry Pi Linux内核目前支持2个桥接芯片,ADI公司ADV728x-M用于模拟视频源,东芝TC358743用于HDMI源。
模拟设备 ADV728x(A)-M 模拟视频转 CSI2 桥接器
这些芯片将复合、S视频(Y/C)或分量(YPrPb)视频转换为单通道CSI-2接口,https://github.com/raspberrypi/linux/blob/rpi-5.4.y/drivers/media/i2c/adv7180.c[ADV7180内核驱动程序]支持这些芯片。
有关该芯片各种版本的产品详细信息,请访问模拟设备网页。
由于当前内核V4L2实现中的一些缺失代码,选择源失败,因此Raspberry Pi内核版本向ADV7180内核驱动程序添加了一个名为dbg_input的内核模块参数,该驱动程序在每次调用`VIDIOC_S_STD`时设置输入源。在某个时候,主流将修复底层问题(内核API调用s_routing和用户空间调用`VIDIOC_S_INPUT`之间的分离),并且这个修改将被移除。
请注意,不支持接收隔行扫描视频,因此ADV7281(A)-M版本的芯片用途有限,因为它没有必要的I2P去隔行扫描模块。还要确保在选择设备时指定 -M 选项。没有它,您将获得一个无法与Raspberry Pi接口的并行输出总线。
目前尚无使用这些芯片的商用电路板,但该驱动器已通过模拟设备的https://www.analog.com/en/design-center/evaluation-hardware-and-software/evaluation-boards-kits/EVAL-ADV7282A-M.html[EVAL-ADV7282-M评估板]进行了测试
如果您使用ADV7282-M芯片变体,可以使用config.txt dtoverlay adv7282m加载该驱动程序;或者adv728x-m,参数为adv7280m=1、adv7281m=1或adv7281ma=1(如果使用不同型号)。例如
dtoverlay=adv728x-m,adv7280m=1
东芝 TC358743 HDMI to CSI2 桥接器
这是一个HDMI到CSI-2桥接芯片,能够以高达1080p60的速度转换视频数据。
有关此桥接芯片的信息可在https://toshiba.semicon-storage.com/ap-en/semiconductor/product/interface-bridge-ics-for-mobile-peripheral-devices/hdmir-interface-bridge-ics/detail.TC358743XBG.html[东芝网站]上找到
TC358743 将 HDMI 连接到 CSI-2 和 I2S 输出。https://github.com/raspberrypi/linux/blob/rpi-5.4.y/drivers/media/i2c/tc358743.c[TC358743内核模块]支持此功能。
该芯片支持RGB888、YUV444或YUV422等输入HDMI信号,最高可达1080p60。它可以转发RGB888,或将其转换为YUV444或YUV422,并在YUV444和YUV422之间进行任一方式转换。仅测试了RGB888和YUV422支持。使用 2 个 CSI-2 通道时,可以支持的最大速率为 RGB1080 的 30p888 或 YUV1080 的 50p422。在计算模块上使用 4 个通道时,可以以任一格式接收 1080p60。
HDMI通过接收设备通告它可以支持的所有模式的https://en.wikipedia.org/wiki/Extended_Display_Identification_Data[EDID]来协商分辨率。内核驱动程序不知道您希望接收的分辨率、帧速率或格式,因此需要由用户提供合适的文件。这是通过VIDIOC_S_EDID ioctl完成的,或者更容易地使用`v4l 2-CTL- fix-edid-checksums-set-edid =file=filename.txt`(添加-fix-edid-checksums选项意味着您不必在源文件中获得正确的校验和值)。生成所需的EDID文件(二进制EDID文件的文本六进制转储)并不太麻烦,也有工具可以生成它们,但这超出了本文的范围。
如上所述,使用`DV_TIMINGS` ioctls来配置驱动程序,以匹配传入的视频。最简单的方法是使用命令`v4l 2-CTL-set-dv-Bt-timings query`。如果您希望编写一个应用程序来处理不断变化的源,该驱动程序确实支持生成SOURCE_CHANGED事件。通过VIDIOC_S_FMT设置可以改变输出像素格式,但是只有像素格式字段会被更新,因为分辨率是由dv时序配置的。
有几个商用板将此芯片连接到Raspberry Pi。Auvidea B101 和 B102 是最广泛获得的,但也提供其他同等的电路板
使用`config.txt` dtoverlay `tc358743`加载此驱动程序。
该芯片还支持通过I2S捕获立体声HDMI音频。Auvidea 板将相关信号分解到一个接头上,该接头可以连接到 Raspberry Pi 的 40 针接头。所需的接线是:
信号 | B101 接头 | 40-pin 接头 | BCM GPIO |
---|---|---|---|
LRCK/WFS |
7 |
35 |
19 |
BCK/SCK |
6 |
12 |
18 |
DATA/SD |
5 |
38 |
20 |
GND |
8 |
39 |
N/A |
除了`tc358743`覆盖外,还需要`TC 358743-音频`覆盖。这将为HDMI音频创建一个ALSA录音设备。请注意,没有音频重采样。音频的存在反映在V4L2控制TC 358743 _ CID _ AUDIO _ PRESENT/“AUDIO-PRESENT”中,输入音频的采样速率反映在V4L2控制TC 358743 _ CID _ AUDIO _ SAMPLING _ RATE/“AUDIO SAMPLING-frequency”中。在没有音频的情况下进行记录会产生警告,以不同于报告的采样率进行记录也会产生警告。
6Raspicam应用
Edit this on GitHub
Warning
|
Raspberry Pi已经从基于专有Broadcom GPU代码的传统相机软件堆栈过渡到基于libcamera的开源堆栈。因此,Raspicam堆栈现在已被弃用。从牛眼开始的Raspberry Pi操作系统映像只包含基于libcamera的堆栈。Buster之前(包括Buster)的Raspberry Pi操作系统映像仍然使用传统的Raspicam堆栈。 |
IMPORTANT: 不受传统相机堆栈不支持Raspberry Pi 相机模块 3 。
我们鼓励用户使用最新的操作系统映像和基于libcamera的堆栈,因为:
-
它将继续向前发展。
-
Raspberry Pi和第三方可以修复相机堆栈中的错误和问题。
-
Raspberry Pi和第三方可以向相机堆栈添加新功能。
-
添加对新相机的支持要容易得多。
-
第三方可以直接为自己的相机添加支持。
-
用户几乎可以更改相机调整的所有方面。
-
它与其他标准 Linux API 集成得更方便。
-
Raspberry Pi提供了一组libcamera-apps模拟传统应用程序的大部分功能。
-
它证明了一个功能丰富的后处理框架,集成了OpenCV和TensorFlow Lite。
-
Libcamera可以更轻松地控制图像传感器和相机系统的参数。
-
它在 64 位操作系统上完全受支持
考虑继续使用较旧的操作系统并使用旧版 Raspicam 堆栈的原因可能包括:
-
它可能在Raspberry Pi 2和Raspberry Pi Zero设备上表现更好,因为它将更多卸载到GPU并且对ARM内核的依赖性较小。
重新启用旧堆栈
Important
|
旧版相机堆栈在 64 位版本的 Raspberry Pi OS 中不可用,无法在 64 位操作系统上重新启用。 |
可以使用以下步骤在 Bullseye 中重新启用旧相机堆栈。
-
确保您的系统是最新的,然后重新启动它。
-
运行sudo raspi-config
-
导航到Interface Options并选择Legacy camera以启用它。
-
再次重新启动Raspberry Pi。
以下视频显示了这些步骤。
Note
|
更多信息可以在讨论过渡的 博客文章中找到。 |
Raspicam命令
raspistill、raspivid和raspiyuv是使用相机模块的命令行工具。
raspistill
raspistill是用于使用 Raspberry Pi 相机模块捕获静态照片的命令行工具。
raspistill的基本用法
连接并启用相机模块后,在终端中输入以下命令以拍照:
raspistill -o cam.jpg
在此示例中,相机已倒置放置。如果将相机放置在此位置,则必须翻转图像才能正确向上显示。
垂直翻转和水平翻转
将相机倒置放置时,图像必须旋转 180° 才能正确显示。纠正此问题的方法是通过传入-vf 和-hf 标志来应用垂直和水平翻转:
raspistill -vf -hf -o cam2.jpg
现在照片已正确捕获。
raspivid
raspivid是用于使用 Raspberry Pi 相机模块捕获视频的命令行工具。
raspivid的基本用法
连接并启用摄像头模块后,使用以下命令录制视频:
raspivid -o vid.h264
如果需要,记得使用-hf和-vf来翻转图像,就像使用raspistill一样
这将把一个5秒钟的视频文件保存到此处给定的路径vid.h264(默认时间长度)。
MP4 视频格式
Raspberry Pi将视频捕获为原始 H264 视频流。许多媒体播放器会拒绝播放它,或者以不正确的速度播放它,除非它被“包装”在合适的容器格式中,如 MP4。从 raspivid 命令获取 MP4 文件的最简单方法是使用 MP4Box。
使用以下命令安装 MP4Box:
sudo apt install -y gpac
使用raspivid捕获原始视频并将其包装在MP4容器中,如下所示:
# Capture 30 seconds of raw video at 640x480 and 150kBps bit rate into a pivideo.h264 file:
raspivid -t 30000 -w 640 -h 480 -fps 25 -b 1200000 -p 0,0,640,480 -o pivideo.h264
# Wrap the raw video with an MP4 container:
MP4Box -add pivideo.h264 pivideo.mp4
# Remove the source raw file, leaving the remaining pivideo.mp4 file to play
rm pivideo.h264
或者,将 MP4 包裹在现有的 raspivid 输出周围,如下所示:
MP4Box -add video.h264 video.mp4
raspiyuv
raspiyuv具有与raspistill相同的功能集,但不是输出标准图像文件,如。jpgs,它从相机ISP的输出生成YUV420或RGB888图像文件。
在大多数情况下,使用raspistill是标准图像捕捉的最佳选择,但在某些情况下使用YUV可能会有好处。例如,如果您只需要计算机视觉应用程序的未压缩黑白图像,您可以简单地使用YUV捕捉的Y通道。
关于YUV420文件,需要一些特定点才能正确使用它们。直线步幅(或俯仰)是 32 的倍数,YUV 的每个平面的高度是 16 的倍数。这可能意味着行尾可能有额外的像素,或者平面之间有间隙,具体取决于捕获图像的分辨率。这些间隙未被利用。
故障排除
如果相机模块无法正常工作,可以尝试以下几种方法:
-
带状电缆是否连接到相机串行接口 (CSI),而不是显示器串行接口 (DSI)?带状连接器将适合任一端口。相机端口位于HDMI接口附近。
-
带状连接器是否都牢固就位,它们是否正确?它们必须直插在插座中。
-
较小的黑色相机模块本身和PCB之间的相机模块连接器是否牢固连接?有时,这种连接在运输过程中或将相机模块放入机箱中时会松动。用指甲翻转PCB上的连接器,然后轻轻按压重新连接。它以非常轻微的咔哒声参与。不要强迫它;如果它不参与,它可能略有错位。 *sudo apt update和sudo apt full-upgrade运行过吗?
-
是否已运行raspi-config并启用相机模块?
-
您的电源是否充足?相机模块为Raspberry Pi的功率要求增加了大约 200-250mA。
如果仍然无法正常工作,请尝试以下操作:
-
Error : raspistill/raspivid command not found
. 这可能意味着您的更新/升级以某种方式失败。再试一次。 -
Error : ENOMEM
.摄像头模块未启动。再次检查所有连接。 -
Error : ENOSPC
. 摄像头模块可能耗尽了GPU内存。检查/boot/文件夹中的config.txt。gpu_mem选项至少应为128。或者,使用raspi-config的高级部分中的内存分割选项来进行设置。 -
如果您已检查上述所有问题,但相机模块仍然无法正常工作,请尝试在我们的论坛上发帖以获取更多帮助。
命令行选项
预览窗口
--preview, -p Preview window settings <'x,y,w,h'>
允许用户定义预览窗口的大小及其在屏幕上的位置。请注意,这将叠加在任何其他窗口/图形的顶部。
--fullscreen, -f Fullscreen preview mode
强制预览窗口使用整个屏幕。请注意,将保留传入图像的纵横比,因此某些边缘上可能会有条形图。
--nopreview, -n Do not display a preview window
完全禁用预览窗口。请注意,即使禁用预览,相机仍将生成帧,因此会使用电源。
--opacity, -op Set preview window opacity
设置预览窗口的不透明度。0 = 不可见,255 = 完全不透明。
相机控制选项
--sharpness, -sh Set image sharpness (-100 - 100)
设置图像的锐度。0 是默认值。
--contrast, -co Set image contrast (-100 - 100)
设置图像的对比度。0 是默认值。
--brightness, -br Set image brightness (0 - 100)
设置图像的亮度。默认值为 50。0 表示黑色,100 表示白色。
--saturation, -sa Set image saturation (-100 - 100)
设置图像的颜色饱和度。0 是默认值。
--ISO, -ISO Set capture ISO (100 - 800)
设置用于捕获的 ISO。
--vstab, -vs Turn on video stabilisation
仅在视频模式下,打开视频防抖动。
--ev, -ev Set EV compensation (-10 - 10)
设置图像的 EV 补偿。默认值为 0。
--exposure, -ex Set exposure mode
可能的选项包括:
-
自动:使用自动曝光模式
-
夜间:选择夜间拍摄设置
-
夜间预览:
-
背光:选择背光拍摄对象的设置
-
聚光灯:
-
运动:选择运动设置(快速快门等)
-
雪景:选择针对雪景优化的设置
-
海滩:选择针对海滩优化的设置
-
超长:选择长时间曝光的设置
-
固定帧数:将帧率限制为固定值
-
防抖:防抖模式
-
烟花:选择针对烟花优化的设置
请注意,并非所有这些设置都可以实现,具体取决于相机调整。
--flicker, -fli Set flicker avoidance mode
设置一种模式以补偿在电源频率闪烁的灯光,这可以看作是图像上的暗水平带。避免闪烁将曝光时间锁定在电源闪烁频率的倍数(8Hz为33.60ms,10Hz为50ms)。这意味着图像可能会更加嘈杂,因为如果控制算法希望获得中间曝光值,则必须增加增益而不是曝光时间。 auto可能会被外部因素混淆,因此除非实际需要,否则最好关闭此设置。
可能的选项包括:
-
熄灭:关闭闪烁避免
-
自动:自动检测电源频率
-
50Hz:将避让设置为50Hz
-
60Hz:将避让设置为60Hz
--awb, -awb Set Automatic White Balance (AWB) mode
色温范围 (K) 可用的模式在括号中具有这些设置。
-
off: 关闭白平衡计算
-
auto: 自动模式(默认)
-
sun: 晴天模式(5000K 和 6500K 之间)
-
cloud: 多云模式(6500K 和 12000K 之间)
-
shade: 阴影模式
-
tungsten: 钨丝灯照明模式(2500K至3500K之间)
-
fluorescent: 荧光灯照明模式(2500K至4500K之间)
-
incandescent: 白炽灯照明模式
-
flash: 闪光模式
-
horizon: 地平线模式
-
greyworld: 在 NoIR 相机上使用它来修复由于缺少红外滤光片而导致的错误 AWB 结果。
请注意,并非所有这些设置都可以实现,具体取决于相机类型。
--imxfx, -ifx Set image effect
设置要应用于图像的效果:
-
none: 无效果(默认)
-
negative: 反转图像颜色
-
solarise: 日晒图像
-
posterise: 后置图像
-
whiteboard: 白板效果
-
blackboard: 黑板效果
-
sketch: 素描效果
-
denoise: 对图像进行降噪
-
emboss: 浮雕图像
-
oilpaint: 油画效果
-
hatch:剖面线草图效果
-
gpen: 石墨素描效果
-
pastel: 柔和效果
-
watercolour: 水彩效果
-
film: 胶片颗粒效果
-
blur:模糊图像
-
saturation:色彩使图像饱和
-
colourswap: 未完全实现
-
washedout: 未完全实施
-
colourpoint: 未完全实现
-
colourbalance: 未完全实现
-
cartoon: 未完全实现
请注意,并非所有这些设置在所有情况下都可用。
--colfx, -cfx Set colour effect <U:V>
提供的 U 和 V 参数(范围 0 - 255)应用于图像的 U 和 Y 通道。例如,--colfx 128:128 应生成单色图像。
--metering, -mm Set metering mode
指定用于预览和捕获的测光模式:
-
平均:平均整个帧以进行测光
-
点测光:点测光
-
背光:假设是背光图像
-
矩阵:矩阵计量
--rotation, -rot Set image rotation (0 - 359)
设定取景器中图像的旋转和生成的图像。这可以取 0 以上的任何值,但由于硬件限制,仅支持 0、90、180 和 270 度旋转。
--hflip, -hf Set horizontal flip
水平翻转预览和保存的图像。
--vflip, -vf Set vertical flip
垂直翻转预览和保存的图像。
--roi, -roi Set sensor region of interest
允许将传感器区域的规范用作预览和捕获的源。这定义为左上角的 x,y 以及宽度和高度,所有值均采用规范化坐标 (0.0 - 1.0)。因此,若要在传感器的中间和下方设置 ROI,以及传感器四分之一的宽度和高度,请使用:
-roi 0.5,0.5,0.25,0.25
--shutter, -ss Set shutter speed/time
将快门打开时间设置为指定值(以微秒为单位)。快门速度限制如下:
Camera Version | Max (microseconds) |
---|---|
V1 (OV5647) |
6000000 (i.e. 6s) |
V2 (IMX219) |
10000000 (i.e. 10s) |
HQ (IMX477) |
200000000 (i.e. 200s) |
使用高于这些最大值的值将导致未定义的行为。
--drc, -drc Enable/disable dynamic range compression
DRC 通过增加暗区范围和减少较亮区域来更改图像。这可以改善低光照区域的图像。
-
off
-
low
-
med
-
high
默认情况下,DRC 处于关闭状态。
--stats, -st Use stills capture frame for image statistics
强制重新计算静止图像捕获传递的统计信息。数字增益和AWB是根据实际捕获帧统计信息重新计算的,而不是前面的预览帧。
--awbgains, -awbg
设置蓝色和红色增益(作为浮点数)以在设置时应用,例如 -awbg 1.5,1.2-awb off
--analoggain, -ag
直接在传感器上设置模拟增益值(相机模块 V1 上的 OV0 传感器的浮点值为 8.0 到 5647.1,相机模块 V1 上的 IMX0 传感器和 HQ 相机上的 IMX12 的浮点值为 0.219 到 2.447)。
--digitalgain, -dg
设置 ISP 应用的数字增益值(浮点值从 1.0 到 64.0,但大于 4.0 的值将产生曝光过度的图像)
--mode, -md
设置指定的传感器模式,禁用自动选择。可能的值取决于所使用的相机模块的版本:
Version 1.x (OV5647)
Mode | Size | Aspect Ratio | Frame rates | FOV | Binning |
---|---|---|---|---|---|
0 |
automatic selection |
||||
1 |
1920x1080 |
16:9 |
1-30fps |
Partial |
None |
2 |
2592x1944 |
4:3 |
1-15fps |
Full |
None |
3 |
2592x1944 |
4:3 |
0.1666-1fps |
Full |
None |
4 |
1296x972 |
4:3 |
1-42fps |
Full |
2x2 |
5 |
1296x730 |
16:9 |
1-49fps |
Full |
2x2 |
6 |
640x480 |
4:3 |
42.1-60fps |
Full |
2x2 plus skip |
7 |
640x480 |
4:3 |
60.1-90fps |
Full |
2x2 plus skip |
Version 2.x (IMX219)
Mode | Size | Aspect Ratio | Frame rates | FOV | Binning |
---|---|---|---|---|---|
0 |
automatic selection |
||||
1 |
1920x1080 |
16:9 |
0.1-30fps |
Partial |
None |
2 |
3280x2464 |
4:3 |
0.1-15fps |
Full |
None |
3 |
3280x2464 |
4:3 |
0.1-15fps |
Full |
None |
4 |
1640x1232 |
4:3 |
0.1-40fps |
Full |
2x2 |
5 |
1640x922 |
16:9 |
0.1-40fps |
Full |
2x2 |
6 |
1280x720 |
16:9 |
40-90fps |
Partial |
2x2 |
7 |
640x480 |
4:3 |
40-200fps1 |
Partial |
2x2 |
1对于超过 120fps 的帧速率,需要使用-ex off 关闭自动曝光和增益控制。这样做应该可以实现更高的帧速率,但曝光时间和增益需要设置为用户提供的固定值。
HQ摄像机
Mode | Size | Aspect Ratio | Frame rates | FOV | Binning/Scaling |
---|---|---|---|---|---|
0 |
automatic selection |
||||
1 |
2028x1080 |
169:90 |
0.1-50fps |
Partial |
2x2 binned |
2 |
2028x1520 |
4:3 |
0.1-50fps |
Full |
2x2 binned |
3 |
4056x3040 |
4:3 |
0.005-10fps |
Full |
None |
4 |
1332x990 |
74:55 |
50.1-120fps |
Partial |
2x2 binned |
--camselect, -cs
选择要在多相机系统上使用的摄像机。使用 0 或 1。
--annotate, -a Enable/set annotate flags or text
向图片添加一些文本和/或元数据。
元数据使用位掩码表示法表示,因此将它们相加以显示多个参数。例如,12 将显示 time(4) 和日期 (8),因为 4+8=12。
文本可以使用 strftime 使用的“%”字符包含日期/时间占位符。
Value | Meaning | Example Output |
---|---|---|
-a 4 |
Time |
20:09:33 |
-a 8 |
Date |
10/28/15 |
-a 12 |
4+8=12 Show the date(4) and time(8) |
20:09:33 10/28/15 |
-a 16 |
Shutter Settings |
|
-a 32 |
CAF Settings |
|
-a 64 |
Gain Settings |
|
-a 128 |
Lens Settings |
|
-a 256 |
Motion Settings |
|
-a 512 |
Frame Number |
|
-a 1024 |
Black Background |
|
-a "ABC %Y-%m-%d %X" |
Show some text |
ABC %Y-%m-%d %X |
-a 4 -a "ABC %Y-%m-%d %X" |
Show custom formatted date/time |
ABC 2015-10-28 20:09:33 |
-a 8 -a "ABC %Y-%m-%d %X" |
Show custom formatted date/time |
ABC 2015-10-28 20:09:33 |
--annotateex, -ae Set extra annotation parameters
指定批注大小、文本颜色和背景颜色。颜色采用十六进制 YUV 格式。
尺寸范围从 6 - 160;默认值为 32。请求无效大小应提供默认值。
Example | Explanation |
---|---|
-ae 32,0xff,0x808000 -a "Annotation text" |
gives size 32 white text on black background |
-ae 10,0x00,0x8080FF -a "Annotation text" |
gives size 10 black text on white background |
--stereo, -3d
选择指定的立体成像模式;sbs选择并排模式,tb选择顶/底模式;关闭关闭立体声模式(默认)。
--decimate, -dec
将立体图像的宽度和高度减半。
--3dswap, -3dswap
交换立体成像中使用的相机顺序;注:当前不工作。
--settings, -set
检索当前相机设置并将其写入标准输出。
特定于应用程序的设置
raspistill
--width, -w Set image width <size> --height, -h Set image height <size> --quality, -q Set JPEG quality <0 to 100>
Quality 100 几乎完全未压缩。75是一个很好的全方位值。
--raw, -r Add raw Bayer data to JPEG metadata
此选项将来自相机的原始拜耳数据插入到 JPEG 元数据中。
--output, -o Output filename <filename>
指定输出文件名。如果未指定,则不保存任何文件。如果文件名为“-”,则所有输出都将发送到标准输出。
--latest, -l Link latest frame to filename <filename>
在此名称下建立指向最新帧的文件系统链接。
--verbose, -v Output verbose information during run
在程序运行期间输出调试/信息消息。
--timeout, -t Time before the camera takes picture and shuts down
程序将运行指定的时间长度,以毫秒为单位输入。然后,它会捕获并在指定输出时保存它。如果未指定超时值,则将其设置为 5 秒 (-t 5000)。请注意,低值(小于 500 毫秒,尽管它可能取决于其他设置)可能无法为相机提供足够的启动时间,也无法为 AWB 和 AGC 等自动算法提供足够的帧来提供准确的结果。
如果设置为 0,预览将无限期运行,直到使用 CTRL-C 停止。在这种情况下,不会进行捕获。
--timelapse, -tl time-lapse mode
具体值是以毫秒为单位的拍摄间隔时间。请注意,您应该在文件名中希望显示帧数的位置指定%04d。例如,下面的代码将每2秒产生一个捕获,总时间为30秒,命名为image0001.jpg、image0002.jpg等等,一直到image0015.jpg。
-t 30000 -tl 2000 -o image%04d.jpg
请注意,%04d表示一个4位数字,并添加了前导零以构成所需的位数。例如,%08d会产生一个8位数。
如果输入延时值0,应用程序将尽快拍照。请注意,两次拍摄之间至少有 30 毫秒的强制暂停,以确保可以进行曝光计算。
--framestart, -fs
指定延时摄影中的第一个帧号。如果您已经保存了许多帧,并希望从下一帧重新开始,则很有用。
--datetime, -dt
延时文件名称将使用aabbccddee格式的日期/时间值,而不是简单的帧编号,其中aa是月,bb是月中的日,cc是小时,dd是分钟,ee是秒。
--timestamp, -ts
延时摄影文件名将使用一个数字,即Unix时间戳,即自1970年以来的秒数,而不是简单的帧号。
--thumb, -th Set thumbnail parameters (x:y:quality)
允许指定插入到 JPEG 文件中的缩略图。如果未指定,则默认值为 64x48,质量为 35。 如果指定—thumb none,则不会在文件中放置缩略图信息。这会略微减小文件大小。
--demo, -d Run a demo mode <milliseconds>
此选项在相机选项范围内循环。不会进行任何捕获,并且演示将在超时期限结束时结束,无论是否已循环所有选项。周期之间的时间应指定为毫秒值。
--encoding, -e Encoding to use for output file
有效选项为jpg 、bmp、gif 和 png。请注意,未加速的图像类型(GIF、PNG、BMP)的保存时间比硬件加速的 jpg 要长得多。另请注意,在决定文件的编码时,将完全忽略文件名后缀。
--restart, -rs
将 JPEG 重新启动标记间隔设置为特定值。对于有损传输流很有用,因为它允许损坏的 JPEG 文件仍部分显示。
--exif, -x EXIF tag to apply to captures (format as 'key=value')
允许将特定的EXIF标签插入JPEG图像。您最多可以有 32 个 EXIF 标记条目。这对于添加 GPS 元数据等任务非常有用。例如,要设置经度:
--exif GPS.GPSLongitude=5/1,10/1,15/1
将经度设置为 5 度 10 分 15 秒。有关可用标签范围的更多详细信息,请参阅 EXIF 文档;支持的标签如下:
IFD0.< or IFD1.< ImageWidth, ImageLength, BitsPerSample, Compression, PhotometricInterpretation, ImageDescription, Make, Model, StripOffsets, Orientation, SamplesPerPixel, RowsPerString, StripByteCounts, XResolution, YResolution, PlanarConfiguration, ResolutionUnit, TransferFunction, Software, DateTime, Artist, WhitePoint, PrimaryChromaticities, JPEGInterchangeFormat, JPEGInterchangeFormatLength, YCbCrCoefficients, YCbCrSubSampling, YCbCrPositioning, ReferenceBlackWhite, Copyright> EXIF.< ExposureTime, FNumber, ExposureProgram, SpectralSensitivity, ISOSpeedRatings, OECF, ExifVersion, DateTimeOriginal, DateTimeDigitized, ComponentsConfiguration, CompressedBitsPerPixel, ShutterSpeedValue, ApertureValue, BrightnessValue, ExposureBiasValue, MaxApertureValue, SubjectDistance, MeteringMode, LightSource, Flash, FocalLength, SubjectArea, MakerNote, UserComment, SubSecTime, SubSecTimeOriginal, SubSecTimeDigitized, FlashpixVersion, ColorSpace, PixelXDimension, PixelYDimension, RelatedSoundFile, FlashEnergy, SpatialFrequencyResponse, FocalPlaneXResolution, FocalPlaneYResolution, FocalPlaneResolutionUnit, SubjectLocation, ExposureIndex, SensingMethod, FileSource, SceneType, CFAPattern, CustomRendered, ExposureMode, WhiteBalance, DigitalZoomRatio, FocalLengthIn35mmFilm, SceneCaptureType, GainControl, Contrast, Saturation, Sharpness, DeviceSettingDescription, SubjectDistanceRange, ImageUniqueID> GPS.< GPSVersionID, GPSLatitudeRef, GPSLatitude, GPSLongitudeRef, GPSLongitude, GPSAltitudeRef, GPSAltitude, GPSTimeStamp, GPSSatellites, GPSStatus, GPSMeasureMode, GPSDOP, GPSSpeedRef, GPSSpeed, GPSTrackRef, GPSTrack, GPSImgDirectionRef, GPSImgDirection, GPSMapDatum, GPSDestLatitudeRef, GPSDestLatitude, GPSDestLongitudeRef, GPSDestLongitude, GPSDestBearingRef, GPSDestBearing, GPSDestDistanceRef, GPSDestDistance, GPSProcessingMethod, GPSAreaInformation, GPSDateStamp, GPSDifferential> EINT.< InteroperabilityIndex, InteroperabilityVersion, RelatedImageFileFormat, RelatedImageWidth, RelatedImageLength>
请注意,这些标签的一小部分将由相机系统自动设置—exif none,但将被命令行上的任何EXIF选项覆盖。
设置将防止任何 EXIF 信息存储在文件中。这会略微减小文件大小。
--gpsdexif, -gps
将来自任何连接的GPS加密狗(使用GSPD)的实时EXIF信息应用于图像;需要安装libgps.so。
--fullpreview, -fp Full preview mode
这将使用全分辨率捕获模式运行预览窗口。在此模式下,每秒最大帧数为 15fps,预览将具有与捕获相同的视野。捕获应该更快地发生,因为不需要更改模式。此功能目前正在开发中。
--keypress, -k Keypress mode
照相机在请求的时间 (-t) 内运行,并且可以通过按 Enter 键在整个时间内启动捕获。按 X 然后按 Enter 将在达到超时之前退出应用程序。如果超时设置为 0,摄像机将无限期运行,直到用户按 X 然后按 Enter 键。 使用详细选项 (-v) 将显示要求用户输入的提示,否则不显示提示。
--signal, -s Signal mode
摄像机在请求的时间(-t)内运行,通过向摄像机进程发送USR1信号,可以在这段时间内启动捕获。这可以使用kill命令来完成。您可以使用pgrep raspistill命令找到相机进程ID。
kill -USR1 <process id of raspistill>
--burst, -bm
设置突发捕获模式。这可以防止相机在两次拍摄之间返回预览模式,这意味着拍摄可以更紧密地拍摄。
raspivid
--width, -w Set image width <size>
生成的视频的宽度。这应该在 64 到 1920 之间。
--height, -h Set image height <size>
生成的视频的高度。这应该在 64 到 1080 之间。
--bitrate, -b Set bitrate
使用比特每秒,所以10Mbps就是-b 10000000。对于H264、1080p30,高质量的比特率将是15Mbps或更高。最大比特率是25Mbps (-b 25000000),但远超过17Mbps在1080p30时不会有明显的改善。
--output, -o Output filename <filename>
指定输出文件名。如果未指定,则不保存任何文件。如果文件名为“-”,则所有输出都将发送到标准输出。
要连接到远程IPv4主机,请使用tcp或udp,后跟所需的IP地址。例如tcp://192.168.1.2:1234或udp://192.168.1.2:1234。
要侦听TCP端口(IPv4)并等待传入连接,请使用- listen (-l)选项,例如,raspivid -l -o tcp://0.0.0.0:3333将绑定到所有网络接口,raspivid-l-o TCP://192 . 168 . 1 . 1:3333将绑定到本地IPv4。
--listen, -l
使用网络连接作为数据接收器时,此选项将使系统在发送数据之前等待来自远程系统的连接。
--verbose, -v Output verbose information during run
在程序运行期间输出调试/信息消息。
--timeout, -t Time before the camera takes picture and shuts down
程序将运行的总时间长度。如果未指定,则默认值为 5000 毫秒(5 秒)。如果设置为 0,应用程序将无限期运行,直到使用 Ctrl-C 停止。
--demo, -d Run a demo mode <milliseconds>
此选项在相机选项范围内循环。不进行录制,演示将在超时期限结束时结束,无论是否已循环所有选项。周期之间的时间应指定为毫秒值。
--framerate, -fps Specify the frames per second to record
目前允许的最小帧速率为 2fps,最大为 30fps。这种情况将来可能会改变。
--penc, -e Display preview image after encoding
打开一个选项以在压缩后显示预览。这将在预览窗口中显示任何压缩伪影。在正常操作中,预览将显示压缩前的相机输出。此选项不保证在将来的版本中有效。
--intra, -g Specify the intra refresh period (key frame rate/GoP)
设置录制视频的刷新周期内 (GoP) 速率。H264 视频在每个刷新期间使用完整帧(I 帧),后续帧基于该帧。此选项指定每个 I 帧之间的帧数。此处的数字越大,生成的视频越小,数字越小,流越不容易出错。
--qp, -qp Set quantisation parameter
设置流的初始量化参数。从大约 10 到 40 不等,将极大地影响录音质量。值越高,质量越好,文件大小越大。将此设置与比特率 0 结合使用,以设置完全可变的比特率。
--profile, -pf Specify H264 profile to use for encoding
设置要用于编码的 H264 配置文件。选项包括:
-
baseline
-
main
-
high
--level, -lev
指定用于编码的H264编码器级别。选项有4、4.1和4.2。
--irefresh, -if
设置H264内部刷新类型。可能的选项有循环、自适应、两者和循环。
--inline, -ih Insert PPS, SPS headers
强制流在每个 I 帧上包含 PPS 和 SPS 标头。某些流媒体案例需要,例如 Apple HLS。这些标头很小,因此不要大大增加文件大小。
--spstimings, -stm
将计时信息插入 SPS 块。
--timed, -td Do timed switches between capture and pause
此选项允许在特定时间间隔暂停和重新启动视频捕获。需要两个值:导通时间和关断时间。“开”时间是捕获视频的时间量,“关机”是视频暂停的时间量。录制的总时间由该timeout选项定义。请注意,录制可能会稍微超过超时设置,具体取决于开和关时间。
例如:
raspivid -o test.h264 -t 25000 -timed 2500,5000
将录制 25 秒。录制将在由 2500 毫秒(2.5 秒)段和 5000 毫秒(5 秒)间隙组成的时间范围内进行,在 20 秒内重复。因此,整个录音实际上只有 10 秒长,因为 4 段 2.5 秒 = 10 秒,间隔 5 秒。所以:
2.5 记录 — 5 暂停 - 2.5 记录 — 5 暂停 - 2.5 记录 — 5 暂停 — 2.5 记录
总录制周期为 25 秒,但实际录制的素材只有 10 秒。
--keypress, -k Toggle between record and pause on Enter keypress
每次按 Enter 键时,录制将暂停或重新启动。按X然后回车将停止录制并关闭应用程序。请注意,超时值将用于表示录制结束,但仅在每次按 Enter 键后检查;因此,如果系统正在等待按键,即使超时已过期,它仍然会等待按键后再退出。
--signal, -s Toggle between record and pause according to SIGUSR1
向raspivid进程发送USR1信号将在记录和暂停之间切换。这可以使用kill命令来完成,如下所示。您可以使用pgrep raspivid找到raspivid进程id。
kill -USR1 <process id of raspivid>
请注意,超时值将用于指示录制结束,但仅在每次收到SIGUSR1信号后进行检查;因此,如果系统正在等待信号,即使超时已过期,它仍然会等待信号后再退出。
--split, -sp
在信号或按键模式下,每次重新启动录制时,都会创建一个新文件。
--circular, -c
选择循环缓冲区模式。所有编码数据都存储在循环缓冲区中,直到激活触发器,然后保存缓冲区。
--vectors, -x
打开从 H264 编码器到指定文件名的运动矢量输出。
--flush, -fl
写入视频数据后立即强制刷新输出数据缓冲区。这会绕过写入数据的任何操作系统缓存,并且可以减少延迟。
--save-pts, -pts
将时间戳信息保存到指定的文件。可用作mkvmerge 的输入文件。
--codec, -cd
指定要使用的编码器编解码器。选项是H264 和MJPEG 。H264 可以编码高达 1080p,而 MJPEG 可以编码到传感器尺寸,但由于更高的处理和存储要求,帧速率会降低。
--initial, -i Define initial state on startup
定义摄像机是暂停还是立即开始录制。选项包括录制或暂停。请注意,如果您使用简单的超时,并且initial设置为pause,则不会记录任何输出。
--segment, -sg Segment the stream into multiple files
文件不是创建单个文件,而是拆分为大约指定毫秒数的段。为了提供不同的文件名,您应该在文件名中希望出现段计数编号的位置添加%04d或类似名称,例如:
--segment 3000 -o video%04d.h264
将制作大约3000毫秒(3s)长的视频剪辑,命名为video0001.h264、video0002.h264等。剪辑应该是无缝的(剪辑之间没有丢帧),但是每个剪辑长度的精度将取决于帧内周期,因为片段将总是从I帧开始。因此,它们将始终等于或长于指定的周期。
最新版本的 Raspivid 还将允许文件名基于时间,而不是使用段号。例如:
--segment 3000 -o video_%c.h264
将生成格式如下的文件名:video_Fri Jul 20 16:23:48 2018.h264
有http://man7.org/linux/man-pages/man3/strftime.3.html[许多不同的格式]选项可用。请注意,%d和%u 选项不可用,因为它们用于段号格式,并且某些组合可能会产生无效的文件名。
--wrap, -wr Set the maximum value for segment number
输出段时,这是段号在被重置为1之前可以达到的最大值,可以保留录制的段,但会覆盖最早的段。因此,如果设置为4,在上面的片段示例中,产生的文件将是video0001.h264、video0002.h264、video0003.h264和video0004.h264。一旦记录了video0004.h264,计数将重置为1,video0001.h264将被覆盖。
--start, -sn Set the initial segment number
输出片段时,这是初始片段编号,能够从给定片段恢复先前的记录。默认值为 1。
--raw, -r
为请求的任何原始数据文件指定输出文件名。
--raw-format, -rf
指定请求原始输出时要使用的原始格式。yuv、rgb和灰色选项。灰色只是保存YUV图像的Y通道。
raspiyuv
raspiyuv的许多选项与raspistill的选项相同。本节显示了不同之处。
不支持的选项:
--exif, --encoding, --thumb, --raw, --quality
额外选项 :
--rgb, -rgb Save uncompressed data as RGB888
此选项强制将图像另存为每通道 8 位的 RGB 数据,而不是 YUV420。
请注意,保存的raspiyuv图像缓冲区填充为可被 32 整除的水平大小,因此每行末尾可能有未使用的字节。缓冲区也垂直填充以可被 16 整除,在 YUV 模式下,Y、U、V 的每个平面都以这种方式填充。
--luma, -y
仅输出 YUV 图像的亮度 (Y) 通道。这实际上是图像的黑白或强度部分。
--bgr, -bgr
将图像数据另存为 BGR 数据而不是 YUV。
命令行示例
静止捕获
默认情况下,捕获以传感器支持的最高分辨率完成。这可以使用 -w和 -h
命令行选项进行更改。 在取景器上拍摄2秒后的默认拍摄(时间以毫秒为单位),保存image.jpg:
raspistill -t 2000 -o image.jpg
以不同的分辨率拍摄:
raspistill -t 2000 -o image.jpg -w 640 -h 480
大幅降低质量以减小文件大小:
raspistill -t 2000 -o image.jpg -q 5
强制预览显示在坐标 100,100、宽度为 300 像素、高度为 200 像素处:
raspistill -t 2000 -o image.jpg -p 100,100,300,200
完全禁用预览:
raspistill -t 2000 -o image.jpg -n
将图像另存为 PNG 文件(无损压缩,但比 JPEG 慢)。请注意,选择图像编码时会忽略文件名后缀:
raspistill -t 2000 -o image.png –e png
将一些 EXIF 信息添加到 JPEG 中。这会将艺术家标签名称设置为 Boris,并将 GPS 高度设置为 123.5m。请注意,如果设置GPS标签,则应设置为最低GPSLatitude,GPSLatitudeRef,GPSLongitudeRef,GPSLongitudeRef,GPSAltitude和GPSAltitudeRef:
raspistill -t 2000 -o image.jpg -x IFD0.Artist=Boris -x GPS.GPSAltitude=1235/10
设置浮雕图像效果:
raspistill -t 2000 -o image.jpg -ifx emboss
将 YUV 图像的 U 和 V 通道设置为特定值(128:128 生成灰度图像):
raspistill -t 2000 -o image.jpg -cfx 128:128
运行预览 2 秒,没有保存图像:
raspistill -t 2000
每隔10秒拍摄一张延时照片,持续10分钟(10分钟= 600000毫秒),将文件命名为image_num_001_today.jpg、image_num_002_today.jpg等,最新的照片也可以用latest.jpg命名:
raspistill -t 600000 -tl 10000 -o image_num_%03d_today.jpg -l latest.jpg
拍照并将图像数据发送到标准输出:
raspistill -t 2000 -o -
拍摄照片并将图像数据发送到文件:
raspistill -t 2000 -o - > my_file.jpg
永久运行相机,在按 Enter 时拍照:
raspistill -t 0 -k -o my_pics%02d.jpg
视频捕获
图像大小和预览设置与静止图像拍摄相同。视频录制的默认大小为 1080p (1920x1080)。
使用默认设置 (5p1080) 录制 30s 剪辑:
raspivid -t 5000 -o video.h264
以指定的比特率 (5.3Mbps) 录制 5 秒剪辑:
raspivid -t 5000 -o video.h264 -b 3500000
以指定的帧速率 (5fps) 录制 5 秒剪辑:
raspivid -t 5000 -o video.h264 -f 5
对 5s 相机流进行编码,并将图像数据发送到标准输出:
raspivid -t 5000 -o -
对 5s 相机流进行编码并将图像数据发送到文件:
raspivid -t 5000 -o - > my_file.h264
Shell错误代码
此处描述的应用程序将在完成后向 shell 返回标准错误代码。可能的错误代码包括:
C Define | Code | Description |
---|---|---|
EX_OK |
0 |
Application ran successfully |
EX_USAGE |
64 |
Bad command line parameter |
EX_SOFTWARE |
70 |
Software or camera error |
130 |
Application terminated by Ctrl-C |
长时间曝光
三款官方Raspberry Pi相机的最大曝光时间可以在此表中找到。
由于ISP的工作方式,默认情况下要求长时间曝光可能会导致捕获过程占用多达7倍的曝光时间,因此在HQ相机上进行200秒曝光可能需要1400秒才能实际返回图像。这是由于相机系统使用AGC(自动增益控制)和AWB(自动白平衡)算法计算出要在图像中使用的正确曝光和增益的方式。系统需要几帧来计算这些数字,以产生像样的图像。当与处理开始时的帧丢弃(以防它们损坏)以及在预览和捕获模式之间切换结合使用时,这可能导致生成最终图像最多需要 7 帧。长时间曝光可能需要很长时间。
幸运的是,可以更改相机参数以显着减少帧时间;但是,这意味着关闭自动算法并手动为 AGC 提供值。
AWB增益通常可以省略,因为遗留堆栈能够重新处理相机数据以计算它们(该选项),尽管也可以指定它们。此外,应请求具有短超时的突发模式 () 以禁止初始预览阶段,并且曝光模式也需要禁用 (-st-bm-ex off)。
以下示例将执行 100 秒曝光捕获
raspistill -t 10 -bm -ex off -ag 1 -ss 100000000 -st -o long_exposure.jpg
使用相机模块拍摄 RAW
原始图像的定义可能会有所不同。通常的含义是直接来自传感器的原始拜耳数据,尽管有些人可能将已通过ISP(因此已被处理)的未压缩图像视为原始图像。对于后者,我们建议使用术语“未编码”,以便明确差异。
这两个选项都可以从Raspberry Pi相机获得。
经过处理的无损耗图像
raspistill的通常输出是一个压缩的JPEG文件,它经过了图像处理的所有阶段,以产生高质量的图像。然而,作为一种有损格式,JPEG确实丢弃了一些用户可能想要的信息。
raspistill有一个编码选项,允许您指定输出格式:jpg、bmp、png或gif。除了jpg之外,其他格式都是无损的,因此不会为了提高压缩率而丢弃任何数据,但是需要从原始YUV进行转换,并且因为这些格式没有硬件支持,所以它们生成图像的速度比JPEG稍慢。
例如
raspistill --encoding png -o fred.png
另一种选择是使用 raspiyuv
应用程序输出完全格式化的 YUV420 或 RGB 数据。
未处理的图像
对于某些应用,例如天文摄影,直接从传感器获取原始拜耳数据可能很有用。这些数据需要进行后处理以生成有用的图像。
raspistill有一个原始选项,将导致输出拜耳数据。
raspistill --raw -o fred.jpg
原始数据被附加到JPEG文件的末尾, 需要被提取出来。