1. Point Cloud
1.1 Point Cloud란?
포인트 클라우드(Point Cloud)란 LiDAR 센서, RGB-D 센서 등으로 수집되는 데이터를 의미한다.
이러한 센서들의 동작 과정을 이해하기 위해서 Figure.1.를 살펴보자. 센서는 물체(Object)에 빛/신호를 보내고 돌아 오는 시간을 기록한다. 그리고 각 빛/신호 당 거리 정보를 계산하여 하나의 포인트(점)을 생성한다.
즉 포인트 클라우드란, 3차원 공간 상에 퍼져있는 여러 포인트(point)의 집합(set cloud)을 의미한다.
2D 이미지와는 다르게 각 포인트는 깊이(z) 정보를 가지고 있다. 그러므로 기본적으로 N x 3 Numpy 배열로 표현된다. 여기서 각 N 줄은 하나의 점과 맵핑이 되며 3(x,y,z) 정보를 가진다.
Point Cloud는 기본적으로 x, y, z 세 개의 정보로만 표현되지만, 센서에서 추가 정보가 제공되는 경우에는 N x 4 Numpy 배열로도 표현된다. 예를 들어서 LiDAR 센서에서 수집된 정보의 겨우에는 reflectance(반사도/반사시간) 정보가 추가될 수 있고, RGB-D 센서의 경우에는 Color 정보가 추가될 수도 있다.
1.2 이미지 데이터와 Point Cloud
이미지 데이터
이미지 데이터에서 픽셀의 위치 정보는 항상 양수이다. 왼쪽 위가 기준점이며 좌표값은 정수로 표현된다.
포인트 클라우드 데이터
포인트 클라우드에서 점의 위치는 양수 혹은 음수이다. 센서의 위치가 기준점이며 좌표 값은 실수로 표현된다. 기준점에서 앞/뒤는 x좌표로, 좌/우는 y좌표로, 위/아래는 z좌표로 나타낸다.
2. Point Cloud Library
2.1 Point Cloud Library란?
Point Cloud Library란 Point Cloud 처리를 위한 라이브러리이다.
일반적으로 Point Cloud의 파일을 저장하고, 읽고, 잡음을 제거하고, 정합하고, 군집화하고, 분류하고, feature 계산 등의 기능을 제공한다.
Point Cloud Library 종류
- pcl_filters : 3D 점군 데이터에서 이상값과 노이즈 제거 등의 필터링
- pcl_features : 점군 데이터로부터 3D 특징 추정 (feature estimation) 을 위한 수많은 자료 구조와 방법들
- pcl_keypoints : Keypoint (or interest point) 을 검출하는 알고리즘 구현 (BRISK, Harris Corner, NARF, SIFT, SUSAN 등)
- pcl_registration : 여러 데이터셋을 합쳐 큰 모델로 만드는 registration 작업 (ICP 등)
- pcl_kdtree : 빠른 최근거리 이웃을 탐색하는 FLANN 라이브러리를 사용한 kdtree 자료 구조
- pcl_octree : 점군 데이터로부터 계층 트리 구조를 구성하는 방법
- pcl_segmentation : 점군으로부터 클러스터들로 구분하는 알고리즘들
- pcl_sample_consensus : 선, 평면, 실린더 등의 모델 계수 추정을 위한 RANSAC 등의 알고리즘들
- pcl_surface : 3D 표면 복원 기법들 (meshing, convex hulls, Moving Least Squares 등)
- pcl_range_image : range image (or depth map) 을 나타내고 처리하는 방법
- pcl_io : OpenNI 호환 depth camera 로부터 점군 데이터를 읽고 쓰는 방법
- pcl_visualization : 3D 점군 데이터를 처리하는 알고리즘의 결과를 시각화
현재 PCD, PCL-python, Open3D, cilantro, pyPCD, Laspy, PCLpy 등의 라이브러리들이 사용되고 있다. 각 라이브러리들의 특징을 살펴보고 필요한 라이브러리를 사용하면 된다.
2.2 Point Cloud Data(PCD) format
Point Cloud는 다양한 데이터 포맷으로 사용할 수 있다. 예로 들어서 *.asc, *.cl3, *.clr, *.fls, *.fws, *.las, *.ptg, *.pts, *.ptx, *.txt, *.pcd, *.xyz 등이 있다.
단순히 x, y, z 정보만을 가진다면 *.txt 포맷을 사용해도 되고, 혹은 x, y, z 정보에 헤더 정보를 추가로 가지고 있는 *.pcd 포맷을 사용하기도 한다.
일반적으로는 *.pcd 포맷이 사용되는데 이는 헤더(Header)와 데이터(Data) 두 세션으로 나뉘어 진다.
- Header: 전체 포이트 수, 데이터 타입, 크기 등의 정보를 담고 있다.
- Data: x,y,z(필수) + 추가정보를 담고 있다.
# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
0.97192 0.278 0 4.2108e+06
0.944 0.29474 0 4.2108e+06
...
여기서 주의 깊게 보아야 할 부분은 FIELDS가 x, y, z, rgb 로, 추가 정보로 색상 정보를 가지고 있다는 것이다. 다른 *.pcd는 FIELDS가 x,y,z 이므로 rgb가 없이 사용될 수도 있다.
참고 자료