Это (как правило) невозможно возьмите двумерную координату на одном изображении и переместите ее в другую двумерную координату без какой-либо дополнительной информации.
Основная проблема заключается в том, что одна точка в левом изображении будет отображать линию в правильном изображении (эпиполярная линия). Существует бесконечное количество возможных местоположений, потому что глубина является свободным параметром. Во-вторых, вполне возможно, что точка не существует в правильном изображении, то есть она закрыта. Наконец, может быть трудно точно определить, какая точка является правильным соответствием, например. если в сцене нет текстуры или в ней много повторяющихся объектов.
Хотя фундаментальная матрица (которую вы получаете из cv::StereoCalibrate
во всяком случае) дает ограничение между точками в каждой камере: x'Fx = 0
, для данного x'
будет целым семейством x
-х, которые удовлетворяют уравнение.
некоторых возможных решений являются следующие:
Вы знаете 3D расположение 2D точки в одном изображении. Если 3D-точка находится в общей системе координат, вы просто используете cv::projectPoints
с параметрами калибровки другой камеры, в которую хотите проецироваться.
Вы используете некоторые редкие функции обнаружения и сопоставления, используя что-то вроде SIFT или ORB. Затем вы можете рассчитать гомографию для сопоставления точек с одного изображения на другое. Это делает несколько предположений о вещах, являющихся самолетами. Если вы являетесь гонораром панорамы Google, есть много слайдов для лекций, подробно описывающих это.
Вы откалибровать камеры, выполнять эпиполярную ректификацию (cv::StereoRectify
, cv::initUndistortRectifyMap
, cv::remap
), а затем запустить их через стерео согласовань. Вывод - это карта несоответствия, которая дает вам именно то, что вы хотите: отображение на пиксель с одной камеры на другую. То есть left[y,x] = right[y, x+disparity_map[y,x]]
.
(1) на сегодняшний день является самым простым, но вряд ли у вас есть эта информация. (2) часто выполнимо и может быть подходящим, и, как отметил другой комментатор, он будет бедным, когда допущение планарности не удастся. (3) является общим (идеальным) решением, но имеет свои недостатки и полагается на то, что изображения поддаются плотному согласованию.
afaik Вы можете сделать только один из них: если вы знаете внутреннюю и внешнюю характеристики обеих камер и знаете, какой пиксель соответствует, вы можете вычислить трехмерное положение точки, или, если известно, что 3d pos точки, вы можете вычислить 2d изображение pos в камера, где известны параметры intr и extr. однако, если вы знаете гомографию, вы можете вычислить 2d-позицию пикселя во 2-й камере, даже если вы не знаете какие-либо камеры intrinsics/extr – Micka
@ Мика благодарю вас за ваш ответ, я только что нашел время для этого снова. Мне удалось извлечь матрицу Homograph 3x3, используя два разных вида. Однако когда я сделал: [x ', y'] = H * [x, y], чтобы получить точки во втором представлении. Очки не выровнены.:/Любые другие идеи? –
гомологии относятся только к двум ситуациям: 1. если оба вида камеры имеют одинаковую центральную точку камеры. 2. Если позиции в 3D лежат на плоскости. разные точки могут быть только приближенными гомографическим преобразованием, и чем больше их 3D-точки отличаются от плоскости() плоскости, которую вы использовали для вычисления гомографии), тем больше будет ошибка. – Micka