Построение правого изображения из левого изображения и карты диспаратности - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь построить изображение правого обзора из изображения левого обзора и его карты диспаратности.Я использую набор данных middleburry 2003 (http://vision.middlebury.edu/stereo/data/scenes2003/) с полноразмерными изображениями, что означает, что значение v каждого пикселя на карте диспаратности соответствует сдвигу v пикселей на изображении левого обзора.

Мой алгоритм довольно прост. Для каждого пикселя координат (x, y) в изображении левого обзора я копирую этот пиксель в изображение правого обзора, но в координатах (x - d, y), где d - значениекарты диспаратности в координатах (x, y). Если значение диспаратности равно 0, я просто ничего не делаю. Я использую openCV для манипулирования изображениями.

Вот мой код:

void computeCorrespondingImage(const cv::Mat &img, const cv::Mat &disparity, cv::Mat &dest,
                           const bool leftInput, const int disparityScale)
{
    const int shiftDirection = leftInput ? -1 : 1;
    dest.create(img.rows, img.cols, img.type());

    for (int i(0) ; i < img.rows ; ++i) {
        for (int j(0) ; j < img.cols  ; ++j) {
            const uchar d(disparity.at<const uchar>(i, j));
            const int computedColumn(j + shiftDirection * (d / disparityScale));

            // No need to consider pixels who would be outside of the image's bounds
            if (d > 0 && computedColumn >= 0 && computedColumn < img.cols) {
                dest.at<cv::Vec3b>(i, computedColumn) = img.at<const cv::Vec3b>(i, j);
            }
        }
    }
}

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

Изображение левого обзора:

enter image description here

Разница между правдой и землейy карта:

enter image description here

Что я получаю:

enter image description here

Спасибозаранее за вашу помощь.

1 Ответ

0 голосов
/ 01 февраля 2019

Хорошо, я понял это.Я загружал изображение несоответствия с помощью imread, не указывая, что это было изображение в оттенках серого (с IMREAD_GRAYSCALE).Поэтому openCV загружал его как изображение RGB, и когда я обращался к пикселю несоответствия с помощью at (), я указывал uchar в качестве требуемого типа.Так что я думаю, что было какое-то преобразование из Vec3b в uchar, которое давало ложные значения.

...