J'ai abordé Open3D dans mes recherches de fin d'études, mais quand j'ai commencé à toucher Open3D, j'avais des problèmes car il y avait trop peu d'informations japonaises, donc je vais le résumer un peu.
Un site que la plupart des gens qui ont commencé à toucher Open3D atteindront probablement → Open3D: http://lang.sist.chukyo-u.ac.jp/classes/Open3D/ Ceci est une traduction japonaise du didacticiel officiel, mais vous pouvez faire beaucoup de choses en plus du didacticiel. Si vous avez quelque chose à faire, vous pouvez généralement le trouver dans la documentation officielle (http://www.open3d.org/docs/release/index.html).
Ce que j'ai fait dans mes recherches était "la génération de groupes de points à partir d'images de caméras RVB-D", "la suppression des valeurs aberrantes", "l'alignement des groupes de points", etc. D'autres choses que j'ai faites étaient la "boxelisation des groupes de points" et "l'estimation plane en utilisant RANSAC".
Cette fois, j'écrirai sur les bases d'Open3D et la "boxelisation des groupes de points" (bien que ce ne soit qu'une introduction de fonctions).
Veuillez noter que les spécifications d'Open3D diffèrent considérablement selon la version. Dans cet article, il est décrit comme compatible avec la v0.9.0, mais comme j'ai également utilisé la v0.7.0 pour mes recherches, je n'ai vérifié que le fonctionnement minimum avec la v0.9.0.
Génération et visualisation de groupes de points à partir d'images RVB-D, lecture et écriture dans des fichiers pcd
La partie supérieure droite est l'image acquise à partir de RealSense, et la gauche est le groupe de points généré (dans la recherche, le groupe de points a été généré après la découpe de l'image).
import open3d as o3d
"""
RVB à Open3D-Entrée d'image D
"""
color = o3d.Image(color_numpy) #Convertir à partir du tableau numpy
depth = o3d.Image(depth_numpy)
rgbd = o3d.geometry.RGBDImage.create_rgbd_image_from_color_and_depth(color, depth, convert_rgb_to_intensity=False)
pcd = o3d.geometry.PointCloud.create_point_cloud_from_rgbd_image(rgbd, pinhole_camera_intrinsic)
pcd.transform([[1, 0, 0, 0], [0, -1, 0, 0], [0, 0, -1, 0], [0, 0, 0, 1]]) #Rotation pour une visualisation facile
Si vous utilisez RealSense, vous pouvez obtenir pinhole_camera_intrinsic par la méthode suivante. Le traitement tel que les paramètres RealSense est omis.
import pyrealsense2 as rs
#Obtenez les caractéristiques intrinsèques de la caméra
intr = profile.get_stream(rs.stream.color).as_video_stream_profile().get_intrinsics()
pinhole_camera_intrinsic = o3d.camera.PinholeCameraIntrinsic(intr.width, intr.height, intr.fx, intr.fy, intr.ppx, intr.ppy)
o3d.visualization.draw_geometries([pcd])
Il est également utilisé pour la visualisation des boîtes et des maillages ainsi que des groupes de points.
#Ecrire en binaire
o3d.io.write_point_cloud("hoge.pcd", pcd)
#Écrire avec ASCII
o3d.io.write_point_cloud("hoge.pcd", pcd, True)
Vous pouvez sortir des fichiers autres que pcd. Il est pratique de sortir avec ascii car il est facile à voir.
pcd = o3d.io.read_point_cloud("./hoge.pcd")
voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.03) #Spécification de taille Boxel
o3d.visualization.draw_geometries([voxel])
Quand j'ai touché Open3D, j'ai créé moi-même une fonction de boxelization pour les groupes de points, mais il semble qu'elle ait été préparée à l'origine. .. ..
Cette fois, j'ai résumé les bases d'Open3D. Si j'ai le temps, j'aimerais résumer mes recherches et mes estimations d'avion avec RANSAC, mais je ne le ferai probablement pas.