来自reprojectImageTo3D的点云看起来像一个圆锥体

时间:2015-10-29 04:52:25

标签: c++ opencv

我试图从两个摄像头拍摄的图像中生成点云。

校准使用OpenCV附带的样品校准代码完成,似乎可以正常工作。下图显示了一对校正后的图像,这些线条按照预期通过图像的相应区域。校准程序还报告RMS误差为0.398208,平均极线误差为0.379794。

Calibration results

视差计算似乎也有效。如下图所示,视差图是我所期望的。

Disparity map

然后,我使用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上打开它时,我得到了这个奇怪的锥形对象:

MeshLab visualization

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值,如上所述。 Left camera image Right camera image Disparity map

0 个答案:

没有答案