포인트 클라우드 애플리케이션은 로봇, 자율주행차, 보조 시스템, 의료 등 어디에나 있습니다. 포인트 클라우드는 특히 물체의 거리, 모양, 크기와 같이 장면/객체의 기하학적 구조가 필요할 때 실제 데이터를 처리하는 데 적합한 3D 표현입니다.
포인트 클라우드는 현실 세계의 장면이나 공간의 객체를 나타내는 점 집합입니다. 기하학적 객체와 장면을 개별적으로 표현한 것입니다. 즉, 포인트 클라우드 PCD는 n 포인트의 집합이며, 여기서 각 포인트 Pi는 3D 좌표로 표시됩니다.
포인트 클라우드를 설명하기 위해 RGB와 같은 다른 기능을 추가할 수도 있습니다. 색상, 메소드 라인 등 예를 들어 RGB 색상을 추가하여 색상 정보를 제공할 수 있습니다.
포인트 클라우드는 일반적으로 3D 스캐너(레이저 스캐너, 비행 시간 스캐너 및 구조광 스캐너) 또는 CAD(컴퓨터 지원 설계) 모델을 사용하여 생성됩니다. 이 튜토리얼에서는 먼저 임의의 포인트 클라우드를 생성하고 시각화합니다. 그런 다음 Open3D 라이브러리를 사용하여 3D 표면의 점을 샘플링하여 3D 모델에서 생성합니다. 마지막으로 RGB-D 데이터에서 이를 생성하는 방법을 살펴보겠습니다.
Python 라이브러리를 가져오는 것부터 시작하겠습니다.
import numpy as np import matplotlib.pyplot as plt import open3d as o3d
가장 쉬운 방법은 임의의 점 구름을 만드는 것입니다. 일반적으로 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()
Random Point Cloud Visualization
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])
Rabbit 3D Model
포인트 클라우드를 샘플링하는 방법에는 여러 가지가 있습니다. 이 예에서는 가져온 메쉬에서 1000개의 점을 균일하게 샘플링하고 시각화합니다.
# Sample 1000 points: pcd = mesh.sample_points_uniformly(number_of_points=1000) # visualize: o3d.visualization.draw_geometries([pcd])
Rabbit Point Cloud
생성된 포인트 클라우드를 다음과 같이 .ply 형식으로 저장할 수 있습니다. 표시:
# Save into ply file: o3d.io.write_point_cloud("output/bunny_pcd.ply", pcd)
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])
색상 생성 RGB-D image 포인트 클라우드
때때로 Open3D와 NumPy 간에 전환해야 할 때가 있습니다. 예를 들어 시각화를 위해 NumPy 포인트 클라우드를 Open3D.PointCloud 개체로 변환하고 Matplotlib를 사용하여 토끼의 3D 모델을 시각화한다고 가정해 보겠습니다.
이 예에서는 [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])
임의 포인트 클라우드의 Open3D 시각화
这里,我们首先使用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 显示的兔子点云
在本教程中,我们学习了如何创建和可视化点云。在接下来的教程中,我们将学习如何处理它们。
위 내용은 Python: 포인트 클라우드를 만들고 시각화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!