Недорогая 3D-стереокамера с кадровой синхронизацией (генлокирование)

Я пытаюсь захватить стереовидео с помощью 2 веб-камер Microsoft LifeCam Studio USB. До сих пор лучший подход, который мне удалось придумать, — это мой собственный инструмент, написанный с использованием OpenCV для захвата видеопотоков с камер в Ubuntu 14.04. Я использую очень простой код VideoCapture ( источник здесь ) и пытаюсь просмотреть как минимум два видео, синхронизированных друг с другом.

Я использовал приложения Android-секундомера ( UltraChron Stopwatch Lite и Stopwatch Timer ) на моем Samsung Galaxy S3 mini, чтобы понять, что мои просматриваемые изображения не синхронизированы (показывают другое время на секундомере).

Кадры синхронизируются, может быть, в 50% случаев. Разница во времени кадра, которую я получаю, составляет от 0 до примерно 300 мс, в среднем около 120 мс. Кажется, что количество используемого времени ожидания очень мало влияет на синхронизацию (то же самое для 1000 мс или 2000 мс). Я запускаю FullHD, но снижение разрешения до 640x480 не дало никакого эффекта.

Я пытаюсь записать стерео видео с помощью недорогой установки. Идеальным результатом был бы 100% синхронизированный стереовидеопоток со скоростью около 10 кадров в секунду. Существуют ли какие-либо альтернативные подходы, которые привели бы к лучшей синхронизации?

РЕДАКТИРОВАТЬ : В поисках недорогого оборудования я обнаружил, что, вероятно, можно взломать аппаратное обеспечение ( ссылка здесь ) и одновременно ввести один тактовый сигнал в несколько модулей камеры, чтобы получить желаемую синхронизацию. Парень, который сделал это, похоже, разработал свою плату камеры с GENLOCK (называемую NerdCam1) и даже плату синхронизированной стереокамеры , которую он сейчас продает примерно за 200 евро.

Тем не менее, у меня почти нулевые способности к аппаратному взлому. Также я не уверен, возможна ли такая инъекция тактовой частоты для разрешений выше стандарта NTSC/PAL (поскольку это похоже на «аналоговое» решение?). Кроме того, я бы предпочел вариант с переменной базовой линией, когда обе камеры не будут спаяны на одной плате.

Также нашел этот связанный пост: Дешевое решение для съемки с несколькими (> 2) синхронизированными камерами (генлок или LANC?)

Я попытался минимизировать время ожидания waitKey (используя 1 мс для работы цикла) и проверять каждую 100-ю итерацию цикла, чтобы сохранить неподвижную пару. Я все еще иногда получаю задержку до 12 мс от первой камеры до второй ... Думаю, мне нужен лучший секундомер, поскольку они часто не читаются в кадрах при перерисовке чисел (или у меня слишком длинное время затвора).
Было небольшое обсуждение этого вопроса между модами, и мы согласились оставить его закрытым, хотя, по сути, вопрос не совсем не по теме, но вы очень сильно сосредоточены на компьютерном зрении. Вопрос о том, как сделать snyc'ed стерео видео, здесь полностью актуален, вам просто нужно сделать вопрос более общим. Если вы отредактируете вопрос, чтобы отразить это, я с удовольствием снова открою его. В противном случае, если вам определенно нужен программный подход к веб-камерам, вопрос может лучше подойти для SO.
Я переформулировал вопрос, чтобы опустить тему резюме. Я был бы рад, если бы это снова открылось. Пожалуйста, не стесняйтесь редактировать вопрос, чтобы получить желаемую тему видео.
Я удалил некоторые тяжелые части кода, добавил нижнюю строку к вопросу, открыл вопрос для других решений для камер, а не для веб-камер, и снова открыл. Тот факт, что вы сосредоточились на веб-камерах, кодировании в OpenCV и просмотре ваших камер в реальном времени, сделал его совершенно непригодным для чего-либо еще, связанного с производством видео, кроме компьютерного зрения (которое здесь не по теме, а на SO). Это все еще отражает ваш вопрос?
Спасибо за редактирование. Да, мне нужно только записать синхронизированное стерео видео, это основная цель.
Я изменил требование «X FPS» на более конкретное «10 FPS».

Ответы (1)

Вы, вероятно, не добьетесь 100% идеального результата с вашей настройкой. То, что вы синхронизировали их с точностью до 1 кадра в секунду, на самом деле довольно удивительно.

Профессиональные стереоустановки используют аппаратную блокировку кадров, чтобы обеспечить идеальную синхронизацию записи с камер. Это невозможно с обычными веб-камерами. Если вы исправите записанное видео в посте, вы можете получить точность менее 1/RecordingFPS’th секунды, чего может быть достаточно в зависимости от вашей частоты кадров. Чем выше частота кадров, тем меньше будет смещение.

Если веб-камеры предлагают какой-то низкоуровневый API, вы можете улучшить результаты еще больше, но я сомневаюсь, что это доступно, обычно это то, что вы получаете только в (довольно дорогих) промышленных камерах.

Редактировать: Что касается вашего редактирования, Genlocking — это способ работать практически с любым видеоприложением, если вам нужна 100% синхронизация (или как можно ближе к этому, у вас всегда будет некоторая нано/микросекундная задержка между кадрами).

Это синхронизация видео, отображаемых на видеостене (все эти отдельные дисплеи должны отображать правильную часть кадра одновременно). Или запись несколькими камерами одного и того же кадра одновременно. Разрешение тут не при чем.

Хотя цена точно есть. У вас есть бюджет для этого проекта или это для хобби? Определенно есть (не кино) камеры, которые поддерживают это, хотя они не такие дешевые, как веб-камеры. Самым дешевым решением, которое я могу придумать, является использование GoPro Stereo Rig. http://gopro.com/camera-accessories/dual-hero-system Это даст вам общий бюджет в 1000 долларов (минус несколько центов). Не совсем дешево, но определенно доступно.

GoPro также является очень гибким решением. Вы можете снимать от 3840x2160@15FPS до 848x480@240FPS. Он также поддерживает необработанный выход HDMI, что может быть полезно, если требуется точность цветопередачи или мониторинг вашей съемки в реальном времени.

Недостатком является то, что GoPro имеет объектив типа «рыбий глаз». Вы можете уменьшить искажение, установив узкий режим просмотра камеры и используя этот изящный программный лайфхак , но вы не сможете полностью избавиться от него, если не замените объектив .

Редактировать 2: Если вы идете «построить свой собственный маршрут электроники», вам следует взглянуть на проект ArduCam. По сути, это экран для популярных плат Arduino. Он позволяет подключать несколько модулей cmos, таких как OV5642, который представляет собой 5-мегапиксельный датчик, который также используется в модуле камеры Raspberry Pi.

Согласно этой ветке на форуме RaspberryPi, эти модули поддерживают генлок. Хотя это невозможно с поломанными контактами на модуле PiCam (хотя есть некоторые идеи о том, как сделать генлок с ним на последней странице), вы можете заказать эти модули дешево (25 $) на ebay и использовать их с платой ArduCam. . Даже если вы не подключаете модули к одному и тому же генератору для выполнения генлока, вы должны получить довольно хорошие результаты, так как здесь вы работаете с довольно близким металлом, а платформа Arduino очень проста в использовании.

С такой настройкой вы могли бы потенциально сделать стерео 3D-установку 1080p примерно за 125 долларов. 50$ за модули cmosm, ~16$ за 2 клона Arduino Uno и 60$ за 2 шилда ArduCam.

Я отредактировал свой вопрос, добавив некоторые возможности взлома оборудования, если вы заинтересованы в ответе.
@Kozuch: отредактировал мой ответ
Спасибо за разработку :). У меня есть некоторый бюджет (скажем, тысячи долларов), но я пытаюсь разработать дешевые решения для возможного проекта сообщества. GoPro Stereo очень интересна из-за очень дешевого оборудования. Я так понимаю, корпус не нужен - нужно только подключить 2 HERO3+ BE синхрокабелем (фирменным?)? Хотя что-то подешевле все равно было бы неплохо. Мне, вероятно, нужно заняться аппаратным взломом/разработкой, потому что NerdCam1 - это то, что мне действительно нужно (хотя, вероятно, у него нет открытых схем печатных плат) ... Но NerdCam1, похоже, имеет очень паршивое разрешение, мне нужно четкое разрешение 1 Мпикс, по крайней мере.
Если вы хотите пойти по пути самодельной электроники (на самом деле это не так сложно, как может показаться), я добавил некоторую полезную информацию.
Спасибо за отличное редактирование. Прав ли я в том, что решение Arduino будет сохранять видео или фотографии с идеальной синхронизацией при подаче одного и того же внешнего тактового сигнала и доп. запускается через GPIO? Куда я буду подавать тактовый сигнал на модуль CMOS? Какое аппаратное обеспечение мне нужно для этого или я могу получить его от самих плат Arduino? Приложение будет мобильным стереофоническим сканером дороги/ландшафта из легкового автомобиля, движущегося, скажем, со скоростью 100 км/ч, так что другая проблема может заключаться в скользящих затворах, но я понимаю, что не получу глобальный затвор дешево. Я надеюсь на достаточно короткое время воздействия, чтобы свести к минимуму это или просто снизить скорость автомобиля. Я буду ...
Продолжение: также необходимо объединить данные датчика GPS / IMU в течение некоторой синхронизации в поток изображения / видео, чтобы внести поправки в визуальную одометрию - здесь возникает моя первоначальная идея сделать все это на C ++. Позже следует использовать GPS уровня DGPS/RTK. Обычный GPS в любом случае будет иметь только 10 Гц, но этого должно быть достаточно в начале. Могу ли я сохранить данные GPS где-нибудь в некоторой синхронизации вместе с потоком изображений с Arduino? Учебник Arduino GPS не выглядит очень сложным. Эта штука с GPS, вероятно, здесь не по теме - у вас есть предложения, где лучше спросить? Я борюсь с тем, что не по теме всего SE.
Если у вас есть быстро движущееся транспортное средство, я бы рекомендовал GoPro с высокой частотой кадров. Что касается «сохранения видео или фотографий с идеальной синхронизацией при подаче одного и того же внешнего тактового сигнала и внешнего запуска через GPIO», да, на самом деле, что касается GPS / IMU, это не проблема с Arduino, на самом деле довольно просто. Экраны будут сохранять видео на SD-карту, где вы также можете сохранить данные датчика). Хотя по всем этим электронным вопросам я рекомендую перейти на electronics.stackexchange.com . Именно для таких вопросов.
Вы можете опубликовать ссылку на ветку EE, если спросите о том, как выполнить генлокирование на этих платах.
Спасибо за вашу большую помощь до сих пор. Дополнительный вопрос: стереофоническая синхронизация GoPro работает только с устройствами Black Edition, верно? Это увеличивает стоимость, потому что мне не нужен ни очень высокий FPS, ни высокое разрешение. Меня устраивает 10 FPS и 1-2 Mpix. Также будет проблемой слияние GPS/IMU с GoPro? Я проверю серьезность скользящего затвора, действительно надеясь, что это не будет так плохо. Наконец, я продолжаю путешествие по EE следующим постом HW: electronics.stackexchange.com/questions/124596/…
Еще один вопрос о совместимости камеры GoPro DUAL System: video.stackexchange.com/questions/12346/…
Согласно этому ответу electronics.stackexchange.com/a/124628/29812 и этому блогу vanceance.blogspot.co.at/2014/02/arducam.html кажется, что ArduCam может снимать кадры только с разницей в 10 секунд (0,1 FPS) а также не имеет функции захвата видео.
Думаю, меня одурачили все эти таймлапс-видео и функция живого видео некоторых вариантов щита. Тогда я предполагаю, что вашим другим вариантом было бы сделать то же самое с PiCam и 2 Raspberry Pis, как это было предложено на последней странице ветки, теоретически это должно работать, предоставив обоим модулям pi-cam один и тот же источник часов. Они не пробовали это, но я думаю, стоит попробовать, это решение будет стоить 130 или 120 долларов, если вы выберете модуль инфракрасной камеры (который может больше подходить для компьютерного зрения в зависимости от вашей среды).
Есть дополнительный вопрос о кадровой синхронизации стереокамеры Raspberry Pi: raspberrypi.stackexchange.com/questions/22696/…
Возможно, вы также захотите опубликовать вопрос в EE. RPi SE великолепен, но больше о более простых вещах, которые вы можете делать с Pi, и больше о программном обеспечении, не уверен, что вы получите там хороший ответ.
Хорошо, хорошая идея. Поехали: electronics.stackexchange.com/questions/124812/…
Новая задача: мне нужно сделать обработку компьютерного зрения вживую, а не в постобработке. Мне нужен видеосигнал на мощной машине x86. Я вижу два варианта для этого: 1: захват HDMI. Подавайте HDMI через RPi, CHDK/SDM (StereoData Maker 1.86 может выполнять синхронизацию видео!) или GoPro на карту захвата HDMI PCI-E (у Blackmagic Design есть некоторые, хотя получение стереовхода сомнительно). Мы надеемся, что к данным можно получить доступ в C+. 2: Пользовательское стерео USB-устройство (две камеры на одном USB-кабеле) — жесткая аппаратная конструкция и сборка, нестандартная печатная плата для 2 модулей CMOS + необходим USB-драйвер (= дорого). Не могли бы вы прокомментировать идеи?