要测试树莓派摄像头,需要给树莓派接入HDMI屏幕或者DSI屏幕
树莓派主板上的CSI (摄像头) 和 DSI (显示器) 两个接口的封装是相似的,接线的时候注意不要接错了。CSI接口在音频接口和HDMI接口中间, 树莓派Zero系列的摄像头接口在Power接口边上。 如果你使用的计算模块,具体以底板的布局为准。
感光芯片型号 | 支持的树莓派主板型号 | 支持的驱动类型 |
---|---|---|
OV5647 | 所有树莓派主板 | libcamera / Raspicam |
OV9281 | 所有树莓派主板 | libcamera |
IMX219 (树莓派官方) | 所有树莓派主板 | libcamera / Raspicam |
IMX219 (第三方) | 树莓派计算模块 | libcamera |
IMX290/ IMX327 | 所有树莓派主板 | libcamera |
IMX378 | 所有树莓派主板 | libcamera |
IMX477 (树莓派官方) | 所有树莓派主板 | libcamera / Raspicam |
IMX477 (第三方) | 所有树莓派主板 | libcamera |
IMX462 | 所有树莓派主板 | libcamera |
IMX519 | 树莓派主板 | libcamera(另装驱动) |
IMX708 (树莓派Camera Module 3) | 所有树莓派主板 | libcamera |
IMX296(树莓派Global Camera) | 所有树莓派主板 | libcamera |
IMX500(树莓派AI Camera) | 所有树莓派主板 | libcamera |
如果使用的是最新的Raspberry Pi Camera Module 3 或者Raspberry Pi Global Shutter Camera,需要运行以下指令进行系统更新(需要联网操作).
sudo apt-get update -y sudo apt-get upgrade -y
如果只调用一个摄像头,请将摄像头接入到CAM1口.
如果使用的是是非树莓派官方的摄像头,均需要另外配置config.txt 文件.
如果使用的是最新的Bookworm系统,需要配置的是/boot/firmware/config.txt。
sudo nano /boot/config.txt #如果是bookworm系统 sudo nano /boot/firmware/config.txt
找到camera-auto-detect=1 语句,修改为 camera_auto_detect=0
在文件结尾,根据摄像头型号加入以下设置语句
型号 | 设置语句 |
---|---|
OV9281 | dtoverlay=ov9281 |
IMX290/IMX327/IMX462 | dtoverlay=imx290,clock-frequency=37125000 |
IMX378 | dtoverlay=imx378 |
IMX219 | dtoverlay=imx219 |
IMX477 | dtoverlay=imx477 |
IMX708 | dtoverlay=imx708 |
注意:在树莓派5上使用IMX290,还需要添加json文件到指令目录才能使用。操作如下:
sudo wget https://www.waveshare.net/w/upload/7/7a/Imx290.zip sudo unzip Imx290.zip sudo cp imx290.json /usr/share/libcamera/ipa/rpi/pisp
dtoverlay=imx219,cam0 dtoverlay=ov5647,cam1
使用Raspberry Pi AI Camera,需要确保你使用的是树莓派最新系统。
sudo apt update && sudo apt full-upgrade
sudo apt install imx500-all
sudo reboot
sudo rpicam-hello -t 0
如果要关掉预览窗口,可以直接组合按键Alt-F4,或者点击x关掉。 也可以回到终端界面,用ctrl-c终止程序。
注:如果是Camera module 3,会开启自动对焦功能
sudo rpicam-hello -t 0 --camera 0
sudo rpicam-hello -t 0 --camera 1
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
rpicam-vid -t 10s -o output.264 --post-process-file /usr/share/rpi-camera-assets/imx500_mobilenet_ssd.json --width 1920 --height 1080 --framerate 30
rpicam-hello -t 0s --post-process-file /usr/share/rpi-camera-assets/imx500_posenet.json --viewfinder-width 1920 --viewfinder-height 1080 --framerate 30
查看自己使用的系统版本是什么,请执行sudo cat /etc/os-release,看下是否有以下两个镜像的相关信息,然后再选择.
运行最新版本的 Raspberry Pi OS 时,rpicam-apps已经安装了五个基本功能。在这种情况下,官方的 Raspberry Pi 相机也将被检测并自动启用。
您可以通过输入以下内容来检查一切是否正常:
rpicam-hello
会看到一个大约五秒钟的相机预览窗口.
注意:如果运行在 Bullseye 的 Raspberry Pi 3 和更早版本的设备上,您需要重新启用 Glamor,才能使 X Windows 硬件加速预览窗口正常工作。在终端窗口中输入sudo raspi-config,然后选择Advanced Options、Glamor和Yes.退出并重新启动您的 Raspberry Pi.默认情况下,运行 Bullseye 的 Raspberry Pi 3 和更早的设备可能未使用正确的显示驱动程序。请参阅 /boot/firmware/config.txt 文件,并确保 dtoverlay=vc4-fkms-v3d or dtoverlay=vc4-kms-v3d 当前处于活动状态。如果您需要更改此设置,请重新启动。
rpicam-hello -t 0
Raspberry Pi 的libcamera有针对每种不同类型的相机模块的调谐文件。文件里的参数将传递给算法和硬件以产生最佳质量的图像。 libcamera只能自动确定正在使用的图像传感器,而不能自动确定整个模块,即使整个模块会影响“调谐”。因此,有时需要覆盖特定传感器的默认调谐文件。
例如,无红外滤光片 (NoIR) 版本的传感器需要与标准版本不同的 AWB(白平衡) 设置,因此与 Pi 4 或更早设备一起使用的 IMX219 NoIR 应使用以下方式运行:
rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx219_noir.json
Raspberry Pi 5 在不同的文件夹中使用不同的调谐文件,因此在这里您将使用:
rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/pisp/imx219_noir.json
这也意味着用户可以复制现有的调谐文件并根据自己的喜好进行更改,只要参数--tuning-file指向新版本即可。
--tuning-file参数与其他命令行选项一样,同样适用于所有rpicam-apps.
rpicam-jpeg是一个简单的静态图像捕捉应用程序。
要捕获全分辨率 JPEG 图像,请使用以下指令,这将显示大约五秒钟的预览,然后将全分辨率 JPEG 图像捕获到文件中test.jpg
rpicam-jpeg -o test.jpg
该-t <duration>选项可用于更改预览显示的时间长度,并且--width和--height选项将更改捕获的静态图像的分辨率。例如:
rpicam-jpeg -o test.jpg -t 2000 --width 640 --height 480
所有这些都rpicam-apps允许用户以固定的快门速度和增益运行相机。拍摄曝光时间为 20ms、增益为 1.5x 的图像,该增益将用作传感器内的模拟增益,直到达到内核传感器驱动程序允许的最大模拟增益,之后其余部分将用作数字增益。
rpicam-jpeg -o test.jpg -t 2000 --shutter 20000 --gain 1.5
Raspberry Pi 的 AEC/AGC 算法允许应用程序指定曝光补偿:能够通过给定的停止次数使图像变暗或变亮。
rpicam-jpeg --ev -0.5 -o darker.jpg rpicam-jpeg --ev 0 -o normal.jpg rpicam-jpeg --ev 0.5 -o brighter.jpg
数字增益由 ISP 应用,而不是由传感器应用。数字增益将始终非常接近 1.0,除非:
模拟raspistill原始应用程序的许多功能.
rpicam-still -o test.jpg
rpicam-still允许文件以多种不同的格式保存。它支持png和bmp编码。它还允许将文件保存为 RGB 或 YUV 像素的二进制转储,没有编码或文件格式。在后一种情况下,读取文件的应用程序必须了解其自身的像素排列。
rpicam-still -e png -o test.png rpicam-still -e bmp -o test.bmp rpicam-still -e rgb -o test.data rpicam-still -e yuv420 -o test.data
注意,保存图像的格式取决于-e(相当于——encoding)选项,不会根据输出文件名自动选择。
raw图是由图像传感器直接产生的图像,在ISP(图像信号处理器)或任何CPU内核对其进行任何处理之前。对于彩色图像传感器,这些通常是Bayer格式图像。请注意,原始图像与我们之前看到的经过处理但未编码的RGB或YUV图像有很大不同。
获取raw图:
rpicam-still --raw --output test.jpg
这里,-r选项(也是——raw)表示捕获原始图像和JPEG。实际上,原始图像就是生成JPEG的raw图像。原始图像以DNG (Adobe Digital Negative)格式保存,并与许多标准应用程序(如draw或RawTherapee)兼容。原始图像保存到具有相同名称但扩展名为. ng的文件中,因此是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 : 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
我们注意到只有一个校准光源(由AWB算法确定的光源,尽管它总是被标记为“D65”),并且将ISO数除以100给出正在使用的模拟增益。
为了捕捉长时间曝光的图像,请禁用AEC/AGC和AWB,因为这些算法将迫使用户在收敛时等待许多帧。
禁用它们的方法是提供显式的值。此外,可以使用——immediate选项跳过捕获的整个预览阶段。
因此,要执行100秒曝光捕捉,使用;
rpicam-still -o long_exposure.jpg --shutter 100000000 --gain 1 --awbgains 1,1 --immediate
作为参考,三款官方树莓派相机的最大曝光时间可以在这个表格中找到。
rpicam-vid可以帮助我们在树莓派设备上捕获视频。Rpicam-vid显示一个预览窗口,并将编码的比特流写入指定的输出。这将产生一个未打包的视频比特流,它没有被打包在任何类型的容器(如mp4文件)格式中。
例如,下面的命令将一个10秒的视频写入一个名为test.h264的文件:
rpicam-vid -t 10s -o test.h264
您可以使用VLC和其他视频播放器播放结果文件:
VLC test.h264
在Raspberry Pi 5上,您可以通过指定输出文件的MP4文件扩展名直接输出到MP4容器格式:
rpicam-vid -t 10s -o test.mp4
rpicam-vid支持动态JPEG以及未压缩和未格式化的YUV420:
rpicam-vid -t 10000 --codec mjpeg -o test.mjpeg rpicam-vid -t 10000 --codec yuv420 -o test.data
codec选项决定输出格式,而不是输出文件的扩展名。
segment选项将输出文件分割成段大小的块(以毫秒为单位)。通过指定非常短(1毫秒)的段,这可以方便地将运动JPEG流分解为单个JPEG文件。例如,下面的命令将1毫秒的段与输出文件名中的计数器结合起来,为每个段生成一个新的文件名:
rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg
为了尽量减少高帧率(> 60fps)视频的帧丢失,请尝试以下配置调整:
下面的命令演示了如何实现1280×720 120fps视频:
rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n
Rpicam-vid可以使用ffmpeg/libav编解码器后端对音频和视频流进行编码。您可以将这些流保存到文件中,也可以通过网络将它们流式传输。
要启用libav后端,将libav传递给 codec 选项:
rpicam-vid --codec libav --libav-format avi --libav-audio --output example.avi
要使用树莓派作为服务器在UDP上流式传输视频,使用以下命令,将< IP -addr>占位符替换为客户端或多播地址的IP地址,并将<port>占位符替换为您想要用于流式传输的端口:
rpicam-vid -t 0 --inline -o udp://<ip-addr>:<port>
使用树莓派作为客户端通过UDP查看视频流,使用以下命令,将<port>占位符替换为您想要流式传输的端口:
vlc udp://@:<port> :demux=h264
或者,在客户端使用以下命令使用ffplay进行流:
ffplay udp://<ip-addr-of-server>:<port> -fflags nobuffer -flags low_delay -framedrop
还可以通过TCP传输视频。使用树莓派作为服务器:
rpicam-vid -t 0 --inline --listen -o tcp://0.0.0.0:<port>
使用树莓派作为客户端通过TCP查看视频流,使用以下命令:
vlc tcp/h264://<ip-addr-of-server>:<port>
或者,在客户端使用以下命令以每秒30帧的速度使用ffplay流:
ffplay tcp://<ip-addr-of-server>:<port> -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
要使用VLC通过RTSP传输视频,使用树莓派作为服务器,使用以下命令:
rpicam-vid -t 0 --inline -o - | cvlc stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/stream1}' :demux=h264
使用树莓派作为客户端查看RTSP上的视频流,使用以下命令:
ffplay rtsp://<ip-addr-of-server>:8554/stream1 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop
或者在客户端使用以下命令使用VLC进行流:
vlc rtsp://<ip-addr-of-server>:8554/stream1
如果需要关闭服务器上的预览窗口,使用nopreview命令。
使用内联标志强制流报头信息进入每个内帧,这有助于客户端在错过开头时理解流。
rpicam-raw直接从传感器将视频记录为原始的 Bayer帧。它不显示预览窗口。将两秒钟的原始剪辑记录到一个名为test.raw的文件中,执行如下命令:
rpicam-raw -t 2000 -o test.raw
Rpicam-raw输出没有任何格式信息的原始帧。应用程序将像素格式和图像尺寸打印到终端窗口,以帮助用户解析像素数据。
默认情况下,rpicam-raw在单个可能非常大的文件中输出原始帧。使用segment选项将每个原始帧定向到一个单独的文件,使用%05d指令使每个帧文件名唯一:
rpicam-raw -t 2000 --segment 1 -o test%05d.raw
通过快速存储设备,rpicam-raw可以以10fps的速度将18MB的1200万像素HQ相机帧写入磁盘。rpicam-raw无法将输出帧格式化为DNG文件;要实现这个功能,请使用 rpicam-still以低于10的帧率选项来避免掉帧的情况:
rpicam-raw -t 5000 --width 4056 --height 3040 -o test.raw --framerate 8
有关原始格式的更多信息,请参阅mode文档。
注意:树莓派操作系统不包含rpicam-detect。如果您已经安装了TensorFlow Lite,则可以构建rpicam-detect。有关更多信息,请参见rpicam-apps构建说明。不要忘记在运行cmake时传递-DENABLE_TFLITE=1。
rpicam-detect显示一个预览窗口,并使用Google MobileNet v1 SSD (Single Shot Detector)神经网络来监控内容,该神经网络经过训练,可以使用Coco数据集识别大约80类对象。Rpicam-detect可以识别人、汽车、猫和许多其他物体。
每当rpicam-detect检测到目标对象时,它就捕获一个全分辨率JPEG。然后返回到监控预览模式。
有关模型使用的一般信息,请参阅TensorFlow Lite对象检测器部分。例如,当你外出时,你就能监视你的猫:
rpicam-detect -t 0 -o cat%04d.jpg --lores-width 400 --lores-height 300 --post-process-file object_detect_tf.json --object cat
rpicam-hello -h
rpicam-hello --version
示例输出:
rpicam-apps build: ca559f46a97a 27-09-2021 (14:10:24) libcamera build: v0.0.0+3058-c29143f7
rpicam-hello --list-cameras
传感器模式标识符有以下形式:
S<Bayer order><Bit-depth>_<Optional packing> : <Resolution list>
裁剪在原生传感器像素(即使在像素分割模式下)中指定为(<x>, <y>)/<Width>×<Height>。(x, y)指定 width × height大小的裁剪窗口在传感器阵列中的位置。
例如,以下输出显示索引为0的IMX219传感器和索引为1的IMX477传感器的信息:
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]
rpicam-hello --list-cameras 0 rpicam-hello --list-cameras 1
timeout=99000 verbose=
注意:省略通常在命令行中使用参数的前缀--。对于缺少值的标志,例如上面示例中的verbose,必须包含尾随的=。
然后可以运行以下命令,来指定99000毫秒的超时和详细输出:
rpicam-hello --config example_configuration.txt
rpicam-hello -t
指定应用程序在关闭前运行多长时间。这适用于视频录制和预览窗口。当捕获静止图像时,应用程序在捕获输出图像之前显示一个超时毫秒的预览窗口。
rpicam-hello -t 0
以以下逗号分隔的形式传递预览窗口尺寸:x,y,w,h
rpicam-hello --preview 100,100,500,500
rpicam-hello -f
rpicam-hello --qt-preview
rpicam-hello --nopreview
默认值: "#%frame (%fps fps) exp %exp ag %ag dg %dg"
在桌面环境中运行时,将提供的字符串设置为预览窗口的标题。支持以下图像元数据替换:
指令 | 说明 |
---|---|
%frame | 帧序列号 |
%fps | 瞬时帧速率 |
%exp | 捕捉图像时的快门速度, 单位是ms |
%ag | 感光芯片控制的图像模拟增益 |
%dg | 通过ISP控制的图像数值增益 |
%rg | 每个像素点红色组件的增益 |
%bg | 每个像素点蓝色组件的增益 |
%focus | 图像的角点度量,数值越大表示图像越清晰 |
%lp | 当前镜头的屈光度 (1/米为单位的距离) |
%afstate | 自动对焦状态 (idle, scanning, focused, failed) |
rpicam-hello --info-test "Focus measure: %focus"
每个都接受一个单独的数字来定义所捕获图像的尺寸(以像素为单位)。
对于rpicam-still、rpicam-jpeg和rpicam-vid,指定输出分辨率。
对于rpicam-raw,指定原始帧分辨率。对于具有2×2 bin读出模式的相机,指定一个等于或小于bin模式的分辨率捕获2×2 bin原始帧。
对于rpicam-hello没有效果。
录制1080p的视频
rpicam-vid -o test.h264 --width 1920 --height 1080
捕获2028×1520分辨率的JPEG。如果与HQ相机一起使用,则使用2×2 bin模式,因此原始文件(test. ng)包含2028×1520原始Bayer图像。
rpicam-still -r -o test.jpg --width 2028 --height 1520
每个参数都能接受一个数字,以像素为单位定义预览窗口中显示的图像的尺寸。不影响预览窗口的尺寸,因为图像会调整大小以适应。不影响捕获的静止图像或视频。
rpicam-still --viewfinder-width 1920 --viewfinder-height 1080
Bit-depth和packing是可选的,Bit-depth默认是12,Packing默认为P(已打包)。
有关传感器可用的位深度、分辨率和packing选项的信息,请参见list-cameras。
如下所示:
提供来自相机的第二个低分辨率图像流,按比例缩小到指定的尺寸。每个都接受一个数字来定义低分辨率流的维度(以像素为单位)。可用于预览和视频模式。不提供静态捕获。对于rpicam-vid,禁用额外的颜色去噪处理。对结合图像后处理的图像分析有用。
rpicam-hello --lores-width 224 --lores-height 224
rpicam-hello --hflip -t 0
rpicam-hello --vflip -t 0
rpicam-hello --rotation 0
这些值定义了以下比例:
<x>:在提取图像之前要跳过的x坐标
<y>:在提取图像之前要跳过的y坐标
<w>:要提取的图像宽度
<h>:要提取的图像高度
默认为0,0,1,1(从第一个X坐标和第一个Y坐标开始,使用100%的图像宽度,使用100%的图像高度)。
例子:
rpicam-hello --roi 0.25,0.25,0.5,0.5选择从图像中心裁剪的像素总数的一半(跳过前25%的X坐标,跳过前25%的Y坐标,使用图像总宽度的50%,使用图像总高度的50%)。
rpicam-hello --roi 0,0,0.25,0.25选择从图像左上角裁剪的像素总数的四分之一(跳过X坐标的前0%,跳过Y坐标的前0%,使用图像宽度的25%,使用图像高度的25%)。
rpicam-hello --hdr
使用板载HDR模式,如果可用,即使传感器有一个内置的HDR模式。如果板载HDR模式不可用,则禁用HDR。
Raspberry Pi 5及更高版本的设备具有板载HDR模式。
要检查传感器中内置的HDR模式,将此选项添加到列表相机中。
以下选项控制影响相机图像质量的图像处理和算法。
设置图像清晰度。接受以下范围内的数值:
rpicam-hello --sharpness 0.0
指定图像对比度。接受以下范围内的数值:
rpicam-hello --contrast 0.0
指定图像亮度,作为输出图像中所有像素的偏移量添加。接受以下范围内的数值:
对于更多的用法,推荐ev。
rpicam-hello --brightness 1.0
指定图像颜色饱和度。接受以下范围内的数值:
rpicam-hello --saturation 0.6
指定图像的曝光值(EV)补偿。接受一个数值,该数值控制沿着以下频谱传递给自动曝光/增益控制(AEC/AGC)处理算法的目标值:
rpicam-hello --ev 10.0
指定使用快门的曝光时间,以微秒为单位。当您使用此选项时,增益仍然可以变化。如果相机运行的帧率太快,它不允许指定的曝光时间(例如,帧率为1fps,曝光时间为10000微秒),传感器将使用帧率允许的最大曝光时间。
有关官方相机的最小和最大快门时间列表,请参阅相机硬件文档。高于最大值的值会导致未定义的行为。
rpicam-hello --shutter 10000
analoggain与gain的效果是一样的
设置组合模拟和数字增益。当传感器驱动可以提供所要求的增益时,只使用模拟增益。当模拟增益达到最大值时,ISP应用数字增益。接受数值。
有关官方摄像机的模拟增益限制列表,请参阅摄像机硬件文档。
有时,即使在不超过模拟增益限制的情况下,数字增益也会超过1.0。这可能发生在以下情况:
其中任何一个颜色增益低于1.0,这将导致数字增益稳定在1.0/min(红增益,蓝增益)。这使总数字增益应用于任何高于1.0的颜色通道,以避免变色伪影。
自动曝光/增益控制(AEC/AGC)变化时的轻微差异。
rpicam-hello --gain 0.8
设置自动曝光/增益控制(AEC/AGC)算法的测光模式。接受以下值:
有关定义自定义测光模式和在现有测光模式中调整区域权重的更多信息,请参阅Raspberry Pi相机和libcamera的调谐指南。
rpicam-hello --metering centre
设置曝光配置文件。更改曝光配置文件不应影响图像曝光。相反,不同的模式调整增益设置,以达到相同的净结果。接受以下值:
您可以使用调谐文件编辑曝光配置文件。有关更多信息,请参阅Raspberry Pi相机和libcamera的调谐指南。
rpicam-hello --exposure sport
设置曝光配置文件。更改曝光配置文件不应影响图像曝光。相反,不同的模式调整增益设置,以达到相同的最终结果。接受以下值: 可用的白平衡模式:
模式 | 色温 |
---|---|
auto | 2500K ~ 8000K |
incadescent | 2500K ~ 3000K |
tungsten | 3000K ~3500K |
fluorescent | 4000K ~ 4700K |
indoor | 3000K ~ 5000K |
daylight | 5500K ~ 6500 K |
cloudy | 7000K ~ 8500K |
custom | 自定义范围, 通过调谐文件设置 |
这些值只是近似值:值可能会根据相机调整而变化。
没有模式完全禁用AWB。相反,你可以用awbgains来修正颜色增益。
有关AWB模式的更多信息,包括如何定义自定义模式,请参阅Raspberry Pi相机和libcamera的调谐指南。
rpicam-hello --awb auto
设置一个固定的红蓝增益值来代替自动白平衡(AWB)算法。设置非零值禁用AWB。接受以逗号分隔的数字输入,格式如下:<red_gain>,<blue_gain>
rpicam-jpeg -o test.jpg --awbgains 1.5,2.0
默认值:auto
设置去噪模式。接受以下值:
即使是快速的色彩降噪也会降低帧率。高质量的色彩降噪显著降低了帧率。
rpicam-hello --denoise off
指定摄像机调谐文件。调整文件允许您控制图像处理的许多方面,包括自动曝光/增益控制(AEC/AGC),自动白平衡(AWB),色彩阴影校正,色彩处理,去噪等等。接受调谐文件路径作为输入。 有关调谐文件的详细信息,请参见调谐文件。
默认值:default 指定自动对焦模式。接受以下值:
此选项仅支持某些相机模块。
rpicam-hello --autofocus-mode auto
默认值:normal
指定自动对焦范围。接受以下值:
此选项仅支持某些相机模块。
rpicam-hello autofocus-range normal
默认值:normal
指定自动对焦速度。接受以下值:
此选项仅支持某些相机模块。
rpicam-hello --autofocus-speed normal
指定传感器全域内的自动对焦窗口。接受四个十进制值,范围从0到1,格式如下:<x>,<y>,<w>,<h>。这些值中的每一个都以0到1之间的小数表示可用宽度和高度的百分比。
这些值定义了以下比例:
<x>:在应用自动对焦之前要跳过的x坐标
<y>:在应用自动对焦之前要跳过的y坐标
<w>:自动对焦区域宽度
<h>:自动对焦区域高度
默认值在两个维度中使用输出图像的中间三分之一(总图像区域的1/9)。
例子:
rpicam-hello—autofocus-window 0.25,0.25,0.5,0.5
选择从图像中心裁剪的像素总数的一半(跳过前25%的X坐标,跳过前25%的Y坐标,使用图像总宽度的50%,使用图像总高度的50%)。
rpicam-hello—autofocus-window 0,0,0.25,0.25
选择从图像左上角裁剪的像素总数的四分之一(跳过X坐标的前0%,跳过Y坐标的前0%,使用图像宽度的25%,使用图像高度的25%)。
此选项仅支持某些相机模块。
默认值:default 将镜头移动到一个固定的焦距,通常以屈光度表示(单位为1/米距离)。接受以下值范围:
镜头校准并不完善,因此同一型号的不同相机模块可能会有所不同。
别名:-v
默认值:1 设置详细程度。接受以下值:
rpicam-hello --verbose 1
更详细的资料,点击这里参考。
树莓派官方提供的picamera2库是针对libcamera 驱动提供的 python库。
注意:Picamera2仅支持Raspberry Pi OS Bullseye 镜像。
安装picamera2,Picamera2 现已预装在最新的几版Raspberry Pi OS Bullseye镜像中,您可以通过终端做以下操作来更新库:
sudo apt update sudo apt upgrade sudo apt install -y python3-picamera2
使用前需要先打开终端输入以下指令,来检查摄像头是否正常工作
libcamera-hello -t 0
所有参数都是可选的,如果省略,将选择默认值。以下示例将放置一个800x600像素的预览窗口位于显示屏上的(100,200),并将水平镜像相机预览图像:
from picamera2 import Picamera2, Preview from libcamera import Transform picam2 = Picamera2() picam2.start_preview(Preview.QTGL, x=100, y=200, width=800, height=600, transform=Transform(hflip=1)) picam2.start()
注意:这里的显示转换对实际图像并没有任何影响,在上面的示例中,必须在调用picam2.start()之前调用start_preview()函数,如果相机的图像与预览窗口的长宽比不同,它们将被变成letter-boxed或者pillar-boxed式以使图像保持合适的长宽比
通常是预览窗口通过接收和传递相机图像来驱动libcamera系统到应用程序,然后在用户不再需要这些缓冲区时将它们回收回libcamera。结果是,即使没有显示预览图像,仍然需要运行一些东西来接收和返回这些相机图像。这正是无预览所做的。它什么也没有显示,它只是驱动摄像系统。如果系统尚未运行预览,则必须提前开启备用预览窗口。实际上每当启动相机系统 (picam2.start())时,都会自动启动无预览。您可以开启无预览显示,像这样:
from picamera2 import Picamera2, Preview picam2 = Picamera2() picam2.start_preview(Preview.NULL)
start_preview函数的第一个参数可以采用以下值:
不建议开始和停止预览窗口同时进行,因为在此期间摄像头帧很可能被丢弃。Start函数会接受一个show_preview形参,该形参可以是这些相同值中的任意一个。这是只是一种简写,可以减少代码的书写量。注意,停止相机(Picamera2.stop)不会停止预览窗口,因此必须在此之前显式调用stop_preview函数,例如,下面的脚本将启动相机系统运行,运行一会儿,然后尝试自动检测要使用哪个预览窗口,以便实际开始显示图像:
from picamera2 import Picamera2, Preview import time picam2 = Picamera2() config = picam2.create_preview_configuration() picam2.configure(config) picam2.start() #启动相机捕获 time.sleep(2) #为等待相机初始化完成延迟2秒 picam2.stop_preview() #停止相机预览,防止占用资源,从而开启相机失败 picam2.start_preview(True) #开启相机预览 time.sleep(2) #两秒后关闭相机
Picamera2有一些高级和非常方便的功能,用于捕获图像和视频录制。寥寥几句代码便可实现捕获图像:
from picamera2 import Picamera2 picam2 = Picamera2() picam2.start_and_capture_file("test.jpg")
也可以使用start_and_capture_files函数捕获多个图像,或者录制一个五秒钟的视频:
from picamera2 import Picamera2 picam2 = Picamera2() picam2.start_and_record_video("test.mp4", duration=5)
如果想了解底层代码,您可以参考以下代码:
from picamera2 import Picamera2, Preview import time picam2 = Picamera2() # 创建一个 Picamera2 实例 camera_config = picam2.create_preview_configuration() # 创建摄像头预览配置 picam2.configure(camera_config) # 配置摄像头 picam2.start_preview(Preview.QTGL) # 启动摄像头预览(使用 QTGL 预览窗口管理器) picam2.start() # 启动摄像头 time.sleep(2) # 等待 2 秒,确保摄像头已启动 picam2.capture_file("test.jpg") # 拍摄照片并保存为 "test.jpg"
Picamera2提供了许多配置生成方法,可用于提供合适的配置,常见的用例如下:
例如,设置摄像头,让它开始传送你可能会用到的预览图像流:
from picamera2 import Picamera2 picam2 = Picamera2() config = picam2.create_preview_configuration() picam2.configure(config) picam2.start()
from picamera2 import Picamera2 from libcamera import Transform picam2 = Picamera2() preview_config = picam2.create_preview_configuration(transform=Transform(hflip=True))
>>> from libcamera import ColorSpace >>> ColorSpace.Sycc() <libcamera.ColorSpace 'sYCC'> >>> ColorSpace.Rec709() <libcamera.ColorSpace 'Rec709'>
这些实际上是Pi的相机系统所支持的唯一色彩空间。所需的选择可以传递给所有使用 color_space 关键字参数的配置生成方法:
from picamera2 import Picamera2 from libcamera import ColorSpace picam2 = Picamera2() preview_config = picam2.create_preview_configuration(colour_space=ColorSpace.Sycc())
当省略时,Picamera2将根据用例选择默认值:
•create_preview_configuration和create_still_configuration将默认使用sYCC颜色空间平均sRGB原色和传递函数和全范围BT.601 YCbCr编码)。
•如果主流请求RGB格式,create_video_configuration将选择sYCC。对于YUV格式,如果分辨率小于1280x720,它会选择SMPTE 170M,否则选择Rec.709。
from picamera2 import Picamera2 picam2 = Picamera2() preview_config = picam2.create_still_configuration(buffer_count=2)
from picamera2 import Picamera2 picam2 = Picamera2() preview_config = picam2.create_preview_configuration(queue=False)
注意,当buffer_count设置为1时(仍然是捕获配置的默认情况),则没有帧永远排队(因为唯一的缓冲区会完全停止相机管道)。
from picamera2 import Picamera2 picam2 = Picamera2() config = picam2.create_still_configuration(lores={"size": (320, 240)}, display="lores")
这将请求一个全分辨率的主流,但随后也会显示一个QVGA图像流(即使应用程序没有显式地请求,主流也总是被定义的)。display参数可以取None值,这意味着没有图像将被呈现到预览窗口。事实上,这是create_still_configuration方法的默认选择。
from picamera2 import Picamera2 picam2 = Picamera2() config = picam2.create_video_configuration(main={"size": (2048, 1536)}, lores={"size": (320, 240)}, encode="lores")
这将允许录制QVGA流,同时允许同时捕获2048 × 1536静态图像。encode参数也可以取值None,这也是create_still_configuration的默认选择方法。
自动对焦控制和其他控制一样遵循同样的一般规则。只要使用libcamera的版本(如libcamera),这些控件就可以正常工作(由Raspberry Pi提供)正确地实现了libcamera发布的自动对焦API,以及附加的相机模块实际上有自动对焦(如树莓派相机模块3)。 不支持自动对焦的相机模块(包括早期的树莓派相机模块和HQ相机)这些选项不可用(在 Picamera2.camera_controls属性中),当尝试设置会显示失败。 以下为将相机设置为连续自动对焦模式:
from picamera2 import Picamera2 from libcamera import controls import time picam2 = Picamera2() config = picam2.create_preview_configuration() picam2.configure(config) picam2.start(show_preview=True) picam2.set_controls({"AfMode": controls.AfModeEnum.Continuous}) time.sleep(2)
Picamera2对USB摄像头(如网络摄像头)的支持有限。可以连接多个USB摄像头和CSI2摄像头(后者连接到Pi的专用摄像头端口),可以用通常的方式创建Picamera2对象,但是只有主流可用。支持的格式将取决于相机,但Picamera2原则上可以处理MJPEG和YUYV相机,在哪里相机支持两种格式,您可以通过请求格式“MJPEG”或“YUYV”来选择。 USB相机只能使用软件渲染的Qt预览窗口(preview . Qt)。没有硬件辅助支持渲染。MJPEG流可以直接渲染,但是YUYV需要安装OpenCV以便将图像转换为Qt可以理解的格式。这两种情况都将使用大量额外的CPU。capture_buffer方法将为你提供每帧的原始相机数据(来自MJPEG相机的JPEG比特流,或来自YUYV相机的未压缩YUYV图像)。如下:
from picamera2 import Picamera2, Preview picam2 = Picamera2() config = picam2.create_preview_configuration({"format": "MJPEG"}) picam2.configure(config) picam2.start_preview(Preview.QT) picam2.start() jpeg_buffer = picam2.capture_buffer()
如果您有多个相机,需要发现要打开哪个摄像头,请使用Picamera2.global_camera_info方法。一般来说,用户应该假设其他功能,如视频录制,摄像头控制是支持的树莓派(Raspberry Pi)摄像头等等都是不可用的。USB摄像头也不支持热插拔, 当增加或减少摄像头时,应完全关闭并重新启动。
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841