视差图中缺失的区域

时间:2012-09-17 10:54:53

标签: c++ opencv disparity-mapping

我目前正在使用opencv2.3和Pointgrey Bumblebee2立体相机作为输入设备进行立体声处理。通过 libdc1394 获取图像。

我的整改和立体声处理代码如下:

void StereoProcessing::calculateDisparityMap(const Mat &left, const Mat &right, Mat &disparity_map)

  Mat map11, map12, map21, map22, left_rectified, right_rectified, disp16;

  // Computes the undistortion and rectification transformation maps
  initUndistortRectifyMap(this->camera_matrix1,
        this->distance_coefficients1,
        this->R1,
        this->P1,
        this->output_image_size,
        CV_16SC2,
        map11,
        map12);
  initUndistortRectifyMap(this->camera_matrix2,
        this->distance_coefficients2,
        this->R2,
        this->P2,
        this->output_image_size,
        CV_16SC2,
        map21,
        map22);

  // creates rectified images
  remap(left, left_rectified, map11, map12, INTER_LINEAR);
  remap(right, right_rectified, map21, map22, INTER_LINEAR);

  // calculates 16-bit disparitymap
  this->stereo_bm(left_temp, right_temp, disp16);

  disp16.convertTo(disparity_map, CV_8U, 255 / (this->stereo_bm.state->numberOfDisparities * 16.0));
}

除了视差图中的黑色左边框外,此方法正常,如下所示:

Disparity map with black border on the left side

输入图像是这两个 - 未经校正,如您所见;): left unrectified image right unrectified image

所以现在我的问题是: 这是正常的行为吗?或者你看到我到目前为止做的任何错误? 作为另一个信息,整改工作正常

2 个答案:

答案 0 :(得分:0)

缺失区域的宽度等于stereo_bm中使用的差异数。这是stereo_bm algorithm的正常副产品。

答案 1 :(得分:0)

我认为这是因为算法通过将左图像中的像素周围的块与右图像中同一行中的像素周围的块进行匹配来计算视差(假设图像被校正)。由于存在左侧摄像机和右侧摄像机的视图之间没有重叠的区域,因此该算法无法找到该区域内的像素周围的块的匹配。 “缺失”区域的宽度等于参数“视差数”,因为算法放弃尝试在“视差数”尝试之后匹配给定块(在与左图像中的像素相同的水平行中)。如果我不够清楚,我很抱歉。如果您希望获得有关其工作原理的更多详细信息,请参阅http://siddhantahuja.wordpress.com/2010/04/11/correlation-based-similarity-measures-summary/中的一些代码。