我想根据KITTI数据集中使用的相机的相机固有矩阵计算水平和垂直视场。我需要视场的原因是将深度图转换为3D点云。
虽然这个问题很久以前就被问过了,但我觉得它需要一个答案,因为我遇到了同样的问题,无法找到任何信息。
然而,我已经使用本文档中的可用信息和一些更通用的相机校准文档解决了这个问题
首先,我们需要将提供的视差转换为距离。这可以通过首先通过dev_kit中的方法将disp映射转换为float来完成,其中它们状态为:
disp(u,v)=((float)I(u,v))/256.0;
然后可以通过默认的立体视觉方程将这种视差转换为距离:
深度=基线*焦距/视差
现在来一些棘手的部分。我到处寻找焦距,但在文档中找不到。我刚才在写作时意识到,基线记录在上述来源中,但从第四节B中我们可以看到,它可以间接地在P(I)rect中找到。
p_rects可以在校准文件中找到,并将用于计算基线和从图像中的uv到现实世界中的xyz的转换。
步骤如下:
对于depthmap:中的像素
xyz_normalized=p_rect\[u,v,1]
其中u和v分别是像素的x和y坐标
它会给你一个形状[x,y,z,0]的xyz_normalized,其中z=1然后可以将其与该像素处给定的深度相乘,得到xyz坐标。
为了完整起见,由于p_rect是这里的深度图,您需要使用cam_cam校准txt文件中的p_3来获得基线(因为它包含彩色相机之间的基线),并且p_2属于左相机,用作occ_0文件的参考。