我目前正在使用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));
}
除了视差图中的黑色左边框外,此方法正常,如下所示:
输入图像是这两个 - 未经校正,如您所见;):
所以现在我的问题是: 这是正常的行为吗?或者你看到我到目前为止做的任何错误? 作为另一个信息,整改工作正常
答案 0 :(得分:0)
缺失区域的宽度等于stereo_bm中使用的差异数。这是stereo_bm algorithm
的正常副产品。
答案 1 :(得分:0)
我认为这是因为算法通过将左图像中的像素周围的块与右图像中同一行中的像素周围的块进行匹配来计算视差(假设图像被校正)。由于存在左侧摄像机和右侧摄像机的视图之间没有重叠的区域,因此该算法无法找到该区域内的像素周围的块的匹配。 “缺失”区域的宽度等于参数“视差数”,因为算法放弃尝试在“视差数”尝试之后匹配给定块(在与左图像中的像素相同的水平行中)。如果我不够清楚,我很抱歉。如果您希望获得有关其工作原理的更多详细信息,请参阅http://siddhantahuja.wordpress.com/2010/04/11/correlation-based-similarity-measures-summary/中的一些代码。