Вопросы о конвейере Structure From Motion

Я пытался реализовать простой конвейер SFM в OpenCV для проекта, и у меня возникли некоторые проблемы.

Это для некалиброванных камер, поэтому у меня нет матрицы камеры (да, я знаю это сделает вещи намного более сложными и двусмысленными).
Я знаю, что мне следует прочитать гораздо больше, прежде чем пытаться сделать что-то подобное, но у меня очень мало времени, и я пытаюсь читать о вещах как Я сталкиваюсь с ними.

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

Вот мой текущий конвейер.

  1. Извлечение ключевых точек SIFT/SURF из изображений.
  2. Pairwise Matching of Images.

    1. During Pairwise Matching I run the "Ratio Test" to reduce the number of keypoints.
    2. (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?

  3. Next, I need to choose 2 images to begin the reconstruction with.

    1. 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.
    2. Я вычисляю Фундаментальную Матрицу.
    3. Я «угадываю» K-матрицу и вычисляю основную матрицу по формуле Хартли.
    4. 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?

    5. Если возникли проблемы с поиском Essential Matrix, пропустите его и проверьте следующую пару изображений.

  4. Установите P=[I|0] и P1=[R|T], выполните триангуляцию и сохраните 3D-точки в некоторой структуре данных. Также сохраните P-матрицы.

  5. #P4# <блочная цитата> #P5#
  6. Выберите следующее изображение для добавления на основе наибольшего количества наблюдаемых 3D-точек.

  7. Оцените положение этого нового изображения по уже известным 3D-точкам, используя что-то вроде PnPRasnac. Используйте значения R & t как проективную матрицу P1 = [R | t]
  8. #P7# <блочная цитата> #P8#
  9. Из точек, полученных в результате триангуляции, добавьте только те 3D-точки, которые еще не сохранены.

  10. Запускайте Bundle Adjustment после каждой пары изображений
  11. Вернитесь к шагу 6, пока все изображения не будут добавлены.

Основные вопросы:

  • Должен ли я использовать неискажение для точек или что-то в этом роде, даже если моя матрица камеры K - это только предположение?
  • Для корректировки пакетов я вывожу точки в файл в формате Bundle Adjustment at Large (BAL). Должен ли я преобразовывать их в мировое координатное пространство с помощью R=R' & T=-RT или просто оставить их такими?

Я знаю, что это, должно быть, сделало для длинного чтения. Большое спасибо за уделенное время :)


person user3380068    schedule 25.04.2014    source источник
comment
возможно, взгляните на документы из: graphics.rwth-aachen.de/person/ 21 Я знаю, что он работал со структурой из техники движения, но не знаю, все ли он объяснил в газетах.   -  person Micka    schedule 25.04.2014
comment
Я не знаю ответа на второй вопрос, но на первый. Обычно я сначала искажаю точки, однако я читал, что библиотека AR, такая как Metaio, на самом деле не использует искажение объектива, так что, возможно, вы можете отказаться от этого.   -  person sub_o    schedule 25.04.2014
comment
Несколько комментариев: A. Не являются ли шаги 2.2 и шаги 3.1+3.2 излишними? B. Как на шаге 6 узнать, наблюдается ли на другом изображении какая-либо из известных трехмерных точек? C. На шаге 8, что вы имеете в виду под Триангулировать это новое изображение со всеми изображениями, триангулированными до сих пор? D. Не могли бы вы пояснить свой второй общий вопрос? Речь идет о формате файла хранилища или системе 3D-координат? E. В конечном счете, вас действительно интересует оценка 3D-сцены, 3D-траектории или того и другого?   -  person BConic    schedule 27.04.2014


Ответы (2)


Предлагаемый вами конвейер в целом правильный. Кроме 3.1.

2.2) Правильно. RANSAC выбирает точки случайным образом для оценки фундаментальной матрицы и достаточно устойчив к выбросам (конечно, если у вас достаточно достоверных совпадений). Выбросы гомографии НЕ обязательно являются плохими совпадениями, поэтому гомографию не следует использовать для фильтрации совпадений.

3.1) Неверно: гомографические вкрапления — это совпадения, которые идеально выровнены в обоих представлениях, например, точки, которые демонстрируют пропорциональное или подобное движение между двумя представлениями. Это означает, что чем выше количество гомографических вставок в паре представлений, тем МЕНЬШЕ ViewPair является хорошим кандидатом в качестве исходного для базовой триангуляции. Матрицы камер таких 2 видов из фундаментальной матрицы, оцененные с помощью RANSAC, скорее всего, окажутся неточными, и реконструкция никогда не наладится. Вместо этого вы хотите начать с ViewPair, который имеет НАИМЕНЬШИЙ процент омографических вставок и все еще большое количество совпадений. К сожалению, пары изображений, которые имеют наибольшее количество совпадений, также обычно имеют наибольшее количество омографических вставок. Это связано с тем, что обычно эти пары содержат очень мало движения камеры...

3.4) Что я делаю, так это пробую триангуляцию, используя все 4 возможных неоднозначности матрицы камеры. R1|t1, R1|t2, R2|t1, R2|t2

8) Да

person Francois Zard    schedule 05.01.2016

Я могу рекомендовать эту статью; https://github.com/godenlove007/master-opencv-book/tree/master/Chapter4_StructureFromMotion

Для его сборки вам потребуются библиотеки SSBA и PCL в качестве предварительных условий. SSBA довольно просто построить, но PCL может оказаться сложной задачей, если вы планируете использовать Visual Studio 2013. В этом случае вам придется собрать необходимые компоненты PCL из исходного кода, а это займет некоторое время.

Как только вы создадите этот проект, вы сможете проверить, как это сделал тот парень, и сравнить с вашими идеями.

person karttinen    schedule 22.07.2014