как мне заново спроецировать точки в системе камеры — проектора (после калибровки)

Я видел много записей в блогах и видео, а также источник в Интернете о том, как выполнить калибровку камеры + проектора с помощью openCV, чтобы произвести camera.yml, projector.yml а также projectorExtrinsics.yml файлы.

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

Скажем, я пишу приложение, которое теперь использует систему камеры — проектора, которую я откалибровал для отслеживания объектов и проецирования чего-либо на них. Я буду использовать contourFind () для захвата некоторых точек интереса от движущихся объектов, и теперь я хочу проецировать эти точки (из проектора!) На объекты!

то, что я хочу сделать, это (например) отслеживать центр масс (COM) объекта и показывать точку на виде с камеры отслеживаемого объекта (на его COM). Затем точка должна быть спроецирована на COM объекта в режиме реального времени.

Кажется, что projectPoints() это функция openCV, которую я должен использовать после загрузки файлов yml, но я не уверен, как я буду учитывать все внутренние & внешние значения калибровки как камеры, так и проектора. А именно, projectPoints() требует в качестве параметров

  • вектор точек для повторного проецирования (дух!)
  • вращение + матрицы перевода. Я думаю, что я могу использовать проектор здесь. или я могу использовать функцию composeRT () для генерации окончательного поворота & окончательная матрица перевода из проектора Extrinsics (который у меня есть в файле yml) и камеры Extrinsics (которого у меня нет. Дополнительный вопрос: я не должен сохранять их тоже в файле ??).
  • внутренняя матрица. это сложно сейчас. я должен использовать камеру или матрицу встроенных функций проектора здесь?
  • коэффициенты искажения. снова я должен использовать проектор или камеру здесь?
  • другие параметры …

Так что, если я использую либо проектор, либо камеру (какой ??) projectPoints()тогда я буду «исправлять» только один из двух инструментов. Где / как я буду использовать встроенные функции других инструментов?

Что еще мне нужно использовать помимо load() YML-файлы и projectPoints() ? (возможно, искажение?)

Любая помощь в этом вопросе очень ценится.
Если есть учебное пособие или книга (нет, О’Рейли «Изучение openCV» также не говорит о том, как использовать файлы калибровки yml! — только о том, как выполнить фактическую калибровку), пожалуйста, укажите мне в этом направлении. Мне не обязательно нужен точный ответ!

6

Решение

Во-первых, вы, похоже, смущены общей ролью модели камеры / проектора: ее роль заключается в сопоставлении точек трехмерного мира с точками 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 для того, чтобы знать, где отображать вещи с вашим проектором.

С одной камерой и одним проектором это все еще возможно, но сложнее, потому что вы не можете триангулировать отслеживаемые точки только из одного наблюдения. Основная идея состоит в том, чтобы подойти к проблеме как редкий проблема оценки стерео-диспаратности. Возможный метод заключается в следующем:

  1. спроецируйте не неоднозначное изображение (например, черно-белый шум), используя проектор, чтобы текстурировать сцену, наблюдаемую камерой.

  2. Как и прежде, отслеживайте интересующие вас объекты на изображении с камеры.

  3. для каждого интересующего объекта сопоставьте небольшое окно вокруг его местоположения на изображении с камеры с изображением проектора, чтобы найти, где оно проецируется в 2D-координатах проектора.

Другой подход, который, в отличие от приведенного выше, будет использовать параметры калибровки, может заключаться в плотной трехмерной реконструкции с использованием stereoRectify а также StereoBM::operator() (или же gpu::StereoBM_GPU::operator() для реализации на графическом процессоре), отобразите отслеживаемые 2D-положения в 3D, используя предполагаемую глубину сцены, и, наконец, спроецируйте в проектор, используя projectPoints,

Во всяком случае, это проще и точнее, используя две камеры.

Надеюсь это поможет.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]