>  기사  >  백엔드 개발  >  Python: 포인트 클라우드를 만들고 시각화하는 방법

Python: 포인트 클라우드를 만들고 시각화하는 방법

WBOY
WBOY앞으로
2023-05-02 13:49:061953검색


1. 소개

포인트 클라우드 애플리케이션은 로봇, 자율주행차, 보조 시스템, 의료 등 어디에나 있습니다. 포인트 클라우드는 특히 물체의 거리, 모양, 크기와 같이 장면/객체의 기하학적 구조가 필요할 때 실제 데이터를 처리하는 데 적합한 3D 표현입니다.

포인트 클라우드는 현실 세계의 장면이나 공간의 객체를 나타내는 점 집합입니다. 기하학적 객체와 장면을 개별적으로 표현한 것입니다. 즉, 포인트 클라우드 PCD는 n 포인트의 집합이며, 여기서 각 포인트 Pi는 3D 좌표로 표시됩니다.

Python: 포인트 클라우드를 만들고 시각화하는 방법

포인트 클라우드를 설명하기 위해 RGB와 같은 다른 기능을 추가할 수도 있습니다. 색상, 메소드 라인 등 예를 들어 RGB 색상을 추가하여 색상 정보를 제공할 수 있습니다.

2. 포인트 클라우드 생성

포인트 클라우드는 일반적으로 3D 스캐너(레이저 스캐너, 비행 시간 스캐너 및 구조광 스캐너) 또는 CAD(컴퓨터 지원 설계) 모델을 사용하여 생성됩니다. 이 튜토리얼에서는 먼저 임의의 포인트 클라우드를 생성하고 시각화합니다. 그런 다음 Open3D 라이브러리를 사용하여 3D 표면의 점을 샘플링하여 3D 모델에서 생성합니다. 마지막으로 RGB-D 데이터에서 이를 생성하는 방법을 살펴보겠습니다.

Python 라이브러리를 가져오는 것부터 시작하겠습니다.

import numpy as np
import matplotlib.pyplot as plt
import open3d as o3d

2.1 임의의 점 구름

가장 쉬운 방법은 임의의 점 구름을 만드는 것입니다. 일반적으로 GAN(Generative Adversarial Network)에 대한 노이즈를 생성할 때를 제외하고는 처리할 무작위 포인트를 생성하지 않습니다.

일반적으로 포인트 클라우드는 (n×3) 배열로 표현됩니다. 여기서 n은 포인트 수입니다. 5개의 무작위 포인트로 포인트 클라우드를 만들어 보겠습니다.

number_points = 5
pcd = np.random.rand(number_points, 3)# uniform distribution over [0, 1)
print(pcd)

포인트를 직접 인쇄할 수 있지만 이는 그다지 효율적이지 않습니다. 특히 포인트 수가 많은 경우 대부분의 응용 프로그램에서는 더욱 그렇습니다. 더 나은 접근 방식은 3D 공간에 표시하는 것입니다. 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()

Python: 포인트 클라우드를 만들고 시각화하는 방법

Random Point Cloud Visualization

2.2 Sampling Point Clouds

3D 모델을 직접 처리하려면 시간이 걸립니다. 따라서 3차원 표면에서 포인트 클라우드를 샘플링하는 것이 잠재적인 솔루션입니다. Open3D 데이터세트에서 토끼 모델을 가져오는 것부터 시작해 보겠습니다.

bunny = o3d.data.BunnyMesh()
mesh = o3d.io.read_triangle_mesh(bunny.path)

또는 다음과 같이 가져옵니다.

mesh = o3d.io.read_triangle_mesh("data/bunny.ply")

다음으로 3D 모델을 표시하여 어떻게 보이는지 확인합니다. 마우스를 움직여 다양한 관점에서 볼 수 있습니다.

# Visualize:
mesh.compute_vertex_normals() # compute normals for vertices or faces
o3d.visualization.draw_geometries([mesh])

Python: 포인트 클라우드를 만들고 시각화하는 방법

Rabbit 3D Model

포인트 클라우드를 샘플링하는 방법에는 여러 가지가 있습니다. 이 예에서는 가져온 메쉬에서 1000개의 점을 균일하게 샘플링하고 시각화합니다.

# Sample 1000 points:
pcd = mesh.sample_points_uniformly(number_of_points=1000)


# visualize:
o3d.visualization.draw_geometries([pcd])

Python: 포인트 클라우드를 만들고 시각화하는 방법

Rabbit Point Cloud

생성된 포인트 클라우드를 다음과 같이 .ply 형식으로 저장할 수 있습니다. 표시:

# Save into ply file:
o3d.io.write_point_cloud("output/bunny_pcd.ply", pcd)

2.3 점 RGB-D 데이터의 클라우드

RGB-D 데이터는 RGB 이미지와 깊이 이미지를 모두 제공하는 RGB-D 센서(예: Microsoft Kinect)를 사용하여 수집됩니다. RGB-D 센서는 실내 탐색, 장애물 회피 및 기타 분야에서 널리 사용됩니다. RGB 이미지는 픽셀 색상을 제공하므로 깊이 이미지의 각 픽셀은 카메라로부터의 거리를 나타냅니다.

Open3D는 RGB-D 이미지 처리를 위한 일련의 기능을 제공합니다. Open3D 기능을 사용하여 RGB-D 데이터에서 포인트 클라우드를 생성하려면 두 개의 이미지를 가져오고 RGB-D 이미지 객체를 생성한 후 마지막으로 다음과 같이 포인트 클라우드를 계산하면 됩니다.

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

Python: 포인트 클라우드를 만들고 시각화하는 방법

색상 생성 RGB-D image 포인트 클라우드

3, Open3D 및 NumPy

때때로 Open3D와 NumPy 간에 전환해야 할 때가 있습니다. 예를 들어 시각화를 위해 NumPy 포인트 클라우드를 Open3D.PointCloud 개체로 변환하고 Matplotlib를 사용하여 토끼의 3D 모델을 시각화한다고 가정해 보겠습니다.

3.1 NumPy에서 Open3D로

이 예에서는 [0,1]의 균일 분포에서 무작위 샘플을 생성하는 NumPy.random.rand() 함수를 사용하여 2000개의 무작위 점을 생성합니다. 그런 다음 Open3D.PointCloud 객체를 생성하고 Open3D.utility.Vector3dVector() 함수를 사용하여 Open3D.PointCloud.points 기능을 임의의 점으로 설정합니다.

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

Python: 포인트 클라우드를 만들고 시각화하는 방법

임의 포인트 클라우드의 Open3D 시각화

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: 포인트 클라우드를 만들고 시각화하는 방법

使用 Matplotlib 显示的兔子点云

4、最后

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


위 내용은 Python: 포인트 클라우드를 만들고 시각화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 51cto.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제