Raspberry Pi Camera - когда он готов к следующему кадру

8

При использовании apis, например C ++ или raspicam api, вы опрашиваете камеру с помощью метода grab () или аналогичного метода. Когда кадр готов, метод возвращается. Есть ли способ проверки готовности камеры без захвата кадра?

Это может быть инструмент командной строки, вызов C ++, библиотека Python, буквально любой метод.

Я спрашиваю, потому что у меня есть 4 малиновых писа с 4 камерами, и я хочу снимать кадр за кадром с каждым кадром в один и тот же момент времени. Камеры не достаточно быстрые для моего приложения, чтобы сделать это любым другим способом.

user2290362
источник

Ответы:

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

Обновить:

Я должен добавить, что возможна грубая синхронизация с некоторыми разумными знаниями о сети (например, широковещательные пакеты UDP). Другими словами, можно заставить все Pi в сети инициировать захват в течение миллисекунды друг от друга (предполагая приличную сеть с низкой задержкой, такую ​​как Ethernet), но, как описано выше, это еще не гарантирует, что все камеры будут на самом деле захватывать кадр одновременно; между временем начала результирующих захватов будет время ожидания кадра (плюс сетевая задержка).

Если этот уровень синхронизации достаточен для людей, они могут захотеть проверить проект составной части, который является еще одним проектом, который я написал поверх picamera именно для этой цели.

Дейв Джонс
источник
Можете рассказать о многокамерной «кадровой синхронизации» в режиме фотосъемки (не видео). Я полагаю, что датчик может снова работать в режиме «свободного хода» даже для фотоснимков, только с полным разрешением и более низким FPS (может быть, 15 FPS, что даст более длительную задержку кадров, чем 30 кадров в секунду). Вы можете подтвердить это предположение? Я заинтересован в решении C ++ в Python только добавляет уровень неопределенности времени на вершине , что ...
Kozuch
За прошедшие годы я узнал немного больше и, вероятно, должен обновить этот ответ в какой-то момент. Для начала утверждение о том, что синхронизация на двух камерах вычислительного модуля неверна: нет, они просто запускаются синхронно и в конечном итоге (в течение нескольких часов) разойдутся. Во время фотосъемки камера выполняет потоковую передачу кадров до захвата, но затем во время захвата переключает режим в режим датчика 2 или 3 (зависит от частоты кадров).
Дэйв Джонс
Я писал расширенную версию главы, посвященной аппаратному обеспечению камеры, для следующего выпуска Picamera на основе отзывов разработчиков программного обеспечения камеры - возможно, стоит прочитать ее (хотя она еще не завершена), поскольку она охватывает некоторые из этих деталей.
Дэйв Джонс
Ваши документы довольно много читают, но у меня нет ресурсов, чтобы углубиться в них сейчас - я только что прочитал. Я вижу, что есть и видео, и неподвижные режимы (все еще порт). Мы знаем о видеопорте (свободном датчике), но можете ли вы объяснить, что означает этот порт и как он работает? Может ли это быть как-то использовано для более точного триггера (меньше задержки срабатывания затвора), чем, может быть, видео-порт? Я попросил raspicam C ++ devs на ту же тему, но пока не получил ответа.
Kozuch
Нет. Неподвижный порт - это просто артефакт MMAL, который заставляет другой конвейер обработки изображений на графическом процессоре генерировать «лучший» вывод статического изображения. Следовательно, при использовании неподвижного порта для захвата, режим датчика временно переключается, используется более сильный алгоритм шумоподавления и т. Д. Это не даст вам никакой разницы в задержке срабатывания затвора (переключение режима, вероятно, усложнит это, если что-нибудь).
Дейв Джонс