Исправление изображения
Мне нужно реализовать выпрямление изображения. Проблема задается изображением объекта с четырех точек обзора (topL,topR,bottomL,bottomR). Мне нужно выполнить попарное выпрямление. Я пробовал некоторый код в OpenCV, но не смог добиться прогресса. Может кто-то сказать мне хороший способ (исходный код / учебник) для выполнения исправления? Мне нужно использовать C / C++ / OpenCV.
3 ответа
Это очень широкий вопрос, вот общее описание того, как вы можете это сделать...
Найдите сильные черты или углы на обоих изображениях, используя
cvGoodFeaturesToTrack()
Передайте функции, которые вы нашли в
cvFindCornerSubPix()
чтобы получить более точное представление с плавающей запятой расположения сильных объектовРассчитайте оптический поток между двумя изображениями, используя субпиксельные функции из последнего шага, используя
cvCalcOpticalFlowPyrLK
или другая функция оптического потока. (Мне нравитсяcvCalcOpticalFlowPyrLK()
)
Вот где это становится сложным... для того, чтобы выпрямить изображения, полезно иметь некоторые знания о внутренних свойствах камеры (поле зрения, фокусное расстояние), особенно если вы планируете выполнить какую-то 3D-реконструкцию или вычислить несоответствие. Поскольку вы ничего не упомянули о настройке калиброванной камеры, я продолжу некалиброванный алгоритм.
Вам нужно будет найти Фундаментальную Матрицу, которая кодирует все аспекты сцены, используемые для вычисления матрицы выпрямления. использование
cvFindFundamentalMatrix()
сделать это.Вооружившись фундаментальной матрицей, вы теперь должны найти матрицу гомографии, которая отобразит оба изображения в одной плоскости. использование
cvStereoRectifyUncalibrated()
сделать это. Хотя название предполагает, что оно исправляет ваши изображения, это НЕ так, оно просто возвращает матрицы гомографии, которые вы можете использовать для исправления ваших изображений.Наконец, используя матрицы гомографии из последнего шага, вы можете исправить оба изображения, вызвав
cvInitUndistortRectifyMap()
чтобы получить матрицу переназначения, а затем передать это вcvRemap()
сделать реальное переназначение.
Я должен предупредить вас, что существует множество параметров, которые входят в каждый из этих библиотечных вызовов, и вам придется манипулировать многими матрицами и многими изображениями, не говоря уже о том, что без внутренней детализации калибровки камеры вам придется делать много предположений, которые могут существенно повлиять на вашу работу. результаты... Это нелегкая задача.
Я бы порекомендовал купить и / или прочитать Learning OpenCV, если вы хотите узнать больше, это выходит за рамки короткого параграфа на stackru, чтобы ожидать, чтобы узнать все это:)
Этот вопрос уже давно был опубликован, однако я думаю, что в настоящее время ответ можно обновить. Вот несколько советов.
Согласно определению выпрямления изображения, которое представляет собой процесс преобразования двух или более изображений в общую плоскость изображения. Это может упростить проблему поиска точек совпадения между изображениями. Кроме того, это увеличивает производительность многих приложений, таких как извлечение карты глубины.
Таким образом, чтобы выполнить исправление, вы должны знать внешние параметры камеры, внутренние параметры камеры и параметры искажения. Сначала выражают положения между камерами, другие преобразуют координаты кадра пикселя в координату кадра камеры, а последние отвечают за удаление радиальных искажений. Ниже вы можете найти некоторые инструменты для оценки параметров:
Когда вы, наконец, знаете эти параметры, вы можете выполнить выпрямление между каждой камерой отдельно:
- процесс исправления на openCV, проверьте StereoRectify.
- тот же алгоритм уже реализован в стерео конвейере ROS.
- в Computer Vision System Toolbox Matlab и нескольких других учебных пособиях, таких как: Du Huynh
http://www.vision.caltech.edu/bouguetj/calib_doc/ может быть, это будет полезно