背景
博主最近在学习三维重建中的立体匹配,在OpenCV中使用sgbm和bm算法时,碰到了一个棘手的问题,PCL点云出现分层的效果,让我百思不得其解,csdn翻了好多页,也没比较明确的解答(可能我的问题比较笨吧…)。在我翻了不少博客、代码例程和向前辈请教之后,最后修改了一些细节,算是能显示出点云图。
在搜索解决方法时,发现还有挺多人碰到过类似的问题,这种感受很难受,就像你检查了很多遍,感觉没什么问题 代码就该这样写,但效果就是出不来,搁置不前,原地打转。所以我觉得,我还是记录下解决这个问题的过程,给以后掉进坑里的老铁们有一个参考的方向(本菜鸡真的在这个问题上耽误了好多时间),不说废话了,进入正题——
问题1:点云分层、断层
如果出现以上类似效果,PCL点云像是很多2d平面图像层叠出来的问题,首先给出结论:转换点云时使用的视差图格式不对。
以OpenCV-sgbm为例,先调sgbm中的参数、至视差图既平滑又少空洞。
在阅读网上许多代码后发现,用于计算距离的视差图(CV_32F)和用于肉眼看的视差图(CV_8U)使用的格式不同,并且用于计算的视差图无需进行裁剪和归一化,这些只是为了显示的可读性和美观。所以,在对sgbm进行compute之后得到视差图disparity_sgbm,除以16得到用于计算的视差图disparity(除以16是因为每个像素值由一个16bit表示,其中低位的4位存储的是视差值得小数部分,所以真实视差值应该是该值除以16)。
cv::Mat disparity_sgbm, disparity, disparityCV_8U;
sgbm->compute(rectifyImageL, rectifyImageR