Raspberry Pi相机-什么时候准备下一帧


8

当使用C ++raspicam api之类的api时,可以使用grab()或类似方法对摄像机进行轮询。准备好框架后,该方法将返回。有没有一种方法可以在不抓住镜框的情况下检查相机是否准备就绪?

这可以是命令行工具,C ++调用,Python库或任何方法。

我问是因为我有4个带有4个摄像头的树莓pis,并且想在每个时间完全相同的时间拍摄逐帧视频。相机的速度不足以让我的应用程序以其他方式执行此操作。

Answers:


2

我认为最好通过深入了解事物的工作方式来回答这个问题。首先,请注意:无论如何,我都不是固件专家。我对Pi相机模块的工作原理有相当粗略的了解,是基于我编写picamera库并在Pi论坛上与知识渊博的固件开发人员进行交互的经验。如果您从固件开发人员那里听到矛盾的信息,那么这是他们的权力,不是我!这样就不会了...

Pi的相机模块初始化后,即会捕获帧。这些帧(就最终用户而言)已转储,但在相机固件内还有很多事情要做。对帧进行测量,以确定要应用于传感器(AGC)的增益,要馈送到AWB校正算法的白平衡等。例如,如果启动相机并立即开始记录,通常会看到白平衡会在录制的前几帧内进行校正:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    camera.start_recording('video1.h264')
    time.sleep(5)
    camera.stop_recording()

但是,如果在开始录制之前稍加延迟,您会发现到录制开始时白平衡已经稳定:

import picamera
import time

with picamera.PiCamera() as camera:
    camera.resolution = (1280, 720)
    time.sleep(5)
    camera.start_recording('video2.h264')
    time.sleep(5)
    camera.stop_recording()

因此,考虑到即使我们不捕获图像或录制视频,相机也始终在捕获帧,所以当我们选择捕获图像时会发生什么实际情况?我们告诉固件激活捕获,然后固件等待下一帧完成,然后再传回给我们(实际上,如果您是从静止端口而不是视频端口捕获图像,则还有很多其他事情,包括模式切换,但是您担心视频端口,因此我们可以忽略它)。

考虑一下这对同步意味着什么(您的特定用例)。相机尚未“准备好”在任何特定点捕获帧。它已经在捕获一帧,当您要一个帧时,它将交给您下一帧可用的完整帧。为了同步摄像机的帧,所有摄像机都必须在同一时间初始化,然后它们的内部时钟必须精确地同步运行(摄像机具有自己的内部时钟;它们不依赖于Pi的时钟)。

可悲的是,我认为这真的不是现实的前景。如果我没记错的话,Pi计算模块(板载2个摄像头端口,同时支持2个摄像头模块)会使用固件中的一些特殊调用来使2个模块使用单个时钟信号(我不知道该怎么做)在硬件级别上工作,但我认为它使用的是特定于计算模块的功能);我无法想象你会如何在4个Pis之间做类似的事情。

更新:

我应该补充说,可以使用一些合理的网络知识(例如UDP广播数据包)进行粗略同步。换句话说,有可能使网络上的所有Pi相互之间在一毫秒内触发捕获(假设像以太网这样的低延迟网络这样的设备),但是如上所述,这仍然不能保证所有摄像机都会同时捕获一帧;最终捕获的开始时间之间最多会有一帧的延迟(加上网络延迟)。

如果这种同步水平足以满足人们的需求,那么他们可能想看看compoundpi项目,这是我为此在picamera之上编写的另一个项目。


您能说说静止模式(不是视频)下的多摄像机“帧同步”吗?我猜想即使是静止图像,传感器也可能再次以“自由运行”模式运行,只是具有完整的分辨率和较低的FPS(也许是15 FPS?与30 FPS视频相比,帧时滞更长)。您能够确认这个假设吗?我对C ++解决方案感兴趣,因为Python仅在此之上增加了一定程度的时间不确定性……
Kozuch

在随后的几年中,我学到了很多东西,应该在某个时候更新此答案。首先,断言计算模块的双摄像头已经同步是错误的:没有,它们只是同步启动,最终(超过几个小时)会分开。在静止图像上,相机一直在传输帧,直到捕获为止,然后在捕获过程中将模式切换到传感器模式2或3(取决于帧速率)。
戴夫·琼斯

根据相机固件开发人员的反馈,我一直在为下一个picamera版本编写相机硬件一章扩展版本 -值得一读(尽管仍不完整),因为它涵盖了一些细节。
戴夫·琼斯

您的文档读物很广,但是我现在没有足够的资源深入研究它们-我只是快速阅读了一下。我看到同时有视频和静止模式(静止端口)。我们了解视频端口(自由运行的传感器),但是您能否解释一下该端口的含义以及其工作原理?能否以某种方式将其用于视频端口的更精确的触发(较小的快门滞后)?我向raspicam C ++开发人员询问了相同的主题,但还没有答案。
Kozuch

否:静态端口只是MMAL伪像,它会导致GPU上的不同成像管道产生“更好”的静态输出。因此,在使用静止端口进行捕捉时,会暂时切换传感器模式,使用更强的降噪算法,等等。它不会给您带来任何快门迟滞差异(如果有的话,模式切换可能会使它变得复杂)。
戴夫·琼斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.