Пирамида шкалы детектора сфер
Пройдя несколько курсов по компьютерному зрению на Coursera, я решил реализовать свой собственный конвейер визуальной одометрии. Я пытаюсь реализовать все основные алгоритмы (обнаружение функций, описание, сопоставление, триангуляция,...) самостоятельно и использую opencv только для таких структур и алгоритмов, как SVD, свертка и тому подобное. (см. https://github.com/makra89/Visual-Odometry-Cpp)
Я успешно реализовал полную цепочку от ввода изображения до вывода дельта-положения и протестировал ее, используя данные котенка. Работает на удивление хорошо. Цепочка функций, которую я использую для этого:
- ориентированный детектор функций FAST
- повернутый КРАТКОЕ
- LSH (локальное хеширование) сопоставитель
Таким образом, в основном это цепочка ORB без масштабной инвариантности. Поэтому в настоящее время я реализую масштабную пирамиду для завершения подхода ORB. У меня проблемы с этим.
При тестировании детектора ORB с реальными данными я вижу огромное ухудшение качества расчетных положений дельты, которое, кажется, происходит из-за большего количества совпадений с плохими характеристиками по сравнению с цепочкой, которую я использовал раньше. Похоже, что при сопоставлении в разных масштабах возникает проблема.
Допустим, у меня есть пирамида функций с тремя слоями и масштабным коэффициентом 0,5. Таким образом, нижний слой будет иметь масштаб 0,25. Когда я обнаруживаю объект на этом уровне и пытаюсь вычислить положение в исходном изображении, мне приходится умножать положение объекта на обратную шкалу. При использовании этого подхода сдвиг в позиции объекта на 1 пиксель приведет к сдвигу на 4 пикселя исходного изображения. Это означает, что сама позиция объекта действительно "шумная". Чем глубже моя пирамида, тем хуже проблема.
Есть ли решение этого? Как это решается в opencv ORB? Поможет ли в этом случае обнаружение субпиксельной функции?
Заранее спасибо!