Les bases d'Open3D et la boxe de groupe

introduction

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).

environnement

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.

Les bases d'Open3D

Génération et visualisation de groupes de points à partir d'images RVB-D, lecture et écriture dans des fichiers pcd

Génération de groupes de points à partir d'une image RVB-D

box.png 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)

Visualisation des groupes de points

o3d.visualization.draw_geometries([pcd])

Il est également utilisé pour la visualisation des boîtes et des maillages ainsi que des groupes de points.

Lecture et écriture dans des fichiers pcd

l'écriture

#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.

Lis

pcd = o3d.io.read_point_cloud("./hoge.pcd")

Boxelization des groupes de points

voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.03) #Spécification de taille Boxel
o3d.visualization.draw_geometries([voxel])

2020-02-25 (2).png

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. .. ..

en conclusion

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.

Recommended Posts

Les bases d'Open3D et la boxe de groupe
Théorie et implémentation de PointNet (données de groupe de points)
Principes de base et mise en œuvre de Perceptron
Nuage de points avec du poivre
bases de python: conditions et itérations