Я пытаюсь построить изображение правого обзора из изображения левого обзора и его карты диспаратности.Я использую набор данных 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);
}
}
}
}
Поскольку карта несоответствия является картой несоответствия истинности земли, я ожидаю получить изображение, очень похожее на изображение правого обзора, представленное в наборе данных, с некоторыми черными областями (для которых несоответствие неизвестно).по некоторым причинам это похоже на то, что вычисленное изображение правого обзора разделяется в центре, что делает изображение непригодным для использования.
Изображение левого обзора:
Разница между правдой и землейy карта:
Что я получаю:
Спасибозаранее за вашу помощь.