Я пытался заставить калибровку камеры OpenCV работать в течение нескольких месяцев, но пока мне это не удалось. Я нахожусь в точке, где я могу получить низкую ошибку повторного проецирования (ниже 0,5 пикселей), но когда я проверяю выводимые изображения stereoRectify
они явно не исправлены правильно. Соответствующие точки не выровнены по горизонтали. Заметными эффектами выпрямления являются незначительное вращение одного изображения и увеличение другого изображения. Карты диспаратности, сгенерированные выпрямлением, являются зашумленными и просто не правильными (используя как StereoSGBM, так и StereoVar).
Я попытался использовать несколько различных наборов калибровочных изображений, в диапазоне от 20 до 80 кадров. Я пробовал различные комбинации размера шахматной доски, расстояния и вращения, но все безрезультатно. В каждом случае я получаю разные результаты, но все с типом бесполезных карт диспаратности, описанных выше.
MATLAB стерео калибровка производит много лучшие результаты на тех же видео, но, к сожалению, MATLAB не доступен в качестве долгосрочного решения в моем случае.
Я не понимаю, почему OpenCV считает, что он находит хорошее стерео выпрямление, когда это так явно не так. Я что-то упускаю из-за того, как откалибровать камеры? Кто-нибудь еще сталкивался с такой проблемой?
Учитывая, что он работает в MATLAB, я предполагаю, что ваши стереокамеры настроены правильно, то есть они полностью исправлены.
Что мне приходит в голову: вы калибровали камеры индивидуально? Таким образом, вы можете использовать матрицу камеры и коэффициенты искажения в StereRectify оттуда.
Кроме того, я отметил, что findChessboardCorners не очень хорошо работает при низком качестве изображения. Но это должно привести к высокой ошибке RMS. В любом случае у вас должно быть не только достаточно большое количество снимков (я использовал 100), но и угол наклона калибровочной доски к камере. И расстояние платы от камер не должно быть слишком большим, поэтому плата покрывает большую часть изображения. (Поскольку доска должна быть полностью видимой для обеих камер, я использовал предварительный просмотр, чтобы отрегулировать положение.) Это все не совсем отвечает на ваш вопрос, но, тем не менее, надеюсь, что это поможет.
Вы калибруете, используя одни и те же изображения в MATLAB и OpenCV? Кроме того, вы используете Приложение Стереокамера Калибратор в MATLAB?
Если вы используете точно такие же калибровочные изображения, то вероятное объяснение того, что вы видите, заключается в том, что детектор шахматной доски в MATLAB более точный, чем в OpenCV.
Если вы используете разные калибровочные изображения, то я бы попытался удалить их в OpenCV, используя undistort
функция вместо того, чтобы исправить их. Скорее всего, неискаженные изображения будут выглядеть ужасно искривленными и сложенными. Это, вместе с низкими ошибками перепроецирования, указывает на то, что вы не получите точную оценку искажения линзы. Обычно это происходит, когда ваша шахматная доска находится в основном на середине изображения, и вы не получаете точек близко к краям. Средство защиты здесь должно было бы получить больше изображений с шахматной доской, расположенной близко к краям и углам изображения.