지난 10여 년간 라이다(LiDAR), 구조광(Structured Light), ToF(Time-of-Flight) 카메라와 같은 3D 센싱 기술이 급격히 발전하고 보급되면서, 3차원 공간을 점들의 집합으로 표현하는 포인트 클라우드(Point Cloud) 데이터의 중요성이 전례 없이 커졌다. 이러한 데이터는 단순히 3차원 좌표(x,y,z)의 나열을 넘어, 색상, 강도(intensity), 법선(normal) 등 풍부한 정보를 담을 수 있다. 이로 인해 포인트 클라우드는 자율주행 자동차의 주변 환경 인식, 로보틱스의 객체 조작 및 내비게이션, 증강현실(AR) 및 가상현실(VR)의 공간 매핑, 고정밀 디지털 트윈 구축, 그리고 문화유산의 디지털 보존에 이르기까지 현대 산업과 연구의 거의 모든 분야에서 핵심적인 데이터 형태로 자리 잡았다.1 이처럼 방대하고 복잡한 3D 데이터를 효과적으로 수집, 처리, 분석, 그리고 시각화하는 능력은 해당 분야의 기술 경쟁력을 좌우하는 핵심 요소가 되었다.
이러한 3D 데이터 처리 수요에 부응하기 위해 다양한 소프트웨어 라이브러리가 등장했으며, 그중에서도 Point Cloud Library (PCL)와 Open3D는 오픈소스 커뮤니티를 대표하는 양대 산맥으로 평가받는다.
PCL은 2010년대 초반에 등장하여 3D 포인트 클라우드 처리 분야의 초석을 다진 라이브러리이다.4 필터링, 특징 추출, 정합, 분할 등 3D 처리 파이프라인에 필요한 거의 모든 알고리즘을 포괄적으로 제공하는 성숙하고 방대한 C++ 기반 라이브러리로, 특히 로보틱스 분야에서 오랫동안 표준으로 사용되어 왔다.5
반면, Open3D는 2018년에 등장한 비교적 최신 라이브러리로, 현대적인 소프트웨어 개발 패러다임에 맞춰 설계되었다.7 C++과 Python 양쪽에서 직관적이고 일관된 API를 제공하며, 특히 Python 환경에서의 사용 편의성과 3D 머신러닝 프레임워크와의 유기적인 통합에 중점을 두고 있다.7 이는 신속한 프로토타이핑과 연구 개발을 중시하는 최근 트렌드를 적극적으로 반영한 결과이다.
본 보고서는 3D 포인트 클라우드 처리 분야의 두 핵심 라이브러리인 PCL과 Open3D를 심층적으로 비교 분석하는 것을 목표로 한다. 단순히 기능 목록을 나열하는 것을 넘어, 두 라이브러리의 탄생 배경과 개발 철학에서부터 코어 아키텍처, 핵심 데이터 구조, 주요 기능의 구현 방식, 성능 벤치마크, API 설계 철학의 차이, 그리고 이를 둘러싼 개발 생태계와 커뮤니티의 건강 상태에 이르기까지 다각적인 관점에서 고찰한다. 이를 통해 개발자와 연구자가 자신의 특정 응용 분야, 주력 개발 언어, 프로젝트의 요구사항(성능, 개발 속도, 유지보수 등)에 가장 적합한 라이브러리를 선택할 수 있도록 명확하고 깊이 있는 기술적 기준과 통찰을 제공하고자 한다.
PCL(Point Cloud Library)의 개발은 2010년 3월, 로보틱스 연구의 산실이었던 윌로우 개라지(Willow Garage)에서 시작되었다.4 당시 급성장하던 로봇 운영체제(ROS) 생태계에서 3D 인식(3D Perception)은 핵심적인 기술 과제였으며, PCL은 바로 이 ROS의 3D 처리 스택을 위한 표준 라이브러리로 탄생했다. 이러한 배경은 PCL의 초기 설계 방향에 결정적인 영향을 미쳤다. 즉, 실시간으로 동작하는 로봇 애플리케이션의 엄격한 성능 요구사항을 만족시키기 위해 C++를 주력 언어로 채택하고, 성능 최적화에 중점을 둔 아키텍처를 지향하게 된 것이다. 2011년 3월 공식 웹사이트(pointclouds.org)를 열고, 같은 해 5월에 버전 1.0을 공식 릴리즈하며 본격적으로 세상에 알려졌다.4
PCL의 개발 철학은 “2D/3D 이미지 및 포인트 클라우드 처리를 위한 독립적이고 대규모의 오픈소스 프로젝트(A standalone, large scale, open project for 2D/3D image and point cloud processing)”라는 슬로건에 집약되어 있다.5 이는 3D 데이터 처리 파이프라인의 전 과정, 즉 필터링(filtering), 특징 추출(feature estimation), 정합(registration), 분할(segmentation), 표면 재구성(surface reconstruction), 객체 인식(recognition) 등에 필요한 방대하고 포괄적인 알고리즘 집합을 단일 라이브러리 안에서 제공하겠다는 목표를 의미한다.5 이러한 ‘백과사전식’ 접근법은 학술 연구에서 발표된 다양한 최신 알고리즘들을 빠르게 흡수하고 구현하여 사용자에게 폭넓은 선택지를 제공하는 것을 장점으로 삼았다. 이는 PCL이 특정 문제 해결을 위한 ‘도구’를 넘어, 3D 인식 분야의 ‘종합 플랫폼’이 되고자 했음을 보여준다.
PCL은 BSD 라이선스를 채택하여 배포된다.4 BSD 라이선스는 소스 코드의 공개 의무 없이 상업적 및 연구용으로 자유롭게 수정하고 재배포할 수 있는 매우 허용적인 라이선스이다.9 이러한 라이선스 정책은 PCL이 탄생한 ROS 생태계의 개방성을 계승하는 동시에, 학계뿐만 아니라 산업계에서도 아무런 제약 없이 PCL을 채택하여 상용 제품에 활용할 수 있도록 장벽을 낮추는 전략적 선택이었다. 이는 PCL이 로보틱스 분야에서 사실상의 표준으로 빠르게 자리매김하는 데 중요한 기여를 했다.
Open3D는 PCL이 시장을 주도하던 2018년, 인텔의 지능형 시스템 연구소(Intel Intelligent Systems Lab)가 주도하여 처음으로 공개한 라이브러리이다.2 Open3D의 개발자들은 PCL이 이룩한 성과를 인정하면서도, 사용자들이 겪는 몇 가지 고질적인 문제점, 즉 복잡한 서드파티 의존성, 플랫폼별로 상이하고 어려운 빌드 과정, 그리고 무엇보다 현대 개발 환경의 주류로 떠오른 Python에 대한 지원 미비 등을 해결하고자 했다. 이러한 문제의식 하에, Open3D는 기존의 코드를 개선하는 방식이 아닌, 완전히 새로운 “백지상태(clean slate)”에서 개발을 시작했다.7 이는 PCL의 유산을 계승하되 그 한계를 극복하려는 명확한 의도를 보여준다.
Open3D의 철학은 “3D 데이터 처리를 위한 현대적인 라이브러리(A Modern Library for 3D Data Processing)”라는 이름에서 명확히 드러난다.7 여기서 ‘현대적’이라는 단어는 몇 가지 핵심적인 가치를 내포한다.
첫째, 신속한 개발(rapid development) 지원이다. 이를 위해 C++과 Python 양쪽에서 매우 간결하고 직관적이며 일관된 API를 제공하는 데 최우선 순위를 둔다. 둘째, 최소한의 의존성이다. “작고 신중하게 고려된 의존성 집합(a small and carefully considered set of dependencies)”을 유지함으로써 설치와 빌드 과정을 단순화하고, 다양한 플랫폼으로의 이식성을 극대화한다.7
셋째, 엄선된 핵심 기능 제공이다. PCL처럼 모든 알고리즘을 제공하기보다는, 학계와 산업계에서 가장 널리 사용되고 검증된 “계층 1(Tier-1)” 알고리즘들을 엄선하여 제공한다.12
마지막으로, 코드 품질과 유지보수성을 강조하여 깨끗하고 일관된 스타일의 코드를 명확한 코드 리뷰 메커니즘을 통해 관리한다.13
Open3D는 MIT 라이선스를 채택했다.7 MIT 라이선스는 BSD 라이선스보다도 더 간결하고 허용적인 대표적인 오픈소스 라이선스로, 사실상 어떠한 제약도 없이 자유로운 사용, 수정, 재배포, 상업적 활용을 보장한다. Open3D가 MIT 라이선스를 선택한 것은 라이브러리 채택에 있어 아주 작은 마찰조차 제거하려는 의도로 해석될 수 있다. 특히 빠른 의사결정이 중요한 스타트업이나 법률 검토에 민감한 대기업 환경에서 라이선스로 인한 고민 없이 즉시 프로젝트에 도입할 수 있도록 하여, 커뮤니티의 기여와 산업계의 채택을 더욱 가속화하려는 전략이 담겨 있다.
두 라이브러리의 근본적인 차이는 그들의 탄생 배경과 지향점에서 비롯된다. 이러한 철학적 차이는 이후에 논의될 기술적 세부 사항들을 이해하는 데 중요한 맥락을 제공한다. 다음 표는 두 라이브러리의 핵심적인 철학과 아키텍처 방향성을 요약하여 비교한다.
| 항목 | Point Cloud Library (PCL) | Open3D |
|---|---|---|
| 최초 릴리즈 | 2011년 5월 (v1.0) 4 | 2018년 2 |
| 주요 개발 주체 | Willow Garage, Open Perception 4 | Intel ISL, Open3D Team 2 |
| 개발 철학 | 포괄적 알고리즘 집합, C++ 중심, 로보틱스 성능 최우선 | 현대적 API, Python 우선 지원, 사용 편의성, 엄선된 기능 |
| 핵심 목표 | 3D 인식 분야의 종합적인 ‘백과사전’ | 3D 데이터 처리의 ‘신속한 개발 프레임워크’ |
| 라이선스 | BSD 10 | MIT 14 |
| 주요 통합 생태계 | ROS (Robot Operating System) 4 | PyTorch, TensorFlow (3D ML) 7 |
이러한 비교를 통해 PCL과 Open3D가 단순히 기능적으로 유사한 라이브러리가 아니라, 서로 다른 시대적 요구와 개발 패러다임을 대표하는 산물임을 알 수 있다. PCL이 2010년대 초반의 C++ 중심적이고 성능 지상주의적인 로보틱스 연구 환경을 반영한다면, Open3D는 2010년대 후반 이후의 Python 중심적이고 개발자 경험을 중시하는 머신러닝 시대를 대변한다. 이 근본적인 차이가 두 라이브러리의 모든 측면에 영향을 미치고 있다.
라이브러리의 코어 아키텍처와 기본 데이터 구조는 그 라이브러리의 성능, 유연성, 그리고 사용 편의성을 결정하는 가장 근본적인 요소이다. PCL과 Open3D는 이 부분에서 각자의 개발 철학을 명확하게 드러내는 뚜렷한 차이를 보인다.
소프트웨어의 설치와 빌드 과정은 개발자가 프로젝트를 시작할 때 마주하는 첫 번째 관문이다. 이 경험은 라이브러리에 대한 전반적인 인상과 생산성에 큰 영향을 미친다.
PCL은 빌드 시스템으로 CMake를 사용하며, 그 기능의 폭넓음만큼이나 다양한 서드파티 라이브러리에 대한 의존성을 가진다.4 핵심적인 의존성으로는 선형대수 연산을 위한 Eigen, 다양한 C++ 유틸리티를 제공하는 Boost, 근접 이웃 탐색을 위한 FLANN, 3D 시각화를 위한 VTK(Visualization Toolkit), 그리고 볼록 껍질(convex hull) 계산 등을 위한 QHULL 등이 있다.4 이러한 강력한 라이브러리들을 기반으로 풍부한 기능을 제공할 수 있었지만, 이는 동시에 설치 및 빌드 과정의 복잡성을 높이는 주요 원인이 되었다. 특히 각 의존성 라이브러리의 버전을 맞추고 시스템에 올바르게 설정하는 과정은 초보자에게 큰 장벽이 될 수 있으며, 윈도우 환경에서 소스 코드를 직접 빌드하는 것은 상당한 전문성과 노력을 요구하는 작업으로 알려져 있다.15
Open3D 역시 CMake를 빌드 시스템으로 사용하지만, 설계 초기부터 “작고 신중하게 고려된 의존성 집합(a small and carefully considered set of dependencies)”을 지향점으로 삼았다.7 이는 라이브러리의 핵심 기능을 가능한 한 내재화하거나, Eigen과 같이 필수적이고 현대적인 경량 라이브러리만을 최소한으로 사용하려는 노력으로 나타났다. 그 결과, 빌드 과정이 PCL에 비해 훨씬 단순하고 예측 가능하며, 플랫폼 간 이식성 또한 높다. 이러한 철학의 가장 큰 수혜는 Python 사용자에게 돌아갔다.
pip install open3d라는 단 한 줄의 명령어로 사전 컴파일된 바이너리와 모든 의존성이 함께 설치되므로, 사용자는 복잡한 빌드 과정 없이 즉시 라이브러리를 사용할 수 있다.13 이는 Open3D의 ‘신속한 개발’ 철학을 실현하는 핵심적인 요소이다.
포인트 클라우드 데이터를 메모리상에서 어떻게 표현하고 관리하는지는 라이브러리의 핵심 설계 사상을 보여준다.
PCL의 기본 데이터 구조는 C++의 템플릿 기능을 극대화한 pcl::PointCloud<PointT> 클래스이다.16
템플릿 기반의 유연성: PointT라는 템플릿 파라미터에 사용자가 원하는 포인트의 타입을 지정할 수 있다. PCL은 pcl::PointXYZ(좌표만), pcl::PointXYZRGB(좌표+색상), pcl::PointXYZI(좌표+강도), pcl::PointNormal(좌표+법선) 등 다양한 기본 포인트 타입을 사전 정의하여 제공한다.16 사용자는 필요에 따라 자신만의 커스텀 포인트 타입을 정의하여 사용할 수도 있다. 이 방식은 필요한 데이터만 포함하는 구조체를 사용함으로써 메모리 사용을 최적화하고, 컴파일 타임에 데이터의 레이아웃이 결정되므로 런타임 오버헤드 없이 데이터에 접근할 수 있다는 장점이 있다.
Organized vs. Unorganized Datasets: PCL 데이터 구조의 가장 독특하고 강력한 특징 중 하나는 ‘정리된(Organized)’ 데이터셋 개념을 명시적으로 지원한다는 점이다.17
width와 height 멤버 변수를 사용하여 포인트 클라우드가 이미지와 같은 2D 격자 구조를 가지는지 여부를 표현한다. 예를 들어, ToF(Time-of-Flight) 카메라나 스테레오 카메라로부터 얻은 데이터는 width=640, height=480과 같이 표현될 수 있다. 이 구조를 활용하면 특정 포인트의 이웃을 찾는 연산(neighbor search)을 $O(N)$이 아닌 O(1) 시간 복잡도로 수행할 수 있어, 법선 추정이나 특징 추출과 같은 많은 알고리즘의 성능을 극적으로 향상시킬 수 있다. 격자 구조가 없는 일반적인 포인트 클라우드는 height=1로 설정하여 ‘비정리된(Unorganized)’ 데이터셋으로 표현한다. 또한, is_dense 플래그를 통해 포인트 클라우드 내에 NaN/Inf와 같은 유효하지 않은 값이 포함되어 있는지 여부를 나타낸다.17
데이터 접근: 포인트 데이터 자체는 points라는 이름의 std::vector<PointT> 멤버 변수에 저장된다. 따라서 C++ 코드에서는 cloud.points[i].x와 같은 직관적인 방식으로 각 포인트의 속성에 접근할 수 있다.17
Open3D는 Python과의 유기적인 결합을 최우선으로 고려하여 데이터 구조를 설계했다.
통합 클래스와 속성 기반 접근: Open3D의 open3d.geometry.PointCloud는 PCL처럼 템플릿으로 분화되지 않은 단일 클래스이다.18 대신, 포인트의 속성들을 개별적인 속성(property)으로 관리한다. 핵심 속성으로는
points(좌표), colors(색상), normals(법선), covariances(공분산) 등이 있으며, 이들은 필요에 따라 동적으로 추가되거나 비어 있을 수 있다.18
NumPy와의 완벽한 호환성: Open3D 데이터 구조의 가장 큰 장점은 Python 환경에서 NumPy 배열과의 완벽한 호환성이다. np.asarray(pcd.points)와 같은 코드를 사용하면, 포인트 클라우드의 내부 데이터 버퍼에 대한 NumPy 뷰(view)가 생성된다. 이는 데이터의 불필요한 복사 없이(zero-copy에 가깝게) NumPy의 강력하고 효율적인 슬라이싱, 인덱싱, 벡터화 연산을 그대로 적용할 수 있음을 의미한다.18 이 설계는 Python 기반의 데이터 분석 및 머신러닝 워크플로우에 Open3D를 완벽하게 통합시키는 결정적인 역할을 한다.
‘Organized’ 데이터셋 개념: Open3D는 PCL과 같은 명시적인 ‘Organized’ 데이터셋 개념을 직접 지원하지는 않는다. 대신, create_from_depth_image나 create_from_rgbd_image와 같은 팩토리 함수를 제공하여 깊이 이미지나 RGB-D 이미지로부터 직접 포인트 클라우드를 생성하는 기능을 지원한다.18 이는 유사한 목적을 달성하지만, PCL처럼 데이터 구조 자체에 격자 정보가 내재된 방식은 아니다.
이러한 데이터 구조의 차이는 두 라이브러리의 근본적인 지향점을 보여준다. PCL의 템플릿 기반 구조는 C++ 환경에서 최고의 성능과 메모리 효율성, 유연성을 추구한 결과물이다. 그러나 이 아키텍처는 동적 타입 언어인 Python으로의 바인딩(binding)을 매우 어렵게 만드는 원인이 되었다. 모든 템플릿 조합에 대해 별도의 래퍼(wrapper) 코드를 생성해야 하므로, PCL의 Python 지원이 파편화되고 불완전하게 된 것은 필연적인 결과였다.19
반면, Open3D의 속성 기반 데이터 구조는 Python 친화성을 극대화하기 위한 전략적 선택이다. 각 속성을 NumPy와 호환되는 독립적인 배열로 관리하는 방식(Struct of Arrays, SoA)은 PCL의 구조체 배열(Array of Structs, AoS) 방식과 대조된다. 이 SoA 방식은 Python/NumPy와의 호환성뿐만 아니라, 최신 GPU 아키텍처에서 메모리 접근 효율성(memory coalescing)을 높여 병렬 처리에 더 유리한 구조이기도 하다. 이는 Open3D가 단순히 Python을 지원하는 것을 넘어, 현대적인 과학 컴퓨팅 및 머신러닝 생태계의 데이터 처리 패러다임에 근본적으로 더 잘 부합하도록 설계되었음을 시사한다.
개발자에게 가장 직접적으로 와닿는 데이터 구조의 실용적인 측면들을 비교하면 다음과 같다.
| 항목 | pcl::PointCloud<PointT> (PCL) |
open3d.geometry.PointCloud (Open3D) |
|---|---|---|
| 기반 | C++ 템플릿 (PointT) 16 |
통합 클래스 18 |
| 포인트 타입 | 컴파일 타임에 결정 (e.g., PointXYZ, PointXYZRGB) 16 |
런타임에 속성(points, colors, normals) 존재 여부로 결정 18 |
| 데이터 접근 (C++) | cloud.points[i].x |
cloud.points_ (내부 벡터) |
| 데이터 접근 (Python) | Cython 래퍼를 통해 간접 접근 (복사 발생 가능) 19 | np.asarray(pcd.points) (메모리 공유, 높은 효율) 18 |
| NumPy 호환성 | 낮음 (별도 변환 함수 필요) | 매우 높음 (핵심 설계 요소) |
| ‘Organized’ 데이터셋 | width, height로 명시적 지원 17 |
직접 지원 안함 (깊이 이미지로부터 생성 기능 제공) 18 |
| 메모리 구조 | std::vector<PointT> (구조체 배열, AoS) |
속성별 별도 벡터 (Vector3dVector 등) (배열의 구조체, SoA) |
PCL과 Open3D는 필터링, 특징 추출, 정합, 분할, 시각화 등 포인트 클라우드 처리의 핵심적인 기능들을 모두 제공하지만, 제공하는 알고리즘의 종류와 깊이, 그리고 API의 형태에서 뚜렷한 차이를 보인다. 이는 두 라이브러리의 ‘백과사전’ 대 ‘핵심 기능’이라는 철학적 차이를 명확히 보여준다.
필터링은 노이즈를 제거하거나 데이터의 양을 줄여 후속 처리의 효율성과 정확성을 높이는 필수적인 전처리 단계이다.
pcl/filters 모듈은 매우 방대하고 세분화된 필터 알고리즘 컬렉션을 제공한다. 대표적으로, 다운샘플링을 위한 VoxelGrid 필터 15, 특정 축의 값 범위를 기준으로 포인트를 제거하는 PassThrough 필터 15, 각 포인트의 이웃 간 거리 분포를 분석하여 이상치(outlier)를 제거하는 StatisticalOutlierRemoval 필터 15, 그리고 사용자가 정의한 조건이나 반경 내 이웃 수에 따라 포인트를 제거하는 ConditionalRemoval 및 RadiusOutlierRemoval 필터 등이 있다.15 PCL의 필터링 API는 일관된 패턴을 따른다. 사용자는 필터 객체를 생성하고, setInputCloud()로 입력 데이터를 지정하며, 각 필터에 특화된 파라미터를 설정한 뒤, filter() 메소드를 호출하여 결과를 얻는다.16 이 방식은 다양한 필터를 동일한 구조로 사용할 수 있게 하지만, 코드가 다소 장황해질 수 있다.pcd.voxel_down_sample() 21, pcd.remove_statistical_outlier(), pcd.remove_radius_outlier() 18와 같이, 객체에서 바로 메소드를 호출하는 방식이다. 이는 PCL에 비해 알고리즘의 종류가 다양하지는 않지만, 개발자가 가장 필요로 하는 기능들을 매우 직관적이고 Pythonic하게 사용할 수 있도록 하는 데 집중한 결과이다.특징 추출은 포인트 클라우드의 각 점이나 특정 영역의 기하학적 특성을 정량적인 값, 즉 기술자(descriptor)로 표현하는 과정으로, 객체 인식이나 정합에서 핵심적인 역할을 한다.
pcl/features 모듈은 3D 특징점 연구의 집대성이라고 할 수 있을 정도로 방대한 기술자 라이브러리를 자랑한다. 표면의 법선(Normals)과 곡률(Curvatures)과 같은 기본적인 기하 정보부터, FPFH(Fast Point Feature Histograms), PFH(Point Feature Histograms), VFH(Viewpoint Feature Histogram), SHOT(Signatures of Histograms of Orientations) 등 학계에 발표된 수많은 지역(local) 및 전역(global) 특징점 기술자를 구현하고 있다.16 또한, 특징을 계산할 이웃을 찾기 위한 검색 방법(k-d tree, octree 등)을 명시적으로 지정할 수 있는 등, 연구자를 위한 높은 수준의 제어 기능과 유연성을 제공한다.compute_fpfh()와 같이 업계 표준으로 널리 사용되는 핵심적인 특징 추출 알고리즘을 제공한다.24 PCL에 비해 제공되는 기술자의 종류는 현저히 적다. 그러나 Open3D의 접근 방식은 단순히 내장된 알고리즘에만 의존하지 않는다. Open3D-ML이라는 확장 라이브러리를 통해 PyTorch나 TensorFlow와 같은 딥러닝 프레임워크와 직접 연동하여, 딥러닝 기반의 강력한 특징 추출 모델을 손쉽게 사용하거나 훈련할 수 있는 길을 열어두었다.13 이는 전통적인 기하 기반 특징의 한계를 데이터 기반의 학습 방식으로 극복하려는 현대적인 접근법을 반영한다.정합은 서로 다른 위치와 자세에서 스캔된 여러 개의 포인트 클라우드를 하나의 일관된 좌표계로 정렬하는 과정이다.
PCL: pcl/registration 모듈은 정합 알고리즘의 교과서와 같다. 가장 대표적인 ICP(Iterative Closest Point) 알고리즘의 다양한 변형(예: 법선 정보를 함께 사용하는 IterativeClosestPointWithNormals, 비선형 최적화를 수행하는 IterativeClosestPointNonLinear)과 GICP(Generalized-ICP), NDT(Normal Distributions Transform) 등 수많은 알고리즘을 제공한다.25 PCL 정합 프레임워크의 가장 큰 특징은 극도의 유연성이다. ICP 파이프라인을 구성하는 각 단계, 즉 대응점 추정(Correspondence Estimation), 잘못된 대응점 제거(Correspondence Rejection), 변환 행렬 추정(Transformation Estimation)을 사용자가 직접 다른 알고리즘으로 교체하거나 커스터마이징할 수 있다.25 또한, 여러 개의 포인트 클라우드를 순차적으로 정합하는 IncrementalRegistration과 같은 고급 기능도 포함한다.25
Open3D: Open3D는 registration_icp()라는 단일 함수를 통해 Point-to-Point 및 Point-to-Plane ICP를 간결하게 제공한다.27 사용자는 평가 지표(evaluation metric)와 최대 대응 거리, 수렴 조건 등을 파라미터로 전달하기만 하면 된다. PCL과 차별화되는 Open3D의 강점은 전역 정합(Global Registration) 파이프라인을 내장하고 있다는 점이다.
registration_ransac_based_on_feature_matching 함수는 FPFH와 같은 특징점 기술자를 사용하여 초기 추정치가 전혀 없는 상태에서도 두 포인트 클라우드 간의 대략적인 정렬을 찾아준다.24 이는 이후 ICP와 같은 지역 정합(local registration)의 초기값으로 사용되어 정합 성공률을 크게 높인다. 최근에는 FMCW LiDAR를 위한 Doppler ICP와 같은 최신 연구 결과도 빠르게 라이브러리에 통합하고 있다.28
분할은 전체 포인트 클라우드를 의미 있는 단위(예: 평면, 클러스터)로 나누는 과정이다.
PCL: pcl/segmentation 모듈은 모델 기반 분할과 클러스터링 기법을 모두 지원한다. RANSAC(Random Sample Consensus) 알고리즘을 이용하여 평면, 원기둥, 구 등과 같은 파라미터 모델에 맞는 포인트들을 추출할 수 있다.15 또한, 유클리드 거리를 기반으로 가까운 포인트들을 묶는
EuclideanClusterExtraction 15이나, 법선과 같은 지역적 특성의 유사성을 기반으로 영역을 확장해나가는
RegionGrowing 15 등 다양한 클러스터링 기법을 제공한다.
Open3D: Open3D 역시 segment_plane() 메소드를 통해 RANSAC 기반의 평면 분할을, cluster_dbscan() 메소드를 통해 밀도 기반 클러스터링(DBSCAN)을 제공한다.18 PCL과 마찬가지로 핵심적인 분할 알고리즘을 제공하지만, API가 포인트 클라우드 객체에 직접 통합되어 있어 사용이 더 간편하다.
시각화는 3D 데이터를 직관적으로 이해하고 알고리즘의 결과를 검증하는 데 필수적이다.
pcl/visualization 모듈은 강력한 3D 그래픽스 라이브러리인 VTK(Visualization Toolkit)를 백엔드로 사용한다. 이를 통해 매우 유연하고 강력한 시각화 기능을 제공한다. PCLVisualizer 클래스를 사용하면 여러 개의 뷰포트(viewport)를 생성하고, 포인트 클라우드 외에 원기둥, 구, 선, 다각형 등 다양한 기하학적 형상을 함께 그릴 수 있으며, 각 객체의 색상, 크기, 투명도 등을 세밀하게 제어할 수 있다.29 간단한 시각화가 필요할 경우를 대비해 몇 줄의 코드로 빠르게 창을 띄울 수 있는 CloudViewer 클래스도 제공한다.29 또한, pcl_viewer라는 커맨드라인 유틸리티를 통해 코딩 없이 PCD 파일을 즉시 시각화할 수 있다.29open3d.visualization.draw_geometries()라는 단 하나의 함수 호출로 해결된다.31 이 함수에 시각화할 지오메트리 객체들의 리스트를 전달하기만 하면, 상호작용이 가능한 창이 나타난다. 이 창 안에서 사용자는 마우스로 카메라를 조작하고, 키보드 단축키를 이용해 렌더링 스타일을 변경하거나(예: Phong 조명, 와이어프레임), 스크린샷을 캡처하는 등 다양한 작업을 수행할 수 있다.31 특히 Open3D는 PBR(Physically Based Rendering)을 지원하여 매우 사실적이고 고품질의 렌더링 결과를 얻을 수 있다는 장점이 있다.7 Python 스크립팅 및 Jupyter Notebook 환경과의 완벽한 통합은 Open3D 시각화 기능의 가장 큰 강점 중 하나이다.이러한 기능 비교는 PCL과 Open3D의 근본적인 접근 방식 차이를 다시 한번 확인시켜 준다. PCL은 연구자에게 필요한 모든 도구와 옵션을 제공하는 ‘전문가의 공구함’과 같다. 이는 특정 알고리즘의 내부 동작을 깊이 있게 탐구하거나 다양한 변형을 실험하는 데에는 매우 유용하지만, 실용적인 애플리케이션을 빠르게 개발하려는 개발자에게는 오히려 선택의 부담과 학습의 어려움을 줄 수 있다. 반면, Open3D는 가장 보편적으로 사용되는 ‘최고의 도구’ 몇 가지를 엄선하여 매우 사용하기 쉬운 형태로 제공하는 ‘잘 정리된 개발 키트’와 같다. 이는 신속한 프로토타이핑과 개발에 초점을 맞춘 접근 방식이다.
다음 표는 각 기능 영역에서 두 라이브러리가 제공하는 대표적인 알고리즘과 그 특징을 요약하여 보여준다.
| 기능 영역 | Point Cloud Library (PCL) | Open3D |
|---|---|---|
| 필터링 | VoxelGrid, PassThrough, StatisticalOutlierRemoval, RadiusOutlierRemoval, ConditionalRemoval, ProjectInliers 등 다수 15 | voxel_down_sample, remove_statistical_outlier, remove_radius_outlier, crop 등 핵심 기능 18 |
| 특징 추출 | FPFH, PFH, VFH, SHOT, CSHOT, 3DSC, Normal, Curvature 등 매우 다양 16 | compute_fpfh, compute_normals. 3D ML을 통한 확장 13 |
| 정합 | ICP (Point-to-Point, Point-to-Plane, NonLinear), GICP, NDT, 다중 정합 등. 파이프라인 커스터마이징 가능 25 | registration_icp (P2P, P2P), registration_ransac_based_on_feature_matching (전역), ColoredICP, DopplerICP 24 |
| 분할 | RANSAC (Plane, Cylinder, Sphere…), Euclidean Clustering, Region Growing, LCCP, Supervoxel 등 15 | segment_plane (RANSAC), cluster_dbscan 18 |
| 시각화 | VTK 기반 PCLVisualizer (고급 제어), CloudViewer (간편), PCLPlotter (2D) 29 |
draw_geometries() (매우 간편), PBR 렌더링, Jupyter 통합, Viewer App 7 |
라이브러리의 성능은 특히 실시간 처리가 요구되는 로보틱스나 대용량 데이터를 다루는 응용 분야에서 라이브러리 선택의 핵심적인 기준이 된다. PCL과 Open3D의 성능을 C++ 네이티브 환경, 병렬 처리 및 GPU 가속, 그리고 Python 환경이라는 세 가지 관점에서 비교 분석한다.
PCL과 Open3D의 순수 C++ 구현 성능을 직접 비교한 공식적인 벤치마크는 드물지만, 2018년에 발표된 “cilantro: A Lean, Versatile, and Efficient Library for Point Cloud Data Processing”라는 학술 논문에서 세 라이브러리(cilantro, Open3D, PCL)의 성능을 비교한 결과는 매우 중요한 시사점을 제공한다.33
현대의 컴퓨팅 환경은 멀티코어 CPU와 고성능 GPU를 활용하는 병렬 처리가 표준이 되었다.
pcl/gpu라는 별도의 모듈을 통해 CUDA 기반의 가속 기능을 일부 제공한다.35 예를 들어, Kinfu와 같은 대규모 재구성 프로젝트나 ICP, FPFH 계산 등 일부 핵심 기능에 대해 GPU 버전이 존재한다. 하지만 이러한 GPU 지원은 라이브러리 전반에 걸쳐 통합적으로 제공되기보다는, 특정 기능에 대한 애드온(add-on) 형태에 가까우며, NVIDIA의 CUDA에만 종속된다는 한계가 있다.많은 개발자와 연구자들이 Python 환경에서 작업하는 만큼, Python API의 성능은 라이브러리의 실효성을 결정하는 중요한 척도이다.
다음 표는 “cilantro” 논문에서 보고된 C++ 네이티브 환경에서의 주요 연산 성능 비교 결과를 요약한 것이다. 이 결과는 라이브러리 선택 시 중요한 정량적 참고 자료가 될 수 있다.
| 연산 | 비교 대상 | 상대적 성능 (처리 시간 기준, 낮을수록 좋음) | 출처 |
|---|---|---|---|
| kNN 기반 법선 추정 | PCL | 1.85 (cilantro 대비) | 33 |
| Open3D | 1.58 (cilantro 대비) | 33 | |
| ICP 정합 (15회 반복) | PCL | 14.99 (cilantro 대비) | 33 |
| Open3D | 3.82 (cilantro 대비) | 33 |
API(Application Programming Interface)의 설계 방식과 지원 언어는 개발자의 학습 곡선, 코드의 가독성, 그리고 개발 생산성에 직접적인 영향을 미친다. PCL과 Open3D는 이 지점에서 가장 극명한 차이를 보이며, 이는 두 라이브러리를 선택하는 결정적인 기준이 된다.
두 라이브러리 모두 C++를 기반으로 하지만, API를 설계하는 철학은 상이하다.
pcl::PointCloud<PointT> 데이터 구조에서부터 필터, 특징 추출 등 대부분의 알고리즘 클래스가 템플릿으로 구현되어 있다. 이 방식은 다양한 포인트 타입에 대해 코드를 재사용하고, 컴파일 타임에 최적화된 코드를 생성하여 높은 성능을 달성하는 데 유리하다. 하지만 이는 명백한 단점을 동반한다. 템플릿 기반 코드는 컴파일 시간이 길어지는 경향이 있으며, 템플릿 관련 컴파일 에러가 발생했을 때 출력되는 메시지가 매우 길고 복잡하여 디버깅을 어렵게 만든다. 또한, PCL의 API는 기능이 방대한 만큼 그 구조가 복잡하고 클래스 계층이 깊어, 초보자가 원하는 기능을 찾고 올바르게 사용하는 법을 익히는 데 상당한 학습 곡선이 존재한다.6Python 지원 여부와 그 완성도는 PCL과 Open3D를 가르는 가장 중요한 분기점이다.
python-pcl 37이지만, 이러한 래퍼들은 근본적인 한계를 안고 있다.19
PointT 타입 조합에 대해 명시적으로 코드를 작성해야 한다. 이는 엄청난 양의 코드 중복을 야기하고 유지보수를 매우 어렵게 만든다.python-pcl, pcl.py, pclpy 등 여러 프로젝트가 난립했으며, 이들 중 상당수는 개발이 중단되거나 비활성화된 상태이다.19 이는 사용자에게 혼란을 주고 안정적인 개발 환경을 구축하기 어렵게 만든다.두 라이브러리의 API 설계 철학 차이는 실제 코드에서 명확하게 드러난다. 동일한 작업인 ‘VoxelGrid 필터를 이용한 다운샘플링’을 수행하는 코드를 비교해 보자.
PCL에서는 필터 객체를 생성하고, 입력과 파라미터를 설정한 뒤, 필터링을 수행하는 명시적인 절차를 따른다.
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/voxel_grid.h>
int main() {
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
// 포인트 클라우드 파일 로드
pcl::io::loadPCDFile<pcl::PointXYZ>("table_scene_lms400.pcd", *cloud);
// VoxelGrid 필터 객체 생성
pcl::VoxelGrid<pcl::PointXYZ> sor;
sor.setInputCloud(cloud);
sor.setLeafSize(0.01f, 0.01f, 0.01f); // 1cm 크기의 복셀 설정
sor.filter(*cloud_filtered); // 필터 적용
return 0;
}
이 코드는 20 등에서 볼 수 있는 전형적인 PCL 사용 패턴을 보여준다. 알고리즘(VoxelGrid)을 객체로 만들고, 데이터를 이 객체에 ‘주입’하는 ‘알고리즘 중심적(algorithm-centric)’ API 설계를 따르고 있다. 또한, 사용할 포인트 타입(pcl::PointXYZ)을 템플릿 인자로 명시해야 한다.
Open3D에서는 포인트 클라우드 객체가 다운샘플링 메소드를 직접 가지고 있다.
import open3d as o3d
# 포인트 클라우드 파일 로드
pcd = o3d.io.read_point_cloud("table_scene_lms400.pcd")
# 복셀 다운샘플링 수행
downpcd = pcd.voxel_down_sample(voxel_size=0.01) # 1cm 크기의 복셀 설정
이 코드는 21의 예제에서 볼 수 있듯이, 단 한 줄의 메소드 호출로 동일한 작업이 완료된다. 이는 데이터 객체에 직접 연산을 적용하는 ‘데이터 중심적(data-centric)’ API 설계를 보여준다. 코드가 매우 간결하고 직관적이어서, 개발자는 알고리즘의 내부 구현보다는 ‘무엇을 할 것인가’에 집중할 수 있다.
이러한 API 설계의 차이는 단순한 코드 길이의 문제가 아니다. 이는 개발자의 사고방식과 작업 흐름에 깊은 영향을 미친다. PCL의 API는 개발자에게 알고리즘의 작동 방식을 더 깊이 이해하고 제어할 수 있는 권한을 주는 반면, Open3D의 API는 개발자가 더 빠르게 실험하고 결과를 도출할 수 있도록 돕는다. 특히 머신러닝 연구처럼 빠른 반복과 실험이 필수적인 분야에서 Open3D의 간결한 Python API는 단순한 편의성을 넘어, 연구 개발의 속도를 근본적으로 바꾸는 전략적 이점을 제공한다.
오픈소스 라이브러리의 가치는 단순히 코드의 기능성에만 국한되지 않는다. 라이브러리를 둘러싼 문서의 질, 튜토리얼의 풍부함, 커뮤니티의 활성도, 그리고 산업 및 학계에서의 채택 사례 등 생태계 전반의 건강 상태가 라이브러리의 현재와 미래 가치를 결정하는 중요한 요소이다.
개발자가 라이브러리를 배우고 문제를 해결하는 데 있어 가장 중요한 자원은 잘 갖춰진 문서와 지원 채널이다.
point-cloud-library 태그로 수많은 질문과 답변이 축적되어 있어, 개발 중에 발생하는 많은 문제에 대한 해결책을 찾을 수 있다.35 하지만 PCL의 웹사이트는 과거 해킹 이력이 있었고, 이로 인해 오래된 웹사이트 접근 시 주의가 필요하다는 경고가 있을 정도로 35 관리의 어려움을 겪은 흔적이 보인다. 일부 문서는 최신 버전의 변경사항을 반영하지 못하고 오래된 상태로 남아 있을 수 있다.프로젝트의 지속 가능성은 커뮤니티의 활성도와 직결된다. GitHub 저장소의 통계는 이를 가늠할 수 있는 객관적인 지표를 제공한다.
라이브러리의 실제 활용 사례는 그 신뢰성과 영향력을 보여준다.
이러한 생태계 분석은 PCL이 ‘안정적인 기존 강자’라면, Open3D는 ‘역동적인 신흥 강자’로서 ‘왕위 교체’가 진행 중임을 시사한다. 새로운 프로젝트를 시작하는 개발자 입장에서, Open3D를 선택하는 것은 활발하고 성장하는 커뮤니티에 합류하여 최신 기술 트렌드를 따라가고, 문제 발생 시 도움을 받기 용이함을 의미한다. 반면 PCL을 선택하는 것은 방대한 레거시 코드와 자료를 기반으로 안정적인 개발을 할 수 있지만, 커뮤니티의 활력이 다소 정체되어 있고 혁신의 속도가 느릴 수 있다는 점을 감수해야 함을 의미한다. 이는 장기적인 프로젝트 유지보수와 기술 인력 확보 측면에서도 중요한 고려사항이 된다.
다음 표는 두 라이브러리의 생태계와 커뮤니티의 건강 상태를 가늠할 수 있는 주요 지표들을 객관적으로 비교한다.
| 항목 | Point Cloud Library (PCL) | Open3D |
|---|---|---|
| GitHub Stars | ~10.5k 35 | ~12.6k 13 |
| GitHub Forks | ~4.7k 35 | ~2.5k 13 |
| GitHub Commits | ~14.5k 35 | ~4.2k 13 |
| 개발 활성도 | 유지보수 중심, 기능 추가는 상대적으로 더딤 | 매우 활발, 수개월 단위 메이저 릴리즈 28 |
| 주요 지원 채널 | Stack Overflow, 공식 문서 35 | GitHub, Discord, 공식 문서 13 |
| 문서 스타일 | 방대함, 일부는 오래될 수 있음 15 | 현대적, 체계적, Jupyter 예제 다수 40 |
| 주요 응용 분야 | 전통적 로보틱스, 자율주행 (ROS 기반) | 3D 딥러닝, AR/VR, 신규 연구 3 |
본 보고서는 3D 포인트 클라우드 처리 분야의 두 핵심 오픈소스 라이브러리인 PCL과 Open3D를 개발 철학, 아키텍처, 핵심 기능, 성능, API, 그리고 생태계의 관점에서 심층적으로 비교 분석했다. 분석 결과를 종합하여 두 라이브러리의 본질적인 특성을 요약하고, 구체적인 사용 사례에 따른 선택 가이드를 제시하며, 미래를 전망하고자 한다.
두 라이브러리는 단순히 기능의 차이를 넘어, 서로 다른 시대적 배경과 개발 철학을 대표하는 뚜렷한 정체성을 가지고 있다.
PCL: ‘포괄적인 C++ 기반 3D 처리 백과사전’
PCL은 로보틱스 분야의 요구에 부응하여 탄생한, C++ 중심의 고성능 라이브러리이다. 가장 큰 장점은 3D 처리 파이프라인 전반에 걸친 방대하고 깊이 있는 알고리즘 컬렉션과, 템플릿 기반의 유연한 C++ API를 통해 얻는 세밀한 제어 능력이다. 로보틱스, 특히 ROS 생태계에서 오랫동안 검증된 안정성과 성능은 여전히 강력한 자산이다. 그러나 복잡한 서드파티 의존성으로 인한 어려운 설치 과정, C++ 템플릿 사용에 따른 가파른 학습 곡선, 그리고 결정적으로 공식 지원이 부재한 파편화된 Python 생태계는 명백한 단점으로 지적된다.
Open3D: ‘Python 친화적인 현대적 3D 개발 플랫폼’
Open3D는 PCL 이후의 시대, 즉 Python과 머신러닝이 개발의 중심이 된 시대의 요구를 반영하여 탄생했다. 최대 강점은 극도로 간결하고 직관적인 API, Python을 최우선으로 고려한 설계, 그리고 NumPy, PyTorch, TensorFlow 등 현대 과학 컴퓨팅 생태계와의 완벽한 통합이다. 이는 신속한 프로토타이핑과 개발 생산성의 극대화로 이어진다. PCL에 비해 내장된 알고리즘의 종류는 적지만, 가장 핵심적인 기능들을 엄선하여 제공하고, 3D 딥러닝과 최신 GPU 가속 기술 지원에 집중함으로써 미래 지향적인 가치를 창출하고 있다.
어떤 라이브러리가 ‘더 좋다’고 단정하기보다는, 프로젝트의 특성과 요구사항에 따라 ‘더 적합한’ 라이브러리를 선택하는 것이 현명하다.
‘Organized’ 데이터셋 활용: 스테레오/ToF 카메라로부터 얻는 ‘정리된(Organized)’ 포인트 클라우드의 격자 구조를 활용하여 이웃 탐색 성능을 극대화해야 하는 실시간 애플리케이션의 경우, PCL의 명시적 지원이 유리하다.
pip install 한 줄로 설치가 완료되어야 하거나, 다양한 플랫폼에 손쉽게 애플리케이션을 배포해야 하는 경우, 의존성이 적고 빌드가 간편한 Open3D가 압도적으로 유리하다.3D 데이터 처리 분야는 앞으로도 계속해서 발전할 것이며, 두 라이브러리는 각자의 경로를 따라 진화할 것으로 보인다. PCL은 로보틱스 분야에서 수많은 레거시 시스템과 코드 자산을 기반으로 안정적인 기반 라이브러리로서의 역할을 계속 수행할 것이다. 그 방대한 알고리즘은 여전히 중요한 학술적, 실용적 가치를 지닌다.
한편, Open3D는 3D 딥러닝이라는 거대한 물결과 현대적인 개발 트렌드를 등에 업고 3D 처리 분야의 주류 라이브러리로서의 입지를 더욱 공고히 할 것이다. 활발한 커뮤니티와 빠른 개발 속도를 바탕으로 최신 연구 결과와 하드웨어 기술을 지속적으로 흡수하며 생태계를 확장해 나갈 것으로 예상된다.
결론적으로 PCL과 Open3D는 단순한 경쟁 관계를 넘어, 서로 다른 철학과 강점을 바탕으로 3D 컴퓨터 비전 생태계 전체를 풍요롭게 하는 상호 보완적인 관계에 있다. 개발자는 두 라이브러리의 본질적인 차이를 명확히 이해하고, 자신의 목표에 가장 부합하는 도구를 전략적으로 선택함으로써 성공적인 프로젝트를 이끌어 나갈 수 있을 것이다.
| Open3D: A Modern Library for 3D Data Processing | Request PDF - ResearchGate, accessed August 5, 2025, https://www.researchgate.net/publication/322819315_Open3D_A_Modern_Library_for_3D_Data_Processing |
| Open3D Explained | aijobs.net, accessed August 5, 2025, https://aijobs.net/insights/open3d-explained/ |
| Point Cloud Library | The Point Cloud Library (PCL) is a standalone, large scale, open project for 2D/3D image and point cloud processing., accessed August 5, 2025, https://pointclouds.org/ |
| Carnegie Robotics | Autonomous Vehicle Solutions, accessed August 5, 2025, https://carnegierobotics.com/ |
| Nuro-Autonomy for all. All roads, all rides. | Nuro, accessed August 5, 2025, https://www.nuro.ai/ |
| Point Cloud City Open3D ML Repository | NIST, accessed August 5, 2025, https://www.nist.gov/services-resources/software/point-cloud-city-open3d-ml-repository |