我正在使用 cv :: cuda :: stereoBM 创建视差地图。与CPU版本共处,地图看起来更暗,我不确定它是否有意义。如我得到的以下结果所示, CUDA 视差图中的左边人几乎丢失了,我无法进行进一步的距离计算。
目前,我发现使用 CUDA的视差图的数据类型是CV_8U ,而CPU版本是 CV_16S (使用imshow时需要转换)。我没有调整数据类型的参数,不知道它们为什么不同。我想这可能是关键原因,但不知道如何改进地图。
以下是我遵循的示例(使用CPU tho):基本上只创建左视差图,右视差图,然后使用它们并进行后置过滤。 (我使用 CUDA 获得了不同的结果,不仅是最终的过滤结果,还有正确的地图)。
https://docs.opencv.org/3.1.0/d3/d14/tutorial_ximgproc_disparity_filtering.html
我使用CPU的结果 enter image description here
我使用GPU的结果 enter image description here
Ptr<cuda::StereoBM> left_matcher = cuda::createStereoBM(96, 15);
left_matcher->compute(GPUrgb1, GPUrgb2, d_left_disp);
int min_disp = left_matcher->getMinDisparity();
int num_disp = left_matcher->getNumDisparities();
int wsize = left_matcher->getBlockSize();
Ptr<cuda::StereoBM> right_matcher = cuda::createStereoBM(num_disp, wsize);
Ptr<DisparityWLSFilter> wls_filter;
wls_filter = createDisparityWLSFilter(left_matcher);
right_matcher->setMinDisparity(-(min_disp + num_disp) + 1);
right_matcher->setTextureThreshold(0);
right_matcher->setUniquenessRatio(0);
right_matcher->setDisp12MaxDiff(1000000);
right_matcher->setSpeckleWindowSize(0);
right_matcher->compute(GPUrgb2, GPUrgb1, d_right_disp);
Mat filtered_disp_vis;
d_left_disp.download(left_disp);
d_right_disp.download(right_disp);
double lambda = 5000;
double sigma = 1.5;
wls_filter->setLambda(lambda);
wls_filter->setSigmaColor(sigma);
wls_filter->filter(left_disp, rgb1, filtered_disp, right_disp);
imshow("filtered disparity", filtered_disp);
还有一个问题,对于使用reprojectImageTo3D进行距离计算,我应该将16除以因为我的视差图是在CV_8U中吗?
如果有人可以提供帮助,请提前致谢!