Rumah > Artikel > pembangunan bahagian belakang > Python: Cara mencipta dan menggambarkan awan titik
Aplikasi awan titik ada di mana-mana: robot, kereta pandu sendiri, sistem bantuan, penjagaan kesihatan, dsb. Awan titik ialah perwakilan 3D yang sesuai untuk memproses data dunia sebenar, terutamanya apabila geometri pemandangan/objek diperlukan, seperti jarak, bentuk dan saiz objek.
Awan titik ialah set titik yang mewakili pemandangan dunia sebenar atau objek di angkasa. Ia adalah perwakilan diskret objek dan pemandangan geometri. Dalam erti kata lain, PCD awan titik ialah set n titik, di mana setiap titik Pi diwakili oleh koordinat 3Dnya: Tambahkan beberapa ciri lain untuk menerangkan awan titik, seperti warna RGB, normal, dsb. Contohnya, warna RGB boleh ditambah untuk memberikan maklumat warna.
2. Penjanaan awan titik
Awan titik biasanya dijana menggunakan pengimbas 3D (pengimbas laser, pengimbas masa penerbangan dan pengimbas cahaya berstruktur) atau model reka bentuk bantuan komputer (CAD). Dalam tutorial ini, kita akan mula-mula mencipta dan menggambarkan awan titik rawak. Kami kemudiannya akan menggunakan pustaka Open3D untuk sampel titik dari permukaan 3D untuk menjananya daripada model 3D. Akhir sekali, kita akan melihat cara menciptanya daripada data RGB-D. Mari kita mulakan dengan mengimport pustaka Python:import numpy as np import matplotlib.pyplot as plt import open3d as o3d2.1 Random Point Cloud Cara paling mudah ialah mencipta awan titik rawak. Ambil perhatian bahawa kami biasanya tidak membuat titik rawak untuk diproses kecuali apabila mencipta hingar untuk GAN (Rangkaian Adversarial Generatif). Biasanya, awan titik diwakili oleh tatasusunan (n×3), dengan n ialah bilangan titik. Mari cipta awan titik dengan 5 titik rawak:
number_points = 5 pcd = np.random.rand(number_points, 3)# uniform distribution over [0, 1) print(pcd)Kita boleh mencetak mata secara langsung, tetapi ia tidak begitu cekap, terutamanya dalam kebanyakan aplikasi jika bilangan mata adalah besar. Pendekatan yang lebih baik ialah memaparkannya dalam ruang 3D. Mari kita bayangkan menggunakan perpustakaan Matplotlib:
# 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()
Penggambaran Awan Titik Rawak
2.2 Awan Titik Persampelan
Diperlukan untuk pemprosesan langsung 3D masa model. Oleh itu, persampelan awan titik dari permukaan tiga dimensi mereka adalah penyelesaian yang berpotensi. Mari kita mulakan dengan mengimport model arnab daripada dataset Open3D:
bunny = o3d.data.BunnyMesh() mesh = o3d.io.read_triangle_mesh(bunny.path)Atau importnya seperti ini:
mesh = o3d.io.read_triangle_mesh("data/bunny.ply")Seterusnya, paparkan model 3D untuk melihat rupanya. Anda boleh menggerakkan tetikus anda untuk melihat dari sudut pandangan yang berbeza.
# Visualize: mesh.compute_vertex_normals() # compute normals for vertices or faces o3d.visualization.draw_geometries([mesh])
Model 3D Arnab
Untuk mencuba awan titik, terdapat beberapa kaedah. Dalam contoh ini, kami mencuba 1000 mata secara seragam daripada mesh yang diimport dan menggambarkannya:
# Sample 1000 points: pcd = mesh.sample_points_uniformly(number_of_points=1000) # visualize: o3d.visualization.draw_geometries([pcd])
Awan Titik Arnab
Kita boleh simpan awan titik yang dicipta dalam format .ply seperti yang ditunjukkan di bawah:
# Save into ply file: o3d.io.write_point_cloud("output/bunny_pcd.ply", pcd)
2.3 Awan titik daripada data RGB-D
Data RGB-D dijana menggunakan sensor RGB -D (seperti Microsoft Kinect ) dikumpul, yang menyediakan kedua-dua imej RGB dan imej kedalaman. Penderia RGB-D digunakan secara meluas dalam navigasi dalaman, pengelakan halangan dan medan lain. Memandangkan imej RGB menyediakan warna piksel, setiap piksel imej kedalaman mewakili jaraknya dari kamera. Open3D menyediakan satu set fungsi untuk pemprosesan imej RGB-D. Untuk mencipta awan titik daripada data RGB-D menggunakan fungsi Open3D, hanya import dua imej, cipta objek imej RGB-D, dan akhirnya mengira awan titik seperti berikut:# 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])
Awan titik berwarna yang dijana daripada imej RGB-D
3 Open3D dan NumPy
Kadangkala anda perlu bertukar antara Open3D dan NumPy. Sebagai contoh, katakan kita ingin menukar awan titik NumPy kepada objek Open3D.PointCloud untuk visualisasi dan menggunakan Matplotlib untuk menggambarkan model 3D arnab.
3.1 Daripada NumPy kepada Open3DDalam contoh ini, kami mencipta 2000 titik rawak menggunakan fungsi NumPy.random.rand(), yang bermula daripada pengedaran seragam [0,1] Create sampel rawak. Kami kemudian mencipta objek Open3D.PointCloud dan menetapkan ciri Open3D.PointCloud.points kepada titik rawak menggunakan fungsi Open3D.utility.Vector3dVector().# Create numpy pointcloud: number_points = 2000 pcd_np = np.random.rand(number_points, 3) # Convert to Open3D.PointCLoud: pcd_o3d = o3d.geometry.PointCloud()# create point cloud object pcd_o3d.points = o3d.utility.Vector3dVector(pcd_np)# set pcd_np as the point cloud points # Visualize: o3d.visualization.draw_geometries([pcd_o3d])
Penggambaran Open3D Awan Titik Rawak
这里,我们首先使用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 显示的兔子点云
在本教程中,我们学习了如何创建和可视化点云。在接下来的教程中,我们将学习如何处理它们。
Atas ialah kandungan terperinci Python: Cara mencipta dan menggambarkan awan titik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!