2015-03-30 3 views
2

Я использую открытое cv на C++ в сцене с несколькими камерами. У меня есть внутренние и внешние параметры для обеих камер.Проецируйте 2D-точку с одной камеры на соответствующую двумерную точку в другом виде камеры той же сцены

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

+1

afaik Вы можете сделать только один из них: если вы знаете внутреннюю и внешнюю характеристики обеих камер и знаете, какой пиксель соответствует, вы можете вычислить трехмерное положение точки, или, если известно, что 3d pos точки, вы можете вычислить 2d изображение pos в камера, где известны параметры intr и extr. однако, если вы знаете гомографию, вы можете вычислить 2d-позицию пикселя во 2-й камере, даже если вы не знаете какие-либо камеры intrinsics/extr – Micka

+0

@ Мика благодарю вас за ваш ответ, я только что нашел время для этого снова. Мне удалось извлечь матрицу Homograph 3x3, используя два разных вида. Однако когда я сделал: [x ', y'] = H * [x, y], чтобы получить точки во втором представлении. Очки не выровнены.:/Любые другие идеи? –

+1

гомологии относятся только к двум ситуациям: 1. если оба вида камеры имеют одинаковую центральную точку камеры. 2. Если позиции в 3D лежат на плоскости. разные точки могут быть только приближенными гомографическим преобразованием, и чем больше их 3D-точки отличаются от плоскости() плоскости, которую вы использовали для вычисления гомографии), тем больше будет ошибка. – Micka

ответ

1

Это (как правило) невозможно возьмите двумерную координату на одном изображении и переместите ее в другую двумерную координату без какой-либо дополнительной информации.

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

Хотя фундаментальная матрица (которую вы получаете из cv::StereoCalibrate во всяком случае) дает ограничение между точками в каждой камере: x'Fx = 0, для данного x' будет целым семейством x-х, которые удовлетворяют уравнение.

некоторых возможных решений являются следующие:

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

  2. Вы используете некоторые редкие функции обнаружения и сопоставления, используя что-то вроде SIFT или ORB. Затем вы можете рассчитать гомографию для сопоставления точек с одного изображения на другое. Это делает несколько предположений о вещах, являющихся самолетами. Если вы являетесь гонораром панорамы Google, есть много слайдов для лекций, подробно описывающих это.

  3. Вы откалибровать камеры, выполнять эпиполярную ректификацию (cv::StereoRectify, cv::initUndistortRectifyMap, cv::remap), а затем запустить их через стерео согласовань. Вывод - это карта несоответствия, которая дает вам именно то, что вы хотите: отображение на пиксель с одной камеры на другую. То есть left[y,x] = right[y, x+disparity_map[y,x]].

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