2017-01-31 4 views
0

Я хочу вычислить внешнюю калибровку двух камер w.r.t друг для друга и использую функцию cv :: stereoCalibrate() для этого. Однако результат не соответствует действительности. Что может быть неправильным?Многокамерная калибровка с opencv: Две камеры, обращенные друг к другу

Установка: Две камеры установлены на высоте 7 метров, обращаясь друг к другу, глядя вниз. У них много пересечений поля зрения, и я захватил изображения шахматной доски, которые я использовал в калибровке.

Я не переворачиваю изображения.

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

Примечание. Эта же функция идеально откалибрует камеры, которые находятся рядом друг с другом, обращенные в одном направлении (например, любая стандартная стереокамера).

Благодаря

+0

Сколько изображений вы использовали для калибровки? У них достаточно вариантов поворота? – hiroki

+0

Я использую 50 изображений с приличным поворотом и изменением наклона. – user3755683

+0

Что бы я сделал: откалибруйте каждую камеру независимо, используя 'cv :: calibrateCamera()'. Оцените преобразование между двумя кадрами камеры, если они были определенно зафиксированы: шаблон шахматной доски, видимый для каждой камеры + 'cv :: solvePnP()'. Преобразование 'c1Mc2' можно оценить как' c1Mo x (c2Mo)^- 1'. – Catree

ответ

0

Для того, чтобы «сказать, что камеры на самом деле обращены друг к другу», вы должны указать imagePoints1 и imagePoints2 правильно, таким образом, что точки с соответствующими индексами соответствует одному и тому же физической точке.

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

Один из способов отладки заключается в том, чтобы либо нарисовать индексы рядом с точками на каждом из фреймов, либо их цветовой код и убедиться, что они совпадают между изображениями.

Один вопрос: почему вы используете cv::stereoCalibrate()? Описанная вами настройка, по-видимому, не является хорошим прецедентом. Если вы хотите оценить внешние параметры камер, вы можете использовать cv::calibrateCamera(). Единственным недостатком является то, что он предполагает, что внутренние параметры одинаковы для всех предоставленных представлений (все изображения были сделаны с одинаковыми или очень похожими камерами). Если это не так - действительно, cv::stereoCalibrate() будет лучше подходит (но в руководстве предполагается, что вы по-прежнему оцениваете внутренние параметры каждой камеры индивидуально, используя cv::calibrateCamera())

+0

Я проверил точки и точки соответствия выглядят хорошо. Это не говорит о необходимости переворачивания. Я хотел бы найти поворот и перевод между первой и второй камерами, которые предоставляются 'cv :: stereoCalibrate()'. И да, я использую 'cv :: calibrateCamera()' для калибровки отдельных камер и предоставления матриц камеры 'cv :: stereoCalibrate()'. Как вы предлагаете использовать результаты из 'cv :: calibrateCamera()', чтобы найти преобразование между камерами? – user3755683

+0

В значительной степени в соответствии с документом - 'objectPoints' будет вектором векторов трехмерных точечных координат маркера,' imagePoints' будет вектором векторов обнаруженных 2d-точечных координат, 'rvecs' и' tvecs' будет содержать extrinsics per каждый вид (поворот и перевод). Если вы можете - пожалуйста, укажите образцы изображений с соответствующими показаниями - это поможет прояснить ситуацию. – alexisrozhkov

Смежные вопросы