Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Python: Cara mencipta dan menggambarkan awan titik

Python: Cara mencipta dan menggambarkan awan titik

WBOY
WBOYke hadapan
2023-05-02 13:49:062074semak imbas


1. Pengenalan

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 Python: Cara mencipta dan menggambarkan 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 o3d

2.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: Python: Cara mencipta dan menggambarkan awan titik

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

Python: Cara mencipta dan menggambarkan awan titik

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-DPython: Cara mencipta dan menggambarkan awan titik

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. Python: Cara mencipta dan menggambarkan awan titik

3.1 Daripada NumPy kepada Open3D

Dalam 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

3.2 从 Open3D到NumPy

这里,我们首先使用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()

Python: Cara mencipta dan menggambarkan awan titik

使用 Matplotlib 显示的兔子点云

4、最后

在本教程中,我们学习了如何创建和可视化点云。在接下来的教程中,我们将学习如何处理它们。


Atas ialah kandungan terperinci Python: Cara mencipta dan menggambarkan awan titik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam