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

#c #opencv #disparity-mapping

#c #opencv #отображение несоответствий

Вопрос:

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

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

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

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

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

Ответ №1:

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

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

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

Комментарии:

1. Но для меня это не имеет смысла. Если я увеличу минимальное несоответствие, я потеряю дальние объекты, если я уменьшу максимальное несоответствие, я потеряю близкие объекты. Поскольку моя рука все еще видна на обоих изображениях, почему она просто не находит правильное соответствие? … Моя другая идея состоит в том, чтобы вычислить две карты диспропорций, например, 0-48 и 48-96, а затем как-то объединить их (но я не уверен, как), но я не вижу в этом 100% решения.

2. Я попробовал эксперимент. Я изменил код StereoSGBM OpenCV, чтобы запускать minX1 всегда с нуля, а не с значения maxDisparity, и в результате он работает правильно — моя рука видна на карте диспаритета, ее расстояние определено правильно, и, похоже, проблем нет.

3. Может показаться, что она работает правильно. Однако вы столкнетесь с огромной кучей проблем, как только изображение будет содержать повторяющиеся структуры!

4. Однако я понимаю, что проблемы с повторяющимися структурами могут возникать при сопоставлении стерео независимо от моего изменения. И мне просто нужна карта несоответствий для всего поля зрения.

5. @bigmuscle: Да, это всегда может случиться. Но имейте в виду, что с вашим подходом проблема усугубляется!