来自 KITTI 立体图像的点云

Eug*_*neB 6 opencv computer-vision disparity-mapping stereo-3d

我尝试根据来自KITTI立体图像数据集的图像创建点云,以便稍后我可以估计某些对象的 3D 位置。

原始图像看起来像这样

到目前为止我所拥有的:

  1. cv2.StereoSGBM_create产生的差异
window_size = 9
minDisparity = 1
stereo = cv2.StereoSGBM_create(
    blockSize=10,
    numDisparities=64,
    preFilterCap=10,
    minDisparity=minDisparity,
    P1=4 * 3 * window_size ** 2,
    P2=32 * 3 * window_size ** 2
)
Run Code Online (Sandbox Code Playgroud)
  1. 使用来自 KITTI 校准文件的数据使用cv2.stereoRectify计算Q矩阵。
window_size = 9
minDisparity = 1
stereo = cv2.StereoSGBM_create(
    blockSize=10,
    numDisparities=64,
    preFilterCap=10,
    minDisparity=minDisparity,
    P1=4 * 3 * window_size ** 2,
    P2=32 * 3 * window_size ** 2
)
Run Code Online (Sandbox Code Playgroud)

生成的矩阵如下所示(此时我怀疑它是否正确):

[[   1.            0.            0.         -614.37893072]
 [   0.            1.            0.         -162.12583194]
 [   0.            0.            0.          680.05186262]
 [   0.            0.           -1.87703644    0.        ]]
Run Code Online (Sandbox Code Playgroud)
  1. 使用reprojectImageTo3D生成的点云如下所示:点云

现在问题部分开始:)

  1. reprojectImageTo3D返回的所有值都为负值可以吗?
  2. 考虑到它是 KITTI 数据集并且它们的相机校准数据可用,这些值的单位是什么?
  3. 最后,如果我有拍摄这些照片的相机的 GPS 坐标,是否可以将这些值转换为经度\纬度之类的值?

将不胜感激任何帮助!

mpr*_*rat 0

  1. 返回的所有值都可以为reprojectImageTo3D负数吗?

一般来说,不会,至​​少对于 Z 值而言。reprojectImageTo3D 返回的值是相对于相机原点的真实世界坐标,因此 Z 值为负值意味着该点位于相机后面(这在几何上是不正确的)。X 和 Y 值可以为负,因为相机原点位于 FOV 的中心,因此负 X 值表示该点位于“左侧”,负 Y 值表示该点位于“下方”。但对于 Z 值来说,不,它们不应该是负数。

你的 Q 矩阵几乎是恒等式,因为我认为你在调用 时错误地设置了旋转矩阵stereoRectify。当您传递rotation和 时translation,这是从相机 1 到相机 2 的单个旋转,而不是从相机 1 到相机 2 的组合旋转。您所做的是在转置其中一个旋转后将两个旋转相乘;相反,你应该只通过R_L(因为根据你的描述,我认为这意味着它是从左到右相机的旋转)。

  1. 考虑到它是 KITTI 数据集并且它们的相机校准数据可用,这些值的单位是什么?

我对 KITTI 数据集不熟悉,但调用后返回的值reprojectImageTo3D是现实世界的单位,通常是米。

  1. 最后,如果我有拍摄这些照片的相机的 GPS 坐标,是否可以将这些值转换为经度\纬度之类的值?

返回的坐标reprojectImageTo3D是相对于相机原点的真实世界坐标。如果您有拍摄照片的相机的 GPS 坐标,则可以使用(X, Y, Z)从重投影返回的坐标来操作纬度/经度值。