Heim >Backend-Entwicklung >Python-Tutorial >Python: So erstellen und visualisieren Sie Punktwolken
Punktwolkenanwendungen gibt es überall: Roboter, autonome Fahrzeuge, Assistenzsysteme, Gesundheitswesen usw. Eine Punktwolke ist eine 3D-Darstellung, die sich für die Verarbeitung realer Daten eignet, insbesondere wenn die Geometrie der Szene/des Objekts erforderlich ist, wie z. B. die Entfernung, Form und Größe des Objekts.
Eine Punktwolke ist eine Menge von Punkten, die eine Szene in der realen Welt oder ein Objekt im Raum darstellen. Es handelt sich um eine diskrete Darstellung geometrischer Objekte und Szenen. Mit anderen Worten ist die Punktwolke PCD eine Menge von n Punkten, wobei jeder Punkt Pi durch seine 3D-Koordinaten dargestellt wird: 🎜🎜#Beachten Sie, dass Sie auch einige andere Funktionen hinzufügen können, um die Punktwolke zu beschreiben, wie z. B. RGB-Farbe, Normalen, usw. Beispielsweise können RGB-Farben hinzugefügt werden, um Farbinformationen bereitzustellen.
2. Punktwolkengenerierung
Punktwolken verwenden normalerweise 3D-Scanner (Laserscanner, Flugzeitscanner und strukturierte Lichtscanner) oder computergestütztes Design (CAD) Modellgenerierung. In diesem Tutorial erstellen und visualisieren wir zunächst eine zufällige Punktwolke. Anschließend werden wir mithilfe der Open3D-Bibliothek Punkte von der 3D-Oberfläche abtasten, um sie aus dem 3D-Modell zu generieren. Abschließend sehen wir uns an, wie man sie aus RGB-D-Daten erstellt. Beginnen wir mit dem Importieren der Python-Bibliothek:import numpy as np import matplotlib.pyplot as plt import open3d as o3d2.1 Zufällige Punktwolke Der einfachste Weg ist, zufällig eine Punktwolke zu erstellen. Beachten Sie, dass wir im Allgemeinen keine zufälligen Punkte zur Verarbeitung erstellen, außer wenn wir Rauschen für ein GAN (Generative Adversarial Network) erzeugen. Normalerweise wird eine Punktwolke durch ein (n×3)-Array dargestellt, wobei n die Anzahl der Punkte ist. Erstellen wir eine Punktwolke mit 5 zufälligen Punkten:
number_points = 5 pcd = np.random.rand(number_points, 3)# uniform distribution over [0, 1) print(pcd)Wir könnten die Punkte direkt drucken, aber das ist nicht sehr effizient, insbesondere in den meisten Anwendungen, wenn die Anzahl der Punkte groß ist. Ein besserer Ansatz besteht darin, sie im 3D-Raum anzuzeigen. Visualisieren wir es mit der Matplotlib-Bibliothek:
# Create Figure: fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.scatter3D(pcd[:, 0], pcd[:, 1], pcd[:, 2]) # label the axes ax.set_xlabel("X") ax.set_ylabel("Y") ax.set_zlabel("Z") ax.set_title("Random Point Cloud") # display: plt.show()
Random Point Cloud Visualization
2.2 Sample Point Cloud
# 🎜🎜# Die direkte Verarbeitung von 3D-Modellen braucht Zeit. Daher ist die Abtastung von Punktwolken aus ihren dreidimensionalen Oberflächen eine mögliche Lösung. Beginnen wir mit dem Importieren des Hasenmodells aus dem Open3D-Datensatz:bunny = o3d.data.BunnyMesh() mesh = o3d.io.read_triangle_mesh(bunny.path)Oder importieren Sie es wie folgt:
mesh = o3d.io.read_triangle_mesh("data/bunny.ply")
Zeigen Sie als Nächstes das 3D-Modell an, um zu sehen, wie es aussieht. Sie können Ihre Maus bewegen, um die Ansicht aus verschiedenen Blickwinkeln zu betrachten.
# Visualize: mesh.compute_vertex_normals() # compute normals for vertices or faces o3d.visualization.draw_geometries([mesh])Rabbit 3D-ModellUm Punktwolken abzutasten, gibt es mehrere Methoden. In diesem Beispiel nehmen wir einheitlich 1000 Punkte aus dem importierten Netz auf und visualisieren sie: 🎜#RabbitPointCloudWir können die erstellte Punktwolke im .ply-Format speichern, wie unten gezeigt:
# Sample 1000 points: pcd = mesh.sample_points_uniformly(number_of_points=1000) # visualize: o3d.visualization.draw_geometries([pcd])#🎜 🎜#2.3 Punktwolke aus RGB-D-Daten#🎜 🎜#RGB-D-Daten werden mit einem RGB-D-Sensor (wie Microsoft Kinect) erfasst, der sowohl ein RGB-Bild als auch ein Tiefenbild liefert. RGB-D-Sensoren werden häufig in der Indoor-Navigation, der Hindernisvermeidung und anderen Bereichen eingesetzt. Da RGB-Bilder Pixelfarben liefern, repräsentiert jedes Pixel des Tiefenbildes seinen Abstand von der Kamera.
Open3D bietet eine Reihe von Funktionen für die RGB-D-Bildverarbeitung. Um mithilfe von Open3D-Funktionen eine Punktwolke aus RGB-D-Daten zu erstellen, importieren Sie einfach zwei Bilder, erstellen ein RGB-D-Bildobjekt und berechnen schließlich die Punktwolke wie folgt:
# Save into ply file: o3d.io.write_point_cloud("output/bunny_pcd.ply", pcd)# 🎜🎜 #
Farbige Punktwolke generiert aus RGB-D-Bild
3, Open3D und NumPyManchmal müssen Sie verwenden Open3D und NumPy Wechseln Sie zwischen NumPy. Nehmen wir zum Beispiel an, wir möchten eine NumPy-Punktwolke zur Visualisierung in ein Open3D.PointCloud-Objekt konvertieren und Matplotlib verwenden, um ein 3D-Modell eines Kaninchens zu visualisieren. 3.1 Von NumPy zu Open3DIn diesem Beispiel erstellen wir 2000 zufällige Punkte mit der Funktion NumPy.random.rand(), die bei [0,1] Create beginnt eine Zufallsstichprobe aus einer Gleichverteilung. Anschließend erstellen wir ein Open3D.PointCloud-Objekt und setzen dessen Open3D.PointCloud.points-Funktion mithilfe der Funktion Open3D.utility.Vector3dVector() auf zufällige Punkte.#
# read the color and the depth image: color_raw = o3d.io.read_image("../data/rgb.jpg") depth_raw = o3d.io.read_image("../data/depth.png") # create an rgbd image object: rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( color_raw, depth_raw, convert_rgb_to_intensity=False) # use the rgbd image to create point cloud: pcd = o3d.geometry.PointCloud.create_from_rgbd_image( rgbd_image, o3d.camera.PinholeCameraIntrinsic( o3d.camera.PinholeCameraIntrinsicParameters.PrimeSenseDefault)) # visualize: o3d.visualization.draw_geometries([pcd])#🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜 ## 🎜🎜##Open3D von Random Point Cloud Visualisierung
这里,我们首先使用Open3D.io.read_point_cloud()函数从.ply文件中读取点云,该函数返回一个Open3D.PointCloud对象。现在我们只需要使用NumPy.asarray()函数将表示点的Open3D.PointCloud.points特征转换为NumPy数组。最后,我们像上面那样显示获得的数组。
# Read the bunny point cloud file: pcd_o3d = o3d.io.read_point_cloud("../data/bunny_pcd.ply") # Convert the open3d object to numpy: pcd_np = np.asarray(pcd_o3d.points) # Display using matplotlib: fig, ax = plt.subplots(subplot_kw={"projection": "3d"}) ax.scatter3D(pcd_np[:, 0], pcd_np[:, 2], pcd_np[:, 1]) # label the axes ax.set_xlabel("X") ax.set_ylabel("Y") ax.set_zlabel("Z") ax.set_title("Bunny Point Cloud") # display: plt.show()
使用 Matplotlib 显示的兔子点云
在本教程中,我们学习了如何创建和可视化点云。在接下来的教程中,我们将学习如何处理它们。
Das obige ist der detaillierte Inhalt vonPython: So erstellen und visualisieren Sie Punktwolken. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!