Answers:
我认为最好通过深入了解事物的工作方式来回答这个问题。首先,请注意:无论如何,我都不是固件专家。我对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之上编写的另一个项目。