2017-07-26 5 views
0

Depuis le point Velodyne, comment obtenir des coordonnées pixel pour chaque caméra?Kitti Velodyne coordonnées point à pixel

Utilisation pykitti point_cam0 = data.calib.T_cam0_velo.dot(point_velo) On peut obtenir la projection sur l'image qui est l'équation 7 de la Kitti Dataset paper:

y = P rect(i) R rect(0) T velocam x

De là, comment obtenir t Les coordonnées de pixels réelles sur chaque image?

Répondre

0

Mise à jour: PyKitti version 0.2.1 expose des matrices de projection pour toutes les caméras.

J'ai récemment fait face au même problème. Pour moi, le problème était que pykitty n'a pas exposé P rect et R rect matrices pour toutes les caméras.

Pour Pykitti> 0.2.1, utiliser P rect et R rect à partir des données d'étalonnage.

Pour les versions précédentes, vous avez deux options:

  1. Entrez les matrices à la main (données dans le fichier d'étalonnage .xml pour chaque séquence).
  2. Utilisez cette fourche de pykitti: https://github.com/Mi-lo/pykitti/

Ensuite, vous pouvez utiliser l'équation 7 pour projeter un point de Velodyne en une image. Notez que:

  • Vous aurez besoin de points 3D en tant que tableau 4xN en coordonnées homogènes. Les points retournés par pykitti sont un tableau Nx4 numpy, avec le facteur de réflexion dans la 4ème colonne. Vous pouvez préparer les points avec la fonction prepare_velo_points ci-dessous, qui ne conserve que les points ayant une réflectance> 0, puis remplace les valeurs de réflectance par 1 pour obtenir des coordonnées homogènes.

  • Le velodyne est à 360 °. L'équation 7 vous donnera un résultat même pour les points derrière la caméra (ils seront projetés comme s'ils étaient en avant, mais en miroir verticalement). Pour éviter cela, vous ne devez projeter que les points situés devant la caméra. Pour cela, vous pouvez utiliser la fonction project_velo_points_in_img ci-dessous. Il renvoie 2d points en coordonnées homogènes, donc vous devriez jeter la 3ème rangée.

Voici les fonctions que j'ai utilisé:

def prepare_velo_points(pts3d_raw): 
    '''Replaces the reflectance value by 1, and tranposes the array, so 
     points can be directly multiplied by the camera projection matrix''' 

    pts3d = pts3d_raw 
    # Reflectance > 0 
    pts3d = pts3d[pts3d[:, 3] > 0 ,:] 
    pts3d[:,3] = 1 
    return pts3d.transpose() 

def project_velo_points_in_img(pts3d, T_cam_velo, Rrect, Prect): 
    '''Project 3D points into 2D image. Expects pts3d as a 4xN 
     numpy array. Returns the 2D projection of the points that 
     are in front of the camera only an the corresponding 3D points.''' 

    # 3D points in camera reference frame. 
    pts3d_cam = Rrect.dot(T_cam_velo.dot(pts3d)) 

    # Before projecting, keep only points with z>0 
    # (points that are in fronto of the camera). 
    idx = (pts3d_cam[2,:]>=0) 
    pts2d_cam = Prect.dot(pts3d_cam[:,idx]) 

    return pts3d[:, idx], pts2d_cam/pts2d_cam[2,:] 

Hope this helps!

+1

pykitti dev ici, et je viens de pousser [version 0.2.1] (https://github.com/utiasSTARS/pykitti/tree/0.2.1) à pypi.Ceci incorpore une [pull request] (https://github.com/utiasSTARS/pykitti/pull/10) de Milo pour exposer les matrices de projection et de rectification dans le module brut, et fait de même pour le module d'odométrie. – Lee