web-dev-qa-db-fra.com

Générer un nuage de points à partir d'une image de profondeur

J'essaie de convertir une image de profondeur (RGBD) en un nuage de points 3D. La solution que j'utilise actuellement est tirée de cet article où:

  • cx = hauteur du centre de l'image
  • cy = largeur du centre de l'image
  • fx et fy = 250, choisi en parcourant quelques options

Les mesures de profondeur ont été prises à partir d'une caméra à trou d'épingle et le nuage de points se projette loin du centre (exemples d'images ci-dessous). Quelqu'un peut-il m'aider à comprendre pourquoi et comment je peux résoudre ce problème?

enter image description hereenter image description hereenter image description here

2
Lloyd Rayner

Vous pouvez facilement résoudre ce problème en utilisant open3d paquet. Installez-le en utilisant Sudo pip install -U open3d-python (pas seulement open3d - c'est un autre paquet).

Une fois installé:

from open3d import *

rgbd = create_rgbd_image_from_color_and_depth(color, depth, convert_rgb_to_intensity = False)
pcd = create_point_cloud_from_rgbd_image(rgbd, pinhole_camera_intrinsic)

# flip the orientation, so it looks upright, not upside-down
pcd.transform([[1,0,0,0],[0,-1,0,0],[0,0,-1,0],[0,0,0,1]])

draw_geometries([pcd])    # visualize the point cloud

Le code ci-dessus suppose que vous avez votre image couleur dans color et votre image de profondeur dans depth, vérifiez les exemples fournis avec open3d pour plus d'informations.

Si vous possédez votre propre appareil photo, vous pouvez remplacer pinhole_camera_intrinsic avec ceux-ci, mais pour le test, la caméra sténopé fonctionne plus ou moins bien.

6
lenik