Я думаю, что лучше всего ответить на этот вопрос, дав некоторое представление о том, как все работает немного ниже. Сначала предостережение: я не эксперт по прошивке, если уж на то пошло; мое довольно грубое понимание того, как работает модуль камеры 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 (который имеет 2 порта камеры на борту и поддерживает 2 модуля камеры одновременно) использует некоторые специальные вызовы в прошивке, чтобы заставить эти два модуля использовать один тактовый сигнал (я понятия не имею, как это работает на аппаратном уровне, но я предполагаю, что он использует что-то специфическое для вычислительного модуля); Я не представляю, как бы вы сделали что-то похожее на 4 пис.
Обновить:
Я должен добавить, что возможна грубая синхронизация с некоторыми разумными знаниями о сети (например, широковещательные пакеты UDP). Другими словами, можно заставить все Pi в сети инициировать захват в течение миллисекунды друг от друга (предполагая приличную сеть с низкой задержкой, такую как Ethernet), но, как описано выше, это еще не гарантирует, что все камеры будут на самом деле захватывать кадр одновременно; между временем начала результирующих захватов будет время ожидания кадра (плюс сетевая задержка).
Если этот уровень синхронизации достаточен для людей, они могут захотеть проверить проект составной части, который является еще одним проектом, который я написал поверх picamera именно для этой цели.