[PYTHON] Open3D Grundlagen und Punktgruppenboxen

Einführung

Ich habe Open3D in meiner Abschlussforschung angesprochen, aber als ich anfing, Open3D zu berühren, war ich in Schwierigkeiten, weil es zu wenig japanische Informationen gab, also werde ich es ein wenig zusammenfassen.

Eine Site, die die meisten Leute, die Open3D berühren, wahrscheinlich erreichen werden → Open3D: http://lang.sist.chukyo-u.ac.jp/classes/Open3D/ Dies ist eine japanische Übersetzung des offiziellen Tutorials, aber neben dem Tutorial gibt es noch viele andere Möglichkeiten. Wenn Sie etwas tun möchten, finden Sie es normalerweise in der offiziellen Dokumentation (http://www.open3d.org/docs/release/index.html).

Was ich in meiner Forschung getan habe, war "Erzeugung von Punktgruppen aus RGB-D-Kamerabildern", "Entfernen von Ausreißern", "Ausrichten von Punktgruppen" usw. Andere Dinge, die ich getan habe, waren "Boxelisierung von Punktgruppen" und "Ebenenschätzung mit RANSAC".

Dieses Mal werde ich über die Grundlagen von Open3D und "Boxelisierung von Punktgruppen" schreiben (obwohl es nur eine Einführung in Funktionen ist).

Umgebung

Bitte beachten Sie, dass die Spezifikationen von Open3D je nach Version sehr unterschiedlich sind. In diesem Artikel wird es als kompatibel mit v0.9.0 beschrieben. Da ich jedoch auch v0.7.0 für meine Recherchen verwendet habe, habe ich nur die Mindestoperation mit v0.9.0 überprüft.

Open3D-Grundlagen

Generierung und Visualisierung von Punktgruppen aus RGB-D-Bildern, Lesen und Schreiben in PCD-Dateien

Punktgruppengenerierung aus RGB-D-Bild

box.png Oben rechts ist das von RealSense aufgenommene Bild und links die generierte Punktgruppe (in der Untersuchung wurde die Punktgruppe nach dem Ausschneiden des Bildes generiert).

import open3d as o3d

"""
RGB zu Open3D-D Bildeingabe
"""
color = o3d.Image(color_numpy) #Vom numpy-Array konvertieren
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]]) #Drehung für einfache Anzeige

Wenn Sie RealSense verwenden, können Sie pinhole_camera_intrinsic mit der folgenden Methode abrufen. Verarbeitungen wie RealSense-Einstellungen entfallen.

import pyrealsense2 as rs

#Holen Sie sich Kamera-Intrinsics
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)

Visualisierung von Punktgruppen

o3d.visualization.draw_geometries([pcd])

Es wird auch zur Visualisierung von Boxen und Maschen sowie Punktgruppen verwendet.

Lesen und Schreiben in PCD-Dateien

Schreiben

#Binär schreiben
o3d.io.write_point_cloud("hoge.pcd", pcd)

#Schreiben mit ASCII
o3d.io.write_point_cloud("hoge.pcd", pcd, True)

Sie können andere als PCD-Dateien ausgeben. Es ist bequem, mit ASCII auszugeben, da es leicht zu sehen ist.

Lesen

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

Boxelisierung von Punktgruppen

voxel = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, 0.03) #Boxelgrößenangabe
o3d.visualization.draw_geometries([voxel])

2020-02-25 (2).png

Als ich Open3D berührte, habe ich selbst eine Boxelisierungsfunktion für Punktgruppen erstellt, aber es scheint, dass sie ursprünglich vorbereitet wurde. .. ..

abschließend

Dieses Mal habe ich die Grundlagen von Open3D zusammengefasst. Wenn ich Zeit habe, möchte ich meine Forschung und Flugzeugschätzung mit RANSAC zusammenfassen, werde es aber wahrscheinlich nicht.

Recommended Posts

Open3D Grundlagen und Punktgruppenboxen
PointNet-Theorie und Implementierung (Punktgruppendaten)
Perceptron Grundlagen und Implementierung
Punktwolke mit Pfeffer
Python-Grundlagen: Bedingungen und Iterationen