我试图从两个摄像头拍摄的图像中生成点云。
校准使用OpenCV附带的样品校准代码完成,似乎可以正常工作。下图显示了一对校正后的图像,这些线条按照预期通过图像的相应区域。校准程序还报告RMS误差为0.398208,平均极线误差为0.379794。
视差计算似乎也有效。如下图所示,视差图是我所期望的。
然后,我使用reprojectImageTo3D
生成3D点。它接收视差图(通过disparity16.convertTo(disparity,CV_32F,1/16.0);
转换为浮点)和通过校准获得的Q
矩阵作为参数。就我而言,矩阵是:
[ 1., 0., 0. , -3.5430333328247070e+02,
0., 1., 0. , -2.3768853569030762e+02,
0., 0., 0. , 6.5857641483241434e+02 ,
0., 0., 7.7531807099024491e-02, 0. ]
但是,当我将该数据导出到.ply
文件并在MeshLab上打开它时,我得到了这个奇怪的锥形对象:
This问题似乎与同一问题有关,并且接受的答案建议用自定义代码替换reprojectImageTo3D
。我尝试了它和我在网上发现的其他一些随机代码,但我总是最终得到这个锥形的东西。
我怀疑我的校准有问题。我使用了一个非常奇怪的相机设置。我有两个Raspberry Pis,每个都连接到Raspberry Pi相机,图像通过Wi-Fi传输到处理它们的计算机。我知道理想情况下,左右图像应该在同一时间准确捕获,并且在我的设置中绝对不会发生。我没有精确测量捕获之间的时间差,我不知道它会对最终结果产生多大影响,但在更改设置之前,我想知道是否某人有类似的问题,如果有解决方案。
按要求添加更多信息: 我使用半全局块匹配器(StereoSGBM),参数:
minDisparity: 0
numDisparities: 128
SADWindowSize: 5
P1: 600
P2: 2400
disp12MaxDiff: 10
preFilterCap: 4
uniquenessRatio: 1
speckleWindowSize: 150
speckleRange: 2
这里是左右纠正的图像和相应的差异。差异已转换为CV_8U
以供normalize(disparity,disp,0,255,CV_MINMAX,CV_8U)
显示,但在计算点云期间,我使用CV_32F
值,如上所述。