Многокамерная калибровка с помощью opencv: две камеры обращены друг к другу
Я хочу вычислить внешнюю калибровку двух камер по отношению друг к другу, и для этого я использую функцию cv::stereoCalibrate(). Однако результат не соответствует действительности. Что может быть не так?
Установка: Две камеры установлены высотой 7 метров, обращены друг к другу и смотрят вниз. У них много пересечений в поле зрения, и я сделал снимки шахматной доски, которые я использовал при калибровке.
Я не переворачиваю изображения.
Нужно ли переворачивать изображения? или мне нужно сделать что-то еще, чтобы сказать, что камеры на самом деле обращены друг к другу?
Примечание: та же функция отлично калибрует камеры, которые расположены рядом друг с другом в одном направлении (как любая обычная стереокамера).
Спасибо
1 ответ
Чтобы "сказать, что камеры на самом деле обращены друг к другу", вам нужно указать imagePoints1
а также imagePoints2
правильно, так что точки с совпадающими индексами соответствуют одной и той же физической точке.
Если в вашем случае функция работает отлично, когда камеры ориентированы в одном направлении и не работает с вашей конфигурацией - расхождение между индексированием точек может быть вероятной причиной (наиболее вероятные точки переворачиваются как по вертикали, так и по горизонтали).
Один из способов отладки - это нарисовать индексы рядом с точками в каждом из кадров или кодировать их цветом и убедиться, что они совпадают между изображениями.
Хотя один вопрос - почему вы используете cv::stereoCalibrate()
? Описанная вами настройка, похоже, не подходит для этого. Если вы хотите оценить внешние параметры камер, вы можете использовать cv::calibrateCamera()
, Единственным недостатком является то, что предполагается, что внутренние параметры одинаковы для всех представленных видов (все изображения были сделаны с одинаковыми или очень похожими камерами). Если это не так - действительно cv::stereoCalibrate()
было бы лучше подойти (но руководство предполагает, что вы по-прежнему оценивать внутренние параметры каждой камеры в отдельности, используя cv::calibrateCamera()
)