Я пытался реализовать простой конвейер SFM в OpenCV для проекта, и у меня возникли некоторые проблемы.
Это для некалиброванных камер, поэтому у меня нет матрицы камеры (да, я знаю это сделает вещи намного более сложными и двусмысленными).
Я знаю, что мне следует прочитать гораздо больше, прежде чем пытаться сделать что-то подобное, но у меня очень мало времени, и я пытаюсь читать о вещах как Я сталкиваюсь с ними.
Вот мой текущий конвейер, который я собрал из ряда статей, примеров кода и книг. После этого я разместил вопросы о конкретных шагах, а также хотел бы знать, есть ли что-то, что я упускаю в этом, или я делаю что-то неправильно?
Вот мой текущий конвейер.
- Извлечение ключевых точек SIFT/SURF из изображений.
- Pairwise Matching of Images.
- During Pairwise Matching I run the "Ratio Test" to reduce the number of keypoints.
- (Not sure about this) I read that calculating Fundamental Matrix (RANSAC) and getting rid of the outliers from matches further helps it.
Q) Do I need to even do this? Is it too much Or should I be doing something else like Homography to avoid the Degenerate case of the 8-Point?
Next, I need to choose 2 images to begin the reconstruction with.
- I find the number of Homography Inliers between image pairs. I iterate through a list of image pairs in order of most number of % inliers.
- Я вычисляю Фундаментальную Матрицу.
- Я «угадываю» K-матрицу и вычисляю основную матрицу по формуле Хартли.
- I decompose this Essential Matrix with SVD and then verify the 4 solutions.
- I used the logic from Wikipedia's entry and this python gist to implement my checks.
Q) Is this right? Or should I just triangulate the points and then determine if they are in front of the camera or not or does it work out to the same thing?
- I used the logic from Wikipedia's entry and this python gist to implement my checks.
- Если возникли проблемы с поиском Essential Matrix, пропустите его и проверьте следующую пару изображений.
Установите P=[I|0] и P1=[R|T], выполните триангуляцию и сохраните 3D-точки в некоторой структуре данных. Также сохраните P-матрицы.
- #P4# <блочная цитата> #P5# блочная цитата>
Выберите следующее изображение для добавления на основе наибольшего количества наблюдаемых 3D-точек.
- Оцените положение этого нового изображения по уже известным 3D-точкам, используя что-то вроде PnPRasnac. Используйте значения R & t как проективную матрицу P1 = [R | t]
- #P7# <блочная цитата> #P8# блочная цитата>
Из точек, полученных в результате триангуляции, добавьте только те 3D-точки, которые еще не сохранены.
- Запускайте Bundle Adjustment после каждой пары изображений
- Вернитесь к шагу 6, пока все изображения не будут добавлены.
Основные вопросы:
- Должен ли я использовать неискажение для точек или что-то в этом роде, даже если моя матрица камеры K - это только предположение?
- Для корректировки пакетов я вывожу точки в файл в формате Bundle Adjustment at Large (BAL). Должен ли я преобразовывать их в мировое координатное пространство с помощью R=R' & T=-RT или просто оставить их такими?
Я знаю, что это, должно быть, сделало для длинного чтения. Большое спасибо за уделенное время :)