安泰电子世界网 首页 Ardunio 相机软件(一)

相机软件(一)

2024-11-5 17:30 | 发布者: txc | 查看: 28 | 评论: 0

简介:相机软件

本文档介绍如何将支持的相机模块与我们的软件工具结合使用。所有 Raspberry Pi 相机都可以使用我们的软件工具录制高分辨率照片和全高清 1080p 视频(或更好)。
Raspberry Pi 生产了几个官方摄像头模块,包括:

  • 原来的 500 万像素相机模块 1(已停产)

  • 800万像素摄像头模块2,带或不带红外滤光片

  • 1200万像素的相机模块3,带有标准镜头和广角镜头,带或不带红外滤光片

  • 1200万像素高品质相机,具有CS和M12卡口版本,可与外部镜头配合使用

  • 用于快速运动摄影的 1.6 像素全局快门相机

有关相机硬件的详细信息,请参阅相机硬件文档
首先,安装您的相机模块。然后,按照本节中的指南使用您的相机模块。

rpicam-apps

注意:Raspberry Pi OS Bookworm 将相机捕获应用程序从 libcamera-* 重命名为 rpicam-*。符号链接允许用户暂时使用旧名称。尽快采用新的应用程序名称。Bookworm 之前的 Raspberry Pi OS 版本仍然使用 libcamera-* 名称。
Raspberry Pi 提供了一小组示例 rpicam-apps。这些 CLI 应用程序建立在 libcamera 之上,从相机捕获图像和视频。这些应用包括:

  • rpicam-hello:相当于相机的“hello world”,用于启动相机预览流并将其显示在屏幕上。

  • rpicam-jpeg:运行预览窗口,然后拍摄高分辨率静止图像。

  • rpicam-still:模拟原始 raspistill 应用程序的许多功能。

  • rpicam-vid:捕获视频。

  • rpicam-raw:直接从传感器捕获原始(未处理的拜耳)帧。

  • rpicam-detect:默认情况下不构建,但如果用户在其 Raspberry Pi 上安装了 TensorFlow Lite,则可以构建它。在检测到某些对象时捕获 JPEG 图像。

最新版本的 Raspberry Pi OS 包括五个基本的 rpicam-app,因此即使在全新安装的 Raspberry Pi OS 上,您也可以使用相机录制图像和视频。
用户可以创建自己的基于 rpicam 的应用程序,并具有自定义功能以满足自己的要求。rpicam-apps 源代码在 BSD-2-Clause 许可下免费提供。

libcamera

libcamera 是一个开源软件库,旨在直接从 Arm 处理器上的 Linux 操作系统支持相机系统。在 Broadcom GPU 上运行的专有代码被最小化。有关 libcamera 的详细信息,请参阅 libcamera 网站。
libcamera 提供了一个 C++ API,用于配置相机,然后允许应用程序请求图像帧。这些图像缓冲区驻留在系统内存中,可以直接传递给静止图像编码器(如 JPEG)或视频编码器(如 H.264)。libcamera 本身不会编码或显示图像:该功能使用 rpicam-apps。
您可以在官方 libcamera 存储库中找到源代码。Raspberry Pi OS 发行版使用分支来控制更新。
在 libcamera 核心下,我们提供了一个自定义管道处理程序。libcamera 使用此层来驱动 Raspberry Pi 上的传感器和图像信号处理器 (ISP)。libcamera 包含一系列图像处理算法 (IPA),包括自动曝光/增益控制 (AEC/AGC)、自动白平衡 (AWB) 和自动镜头阴影校正 (ALSC)。
Raspberry Pi 的 libcamera 实现支持以下摄像头:

  • 官方相机:

    • OV5647掀背/两厢车(V1)

    • IMX219掀背/两厢车(V2)

    • IMX477 (总部)

    • IMX296 (GS)

    • IMX708掀背/两厢车(V3)

  • 第三方传感器:

    • IMX290型

    • IMX327型

    • IMX378型

    • OV9281型

rpicam-hello

RPicam-hello 会简要显示一个预览窗口,其中包含来自已连接摄像机的视频源。要使用 rpicam-hello 显示预览窗口 5 秒钟,请在终端中运行以下命令:

rpicam-hello

您可以使用超时选项传递可选的持续时间(以毫秒为单位)。值为 0 将无限期运行预览:

rpicam-hello --timeout 0

在终端中使用 Ctrl+C 或预览窗口中的关闭按钮停止 rpicam-hello。

显示图像传感器预览

大多数 rpicam-apps 在窗口中显示预览图像。如果没有活动的桌面环境,则使用 Linux Direct Rendering Manager (DRM) 将预览直接绘制到显示器上。否则,rpicam-apps 会尝试使用桌面环境。这两种路径都使用零拷贝 GPU 缓冲区共享:因此,不支持 X 转发。
如果您运行 X 窗口服务器并希望使用 X 转发,请传递 qt-preview 标志以在 Qt 窗口中呈现预览窗口。Qt预览窗口使用的资源比替代方案更多。
注意:使用Gtk2的旧系统在与OpenCV链接时,可能会产生Glib-GObject错误,并且无法显示Qt预览窗口。在这种情况下,请以 root 身份编辑文件 /etc/xdg/qt5ct/qt5ct.conf,并将包含 style=gtk2 的行替换为 style=gtk3。
要完全禁止预览窗口,请传递 nopreview 标志:

rpicam-hello -n

info-text 选项使用 % 指令在窗口标题栏上显示图像信息。例如,以下命令显示当前的红色和蓝色增益值:

rpicam-hello --info-text "red gain %rg, blue gain %bg"

有关指令的完整列表,请参阅信息文本参考

rpicam-jpeg

rpicam-jpeg 可帮助您在 Raspberry Pi 设备上捕获图像。
若要捕获全分辨率 JPEG 图像并将其保存到名为 test.jpg 的文件,请运行以下命令:

rpicam-jpeg --output test.jpg

您应该会看到一个预览窗口 5 秒钟。然后,rpicam-jpeg 捕获全分辨率 JPEG 图像并保存。
使用超时选项更改预览窗口的显示时间。宽度和高度选项可更改已保存图像的分辨率。例如,以下命令显示预览窗口 2 秒钟,然后捕获并保存分辨率为 640×480 像素的图像:

rpicam-jpeg --output test.jpg --timeout 2000 --width 640 --height 480

rpicam-still

rpicam-still,就像 rpicam-jpeg 一样,可帮助您在 Raspberry Pi 设备上捕获图像。与 rpicam-jpeg 不同,rpicam-still 支持旧版 raspistill 应用程序中提供的许多选项。
若要捕获全分辨率 JPEG 图像并将其保存到名为 test.jpg 的文件,请运行以下命令:

rpicam-still --output test.jpg

编码

rpicam-still 可以保存多种格式的图像,包括 png、bmp 以及 RGB 和 YUV 二进制像素转储。若要读取这些二进制转储,任何读取文件的应用程序都必须了解像素排列。
使用编码选项指定输出格式。传递给输出的文件名对输出文件类型没有影响。
若要捕获全分辨率 PNG 图像并将其保存到名为 test.png 的文件中,请运行以下命令:

rpicam-still --encoding png --output test.png

有关指定图像格式的详细信息,请参阅编码选项参考

捕获原始图像

原始图像是由图像传感器直接生成的图像,然后由图像信号处理器 (ISP) 或 CPU 对它们进行任何处理。彩色图像传感器通常使用拜耳格式。使用 raw 选项捕获 raw 图像。
若要捕获图像,请将其保存到名为 test.jpg 的文件中,并将图像的原始版本保存到名为 test.dng 的文件中,请运行以下命令:

rpicam-still --raw --output test.jpg

rpicam-still 以 DNG(Adobe Digital Negative)格式保存原始图像。为了确定原始图像的文件名,rpicam-still 使用与输出文件相同的名称,扩展名更改为 .dng。要使用 DNG 图像,请使用 Dcraw 或 RawTherapee 等应用程序。
DNG 文件包含有关图像捕获的元数据,包括黑电平、白平衡信息和 ISP 用于生成 JPEG 的颜色矩阵。使用 ExifTool 查看 DNG 元数据。以下输出显示了存储在 Raspberry Pi 使用 HQ 相机捕获的原始图像中的典型元数据:

File Name                       : test.dng
Directory                       : .
File Size                       : 24 MB
File Modification Date/Time     : 2021:08:17 16:36:18+01:00
File Access Date/Time           : 2021:08:17 16:36:18+01:00
File Inode Change Date/Time     : 2021:08:17 16:36:18+01:00
File Permissions                : rw-r--r--
File Type                       : DNG
File Type Extension             : dng
MIME Type                       : image/x-adobe-dng
Exif Byte Order                 : Little-endian (Intel, II)
Make                            : Raspberry Pi
Camera Model Name               : /base/soc/i2c0mux/i2c@1/imx477@1a
Orientation                     : Horizontal (normal)
Software                        : rpicam-still
Subfile Type                    : Full-resolution Image
Image Width                     : 4056
Image Height                    : 3040
Bits Per Sample                 : 16
Compression                     : Uncompressed
Photometric Interpretation      : Color Filter Array
Samples Per Pixel               : 1
Planar Configuration            : Chunky
CFA Repeat Pattern Dim          : 2 2
CFA Pattern 2                   : 2 1 1 0
Black Level Repeat Dim          : 2 2
Black Level                     : 256 256 256 256
White Level                     : 4095
DNG Version                     : 1.1.0.0
DNG Backward Version            : 1.0.0.0
Unique Camera Model             : /base/soc/i2c0mux/i2c@1/imx477@1a
Color Matrix 1                  : 0.8545269369 -0.2382823821 -0.09044229197 -0.1890484985 1.063961506 0.1062747385 -0.01334283455 0.1440163847 0.2593136724
As Shot Neutral                 : 0.4754476844 1 0.413686484
Calibration Illuminant 1        : D65
Strip Offsets                   : 0
Strip Byte Counts               : 0
Exposure Time                   : 1/20
ISO                             : 400
CFA Pattern                     : [Blue,Green][Green,Red]
Image Size                      : 4056x3040
Megapixels                      : 12.3
Shutter Speed                   : 1/20

要找到模拟增益,请将 ISO 值除以 100。自动白平衡 (AWB) 算法确定单个校准的光源,该光源始终标记为 D65。

捕捉长时间曝光

要拍摄长时间曝光的图像,请禁用自动曝光/增益控制 (AEC/AGC) 和自动白平衡 (AWB)。否则,这些算法将迫使用户在收敛时等待许多帧。
要禁用这些算法,请提供增益和 AWB 的显式值。由于长时间曝光已经花费了大量时间,因此使用immediate选项完全跳过预览阶段通常是有意义的。
要执行 100 秒曝光捕获,请运行以下命令:

rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate

要查找官方 Raspberry Pi 相机的最长曝光时间,请参阅相机硬件规格

创建延时视频

要创建延时视频,请定期拍摄静止图像,例如每分钟一次,然后使用应用程序将照片拼接成视频。

通过 RPiCam-静止延时摄影模式

要使用 rpicam-still 的内置延时摄影模式,请使用延时摄影选项。此选项接受一个值,该值表示您希望 Raspberry Pi 在捕获之间等待的时间段(以毫秒为单位)。:

mkdir timelapse

运行以下命令以创建超过 30 秒的时间延时,每两秒录制一张照片,将输出保存到 image0001.jpg 到 image0014.jpg:

rpicam-still --timeout 30000 --timelapse 2000 -o timelapse/image%04d.jpg
通过 Cron

您还可以使用 cron 自动进行延时摄影。首先,创建名为 timelapse.sh 的脚本,其中包含以下命令。将<username>占位符替换为 Raspberry Pi 上的用户帐户名称:

#!/bin/bash
DATE=$(date +"%Y-%m-%d_%H%M")
rpicam-still -o /home//timelapse/$DATE.jpg

然后,使脚本可执行:

chmod +x timelapse.sh

创建延时摄影目录,将延时摄影图片保存到其中:

mkdir timelapse

打开 crontab 进行编辑:

crontab -e

在编辑器中打开文件后,添加以下行以计划每分钟捕获一次图像,并将<username>占位符替换为主要用户帐户的用户名:

* * * * * /home//timelapse.sh 2>&1

保存并退出,您应该会看到以下消息:

crontab: installing new crontab

提示:要停止录制延时摄影的图像,请再次运行 crontab -e 并从 crontab 中删除上述行。

将图像拼接在一起

一旦你有了一系列延时照片,你可能想把它们组合成一个视频。使用 ffmpeg 在 Raspberry Pi 上执行此操作。
首先,安装 ffmpeg:

sudo apt install ffmpeg

从包含延时摄影目录的目录中运行以下命令,将 JPEG 文件转换为 mp4 视频:

ffmpeg -r 10 -f image2 -pattern_type glob -i 'timelapse/*.jpg' -s 1280x720 -vcodec libx264 timelapse.mp4

上面的命令使用以下参数:

  • -r 10:在输出视频中将帧速率(Hz值)设置为每秒10帧

  • -f image2:将 ffmpeg 设置为从模式指定的图像文件列表中读取

  • -pattern_type glob:使用通配符模式(通配)解释带有 -i 的文件名输入

  • -i 'timelapse/*.jpg':指定输入文件以匹配延时摄影目录中的JPG文件

  • -s 1280x720:缩放到 720p

  • -vcodec libx264 使用软件 x264 编码器。

  • timelapse.mp4 输出视频文件的名称。

有关 ffmpeg 选项的更多信息,请在终端中运行 ffmpeg --help。

rpicam-vid

rpicam-vid 可帮助您在 Raspberry Pi 设备上捕获视频。rpicam-vid 显示预览窗口,并将编码的比特流写入指定的输出。这将生成未打包的视频比特流,该比特流未包装在任何类型的容器(例如 mp4 文件)格式中。
注意:如果可用,rpicam-vid 使用硬件 H.264 编码。
例如,以下命令将一个 10 秒的视频写入名为 test.h264 的文件:

rpicam-vid -t 10s -o test.h264

您可以使用 VLC 和其他视频播放器播放生成的文件:

vlc test.h264

在 Raspberry Pi 5 上,您可以通过为输出文件指定 mp4 文件扩展名直接输出为 MP4 容器格式:

rpicam-vid  -t 10s -o test.mp4

编码

rpicam-vid 支持动态 JPEG 以及未压缩和未格式化的 YUV420:

rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg
rpicam-vid -t 10000 --codec yuv420 -o test.data

codec选项确定输出格式,而不是输出文件的扩展名。
segment 选项将输出文件分解为段大小的块(以毫秒为单位)。通过指定非常短(1 毫秒)的段,这对于将动态 JPEG 流分解为单个 JPEG 文件非常方便。例如,以下命令将 1 毫秒的段与输出文件名中的计数器组合在一起,为每个段生成一个新文件名:

rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg

最新评论

友情链接:

返回顶部