从左视图图像和视差图构造右视图图像

时间:2019-01-28 18:48:12

标签: image opencv image-processing stereo-3d disparity-mapping

我正在尝试从左视图图像及其视差图构造右视图图像。我将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

真相差异图:

enter image description here

我得到的是:

enter image description here

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

好,我知道了。我在加载视差图像时未指定其为灰度图像(使用IMREAD_GRAYSCALE)。因此,openCV将其作为RGB图像加载,当我使用at()访问视差像素时,我将uchar指定为所需类型。所以我想可能是从Vec3b到uchar的转换产生了错误的值。