Я видел много записей в блогах и видео, а также источник в Интернете о том, как выполнить калибровку камеры + проектора с помощью openCV, чтобы произвести camera.yml
, projector.yml
а также projectorExtrinsics.yml
файлы.
Я еще не видел никого, кто бы обсуждал, что делать с этими файлами потом. На самом деле я сделал калибровку сам, но я не знаю, каков будет следующий шаг в моем собственном приложении.
Скажем, я пишу приложение, которое теперь использует систему камеры — проектора, которую я откалибровал для отслеживания объектов и проецирования чего-либо на них. Я буду использовать contourFind () для захвата некоторых точек интереса от движущихся объектов, и теперь я хочу проецировать эти точки (из проектора!) На объекты!
то, что я хочу сделать, это (например) отслеживать центр масс (COM) объекта и показывать точку на виде с камеры отслеживаемого объекта (на его COM). Затем точка должна быть спроецирована на COM объекта в режиме реального времени.
Кажется, что projectPoints()
это функция openCV, которую я должен использовать после загрузки файлов yml, но я не уверен, как я буду учитывать все внутренние & внешние значения калибровки как камеры, так и проектора. А именно, projectPoints()
требует в качестве параметров
Так что, если я использую либо проектор, либо камеру (какой ??) projectPoints()
тогда я буду «исправлять» только один из двух инструментов. Где / как я буду использовать встроенные функции других инструментов?
Что еще мне нужно использовать помимо load()
YML-файлы и projectPoints()
? (возможно, искажение?)
Любая помощь в этом вопросе очень ценится.
Если есть учебное пособие или книга (нет, О’Рейли «Изучение openCV» также не говорит о том, как использовать файлы калибровки yml! — только о том, как выполнить фактическую калибровку), пожалуйста, укажите мне в этом направлении. Мне не обязательно нужен точный ответ!
Во-первых, вы, похоже, смущены общей ролью модели камеры / проектора: ее роль заключается в сопоставлении точек трехмерного мира с точками 2D-изображения. Это звучит очевидно, но это означает, что, учитывая внешние R, t (для ориентации и положения), функцию искажения D (.) И интрисику K, вы можете сделать вывод для этой конкретной камеры 2D проекция m трехмерной точки M выглядит следующим образом: m = K.D (R.M + t). projectPoints
функция делает именно это (то есть 3D в 2D проекцию), для каждой входной 3D точки, поэтому вам нужно дать ей входные параметры, связанные с камерой, в которой вы хотите, чтобы ваши 3D-точки проецировались (проектор К&D если вы хотите проектор 2D координат, камера K&D, если вы хотите, 2D-координаты камеры).
Во-вторых, когда вы совместно калибруете камеру и проектор, вы не оцениваете набор внешних значений R, t для камеры и другое для проектора, а только один R и один t, которые представляют вращение и перемещение. между системами координат камеры и проектора. Например, это означает, что предполагается, что ваша камера имеет вращение = идентичность и перемещение = ноль, а проектор имеет вращение = R и перемещение = t (или наоборот, в зависимости от того, как вы провели калибровку).
Теперь, что касается упомянутого вами приложения, настоящая проблема заключается в следующем: как вы оцениваете трехмерные координаты заданной точки?
С помощью две камеры и один проектор, это было бы легко: вы можете отслеживать интересующие вас объекты на изображениях двух камер, триангулировать их 3D-положения с помощью двух 2D-проекций с помощью функции triangulatePoints
и, наконец, проецировать эту 3D-точку в 2D-координаты проектора, используя projectPoints
для того, чтобы знать, где отображать вещи с вашим проектором.
С одной камерой и одним проектором это все еще возможно, но сложнее, потому что вы не можете триангулировать отслеживаемые точки только из одного наблюдения. Основная идея состоит в том, чтобы подойти к проблеме как редкий проблема оценки стерео-диспаратности. Возможный метод заключается в следующем:
спроецируйте не неоднозначное изображение (например, черно-белый шум), используя проектор, чтобы текстурировать сцену, наблюдаемую камерой.
Как и прежде, отслеживайте интересующие вас объекты на изображении с камеры.
для каждого интересующего объекта сопоставьте небольшое окно вокруг его местоположения на изображении с камеры с изображением проектора, чтобы найти, где оно проецируется в 2D-координатах проектора.
Другой подход, который, в отличие от приведенного выше, будет использовать параметры калибровки, может заключаться в плотной трехмерной реконструкции с использованием stereoRectify
а также StereoBM::operator()
(или же gpu::StereoBM_GPU::operator()
для реализации на графическом процессоре), отобразите отслеживаемые 2D-положения в 3D, используя предполагаемую глубину сцены, и, наконец, спроецируйте в проектор, используя projectPoints
,
Во всяком случае, это проще и точнее, используя две камеры.
Надеюсь это поможет.
Других решений пока нет …