Начал разбирать. Разработка вроде бы MIT от 2004 года. Должно быть актуально и по взрослому.
Чтобы мне жизнь никому легкой не казалось, а скорость зашкаливала они применили ассемблерные вставки и наборы специальных инструкций MMX и SSE2.
Далее перечисляю основные их функции (практически каждая функция имеет несколько вариаций, чем отличаются можно догадаться по тексту или по набору входных/выходных данных) и чего они делают:
(несмотря на то что библиотека позволяет работать с тройками изображений я везде по тексту буду писать "стереопара")
(не будут описываться функции производящие пакетную обработку, то есть лишь вызывающие подряд неборы других функций)
Функция №1. NormalizeImages (stereoMatching.cpp)
Приводит изображения к одному среднему уровню яркости (сразу косяк - если одна из камер словила источник света, а остальные нет - тут все съедет).
Функция №2. doReconstruction (reconst3D.cpp)
Получает на входе массив опознанных точек (idx - адрес точки на изображении, disp - смещение), на выходе выдает локальные координаты этих точек (x,y,z), используя параметры камеры.
Функция №3. estimateStereo (stereoMatching_algo.cpp)
Собственно основная их функция, на входе получает стереопару, на выходе дает массив смещений, которые удалось определить.
С ходу разобраться как она работает не удалось, сначала анализируется какое-то подмножество данных, позже из него анализируется весь остальной массив данных.
Функция №4. doStereo_grow (stereoMatching.cpp)
Пока вообще не понял чего она делает, похоже на основе первичного отбора точек каким-то образом заполняет оставшиеся нераспознанные места на стереопаре.
Важные поля и переменные объекта stereoMatching:
* nbDepth - ? (всегда кратно 8, в примере = 32)
* horopter - ? (в примере = 0)
* peakValidationThreshold - ? (в примере = 5)
* nbPartition - ? (в пакетной процедуре = 8 )
* maskSize[X|Y](оно же - correlationWindowSize) - размер окна для нахождения соответствий между левым и правым изображением (в примере = 9х9)
Хорошо бы понять какой метод они используют, я вчера немного поразбирался с вопросом, оказывается существует как минимум три метода:
-вариационный, заключающий в поиске такой функции соответствий точек, при которой она минимизирует суммарную разность яркостей, звучит страшненько, но в целом задача сводится к решению диффура.
-корреляционный, пишут, что он не очень стабильный;
-сопоставление краев, вроде как, самый лучший, но соответствия получаются только на краях, что тоже не очень хорошо, так как в остальных случаях будет одна интерполяция, и он не использует градиентные области.
Читал в Хорне, посмотри сам, познавательно.
Есть ли какие-нибудь описания к ассемблерным вставкам?
Видимо скорость работы существенно повышается с ними.
В идеале нужно посмотреть результаты работы.