liuyuan-pal / PointUtil

useful functions for processing point cloud(GPU or CPU version)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Description

This repository contains some useful functions for processing point cloud, which uses GPU to get better performance. We provide python bindings for these functions.

How to build

1. Dependency

  • CUDA
  • Boost-Python
  • FLANN(built with CUDA)

2. Revise CMakeLists.txt

Set following 6 variables according to your installation directory.

set(BOOST_PYTHON_INCLUDE_DIR /home/liuyuan/software/boost/include)      # path contains boost/python/object_core
set(BOOST_PYTHON_LIBRARY_DIR /home/liuyuan/software/boost/lib)          # path contains boost/python/libboost_numpy*

set(FLANN_INCLUDE_DIR /usr/local/include)   # path contains flann/flann.h
set(FLANN_LIBRARY_DIR /usr/local/lib)       # path contains libflann.so*

# !!! note the python here should be consistent with the python used for building boost-python
set(PYTHON_INCLUDE_DIRS /home/liuyuan/anaconda3/include/python3.6m)   # path contains Python.h
set(PYTHON_LIBRARIES /home/liuyuan/anaconda3/lib/libpython3.6m.so)

3. Build

mkdir build
cd build
cmake ..
make -j

4. test

cd test
python test_downsample.py

If the program output "cost xxxxx.xxxx s ", then the lib is built successfully. The downsampled point clouds are saved in the test/output directory as two txt files, whic can be visualized by CloudCompare or other tools. The result may look like this:

Some API

still under construction

def gridDownsampleGPU(pts,sample_stride,output_gidxs=False,gpu_id=0):
    '''
    split space into voxels, which have side length of sample_stride, 
    and retain only one point every voxel.
    Known issue: the space of point cloud should be smaller than 2^15*sample_stride, otherwise it will cause overflow in the computation.
    :param pts:				np.array, shape is [pn,fn] fn must >= 3, which are [x,y,z,(r,g,b,intensity,label,...)]
    :param sample_stride: 	float,
    :param output_gidxs: 	bool, whether output the grid idx for each raw point
    :param gpu_id:			int, which gpu to use
    :return: 
    	ds_idx: np.array [ds_pn] int32
    	(optional: grid_idx: np.array [pn] int32)
    	downsampled point clouds: ds_pts=pts[ds_idx]
    '''

About

useful functions for processing point cloud(GPU or CPU version)


Languages

Language:C++ 64.2%Language:Cuda 16.9%Language:Python 15.1%Language:CMake 2.9%Language:C 0.9%