Стереокалибровка OpenCV имеет низкую ошибку повторного проецирования, но неверна

Я уже несколько месяцев пытаюсь заставить работать калибровку камеры OpenCV, но пока безуспешно. Я нахожусь в точке, где я могу получить низкую ошибку повторного проецирования (ниже 0,5 пикселя), но когда я проверяю изображения, выводимые stereoRectify, они явно не исправляются правильно. Соответствующие точки не выровнены по горизонтали. Заметные эффекты исправления заключаются в небольшом повороте одного изображения и увеличении другого изображения. Карты диспаратности, генерируемые исправлением, зашумлены и просто некорректны (с использованием как StereoSGBM, так и StereoVar).

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

Стереокалибровка MATLAB дает намного лучшие результаты на тех же видео, но MATLAB, к сожалению, недоступен в качестве долгосрочного решения в моем случае. Я не понимаю, почему OpenCV считает, что находит хорошее стерео-выпрямление, хотя это явно не так. Мне что-то не хватает о том, как откалибровать камеры? Кто-нибудь еще сталкивался с такой проблемой?


person KFox    schedule 03.02.2016    source источник


Ответы (2)


Учитывая, что он работает в MATLAB, я предполагаю, что ваши стереокамеры настроены правильно, что означает, что они полностью исправлены. Что мне приходит в голову: вы калибровали камеры индивидуально? Таким образом, вы можете использовать матрицу камеры и коэффициенты искажения в stereoRectify оттуда. Также я заметил, что findChessboardCorners плохо работает при низком качестве изображения. Но это должно привести к высокому среднеквадратическому значению ошибки. В любом случае у вас должно быть не только достаточно большое количество снимков (я использовал 100), но и разные углы наклона калибровочной платы к камере. И расстояние от доски до камер не должно быть слишком большим, чтобы доска закрывала большую часть изображения. (Поскольку доска должна быть полностью видна для обеих камер, я использовал предварительный просмотр, чтобы отрегулировать положение.) Это все не совсем ответ на ваш вопрос, но я надеюсь, что это поможет.

person jodis    schedule 04.02.2016
comment
Я не калибровал камеры по отдельности, но с тех пор, как добавил это в свой код, я столкнулся только с большим количеством проблем, в основном масштабирование и обрезка были единственными заметными эффектами stereoRectify. Спасибо за предложение, но оно не работает. :( - person KFox; 08.02.2016

Вы калибруете, используя одни и те же изображения как в MATLAB, так и в OpenCV? Кроме того, вы используете приложение Stereo Camera Calibrator в MATLAB?

Если вы используете точно такие же калибровочные изображения, то вероятным объяснением того, что вы видите, является то, что детектор шахматной доски в MATLAB более точен, чем в OpenCV.

Если вы используете разные калибровочные изображения, я бы попытался неискажать изображения в OpenCV с помощью функции undistort вместо их исправления. Есть вероятность, что неискаженные изображения будут выглядеть ужасно искаженными и сложенными сами по себе. Это, вместе с небольшими ошибками перепроецирования, может указывать на то, что вы не можете получить точную оценку искажения объектива. Обычно это происходит, когда ваша шахматная доска в основном находится в середине изображения, и вы не получаете никаких точек близко к краям. Решением здесь было бы получить больше изображений с шахматной доской, расположенной близко к краям и углам изображения.

person Dima    schedule 06.02.2016
comment
Я не использую приложение в MATLAB, и да, я использую те же изображения. Я не совсем уверен, что вы предлагаете мне сделать ... Я уже использую OpenCV stereoRectify для устранения искажений, если вы это предлагаете. - person KFox; 08.02.2016
comment
Я отредактировал ответ. Я предлагаю использовать функцию undistort, чтобы не искажать изображения, а не исправлять их. Это может сделать проблему более очевидной. Если вы не используете приложение MATLAB, что вы используете для калибровки в MATLAB? - person Dima; 08.02.2016
comment
Спасибо за помощь, но я обнаружил, что проблема связана со сжатием видео. Попробовав несколько видеоформатов, я обнаружил, что HFYU почему-то заставляет все работать! - person KFox; 08.02.2016
comment
@ Дима, вы случайно не знаете, чем детектор шахматной доски в MATLAB отличается от комбинации findCorners и cornerSubPix в OpenCV? Почему вы говорите, что MATLAB более точен? (Я могу задать вопрос в обмене стеком обработки сигналов, если хотите) - person Greg Kramida; 18.04.2016
comment
@GregKramida, detectCheckerboardPoints в MATLAB и findChessboardCorners в OpenCV используют совершенно разные алгоритмы. Функция MATLAB с большей вероятностью найдет шахматную доску на изображении и более точно локализует точки. Вы можете проверить это на себе. Чтобы проверить надежность, просто сделайте несколько изображений шахматной доски и посмотрите, какая функция обнаруживает больше шахматной доски. Чтобы проверить точность локализации, определите точки с помощью каждой функции, а затем используйте EstimationCameraParameters () в MATLAB для калибровки. Затем сравните ошибки перепроецирования. - person Dima; 18.04.2016
comment
@ Дима, спасибо большое. Я вам верю, я не собираюсь проводить тест самостоятельно. Я собираюсь рассмотреть возможность добавления этого алгоритма поиска углов в OpenCV (я думаю, что он описан в документе внизу справочная страница Matlab) - person Greg Kramida; 19.04.2016