#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: Да, это всегда может случиться. Но имейте в виду, что с вашим подходом проблема усугубляется!