Создание карты Stereo Disparity

Я работаю над набором данных KITTI, я делаю 2 изображения и нахожу несоответствие, чтобы получить трехмерное облако точек. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу получить хорошую карту несоответствия. Большая часть значения несоответствия меньше 0,1 Значения диспаратности находятся в диапазоне от 0 до 1 (нужно ли их масштабировать). Параметры моей стереосистемы указаны ниже

cv::StereoBM sbm;
    sbm.state->SADWindowSize = 9;
    sbm.state->numberOfDisparities = 112;
    sbm.state->preFilterSize = 5;
    sbm.state->preFilterCap = 1;
    sbm.state->minDisparity = 0;
    sbm.state->textureThreshold = 5;
    sbm.state->uniquenessRatio = 5;
    sbm.state->speckleWindowSize = 0;
    sbm.state->speckleRange = 20;
    sbm.state->disp12MaxDiff = 64;
sbm(leftimage, rightimage,disp);
    normalize(disp, disp8, 0.1, 255, CV_MINMAX, CV_8U);

правое изображениелевое изображение Карта диспаратности


person shashank bhushan    schedule 09.01.2015    source источник
comment
Мне кажется, что у вас слишком маленький размер окна. Размер вашего окна составляет 9 x 9, но если вы посмотрите на смещение справа, где вы видите дорожный знак, я уверен, что оно намного больше, чем окно в 9 пикселей. Вы пробовали увеличить размер окна? А как насчет 15? 25?   -  person rayryeng    schedule 09.01.2015
comment
Вторая проблема заключается в том, что почти все значения диспаратности ниже 1, чего не должно быть.   -  person shashank bhushan    schedule 10.01.2015
comment
Вы меняли размер окна?   -  person rayryeng    schedule 10.01.2015
comment
да .... получилось лучше, когда я использовал 15 .... получилось хуже, когда использовал 25 .... так что меня тошнило с 15 ..... спасибо ... Я настроил все параметры с помощью панели инструментов скачано по этой ссылке martinperis.com/stereobmtuner/stereoBMTuner-1.0.tgz   -  person shashank bhushan    schedule 10.01.2015
comment
Без проблем. Да, когда вы делаете несоответствие с раздвижными окнами, вам нужно найти правильное окно. Слишком маленький означает, что вы не заметите никакого несоответствия ... а слишком большой означает, что вы можете вводить ложную информацию в окна сравнения. Несмотря на то, что использование скользящих окон происходит быстро, они не обеспечивают наилучших результатов. Была проведена некоторая работа по адаптивному определению размера окна. Проверьте работу Канаде и Окутоми: cs.cmu.edu/~ ph / 869 / paper / kanade-okutomi.pdf - в любом случае, я ухожу далеко от темы. Рад, что у вас получилось работать!   -  person rayryeng    schedule 10.01.2015
comment
Спасибо за вашу помощь и информацию ...   -  person shashank bhushan    schedule 10.01.2015
comment
Для наземных точек используется прямоугольное окно (больше ширины, чем высоты), поскольку они имеют изменяющееся несоответствие по оси y (поэтому несоответствие не является постоянным в области скользящего окна). В связи с этой темой вы можете взглянуть на исследование, связанное с V-несоответствием изображений.   -  person Antonio    schedule 19.02.2015
comment
извините @Antonio, я не понял вашей точки зрения. Не могли бы вы уточнить. Спасибо   -  person shashank bhushan    schedule 19.02.2015
comment
Представьте квадратное окно с центром на земле. Верхние пиксели этого окна соответствуют более удаленной точке земли, чем пиксели, соответствующие нижним пикселям того же окна. Следовательно, правильное несоответствие верхних пикселей ниже, чем нижних пикселей в том же окне. Для больших окон это приводит к плохому совпадению. Однако, например, если вы используете окно с двойной шириной и половиной высоты (с одинаковой площадью), разница в несоответствии между верхним и нижним пикселями будет меньше, с более однородным несоответствием внутри окна, что, возможно, приведет к лучшему совпадению.   -  person Antonio    schedule 19.02.2015


Ответы (1)


Карта диспаратности, которая у вас есть, "выглядит" хорошо для блочного сопоставления.

Блочное сопоставление - это самый простой метод получения карт диспаратности. Это локальный метод, который вычисляет оценку диспаратности с помощью перебора (фильтрация по модулю из opencv). Следовательно, его выход ограничен по точности и обычно является шумным.

Как уже упоминалось, вы можете настроить размер окна, чтобы немного улучшить результаты, но это не улучшит несоответствие значительно.

Посмотрите оценку стерео в тесте KITTI и выберите более точный алгоритм, если у вас есть к. OpenCV имеет реализацию SGM, которая обеспечивает более плавное неравенство. Желаемое качество карт диспаратности зависит от вашего приложения. В некоторых случаях достаточно сопоставления блоков. Для других это может быть не так.

Помните, что определение несоответствия: разница между координатой x пикселя в левом изображении и соответствующим ему пикселем в правом изображении. То есть единицей измерения несоответствия являются «пиксели».

Чем больше неравенство, тем ближе объекты. Когда вы масштабируете изображение для отображения, большие диспропорции становятся ярче. Например, дорожный знак находится ближе к камере и кажется ярче пикселей на дороге.

Ваши значения диспаратности не должны быть между 0 и 1. Вы масштабируете изображение для отображения как uint8, что подходит для отображения, но не подходит для использования диспаратности для фактического измерения.

В OpenCV поведение по умолчанию заключается в создании карты диспаратности в виде короткого знака со знаком, полученного путем умножения субпиксельных сдвигов на 16. Чтобы получить истинные значения диспаратности, вы делите вывод opencv на 16 и конвертируете в число с плавающей запятой.

Вы можете сделать что-то вроде этого:

cv::Mat<float> true_dmap = disp * (1.0 / 16.0f);

or

disp.convertTo(true_dmap, CV_32F, 1.0/16.0, 0.0);

Или вы можете вызвать reprojectImageTo3D, чтобы получить облако точек с учетом расчетной карты несоответствия и стерео калибровка.

Обратите внимание: если вы попытаетесь отобразить true_map через imshow, вы не увидите ничего значимого.

Удачи,

person bendervader    schedule 24.03.2015
comment
Привет, Бендер, это был довольно впечатляющий ответ, я использовал версию stereoBM для графического процессора в OpenCV, которая странным образом возвращает результаты, отличные от результатов CPU, и большая часть установщика параметров настройки, похоже, ничего не делает, версия кода для GPU возвращается в 8UC1, в отличие от аналога ЦП, который возвращается в 16SC1. Мои расчеты глубины кажутся ошибочными, как будто я получаю 20000 см на расстояние 50 см. Что мне делать, чтобы добиться нужного расстояния. - person mohanen b; 30.06.2018