picamera2
- requirements简介
- preview windows预览窗口
- GtGL preview【有 x windwows情况下 + 硬件加速】
- Qt preview【软件加速】
- DRM/KMS preview【没有 x windwows情况下】
- NULL preview
- preview的一些其他特征
- 配置camera
- 配置的细节
- 捕捉图像capture images
- 切换模式
requirements简介
- 树莓派OS Bullsye和之后的的images镜像 默认运行libcamera camera stack,这是Picamera2所必需的。可以通过打开一个命令窗口并输入:
libcamera-hello
- 截至2022年9月中旬,Picamera2已预装在所有树莓派操作系统图像中。您可以通过完整的系统更新来更新,或通过终端:
sudo apt install -y python3-picamera2
3.对于树莓派OS用户,这将包含所有的X Windows和GUI依赖项,但这些将在树莓派OS Lite中被省略。如果OS Lite用户希望使用这些功能,他们应该运行:
sudo apt install -y python3-pyqt5 python3-opengl
preview windows预览窗口
四种预览窗口
- QtGL
- QT
- DRM/KMS
- NULL
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()
有以下操作:
• Transform() - 等价转换,默认
• Transform(hflip=1) - horizontal flip 水平反转
• Transform(vflip=1) - vertical flip 垂直翻转
• Transform(hflip=1, vflip=1) - horizontal and vertical flip (equivalent to a 180 degree rotation)180°翻转
- 重要的是要意识到,这里讨论的显示变换对从相机接收到的实际图像没有任何影响。
接下来的重点是 QtGL | Qt | DRM/KMS preview
GtGL preview【有 x windwows情况下 + 硬件加速】
- 这个预览窗口使用Qt GUI工具包实现,并使用GLES硬件图形加速。当使用X Windows时,它是在屏幕上显示图像的最有效的方式,我们会在几乎所有的Picamera2库3.1中推荐它。预览窗口参数是指需要X Windows时的9种情况。
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.QTGL)
当图像需要显示在远程显示器上(未连接到Pi)时,不建议使用QtGL预览窗口
Qt preview【软件加速】
- 与QtGL预览一样,这个窗口也使用Qt框架实现,但这次使用的是软件渲染,而不是3D硬件加速。因此,它在计算上是昂贵的,并且应该尽可能地避免使用。
当使用VNC时:
- 如果你还有一个显示器直接连接到树莓派,QtGL(硬件加速)窗口工作充分。
- 如果你没有一个显示器直接连接到Pi,QtGL预览将工作得很差,此时应该使用Qt预览窗口
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.QT)
什么时候用呢:
- Qt预览的主要用例是: 使用X转发或使用VNC远程桌面软件在另一台联网的计算机上显示预览窗口。在这些条件下,3d-硬件加速实现要么根本不工作,要么工作得不是很好。
DRM/KMS preview【没有 x windwows情况下】
-
DRM/KMS预览窗口用于X窗口不运行时,相机系统可以在显示屏上租用一个“layer”来显示图形。
-
因为X Windows未运行,所以无法使用鼠标移动或调整此窗口的大小。DRM/KMS预览版将是树莓派OS Lite用户的自然选择。它也强烈推荐给低功率的树莓派,因为通过X Windows显示堆栈进行预览(例如每秒30帧)代价昂贵。
from picamera2 import Picamera2, Preview
picam2 = Picamera2()
picam2.start_preview(Preview.DRM)
如果您没有运行或挂起X-Winidows,但仍然有一个显示屏连接着树莓派,您可以登录到Pi而不需要x转发,并使用DRM/KMS预览实现。画面将出现在直接连接到Pi的显示器上。
x-windows应该是将树莓派的图像 转发到remote类似的软件级别app上。
NULL preview
通常是预览窗口通过接收相机图像,将其传递给应用程序中间商 传递,用户不再需要它们时再回收这些缓冲区,从而驱动自由摄像头系统。其结果是,即使preview图像没有被展示,仍然需要运行一些东西才能接收这些相机图像,然后返回这些相机图像。这正是空的预览所做的。它什么也不显示;它只是驱动着摄像系统。实际上,如果还没有预览运行,只要相机系统启动(picam2.start()),空预览就会自动启动,这就是为什么必须提前启动替代预览窗口!!
- 注意:不建议自行启动和停止预览窗口,因为打开和关闭窗口可能相当昂贵,在此期间,相机帧可能会被丢弃。
from picamera2 import Picamera2, Preview
import time
picam2 = Picamera2()
config = picam2.create_preview_configuration()
picam2.configure(config)
picam2.start()
time.sleep(2)
picam2.stop_preview()
picam2.start_preview(True)
time.sleep(2)
- 值得注意的是,如果您停止预览,然后没有重新启动另一个,或者没有立即启动另一个,就不会发生任何特别糟糕的情况。所有可用的缓冲区将被自由相机图像填充。但是没有预览运行,没有任何东西会读出这些图像并回收缓冲区,所以libcamera只会停止。当预览重新启动时,正常的操作将恢复,从那些仍在排队等待读取之前的的相机图像开始读取。
- 许多程序员都会熟悉事件循环的概念。每种类型的预览窗口都实现了一个事件循环,以将帧从相机中pop出队列,因此当没有其他事件循环(如Qt提供的事件循环)运行时,NULL预览将执行此功能。
preview的一些其他特征
- 设置窗口title
from picamera2 import Picamera2
picam2 = Picamera2()
picam2.start(show_preview=True)
picam2.title_fields = ["ExposureTime", "AnalogueGain"]
配置camera
一旦创建了一个Picamera2对象,一般的模式是必须为相机生成一个配置,该配置必须应用于相机系统(使用Picamera2.configure方法),然后就可以启动相机系统。
- [设置配置,应用配置,启动相机]
- 一旦创建了一个配置对象,应用程序就可以在调用picam2.configure 之前自由地更改该对象的建议参数。配置只是Python字典,我们很容易检查它们并查看它们在说什么。
- Picamera2.create_preview_configuration将生成一个适合于在显示器上显示相机预览图像的配置,或在捕获静止图像之前
- Picamera2.create_still_configuration将生成一个适合捕获高分辨率静止图像的配置
- Picamera2.create_video_configuration将生成一个适合录制视频文件的配置
配置的细节
事件的顺序如下:
- 在左边是相机模块,它通过flat ribbon cable将图像传送到Pi。照相机提供的图像不是人类可以看到的图像,但需要做大量的工作来清理它们,并产生一幅真实的图像。
- Pi上一个称为CSI-2接收器的硬件将传入的相机图像传输到内存中。
- Pi有一个图像信号处理器(ISP),它可以从内存中读取该图像。它对从相机接收到的像素执行所有这些清洗和处理步骤。
- ISP可以为相机的每一个输入帧产生最多两个输出图像。我们将其中一个指定为主映像main image,它可以是RGB或YUV格式。
- 第二幅图像是一幅较低分辨率的图像,通常被称为 lore image;它必须是YUV格式的。它也必须不大于主图像。
- 最后,从传感器接收到并直接写入存储器的图像数据也可以发送到应用程序。这叫做原始图像–bayer 阵列图。
- 对于lores流,实际上只使用了“YUV420”。
因此,Picamera2的配置分为:
- 全局适用于Picamera2系统和跨整个ISP的一般参数。
- ISP中的每个流配置,以确定主流和循环流的输出格式和大小。我们注意到,主流总是被定义并交付给应用程序,如果应用程序没有显式地请求一个流,则使用默认值。
- 此外,原始流与其他流有很大的不同,因为它影响了更直接地驱动图像传感器的模式,因此对此有一些单独的讨论。
- 通常情况下,配置不包括可以在运行时更改的相机设置(如亮度或对比度)。但是,某些用例有时确实对这些某些控制值有特定的首选项,它们可以作为配置的一部分存储,以便应用配置也会自动应用运行时控件。
捕捉图像capture images
- capture arrays
- capture images
- capture buffers
相机图像通常用numpy数组表示,所以熟悉numpy将会有所帮助。这也是OpenCV使用的表示,因此picamera2、numpy和OpenCV都可以无缝地一起工作。
当捕获图像时,Picamera2函数在其捕获函数中使用以下命名法:
- arrays:这些是像素的二维像素数组,通常是操作图像最方便的方法。它们通常是三维的numpy数组,因为每个像素都有几个颜色通道,从而增加了另一个维度。
from picamera2 import Picamera2
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
The Picamera2 Library
6.1. Capturing images 31
array = picam2.capture_array("main")
- images:这指的是Python PIL Image对象
from picamera2 import Picamera2
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
image = picam2.capture_image("main")
- buffers:缓冲区我们只是指整个内存块图像存储为一维numpy数组,但二(或三维)数组形式通常是更有用的。
还有捕获功能,可以将图像直接保存到文件中,并在相机模式之间切换,从而将快速帧率预览与高分辨率捕获相结合。
那么如何进行切换?
切换模式
from picamera2 import Picamera2
import time
picam2 = Picamera2()
capture_config = picam2.create_still_configuration()
picam2.start(show_preview=True)
time.sleep(1)
array = picam2.switch_mode_and_capture_array(capture_config, "main")
这将切换到高分辨率捕获模式,并返回numpy数组,然后将自动切换回预览模式,无需任何用户干预。
当然如果不自动切回去原模式:
from picamera2 import Picamera2
import time
picam2 = Picamera2()
preview_config = picam2.create_preview_configuration()
capture_config = picam2.create_still_configuration()
picam2 = picam2.configure(preview_config)
picam2.start(show_preview=True)
time.sleep(1)
picam2.switch_mode(capture_config)
array = picam2.capture_array("main")
picam2.switch_mode(preview_config)
直接存为文件
from picamera2 import Picamera2
import time
picam2 = Picamera2()
capture_config = picam2.create_still_configuration()
picam2.start(show_preview=True)
time.sleep(1)
picam2.switch_mode_and_capture_file(capture_config, "image.jpg")
存储于内存缓冲中
from picamera2 import Picamera2
import io
import time
picam2 = Picamera2()
picam2.start()
time.sleep(1)
data = io.BytesIO()
picam2.capture_file(data, format='jpeg')