Карта несоответствия OpenCV вырезана слева

Я пытаюсь вычислить карту несоответствия на C ++ с помощью OpenCV 3.1. Я использую алгоритм StereoSGBM, и мне нужно уметь распознавать далекие и очень близкие объекты. Поэтому я установил MinDisparity на -16 и MaxDisparity 160.

Камера теперь правильно откалибрована, но полученная карта несоответствия обрезана слева. Величина разреза зависит от настроек MaxDisparity.

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

Посмотри на эту картинку. Почему моя рука не видна на результате? введите описание изображения здесь

Есть ли решение этой проблемы? Для расчета карты диспаратности для всей видимой области в случае высоких настроек MaxDisparity?


person bigmuscle    schedule 14.10.2016    source источник


Ответы (1)


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

Берется пиксель правого изображения и сравнивается с каждым пикселем в пределах диапазона несоответствия от левого изображения. Если левое изображение слишком маленькое, несоответствие недопустимо. Поэтому 176 крайних левых пикселей в левом изображении отбрасываются.

Постарайтесь уменьшить максимальное неравенство и / или увеличить минимальное неравенство!

person Trevir    schedule 14.10.2016
comment
Но для меня это не имеет смысла. Если я увеличу минимальное несоответствие, я потеряю удаленные объекты, если я уменьшу максимальное несоответствие, я потеряю близкие объекты. Поскольку моя рука все еще видна на обоих изображениях, почему она просто не находит правильного совпадения? ... Моя другая идея - вычислить две карты несоответствий, например 0-48 и 48-96, а затем как-то их объединить (но я не уверен, как), но я не считаю это 100% решением. - person bigmuscle; 14.10.2016
comment
Я попробовал провести эксперимент. Я изменил код OpenCV StereoSGBM, чтобы minX1 всегда запускался с нуля, а не с значения maxDisparity, и в результате он работает правильно - моя рука видна на карте несоответствия, расстояние до нее определяется правильно, и, похоже, проблем нет. - person bigmuscle; 18.10.2016
comment
Может показаться, что это работает правильно. Однако вы столкнетесь с огромной кучей проблем, как только изображение будет содержать повторяющиеся структуры! - person Trevir; 18.10.2016
comment
Однако я понимаю, что проблемы с повторяющимися структурами могут появиться при стереосопоставлении независимо от моего изменения. А мне просто нужна карта диспаратности на все поле зрения. - person bigmuscle; 19.10.2016
comment
@bigmuscle: Да, это всегда может случиться. Но знайте, что с вашим подходом проблема усугубляется! - person Trevir; 19.10.2016
comment
Да, но есть ли лучший способ правильно вычислить карту несоответствия для всей видимой области (включая далекие объекты и очень близкие объекты) = распознать даже мою руку на верхнем рисунке? - person bigmuscle; 20.10.2016