# probreg
**Repository Path**: wayttliu/probreg
## Basic Information
- **Project Name**: probreg
- **Description**: Point cloud registration using probabilistic model (CPD/GMMReg/SVR/GMMTree/FilterReg)
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-04-07
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 
[](https://travis-ci.org/neka-nat/probreg)
[](https://ci.appveyor.com/project/neka-nat/probreg)
[](https://badge.fury.io/py/probreg)
[](LICENSE)
[](https://probreg.readthedocs.io/en/latest/?badge=latest)
[](https://pepy.tech/project/probreg)
Probreg is a library that implements point cloud **reg**istration algorithms with **prob**ablistic model.
The point set registration algorithms using stochastic model are more robust than ICP(Iterative Closest Point).
This package implements several algorithms using stochastic models and provides a simple interface with [Open3D](http://www.open3d.org/).
## Core features
* Open3D interface
* Rigid and non-rigid transformation
## Algorithms
* Maximum likelihood when the target or source point cloud is observation data
* [Coherent Point Drift(2010)](https://arxiv.org/pdf/0905.2635.pdf)
* [FilterReg(CVPR2019)](https://arxiv.org/pdf/1811.10136.pdf)
* Distance minimization of two probabilistic distributions
* [GMMReg(2011)](https://ieeexplore.ieee.org/document/5674050)
* [Support Vector Registration(2015)](https://arxiv.org/pdf/1511.04240.pdf)
* Hierarchical Stocastic model
* [GMMTree(ECCV2018)](https://arxiv.org/pdf/1807.02587.pdf)
### Transformations
| type | CPD | SVR, GMMReg | GMMTree | FilterReg |
|------|-----|-------------|---------|-----------|
|Rigid | **Scale + 6D pose** | **6D pose** | **6D pose** | **6D pose** (Point-to-point, Point-to-plane, FPFH-based)|
|NonRigid | **Affine**, **MCT** | **TPS** | - | **Deformable Kinematic** (experimental) |
## Installation
You can install probreg using `pip`.
```
pip install probreg
```
Or install probreg from source.
```
git clone https://github.com/neka-nat/probreg.git --recursive
cd probreg
pip install -e .
```
## Getting Started
This is a sample code that reads a PCD file and calls CPD registration.
You can easily execute registrations from Open3D point cloud object and draw the results.
```py
import copy
import numpy as np
import open3d as o3
from probreg import cpd
# load source and target point cloud
source = o3.io.read_point_cloud('bunny.pcd')
target = copy.deepcopy(source)
# transform target point cloud
th = np.deg2rad(30.0)
target.transform(np.array([[np.cos(th), -np.sin(th), 0.0, 0.0],
[np.sin(th), np.cos(th), 0.0, 0.0],
[0.0, 0.0, 1.0, 0.0],
[0.0, 0.0, 0.0, 1.0]]))
source = source.voxel_down_sample(voxel_size=0.005)
target = target.voxel_down_sample(voxel_size=0.005)
# compute cpd registration
tf_param, _, _ = cpd.registration_cpd(source, target)
result = copy.deepcopy(source)
result.points = tf_param.transform(result.points)
# draw result
source.paint_uniform_color([1, 0, 0])
target.paint_uniform_color([0, 1, 0])
result.paint_uniform_color([0, 0, 1])
o3.visualization.draw_geometries([source, target, result])
```
## Resources
* [Documentation](https://probreg.readthedocs.io/en/latest/?badge=latest)
## Results
### Compare algorithms
| CPD | SVR | GMMTree | FilterReg |
|-----|-----|---------|-----------|
|
|
|
|
|
### Noise test
| ICP(Open3D) | CPD | FilterReg |
|-------------|-----|-----------|
|
|
|
|
### Non rigid registration
| CPD | SVR | Filterreg |
|-----|-----|-----------|
|
|
|
|
### Feature based registration
| FPFH FilterReg |
|----------------|
|
|
### Time measurement
Execute an example script for measuring time.
```
OMP_NUM_THREADS=1 python time_measurement.py
# Results [s]
# ICP(Open3D): 0.02030642901081592
# CPD: 3.6435861150093842
# SVR: 0.5795929960149806
# GMMTree: 0.34479290700983256
# FilterReg: 0.039795294986106455
```
## Citing
```
@software{probreg,
author = {{Kenta-Tanaka et al.}},
title = {probreg},
url = {https://probreg.readthedocs.io/en/latest/},
version = {0.1.6},
date = {2019-9-29},
}
```