Карта глубины / несоответствия от движущейся камеры в OpenCV

Возможно ли получить карту глубины / несоответствия с движущейся камеры? Скажем, я делаю изображение в точке x, после того, как я проехал, скажем, 5 см, я сделал еще один снимок, и оттуда я вычислил карту глубины изображения.

Я пробовал использовать BlockMatching в opencv, но результат не очень хороший. Первое и второе изображения выглядят следующим образом: первое изображение, второе изображение, карта несоответствия (цвет), карта несоответствия

Мой код выглядит следующим образом:

    GpuMat leftGPU;
    GpuMat rightGPU;
    leftGPU.upload(left);rightGPU.upload(right);
    GpuMat disparityGPU;
    GpuMat disparityGPU2;
    Mat disparity;Mat disparity1,disparity2;
    Ptr<cuda::StereoBM> stereo = createStereoBM(256,3);
    stereo->setMinDisparity(-39);
        stereo->setPreFilterCap(61);
        stereo->setPreFilterSize(3);
        stereo->setSpeckleRange(1);
        stereo->setUniquenessRatio(0);
    stereo->compute(leftGPU,rightGPU,disparityGPU);
    drawColorDisp(disparityGPU, disparityGPU2,256);
    disparityGPU.download(disparity);
    disparityGPU2.download(disparity2);
    imshow("display img",disparityGPU);

как я могу это улучшить? На карте цветового несоответствия имеется довольно много ошибок (т. Е. Высокий кружок красного цвета, и он такой же, как некоторые части таблицы). Кроме того, на карте несоответствия есть небольшой шум (все черные точки на картинке), как я могу дополнить эти черные точки соседними несоответствиями?


person user9870    schedule 31.01.2018    source источник


Ответы (1)


Возможно, если объект статический.

Чтобы правильно выполнить стереосопоставление, вам сначала нужно исправить ваши изображения! Если у вас нет откалиброванных камер, вы можете сделать это по обнаруженным характерным точкам. Также обратите внимание, что для cuda::StereoBM минимальное несоответствие по умолчанию равно 0. (Я никогда не использовал cuda, но не думаю, что ваш setMinDisparity что-то делает, см. this anser.)

Теперь в ваших примерах изображений соответствующие точки находятся всего в 1 строке друг от друга, поэтому ваша карта несоответствия на самом деле выглядит не так уж плохо. Может быть, в этом особом случае уже подойдет больший blockSize.

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

person jodis    schedule 01.02.2018
comment
да, мой объект статичен. Что касается калибровки камеры, это просто обычная калибровка одной камеры? Это потому, что, когда я поискал в Интернете, я обнаружил, что люди делают калибровку камеры стереовидения (которая предполагает, что она отличается от системы камеры моновидения). Для сопоставления блоков это также одна из проблем, с которыми я боролся. Это потому, что, как вы знаете, поскольку это гладкая поверхность, алгоритму очень трудно идентифицировать. Знаете ли вы какой-либо алгоритм, кроме Block Matching, который лучше работает при низкой текстуре? - person user9870; 02.02.2018
comment
Вы не сможете выполнить стереокалибровку с одной движущейся камерой, если камера не всегда движется по одному и тому же вектору. Итак, если вы выполняете калибровку одной камеры, вы можете undistort. Вы можете попробовать cuda::StereoBeliefPropagation, но я не знаю этого алгоритма. Если скорость не слишком важна, вы также можете попробовать фильтрацию сообщений - person jodis; 02.02.2018
comment
Это помогло? Я считаю, что в стерео-сопоставлении OpenCV лучшее, что вы можете сделать с низко-текстурированными областями, - это SGBM и пост-фильтрация. Если этого недостаточно, попробуйте github.com/t-taniai/LocalExpStereo, что в настоящее время занимает первое место в наборе данных Миддлбери. Или вы можете рассмотреть возможность использования другого датчика, например камеры времени полета, такой как Kinect v2. - person jodis; 06.02.2018
comment
Привет спасибо! Распространение стереофонической веры идет слишком медленно ... Ваш комментарий о низкой текстуре очень помогает. Я пробовал использовать маску лапласа, чтобы сделать изображение резче (а значит, больше текстуры), и теперь это может дать очень хороший результат. Вдобавок к этому я использую метод определения порога (порог до нуля) для удаления фона ... Но в то же время он сохраняет текстуру самого изображения. - person user9870; 06.02.2018