diff --git a/.flake8.cython b/.flake8.cython
new file mode 100644
index 000000000..eed031c9d
--- /dev/null
+++ b/.flake8.cython
@@ -0,0 +1,4 @@
+[flake8]
+filename = *.pyx,*.px*
+exclude = .eggs,*.egg,build
+ignore = E901,E225,E226,E227
diff --git a/.pep8 b/.pep8
new file mode 100644
index 000000000..cf862fc76
--- /dev/null
+++ b/.pep8
@@ -0,0 +1,3 @@
+[pep8]
+exclude=.eggs,*.egg,build
+diff=True
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 000000000..b087a52f9
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,170 @@
+language: python
+
+cache:
+ - pip
+ - ccache
+
+matrix:
+ include:
+ # - os: linux
+ # python: "2.7"
+ # env:
+ # - PCL_VERSION="1.7"
+ # - os: linux
+ # python: "3.4"
+ # env:
+ # - PCL_VERSION="1.7"
+ # - os: linux
+ # python: "3.5"
+ # env:
+ # - PCL_VERSION="1.7"
+ - os: linux
+ python: "2.7"
+ env:
+ - PCL_VERSION="1.8"
+ - os: linux
+ python: "3.4"
+ env:
+ - PCL_VERSION="1.8"
+ - os: linux
+ python: "3.5"
+ env:
+ - PCL_VERSION="1.8"
+
+ # TravisCI TimeLimit 50min
+ # numpy error
+ # - os: osx
+ # language: generic
+ # env:
+ # - PYTHON_VERSION=2.7.10
+ # - PYENV_ROOT=~/.pyenv
+ # - PATH=$PYENV_ROOT/shims:$PATH:$PYENV_ROOT/bin
+ # - os: osx
+ # language: generic
+ # env:
+ # - PYTHON_VERSION=3.4.3
+ # - PYENV_ROOT=~/.pyenv
+ # - PATH=$PYENV_ROOT/shims:$PATH:$PYENV_ROOT/bin
+ # - os: osx
+ # language: generic
+ # env:
+ # - PYTHON_VERSION=3.5.1
+ # - PYENV_ROOT=~/.pyenv
+ # - PATH=$PYENV_ROOT/shims:$PATH:$PYENV_ROOT/bin
+
+# travis_wait 45 brew install pcl --without-vtk --without-qt;
+# use pcl version 1.7
+# sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl -y;
+# sudo apt-get update -y;
+# sudo apt-get install libpcl-all -y;
+# use pcl 1.8(Ubuntu)
+# sudo apt-get update -y;
+# git clone https://github.com/PointCloudLibrary/pcl.git pcl-trunk;
+# ln -s pcl-trunk pcl -y;
+# sudo apt-get install g++ -y;
+# sudo apt-get install cmake cmake-gui -y;
+# sudo apt-get install doxygen -y;
+# sudo apt-get install mpi-default-dev openmpi-bin openmpi-common -y;
+# sudo apt-get install libflann1.8 libflann-dev -y;
+# sudo apt-get install libeigen3-dev -y;
+# sudo apt-get install libboost-all-dev -y;
+# sudo apt-get install libvtk5.8-qt4 libvtk5.8 libvtk5-dev -y;
+# sudo apt-get install libqhull* -y;
+# sudo apt-get install libusb-dev -y;
+# sudo apt-get install libgtest-dev -y;
+# sudo apt-get install git-core freeglut3-dev pkg-config -y;
+# sudo apt-get install build-essential libxmu-dev libxi-dev -y;
+# sudo apt-get install libusb-1-0-dev graphviz mono-complete -y;
+# sudo apt-get install qt-sdk openjdk-7-jdk openjdk-7-jre -y;
+# sudo apt-get install phonon-backend-gstreamer -y;
+# sudo apt-get install phonon-backend-vlc -y;
+# sudo apt-get install libpcap-dev -y;
+# cd pcl;
+# mkdir build;
+# cd build;
+# cmake -DCMAKE_BUILD_TYPE=None -DBUILD_GPU=OFF -DBUILD_apps=ON -DBUILD_examples=ON .. ;
+# travis_wait 45 make;
+# travis_wait 45 sudo make install;
+# https://github.com/hsean/Capstone-44-Object-Segmentation/wiki/PCL-1.8:-Ubuntu-14.04-Installation-Guide
+# Add OpenNI2?
+# sudo apt-get install -yV g++ python libusb-1.0.0-dev libudev-dev openjdk-6-jdk freeglut3-dev doxygen graphviz
+# git clone https://github.com/OpenNI/OpenNI2.git
+# cd OpenNI2
+# make
+# cd Packaging
+# python ./ReleaseVersion.py x86
+# cd OpenNI-Linux-x86-2.2
+# cp -a Include /usr/local/include/ni2
+# cp -a Redist /usr/local/lib/ni2
+# cd ../../..
+# other
+# sudo apt-get install openni2-utils
+###
+before_install:
+ - if [[ $TRAVIS_OS_NAME = "osx" ]]; then
+ brew update >/dev/null;
+ brew outdated pyenv || brew upgrade --quiet pyenv;
+ brew install homebrew/boneyard/pyenv-pip-rehash;
+ brew tap homebrew/science;
+
+ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" pyenv install -ks $PYTHON_VERSION;
+ pyenv global $PYTHON_VERSION;
+ python --version;
+
+ brew search versions/pcl;
+ travis_wait 45 brew install pcl --without-qt;
+ fi
+
+ - if [[ $TRAVIS_OS_NAME = "linux" ]]; then
+ sudo apt-get install openni2-utils
+
+ sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl -y;
+ sudo apt-get update -y;
+ sudo apt-get install libpcl-all -y;
+ fi
+
+
+install:
+ - pip install --upgrade pip
+ - pip install cython==0.25.2
+ - pip install numpy
+ - pip install coveralls
+ - python setup.py build_ext -i
+ - python setup.py install
+
+# pcl base 1.7.2
+# - python examples/official/Recognition/cpython correspondence_grouping.py pcldata/tutorials/correspondence_grouping/milk.pcd pcldata/tutorials/correspondence_grouping/milk_cartoon_all_small_clorox.pcd
+script:
+ # - coverage run --source=test_pcl setup.py test
+ # - coverage run tests/test_pcl.py
+ - coverage run --parallel-mode tests/test_pcl.py
+ - coverage run --parallel-mode tests/test_registration.py
+ # examples
+ # - python examples/GrabberCallbackTest.py
+ # examples/official
+ # - python examples/official/grabber/openni_grabber.py
+ # # examples_command_172.txt
+ # # Filtering
+ # - python examples/official/Filtering/PassThroughFilter.py
+ # - python examples/official/Filtering/project_inliers.py
+ # - python examples/official/Filtering/remove_outliers.py -r Radius
+ # - python examples/official/Filtering/remove_outliers.py -r Condition
+ # - python examples/official/Filtering/VoxelGrid_160.py
+ # - python examples/official/Filtering/statistical_removal.py
+ # - python examples/official/IO/pcd_read.py
+ # # KdTree
+ # - python examples/official/kdtree/kdtree_search.py
+ # # keypoints
+ # # NG(RangeImage Link Error)
+ # - python examples/official/keypoints/narf_keypoint_extraction.py
+ # # octree
+ # - python examples/official/octree/octree_search.py
+ # - python examples/official/Segmentation/cluster_extraction.py
+ # - python examples/official/Segmentation/cylinder_segmentation.py
+ # - python examples/official/surface/concave_hull_2d.py
+ # - python examples/official/surface/resampling.py
+
+after_success:
+ - coverage combine
+ - coveralls
+
diff --git a/appveyor.yml b/appveyor.yml
new file mode 100644
index 000000000..0150d46a1
--- /dev/null
+++ b/appveyor.yml
@@ -0,0 +1,250 @@
+os:
+- Windows Server 2012 R2
+
+environment:
+ global:
+ # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the
+ # /E:ON and /V:ON options are not enabled in the batch script intepreter
+ # See: http://stackoverflow.com/a/13751649/163740
+ CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_env.cmd"
+
+ matrix:
+ # Version 1.6.0 Check
+ # Test.py -NG
+ # - PYTHON: "C:\\Python34"
+ # PYTHON_VERSION: "3.4.x"
+ # PYTHON_ARCH: "32"
+ # PCL_ROOT: "C:\\Program Files (x86)\\PCL 1.6.0"
+ # PCL_ROOT_83: "C:\\PROGRA~2\\PCL16~1.0"
+ # PCL_VERSION: "1.6"
+ # OPENNI_VERSION: "1.3.2"
+ # OPENNI_ROOT: "C:\\Program Files (x86)\\OpenNI\\Bin"
+ # APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI\\Win32\\Bin"
+
+ - PYTHON: "C:\\Python34-x64"
+ PYTHON_VERSION: "3.4.x"
+ PYTHON_ARCH: "64"
+ PCL_ROOT: "C:\\Program Files\\PCL 1.6.0"
+ PCL_ROOT_83: "C:\\PROGRA~1\\PCL16~1.0"
+ PCL_VERSION: "1.6"
+ OPENNI_VERSION: "1.3.2"
+ OPENNI_ROOT: "C:\\Program Files\\OpenNI\\Bin64"
+ APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI\\x64\\Bin64"
+
+ # Version 1.7.2 Check
+ #- PYTHON: "C:\\Python35"
+ # PYTHON_VERSION: "3.5.x"
+ # PYTHON_ARCH: "32"
+ # PCL_ROOT: "C:\\Program Files (x86)\\PCL 1.7.2"
+ # PCL_VERSION: "1.7"
+ # OPENNI_VERSION: "1.3.2"
+ # OPENNI_ROOT: "C:\\Program Files (x86)\\OpenNI\\Bin"
+ # APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI\\Win32\\Bin"
+
+ # - PYTHON: "C:\\Python35-x64"
+ # PYTHON_VERSION: "3.5.x"
+ # PYTHON_ARCH: "64"
+ # PCL_ROOT: "C:\\Program Files\\PCL 1.7.2"
+ # PCL_VERSION: "1.7"
+ # OPENNI_VERSION: "1.3.2"
+ # OPENNI_ROOT: "C:\\Program Files\\OpenNI\\Bin64"
+ # APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI\\x64\\Bin64"
+
+ # Version 1.8.0 Check
+ # - PYTHON: "C:\\Python35"
+ # PYTHON_VERSION: "3.5.x"
+ # PYTHON_ARCH: "32"
+ # PCL_ROOT: "C:\\Program Files (x86)\\PCL 1.8.0"
+ # PCL_VERSION: "1.8"
+ # OPENNI_VERSION: "2.1.0"
+ # OPENNI_ROOT: "C:\\Program Files (x86)\\OpenNI2\\Redist"
+ # APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI2\\Win32\\Redist"
+ # UCRT_PATH : "C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x86"
+ # UCRT_DEBUG_PATH : "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x86\\ucrt"
+
+ # - PYTHON: "C:\\Python35-x64"
+ # PYTHON_VERSION: "3.5.x"
+ # PYTHON_ARCH: "64"
+ # PCL_ROOT: "C:\\Program Files\\PCL 1.8.0"
+ # PCL_VERSION: "1.8"
+ # OPENNI_VERSION: "2.1.0"
+ # OPENNI_ROOT: "C:\\Program Files\\OpenNI2\\Redist"
+ # APPVEYOR_OPENNI_ROOT: ".\\AppVeyor\\OpenNI2\\x64\\Redist"
+ # UCRT_PATH : "C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\x86"
+ # UCRT_DEBUG_PATH : "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64\\ucrt"
+
+branches:
+ only:
+ - master
+
+
+install:
+ # If there is a newer build queued for the same PR, cancel this one.
+ # The AppVeyor 'rollout builds' option is supposed to serve the same
+ # purpose but it is problematic because it tends to cancel builds pushed
+ # directly to master instead of just PR builds (or the converse).
+ # credits: JuliaLang developers.
+ - ps: if ($env:APPVEYOR_PULL_REQUEST_NUMBER -and $env:APPVEYOR_BUILD_NUMBER -ne ((Invoke-RestMethod `
+ https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/history?recordsNumber=50).builds | `
+ Where-Object pullRequestId -eq $env:APPVEYOR_PULL_REQUEST_NUMBER)[0].buildNumber) { `
+ throw "There are newer queued builds for this pull request, failing early." }
+
+ # Check ShortPath
+ # - dir "C:\" /x
+ # - dir "C:\Program Files" /x
+ # - dir "C:\Program Files (x86)" /x
+
+ # - ECHO "Filesystem root:"
+ # - ps: "ls \"C:/\""
+ # - ECHO "Installed SDKs:"
+ # - ps: "ls \"C:/Program Files/Microsoft SDKs/Windows\""
+ # Install Python (from the official .msi of http://python.org) and pip when
+ # not already installed.
+ # - ps: if (-not(Test-Path($env:PYTHON))) { & appveyor\install.ps1 }
+
+ # Prepend newly installed Python to the PATH of this build (this cannot be
+ # done from inside the powershell script as it would require to restart
+ # the parent CMD process).
+ # - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PATH%"
+ # Add PCLPath
+ # - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PCL_ROOT%\\bin;%PCL_ROOT%\\3rdParty\\VTK\\bin;%PATH%"
+ # setParameter
+ # - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PYTHON%\\Library\\bin;%PCL_ROOT%\\bin;%PCL_ROOT%\\3rdParty\\VTK\\bin;%PATH%"
+ - "SET PATH=%PYTHON%;%PYTHON%\\Scripts;%PYTHON%\\Library\\bin;%PYTHON%\\Lib\\site-packages;%PCL_ROOT%\\bin;%PCL_ROOT%\\3rdParty\\VTK\\bin;%OPENNI_ROOT%;%PATH%;"
+
+ # debug(ParameterCheck)
+ - "SET PATH"
+ # - "SET PYTHONPATH=%PYTHON%;%PYTHON%\\Scripts;%PYTHON%\\Library\\bin;%PYTHON%\\Lib\\site-packages;%PCL_ROOT%\\bin;%PCL_ROOT%\\3rdParty\\VTK\\bin;"
+ # - "SET PYTHONPATH"
+ # - "SET PKG_CONFIG_PATH"
+
+ # Check that we have the expected version and architecture for Python
+ - "python --version"
+ - "python -c \"import struct; print(struct.calcsize('P') * 8)\""
+
+ # Upgrade to the latest version of pip to avoid it displaying warnings
+ # about it being out of date.
+ - "pip install --disable-pip-version-check --user --upgrade pip"
+
+ # Install the build dependencies of the project. If some dependencies contain
+ # compiled extensions and are not provided as pre-built wheel packages,
+ # pip will build them from source using the MSVC compiler matching the
+ # target Python version and architecture
+ # - "%CMD_IN_ENV% python -m pip install -r dev-requirements.txt"
+ - "pip install wheel"
+
+ # PCL Install
+ # - ps: Start-FileDownload "http://jaist.dl.sourceforge.net/project/pointclouds/1.6.0/PCL-1.6.0-AllInOne-msvc2010-win32.exe"
+ # - ps: Start-FileDownload "http://jaist.dl.sourceforge.net/project/pointclouds/1.6.0/PCL-1.6.0-AllInOne-msvc2010-win64.exe"
+ # - ps: Start-FileDownload "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51248&authkey=!AOPBX-WypndUncw&ithint=file%2cexe"
+ - ps : appveyor\install.ps1
+
+ # pkg-config Download?
+ # - ps: Start-FileDownload "http://win32builder.gnome.org/gtk+-bundle_3.10.4-20131202_win64.zip"
+ # - 7z x -y -o".\gtk" ./gtk+-bundle_3.10.4-20131202_win64.zip
+ # - xcopy .\gtk\bin .\pkg-config
+ - cd pkg-config
+ - ps : .\Install-GTKPlus.ps1
+ - cd ..
+
+ # Check OpenNI Install
+ # - dir "C:\Program Files" /x
+ # - dir "C:\Program Files (x86)" /x
+
+build_script:
+ - copy .\\appveyor\\bfgs.h "%PCL_ROOT%\include\pcl-%PCL_VERSION%\pcl\registration\bfgs.h"
+ - copy .\\appveyor\\eigen.h "%PCL_ROOT%\include\pcl-%PCL_VERSION%\pcl\registration\eigen.h"
+
+ - ls "%PCL_ROOT%\include\pcl-%PCL_VERSION%\pcl\registration"
+ - ls "%PCL_ROOT%\bin"
+ - ls "%PCL_ROOT%\3rdParty"
+ - ls "%PYTHON%"
+ - ls "%PYTHON%\DLLs"
+
+ - "%CMD_IN_ENV% pip install Cython==0.25.2"
+ - "%CMD_IN_ENV% pip install numpy"
+
+ - "%CMD_IN_ENV% python sys_path_check.py"
+ - "%CMD_IN_ENV% python setup.py build_ext -i"
+ - "%CMD_IN_ENV% python setup.py install"
+ - "%CMD_IN_ENV% python setup.py bdist_wheel"
+ - "%CMD_IN_ENV% python -m pip list"
+
+ - copy "%PCL_ROOT%\bin" .
+ - copy "%PCL_ROOT%\bin" "%PYTHON%"
+ - copy "%PCL_ROOT%\bin" "%PYTHON%\DLLs"
+ - copy "%PCL_ROOT%\bin" "%PYTHON%\Lib\site-packages"
+
+ - copy "%PCL_ROOT%\3rdParty\Boost\lib" .
+ - copy "%PCL_ROOT%\3rdParty\Boost\lib" "%PYTHON%"
+ - copy "%PCL_ROOT%\3rdParty\Boost\lib" "%PYTHON%\DLLs"
+ - copy "%PCL_ROOT%\3rdParty\Boost\lib" "%PYTHON%\Lib\site-packages"
+
+ - copy "%PCL_ROOT%\3rdParty\FLANN\bin" .
+ - copy "%PCL_ROOT%\3rdParty\FLANN\bin" "%PYTHON%"
+ - copy "%PCL_ROOT%\3rdParty\FLANN\bin" "%PYTHON%\DLLs"
+ - copy "%PCL_ROOT%\3rdParty\FLANN\bin" "%PYTHON%\Lib\site-packages"
+
+ - copy "%APPVEYOR_OPENNI_ROOT%" .
+ - copy "%APPVEYOR_OPENNI_ROOT%" "%PYTHON%"
+ - copy "%APPVEYOR_OPENNI_ROOT%" "%PYTHON%\DLLs"
+ - copy "%APPVEYOR_OPENNI_ROOT%" "%PYTHON%\Lib\site-packages"
+
+ # - copy "%UCRT_PATH%" .
+ # - copy "%UCRT_PATH%" "%PYTHON%"
+ # - copy "%UCRT_PATH%" "%PYTHON%\DLLs"
+ # - copy "%UCRT_PATH%" "%PYTHON%\Lib\site-packages"
+
+test_script:
+ # Run the project tests
+ # Path Check(NG)
+ # - pcd_viewer_release.exe
+ # Path Check(ErrorLog)
+ # - pcd_viewer_release2.exe
+ # - "%CMD_IN_ENV% python setup.py nosetests"
+ # - dir "%PYTHON%\Lib\site-packages\python_pcl-0.2-py3.4-win32.egg\*.pyd" /b /a-d /s
+ # - "%CMD_IN_ENV% python tests\\test.py"
+ - python sys_path_check.py
+ - python tests\test.py
+ # examples_command_160.txt
+ # Filtering
+ - python examples\official\Filtering\PassThroughFilter.py
+ - python examples\official\Filtering\project_inliers.py
+ - python examples\official\Filtering\remove_outliers.py -r Radius
+ # MemoryLeak?
+ - python examples\official\Filtering\remove_outliers.py -r Condition
+ - python examples\official\Filtering\VoxelGrid_160.py
+ - python examples\official\Filtering\statistical_removal.py
+ - python examples\official\IO\pcd_read.py
+ # KdTree
+ - python examples\official\kdtree\kdtree_search.py
+ # keypoints
+ # NG(RangeImage Link Error)
+ # - python examples\official\keypoints\narf_keypoint_extraction.py
+ # octree
+ # execute NG
+ # Exception ignored in: 'pcl._pcl.to_point_t'
+ # TypeError: a float is required
+ - python examples\official\octree\octree_search.py
+ - python examples\official\Segmentation\cluster_extraction.py
+ - python examples\official\Segmentation\cylinder_segmentation.py
+ - python examples\official\surface\concave_hull_2d.py
+ - python examples\official\surface\resampling.py
+
+
+#after_test:
+# # If tests are successful, create binary packages for the project.
+# # - "%CMD_IN_ENV% python setup.py bdist_wheel"
+# # - "%CMD_IN_ENV% python setup.py bdist_wininst"
+# # - "%CMD_IN_ENV% python setup.py bdist_msi"
+# # - ps: "ls dist"
+
+
+artifacts:
+# Archive the generated packages in the ci.appveyor.com build report.
+ - path: dist\*
+ - path: pcl\*.pyd
+
+#on_success:
+# - TODO: upload the content of dist/*.whl to a public wheelhouse
+
diff --git a/appveyor/OpenNI/Win32/Bin/OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/OpenNI.Net.dll
new file mode 100644
index 000000000..ce10ab6a4
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/OpenNI.dll b/appveyor/OpenNI/Win32/Bin/OpenNI.dll
new file mode 100644
index 000000000..4334fba45
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/OpenNI.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/OpenNI.jni.dll b/appveyor/OpenNI/Win32/Bin/OpenNI.jni.dll
new file mode 100644
index 000000000..01d9bf6a8
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/OpenNI.jni.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/OpenNIFilter.dll b/appveyor/OpenNI/Win32/Bin/OpenNIFilter.dll
new file mode 100644
index 000000000..1a47c301c
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/OpenNIFilter.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/Policy.1.1.OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/Policy.1.1.OpenNI.Net.dll
new file mode 100644
index 000000000..01f3ab9ff
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/Policy.1.1.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/Policy.1.2.OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/Policy.1.2.OpenNI.Net.dll
new file mode 100644
index 000000000..d730e2149
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/Policy.1.2.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/Policy.1.3.OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/Policy.1.3.OpenNI.Net.dll
new file mode 100644
index 000000000..1cdc9b634
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/Policy.1.3.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/Policy.1.4.OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/Policy.1.4.OpenNI.Net.dll
new file mode 100644
index 000000000..618df4ebc
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/Policy.1.4.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/Policy.1.5.OpenNI.Net.dll b/appveyor/OpenNI/Win32/Bin/Policy.1.5.OpenNI.Net.dll
new file mode 100644
index 000000000..09cc5be98
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/Policy.1.5.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.1.config b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.1.config
new file mode 100644
index 000000000..3299d8a7f
--- /dev/null
+++ b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.1.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.2.config b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.2.config
new file mode 100644
index 000000000..3299d8a7f
--- /dev/null
+++ b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.2.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.3.config b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.3.config
new file mode 100644
index 000000000..3299d8a7f
--- /dev/null
+++ b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.3.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.4.config b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.4.config
new file mode 100644
index 000000000..3299d8a7f
--- /dev/null
+++ b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.4.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.5.config b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.5.config
new file mode 100644
index 000000000..3299d8a7f
--- /dev/null
+++ b/appveyor/OpenNI/Win32/Bin/PublisherPolicy1.5.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/Win32/Bin/niLicense.exe b/appveyor/OpenNI/Win32/Bin/niLicense.exe
new file mode 100644
index 000000000..09d8409c4
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/niLicense.exe differ
diff --git a/appveyor/OpenNI/Win32/Bin/niReg.exe b/appveyor/OpenNI/Win32/Bin/niReg.exe
new file mode 100644
index 000000000..40e550890
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/niReg.exe differ
diff --git a/appveyor/OpenNI/Win32/Bin/nimCodecs.dll b/appveyor/OpenNI/Win32/Bin/nimCodecs.dll
new file mode 100644
index 000000000..114f23d00
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/nimCodecs.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/nimMockNodes.dll b/appveyor/OpenNI/Win32/Bin/nimMockNodes.dll
new file mode 100644
index 000000000..1a1305f7b
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/nimMockNodes.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/nimRecorder.dll b/appveyor/OpenNI/Win32/Bin/nimRecorder.dll
new file mode 100644
index 000000000..0839ea3de
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/nimRecorder.dll differ
diff --git a/appveyor/OpenNI/Win32/Bin/org.OpenNI.jar b/appveyor/OpenNI/Win32/Bin/org.OpenNI.jar
new file mode 100644
index 000000000..4a1dadc04
Binary files /dev/null and b/appveyor/OpenNI/Win32/Bin/org.OpenNI.jar differ
diff --git a/appveyor/OpenNI/x64/Bin64/OpenNI.Net.dll b/appveyor/OpenNI/x64/Bin64/OpenNI.Net.dll
new file mode 100644
index 000000000..6c2add7b6
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/OpenNI.jni64.dll b/appveyor/OpenNI/x64/Bin64/OpenNI.jni64.dll
new file mode 100644
index 000000000..ded8f9e16
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/OpenNI.jni64.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/OpenNI64.dll b/appveyor/OpenNI/x64/Bin64/OpenNI64.dll
new file mode 100644
index 000000000..5e0017ae1
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/OpenNI64.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/Policy.1.1.OpenNI.Net.dll b/appveyor/OpenNI/x64/Bin64/Policy.1.1.OpenNI.Net.dll
new file mode 100644
index 000000000..a86a82b80
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/Policy.1.1.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/Policy.1.2.OpenNI.Net.dll b/appveyor/OpenNI/x64/Bin64/Policy.1.2.OpenNI.Net.dll
new file mode 100644
index 000000000..0815f45db
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/Policy.1.2.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/Policy.1.3.OpenNI.Net.dll b/appveyor/OpenNI/x64/Bin64/Policy.1.3.OpenNI.Net.dll
new file mode 100644
index 000000000..97695d30a
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/Policy.1.3.OpenNI.Net.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.1.config b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.1.config
new file mode 100644
index 000000000..2ec8a8c32
--- /dev/null
+++ b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.1.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.2.config b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.2.config
new file mode 100644
index 000000000..2ec8a8c32
--- /dev/null
+++ b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.2.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.3.config b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.3.config
new file mode 100644
index 000000000..2ec8a8c32
--- /dev/null
+++ b/appveyor/OpenNI/x64/Bin64/PublisherPolicy1.3.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/appveyor/OpenNI/x64/Bin64/niLicense64.exe b/appveyor/OpenNI/x64/Bin64/niLicense64.exe
new file mode 100644
index 000000000..e4655861f
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/niLicense64.exe differ
diff --git a/appveyor/OpenNI/x64/Bin64/niReg64.exe b/appveyor/OpenNI/x64/Bin64/niReg64.exe
new file mode 100644
index 000000000..fe3809b5d
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/niReg64.exe differ
diff --git a/appveyor/OpenNI/x64/Bin64/nimCodecs64.dll b/appveyor/OpenNI/x64/Bin64/nimCodecs64.dll
new file mode 100644
index 000000000..3d447a3a0
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/nimCodecs64.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/nimMockNodes64.dll b/appveyor/OpenNI/x64/Bin64/nimMockNodes64.dll
new file mode 100644
index 000000000..c9a1c4be0
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/nimMockNodes64.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/nimRecorder64.dll b/appveyor/OpenNI/x64/Bin64/nimRecorder64.dll
new file mode 100644
index 000000000..494363acf
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/nimRecorder64.dll differ
diff --git a/appveyor/OpenNI/x64/Bin64/org.OpenNI.jar b/appveyor/OpenNI/x64/Bin64/org.OpenNI.jar
new file mode 100644
index 000000000..e494f0c56
Binary files /dev/null and b/appveyor/OpenNI/x64/Bin64/org.OpenNI.jar differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI.ini b/appveyor/OpenNI2/Win32/Redist/OpenNI.ini
new file mode 100644
index 000000000..a443fcb87
--- /dev/null
+++ b/appveyor/OpenNI2/Win32/Redist/OpenNI.ini
@@ -0,0 +1,8 @@
+[Log]
+; 0 - Verbose; 1 - Info; 2 - Warning; 3 - Error. Default - None
+Verbosity=3
+LogToConsole=0
+LogToFile=0
+
+[Device]
+;Override=""
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2.dll b/appveyor/OpenNI2/Win32/Redist/OpenNI2.dll
new file mode 100644
index 000000000..32684b357
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2.dll differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2.pdb b/appveyor/OpenNI2/Win32/Redist/OpenNI2.pdb
new file mode 100644
index 000000000..4fd01ff19
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2.pdb differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.dll b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.dll
new file mode 100644
index 000000000..6127d1e1a
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.dll differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.pdb b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.pdb
new file mode 100644
index 000000000..c7c37a87f
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/Kinect.pdb differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.dll b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.dll
new file mode 100644
index 000000000..26377bef5
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.dll differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.pdb b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.pdb
new file mode 100644
index 000000000..8c0574e13
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/OniFile.pdb differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.dll b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.dll
new file mode 100644
index 000000000..225a3a8fc
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.dll differ
diff --git a/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.pdb b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.pdb
new file mode 100644
index 000000000..14ac3870a
Binary files /dev/null and b/appveyor/OpenNI2/Win32/Redist/OpenNI2/Drivers/PS1080.pdb differ
diff --git a/appveyor/OpenNI2/Win32/Redist/PS1080.ini b/appveyor/OpenNI2/Win32/Redist/PS1080.ini
new file mode 100644
index 000000000..737c41dee
--- /dev/null
+++ b/appveyor/OpenNI2/Win32/Redist/PS1080.ini
@@ -0,0 +1,158 @@
+;---------------- Sensor Default Configuration -------------------
+[Device]
+; Mirroring. 0 - Off (default), 1 - On
+;Mirror=1
+
+; FrameSync. 0 - Off (default), 1 - On
+;FrameSync=1
+
+; Stream Data Timestamps. 0 - milliseconds, 1 - microseconds (default)
+;HighResTimestamps=1
+
+; Stream Data Timestamps Source. 0 - Firmware (default), 1 - Host
+;HostTimestamps=0
+
+; A filter for the firmware log. Default is determined by firmware.
+;FirmwareLogFilter=0
+
+; Automatic firmare log retrieval. 0 - Off (default), or the number of milliseconds between log retrievals operations.
+;FirmwareLogInterval=1000
+
+; Print firmware log to console when automatic firmware log retrieval is on. 0 - Off (default), 1 - On
+;FirmwareLogPrint=1
+
+; Is APC enabled. 0 - Off, 1 - On (default)
+;APCEnabled=1
+
+; USB interface to be used. 0 - FW Default, 1 - ISO endpoints (default on Windows), 2 - BULK endpoints (default on Linux/Mac/Android machines)
+;UsbInterface=2
+
+[Depth]
+; Output format. 100 - 1mm depth values (default), 102 - u9.2 Shift values.
+;OutputFormat=102
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA, 1 - VGA, 4 - QQVGA. Default: Arm - 4, other platforms - 0
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Min depth cutoff. 0-10000 mm (default is 0)
+;MinDepthValue=0
+
+; Max depth cutoff. 0-10000 mm (default is 10000)
+;MaxDepthValue=10000
+
+; Input format. 0 - Uncompressed 16-bit, 1 - PS Compression, 3 - Packed 11-bit, 4 - Packed 12-bit. Default: Arm - 4, other platforms - 3
+;InputFormat=1
+
+; Registration. 0 - Off (default), 1 - On
+;Registration=1
+
+; Registration Type. 0 - Don't care (default), 1 - use hardware accelaration, 2 - perform in software
+;RegistrationType=0
+
+; Hole Filler. 0 - Off, 1 - On (default)
+;HoleFilter=1
+
+; White Balance. 0 - Off, 1 - On (default)
+;WhiteBalancedEnabled=1
+
+; Gain. 0-50 (0 - Auto, 1 - Min., 50 - Max.). Default value is set by firmware.
+;Gain=0
+
+; Close Range Mode. 0 - Off (default), 1 - On
+;CloseRange=0
+
+; GMC Mode. 0 - Off, 1 - On (default)
+;GMCMode=0
+
+; GMC Debug. 0 - Off (default), 1 - On
+;GMCDebug=1
+
+; Depth Auto Gain Region-of-Interest. Default values are set by firmware.
+;DepthAGCBin0MinDepth=500
+;DepthAGCBin0MaxDepth=800
+;DepthAGCBin1MinDepth=1500
+;DepthAGCBin1MaxDepth=1800
+;DepthAGCBin2MinDepth=2500
+;DepthAGCBin2MaxDepth=2800
+;DepthAGCBin3MinDepth=3500
+;DepthAGCBin3MaxDepth=3800
+
+; Wavelength Correction Mechanism. 0 - Off (default), 1 - On
+;WavelengthCorrection=1
+
+; Wavelength Correction debug info. 0 - Off (default), 1 - On
+;WavelengthCorrectionDebug=1
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[Depth.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
+
+[Image]
+; Output format. 200 - RGB888 (default), 201 - YUV422, 202 - Gray8 (2.0 MP only)
+;OutputFormat=200
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA (default), 1 - VGA, 2 - SXGA (1.3MP), 3 - UXGA (2.0MP), 14 - 720p, 15 - 1280x960
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Input format. 0 - BAYER (1.3MP or 2.0MP only), 1 - Compressed YUV422 (default in BULK), 2 - Jpeg, 5 - Uncompressed YUV422 (default in ISO), 6 - Uncompressed 8-bit BAYER
+;InputFormat=5
+
+; Anti Flicker. 0 - Off (default), 50 - 50Hz, 60 - 60 Hz.
+;Flicker=50
+
+; Image quality when using Jpeg. 1-10 (1 - Lowest, 10 - Highest (default))
+;Quality=10
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[Image.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
+
+[IR]
+; Output format. 200 - RGB888 (default), 203 - Grayscale 16-bit
+;OutputFormat=203
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA (default), 1 - VGA, 2 - SXGA(1.3MP)
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[IR.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI.ini b/appveyor/OpenNI2/x64/Redist/OpenNI.ini
new file mode 100644
index 000000000..a443fcb87
--- /dev/null
+++ b/appveyor/OpenNI2/x64/Redist/OpenNI.ini
@@ -0,0 +1,8 @@
+[Log]
+; 0 - Verbose; 1 - Info; 2 - Warning; 3 - Error. Default - None
+Verbosity=3
+LogToConsole=0
+LogToFile=0
+
+[Device]
+;Override=""
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2.dll b/appveyor/OpenNI2/x64/Redist/OpenNI2.dll
new file mode 100644
index 000000000..ad4aadd5a
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2.dll differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2.pdb b/appveyor/OpenNI2/x64/Redist/OpenNI2.pdb
new file mode 100644
index 000000000..9d5bc81d1
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2.pdb differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.dll b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.dll
new file mode 100644
index 000000000..cc6c14f25
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.dll differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.pdb b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.pdb
new file mode 100644
index 000000000..0e41e38e7
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/Kinect.pdb differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.dll b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.dll
new file mode 100644
index 000000000..696a1399b
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.dll differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.pdb b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.pdb
new file mode 100644
index 000000000..0a87467d1
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/OniFile.pdb differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.dll b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.dll
new file mode 100644
index 000000000..d3094e987
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.dll differ
diff --git a/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.pdb b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.pdb
new file mode 100644
index 000000000..16251587d
Binary files /dev/null and b/appveyor/OpenNI2/x64/Redist/OpenNI2/Drivers/PS1080.pdb differ
diff --git a/appveyor/OpenNI2/x64/Redist/PS1080.ini b/appveyor/OpenNI2/x64/Redist/PS1080.ini
new file mode 100644
index 000000000..737c41dee
--- /dev/null
+++ b/appveyor/OpenNI2/x64/Redist/PS1080.ini
@@ -0,0 +1,158 @@
+;---------------- Sensor Default Configuration -------------------
+[Device]
+; Mirroring. 0 - Off (default), 1 - On
+;Mirror=1
+
+; FrameSync. 0 - Off (default), 1 - On
+;FrameSync=1
+
+; Stream Data Timestamps. 0 - milliseconds, 1 - microseconds (default)
+;HighResTimestamps=1
+
+; Stream Data Timestamps Source. 0 - Firmware (default), 1 - Host
+;HostTimestamps=0
+
+; A filter for the firmware log. Default is determined by firmware.
+;FirmwareLogFilter=0
+
+; Automatic firmare log retrieval. 0 - Off (default), or the number of milliseconds between log retrievals operations.
+;FirmwareLogInterval=1000
+
+; Print firmware log to console when automatic firmware log retrieval is on. 0 - Off (default), 1 - On
+;FirmwareLogPrint=1
+
+; Is APC enabled. 0 - Off, 1 - On (default)
+;APCEnabled=1
+
+; USB interface to be used. 0 - FW Default, 1 - ISO endpoints (default on Windows), 2 - BULK endpoints (default on Linux/Mac/Android machines)
+;UsbInterface=2
+
+[Depth]
+; Output format. 100 - 1mm depth values (default), 102 - u9.2 Shift values.
+;OutputFormat=102
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA, 1 - VGA, 4 - QQVGA. Default: Arm - 4, other platforms - 0
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Min depth cutoff. 0-10000 mm (default is 0)
+;MinDepthValue=0
+
+; Max depth cutoff. 0-10000 mm (default is 10000)
+;MaxDepthValue=10000
+
+; Input format. 0 - Uncompressed 16-bit, 1 - PS Compression, 3 - Packed 11-bit, 4 - Packed 12-bit. Default: Arm - 4, other platforms - 3
+;InputFormat=1
+
+; Registration. 0 - Off (default), 1 - On
+;Registration=1
+
+; Registration Type. 0 - Don't care (default), 1 - use hardware accelaration, 2 - perform in software
+;RegistrationType=0
+
+; Hole Filler. 0 - Off, 1 - On (default)
+;HoleFilter=1
+
+; White Balance. 0 - Off, 1 - On (default)
+;WhiteBalancedEnabled=1
+
+; Gain. 0-50 (0 - Auto, 1 - Min., 50 - Max.). Default value is set by firmware.
+;Gain=0
+
+; Close Range Mode. 0 - Off (default), 1 - On
+;CloseRange=0
+
+; GMC Mode. 0 - Off, 1 - On (default)
+;GMCMode=0
+
+; GMC Debug. 0 - Off (default), 1 - On
+;GMCDebug=1
+
+; Depth Auto Gain Region-of-Interest. Default values are set by firmware.
+;DepthAGCBin0MinDepth=500
+;DepthAGCBin0MaxDepth=800
+;DepthAGCBin1MinDepth=1500
+;DepthAGCBin1MaxDepth=1800
+;DepthAGCBin2MinDepth=2500
+;DepthAGCBin2MaxDepth=2800
+;DepthAGCBin3MinDepth=3500
+;DepthAGCBin3MaxDepth=3800
+
+; Wavelength Correction Mechanism. 0 - Off (default), 1 - On
+;WavelengthCorrection=1
+
+; Wavelength Correction debug info. 0 - Off (default), 1 - On
+;WavelengthCorrectionDebug=1
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[Depth.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
+
+[Image]
+; Output format. 200 - RGB888 (default), 201 - YUV422, 202 - Gray8 (2.0 MP only)
+;OutputFormat=200
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA (default), 1 - VGA, 2 - SXGA (1.3MP), 3 - UXGA (2.0MP), 14 - 720p, 15 - 1280x960
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Input format. 0 - BAYER (1.3MP or 2.0MP only), 1 - Compressed YUV422 (default in BULK), 2 - Jpeg, 5 - Uncompressed YUV422 (default in ISO), 6 - Uncompressed 8-bit BAYER
+;InputFormat=5
+
+; Anti Flicker. 0 - Off (default), 50 - 50Hz, 60 - 60 Hz.
+;Flicker=50
+
+; Image quality when using Jpeg. 1-10 (1 - Lowest, 10 - Highest (default))
+;Quality=10
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[Image.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
+
+[IR]
+; Output format. 200 - RGB888 (default), 203 - Grayscale 16-bit
+;OutputFormat=203
+
+; Is stream mirrored. 0 - Off, 1 - On
+;Mirror=1
+
+; 0 - QVGA (default), 1 - VGA, 2 - SXGA(1.3MP)
+;Resolution=1
+
+; Frames per second (default is 30)
+;FPS=30
+
+; Cropping mode. 1 - Normal (default), 2 - Increased FPS, 3 - Software only
+;CroppingMode=1
+
+; Cropping area
+[IR.Cropping]
+;OffsetX=0
+;OffsetY=0
+;SizeX=320
+;SizeY=240
+;Enabled=1
diff --git a/appveyor/bfgs.h b/appveyor/bfgs.h
new file mode 100644
index 000000000..99f8482f2
--- /dev/null
+++ b/appveyor/bfgs.h
@@ -0,0 +1,618 @@
+#ifndef PCL_FOR_EIGEN_BFGS_H
+#define PCL_FOR_EIGEN_BFGS_H
+
+#if defined __GNUC__
+# pragma GCC system_header
+#endif
+
+#include
+
+namespace Eigen
+{
+ template< typename _Scalar >
+ class PolynomialSolver<_Scalar,2> : public PolynomialSolverBase<_Scalar,2>
+ {
+ public:
+ typedef PolynomialSolverBase<_Scalar,2> PS_Base;
+ EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
+
+ public:
+
+ virtual ~PolynomialSolver () {}
+
+ template< typename OtherPolynomial >
+ inline PolynomialSolver( const OtherPolynomial& poly, bool& hasRealRoot )
+ {
+ compute( poly, hasRealRoot );
+ }
+
+ /** Computes the complex roots of a new polynomial. */
+ template< typename OtherPolynomial >
+ void compute( const OtherPolynomial& poly, bool& hasRealRoot)
+ {
+ const Scalar ZERO(0);
+ Scalar a2(2 * poly[2]);
+ assert( ZERO != poly[poly.size()-1] );
+ Scalar discriminant ((poly[1] * poly[1]) - (4 * poly[0] * poly[2]));
+ if (ZERO < discriminant)
+ {
+ Scalar discriminant_root (std::sqrt (discriminant));
+ m_roots[0] = (-poly[1] - discriminant_root) / (a2) ;
+ m_roots[1] = (-poly[1] + discriminant_root) / (a2) ;
+ hasRealRoot = true;
+ }
+ else {
+ if (ZERO == discriminant)
+ {
+ m_roots.resize (1);
+ m_roots[0] = -poly[1] / a2;
+ hasRealRoot = true;
+ }
+ else
+ {
+ Scalar discriminant_root (std::sqrt (-discriminant));
+ m_roots[0] = RootType (-poly[1] / a2, -discriminant_root / a2);
+ m_roots[1] = RootType (-poly[1] / a2, discriminant_root / a2);
+ hasRealRoot = false;
+ }
+ }
+ }
+
+ template< typename OtherPolynomial >
+ void compute( const OtherPolynomial& poly)
+ {
+ bool hasRealRoot;
+ compute(poly, hasRealRoot);
+ }
+
+ protected:
+ using PS_Base::m_roots;
+ };
+}
+
+template
+struct BFGSDummyFunctor
+{
+ typedef _Scalar Scalar;
+ enum { InputsAtCompileTime = NX };
+ typedef Eigen::Matrix VectorType;
+
+ const int m_inputs;
+
+ BFGSDummyFunctor() : m_inputs(InputsAtCompileTime) {}
+ BFGSDummyFunctor(int inputs) : m_inputs(inputs) {}
+
+ virtual ~BFGSDummyFunctor() {}
+ int inputs() const { return m_inputs; }
+
+ virtual double operator() (const VectorType &x) = 0;
+ virtual void df(const VectorType &x, VectorType &df) = 0;
+ virtual void fdf(const VectorType &x, Scalar &f, VectorType &df) = 0;
+};
+
+namespace BFGSSpace {
+ enum Status {
+ NegativeGradientEpsilon = -3,
+ NotStarted = -2,
+ Running = -1,
+ Success = 0,
+ NoProgress = 1
+ };
+}
+
+/**
+ * BFGS stands for Broyden–Fletcher–Goldfarb–Shanno (BFGS) method for solving
+ * unconstrained nonlinear optimization problems.
+ * For further details please visit: http://en.wikipedia.org/wiki/BFGS_method
+ * The method provided here is almost similar to the one provided by GSL.
+ * It reproduces Fletcher's original algorithm in Practical Methods of Optimization
+ * algorithms : 2.6.2 and 2.6.4 and uses the same politics in GSL with cubic
+ * interpolation whenever it is possible else falls to quadratic interpolation for
+ * alpha parameter.
+ */
+template
+class BFGS
+{
+public:
+ typedef typename FunctorType::Scalar Scalar;
+ typedef typename FunctorType::VectorType FVectorType;
+
+ BFGS(FunctorType &_functor)
+ : pnorm(0), g0norm(0), iter(-1), functor(_functor) { }
+
+ typedef Eigen::DenseIndex Index;
+
+ struct Parameters {
+ Parameters()
+ : max_iters(400)
+ , bracket_iters(100)
+ , section_iters(100)
+ , rho(0.01)
+ , sigma(0.01)
+ , tau1(9)
+ , tau2(0.05)
+ , tau3(0.5)
+ , step_size(1)
+ , order(3) {}
+ Index max_iters; // maximum number of function evaluation
+ Index bracket_iters;
+ Index section_iters;
+ Scalar rho;
+ Scalar sigma;
+ Scalar tau1;
+ Scalar tau2;
+ Scalar tau3;
+ Scalar step_size;
+ Index order;
+ };
+
+ BFGSSpace::Status minimize(FVectorType &x);
+ BFGSSpace::Status minimizeInit(FVectorType &x);
+ BFGSSpace::Status minimizeOneStep(FVectorType &x);
+ BFGSSpace::Status testGradient(Scalar epsilon);
+ void resetParameters(void) { parameters = Parameters(); }
+
+ Parameters parameters;
+ Scalar f;
+ FVectorType gradient;
+private:
+
+ BFGS& operator=(const BFGS&);
+ BFGSSpace::Status lineSearch (Scalar rho, Scalar sigma,
+ Scalar tau1, Scalar tau2, Scalar tau3,
+ int order, Scalar alpha1, Scalar &alpha_new);
+ Scalar interpolate (Scalar a, Scalar fa, Scalar fpa,
+ Scalar b, Scalar fb, Scalar fpb, Scalar xmin, Scalar xmax,
+ int order);
+ void checkExtremum (const Eigen::Matrix& coefficients, Scalar x, Scalar& xmin, Scalar& fmin);
+ void moveTo (Scalar alpha);
+ Scalar slope ();
+ Scalar applyF (Scalar alpha);
+ Scalar applyDF (Scalar alpha);
+ void applyFDF (Scalar alpha, Scalar &f, Scalar &df);
+ void updatePosition (Scalar alpha, FVectorType& x, Scalar& f, FVectorType& g);
+ void changeDirection ();
+
+ Scalar delta_f, fp0;
+ FVectorType x0, dx0, dg0, g0, dx, p;
+ Scalar pnorm, g0norm;
+
+ Scalar f_alpha;
+ Scalar df_alpha;
+ FVectorType x_alpha;
+ FVectorType g_alpha;
+
+ // cache "keys"
+ Scalar f_cache_key;
+ Scalar df_cache_key;
+ Scalar x_cache_key;
+ Scalar g_cache_key;
+
+ Index iter;
+ FunctorType &functor;
+};
+
+
+template void
+BFGS::checkExtremum(const Eigen::Matrix& coefficients, Scalar x, Scalar& xmin, Scalar& fmin)
+{
+ Scalar y = Eigen::poly_eval(coefficients, x);
+ if(y < fmin) { xmin = x; fmin = y; }
+}
+
+template void
+BFGS::moveTo(Scalar alpha)
+{
+ x_alpha = x0 + alpha * p;
+ x_cache_key = alpha;
+}
+
+template typename BFGS::Scalar
+BFGS::slope()
+{
+ return (g_alpha.dot (p));
+}
+
+template typename BFGS::Scalar
+BFGS::applyF(Scalar alpha)
+{
+ if (alpha == f_cache_key) return f_alpha;
+ moveTo (alpha);
+ f_alpha = functor (x_alpha);
+ f_cache_key = alpha;
+ return (f_alpha);
+}
+
+template typename BFGS::Scalar
+BFGS::applyDF(Scalar alpha)
+{
+ if (alpha == df_cache_key) return df_alpha;
+ moveTo (alpha);
+ if(alpha != g_cache_key)
+ {
+ functor.df (x_alpha, g_alpha);
+ g_cache_key = alpha;
+ }
+ df_alpha = slope ();
+ df_cache_key = alpha;
+ return (df_alpha);
+}
+
+template void
+BFGS::applyFDF(Scalar alpha, Scalar& f, Scalar& df)
+{
+ if(alpha == f_cache_key && alpha == df_cache_key)
+ {
+ f = f_alpha;
+ df = df_alpha;
+ return;
+ }
+
+ if(alpha == f_cache_key || alpha == df_cache_key)
+ {
+ f = applyF (alpha);
+ df = applyDF (alpha);
+ return;
+ }
+
+ moveTo (alpha);
+ functor.fdf (x_alpha, f_alpha, g_alpha);
+ f_cache_key = alpha;
+ g_cache_key = alpha;
+ df_alpha = slope ();
+ df_cache_key = alpha;
+ f = f_alpha;
+ df = df_alpha;
+}
+
+template void
+BFGS::updatePosition (Scalar alpha, FVectorType &x, Scalar &f, FVectorType &g)
+{
+ {
+ Scalar f_alpha, df_alpha;
+ applyFDF (alpha, f_alpha, df_alpha);
+ } ;
+
+ f = f_alpha;
+ x = x_alpha;
+ g = g_alpha;
+}
+
+template void
+BFGS::changeDirection ()
+{
+ x_alpha = x0;
+ x_cache_key = 0.0;
+ f_cache_key = 0.0;
+ g_alpha = g0;
+ g_cache_key = 0.0;
+ df_alpha = slope ();
+ df_cache_key = 0.0;
+}
+
+template BFGSSpace::Status
+BFGS::minimize(FVectorType &x)
+{
+ BFGSSpace::Status status = minimizeInit(x);
+ do {
+ status = minimizeOneStep(x);
+ iter++;
+ } while (status==BFGSSpace::Success && iter < parameters.max_iters);
+ return status;
+}
+
+template BFGSSpace::Status
+BFGS::minimizeInit(FVectorType &x)
+{
+ iter = 0;
+ delta_f = 0;
+ dx.setZero ();
+ functor.fdf(x, f, gradient);
+ x0 = x;
+ g0 = gradient;
+ g0norm = g0.norm ();
+ p = gradient * -1/g0norm;
+ pnorm = p.norm ();
+ fp0 = -g0norm;
+
+ {
+ x_alpha = x0; x_cache_key = 0;
+
+ f_alpha = f; f_cache_key = 0;
+
+ g_alpha = g0; g_cache_key = 0;
+
+ df_alpha = slope (); df_cache_key = 0;
+ }
+
+ return BFGSSpace::NotStarted;
+}
+
+template BFGSSpace::Status
+BFGS::minimizeOneStep(FVectorType &x)
+{
+ Scalar alpha = 0.0, alpha1;
+ Scalar f0 = f;
+ if (pnorm == 0.0 || g0norm == 0.0 || fp0 == 0)
+ {
+ dx.setZero ();
+ return BFGSSpace::NoProgress;
+ }
+
+ if (delta_f < 0)
+ {
+ Scalar del = std::max (-delta_f, 10 * std::numeric_limits::epsilon() * fabs(f0));
+ alpha1 = std::min (1.0, 2.0 * del / (-fp0));
+ }
+ else
+ alpha1 = fabs(parameters.step_size);
+
+ BFGSSpace::Status status = lineSearch(parameters.rho, parameters.sigma,
+ parameters.tau1, parameters.tau2, parameters.tau3,
+ parameters.order, alpha1, alpha);
+
+ if(status != BFGSSpace::Success)
+ return status;
+
+ updatePosition(alpha, x, f, gradient);
+
+ delta_f = f - f0;
+
+ /* Choose a new direction for the next step */
+ {
+ /* This is the BFGS update: */
+ /* p' = g1 - A dx - B dg */
+ /* A = - (1+ dg.dg/dx.dg) B + dg.g/dx.dg */
+ /* B = dx.g/dx.dg */
+
+ Scalar dxg, dgg, dxdg, dgnorm, A, B;
+
+ /* dx0 = x - x0 */
+ dx0 = x - x0;
+ dx = dx0; /* keep a copy */
+
+ /* dg0 = g - g0 */
+ dg0 = gradient - g0;
+ dxg = dx0.dot (gradient);
+ dgg = dg0.dot (gradient);
+ dxdg = dx0.dot (dg0);
+ dgnorm = dg0.norm ();
+
+ if (dxdg != 0)
+ {
+ B = dxg / dxdg;
+ A = -(1.0 + dgnorm * dgnorm / dxdg) * B + dgg / dxdg;
+ }
+ else
+ {
+ B = 0;
+ A = 0;
+ }
+
+ p = -A * dx0;
+ p+= gradient;
+ p+= -B * dg0 ;
+ }
+
+ g0 = gradient;
+ x0 = x;
+ g0norm = g0.norm ();
+ pnorm = p.norm ();
+
+ Scalar dir = ((p.dot (gradient)) > 0) ? -1.0 : 1.0;
+ p*= dir / pnorm;
+ pnorm = p.norm ();
+ fp0 = p.dot (g0);
+
+ changeDirection();
+ return BFGSSpace::Success;
+}
+
+template typename BFGSSpace::Status
+BFGS::testGradient(Scalar epsilon)
+{
+ if(epsilon < 0)
+ return BFGSSpace::NegativeGradientEpsilon;
+ else
+ {
+ if(gradient.norm () < epsilon)
+ return BFGSSpace::Success;
+ else
+ return BFGSSpace::Running;
+ }
+}
+
+template typename BFGS::Scalar
+BFGS::interpolate (Scalar a, Scalar fa, Scalar fpa,
+ Scalar b, Scalar fb, Scalar fpb,
+ Scalar xmin, Scalar xmax,
+ int order)
+{
+ /* Map [a,b] to [0,1] */
+ Scalar y, alpha, ymin, ymax, fmin;
+
+ ymin = (xmin - a) / (b - a);
+ ymax = (xmax - a) / (b - a);
+
+ // Ensure ymin <= ymax
+ if (ymin > ymax) { Scalar tmp = ymin; ymin = ymax; ymax = tmp; };
+
+ if (order > 2 && !(fpb != fpb) && fpb != std::numeric_limits::infinity ())
+ {
+ fpa = fpa * (b - a);
+ fpb = fpb * (b - a);
+
+ Scalar eta = 3 * (fb - fa) - 2 * fpa - fpb;
+ Scalar xi = fpa + fpb - 2 * (fb - fa);
+ Scalar c0 = fa, c1 = fpa, c2 = eta, c3 = xi;
+ Scalar y0, y1;
+ Eigen::Matrix coefficients;
+ coefficients << c0, c1, c2, c3;
+
+ y = ymin;
+ // Evaluate the cubic polyinomial at ymin;
+ fmin = Eigen::poly_eval (coefficients, ymin);
+ checkExtremum (coefficients, ymax, y, fmin);
+ {
+ // Solve quadratic polynomial for the derivate
+ Eigen::Matrix coefficients2;
+ coefficients2 << c1, 2 * c2, 3 * c3;
+ bool real_roots;
+ Eigen::PolynomialSolver solver (coefficients2, real_roots);
+ if(real_roots)
+ {
+ if ((solver.roots ()).size () == 2) /* found 2 roots */
+ {
+ y0 = std::real (solver.roots () [0]);
+ y1 = std::real (solver.roots () [1]);
+ if(y0 > y1) { Scalar tmp (y0); y0 = y1; y1 = tmp; }
+ if (y0 > ymin && y0 < ymax)
+ checkExtremum (coefficients, y0, y, fmin);
+ if (y1 > ymin && y1 < ymax)
+ checkExtremum (coefficients, y1, y, fmin);
+ }
+ else if ((solver.roots ()).size () == 1) /* found 1 root */
+ {
+ y0 = std::real (solver.roots () [0]);
+ if (y0 > ymin && y0 < ymax)
+ checkExtremum (coefficients, y0, y, fmin);
+ }
+ }
+ }
+ }
+ else
+ {
+ fpa = fpa * (b - a);
+ Scalar fl = fa + ymin*(fpa + ymin*(fb - fa -fpa));
+ Scalar fh = fa + ymax*(fpa + ymax*(fb - fa -fpa));
+ Scalar c = 2 * (fb - fa - fpa); /* curvature */
+ y = ymin; fmin = fl;
+
+ if (fh < fmin) { y = ymax; fmin = fh; }
+
+ if (c > a) /* positive curvature required for a minimum */
+ {
+ Scalar z = -fpa / c; /* location of minimum */
+ if (z > ymin && z < ymax) {
+ Scalar f = fa + z*(fpa + z*(fb - fa -fpa));
+ if (f < fmin) { y = z; fmin = f; };
+ }
+ }
+ }
+
+ alpha = a + y * (b - a);
+ return alpha;
+}
+
+template BFGSSpace::Status
+BFGS::lineSearch(Scalar rho, Scalar sigma,
+ Scalar tau1, Scalar tau2, Scalar tau3,
+ int order, Scalar alpha1, Scalar &alpha_new)
+{
+ Scalar f0, fp0, falpha, falpha_prev, fpalpha, fpalpha_prev, delta, alpha_next;
+ Scalar alpha = alpha1, alpha_prev = 0.0;
+ Scalar a, b, fa, fb, fpa, fpb;
+ Index i = 0;
+
+ applyFDF (0.0, f0, fp0);
+
+ falpha_prev = f0;
+ fpalpha_prev = fp0;
+
+ /* Avoid uninitialized variables morning */
+ a = 0.0; b = alpha;
+ fa = f0; fb = 0.0;
+ fpa = fp0; fpb = 0.0;
+
+ /* Begin bracketing */
+
+ while (i++ < parameters.bracket_iters)
+ {
+ falpha = applyF (alpha);
+
+ if (falpha > f0 + alpha * rho * fp0 || falpha >= falpha_prev)
+ {
+ a = alpha_prev; fa = falpha_prev; fpa = fpalpha_prev;
+ b = alpha; fb = falpha; fpb = std::numeric_limits::quiet_NaN ();
+ break;
+ }
+
+ fpalpha = applyDF (alpha);
+
+ /* Fletcher's sigma test */
+ if (fabs (fpalpha) <= -sigma * fp0)
+ {
+ alpha_new = alpha;
+ return BFGSSpace::Success;
+ }
+
+ if (fpalpha >= 0)
+ {
+ a = alpha; fa = falpha; fpa = fpalpha;
+ b = alpha_prev; fb = falpha_prev; fpb = fpalpha_prev;
+ break; /* goto sectioning */
+ }
+
+ delta = alpha - alpha_prev;
+
+ {
+ Scalar lower = alpha + delta;
+ Scalar upper = alpha + tau1 * delta;
+
+ alpha_next = interpolate (alpha_prev, falpha_prev, fpalpha_prev,
+ alpha, falpha, fpalpha, lower, upper, order);
+
+ }
+
+ alpha_prev = alpha;
+ falpha_prev = falpha;
+ fpalpha_prev = fpalpha;
+ alpha = alpha_next;
+ }
+ /* Sectioning of bracket [a,b] */
+ while (i++ < parameters.section_iters)
+ {
+ delta = b - a;
+
+ {
+ Scalar lower = a + tau2 * delta;
+ Scalar upper = b - tau3 * delta;
+
+ alpha = interpolate (a, fa, fpa, b, fb, fpb, lower, upper, order);
+ }
+ falpha = applyF (alpha);
+ if ((a-alpha)*fpa <= std::numeric_limits::epsilon ()) {
+ /* roundoff prevents progress */
+ return BFGSSpace::NoProgress;
+ };
+
+ if (falpha > f0 + rho * alpha * fp0 || falpha >= fa)
+ {
+ /* a_next = a; */
+ b = alpha; fb = falpha; fpb = std::numeric_limits::quiet_NaN ();
+ }
+ else
+ {
+ fpalpha = applyDF (alpha);
+
+ if (fabs(fpalpha) <= -sigma * fp0)
+ {
+ alpha_new = alpha;
+ return BFGSSpace::Success; /* terminate */
+ }
+
+ if ( ((b-a) >= 0 && fpalpha >= 0) || ((b-a) <=0 && fpalpha <= 0))
+ {
+ b = a; fb = fa; fpb = fpa;
+ a = alpha; fa = falpha; fpa = fpalpha;
+ }
+ else
+ {
+ a = alpha; fa = falpha; fpa = fpalpha;
+ }
+ }
+ }
+ return BFGSSpace::Success;
+}
+#endif // PCL_FOR_EIGEN_BFGS_H
+
diff --git a/appveyor/eigen.h b/appveyor/eigen.h
new file mode 100644
index 000000000..fdfa07aff
--- /dev/null
+++ b/appveyor/eigen.h
@@ -0,0 +1,52 @@
+/*
+ * Software License Agreement (BSD License)
+ *
+ * Point Cloud Library (PCL) - www.pointclouds.org
+ * Copyright (c) 2012-, Open Perception, Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of the copyright holder(s) nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Id: lmeds.h 1370 2011-06-19 01:06:01Z jspricke $
+ *
+ */
+
+#ifndef PCL_REGISTRATION_EIGEN_H_
+#define PCL_REGISTRATION_EIGEN_H_
+
+#if defined __GNUC__
+# pragma GCC system_header
+#endif
+
+#include
+#include
+#include
+#include
+
+#endif // PCL_REGISTRATION_EIGEN_H_
diff --git a/appveyor/install.ps1 b/appveyor/install.ps1
new file mode 100644
index 000000000..d4a5ecd8d
--- /dev/null
+++ b/appveyor/install.ps1
@@ -0,0 +1,482 @@
+# Sample script to install PointCloudLibrary and pip under Windows
+# Authors: Olivier Grisel, Jonathan Helmus, Kyle Kastner, and Alex Willmer
+# License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
+
+$BASE_PCL_URL = "http://jaist.dl.sourceforge.net/project/pointclouds/"
+$BASE_NUMPY_WHL_URL = "http://www.lfd.uci.edu/~gohlke/pythonlibs/"
+$NUMPY_DOWNLOAD_URL = "djcobkfp"
+
+$PYTHON_PRERELEASE_REGEX = @"
+(?x)
+(?\d+)
+\.
+(?\d+)
+\.
+(?\d+)
+(?[a-z]{1,2}\d+)
+"@
+
+
+$PCL_PRERELEASE_REGEX = @"
+(?x)
+(?\d+)
+\.
+(?\d+)
+\.
+(?\d+)
+(?[a-z]{1,2}\d+)
+"@
+
+
+function Download ($filename, $url)
+{
+ $webclient = New-Object System.Net.WebClient
+
+ $basedir = $pwd.Path + "\"
+ $filepath = $basedir + $filename
+ if (Test-Path $filename)
+ {
+ Write-Host "Reusing" $filepath
+ return $filepath
+ }
+
+ # Download and retry up to 3 times in case of network transient errors.
+ Write-Host "Downloading" $filename "from" $url
+ $retry_attempts = 2
+ for ($i = 0; $i -lt $retry_attempts; $i++) {
+ try {
+ $webclient.DownloadFile($url, $filepath)
+ break
+ }
+ Catch [Exception]{
+ Start-Sleep 1
+ }
+ }
+
+ if (Test-Path $filepath)
+ {
+ Write-Host "File saved at" $filepath
+ Write-Host $(Get-ChildItem $filepath).Length
+ }
+ else
+ {
+ # Retry once to get the error message if any at the last try
+ $webclient.DownloadFile($url, $filepath)
+ }
+
+ return $filepath
+}
+
+
+function ParsePythonVersion ($python_version)
+{
+ if ($python_version -match $PYTHON_PRERELEASE_REGEX)
+ {
+ return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, $matches.prerelease)
+ }
+
+ $version_obj = [version]$python_version
+ return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
+}
+
+function ParsePCLVersion ($pcl_version)
+{
+ if ($pcl_version -match $PCL_PRERELEASE_REGEX)
+ {
+ # return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro)
+ return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, $matches.prerelease)
+ }
+
+ # Convert NG
+ $version_obj = [version]$pcl_version
+ return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
+}
+
+
+function InstallPCLEXE ($exepath, $pcl_home, $install_log)
+{
+ # old
+ # $install_args = "/quiet InstallAllUsers=1 TargetDir=$pcl_home"
+ # RunCommand $exepath $install_args
+
+ # http://www.ibm.com/support/knowledgecenter/SS2RWS_2.1.0/com.ibm.zsecure.doc_2.1/visual_client/responseexamples.html?lang=ja
+ $install_args = "/S /v/qn /v/norestart"
+ # RunCommand schtasks /create /tn pclinstall /RL HIGHEST /tr $exepath /S /v/norestart /v/qn /sc once /st 23:59
+ # RunCommand schtasks /run /tn pclinstall
+ # RunCommand schtasks /delete /tn pclinstall /f
+ # RunCommand sleep 600
+ RunCommand "schtasks" "/create /tn pclinstall /RL HIGHEST /tr `"$exepath $install_args`" /sc once /st 23:59"
+ RunCommand "sleep" "10"
+ RunCommand "schtasks" "/run /tn pclinstall"
+ RunCommand "sleep" "600"
+ RunCommand "schtasks" "/delete /tn pclinstall /f"
+}
+
+function InstallPCLMSI ($msipath, $pcl_home, $install_log)
+{
+ $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$pcl_home"
+ $uninstall_args = "/qn /x $msipath"
+ RunCommand "msiexec.exe" $install_args
+ if (-not(Test-Path $pcl_home))
+ {
+ Write-Host "PointCloudLibrary seems to be installed else-where, reinstalling."
+ RunCommand "msiexec.exe" $uninstall_args
+ RunCommand "msiexec.exe" $install_args
+ }
+}
+
+function RunCommand ($command, $command_args)
+{
+ Write-Host $command $command_args
+ Start-Process -FilePath $command -ArgumentList $command_args -Wait -Passthru
+}
+
+function DownloadPCL ($pcl_version, $platform_suffix)
+{
+ # $major, $minor, $micro, $prerelease = ParsePCLVersion $pcl_version
+ $major, $minor, $micro = ParsePCLVersion $pcl_version
+
+ if ($major -le 1 -and $minor -eq 6)
+ {
+ # $url = http://jaist.dl.sourceforge.net/project/pointclouds/1.6.0/PCL-1.6.0-AllInOne-msvc2010-win64.exe
+ # $dir = "$major.$minor.$micro"
+ $dir = "$major.$minor.0"
+ $msvcver = "msvc2010"
+
+ $filename = "PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+ $url = "$BASE_PCL_URL" + "$dir" + "/PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+ }
+ elseif ($major -le 1 -and $minor -eq 7)
+ {
+ # $url = "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51249&authkey=!ABJC39YpCnE4So8&ithint=file%2cexe"
+ # $url = "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51248&authkey=!AOPBX-WypndUncw&ithint=file%2cexe"
+ # $dir = "$major.$minor.$micro"
+ $dir = "$major.$minor.2"
+ $msvcver = "msvc2015"
+
+ if ($platform_suffix -eq "win32")
+ {
+ # NG : oCi Download ܂ł͂Ȃ
+ # $url = "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51249&authkey=!ABJC39YpCnE4So8&ithint=file%2cexe"
+ # ڃNݒ肵Ă莞ԒNG
+ # Note : OT[rX exeu Download ?(`FbNp)
+ $url = "https://6gjmvg-ch3302.files.1drv.com/y3mINszazs-p2iitS2ZEzuvPRAqgqppQIAvM17aMB-S2y4iQ_jTyq0HVmZYBXZ1FAAl9VHzYCoQ6g_fRWaZMkA8AgvrfDvK5AZLy0s-guH9DPAYAlaTJo9-Hnr1xOeeA2t6u0uw9SHvO8CSZWnS5VwC-g/PCL-1.7.2-AllInOne-msvc2015-win32.exe?download&psid=1"
+ }
+ else
+ {
+ # NG : oCi Download ܂ł͂Ȃ
+ # $url = "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51248&authkey=!AOPBX-WypndUncw&ithint=file%2cexe"
+ # ڃNݒ肵Ă莞ԒNG
+ # Note : OT[rX exeu Download ?(`FbNp)
+ $url = "https://6gjnvg-ch3302.files.1drv.com/y3mY7SSNjvbvx74d4JIAMAob0A87UF5PNGI6sqJJVR7_QQ453NyhBlvXDpjHW49fHJl4D6nCKJ8CWHS7J_D734Mr2zQS32uT7kUqn6vE0cbNj_ISISKJZ28CPvOpbgKfRSMvCqrpQAXR3yBddzAY3kvSg/PCL-1.7.2-AllInOne-msvc2015-win64.exe?download&psid=1"
+ }
+
+ $filename = "PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+ }
+ elseif ($major -le 1 -and $minor -eq 8)
+ {
+ # $url = "https://onedrive.live.com/hogehoge"
+ # $dir = "$major.$minor.$micro"
+ $dir = "$major.$minor.0"
+ $msvcver = "msvc2015"
+
+ if ($platform_suffix -eq "win32")
+ {
+ # NG : oCi Download ܂ł͂Ȃ
+ # $url = "https://onedrive.live.com/redir?resid=EC9EBB2646FF189A!51249&authkey=!ABJC39YpCnE4So8&ithint=file%2cexe"
+ # ڃNݒ肵Ă莞ԒNG
+ # Note : OT[rXɃCXg[u Download ?(`FbNp)
+ $url = "https://6gjgdw-ch3302.files.1drv.com/y3m4fhIqdKOvjS4UfVakYyeZML0quorktQkKIWELuJCtxWh1jVFvzB0XcH5NlSsHrWVsgVlTMvbZkDyGv6FWix_pu24ORHI065W224v-gtAZmUrjBdbnda8AR1D-ehuHMWj-bhY2SHQmgo9LUXuAAcvOw/PCL-1.8.0-AllInOne-msvc2015-win32.exe?download&psid=1"
+ }
+ else
+ {
+ # NG : oCi Download ܂ł͂Ȃ
+ # $url = "https://onedrive.live.com/?authkey=%21AINUVKSzTRdWdS4&id=EC9EBB2646FF189A%2151744&cid=EC9EBB2646FF189A"
+ # ڃNݒ肵Ă莞ԒNG
+ # Note : OT[rXɃCXg[u Download ?(`FbNp)
+ $url = "https://6gi8dw-ch3302.files.1drv.com/y3mbO30Vy-o-tHwr_TFCfdEtcGx2zOi4X-S74Oun4BqvPejbSd8arDm-32QXDkram4hLMCXEunFnANWw2NMCcG4BYtBqZOrkJ2EsAZ4_lH4U08ne8v5U_nWLJAj2anBNjZF59NER9m5D03wax0BNZHaZwmEk3TkpyIhIUjGQoFlIdI/PCL-1.8.0-AllInOne-msvc2015-win64.exe?download&psid=1"
+ }
+
+ $filename = "PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+ }
+ else
+ {
+ $dir = "$major.$minor.$micro"
+ $msvcver = "msvc2015"
+ }
+
+ # $filename = "PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+ # $url = "$BASE_PCL_URL" + "$dir" + "/PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+
+ # (plan modified function)
+ $filepath = Download $filename $url
+ return $filepath
+}
+
+function DownloadGTKPlus ($gtk_version, $platform_suffix)
+{
+ # $major, $minor, $micro = ParsePCLVersion $gtk_version
+ # $dir = "$major.$minor.$micro"
+
+ $filename = "gtk+-bundle_3.10.4-20131202_" + "$platform_suffix.zip"
+ $url = "http://win32builder.gnome.org/" + "gtk+-bundle_3.10.4-20131202_" + "$platform_suffix.zip"
+
+ $filepath = Download $filename $url
+ return $filepath
+}
+
+function ParsePythonVersion ($python_version)
+{
+ if ($python_version -match $PYTHON_PRERELEASE_REGEX)
+ {
+ return ([int]$matches.major, [int]$matches.minor, [int]$matches.micro, $matches.prerelease)
+ }
+
+ # Convert NG
+ $version_obj = [version]$python_version
+ return ($version_obj.major, $version_obj.minor, $version_obj.build, "")
+}
+
+function InstallNumpy ($python_version, $architecture, $python_home)
+{
+ $major, $minor, $micro, $prerelease = ParsePythonVersion $python_version
+
+ $cp_ver = "cp$major$minor"
+
+ if ($architecture -eq "32") {
+ $platform_suffix = "win32"
+ } else {
+ $platform_suffix = "win_amd64"
+ }
+
+ $mathLib = "mkl"
+ if ($mathLib -eq "mkl")
+ {
+ $cp_last_ver = $cp_ver + "m"
+ }
+ else
+ {
+ $cp_last_ver = "none"
+ }
+
+ $numpy_ver = "1.10.4"
+
+ Write-Host "Installing Python" $python_version "for" $architecture "bit architecture to" $python_home
+ # if (Test-Path $python_home)
+ # {
+ # Write-Host $python_home "already exists, skipping."
+ # return $false
+ # }
+
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp27-cp27m-win32.whl
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp27-cp27m-win_amd64.whl
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp34-cp34m-win32.whl
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp34-cp34m-win_amd64.whl
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp35-cp35m-win32.whl
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/tugyrhqo/numpy-1.10.4+mkl-cp35-cp35m-win_amd64.whl
+ # numpy-1.10.4+vanilla-cp27-none-win32.whl
+ # numpy-1.10.4+vanilla-cp27-none-win_amd64.whl
+ # numpy-1.10.4+vanilla-cp34-none-win32.whl
+ # numpy-1.10.4+vanilla-cp34-none-win_amd64.whl
+ # numpy-1.10.4+vanilla-cp35-none-win32.whl
+ # numpy-1.10.4+vanilla-cp35-none-win_amd64.whl
+ # numpy-1.11.0rc1+mkl-cp27-cp27m-win32.whl
+ # numpy-1.11.0rc1+mkl-cp27-cp27m-win_amd64.whl
+ # numpy-1.11.0rc1+mkl-cp34-cp34m-win32.whl
+ # numpy-1.11.0rc1+mkl-cp34-cp34m-win_amd64.whl
+ # numpy-1.11.0rc1+mkl-cp35-cp35m-win32.whl
+ # numpy-1.11.0rc1+mkl-cp35-cp35m-win_amd64.whl
+ $filename = "numpy-" + "$numpy_ver" + "+" + "$mathLib" + "-" + "$cp_ver" + "-" + "$cp_last_ver" +"-" + "$platform_suffix.whl"
+ $url = "$BASE_NUMPY_WHL_URL" + "$NUMPY_DOWNLOAD_URL" + "/numpy-" + "$numpy_ver" + "+" + "$mathLib" + "-" + "$cp_ver" + "-" + "$cp_last_ver" + "-" + "$platform_suffix.whl"
+ # replace another function
+ $filepath = Download $filename $url
+ return $filepath
+}
+
+function InstallPCL ($pcl_version, $architecture, $pcl_home)
+{
+ if ($architecture -eq "32")
+ {
+ $platform_suffix = "win32"
+ }
+ else
+ {
+ $platform_suffix = "win64"
+ }
+
+ $installer_path = DownloadPCL $pcl_version $platform_suffix
+ $installer_ext = [System.IO.Path]::GetExtension($installer_path)
+ Write-Host "Installing $installer_path to $pcl_home"
+ $install_log = $pcl_home + "install.log"
+ if ($installer_ext -eq '.msi')
+ {
+ InstallPCLMSI $installer_path $pcl_home $install_log
+ }
+ else
+ {
+ InstallPCLEXE $installer_path $pcl_home $install_log
+ }
+
+ if (Test-Path $pcl_home)
+ {
+ Write-Host "PointCloudLibrary $pcl_version ($architecture) installation complete"
+ }
+ else
+ {
+ Write-Host "Failed to install PointCloudLibrary in $pcl_home"
+ # Get-Content -Path $install_log
+ # Exit 1
+ }
+}
+
+# function DownloadOpenNI ($openni_version, $platform_suffix)
+# {
+# # $major, $minor, $micro, $prerelease = ParsePCLVersion $openni_version
+# $major, $minor, $micro = ParsePCLVersion $openni_version
+#
+# if ($major -eq 1 -and $minor -eq 5 and $minor -eq 7)
+# {
+# if ($platform_suffix -eq "win32")
+# {
+# $url = "https://6qjmvg.bn1304.livefilestore.com/y3mi0KDkRbdIuOAXcGR3CNpXQZpmrSWltVYkTeL2qYl3Ag0fmxgTgtlxqOziG_Y55DoM7I8bLuVPxMYiZ94vCEZxBgQzCpWFaGS61rB9iP1trpLEStK8OH8VQ_v7HVrLQaQE2UgpunA3tZGEcxclHvD6g/OpenNI-Win32-1.5.7.10-Dev.zip?download&psid=1"
+# }
+# else
+# {
+# $url = "https://6qjmvg.bn1303.livefilestore.com/y3mEZfnt7ecywLJeAFqeZC0CdqIegwWqae5CHypCheKcyQv00BB4qMGhUW03FAJlubPymQz1hFHKLgRdE-2TO8b6VAZ4s_pe-FL-FY6I2RqCi8vcwOvEx1REMcZo_8Iz_bxNwEREtNH9M5TX8uo1yl9ZA/OpenNI-Win64-1.5.7.10-Dev.zip?download&psid=1"
+# }
+#
+# # OpenNI-Win32-1.5.7.10-Dev.zip
+# # OpenNI-Win64-1.5.7.10-Dev.zip
+# $filename = "OpenNI-" + "$platform_suffix" + "$major" + "." + "$minor" + "." + "$micro" + "." + "$msvcver" + "-" + "Dev.exe"
+# }
+# elseif ($major -eq 2 -and $minor -eq 8)
+# {
+# # $url = "https://onedrive.live.com/hogehoge"
+# # $dir = "$major.$minor.$micro"
+# $dir = "$major.$minor.0"
+# $msvcver = "msvc2015"
+# }
+# else
+# {
+# $dir = "$major.$minor.$micro"
+# }
+#
+# # $filename = "PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+# # $url = "$BASE_PCL_URL" + "$dir" + "/PCL-" + "$dir" + "-AllInOne-" + "$msvcver" + "-" + "$platform_suffix.exe"
+#
+# # (plan modified function)
+# $filepath = Download $filename $url
+# return $filepath
+# }
+
+function InstallOpenNI ($pcl_home, $openni_version, $architecture, $openni_home)
+{
+ if ($architecture -eq "32")
+ {
+ $platform_suffix = "win32"
+ }
+ else
+ {
+ $platform_suffix = "win64"
+ }
+
+ $installer_path = $pcl_home + "\3rdParty\OpenNI\OpenNI-" + "$platform_suffix" + "-" + "$openni_version" + "-Dev.msi"
+ $installer_ext = [System.IO.Path]::GetExtension($installer_path)
+ Write-Host "Installing $installer_path to $openni_home"
+ $install_log = $openni_home + "\install.log"
+ if ($installer_ext -eq '.msi')
+ {
+ InstallOpenNIMSI $installer_path $openni_home $install_log
+ }
+ else
+ {
+ InstallOpenNIEXE $installer_path $openni_home $install_log
+ }
+
+ if (Test-Path $openni_home)
+ {
+ Write-Host "OpenNI $openni_version ($architecture) installation complete"
+ }
+ else
+ {
+ Write-Host "Failed to install OpenNI in $openni_home"
+ # Get-Content -Path $install_log
+ # Exit 1
+ }
+}
+
+
+function InstallOpenNIMSI ($msipath, $openni_home, $install_log)
+{
+ # # http://www.ibm.com/support/knowledgecenter/SS2RWS_2.1.0/com.ibm.zsecure.doc_2.1/visual_client/responseexamples.html?lang=ja
+ # $install_args = "/S /v/qn /v/norestart"
+ # # RunCommand schtasks /create /tn openni_install /RL HIGHEST /tr $exepath /S /v/norestart /v/qn /sc once /st 23:59
+ # # RunCommand schtasks /run /tn openni_install
+ # # RunCommand schtasks /delete /tn openni_install /f
+ # # RunCommand sleep 90
+ # RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"$exepath $install_args`" /sc once /st 23:59"
+ # RunCommand "sleep" "10"
+ # RunCommand "schtasks" "/run /tn openni_install"
+ # RunCommand "sleep" "90"
+ # RunCommand "schtasks" "/delete /tn openni_install /f"
+
+ # $install_args = "/qn /log $install_log /i $msipath TARGETDIR=$openni_home"
+ # $install_args = "/qn /i `\`"$msipath`\`""
+ # $uninstall_args = "/qn /x `\`"$msipath`\`""
+ # $install_args = "/qn /i `"$msipath`""
+ # $uninstall_args = "/qn /x `"$msipath`""
+ $install_args = "/qn /norestart"
+ $uninstall_args = "$msipath /qn /x"
+
+ # RunCommand "msiexec.exe" $install_args
+ # task use
+ # RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"msiexec.exe $install_args`" /sc once /st 23:59"
+ RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"msiexec.exe /i $msipath $install_args`" /sc once /st 23:59"
+ RunCommand "sleep" "10"
+ RunCommand "schtasks" "/run /tn openni_install"
+ RunCommand "sleep" "90"
+ RunCommand "schtasks" "/delete /tn openni_install /f"
+ # if (-not(Test-Path $openni_home))
+ # {
+ # Write-Host "OpenNI seems to be installed else-where, reinstalling."
+ # # RunCommand "msiexec.exe" $uninstall_args
+ # RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"$install_args`" /sc once /st 23:59"
+ # RunCommand "sleep" "10"
+ # RunCommand "schtasks" "/run /tn openni_install"
+ # RunCommand "sleep" "90"
+ # RunCommand "schtasks" "/delete /tn openni_install /f"
+ #
+ # # RunCommand "msiexec.exe" $install_args
+ # RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"$install_args`" /sc once /st 23:59"
+ # RunCommand "sleep" "10"
+ # RunCommand "schtasks" "/run /tn openni_install"
+ # RunCommand "sleep" "90"
+ # RunCommand "schtasks" "/delete /tn openni_install /f"
+ # }
+}
+
+function InstallOpenNIEXE ($exepath, $openni_home, $install_log)
+{
+ # http://www.ibm.com/support/knowledgecenter/SS2RWS_2.1.0/com.ibm.zsecure.doc_2.1/visual_client/responseexamples.html?lang=ja
+ $install_args = "/S /v/qn /v/norestart"
+ # RunCommand schtasks /create /tn openni_install /RL HIGHEST /tr $exepath /S /v/norestart /v/qn /sc once /st 23:59
+ # RunCommand schtasks /run /tn openni_install
+ # RunCommand schtasks /delete /tn openni_install /f
+ # RunCommand sleep 90
+ RunCommand "schtasks" "/create /tn openni_install /RL HIGHEST /tr `"$exepath $install_args`" /sc once /st 23:59"
+ RunCommand "sleep" "10"
+ RunCommand "schtasks" "/run /tn openni_install"
+ RunCommand "sleep" "90"
+ RunCommand "schtasks" "/delete /tn openni_install /f"
+}
+
+function main ()
+{
+ # InstallPython $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
+ # http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
+ # InstallNumpy $env:PYTHON_VERSION $env:PYTHON_ARCH $env:PYTHON
+ InstallPCL $env:PCL_VERSION $env:PYTHON_ARCH $env:PCL_ROOT
+ # InstallOpenNI $env:PCL_ROOT_83 $env:OPENNI_VERSION $env:PYTHON_ARCH $env:OPENNI_ROOT
+}
+
+main
diff --git a/appveyor/run_with_env.cmd b/appveyor/run_with_env.cmd
new file mode 100644
index 000000000..5da547c49
--- /dev/null
+++ b/appveyor/run_with_env.cmd
@@ -0,0 +1,88 @@
+:: To build extensions for 64 bit Python 3, we need to configure environment
+:: variables to use the MSVC 2010 C++ compilers from GRMSDKX_EN_DVD.iso of:
+:: MS Windows SDK for Windows 7 and .NET Framework 4 (SDK v7.1)
+::
+:: To build extensions for 64 bit Python 2, we need to configure environment
+:: variables to use the MSVC 2008 C++ compilers from GRMSDKX_EN_DVD.iso of:
+:: MS Windows SDK for Windows 7 and .NET Framework 3.5 (SDK v7.0)
+::
+:: 32 bit builds, and 64-bit builds for 3.5 and beyond, do not require specific
+:: environment configurations.
+::
+:: Note: this script needs to be run with the /E:ON and /V:ON flags for the
+:: cmd interpreter, at least for (SDK v7.0)
+::
+:: More details at:
+:: https://github.com/cython/cython/wiki/64BitCythonExtensionsOnWindows
+:: http://stackoverflow.com/a/13751649/163740
+::
+:: Author: Olivier Grisel
+:: License: CC0 1.0 Universal: http://creativecommons.org/publicdomain/zero/1.0/
+::
+:: Notes about batch files for Python people:
+::
+:: Quotes in values are literally part of the values:
+:: SET FOO="bar"
+:: FOO is now five characters long: " b a r "
+:: If you don't want quotes, don't include them on the right-hand side.
+::
+:: The CALL lines at the end of this file look redundant, but if you move them
+:: outside of the IF clauses, they do not run properly in the SET_SDK_64==Y
+:: case, I don't know why.
+@ECHO OFF
+
+SET COMMAND_TO_RUN=%*
+SET WIN_SDK_ROOT=C:\Program Files\Microsoft SDKs\Windows
+SET WIN_WDK=c:\Program Files (x86)\Windows Kits\10\Include\wdf
+
+:: Extract the major and minor versions, and allow for the minor version to be
+:: more than 9. This requires the version number to have two dots in it.
+SET MAJOR_PYTHON_VERSION=%PYTHON_VERSION:~0,1%
+IF "%PYTHON_VERSION:~3,1%" == "." (
+ SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,1%
+) ELSE (
+ SET MINOR_PYTHON_VERSION=%PYTHON_VERSION:~2,2%
+)
+
+:: Based on the Python version, determine what SDK version to use, and whether
+:: to set the SDK for 64-bit.
+IF %MAJOR_PYTHON_VERSION% == 2 (
+ SET WINDOWS_SDK_VERSION="v7.0"
+ SET SET_SDK_64=Y
+) ELSE (
+ IF %MAJOR_PYTHON_VERSION% == 3 (
+ SET WINDOWS_SDK_VERSION="v7.1"
+ IF %MINOR_PYTHON_VERSION% LEQ 4 (
+ SET SET_SDK_64=Y
+ ) ELSE (
+ SET SET_SDK_64=N
+ IF EXIST "%WIN_WDK%" (
+ :: See: https://connect.microsoft.com/VisualStudio/feedback/details/1610302/
+ REN "%WIN_WDK%" 0wdf
+ )
+ )
+ ) ELSE (
+ ECHO Unsupported Python version: "%MAJOR_PYTHON_VERSION%"
+ EXIT 1
+ )
+)
+
+IF %PYTHON_ARCH% == 64 (
+ IF %SET_SDK_64% == Y (
+ ECHO Configuring Windows SDK %WINDOWS_SDK_VERSION% for Python %MAJOR_PYTHON_VERSION% on a 64 bit architecture
+ SET DISTUTILS_USE_SDK=1
+ SET MSSdk=1
+ "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Setup\WindowsSdkVer.exe" -q -version:%WINDOWS_SDK_VERSION%
+ "%WIN_SDK_ROOT%\%WINDOWS_SDK_VERSION%\Bin\SetEnv.cmd" /x64 /release
+ ECHO Executing: %COMMAND_TO_RUN%
+ call %COMMAND_TO_RUN% || EXIT 1
+ ) ELSE (
+ ECHO Using default MSVC build environment for 64 bit architecture
+ ECHO Executing: %COMMAND_TO_RUN%
+ call %COMMAND_TO_RUN% || EXIT 1
+ )
+) ELSE (
+ ECHO Using default MSVC build environment for 32 bit architecture
+ ECHO Executing: %COMMAND_TO_RUN%
+ call %COMMAND_TO_RUN% || EXIT 1
+)
diff --git a/appveyor/shared_ptr.hpp b/appveyor/shared_ptr.hpp
new file mode 100644
index 000000000..d31978c92
--- /dev/null
+++ b/appveyor/shared_ptr.hpp
@@ -0,0 +1,19 @@
+#ifndef BOOST_SHARED_PTR_HPP_INCLUDED
+#define BOOST_SHARED_PTR_HPP_INCLUDED
+
+//
+// shared_ptr.hpp
+//
+// (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+// Copyright (c) 2001-2008 Peter Dimov
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/smart_ptr/shared_ptr.htm for documentation.
+//
+
+#include
+
+#endif // #ifndef BOOST_SHARED_PTR_HPP_INCLUDED
diff --git a/build.bat b/build.bat
new file mode 100644
index 000000000..2e3fe0714
--- /dev/null
+++ b/build.bat
@@ -0,0 +1,4 @@
+python setup.py build_ext -i
+python setup.py install
+python tests\test_pcl.py
+python tests\test_registration.py
diff --git a/check.bat b/check.bat
new file mode 100644
index 000000000..0073850e2
--- /dev/null
+++ b/check.bat
@@ -0,0 +1 @@
+python setup.py build_ext -i > log.txt
diff --git a/clear.bat b/clear.bat
new file mode 100644
index 000000000..13a80a5d4
--- /dev/null
+++ b/clear.bat
@@ -0,0 +1,19 @@
+del pcl\_pcl.cpp
+del pcl\_pcl.pyd
+del pcl\_pcl_172.cpp
+del pcl\_pcl_172.pyd
+del pcl\_pcl_180.cpp
+del pcl\_pcl_180.pyd
+del pcl\pcl_registration_160.cpp
+del pcl\pcl_registration_160.pyd
+del pcl\pcl_registration_172.cpp
+del pcl\pcl_registration_172.pyd
+del pcl\pcl_registration_180.cpp
+del pcl\pcl_registration_180.pyd
+del pcl\pcl_visualization.cpp
+del pcl\pcl_visualization.pyd
+del pcl\pcl_grabber.cpp
+del pcl\pcl_grabber.pyd
+rd /s /q build
+rd /s /q python_pcl.egg-info
+pip uninstall python-pcl -y
\ No newline at end of file
diff --git a/clear.sh b/clear.sh
new file mode 100644
index 000000000..03d3c51fc
--- /dev/null
+++ b/clear.sh
@@ -0,0 +1,21 @@
+sudo rm pcl/_pcl.cpp
+sudo rm pcl/_pcl.pyd
+sudo rm pcl/_pcl_172.cpp
+sudo rm pcl/_pcl_172.pyd
+sudo rm pcl/_pcl_180.cpp
+sudo rm pcl/_pcl_180.pyd
+sudo rm pcl/pcl_registration_160.cpp
+sudo rm pcl/pcl_registration_160.pyd
+sudo rm pcl/pcl_registration_172.cpp
+sudo rm pcl/pcl_registration_172.pyd
+sudo rm pcl/pcl_registration_180.cpp
+sudo rm pcl/pcl_registration_180.pyd
+sudo rm pcl/pcl_visualization.cpp
+sudo rm pcl/pcl_visualization.pyd
+sudo rm pcl/pcl_grabber.cpp
+sudo rm pcl/pcl_grabber.pyd
+sudo rm pcl/pcl_grabber_180.cpp
+sudo rm pcl/pcl_grabber_180.pyd
+sudo rm -rf build
+sudo rm -rf python_pcl.egg-info
+sudo pip uninstall python-pcl -y
diff --git a/dev-requirements.txt b/dev-requirements.txt
new file mode 100644
index 000000000..451cb85e4
--- /dev/null
+++ b/dev-requirements.txt
@@ -0,0 +1,2 @@
+nose
+wheel
diff --git a/examples/3dharris.py b/examples/3dharris.py
new file mode 100644
index 000000000..9b0472f27
--- /dev/null
+++ b/examples/3dharris.py
@@ -0,0 +1,102 @@
+# -*- coding: utf-8 -*-
+# http://virtuemarket-lab.blogspot.jp/2015/03/harris.html
+import pcl
+import numpy as np
+import pcl.pcl_visualization
+
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+# pcl::io::loadPCDFile (argv[1], *cloud);
+# cloud = pcl.load("table_scene_mug_stereo_textured.pcd")
+# cloud = pcl.load('./examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd')
+cloud = pcl.load('./bunny.pcd')
+print("cloud points : " + str(cloud.size))
+
+# pcl::HarrisKeypoint3D detector;
+# detector.setNonMaxSupression (true);
+# detector.setRadius (0.01);
+# //detector.setRadiusSearch (100);
+# detector.setInputCloud(cloud);
+# pcl::PointCloud::Ptr keypoints(new pcl::PointCloud());
+# detector.compute(*keypoints);
+###
+detector = cloud.make_HarrisKeypoint3D()
+detector.set_NonMaxSupression (True)
+detector.set_Radius (100)
+# detector.set_NonMaxSupression (False)
+# detector.set_Radius (0.1)
+keypoints = detector.compute()
+
+# std::cout << "keypoints detected: " << keypoints->size() << std::endl;
+print("keypoints detected: " + str(keypoints.size))
+
+# pcl::PointCloud::Ptr keypoints3D(new pcl::PointCloud());
+# pcl::PointXYZ tmp;
+# double max = 0,min=0;
+# for(pcl::PointCloud::iterator i = keypoints->begin(); i!= keypoints->end(); i++)
+# tmp = pcl::PointXYZ((*i).x,(*i).y,(*i).z);
+# if ((*i).intensity>max )
+# std::cout << (*i) << " coords: " << (*i).x << ";" << (*i).y << ";" << (*i).z << std::endl;
+# max = (*i).intensity;
+# if ((*i).intensitypush_back(tmp);
+#
+# std::cout << "maximal responce: "<< max << " min responce: "<< min< max:
+ print("coords: " + str(keypoints[i][0]) + ";" + str(keypoints[i][1]) + ";" + str(keypoints[i][2]) )
+ max = intensity
+ end
+
+ if intensity < min:
+ min = intensity
+ end
+
+keypoints3D.from_array(points)
+print("maximal responce: " + str(max) + " min responce: " + str(min) )
+
+# //show point cloud
+# pcl::visualization::PCLVisualizer viewer ("3D Viewer");
+# pcl::visualization::PointCloudColorHandlerCustom pccolor(cloud, 255, 255, 255);
+# pcl::visualization::PointCloudColorHandlerCustom kpcolor(keypoints3D, 255, 0, 0);
+# viewer.addPointCloud(cloud, pccolor, "testimg.png");
+# viewer.addPointCloud(keypoints3D, kpcolor,"keypoints.png");
+# viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "keypoints.png");
+##
+viewer = pcl.pcl_visualization.PCLVisualizering('3D Viewer')
+pccolor = pcl.pcl_visualization.PointCloudColorHandleringCustom(cloud, 255, 255, 255)
+kpcolor = pcl.pcl_visualization.PointCloudColorHandleringCustom(keypoints3D, 255, 0, 0)
+# OK
+viewer.AddPointCloud_ColorHandler(cloud, pccolor)
+viewer.AddPointCloud_ColorHandler(keypoints3D, kpcolor)
+# viewer.AddPointCloud_ColorHandler(cloud, pccolor, "testimg.png", 0)
+# viewer.AddPointCloud_ColorHandler(keypoints3D, kpcolor, str('keypoints.png'), 0)
+# need? : AddPointCloud_ColorHandler Function Succeded
+# viewer.SetPointCloudRenderingProperties (pcl.pcl_visualization.PCLVISUALIZER_POINT_SIZE, 7, 'keypoints.png')
+###
+
+
+# while (!viewer.wasStopped ())
+# {
+# viewer.spinOnce();
+# pcl_sleep (0.01);
+# }
+flag = True
+while flag:
+ flag != viewer.WasStopped()
+ viewer.SpinOnce()
+ # pcl_sleep (0.01)
+ # pass
+end
diff --git a/examples/GrabberCallbackTest.py b/examples/GrabberCallbackTest.py
new file mode 100644
index 000000000..89620a302
--- /dev/null
+++ b/examples/GrabberCallbackTest.py
@@ -0,0 +1,10 @@
+import pcl.pcl_grabber
+
+def func(obj):
+ print(obj)
+ obj.Test() # Call to a specific method from class 'PyGrabberNode'
+ return obj.d_prop
+
+n = pcl.pcl_grabber.PyGrabberNode() # Custom class of my own
+cb = pcl.pcl_grabber.PyGrabberCallback(func)
+print(cb.execute(n))
\ No newline at end of file
diff --git a/examples/HarrisKeypoint3D.py b/examples/HarrisKeypoint3D.py
new file mode 100644
index 000000000..53f8b2b5e
--- /dev/null
+++ b/examples/HarrisKeypoint3D.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+# http://virtuemarket-lab.blogspot.jp/2015/03/harris.html
+
+from __future__ import print_function
+
+import numpy as np
+import pcl
+
+import pcl.pcl_visualization
+
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+# pcl::io::loadPCDFile (argv[1], *cloud);
+cloud = pcl.load_XYZRGB('./examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd')
+
+# pcl::HarrisKeypoint3D detector;
+# detector.setNonMaxSupression (true);
+# detector.setRadius (0.01);
+# //detector.setRadiusSearch (100);
+# detector.setInputCloud(cloud);
+detector = cloud.make_HarrisKeypoint3D()
+
+# pcl::PointCloud::Ptr keypoints(new pcl::PointCloud());
+# detector.compute(*keypoints);
+keypoints = detector.compute()
+
+# std::cout << "keypoints detected: " << keypoints->size() << std::endl;
+
+# pcl::PointCloud::Ptr keypoints3D(new pcl::PointCloud());
+# pcl::PointXYZ tmp;
+# double max = 0,min=0;
+#
+# for(pcl::PointCloud::iterator i = keypoints->begin(); i!= keypoints->end(); i++){
+# tmp = pcl::PointXYZ((*i).x,(*i).y,(*i).z);
+# if ((*i).intensity>max ){
+# std::cout << (*i) << " coords: " << (*i).x << ";" << (*i).y << ";" << (*i).z << std::endl;
+# max = (*i).intensity;
+# }
+# if ((*i).intensitypush_back(tmp);
+# }
+#
+# std::cout << "maximal responce: "<< max << " min responce: "<< min< pccolor(cloud, 255, 255, 255);
+# pcl::visualization::PointCloudColorHandlerCustom kpcolor(keypoints3D, 255, 0, 0);
+pccolor = PointCloudColorHandlerCustom(cloud, 255, 255, 255)
+kpcolor = PointCloudColorHandlerCustom(keypoints3D, 255, 0, 0)
+
+viewer.addPointCloud(cloud,pccolor,"testimg.png");
+viewer.addPointCloud(keypoints3D,kpcolor,"keypoints.png");
+# viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "keypoints.png");
+
+
+while True:
+ # viewer.wasStopped()
+ viewer.spinOnce()
+ pcl_sleep (0.01)
+end
diff --git a/examples/cropbox.py b/examples/cropbox.py
new file mode 100644
index 000000000..01a9dfeb9
--- /dev/null
+++ b/examples/cropbox.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+from __future__ import print_function
+
+import numpy as np
+import pcl
+
+cloud = pcl.load('./examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd')
+
+# pcl::CropBox clipper;
+# clipper.setInputCloud(cloud);
+clipper = cloud.make_cropbox()
+
+# pcl::PCDWriter writer;
+# pcl::PointCloud::Ptr outcloud;
+outcloud = pcl.PointCloud()
+
+# clipper.setTranslation(Eigen::Vector3f(pose->tx, pose->ty, pose->tz));
+# clipper.setRotation(Eigen::Vector3f(pose->rx, pose->ry, pose->rz));
+# clipper.setMin(-Eigen::Vector4f(tracklet->l/2, tracklet->w/2, 0, 0));
+# clipper.setMax(Eigen::Vector4f(tracklet->l/2, tracklet->w/2, tracklet->h, 0));
+# clipper.filter(*outcloud);
+tx = 0
+ty = 0
+tz = 0
+clipper.set_Translation(tx, ty, tz)
+rx = 0
+ry = 0
+rz = 0
+clipper.set_Rotation(rx, ry, rz)
+minx = -1.5
+miny = -1.5
+minz = 2
+mins = 0
+maxx = 3.5
+maxy = 3.5
+maxz = 3
+maxs = 0
+clipper.set_MinMax(minx, miny, minz, mins, maxx, maxy, maxz, maxs)
+clipper.Filtering(outcloud)
+
+pcl.save(outcloud, "test.pcd")
+
+# stringstream outfilename;
+# outfilename << outfile << tracklet->objectType << i << ".pcd";
+# if(!outcloud->empty()){
+# cout << "Found "<size() << " points, writing to " << outfilename.str() << endl;
+# writer.write (outfilename.str(), *outcloud, false);
+# }else{
+# cerr << "Couldn't find points for tracklet" << tracklet->objectType << i << endl;
+# }
diff --git a/examples/crophull.py b/examples/crophull.py
new file mode 100644
index 000000000..f0f4d9551
--- /dev/null
+++ b/examples/crophull.py
@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+from __future__ import print_function
+
+import numpy as np
+import pcl
+
+# http://www.pcl-users.org/CropHull-filter-question-td4030345.html
+datacloud = pcl.load('/examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd')
+
+print(datacloud)
+
+filterCloud = pcl.PointCloud()
+vt = pcl.Vertices()
+
+# // inside point
+# cloud->push_back(pcl::PointXYZ(M_PI * 0.3, M_PI * 0.3, 0));
+# // hull points
+# cloud->push_back(pcl::PointXYZ(0,0,0));
+# cloud->push_back(pcl::PointXYZ(M_PI,0,0));
+# cloud->push_back(pcl::PointXYZ(M_PI,M_PI*0.5,0));
+# cloud->push_back(pcl::PointXYZ(0,M_PI*0.5,0));
+# cloud->push_back(pcl::PointXYZ(0,0,0));
+# // outside point
+# cloud->push_back(pcl::PointXYZ(-M_PI * 0.3, -M_PI * 0.3, 0));
+
+points_2 = np.array([
+ [1 * 0.3, 1 * 0.3, 0],
+ [0, 0, 0],
+ [1, 0, 0],
+ [1, 1 * 0.5, 0],
+ [0, 1 * 0.5, 0],
+ [0, 0, 0],
+ [-1 * 0.3 , -1 * 0.3, 0]
+ ], dtype=np.float32)
+filterCloud.from_array(points_2)
+print(filterCloud)
+
+vertices_point_1 = np.array([1, 2, 3, 4, 5], dtype=np.int)
+vt.from_array(vertices_point_1)
+
+# print(vt)
+# vt.vertices.push_back(1)
+# vt.vertices.push_back(2)
+# vt.vertices.push_back(3)
+# vt.vertices.push_back(4)
+# vt.vertices.push_back(5)
+# vertices = vector[pcl.Vertices]
+# vertices.push_back(vt)
+
+outputCloud = pcl.PointCloud()
+# crophull = pcl.CropHull()
+# crophull.setInputCloud(datacloud)
+crophull = datacloud.make_crophull()
+# crophull.setHullIndices(vertices)
+# crophull.setHullIndices(vt)
+# crophull.setHullCloud(filterCloud)
+# crophull.setDim(2)
+# crophull.setCropOutside(false)
+crophull.SetParameter(filterCloud, vt)
+
+# indices = vector[int]
+# cropHull.filter(indices);
+# outputCloud = cropHull.filter();
+# print("before: " + outputCloud)
+crophull.Filtering(outputCloud)
+print(outputCloud)
+
+
+# Viewer
+# // pcl::visualization::CloudViewer viewer ("Cluster viewer");
+# // viewer.showCloud(colored_cloud);
+
+# pcl.visualization.CloudViewer
+
+# Write Point
+# pcl::PCDWriter writer;
+# std::stringstream ss;
+# ss << "min_cut_seg" << ".pcd";
+# // writer.write (ss.str (), *cloud, false);
+# pcl::io::savePCDFile(ss.str(), *outputCloud, false);
+
diff --git a/examples/example.py b/examples/example.py
new file mode 100644
index 000000000..2cac94312
--- /dev/null
+++ b/examples/example.py
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+from __future__ import print_function
+
+# This Code Base
+# http://ros-robot.blogspot.jp/2011/08/pclapi-point-cloud-library-pcl-pcl-api.html
+
+import numpy as np
+import pcl
+import random
+
+import pcl.pcl_visualization
+
+# pcl::PointCloud cloud;
+cloud = pcl.PointCloud_PointXYZRGB()
+
+# Fill in the cloud data
+# cloud.width = 15;
+# cloud.height = 10;
+# cloud.points.resize (cloud.width * cloud.height)
+# cloud.resize (np.array([15, 10], dtype=np.float))
+# points = np.zeros((10, 15, 4), dtype=np.float32)
+points = np.zeros((150, 4), dtype=np.float32)
+RAND_MAX = 1.0
+# Generate the data
+for i in range(0, 75):
+ # set Point Plane
+ points[i][0] = 1024 * random.random () / (RAND_MAX + 1.0)
+ points[i][1] = 1024 * random.random () / (RAND_MAX + 1.0)
+ points[i][2] = 0.1 * random.random () / (RAND_MAX + 1.0)
+ points[i][3] = 255 << 16 | 255 << 8 | 255
+
+for i in range(75, 150):
+ # set Point Randomize
+ points[i][0] = 1024 * random.random () / (RAND_MAX + 1.0)
+ points[i][1] = 1024 * random.random () / (RAND_MAX + 1.0)
+ points[i][2] = 1024 * random.random () / (RAND_MAX + 1.0)
+ points[i][3] = 255 << 16 | 255 << 8 | 255
+
+# Set a few outliers
+points[0][2] = 2.0;
+points[3][2] = -2.0;
+points[6][2] = 4.0;
+
+print (cloud)
+
+for i in range(0, 150):
+ print (points[i][0], points[i][1], points[i][2], points[i][3])
+
+cloud.from_array(points)
+
+# Create the segmentation object
+# pcl::SACSegmentation seg
+seg = cloud.make_segmenter()
+# Optional
+seg.set_optimize_coefficients (True)
+# Mandatory
+seg.set_model_type (pcl.SACMODEL_PLANE)
+seg.set_method_type (pcl.SAC_RANSAC)
+seg.set_distance_threshold (0.1)
+
+# pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients)
+# pcl::PointIndices::Ptr inliers (new pcl::PointIndices);
+inliers, model = seg.segment()
+
+# if inliers.size
+# return
+# end
+
+print (model)
+# std::cerr << "Model coefficients: " << coefficients->values[0] << " "
+# << coefficients->values[1] << " "
+# << coefficients->values[2] << " "
+# << coefficients->values[3] << std::endl;
+#
+# std::cerr << "Model inliers: " << inliers->indices.size () << std::endl;
+# for (size_t i = 0; i < inliers->indices.size (); ++i)
+# {
+# std::cerr << inliers->indices[i] << " " << cloud.points[inliers->indices[i]].x << " "
+# << cloud.points[inliers->indices[i]].y << " "
+# << cloud.points[inliers->indices[i]].z << std::endl;
+# cloud.points[inliers->indices[i]].r = 255;
+# cloud.points[inliers->indices[i]].g = 0;
+# cloud.points[inliers->indices[i]].b = 0;
+# }
+for i in inliers:
+ points[i][3] = 255 << 16 | 255 << 8 | 0
+
+cloud.from_array(points)
+
+#
+# pcl::visualization::CloudViewer viewer("Cloud Viewer");
+# viewer.showCloud(cloud.makeShared());
+# while (!viewer.wasStopped ())
+visual = pcl.pcl_visualization.CloudViewer()
+visual.ShowColorCloud(cloud)
+while True:
+ visual.WasStopped()
+end
+
diff --git a/examples/external/libfreenect2/example.py b/examples/external/libfreenect2/example.py
new file mode 100644
index 000000000..8fda4ecc8
--- /dev/null
+++ b/examples/external/libfreenect2/example.py
@@ -0,0 +1,105 @@
+# coding: utf-8
+# before install libfreenect2 & pylibfreenect2
+import numpy as np
+# import cv2
+import pcl
+import pcl.pcl_visualization
+import sys
+from pylibfreenect2 import Freenect2, SyncMultiFrameListener
+from pylibfreenect2 import FrameType, Registration, Frame
+from pylibfreenect2 import createConsoleLogger, setGlobalLogger
+from pylibfreenect2 import LoggerLevel
+
+try:
+ from pylibfreenect2 import OpenCLPacketPipeline
+ pipeline = OpenCLPacketPipeline()
+except:
+ from pylibfreenect2 import CpuPacketPipeline
+ pipeline = CpuPacketPipeline()
+
+# Create and set logger
+logger = createConsoleLogger(LoggerLevel.Debug)
+setGlobalLogger(logger)
+
+fn = Freenect2()
+num_devices = fn.enumerateDevices()
+if num_devices == 0:
+ print("No device connected!")
+ sys.exit(1)
+
+serial = fn.getDeviceSerialNumber(0)
+device = fn.openDevice(serial, pipeline=pipeline)
+
+listener = SyncMultiFrameListener(
+ FrameType.Color | FrameType.Ir | FrameType.Depth)
+
+# Register listeners
+device.setColorFrameListener(listener)
+device.setIrAndDepthFrameListener(listener)
+
+device.start()
+
+# NOTE: must be called after device.start()
+registration = Registration(device.getIrCameraParams(),
+ device.getColorCameraParams())
+
+undistorted = Frame(512, 424, 4)
+registered = Frame(512, 424, 4)
+
+# Optinal parameters for registration
+# set True if you need
+need_bigdepth = False
+need_color_depth_map = False
+
+bigdepth = Frame(1920, 1082, 4) if need_bigdepth else None
+color_depth_map = np.zeros((424, 512), np.int32).ravel() \
+ if need_color_depth_map else None
+
+point = pcl.PointCloud()
+visual = pcl.pcl_visualization.CloudViewing()
+visual.ShowColorCloud(cloud)
+
+while True:
+ frames = listener.waitForNewFrame()
+
+ color = frames["color"]
+ ir = frames["ir"]
+ depth = frames["depth"]
+
+ registration.apply(color, depth, undistorted, registered,
+ bigdepth=bigdepth,
+ color_depth_map=color_depth_map)
+
+ # NOTE for visualization:
+ # cv2.imshow without OpenGL backend seems to be quite slow to draw all
+ # things below. Try commenting out some imshow if you don't have a fast
+ # visualization backend.
+ # cv2.imshow("ir", ir.asarray() / 65535.)
+ # cv2.imshow("depth", depth.asarray() / 4500.)
+ # cv2.imshow("color", cv2.resize(color.asarray(), (int(1920 / 3), int(1080 / 3))))
+ # cv2.imshow("registered", registered.asarray(np.uint8))
+
+ # if need_bigdepth:
+ # cv2.imshow("bigdepth", cv2.resize(bigdepth.asarray(np.float32),
+ # (int(1920 / 3), int(1082 / 3))))
+ # if need_color_depth_map:
+ # cv2.imshow("color_depth_map", color_depth_map.reshape(424, 512))
+
+ undistorted_arrray = undistorted.asarray(dtype=np.float32, ndim=2)
+ # registered_array = registered.asarray(dtype=np.uint8)
+ point = pcl.PointCloud(undistorted_arrray)
+ # visual.ShowColorCloud(cloud)
+
+ listener.release(frames)
+
+ # key = cv2.waitKey(delay=1)
+ # if key == ord('q'):
+ # break
+ if visual.WasStopped() == True:
+ break
+
+device.stop()
+device.close()
+
+sys.exit(0)
+
diff --git a/examples/external/libfreenect2/test.txt b/examples/external/libfreenect2/test.txt
new file mode 100644
index 000000000..3abd61f0c
--- /dev/null
+++ b/examples/external/libfreenect2/test.txt
@@ -0,0 +1,10 @@
+# https://github.com/r9y9/pylibfreenect2
+
+1. libfreenect2 & pylibfreenect2 install
+git clone https://github.com/r9y9/pylibfreenect2.git
+python setup.py install
+
+2.
+
+
+
diff --git a/examples/kdtree.py b/examples/kdtree.py
index c4a006edf..5332bcc6d 100644
--- a/examples/kdtree.py
+++ b/examples/kdtree.py
@@ -1,3 +1,5 @@
+# -*- coding: utf-8 -*-
+
from __future__ import print_function
import numpy as np
diff --git a/examples/official/Applications/ground_based_rgbd_people_detector.txt b/examples/official/Applications/ground_based_rgbd_people_detector.txt
new file mode 100644
index 000000000..040503fd4
--- /dev/null
+++ b/examples/official/Applications/ground_based_rgbd_people_detector.txt
@@ -0,0 +1,199 @@
+# Detecting people on a ground plane with RGB-D data
+# http://pointclouds.org/documentation/tutorials/ground_based_rgbd_people_detection.php#ground-based-rgbd-people-detection
+
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+typedef pcl::PointXYZRGBA PointT;
+typedef pcl::PointCloud PointCloudT;
+
+// PCL viewer //
+pcl::visualization::PCLVisualizer viewer("PCL Viewer");
+
+// Mutex: //
+boost::mutex cloud_mutex;
+
+enum { COLS = 640, ROWS = 480 };
+
+int print_help()
+{
+ cout << "*******************************************************" << std::endl;
+ cout << "Ground based people detection app options:" << std::endl;
+ cout << " --help " << std::endl;
+ cout << " --svm " << std::endl;
+ cout << " --conf " << std::endl;
+ cout << " --min_h " << std::endl;
+ cout << " --max_h " << std::endl;
+ cout << "*******************************************************" << std::endl;
+ return 0;
+}
+
+void cloud_cb_ (const PointCloudT::ConstPtr &callback_cloud, PointCloudT::Ptr& cloud,
+ bool* new_cloud_available_flag)
+{
+ cloud_mutex.lock (); // for not overwriting the point cloud from another thread
+ *cloud = *callback_cloud;
+ *new_cloud_available_flag = true;
+ cloud_mutex.unlock ();
+}
+
+struct callback_args{
+ // structure used to pass arguments to the callback function
+ PointCloudT::Ptr clicked_points_3d;
+ pcl::visualization::PCLVisualizer::Ptr viewerPtr;
+};
+
+void
+pp_callback (const pcl::visualization::PointPickingEvent& event, void* args)
+{
+ struct callback_args* data = (struct callback_args *)args;
+ if (event.getPointIndex () == -1)
+ return;
+ PointT current_point;
+ event.getPoint(current_point.x, current_point.y, current_point.z);
+ data->clicked_points_3d->points.push_back(current_point);
+ // Draw clicked points in red:
+ pcl::visualization::PointCloudColorHandlerCustom red (data->clicked_points_3d, 255, 0, 0);
+ data->viewerPtr->removePointCloud("clicked_points");
+ data->viewerPtr->addPointCloud(data->clicked_points_3d, red, "clicked_points");
+ data->viewerPtr->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 10, "clicked_points");
+ std::cout << current_point.x << " " << current_point.y << " " << current_point.z << std::endl;
+}
+
+int main (int argc, char** argv)
+{
+ if(pcl::console::find_switch (argc, argv, "--help") || pcl::console::find_switch (argc, argv, "-h"))
+ return print_help();
+
+ // Algorithm parameters:
+ std::string svm_filename = "../../people/data/trainedLinearSVMForPeopleDetectionWithHOG.yaml";
+ float min_confidence = -1.5;
+ float min_height = 1.3;
+ float max_height = 2.3;
+ float voxel_size = 0.06;
+ Eigen::Matrix3f rgb_intrinsics_matrix;
+ rgb_intrinsics_matrix << 525, 0.0, 319.5, 0.0, 525, 239.5, 0.0, 0.0, 1.0; // Kinect RGB camera intrinsics
+
+ // Read if some parameters are passed from command line:
+ pcl::console::parse_argument (argc, argv, "--svm", svm_filename);
+ pcl::console::parse_argument (argc, argv, "--conf", min_confidence);
+ pcl::console::parse_argument (argc, argv, "--min_h", min_height);
+ pcl::console::parse_argument (argc, argv, "--max_h", max_height);
+
+ // Read Kinect live stream:
+ PointCloudT::Ptr cloud (new PointCloudT);
+ bool new_cloud_available_flag = false;
+ pcl::Grabber* interface = new pcl::OpenNIGrabber();
+ boost::function::ConstPtr&)> f =
+ boost::bind (&cloud_cb_, _1, cloud, &new_cloud_available_flag);
+ interface->registerCallback (f);
+ interface->start ();
+
+ // Wait for the first frame:
+ while(!new_cloud_available_flag)
+ boost::this_thread::sleep(boost::posix_time::milliseconds(1));
+ new_cloud_available_flag = false;
+
+ cloud_mutex.lock (); // for not overwriting the point cloud
+
+ // Display pointcloud:
+ pcl::visualization::PointCloudColorHandlerRGBField rgb(cloud);
+ viewer.addPointCloud (cloud, rgb, "input_cloud");
+ viewer.setCameraPosition(0,0,-2,0,-1,0,0);
+
+ // Add point picking callback to viewer:
+ struct callback_args cb_args;
+ PointCloudT::Ptr clicked_points_3d (new PointCloudT);
+ cb_args.clicked_points_3d = clicked_points_3d;
+ cb_args.viewerPtr = pcl::visualization::PCLVisualizer::Ptr(&viewer);
+ viewer.registerPointPickingCallback (pp_callback, (void*)&cb_args);
+ std::cout << "Shift+click on three floor points, then press 'Q'..." << std::endl;
+
+ // Spin until 'Q' is pressed:
+ viewer.spin();
+ std::cout << "done." << std::endl;
+
+ cloud_mutex.unlock ();
+
+ // Ground plane estimation:
+ Eigen::VectorXf ground_coeffs;
+ ground_coeffs.resize(4);
+ std::vector clicked_points_indices;
+ for (unsigned int i = 0; i < clicked_points_3d->points.size(); i++)
+ clicked_points_indices.push_back(i);
+ pcl::SampleConsensusModelPlane model_plane(clicked_points_3d);
+ model_plane.computeModelCoefficients(clicked_points_indices,ground_coeffs);
+ std::cout << "Ground plane: " << ground_coeffs(0) << " " << ground_coeffs(1) << " " << ground_coeffs(2) << " " << ground_coeffs(3) << std::endl;
+
+ // Initialize new viewer:
+ pcl::visualization::PCLVisualizer viewer("PCL Viewer"); // viewer initialization
+ viewer.setCameraPosition(0,0,-2,0,-1,0,0);
+
+ // Create classifier for people detection:
+ pcl::people::PersonClassifier person_classifier;
+ person_classifier.loadSVMFromFile(svm_filename); // load trained SVM
+
+ // People detection app initialization:
+ pcl::people::GroundBasedPeopleDetectionApp people_detector; // people detection object
+ people_detector.setVoxelSize(voxel_size); // set the voxel size
+ people_detector.setIntrinsics(rgb_intrinsics_matrix); // set RGB camera intrinsic parameters
+ people_detector.setClassifier(person_classifier); // set person classifier
+ people_detector.setHeightLimits(min_height, max_height); // set person classifier
+// people_detector.setSensorPortraitOrientation(true); // set sensor orientation to vertical
+
+ // For timing:
+ static unsigned count = 0;
+ static double last = pcl::getTime ();
+
+ // Main loop:
+ while (!viewer.wasStopped())
+ {
+ if (new_cloud_available_flag && cloud_mutex.try_lock ()) // if a new cloud is available
+ {
+ new_cloud_available_flag = false;
+
+ // Perform people detection on the new cloud:
+ std::vector > clusters; // vector containing persons clusters
+ people_detector.setInputCloud(cloud);
+ people_detector.setGround(ground_coeffs); // set floor coefficients
+ people_detector.compute(clusters); // perform people detection
+
+ ground_coeffs = people_detector.getGround(); // get updated floor coefficients
+
+ // Draw cloud and people bounding boxes in the viewer:
+ viewer.removeAllPointClouds();
+ viewer.removeAllShapes();
+ pcl::visualization::PointCloudColorHandlerRGBField rgb(cloud);
+ viewer.addPointCloud (cloud, rgb, "input_cloud");
+ unsigned int k = 0;
+ for(std::vector >::iterator it = clusters.begin(); it != clusters.end(); ++it)
+ {
+ if(it->getPersonConfidence() > min_confidence) // draw only people with confidence above a threshold
+ {
+ // draw theoretical person bounding box in the PCL viewer:
+ it->drawTBoundingBox(viewer, k);
+ k++;
+ }
+ }
+ std::cout << k << " people found" << std::endl;
+ viewer.spinOnce();
+
+ // Display average framerate:
+ if (++count == 30)
+ {
+ double now = pcl::getTime ();
+ std::cout << "Average framerate: " << double(count)/double(now - last) << " Hz" << std::endl;
+ count = 0;
+ last = now;
+ }
+ cloud_mutex.unlock ();
+ }
+ }
+
+ return 0;
+}
diff --git a/examples/official/Applications/template_alignment.txt b/examples/official/Applications/template_alignment.txt
new file mode 100644
index 000000000..7d73d08be
--- /dev/null
+++ b/examples/official/Applications/template_alignment.txt
@@ -0,0 +1,311 @@
+# http://pointclouds.org/documentation/tutorials/template_alignment.php#template-alignment
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+class FeatureCloud
+{
+ public:
+ // A bit of shorthand
+ typedef pcl::PointCloud PointCloud;
+ typedef pcl::PointCloud SurfaceNormals;
+ typedef pcl::PointCloud LocalFeatures;
+ typedef pcl::search::KdTree SearchMethod;
+
+ FeatureCloud () :
+ search_method_xyz_ (new SearchMethod),
+ normal_radius_ (0.02f),
+ feature_radius_ (0.02f)
+ {}
+
+ ~FeatureCloud () {}
+
+ // Process the given cloud
+ void
+ setInputCloud (PointCloud::Ptr xyz)
+ {
+ xyz_ = xyz;
+ processInput ();
+ }
+
+ // Load and process the cloud in the given PCD file
+ void
+ loadInputCloud (const std::string &pcd_file)
+ {
+ xyz_ = PointCloud::Ptr (new PointCloud);
+ pcl::io::loadPCDFile (pcd_file, *xyz_);
+ processInput ();
+ }
+
+ // Get a pointer to the cloud 3D points
+ PointCloud::Ptr
+ getPointCloud () const
+ {
+ return (xyz_);
+ }
+
+ // Get a pointer to the cloud of 3D surface normals
+ SurfaceNormals::Ptr
+ getSurfaceNormals () const
+ {
+ return (normals_);
+ }
+
+ // Get a pointer to the cloud of feature descriptors
+ LocalFeatures::Ptr
+ getLocalFeatures () const
+ {
+ return (features_);
+ }
+
+ protected:
+ // Compute the surface normals and local features
+ void
+ processInput ()
+ {
+ computeSurfaceNormals ();
+ computeLocalFeatures ();
+ }
+
+ // Compute the surface normals
+ void
+ computeSurfaceNormals ()
+ {
+ normals_ = SurfaceNormals::Ptr (new SurfaceNormals);
+
+ pcl::NormalEstimation norm_est;
+ norm_est.setInputCloud (xyz_);
+ norm_est.setSearchMethod (search_method_xyz_);
+ norm_est.setRadiusSearch (normal_radius_);
+ norm_est.compute (*normals_);
+ }
+
+ // Compute the local feature descriptors
+ void
+ computeLocalFeatures ()
+ {
+ features_ = LocalFeatures::Ptr (new LocalFeatures);
+
+ pcl::FPFHEstimation fpfh_est;
+ fpfh_est.setInputCloud (xyz_);
+ fpfh_est.setInputNormals (normals_);
+ fpfh_est.setSearchMethod (search_method_xyz_);
+ fpfh_est.setRadiusSearch (feature_radius_);
+ fpfh_est.compute (*features_);
+ }
+
+ private:
+ // Point cloud data
+ PointCloud::Ptr xyz_;
+ SurfaceNormals::Ptr normals_;
+ LocalFeatures::Ptr features_;
+ SearchMethod::Ptr search_method_xyz_;
+
+ // Parameters
+ float normal_radius_;
+ float feature_radius_;
+};
+
+class TemplateAlignment
+{
+ public:
+
+ // A struct for storing alignment results
+ struct Result
+ {
+ float fitness_score;
+ Eigen::Matrix4f final_transformation;
+ EIGEN_MAKE_ALIGNED_OPERATOR_NEW
+ };
+
+ TemplateAlignment () :
+ min_sample_distance_ (0.05f),
+ max_correspondence_distance_ (0.01f*0.01f),
+ nr_iterations_ (500)
+ {
+ // Intialize the parameters in the Sample Consensus Intial Alignment (SAC-IA) algorithm
+ sac_ia_.setMinSampleDistance (min_sample_distance_);
+ sac_ia_.setMaxCorrespondenceDistance (max_correspondence_distance_);
+ sac_ia_.setMaximumIterations (nr_iterations_);
+ }
+
+ ~TemplateAlignment () {}
+
+ // Set the given cloud as the target to which the templates will be aligned
+ void
+ setTargetCloud (FeatureCloud &target_cloud)
+ {
+ target_ = target_cloud;
+ sac_ia_.setInputTarget (target_cloud.getPointCloud ());
+ sac_ia_.setTargetFeatures (target_cloud.getLocalFeatures ());
+ }
+
+ // Add the given cloud to the list of template clouds
+ void
+ addTemplateCloud (FeatureCloud &template_cloud)
+ {
+ templates_.push_back (template_cloud);
+ }
+
+ // Align the given template cloud to the target specified by setTargetCloud ()
+ void
+ align (FeatureCloud &template_cloud, TemplateAlignment::Result &result)
+ {
+ sac_ia_.setInputCloud (template_cloud.getPointCloud ());
+ sac_ia_.setSourceFeatures (template_cloud.getLocalFeatures ());
+
+ pcl::PointCloud registration_output;
+ sac_ia_.align (registration_output);
+
+ result.fitness_score = (float) sac_ia_.getFitnessScore (max_correspondence_distance_);
+ result.final_transformation = sac_ia_.getFinalTransformation ();
+ }
+
+ // Align all of template clouds set by addTemplateCloud to the target specified by setTargetCloud ()
+ void
+ alignAll (std::vector > &results)
+ {
+ results.resize (templates_.size ());
+ for (size_t i = 0; i < templates_.size (); ++i)
+ {
+ align (templates_[i], results[i]);
+ }
+ }
+
+ // Align all of template clouds to the target cloud to find the one with best alignment score
+ int
+ findBestAlignment (TemplateAlignment::Result &result)
+ {
+ // Align all of the templates to the target cloud
+ std::vector > results;
+ alignAll (results);
+
+ // Find the template with the best (lowest) fitness score
+ float lowest_score = std::numeric_limits::infinity ();
+ int best_template = 0;
+ for (size_t i = 0; i < results.size (); ++i)
+ {
+ const Result &r = results[i];
+ if (r.fitness_score < lowest_score)
+ {
+ lowest_score = r.fitness_score;
+ best_template = (int) i;
+ }
+ }
+
+ // Output the best alignment
+ result = results[best_template];
+ return (best_template);
+ }
+
+ private:
+ // A list of template clouds and the target to which they will be aligned
+ std::vector templates_;
+ FeatureCloud target_;
+
+ // The Sample Consensus Initial Alignment (SAC-IA) registration routine and its parameters
+ pcl::SampleConsensusInitialAlignment sac_ia_;
+ float min_sample_distance_;
+ float max_correspondence_distance_;
+ int nr_iterations_;
+};
+
+// Align a collection of object templates to a sample point cloud
+int
+main (int argc, char **argv)
+{
+ if (argc < 3)
+ {
+ printf ("No target PCD file given!\n");
+ return (-1);
+ }
+
+ // Load the object templates specified in the object_templates.txt file
+ std::vector object_templates;
+ std::ifstream input_stream (argv[1]);
+ object_templates.resize (0);
+ std::string pcd_filename;
+ while (input_stream.good ())
+ {
+ std::getline (input_stream, pcd_filename);
+ if (pcd_filename.empty () || pcd_filename.at (0) == '#') // Skip blank lines or comments
+ continue;
+
+ FeatureCloud template_cloud;
+ template_cloud.loadInputCloud (pcd_filename);
+ object_templates.push_back (template_cloud);
+ }
+ input_stream.close ();
+
+ // Load the target cloud PCD file
+ pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+ pcl::io::loadPCDFile (argv[2], *cloud);
+
+ // Preprocess the cloud by...
+ // ...removing distant points
+ const float depth_limit = 1.0;
+ pcl::PassThrough pass;
+ pass.setInputCloud (cloud);
+ pass.setFilterFieldName ("z");
+ pass.setFilterLimits (0, depth_limit);
+ pass.filter (*cloud);
+
+ // ... and downsampling the point cloud
+ const float voxel_grid_size = 0.005f;
+ pcl::VoxelGrid vox_grid;
+ vox_grid.setInputCloud (cloud);
+ vox_grid.setLeafSize (voxel_grid_size, voxel_grid_size, voxel_grid_size);
+ //vox_grid.filter (*cloud); // Please see this http://www.pcl-developers.org/Possible-problem-in-new-VoxelGrid-implementation-from-PCL-1-5-0-td5490361.html
+ pcl::PointCloud::Ptr tempCloud (new pcl::PointCloud);
+ vox_grid.filter (*tempCloud);
+ cloud = tempCloud;
+
+ // Assign to the target FeatureCloud
+ FeatureCloud target_cloud;
+ target_cloud.setInputCloud (cloud);
+
+ // Set the TemplateAlignment inputs
+ TemplateAlignment template_align;
+ for (size_t i = 0; i < object_templates.size (); ++i)
+ {
+ template_align.addTemplateCloud (object_templates[i]);
+ }
+ template_align.setTargetCloud (target_cloud);
+
+ // Find the best template alignment
+ TemplateAlignment::Result best_alignment;
+ int best_index = template_align.findBestAlignment (best_alignment);
+ const FeatureCloud &best_template = object_templates[best_index];
+
+ // Print the alignment fitness score (values less than 0.00002 are good)
+ printf ("Best fitness score: %f\n", best_alignment.fitness_score);
+
+ // Print the rotation matrix and translation vector
+ Eigen::Matrix3f rotation = best_alignment.final_transformation.block<3,3>(0, 0);
+ Eigen::Vector3f translation = best_alignment.final_transformation.block<3,1>(0, 3);
+
+ printf ("\n");
+ printf (" | %6.3f %6.3f %6.3f | \n", rotation (0,0), rotation (0,1), rotation (0,2));
+ printf ("R = | %6.3f %6.3f %6.3f | \n", rotation (1,0), rotation (1,1), rotation (1,2));
+ printf (" | %6.3f %6.3f %6.3f | \n", rotation (2,0), rotation (2,1), rotation (2,2));
+ printf ("\n");
+ printf ("t = < %0.3f, %0.3f, %0.3f >\n", translation (0), translation (1), translation (2));
+
+ // Save the aligned template for visualization
+ pcl::PointCloud transformed_cloud;
+ pcl::transformPointCloud (*best_template.getPointCloud (), transformed_cloud, best_alignment.final_transformation);
+ pcl::io::savePCDFileBinary ("output.pcd", transformed_cloud);
+
+ return (0);
+}
diff --git a/examples/official/Applications/vfh_cluster_classifier.txt b/examples/official/Applications/vfh_cluster_classifier.txt
new file mode 100644
index 000000000..cf6781a49
--- /dev/null
+++ b/examples/official/Applications/vfh_cluster_classifier.txt
@@ -0,0 +1,140 @@
+# Cluster Recognition and 6DOF Pose Estimation using VFH descriptors
+# http://pointclouds.org/documentation/tutorials/vfh_recognition.php#vfh-recognition
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+typedef std::pair > vfh_model;
+
+/** \brief Loads an n-D histogram file as a VFH signature
+ * \param path the input file name
+ * \param vfh the resultant VFH model
+ */
+bool
+loadHist (const boost::filesystem::path &path, vfh_model &vfh)
+{
+ int vfh_idx;
+ // Load the file as a PCD
+ try
+ {
+ pcl::PCLPointCloud2 cloud;
+ int version;
+ Eigen::Vector4f origin;
+ Eigen::Quaternionf orientation;
+ pcl::PCDReader r;
+ int type; unsigned int idx;
+ r.readHeader (path.string (), cloud, origin, orientation, version, type, idx);
+
+ vfh_idx = pcl::getFieldIndex (cloud, "vfh");
+ if (vfh_idx == -1)
+ return (false);
+ if ((int)cloud.width * cloud.height != 1)
+ return (false);
+ }
+ catch (const pcl::InvalidConversionException&)
+ {
+ return (false);
+ }
+
+ // Treat the VFH signature as a single Point Cloud
+ pcl::PointCloud point;
+ pcl::io::loadPCDFile (path.string (), point);
+ vfh.second.resize (308);
+
+ std::vector fields;
+ pcl::getFieldIndex (point, "vfh", fields);
+
+ for (size_t i = 0; i < fields[vfh_idx].count; ++i)
+ {
+ vfh.second[i] = point.points[0].histogram[i];
+ }
+ vfh.first = path.string ();
+ return (true);
+}
+
+/** \brief Load a set of VFH features that will act as the model (training data)
+ * \param argc the number of arguments (pass from main ())
+ * \param argv the actual command line arguments (pass from main ())
+ * \param extension the file extension containing the VFH features
+ * \param models the resultant vector of histogram models
+ */
+void
+loadFeatureModels (const boost::filesystem::path &base_dir, const std::string &extension,
+ std::vector &models)
+{
+ if (!boost::filesystem::exists (base_dir) && !boost::filesystem::is_directory (base_dir))
+ return;
+
+ for (boost::filesystem::directory_iterator it (base_dir); it != boost::filesystem::directory_iterator (); ++it)
+ {
+ if (boost::filesystem::is_directory (it->status ()))
+ {
+ std::stringstream ss;
+ ss << it->path ();
+ pcl::console::print_highlight ("Loading %s (%lu models loaded so far).\n", ss.str ().c_str (), (unsigned long)models.size ());
+ loadFeatureModels (it->path (), extension, models);
+ }
+ if (boost::filesystem::is_regular_file (it->status ()) && boost::filesystem::extension (it->path ()) == extension)
+ {
+ vfh_model m;
+ if (loadHist (base_dir / it->path ().filename (), m))
+ models.push_back (m);
+ }
+ }
+}
+
+int
+main (int argc, char** argv)
+{
+ if (argc < 2)
+ {
+ PCL_ERROR ("Need at least two parameters! Syntax is: %s [model_directory] [options]\n", argv[0]);
+ return (-1);
+ }
+
+ std::string extension (".pcd");
+ transform (extension.begin (), extension.end (), extension.begin (), (int(*)(int))tolower);
+
+ std::string kdtree_idx_file_name = "kdtree.idx";
+ std::string training_data_h5_file_name = "training_data.h5";
+ std::string training_data_list_file_name = "training_data.list";
+
+ std::vector models;
+
+ // Load the model histograms
+ loadFeatureModels (argv[1], extension, models);
+ pcl::console::print_highlight ("Loaded %d VFH models. Creating training data %s/%s.\n",
+ (int)models.size (), training_data_h5_file_name.c_str (), training_data_list_file_name.c_str ());
+
+ // Convert data into FLANN format
+ flann::Matrix data (new float[models.size () * models[0].second.size ()], models.size (), models[0].second.size ());
+
+ for (size_t i = 0; i < data.rows; ++i)
+ for (size_t j = 0; j < data.cols; ++j)
+ data[i][j] = models[i].second[j];
+
+ // Save data to disk (list of models)
+ flann::save_to_file (data, training_data_h5_file_name, "training_data");
+ std::ofstream fs;
+ fs.open (training_data_list_file_name.c_str ());
+ for (size_t i = 0; i < models.size (); ++i)
+ fs << models[i].first << "\n";
+ fs.close ();
+
+ // Build the tree index and save it to disk
+ pcl::console::print_error ("Building the kdtree index (%s) for %d elements...\n", kdtree_idx_file_name.c_str (), (int)data.rows);
+ flann::Index > index (data, flann::LinearIndexParams ());
+ //flann::Index > index (data, flann::KDTreeIndexParams (4));
+ index.buildIndex ();
+ index.save (kdtree_idx_file_name);
+ delete[] data.ptr ();
+
+ return (0);
+}
diff --git a/examples/official/Features/NormalEstimationUsingIntegralImages.py b/examples/official/Features/NormalEstimationUsingIntegralImages.py
new file mode 100644
index 000000000..8a8364519
--- /dev/null
+++ b/examples/official/Features/NormalEstimationUsingIntegralImages.py
@@ -0,0 +1,42 @@
+# Normal Estimation Using Integral Images
+# http://pointclouds.org/documentation/tutorials/normal_estimation_using_integral_images.php#normal-estimation-using-integral-images
+
+import pcl
+import pcl.pcl_visualization
+
+# cloud = pcl.load('table_scene_mug_stereo_textured.pcd')
+cloud = pcl.load('./examples/pcldata/tutorials/table_scene_mug_stereo_textured.pcd')
+
+print ('load table_scene_mug_stereo_textured.pcd')
+
+# estimate normals
+# pcl::PointCloud::Ptr normals (new pcl::PointCloud);
+# pcl::IntegralImageNormalEstimation ne;
+print ('make_IntegralImageNormalEstimation: ')
+ne = cloud.make_IntegralImageNormalEstimation()
+
+print ('set_NormalEstimation_Method_AVERAGE_3D_GRADIENT: ')
+ne.set_NormalEstimation_Method_AVERAGE_3D_GRADIENT ()
+print ('set_MaxDepthChange_Factor: ')
+ne.set_MaxDepthChange_Factor(0.02)
+print ('set_NormalSmoothingSize: ')
+ne.set_NormalSmoothingSize(10.0)
+print ('set OK')
+print ('compute2 - start')
+normals = ne.compute2(cloud)
+print ('compute2 - end')
+print (str(normals.size))
+
+# visualize normals
+viewer = pcl.pcl_visualization.PCLVisualizering()
+viewer.SetBackgroundColor (0.0, 0.0, 0.5)
+# viewer.addPointCloudNormals(cloud, normals);
+viewer.AddPointCloudNormals(cloud, normals)
+# viewer.AddPointCloud(cloud)
+
+flag = True
+while (flag):
+ flag != viewer.WasStopped ()
+ viewer.SpinOnce ()
+end
+
diff --git a/examples/official/Features/moment_of_inertia.py b/examples/official/Features/moment_of_inertia.py
new file mode 100644
index 000000000..8615be45a
--- /dev/null
+++ b/examples/official/Features/moment_of_inertia.py
@@ -0,0 +1,96 @@
+# Moment of inertia and eccentricity based descriptors
+# http://pointclouds.org/documentation/tutorials/moment_of_inertia.php#moment-of-inertia
+
+import pcl
+
+# int main (int argc, char** argv)
+# if (argc != 2)
+# return (0);
+
+cloud = pcl.load('./examples/pcldata/tutorials/lamppost.pcd')
+
+# 1.8
+# pcl::MomentOfInertiaEstimation feature_extractor;
+feature_extractor = cloud.make_MomentOfInertiaEstimation()
+# feature_extractor.setInputCloud (cloud)
+feature_extractor.compute ()
+
+# std::vector moment_of_inertia;
+# std::vector eccentricity;
+# pcl::PointXYZ min_point_AABB;
+# pcl::PointXYZ max_point_AABB;
+# pcl::PointXYZ min_point_OBB;
+# pcl::PointXYZ max_point_OBB;
+# pcl::PointXYZ position_OBB;
+# Eigen::Matrix3f rotational_matrix_OBB;
+# float major_value, middle_value, minor_value;
+# Eigen::Vector3f major_vector, middle_vector, minor_vector;
+# Eigen::Vector3f mass_center;
+#
+# feature_extractor.getMomentOfInertia (moment_of_inertia);
+# feature_extractor.getEccentricity (eccentricity);
+# feature_extractor.getAABB (min_point_AABB, max_point_AABB);
+# feature_extractor.getOBB (min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB);
+# feature_extractor.getEigenValues (major_value, middle_value, minor_value);
+# feature_extractor.getEigenVectors (major_vector, middle_vector, minor_vector);
+# feature_extractor.getMassCenter (mass_center);
+###
+moment_of_inertia = feature_extractor.get_MomentOfInertia ()
+eccentricity = feature_extractor.get_Eccentricity ()
+[min_point_AABB, max_point_AABB] = feature_extractor.get_AABB ();
+[min_point_OBB, max_point_OBB, position_OBB, rotational_matrix_OBB] = feature_extractor.get_OBB ()
+[major_value, middle_value, minor_value] = feature_extractor.get_EigenValues ()
+[major_vector, middle_vector, minor_vector] = feature_extractor.get_EigenVectors ()
+mass_center = feature_extractor.get_MassCenter ()
+
+
+# View
+# boost::shared_ptr viewer (new pcl::visualization::PCLVisualizer ("3D Viewer"));
+# viewer->setBackgroundColor (0, 0, 0);
+# viewer->addCoordinateSystem (1.0);
+# viewer->initCameraParameters ();
+# viewer->addPointCloud (cloud, "sample cloud");
+# viewer->addCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");
+###
+viewer = pcl.visualization.PCLVisualizing()
+viewer.SetBackgroundColor(0, 0, 0)
+viewer->InitCameraParameters ()
+# viewer->AddPointCloud (cloud, 'sample cloud', 0)
+viewer->AddPointCloud (cloud)
+viewer.AddCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");
+
+
+# Eigen::Vector3f position (position_OBB.x, position_OBB.y, position_OBB.z);
+# Eigen::Quaternionf quat (rotational_matrix_OBB);
+# viewer->addCube (position, quat, max_point_OBB.x - min_point_OBB.x, max_point_OBB.y - min_point_OBB.y, max_point_OBB.z - min_point_OBB.z, "OBB");
+viewer.AddCube (min_point_AABB.x, max_point_AABB.x, min_point_AABB.y, max_point_AABB.y, min_point_AABB.z, max_point_AABB.z, 1.0, 1.0, 0.0, "AABB");
+
+
+# pcl::PointXYZ center (mass_center (0), mass_center (1), mass_center (2));
+# pcl::PointXYZ x_axis (major_vector (0) + mass_center (0), major_vector (1) + mass_center (1), major_vector (2) + mass_center (2));
+# pcl::PointXYZ y_axis (middle_vector (0) + mass_center (0), middle_vector (1) + mass_center (1), middle_vector (2) + mass_center (2));
+# pcl::PointXYZ z_axis (minor_vector (0) + mass_center (0), minor_vector (1) + mass_center (1), minor_vector (2) + mass_center (2));
+# viewer->addLine (center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");
+# viewer->addLine (center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");
+# viewer->addLine (center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");
+center = pcl.PointCloud(mass_center[0], mass_center[1], mass_center[2])
+x_axis = pcl.PointCloud(major_vector [0] + mass_center [0], major_vector [1] + mass_center [1], major_vector [2] + mass_center [2])
+y_axis = pcl.PointCloud(middle_vector [0] + mass_center [0], middle_vector [1] + mass_center [1], middle_vector [2] + mass_center [2])
+z_axis = pcl.PointCloud(minor_vector [0] + mass_center [0], minor_vector [1] + mass_center [1], minor_vector [2] + mass_center [2])
+viewer.AddLine (center, x_axis, 1.0f, 0.0f, 0.0f, "major eigen vector");
+viewer.AddLine (center, y_axis, 0.0f, 1.0f, 0.0f, "middle eigen vector");
+viewer.AddLine (center, z_axis, 0.0f, 0.0f, 1.0f, "minor eigen vector");
+
+
+# while(!viewer->wasStopped())
+# {
+# viewer->spinOnce (100);
+# boost::this_thread::sleep (boost::posix_time::microseconds (100000));
+# }
+while True:
+ visual.WasStopped()
+ # visual.spinOnce (100);
+ # boost::this_thread::sleep (boost::posix_time::microseconds (100000));
+end
+
+
diff --git a/examples/official/Features/rops_feature.py b/examples/official/Features/rops_feature.py
new file mode 100644
index 000000000..32c70ce93
--- /dev/null
+++ b/examples/official/Features/rops_feature.py
@@ -0,0 +1,78 @@
+# RoPs (Rotational Projection Statistics) feature
+# http://pointclouds.org/documentation/tutorials/rops_feature.php#rops-feature
+
+import pcl
+import sys
+# int main (int argc, char** argv)
+
+argvs = sys.argv # R}hCi[Xg̎擾
+argc = len(argvs) # ̌
+
+if argc != 4:
+ exit(-1)
+
+cloud = pcl.load('')
+
+# pcl::PointIndicesPtr indices = boost::shared_ptr (new pcl::PointIndices ());
+# std::ifstream indices_file;
+# indices_file.open (argv[2], std::ifstream::in);
+# for (std::string line; std::getline (indices_file, line);)
+# {
+# std::istringstream in (line);
+# unsigned int index = 0;
+# in >> index;
+# indices->indices.push_back (index - 1);
+# }
+# indices_file.close ();
+###
+# indices = pcl.PointIndices()
+# argvs[2]
+
+# std::vector triangles;
+# std::ifstream triangles_file;
+# triangles_file.open (argv[3], std::ifstream::in);
+# for (std::string line; std::getline (triangles_file, line);)
+# {
+# pcl::Vertices triangle;
+# std::istringstream in (line);
+# unsigned int vertex = 0;
+# in >> vertex;
+# triangle.vertices.push_back (vertex - 1);
+# in >> vertex;
+# triangle.vertices.push_back (vertex - 1);
+# in >> vertex;
+# triangle.vertices.push_back (vertex - 1);
+# triangles.push_back (triangle);
+# }
+###
+#triangles = pcl.Vertices
+# argvs[3]
+
+# float support_radius = 0.0285f
+# unsigned int number_of_partition_bins = 5
+# unsigned int number_of_rotations = 3
+support_radius = 0.0285
+number_of_partition_bins = 5
+number_of_rotations = 3
+
+
+# pcl::search::KdTree::Ptr search_method (new pcl::search::KdTree);
+# search_method->setInputCloud (cloud);
+search_method = cloud.make_kdtree()
+
+# pcl::ROPSEstimation > feature_estimator;
+feature_estimator = cloud.make_ROPSEstimation()
+feature_estimator.setSearchMethod (search_method);
+feature_estimator.setSearchSurface (cloud);
+feature_estimator.setInputCloud (cloud);
+feature_estimator.setIndices (indices);
+feature_estimator.setTriangles (triangles);
+feature_estimator.setRadiusSearch (support_radius);
+feature_estimator.setNumberOfPartitionBins (number_of_partition_bins);
+feature_estimator.setNumberOfRotations (number_of_rotations);
+feature_estimator.setSupportRadius (support_radius);
+
+# pcl::PointCloud >::Ptr histograms (new pcl::PointCloud > ());
+# feature_estimator.compute (*histograms);
+histograms = feature_estimator.compute()
+
diff --git a/examples/official/Filtering/PassThroughFilter.py b/examples/official/Filtering/PassThroughFilter.py
new file mode 100644
index 000000000..5fce39c18
--- /dev/null
+++ b/examples/official/Filtering/PassThroughFilter.py
@@ -0,0 +1,58 @@
+# -*- coding: utf-8 -*-
+# Filtering a PointCloud using a PassThrough filter
+# http://pointclouds.org/documentation/tutorials/passthrough.php#passthrough
+
+
+#
+import numpy as np
+import pcl
+import random
+
+# int main (int argc, char** argv)
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+cloud = pcl.PointCloud()
+# pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);
+# cloud_filtered = pcl.PointCloud()
+
+# // Fill in the cloud data
+# cloud->width = 5;
+# cloud->height = 1;
+# cloud->points.resize (cloud->width * cloud->height);
+points = np.zeros((5, 3), dtype=np.float32)
+RAND_MAX = 1024
+
+for i in range(0, 5):
+ points[i][0] = 1024 * random.random () / RAND_MAX
+ points[i][1] = 1024 * random.random () / RAND_MAX
+ points[i][2] = 1024 * random.random () / RAND_MAX
+
+cloud.from_array(points)
+
+# std::cerr << "Cloud before filtering: " << std::endl;
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# for i in range(0, 5):
+# std::cerr << " " << cloud->points[i].x << " "
+# << cloud->points[i].y << " "
+# << cloud->points[i].z << std::endl;
+print ('Cloud before filtering: ')
+for i in range(0, cloud.size):
+ print ('x: ' + str(cloud[i][0]) + ', y : ' + str(cloud[i][1]) + ', z : ' + str(cloud[i][2]))
+
+# Create the filtering object
+# pcl::PassThrough pass;
+# pass.setInputCloud (cloud);
+# define pass , NG
+passthrough = cloud.make_passthrough_filter()
+passthrough.set_filter_field_name ("z")
+passthrough.set_filter_limits (0.0, 0.5)
+# //pass.setFilterLimitsNegative (true)
+cloud_filtered = passthrough.filter ()
+
+# std::cerr << "Cloud after filtering: " << std::endl;
+# for (size_t i = 0; i < cloud_filtered->points.size (); ++i)
+# std::cerr << " " << cloud_filtered->points[i].x << " "
+# << cloud_filtered->points[i].y << " "
+# << cloud_filtered->points[i].z << std::endl;
+print ('Cloud after filtering: ')
+for i in range(0, cloud_filtered.size):
+ print ('x: ' + str(cloud_filtered[i][0]) + ', y : ' + str(cloud_filtered[i][1]) + ', z : ' + str(cloud_filtered[i][2]))
diff --git a/examples/official/Filtering/VoxelGrid_160.py b/examples/official/Filtering/VoxelGrid_160.py
new file mode 100644
index 000000000..486c9c956
--- /dev/null
+++ b/examples/official/Filtering/VoxelGrid_160.py
@@ -0,0 +1,33 @@
+# -*- coding: utf-8 -*-
+# http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid
+# http://derivecv.tumblr.com/post/13631147204
+# http://nisot0710.blogspot.jp/2014/09/pclvoxelgridpclpointcloud2.html
+# PCLPointCloud2 is 1.7.2
+
+import pcl
+
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud ());
+# pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud ());
+#
+# pcl::PCDReader reader;
+# reader.read("pcdfilename", *cloud);
+cloud = pcl.load('./examples/pcldata/tutorials/table_scene_lms400.pcd')
+
+# std::cerr<<"PointCloud befor filtering: " << cloud->width * cloud->height << "data points ( " << pcl::getFieldsList (*cloud) << ").";
+# print('PointCloud befor filtering: ' + str(cloud.width * cloud.height) + 'data points ( ' + pcl.getFieldsList (cloud) + ').')
+
+# pcl::VoxelGrid sor;
+# sor.setInputCloud(cloud);
+# sor.setLeafSize(0.1f, 0.1f, 0.1f);
+# sor.filter(*cloud_filtered);
+sor = cloud.make_voxel_grid_filter()
+sor.set_leaf_size(0.1, 0.1, 0.1)
+cloud_filtered = sor.filter()
+
+# std::cerr<<"PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << "data points (" << pcl::getFieldsList(*cloud_filtered) <<").";
+# print('PointCloud after filtering: ' + str(cloud_filtered.width * cloud_filtered.height) + 'data points ( ' + pcl.getFieldsList (cloud) + ').')
+
+# pcl::PCDWriter writer;
+# writer.write("savefilename", *cloud_filtered, false);
+pcl.save(cloud_filtered, 'table_scene_lms400_voxelfilter.pcd')
+
diff --git a/examples/official/Filtering/VoxelGrid_172.txt b/examples/official/Filtering/VoxelGrid_172.txt
new file mode 100644
index 000000000..a21004364
--- /dev/null
+++ b/examples/official/Filtering/VoxelGrid_172.txt
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# http://pointclouds.org/documentation/tutorials/voxel_grid.php#voxelgrid
+# http://derivecv.tumblr.com/post/13631147204
+# http://nisot0710.blogspot.jp/2014/09/pclvoxelgridpclpointcloud2.html
+# PCLPointCloud2 is 1.7.2
+
+import pcl
+
+# int main (int argc, char** argv)
+{
+ pcl::PCLPointCloud2::Ptr cloud (new pcl::PCLPointCloud2 ());
+ pcl::PCLPointCloud2::Ptr cloud_filtered (new pcl::PCLPointCloud2 ());
+
+ // Fill in the cloud data
+ pcl::PCDReader reader;
+ // Replace the path below with the path where you saved your file
+ reader.read ("./examples/pcldata/tutorials/table_scene_lms400.pcd", *cloud); // Remember to download the file first!
+
+ std::cerr << "PointCloud before filtering: " << cloud->width * cloud->height
+ << " data points (" << pcl::getFieldsList (*cloud) << ").";
+
+ // Create the filtering object
+ pcl::VoxelGrid sor;
+ sor.setInputCloud (cloud);
+ sor.setLeafSize (0.01f, 0.01f, 0.01f);
+ sor.filter (*cloud_filtered);
+
+ std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height
+ << " data points (" << pcl::getFieldsList (*cloud_filtered) << ").";
+
+ pcl::PCDWriter writer;
+ writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered,
+ Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), false);
+
+ return (0);
+}
diff --git a/examples/official/Filtering/extract_indices.py b/examples/official/Filtering/extract_indices.py
new file mode 100644
index 000000000..42359a434
--- /dev/null
+++ b/examples/official/Filtering/extract_indices.py
@@ -0,0 +1,86 @@
+# -*- coding: utf-8 -*-
+# Extracting indices from a PointCloud
+# http://pointclouds.org/documentation/tutorials/extract_indices.php#extract-indices
+# PCLPointCloud2 is 1.7.2
+
+import pcl
+
+# int main (int argc, char** argv)
+# pcl::PCLPointCloud2::Ptr cloud_blob (new pcl::PCLPointCloud2), cloud_filtered_blob (new pcl::PCLPointCloud2);
+# pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud), cloud_p (new pcl::PointCloud), cloud_f (new pcl::PointCloud);
+
+# cloud_filtered = pcl.
+
+# Fill in the cloud data
+# pcl::PCDReader reader;
+# reader.read ("table_scene_lms400.pcd", *cloud_blob);
+# std::cerr << "PointCloud before filtering: " << cloud_blob->width * cloud_blob->height << " data points." << std::endl;
+cloud_blob = pcl.load('./examples/pcldata/tutorials/table_scene_lms400.pcd')
+print("PointCloud before filtering: " + str(cloud_blob.width * cloud_blob.height) + " data points.")
+
+# Create the filtering object: downsample the dataset using a leaf size of 1cm
+# pcl::VoxelGrid sor;
+# sor.setInputCloud (cloud_blob);
+# sor.setLeafSize (0.01f, 0.01f, 0.01f);
+# sor.filter (*cloud_filtered_blob);
+sor = cloud_blob.make_VexelGrid()
+sor.set_LeafSize(0.01, 0.01, 0.01)
+cloud_filtered_blob = sor.filter()
+
+# // Convert to the templated PointCloud
+# pcl::fromPCLPointCloud2 (*cloud_filtered_blob, *cloud_filtered);
+# std::cerr << "PointCloud after filtering: " << cloud_filtered->width * cloud_filtered->height << " data points." << std::endl;
+cloud_filtered = cloud_filtered_blob.from___
+print("PointCloud after filtering: " + (cloud_filtered.width * cloud_filtered.height) + " data points.")
+
+# Write the downsampled version to disk
+# pcl::PCDWriter writer;
+# writer.write ("table_scene_lms400_downsampled.pcd", *cloud_filtered, false);
+pcl.save("table_scene_lms400_downsampled.pcd", cloud_filtered)
+
+# pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
+# pcl::PointIndices::Ptr inliers (new pcl::PointIndices ());
+# // Create the segmentation object
+# pcl::SACSegmentation seg;
+# // Optional
+# seg.setOptimizeCoefficients (true);
+# // Mandatory
+# seg.setModelType (pcl::SACMODEL_PLANE);
+# seg.setMethodType (pcl::SAC_RANSAC);
+# seg.setMaxIterations (1000);
+# seg.setDistanceThreshold (0.01);
+
+# // Create the filtering object
+# pcl::ExtractIndices extract;
+#
+# int i = 0, nr_points = (int) cloud_filtered->points.size ();
+# // While 30% of the original cloud is still there
+# while (cloud_filtered->points.size () > 0.3 * nr_points)
+# {
+# // Segment the largest planar component from the remaining cloud
+# seg.setInputCloud (cloud_filtered);
+# seg.segment (*inliers, *coefficients);
+# if (inliers->indices.size () == 0)
+# {
+# std::cerr << "Could not estimate a planar model for the given dataset." << std::endl;
+# break;
+# }
+#
+# // Extract the inliers
+# extract.setInputCloud (cloud_filtered);
+# extract.setIndices (inliers);
+# extract.setNegative (false);
+# extract.filter (*cloud_p);
+# std::cerr << "PointCloud representing the planar component: " << cloud_p->width * cloud_p->height << " data points." << std::endl;
+#
+# std::stringstream ss;
+# ss << "table_scene_lms400_plane_" << i << ".pcd";
+# writer.write (ss.str (), *cloud_p, false);
+#
+# // Create the filtering object
+# extract.setNegative (true);
+# extract.filter (*cloud_f);
+# cloud_filtered.swap (cloud_f);
+# i++;
+# }
+
diff --git a/examples/official/Filtering/project_inliers.py b/examples/official/Filtering/project_inliers.py
new file mode 100644
index 000000000..1373378f8
--- /dev/null
+++ b/examples/official/Filtering/project_inliers.py
@@ -0,0 +1,71 @@
+# Projecting points using a parametric model
+# http://pointclouds.org/documentation/tutorials/project_inliers.php#project-inliers
+
+import pcl
+import numpy as np
+import random
+
+# int main (int argc, char** argv)
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+# pcl::PointCloud::Ptr cloud_projected (new pcl::PointCloud);
+cloud = pcl.PointCloud()
+cloud_projected = pcl.PointCloud()
+
+# // Fill in the cloud data
+# cloud->width = 5;
+# cloud->height = 1;
+# cloud->points.resize (cloud->width * cloud->height);
+#
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# {
+# cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
+# cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
+# cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
+# }
+# x,y,z
+points = np.zeros((5, 3), dtype=np.float32)
+RAND_MAX = 1.0
+for i in range(0, 5):
+ points[i][0] = 1024 * random.random () / RAND_MAX
+ points[i][1] = 1024 * random.random () / RAND_MAX
+ points[i][2] = 1024 * random.random () / RAND_MAX
+
+cloud.from_array(points)
+
+# std::cerr << "Cloud before projection: " << std::endl;
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# std::cerr << " " << cloud->points[i].x << " "
+# << cloud->points[i].y << " "
+# << cloud->points[i].z << std::endl;
+print ('Cloud before projection: ')
+for i in range(0, cloud.size):
+ print ('x: ' + str(cloud[i][0]) + ', y : ' + str(cloud[i][1]) + ', z : ' + str(cloud[i][2]))
+
+# segment parts
+# // Create a set of planar coefficients with X=Y=0, Z=1
+# pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
+# coefficients->values.resize (4);
+# coefficients->values[0] = coefficients->values[1] = 0;
+# coefficients->values[2] = 1.0;
+# coefficients->values[3] = 0;
+#
+# Create the filtering object
+# pcl::ProjectInliers proj;
+# proj.setModelType (pcl::SACMODEL_PLANE);
+# proj.setInputCloud (cloud);
+# proj.setModelCoefficients (coefficients);
+# proj.filter (*cloud_projected);
+proj = cloud.make_ProjectInliers()
+proj.set_model_type (pcl.SACMODEL_PLANE)
+# proj.setModelCoefficients (coefficients);
+cloud_projected = proj.filter()
+
+# std::cerr << "Cloud after projection: " << std::endl;
+# for (size_t i = 0; i < cloud_projected->points.size (); ++i)
+# std::cerr << " " << cloud_projected->points[i].x << " "
+# << cloud_projected->points[i].y << " "
+# << cloud_projected->points[i].z << std::endl;
+print ('Cloud after projection: ')
+for i in range(0, cloud_projected.size):
+ print ('x: ' + str(cloud_projected[i][0]) + ', y : ' + str(cloud_projected[i][1]) + ', z : ' + str(cloud_projected[i][2]))
+
diff --git a/examples/official/Filtering/remove_outliers.py b/examples/official/Filtering/remove_outliers.py
new file mode 100644
index 000000000..b5867372e
--- /dev/null
+++ b/examples/official/Filtering/remove_outliers.py
@@ -0,0 +1,119 @@
+# Removing outliers using a Conditional or RadiusOutlier removal
+# http://pointclouds.org/documentation/tutorials/remove_outliers.php#remove-outliers
+
+import pcl
+import numpy as np
+import random
+
+import argparse
+
+parser = argparse.ArgumentParser(description='PointCloudLibrary example: Remove outliers')
+parser.add_argument('--Removal', '-r', choices=('Radius', 'Condition'), default='',
+ help='RadiusOutlier/Condition Removal')
+args = parser.parse_args()
+
+
+# int main (int argc, char** argv)
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+# pcl::PointCloud::Ptr cloud_filtered (new pcl::PointCloud);
+cloud = pcl.PointCloud()
+cloud_filtered = pcl.PointCloud()
+
+# // Fill in the cloud data
+# cloud->width = 5;
+# cloud->height = 1;
+# cloud->points.resize (cloud->width * cloud->height);
+#
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# {
+# cloud->points[i].x = 1024 * rand () / (RAND_MAX + 1.0f);
+# cloud->points[i].y = 1024 * rand () / (RAND_MAX + 1.0f);
+# cloud->points[i].z = 1024 * rand () / (RAND_MAX + 1.0f);
+# }
+#
+# x,y,z
+points = np.zeros((5, 3), dtype=np.float32)
+RAND_MAX = 1024.0
+for i in range(0, 5):
+ points[i][0] = 1024 * random.random () / RAND_MAX
+ points[i][1] = 1024 * random.random () / RAND_MAX
+ points[i][2] = 1024 * random.random () / RAND_MAX
+
+cloud.from_array(points)
+
+
+# if (strcmp(argv[1], "-r") == 0)
+# {
+# pcl::RadiusOutlierRemoval outrem;
+ # // build the filter
+ # outrem.setInputCloud(cloud);
+ # outrem.setRadiusSearch(0.8);
+ # outrem.setMinNeighborsInRadius (2);
+ # // apply filter
+ # outrem.filter (*cloud_filtered);
+# }
+# else if (strcmp(argv[1], "-c") == 0)
+# {
+ # // build the condition
+ # pcl::ConditionAnd::Ptr range_cond (new pcl::ConditionAnd ());
+ # range_cond->addComparison (pcl::FieldComparison::ConstPtr (
+ # new pcl::FieldComparison ("z", pcl::ComparisonOps::GT, 0.0)));
+ #
+ # range_cond->addComparison (pcl::FieldComparison::ConstPtr (
+ # new pcl::FieldComparison ("z", pcl::ComparisonOps::LT, 0.8)));
+ #
+ # // build the filter
+ # pcl::ConditionalRemoval condrem (range_cond);
+ # condrem.setInputCloud (cloud);
+ # condrem.setKeepOrganized(true);
+ # // apply filter
+ # condrem.filter (*cloud_filtered);
+# }
+# else
+# {
+# std::cerr << "please specify command line arg '-r' or '-c'" << std::endl;
+# exit(0);
+# }
+if args.Removal == 'Radius':
+ outrem = cloud.make_RadiusOutlierRemoval()
+ outrem.set_radius_search(0.8)
+ outrem.set_MinNeighborsInRadius(2)
+ cloud_filtered = outrem.filter ()
+elif args.Removal == 'Condition':
+ range_cond = cloud.make_ConditionAnd()
+
+ range_cond.add_Comparison2('z', pcl.CythonCompareOp_Type.GT, 0.0)
+ range_cond.add_Comparison2('z', pcl.CythonCompareOp_Type.LT, 0.8)
+
+ # build the filter
+ condrem = cloud.make_ConditionalRemoval(range_cond)
+ condrem.set_KeepOrganized(True)
+ # apply filter
+ cloud_filtered = condrem.filter ()
+
+ # Test
+ # cloud_filtered = cloud
+else:
+ print("please specify command line arg paramter 'Radius' or 'Condition'")
+
+
+# std::cerr << "Cloud before filtering: " << std::endl;
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# std::cerr << " " << cloud->points[i].x << " "
+# << cloud->points[i].y << " "
+# << cloud->points[i].z << std::endl;
+# // display pointcloud after filtering
+print ('Cloud before filtering: ')
+for i in range(0, cloud.size):
+ print ('x: ' + str(cloud[i][0]) + ', y : ' + str(cloud[i][1]) + ', z : ' + str(cloud[i][2]))
+
+# std::cerr << "Cloud after filtering: " << std::endl;
+# for (size_t i = 0; i < cloud_filtered->points.size (); ++i)
+# std::cerr << " " << cloud_filtered->points[i].x << " "
+# << cloud_filtered->points[i].y << " "
+# << cloud_filtered->points[i].z << std::endl;
+print ('Cloud after filtering: ')
+for i in range(0, cloud_filtered.size):
+ print ('x: ' + str(cloud_filtered[i][0]) + ', y : ' + str(cloud_filtered[i][1]) + ', z : ' + str(cloud_filtered[i][2]))
+
+
diff --git a/examples/official/Filtering/statistical_removal.py b/examples/official/Filtering/statistical_removal.py
new file mode 100644
index 000000000..3b102d9ed
--- /dev/null
+++ b/examples/official/Filtering/statistical_removal.py
@@ -0,0 +1,16 @@
+# Removing outliers using a StatisticalOutlierRemoval filter
+# http://pointclouds.org/documentation/tutorials/statistical_outlier.php#statistical-outlier-removal
+
+import pcl
+
+p = pcl.load('./examples/pcldata/tutorials/table_scene_lms400.pcd')
+
+
+fil = p.make_statistical_outlier_filter()
+fil.set_mean_k(50)
+fil.set_std_dev_mul_thresh(1.0)
+
+pcl.save(fil.filter(), "table_scene_lms400_inliers.pcd")
+
+fil.set_negative(True)
+pcl.save(fil.filter(), "table_scene_lms400_outliers.pcd")
diff --git a/examples/official/GPU/people_detect_172.txt b/examples/official/GPU/people_detect_172.txt
new file mode 100644
index 000000000..b86bdecb6
--- /dev/null
+++ b/examples/official/GPU/people_detect_172.txt
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+# Detecting people and their poses using PointCloud Library
+# http://pointclouds.org/documentation/tutorials/gpu_people.php#gpu-people
+
+# int main(int argc, char** argv)
+# selecting GPU and prining info
+# int device = 0;
+# pc::parse_argument (argc, argv, "-gpu", device);
+# pcl::gpu::setDevice (device);
+# pcl::gpu::printShortCudaDeviceInfo (device);
+device = 0
+pcl::gpu::setDevice (device)
+pcl::gpu::printShortCudaDeviceInfo (device)
+
+# // selecting data source
+# boost::shared_ptr capture;
+# capture.reset( new pcl::OpenNIGrabber() );
+## Python
+# capture = pcl.???
+##
+
+# //selecting tree files
+# vector tree_files;
+# tree_files.push_back("Data/forest1/tree_20.txt");
+# tree_files.push_back("Data/forest2/tree_20.txt");
+# tree_files.push_back("Data/forest3/tree_20.txt");
+# tree_files.push_back("Data/forest4/tree_20.txt");
+
+# pc::parse_argument (argc, argv, "-tree0", tree_files[0]);
+# pc::parse_argument (argc, argv, "-tree1", tree_files[1]);
+# pc::parse_argument (argc, argv, "-tree2", tree_files[2]);
+# pc::parse_argument (argc, argv, "-tree3", tree_files[3]);
+
+# int num_trees = (int)tree_files.size();
+# pc::parse_argument (argc, argv, "-numTrees", num_trees);
+
+# tree_files.resize(num_trees);
+# if (num_trees == 0 || num_trees > 4) return cout << "Invalid number of trees" << endl, -1;
+
+# try
+# {
+# // loading trees
+# typedef pcl::gpu::people::RDFBodyPartsDetector RDFBodyPartsDetector;
+# RDFBodyPartsDetector::Ptr rdf(new RDFBodyPartsDetector(tree_files));
+# PCL_INFO("Loaded files into rdf");
+#
+# // Create the app
+# PeoplePCDApp app(*capture);
+# app.people_detector_.rdf_detector_ = rdf;
+#
+# // executing
+# app.startMainLoop ();
+# }
+# catch (const pcl::PCLException& e) { cout << "PCLException: " << e.detailedMessage() << endl; }
+# catch (const std::runtime_error& e) { cout << e.what() << endl; }
+# catch (const std::bad_alloc& /*e*/) { cout << "Bad alloc" << endl; }
+# catch (const std::exception& /*e*/) { cout << "Exception" << endl; }
+###
+
+
diff --git a/examples/official/IO/pcd_read.py b/examples/official/IO/pcd_read.py
new file mode 100644
index 000000000..b5819fc0e
--- /dev/null
+++ b/examples/official/IO/pcd_read.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+#
+# #include
+# #include
+# #include
+#
+# int main (int argc, char** argv)
+# {
+# pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
+#
+# if (pcl::io::loadPCDFile ("test_pcd.pcd", *cloud) == -1) //* load the file
+# {
+# PCL_ERROR ("Couldn't read file test_pcd.pcd \n");
+# return (-1);
+# }
+# std::cout << "Loaded "
+# << cloud->width * cloud->height
+# << " data points from test_pcd.pcd with the following fields: "
+# << std::endl;
+# for (size_t i = 0; i < cloud->points.size (); ++i)
+# std::cout << " " << cloud->points[i].x
+# << " " << cloud->points[i].y
+# << " " << cloud->points[i].z << std::endl;
+#
+# return (0);
+# }
+
+import pcl
+
+cloud = pcl.load('./examples/official/IO/test_pcd.pcd')
+
+print ('Loaded ' + str(cloud.width * cloud.height) + ' data points from test_pcd.pcd with the following fields: ')
+for i in range(0, cloud.size):
+ print ('x: ' + str(cloud[i][0]) + ', y : ' + str(cloud[i][1]) + ', z : ' + str(cloud[i][2]))
diff --git a/examples/official/IO/test_pcd.pcd b/examples/official/IO/test_pcd.pcd
new file mode 100644
index 000000000..6c14e8741
--- /dev/null
+++ b/examples/official/IO/test_pcd.pcd
@@ -0,0 +1,1782 @@
+# .PCD v0.7 - Point Cloud Data file format
+VERSION 0.7
+FIELDS x y z
+SIZE 4 4 4
+TYPE F F F
+COUNT 1 1 1
+WIDTH 1771
+HEIGHT 1
+VIEWPOINT 0 0 0 1 0 0 0
+POINTS 1771
+DATA ascii
+-10 0 0
+-10.015625 0 0.042999268
+-10.015625 0 0.10300064
+-10.046875 0 0.15100098
+-10.0625 0 0.20299911
+-9.984375 0 -0.125
+-10 0 -0.091999054
+-10.015625 0 -0.041000366
+-10.015625 0 0.012001038
+-10.046875 0 0.076000214
+-10.046875 0.03125 0.12200165
+-10.0625 0.03125 0.16699982
+-10.078125 0.03125 0.2140007
+-10.109375 0.03125 0.26399994
+-9.984375 0 -0.21999741
+-10 0 -0.17300034
+-10.015625 0 -0.13000107
+-10.015625 0 -0.065998077
+-10.015625 0.03125 -0.0060005188
+-10.0625 0.0625 0.14900208
+-10.09375 0.0625 0.19599915
+-10.109375 0.03125 0.22800064
+-10.140625 0.03125 0.26700211
+-9.96875 0 -0.34199905
+-10 0 -0.31499863
+-10 0 -0.26300049
+-10.015625 0 -0.20899963
+-10.015625 0 -0.15200043
+-10.015625 0.03125 -0.085998535
+-10.140625 0.0625 0.25
+-10.171875 0.0625 0.28300095
+-10.1875 0.0625 0.32799911
+-9.96875 0 -0.46199799
+-9.984375 0 -0.43499756
+-10 0 -0.39500046
+-10 0 -0.34499741
+-10.015625 0 -0.29499817
+-10.015625 0.03125 -0.23600006
+-10.15625 0.09375 0.27700043
+-10.1875 0.09375 0.29400253
+-10.21875 0.09375 0.32900238
+-9.984375 0 -0.56399918
+-9.984375 0 -0.52000046
+-10 0 -0.47399902
+-10 0.03125 -0.41799927
+-10 0 -0.36899948
+-10 0.03125 -0.30500031
+-10.21875 0.09375 0.30500031
+-10.25 0.09375 0.33800125
+-9.96875 0 -0.68099976
+-9.984375 0 -0.64699936
+-10 0 -0.60400009
+-10 0 -0.55299759
+-10 0 -0.50600052
+-10 0.03125 -0.44300079
+-10.25 0.125 0.31900024
+-10.265625 0.09375 0.34600067
+-9.96875 0 -0.79399872
+-9.984375 0 -0.75600052
+-9.984375 0 -0.7140007
+-9.984375 0 -0.66999817
+-10 0.03125 -0.62199783
+-10 0.03125 -0.5739975
+-10 0.03125 -0.51900101
+-10.265625 0.125 0.32500076
+-10.3125 0.125 0.34400177
+-9.96875 0 -0.90699768
+-9.984375 0 -0.875
+-9.984375 0 -0.82999802
+-9.984375 0 -0.79000092
+-10 0 -0.74399948
+-10 0.03125 -0.6969986
+-10 0.03125 -0.64699936
+-10.3125 0.15625 0.32699966
+-10.328125 0.125 0.35200119
+-9.953125 0 -1.0149994
+-9.96875 0 -0.97900009
+-9.984375 0 -0.94400024
+-9.984375 0 -0.90100098
+-9.984375 0 -0.85499954
+-10 0.03125 -0.81299973
+-10 0.03125 -0.76699829
+-10.328125 0.15625 0.33300018
+-10.359375 0.15625 0.35499954
+-9.921875 0 -1.1469994
+-9.9375 -0.03125 -1.1240005
+-9.96875 0 -1.0879974
+-9.984375 0 -1.0550003
+-9.984375 0 -1.0109978
+-9.984375 0 -0.97200012
+-10 0.03125 -0.92799759
+-10 0.03125 -0.88499832
+-10.359375 0.1875 0.34000015
+-10.40625 0.15625 0.35900116
+-9.9375 -0.03125 -1.257
+-9.953125 0 -1.2229996
+-9.96875 0 -1.1919975
+-9.96875 0 -1.1529999
+-9.984375 0 -1.1110001
+-9.984375 0 -1.0709991
+-9.984375 0.03125 -1.0330009
+-9.984375 0.03125 -0.98600006
+-10 0.03125 -0.95599747
+-10.40625 0.1875 0.33800125
+-10.421875 0.1875 0.36500168
+-9.90625 -0.03125 -1.3849983
+-9.9375 -0.03125 -1.3610001
+-9.953125 0 -1.3250008
+-9.96875 0 -1.2939987
+-9.96875 0 -1.2529984
+-9.984375 0 -1.2229996
+-9.984375 0 -1.1800003
+-9.984375 0.03125 -1.1380005
+-9.984375 0.03125 -1.093998
+-9.96875 0.0625 -1.0239983
+-10.421875 0.21875 0.34899902
+-10.46875 0.1875 0.36400223
+-9.90625 -0.03125 -1.4799995
+-9.9375 -0.03125 -1.4519997
+-9.9375 -0.03125 -1.4220009
+-9.96875 0 -1.3859978
+-9.96875 0 -1.3499985
+-9.984375 0 -1.3149986
+-9.984375 0 -1.2779999
+-9.984375 0.03125 -1.2369995
+-9.984375 0.03125 -1.1909981
+-10.46875 0.21875 0.34000015
+-10.484375 0.21875 0.3710022
+-9.90625 -0.03125 -1.6049995
+-9.9375 -0.03125 -1.5809975
+-9.9375 -0.03125 -1.5470009
+-9.96875 0 -1.5159988
+-9.96875 0 -1.4829979
+-9.96875 0 -1.4469986
+-9.96875 0 -1.4099998
+-9.984375 0 -1.3730011
+-9.984375 0.03125 -1.3289986
+-9.984375 0.03125 -1.2869987
+-10.484375 0.21875 0.34899902
+-10.5 0.21875 0.38100052
+-10.578125 0.1875 0.37400055
+-10.59375 0.1875 0.41600037
+-9.90625 0 -1.6930008
+-9.921875 -0.03125 -1.6669998
+-9.953125 0 -1.6339989
+-9.953125 0 -1.6020012
+-9.96875 0 -1.5690002
+-9.96875 0 -1.5340004
+-9.96875 0 -1.4980011
+-9.984375 0.03125 -1.4640007
+-9.96875 0.03125 -1.4209976
+-9.96875 0.03125 -1.3829994
+-10.5 0.25 0.35400009
+-10.578125 0.1875 0.32200241
+-10.609375 0.1875 0.35000229
+-10.609375 0.1875 0.41600037
+-9.90625 -0.03125 -1.8110008
+-9.90625 -0.03125 -1.7819977
+-9.9375 -0.03125 -1.7550011
+-9.953125 0 -1.7220001
+-9.953125 0 -1.6899986
+-9.96875 0 -1.6559982
+-9.96875 0 -1.6209984
+-9.96875 0 -1.5879974
+-9.96875 0.03125 -1.5499992
+-9.96875 0.03125 -1.5099983
+-9.96875 0.0625 -1.4640007
+-10.5 0.25 0.32400131
+-10.5625 0.21875 0.32300186
+-10.609375 0.21875 0.32400131
+-10.640625 0.1875 0.34400177
+-10.65625 0.21875 0.40500259
+-9.890625 -0.03125 -1.9239998
+-9.90625 -0.03125 -1.8959999
+-9.921875 -0.03125 -1.8699989
+-9.9375 -0.03125 -1.8400002
+-9.953125 0 -1.8059998
+-9.953125 0 -1.7729988
+-9.96875 0 -1.7410011
+-9.96875 0 -1.7109985
+-9.96875 0.03125 -1.6769981
+-9.96875 0.03125 -1.6380005
+-9.96875 0.03125 -1.5999985
+-10.5625 0.25 0.31800079
+-10.59375 0.25 0.31299973
+-10.640625 0.21875 0.31800079
+-10.671875 0.15625 0.33100128
+-10.6875 0.1875 0.39900208
+-10.140625 -0.34375 -2.6699982
+-10.125 -0.3125 -2.6409988
+-9.890625 0 -2.0309982
+-9.90625 -0.03125 -2.0089989
+-9.921875 -0.03125 -1.9799995
+-9.921875 0 -1.9469986
+-9.953125 0 -1.9189987
+-9.953125 0 -1.8899994
+-9.953125 0 -1.8530006
+-9.96875 0 -1.8250008
+-9.96875 0.03125 -1.7910004
+-9.96875 0.03125 -1.757
+-9.96875 0.03125 -1.7199974
+-9.96875 0.0625 -1.6809998
+-10.546875 0.3125 0.31600189
+-10.578125 0.28125 0.32099915
+-10.640625 0.25 0.31100082
+-10.671875 0.1875 0.30800247
+-10.703125 0.1875 0.32200241
+-10.703125 0.1875 0.38399887
+-10.125 -0.34375 -2.7779999
+-10.140625 -0.34375 -2.7560005
+-10.171875 -0.34375 -2.7340012
+-10.171875 -0.34375 -2.7080002
+-10.140625 -0.3125 -2.6809998
+-10.140625 -0.3125 -2.6559982
+-9.90625 -0.03125 -2.1469994
+-9.90625 -0.03125 -2.1139984
+-9.90625 0 -2.0839996
+-9.921875 0 -2.0579987
+-9.921875 0 -2.0270004
+-9.953125 0 -1.9980011
+-9.921875 0.03125 -1.9529991
+-9.953125 0 -1.9370003
+-9.96875 0 -1.9069977
+-9.96875 0.03125 -1.8730011
+-9.96875 0.03125 -1.8359985
+-9.96875 0.0625 -1.7999992
+-10.5625 0.3125 0.32099915
+-10.609375 0.28125 0.31500244
+-10.65625 0.28125 0.31900024
+-10.6875 0.21875 0.31299973
+-10.75 0.1875 0.31000137
+-10.765625 0.1875 0.36700058
+-10.109375 -0.3125 -2.8069992
+-10.140625 -0.3125 -2.7879982
+-10.140625 -0.3125 -2.762001
+-10.1875 -0.34375 -2.7459984
+-10.140625 -0.3125 -2.7130013
+-10.15625 -0.28125 -2.6870003
+-10.125 -0.28125 -2.6559982
+-9.890625 -0.03125 -2.2439995
+-9.90625 -0.03125 -2.218998
+-9.90625 -0.03125 -2.1930008
+-9.90625 0 -2.1629982
+-9.921875 0 -2.132
+-9.953125 0 -2.1040001
+-9.90625 0.03125 -2.0610008
+-9.953125 0 -2.0400009
+-9.953125 0.03125 -2.012001
+-9.953125 0.03125 -1.9790001
+-9.953125 0.03125 -1.9449997
+-9.953125 0.03125 -1.9139977
+-9.953125 0.0625 -1.8789978
+-10.546875 0.34375 0.33000183
+-10.59375 0.3125 0.31999969
+-10.640625 0.28125 0.31800079
+-10.6875 0.25 0.30500031
+-10.734375 0.21875 0.31000137
+-10.765625 0.1875 0.31399918
+-10.78125 0.21875 0.36299896
+-10.15625 -0.28125 -2.7939987
+-10.125 -0.28125 -2.7669983
+-10.125 -0.28125 -2.7410011
+-10.125 -0.25 -2.7150002
+-10.109375 -0.25 -2.6879997
+-10.109375 -0.25 -2.6619987
+-9.875 -0.03125 -2.3719978
+-9.890625 -0.03125 -2.3479996
+-9.90625 -0.03125 -2.3250008
+-9.921875 -0.03125 -2.2980003
+-9.9375 -0.03125 -2.2700005
+-9.921875 0 -2.2389984
+-9.953125 0 -2.211998
+-9.96875 -0.03125 -2.1919975
+-9.953125 0 -2.1520004
+-9.96875 0 -2.1230011
+-9.96875 0.03125 -2.0900002
+-9.953125 0.03125 -2.0529976
+-9.953125 0.0625 -2.0179977
+-9.953125 0.0625 -1.9869995
+-10.578125 0.375 0.32699966
+-10.609375 0.3125 0.31800079
+-10.671875 0.28125 0.31200027
+-10.734375 0.25 0.30599976
+-10.765625 0.21875 0.30800247
+-10.8125 0.21875 0.31100082
+-10.828125 0.21875 0.35800171
+-10.109375 -0.25 -2.7959976
+-10.15625 -0.25 -2.7779999
+-10.125 -0.25 -2.7480011
+-10.078125 -0.1875 -2.7109985
+-10.078125 -0.1875 -2.6870003
+-10.09375 -0.1875 -2.6660004
+-9.875 -0.03125 -2.473999
+-9.890625 -0.03125 -2.447998
+-9.90625 -0.03125 -2.4209976
+-9.90625 -0.03125 -2.3929977
+-9.90625 0 -2.3660011
+-9.921875 0 -2.3380013
+-9.953125 0 -2.3120003
+-9.890625 0.03125 -2.2679977
+-9.953125 0 -2.2519989
+-9.953125 0.03125 -2.2220001
+-9.953125 0.03125 -2.1909981
+-9.953125 0.03125 -2.1619987
+-9.953125 0.03125 -2.1300011
+-9.953125 0.0625 -2.0929985
+-10.59375 0.34375 0.32400131
+-10.65625 0.3125 0.32200241
+-10.71875 0.28125 0.31000137
+-10.75 0.28125 0.31000137
+-10.78125 0.25 0.31600189
+-10.828125 0.21875 0.31200027
+-10.84375 0.21875 0.35000229
+-10.109375 -0.21875 -2.8029976
+-10.09375 -0.21875 -2.7770004
+-10.09375 -0.1875 -2.7509995
+-10.15625 -0.21875 -2.7340012
+-10.109375 -0.1875 -2.7019997
+-10.078125 -0.15625 -2.6699982
+-9.828125 0 -2.5880013
+-9.890625 -0.03125 -2.5709991
+-9.890625 -0.03125 -2.5429993
+-9.890625 -0.03125 -2.5169983
+-9.90625 0 -2.4899979
+-9.90625 0 -2.4640007
+-9.921875 0 -2.4370003
+-9.953125 0 -2.4090004
+-9.953125 0 -2.3810005
+-9.953125 0 -2.3509979
+-9.953125 0.03125 -2.3219986
+-9.953125 0.03125 -2.2939987
+-9.953125 0.03125 -2.2630005
+-9.953125 0.03125 -2.2350006
+-9.953125 0.0625 -2.2010002
+-10.578125 0.40625 0.33300018
+-10.640625 0.34375 0.31800079
+-10.6875 0.34375 0.32200241
+-10.734375 0.28125 0.3030014
+-10.765625 0.28125 0.31299973
+-10.8125 0.25 0.33100128
+-10.84375 0.21875 0.31900024
+-10.875 0.21875 0.34799957
+-10.078125 -0.1875 -2.8069992
+-10.109375 -0.1875 -2.7879982
+-10.078125 -0.15625 -2.7539978
+-10.109375 -0.15625 -2.7350006
+-10.09375 -0.15625 -2.7060013
+-10.0625 -0.125 -2.6720009
+-9.90625 -0.03125 -2.6149979
+-9.90625 -0.03125 -2.5859985
+-9.90625 0 -2.5589981
+-9.921875 0 -2.5319977
+-9.90625 0 -2.5019989
+-9.921875 0 -2.4749985
+-9.953125 0 -2.447998
+-9.953125 0 -2.4220009
+-9.953125 0.03125 -2.3929977
+-9.953125 0.03125 -2.3619995
+-9.953125 0.03125 -2.3310013
+-9.953125 0.0625 -2.2989998
+-10.625 0.40625 0.31999969
+-10.671875 0.34375 0.31299973
+-10.71875 0.34375 0.31100082
+-10.75 0.3125 0.31299973
+-10.8125 0.28125 0.30599976
+-10.84375 0.28125 0.31900024
+-10.875 0.25 0.31500244
+-10.921875 0.25 0.34300232
+-9.84375 -0.03125 -2.8069992
+-10.0625 -0.125 -2.8120003
+-10.078125 -0.125 -2.7879982
+-10.03125 -0.125 -2.757
+-10.03125 -0.09375 -2.7299995
+-10.03125 -0.09375 -2.7039986
+-10.03125 -0.09375 -2.6759987
+-9.984375 -0.03125 -2.6389999
+-9.921875 0 -2.5950012
+-9.921875 0 -2.5709991
+-9.953125 0 -2.5439987
+-9.921875 0.03125 -2.5139999
+-9.953125 0.03125 -2.4850006
+-9.953125 0.03125 -2.4580002
+-9.953125 0.03125 -2.4290009
+-9.921875 0.0625 -2.3959999
+-10.65625 0.40625 0.31700134
+-10.71875 0.375 0.31100082
+-10.75 0.34375 0.31500244
+-10.78125 0.3125 0.31500244
+-10.78125 0.34375 0.3769989
+-10.84375 0.3125 0.35499954
+-10.921875 0.25 0.31299973
+-10.9375 0.25 0.35300064
+-9.875 -0.03125 -2.8909988
+-9.890625 -0.03125 -2.8660011
+-9.890625 -0.03125 -2.8479996
+-9.890625 -0.03125 -2.8219986
+-10.03125 -0.09375 -2.8159981
+-10.03125 -0.09375 -2.7900009
+-10.03125 -0.09375 -2.7630005
+-10.03125 -0.0625 -2.7360001
+-10.015625 -0.0625 -2.7080002
+-10.015625 -0.03125 -2.6809998
+-10.015625 -0.03125 -2.6529999
+-9.953125 0.03125 -2.6079979
+-9.953125 0.03125 -2.5810013
+-9.953125 0.03125 -2.5519981
+-9.953125 0.03125 -2.5249977
+-9.921875 0.0625 -2.4939995
+-10.6875 0.40625 0.31000137
+-10.734375 0.375 0.31299973
+-10.765625 0.375 0.32900238
+-10.8125 0.34375 0.34000015
+-10.78125 0.375 0.44800186
+-10.859375 0.34375 0.4109993
+-10.9375 0.25 0.30800247
+-10.953125 0.25 0.34600067
+-9.84375 -0.03125 -3.0060005
+-9.875 -0.03125 -2.9799995
+-9.875 -0.03125 -2.9529991
+-9.890625 0 -2.9269981
+-9.890625 0 -2.9020004
+-9.90625 0 -2.8759995
+-9.90625 0 -2.848999
+-9.90625 0 -2.8310013
+-9.90625 0 -2.8040009
+-10.015625 -0.0625 -2.7949982
+-9.984375 -0.03125 -2.762001
+-10 -0.03125 -2.7389984
+-9.984375 0 -2.7080002
+-10 0 -2.6870003
+-9.984375 0 -2.6559982
+-9.921875 0.0625 -2.6139984
+-9.90625 0.09375 -2.579998
+-10.671875 0.4375 0.32099915
+-10.71875 0.40625 0.31500244
+-10.75 0.40625 0.3370018
+-10.8125 0.34375 0.2859993
+-10.859375 0.3125 0.25400162
+-10.859375 0.34375 0.37900162
+-10.890625 0.375 0.43500137
+-10.953125 0.28125 0.3030014
+-10.984375 0.28125 0.35200119
+-9.84375 -0.03125 -3.1199989
+-9.875 -0.03125 -3.093998
+-9.875 -0.03125 -3.0669975
+-9.890625 -0.03125 -3.0419998
+-9.890625 0 -3.0149994
+-9.90625 0 -2.9899979
+-9.90625 0 -2.9640007
+-9.90625 0 -2.9370003
+-9.921875 0 -2.9119987
+-9.890625 0.03125 -2.882
+-9.921875 0 -2.8590012
+-9.921875 0.03125 -2.8409996
+-9.921875 0.03125 -2.8149986
+-10 0 -2.7989998
+-10 0 -2.7729988
+-10.046875 -0.03125 -2.7539978
+-10.015625 0 -2.7220001
+-10.015625 0 -2.6969986
+-9.984375 0.03125 -2.6609993
+-10.703125 0.46875 0.32099915
+-10.734375 0.4375 0.34600067
+-10.828125 0.375 0.23300171
+-10.859375 0.34375 0.2460022
+-10.859375 0.375 0.33200073
+-10.890625 0.375 0.40399933
+-10.90625 0.375 0.44100189
+-11 0.28125 0.31000137
+-11.015625 0.28125 0.35800171
+-9.84375 -0.03125 -3.2329979
+-9.875 -0.03125 -3.2060013
+-9.875 -0.03125 -3.1800003
+-9.890625 -0.03125 -3.1539993
+-9.890625 -0.03125 -3.1279984
+-9.890625 0 -3.1009979
+-9.90625 0 -3.0760002
+-9.90625 0 -3.0499992
+-9.90625 0 -3.0239983
+-9.890625 0.03125 -2.9959984
+-9.921875 0 -2.9720001
+-9.921875 0.03125 -2.9459991
+-9.921875 0.03125 -2.9199982
+-9.921875 0.03125 -2.8929977
+-9.921875 0.03125 -2.8670006
+-9.921875 0.0625 -2.8479996
+-9.921875 0.0625 -2.8209991
+-9.984375 0.03125 -2.8040009
+-9.96875 0.03125 -2.776001
+-9.984375 0.03125 -2.7519989
+-9.96875 0.0625 -2.7220001
+-9.953125 0.0625 -2.6909981
+-9.96875 0.0625 -2.6650009
+-10.734375 0.46875 0.29999924
+-10.796875 0.40625 0.28100204
+-10.84375 0.375 0.25099945
+-10.828125 0.4375 0.39200211
+-10.890625 0.40625 0.35599899
+-10.890625 0.40625 0.44400024
+-10.9375 0.375 0.39699936
+-11.015625 0.3125 0.30800247
+-11.015625 0.3125 0.38299942
+-9.828125 -0.03125 -3.3460007
+-9.84375 -0.03125 -3.3180008
+-9.84375 -0.03125 -3.2919998
+-9.875 -0.03125 -3.2649994
+-9.890625 -0.03125 -3.2389984
+-9.890625 0 -3.2130013
+-9.890625 0 -3.1870003
+-9.90625 0 -3.1609993
+-9.890625 0 -3.1349983
+-9.890625 0 -3.1090012
+-9.921875 0 -3.0830002
+-9.921875 0 -3.0579987
+-9.921875 0.03125 -3.0319977
+-9.921875 0.03125 -3.0050011
+-9.921875 0.03125 -2.9799995
+-9.921875 0.03125 -2.9539986
+-9.921875 0.0625 -2.9269981
+-9.921875 0.0625 -2.8999977
+-9.96875 0.0625 -2.8089981
+-9.96875 0.0625 -2.7819977
+-9.953125 0.09375 -2.7529984
+-9.953125 0.09375 -2.7249985
+-9.921875 0.09375 -2.6949997
+-9.953125 0.09375 -2.6699982
+-10.75 0.46875 0.31900024
+-10.828125 0.40625 0.25
+-10.84375 0.4375 0.31500244
+-10.84375 0.46875 0.41699982
+-10.890625 0.4375 0.40299988
+-10.921875 0.4375 0.44000244
+-10.984375 0.375 0.36999893
+-11.046875 0.3125 0.31999969
+-11.046875 0.3125 0.38600159
+-9.8125 -0.03125 -3.4589996
+-9.84375 -0.03125 -3.4300003
+-9.84375 -0.03125 -3.4029999
+-9.875 -0.03125 -3.3759995
+-9.890625 -0.03125 -3.348999
+-9.890625 0 -3.322998
+-9.890625 0 -3.2970009
+-9.890625 0 -3.2709999
+-9.890625 0 -3.2449989
+-9.890625 0.03125 -3.2200012
+-9.90625 0 -3.1940002
+-9.921875 0 -3.1679993
+-9.921875 0.03125 -3.1429977
+-9.921875 0.03125 -3.1170006
+-9.921875 0.03125 -3.0909996
+-9.921875 0.03125 -3.0649986
+-9.921875 0.0625 -3.0389977
+-9.90625 0.0625 -3.0130005
+-9.890625 0.09375 -2.9850006
+-9.953125 0.09375 -2.8139992
+-9.921875 0.125 -2.7840004
+-9.921875 0.125 -2.757
+-9.96875 0.09375 -2.737999
+-9.921875 0.125 -2.7019997
+-9.9375 0.15625 -2.6749992
+-10.796875 0.5 0.30900192
+-10.828125 0.46875 0.34799957
+-10.84375 0.46875 0.36700058
+-10.859375 0.46875 0.41799927
+-10.953125 0.375 0.28700256
+-10.96875 0.40625 0.3769989
+-11.03125 0.34375 0.30900192
+-11.078125 0.3125 0.31200027
+-11.078125 0.34375 0.40100098
+-9.8125 -0.03125 -3.5719986
+-9.828125 -0.03125 -3.5419998
+-9.84375 -0.03125 -3.5139999
+-9.84375 -0.03125 -3.4869995
+-9.875 -0.03125 -3.4599991
+-9.875 0 -3.4329987
+-9.890625 0 -3.4059982
+-9.890625 0 -3.3810005
+-9.90625 0 -3.3540001
+-9.953125 0 -3.3269997
+-9.890625 0 -3.3040009
+-9.890625 0.03125 -3.2779999
+-9.90625 0.03125 -3.2519989
+-9.921875 0.03125 -3.2270012
+-9.921875 0.03125 -3.2010002
+-9.90625 0.03125 -3.1759987
+-9.921875 0.0625 -3.1499977
+-9.90625 0.0625 -3.1240005
+-9.90625 0.0625 -3.0979996
+-9.921875 0.125 -2.8180008
+-9.9375 0.15625 -2.7910004
+-9.90625 0.15625 -2.762001
+-9.90625 0.15625 -2.7350006
+-9.90625 0.1875 -2.7070007
+-9.90625 0.1875 -2.6790009
+-10.8125 0.5 0.32400131
+-10.84375 0.5 0.36100006
+-10.875 0.5 0.38199997
+-10.90625 0.46875 0.41699982
+-10.96875 0.40625 0.32799911
+-11.015625 0.40625 0.34000015
+-11.0625 0.375 0.3370018
+-11.09375 0.34375 0.31399918
+-9.8125 -0.03125 -3.6849976
+-9.84375 -0.03125 -3.6520004
+-9.84375 -0.03125 -3.625
+-9.875 -0.03125 -3.5960007
+-9.875 -0.03125 -3.5699997
+-9.875 0 -3.5429993
+-9.890625 0 -3.5159988
+-9.890625 0 -3.4899979
+-9.890625 0 -3.4640007
+-9.9375 -0.03125 -3.4339981
+-9.875 0.03125 -3.4160004
+-9.921875 0 -3.3849983
+-9.90625 0.03125 -3.3099976
+-9.90625 0.03125 -3.2849998
+-9.90625 0.0625 -3.2589989
+-9.90625 0.0625 -3.2340012
+-9.90625 0.0625 -3.2089996
+-9.90625 0.1875 -2.8240013
+-9.9375 0.15625 -2.7999992
+-9.890625 0.1875 -2.7679977
+-9.9375 0.1875 -2.7469978
+-9.890625 0.21875 -2.7130013
+-9.890625 0.21875 -2.6829987
+-10.84375 0.53125 0.33100128
+-10.875 0.5 0.36199951
+-10.9375 0.4375 0.28000259
+-10.9375 0.46875 0.37400055
+-11.015625 0.40625 0.30900192
+-11.03125 0.40625 0.34199905
+-11.078125 0.375 0.3390007
+-11.109375 0.34375 0.32300186
+-9.796875 0 -3.8029976
+-9.828125 -0.03125 -3.7669983
+-9.84375 -0.03125 -3.7369995
+-9.84375 -0.03125 -3.7080002
+-9.84375 -0.03125 -3.6809998
+-9.875 0 -3.6539993
+-9.875 0 -3.6269989
+-9.890625 0 -3.5999985
+-9.875 0 -3.5750008
+-9.890625 0 -3.5489998
+-9.875 0.03125 -3.5249977
+-9.890625 0.03125 -3.4969978
+-9.90625 0.03125 -3.4700012
+-9.90625 0.03125 -3.4440002
+-9.921875 0.03125 -3.4179993
+-9.90625 0.03125 -3.3929977
+-9.90625 0.03125 -3.368
+-9.90625 0.0625 -3.3419991
+-9.90625 0.0625 -3.3180008
+-9.875 0.09375 -3.2939987
+-9.875 0.21875 -2.8260002
+-9.890625 0.21875 -2.8009987
+-9.875 0.25 -2.7719994
+-9.859375 0.25 -2.7420006
+-9.875 0.25 -2.7159996
+-9.859375 0.28125 -2.6860008
+-9.859375 0.28125 -2.6559982
+-10.875 0.53125 0.3370018
+-10.890625 0.53125 0.36700058
+-10.921875 0.5 0.38999939
+-11 0.46875 0.32600021
+-11 0.46875 0.39500046
+-11.078125 0.40625 0.32099915
+-11.109375 0.375 0.31399918
+-9.828125 -0.03125 -3.8789978
+-9.84375 -0.03125 -3.8470001
+-9.84375 -0.03125 -3.8190002
+-9.84375 -0.03125 -3.7919998
+-9.875 -0.03125 -3.7630005
+-9.875 0 -3.7369995
+-9.890625 0 -3.7089996
+-9.890625 0 -3.6819992
+-9.890625 0 -3.6549988
+-9.875 0 -3.6329994
+-9.90625 0 -3.6020012
+-9.890625 0.03125 -3.5789986
+-9.890625 0.03125 -3.5540009
+-9.90625 0.03125 -3.5270004
+-9.890625 0.03125 -3.5029984
+-9.90625 0.03125 -3.4759979
+-9.90625 0.0625 -3.4510002
+-9.90625 0.0625 -3.4269981
+-9.875 0.09375 -3.4039993
+-9.859375 0.25 -2.8059998
+-9.859375 0.28125 -2.7779999
+-9.859375 0.28125 -2.75
+-9.875 0.28125 -2.7249985
+-9.84375 0.3125 -2.6909981
+-9.84375 0.3125 -2.6629982
+-10.890625 0.53125 0.32699966
+-10.96875 0.5 0.28499985
+-10.96875 0.5 0.35499954
+-11 0.5 0.37200165
+-11.0625 0.4375 0.33200073
+-11.09375 0.40625 0.30900192
+-9.8125 -0.03125 -3.9969978
+-9.828125 -0.03125 -3.9630013
+-9.84375 -0.03125 -3.9319992
+-9.84375 -0.03125 -3.9049988
+-9.84375 -0.03125 -3.8759995
+-9.875 0 -3.8479996
+-9.875 0 -3.8190002
+-9.875 0 -3.7939987
+-9.890625 0 -3.7669983
+-9.84375 0.03125 -3.7469978
+-9.875 0.03125 -3.7159996
+-9.890625 0.03125 -3.6889992
+-9.890625 0.03125 -3.6619987
+-9.890625 0.03125 -3.6359978
+-9.890625 0.03125 -3.6110001
+-9.90625 0.0625 -3.5859985
+-9.890625 0.0625 -3.5620003
+-9.890625 0.0625 -3.5359993
+-9.890625 0.0625 -3.512001
+-9.84375 0.3125 -2.8099976
+-9.84375 0.3125 -2.7830009
+-9.84375 0.3125 -2.7539978
+-9.84375 0.34375 -2.7249985
+-9.859375 0.3125 -2.7019997
+-9.8125 0.34375 -2.6669998
+-10.9375 0.53125 0.30800247
+-10.96875 0.53125 0.34799957
+-11 0.5 0.31900024
+-11.03125 0.5 0.3370018
+-11.078125 0.4375 0.31700134
+-9.8125 -0.03125 -4.1119995
+-9.828125 -0.03125 -4.0789986
+-9.84375 -0.03125 -4.0459976
+-9.84375 -0.03125 -4.0200005
+-9.84375 -0.03125 -3.9889984
+-9.875 0 -3.9609985
+-9.875 0 -3.9319992
+-9.875 0 -3.9039993
+-9.890625 0 -3.8769989
+-9.875 0 -3.8509979
+-9.890625 0 -3.8250008
+-9.890625 0.03125 -3.7970009
+-9.890625 0.03125 -3.7709999
+-9.890625 0.03125 -3.7439995
+-9.890625 0.03125 -3.7179985
+-9.890625 0.03125 -3.6930008
+-9.90625 0.0625 -3.6679993
+-9.90625 0.0625 -3.6429977
+-9.890625 0.0625 -3.6189995
+-9.8125 0.34375 -2.8169975
+-9.796875 0.375 -2.7840004
+-9.8125 0.375 -2.7589989
+-9.796875 0.375 -2.7290001
+-9.8125 0.375 -2.704998
+-9.796875 0.40625 -2.6720009
+-10.96875 0.5625 0.32500076
+-10.984375 0.53125 0.33600235
+-11.015625 0.53125 0.33499908
+-11.078125 0.5 0.32799911
+-9.78125 -0.03125 -4.2469978
+-9.828125 -0.03125 -4.1959991
+-9.828125 -0.03125 -4.1650009
+-9.84375 -0.03125 -4.1339989
+-9.84375 -0.03125 -4.1049995
+-9.875 -0.03125 -4.072998
+-9.875 0 -4.0459976
+-9.875 0 -4.019001
+-9.875 0 -3.987999
+-9.875 0 -3.9640007
+-9.90625 0 -3.9269981
+-9.890625 0.03125 -3.9080009
+-9.890625 0.03125 -3.8810005
+-9.890625 0.03125 -3.8549995
+-9.890625 0.03125 -3.829998
+-9.890625 0.03125 -3.8040009
+-9.890625 0.0625 -3.7779999
+-9.890625 0.0625 -3.7529984
+-9.890625 0.0625 -3.7280006
+-9.859375 0.09375 -3.7089996
+-9.796875 0.375 -2.8219986
+-9.78125 0.40625 -2.7900009
+-9.765625 0.40625 -2.7599983
+-9.796875 0.40625 -2.7350006
+-9.765625 0.4375 -2.7010002
+-9.78125 0.4375 -2.6759987
+-10.984375 0.5625 0.34000015
+-11.015625 0.5625 0.3409996
+-11.0625 0.53125 0.32699966
+-9.796875 -0.03125 -4.3260002
+-9.828125 -0.03125 -4.2869987
+-9.828125 -0.03125 -4.2550011
+-9.84375 -0.03125 -4.2220001
+-9.84375 -0.03125 -4.1909981
+-9.84375 0 -4.1609993
+-9.875 0 -4.132
+-9.875 0 -4.1040001
+-9.875 0 -4.0760002
+-9.84375 0.03125 -4.0599976
+-9.875 0 -4.0209999
+-9.890625 0.03125 -3.9920006
+-9.890625 0.03125 -3.9640007
+-9.890625 0.03125 -3.9389992
+-9.890625 0.03125 -3.9129982
+-9.890625 0.0625 -3.887001
+-9.890625 0.0625 -3.8639984
+-9.875 0.0625 -3.8380013
+-9.875 0.09375 -3.8169975
+-9.78125 0.40625 -2.8269997
+-9.78125 0.4375 -2.7980003
+-9.78125 0.4375 -2.7700005
+-9.78125 0.4375 -2.7410011
+-9.765625 0.46875 -2.7099991
+-11 0.59375 0.33100128
+-11.046875 0.5625 0.34199905
+-9.8125 -0.03125 -4.4139977
+-9.828125 -0.03125 -4.3769989
+-9.828125 -0.03125 -4.3419991
+-9.84375 -0.03125 -4.3110008
+-9.84375 -0.03125 -4.2799988
+-9.84375 0 -4.25
+-9.875 0 -4.2200012
+-9.875 0 -4.1919975
+-9.875 0 -4.1619987
+-9.875 0 -4.1349983
+-9.890625 0.03125 -4.1040001
+-9.890625 0.03125 -4.0789986
+-9.890625 0.03125 -4.0509987
+-9.890625 0.03125 -4.0249977
+-9.890625 0.0625 -3.9990005
+-9.890625 0.0625 -3.973999
+-9.875 0.0625 -3.9500008
+-9.875 0.0625 -3.9249992
+-9.78125 -0.03125 -4.5589981
+-9.8125 -0.03125 -4.512001
+-9.828125 -0.03125 -4.4710007
+-9.828125 -0.03125 -4.4389992
+-9.84375 -0.03125 -4.4039993
+-9.84375 0 -4.3709984
+-9.84375 0 -4.3400002
+-9.875 0 -4.3110008
+-9.875 0 -4.2799988
+-9.875 0 -4.2509995
+-9.875 0.03125 -4.223999
+-9.875 0.03125 -4.1949997
+-9.875 0.03125 -4.1669998
+-9.875 0.03125 -4.1419983
+-9.890625 0.03125 -4.1119995
+-9.875 0.0625 -4.0890007
+-9.875 0.0625 -4.0599976
+-9.875 0.0625 -4.0369987
+-9.859375 0.09375 -4.0209999
+-9.796875 -0.03125 -4.6499977
+-9.8125 -0.03125 -4.598999
+-9.828125 -0.03125 -4.5639992
+-9.828125 -0.03125 -4.5289993
+-9.84375 -0.03125 -4.4969978
+-9.84375 0 -4.4650002
+-9.84375 0 -4.4319992
+-9.875 0 -4.401001
+-9.875 0 -4.3719978
+-9.875 0 -4.3390007
+-9.875 0.03125 -4.3110008
+-9.875 0.03125 -4.2830009
+-9.890625 0.03125 -4.2539978
+-9.890625 0.03125 -4.2249985
+-9.875 0.0625 -4.2010002
+-9.875 0.0625 -4.1769981
+-9.875 0.0625 -4.151001
+-9.875 0.09375 -4.125
+-9.796875 -0.03125 -4.75
+-9.8125 -0.03125 -4.6959991
+-9.8125 -0.03125 -4.6669998
+-9.828125 -0.03125 -4.6269989
+-9.84375 -0.03125 -4.5909996
+-9.84375 0 -4.5589981
+-9.84375 0 -4.526001
+-9.875 0 -4.4939995
+-9.84375 0 -4.4700012
+-9.875 0 -4.4319992
+-9.875 0.03125 -4.4029999
+-9.875 0.03125 -4.375
+-9.875 0.03125 -4.348999
+-9.875 0.0625 -4.3190002
+-9.875 0.0625 -4.2939987
+-9.875 0.0625 -4.2679977
+-9.859375 0.0625 -4.2439995
+-9.8125 0.09375 -4.2340012
+-9.796875 -0.03125 -4.8499985
+-9.8125 -0.03125 -4.8019981
+-9.8125 -0.03125 -4.7719994
+-9.828125 -0.03125 -4.7259979
+-9.828125 0 -4.6909981
+-9.84375 0 -4.6580009
+-9.84375 0 -4.6199989
+-9.84375 0 -4.5919991
+-9.84375 0 -4.5620003
+-9.875 0.03125 -4.5289993
+-9.875 0.03125 -4.4990005
+-9.875 0.03125 -4.4669991
+-9.875 0.03125 -4.4379997
+-9.875 0.0625 -4.4109993
+-9.875 0.0625 -4.3849983
+-9.859375 0.0625 -4.3610001
+-9.859375 0.09375 -4.3390007
+-9.78125 -0.03125 -4.9599991
+-9.796875 -0.03125 -4.9139977
+-9.8125 -0.03125 -4.875
+-9.828125 -0.03125 -4.8320007
+-9.828125 0 -4.7929993
+-9.84375 0 -4.757
+-9.84375 0 -4.718998
+-9.875 0 -4.6849976
+-9.84375 0 -4.6569977
+-9.875 0.03125 -4.6230011
+-9.875 0.03125 -4.593998
+-9.875 0.03125 -4.5610008
+-9.875 0.03125 -4.5309982
+-9.875 0.0625 -4.507
+-9.875 0.0625 -4.4790001
+-9.859375 0.0625 -4.4539986
+-9.78125 -0.03125 -5.0750008
+-9.796875 -0.03125 -5.0219994
+-9.8125 -0.03125 -4.9829979
+-9.8125 0 -4.9459991
+-9.828125 0 -4.8979988
+-9.828125 0 -4.868
+-9.84375 0 -4.8239975
+-9.84375 0 -4.7949982
+-9.84375 0 -4.7550011
+-9.84375 0.03125 -4.7259979
+-9.875 0.03125 -4.6909981
+-9.84375 0.03125 -4.6619987
+-9.859375 0.0625 -4.6339989
+-9.859375 0.0625 -4.6049995
+-9.859375 0.0625 -4.5769997
+-9.859375 0.09375 -4.5550003
+-9.796875 -0.03125 -5.132
+-9.8125 -0.03125 -5.0919991
+-9.8125 -0.03125 -5.0540009
+-9.828125 0 -5.0099983
+-9.84375 0 -4.961998
+-9.828125 0 -4.9349976
+-9.84375 0 -4.894001
+-9.84375 0.03125 -4.8649979
+-9.84375 0.03125 -4.8250008
+-9.84375 0.03125 -4.7980003
+-9.875 0.03125 -4.7589989
+-9.890625 0.03125 -4.7150002
+-9.859375 0.0625 -4.7059975
+-9.828125 0.0625 -4.6809998
+-9.8125 0.09375 -4.6629982
+-9.78125 -0.03125 -5.2630005
+-9.796875 -0.03125 -5.2089996
+-9.8125 -0.03125 -5.1599998
+-9.828125 0 -5.118
+-9.828125 0 -5.086998
+-9.828125 0 -5.0459976
+-9.828125 0 -5.012001
+-9.84375 0.03125 -4.9710007
+-9.828125 0.03125 -4.9419975
+-9.828125 0.03125 -4.9059982
+-9.84375 0.03125 -4.8699989
+-9.875 0.03125 -4.8219986
+-9.78125 -0.03125 -5.3419991
+-9.8125 -0.03125 -5.2859993
+-9.8125 -0.03125 -5.2389984
+-9.828125 0 -5.1940002
+-9.828125 0 -5.1539993
+-9.828125 0 -5.112999
+-9.828125 0.03125 -5.0839996
+-9.828125 0.03125 -5.0480003
+-9.828125 0.03125 -5.012001
+-9.84375 0.03125 -4.9759979
+-9.859375 0.0625 -4.9319992
+-9.796875 -0.03125 -5.447998
+-9.796875 -0.03125 -5.4139977
+-9.8125 -0.03125 -5.3670006
+-9.8125 0 -5.3180008
+-9.828125 0 -5.2700005
+-9.828125 0 -5.2290001
+-9.828125 0 -5.1909981
+-9.84375 0.03125 -5.1539993
+-9.84375 0.03125 -5.1189995
+-9.828125 0.03125 -5.0880013
+-9.828125 0.0625 -5.0550003
+-9.8125 -0.03125 -5.4389992
+-9.8125 0 -5.4080009
+-9.828125 0 -5.355999
+-9.828125 0 -5.3169975
+-9.828125 0.03125 -5.2729988
+-9.84375 0.03125 -5.230999
+-9.828125 0.03125 -5.2010002
+-9.828125 0.0625 -5.1650009
+-9.828125 0 -5.4349976
+-9.828125 0 -5.3959999
+-9.828125 0.03125 -5.3590012
+-9.828125 0.03125 -5.3190002
+-9.828125 0.03125 -5.2799988
+-9.828125 0.03125 -5.4409981
+-9.828125 0.03125 -5.4029999
+-9.84375 0.03125 -5.348999
+-9.875 0 -5.2719994
+-9.875 0.03125 -5.3989983
+-9.875 0 -5.2270012
+-9.890625 -0.03125 -5.0519981
+-9.875 0.03125 -5.1829987
+-9.890625 0 -5.0109978
+-9.875 0.03125 -5.1409988
+-9.890625 0 -4.9659996
+-9.890625 -0.03125 -4.7939987
+-9.890625 0.03125 -4.9230003
+-9.90625 0 -4.75
+-9.890625 0.03125 -4.8789978
+-9.890625 0 -4.7089996
+-9.875 0.03125 -4.8390007
+-9.890625 -0.03125 -4.5379982
+-9.890625 0 -4.6660004
+-9.90625 -0.03125 -4.4949989
+-9.921875 0 -4.4510002
+-10.1875 -0.375 -2.7039986
+-9.90625 -0.03125 -4.2819977
+-9.90625 0 -4.4099998
+-10.1875 -0.375 -2.6609993
+-10.1875 -0.34375 -2.7929993
+-9.90625 -0.03125 -4.237999
+-9.890625 0.03125 -4.3699989
+-10.171875 -0.3125 -2.75
+-9.90625 0 -4.1959991
+-9.90625 0.03125 -4.3269997
+-9.875 0.0625 -4.4599991
+-10.171875 -0.3125 -2.7070007
+-9.90625 -0.03125 -4.026001
+-9.921875 0 -4.1549988
+-9.90625 0.03125 -4.2859993
+-9.84375 0.03125 -4.4220009
+-10.171875 -0.28125 -2.6650009
+-10.171875 -0.25 -2.7970009
+-9.921875 -0.03125 -3.9829979
+-9.921875 0.03125 -4.112999
+-9.90625 0.0625 -4.2449989
+-9.859375 0.0625 -4.3800011
+-10.125 -0.28125 -2.7529984
+-9.921875 0 -3.9419975
+-9.921875 0.03125 -4.0719986
+-9.890625 0.0625 -4.204998
+-10.171875 -0.21875 -2.7130013
+-9.921875 0 -3.8999977
+-9.90625 0.03125 -4.0309982
+-9.875 0.0625 -4.1639977
+-10.15625 -0.25 -2.6699982
+-10.109375 -0.21875 -2.8009987
+-9.921875 -0.03125 -3.7280006
+-9.921875 0 -3.8590012
+-9.90625 0.03125 -3.9899979
+-9.859375 0.0625 -4.125
+-10.109375 -0.25 -2.6259995
+-10.109375 -0.1875 -2.7599983
+-9.953125 0 -3.6860008
+-9.921875 0.03125 -3.8169975
+-9.890625 0.03125 -3.9500008
+-9.828125 0.03125 -4.086998
+-10.109375 -0.1875 -2.7179985
+-9.953125 0 -3.6429977
+-9.921875 0.03125 -3.776001
+-9.875 0.03125 -3.9099998
+-10.125 -0.15625 -2.6769981
+-10.078125 -0.15625 -2.8079987
+-9.921875 -0.0625 -3.4710007
+-9.953125 0 -3.6040001
+-9.921875 0.03125 -3.7360001
+-9.875 0.03125 -3.8699989
+-10.109375 -0.1875 -2.6349983
+-10.078125 -0.15625 -2.7669983
+-9.9375 -0.03125 -3.4300003
+-9.953125 0.03125 -3.5620003
+-9.90625 0.0625 -3.6959991
+-9.859375 0.0625 -3.829998
+-10.078125 -0.15625 -2.7259979
+-9.96875 0 -3.3899994
+-9.953125 0.03125 -3.5229988
+-9.890625 0.03125 -3.6569977
+-10.078125 -0.125 -2.6860008
+-10.03125 -0.125 -2.8190002
+-9.921875 -0.03125 -3.3499985
+-9.921875 0.03125 -3.4819984
+-9.890625 0.0625 -3.6170006
+-10.078125 -0.125 -2.6459999
+-10.0625 -0.09375 -2.7789993
+-9.9375 -0.03125 -3.1769981
+-9.953125 0 -3.3099976
+-9.90625 0.03125 -3.4440002
+-9.84375 0.03125 -3.5789986
+-10.0625 -0.0625 -2.7389984
+-9.96875 -0.03125 -3.137001
+-9.953125 0.03125 -3.2700005
+-9.921875 0.0625 -3.4039993
+-10.0625 -0.0625 -2.697998
+-9.96875 0 -3.0970001
+-9.953125 0.03125 -3.2299995
+-9.890625 0.03125 -3.362999
+-10.03125 -0.0625 -2.6559982
+-10.046875 -0.03125 -2.7900009
+-9.96875 0 -3.0559998
+-9.953125 0.03125 -3.1889992
+-9.890625 0.03125 -3.322998
+-10.015625 -0.03125 -2.7490005
+-9.96875 -0.03125 -2.8810005
+-9.96875 0.03125 -3.0149994
+-9.921875 0.03125 -3.1489983
+-10.015625 0 -2.7080002
+-9.96875 -0.03125 -2.8400002
+-9.953125 0.03125 -2.973999
+-9.90625 0.03125 -3.1079979
+-10.015625 0 -2.6669998
+-10 0.03125 -2.7999992
+-9.953125 0.03125 -2.9329987
+-9.90625 0.03125 -3.0669975
+-9.96875 -0.0625 -2.6230011
+-9.984375 0.03125 -2.7589989
+-9.953125 0.03125 -2.8929977
+-9.984375 -0.03125 -2.5830002
+-9.984375 0.03125 -2.7200012
+-9.921875 0.03125 -2.8520012
+-9.984375 0 -2.5439987
+-10 0.0625 -2.6800003
+-9.953125 0.0625 -2.8129997
+-9.984375 0 -2.5039978
+-10 0.0625 -2.6399994
+-9.984375 0.09375 -2.7749977
+-9.984375 0 -2.4640007
+-9.953125 0.03125 -2.5979996
+-9.984375 0.09375 -2.7360001
+-9.984375 -0.03125 -2.2869987
+-9.984375 0.03125 -2.4239998
+-9.953125 0.03125 -2.5579987
+-9.96875 0.09375 -2.6949997
+-9.953125 0.125 -2.829998
+-10 0 -2.2480011
+-9.984375 0.03125 -2.3829994
+-9.953125 0.03125 -2.5169983
+-9.96875 0.09375 -2.6549988
+-9.953125 0.125 -2.7889977
+-9.984375 0 -2.2060013
+-9.96875 0.03125 -2.3419991
+-9.921875 0.03125 -2.4759979
+-9.921875 0.125 -2.7490005
+-10 0 -2.1650009
+-9.96875 0.03125 -2.3009987
+-9.921875 0.125 -2.7080002
+-9.984375 0 -2.1230011
+-9.96875 0.03125 -2.2589989
+-9.9375 0.15625 -2.6679993
+-9.90625 0.1875 -2.8019981
+-10 -0.03125 -1.9419975
+-9.984375 0 -2.0820007
+-9.953125 0.03125 -2.2169991
+-9.90625 0.1875 -2.762001
+-10 -0.03125 -1.9020004
+-9.984375 0 -2.0389977
+-9.953125 0.03125 -2.1749992
+-9.90625 0.1875 -2.7210007
+-10 0 -1.8610001
+-9.984375 0.03125 -1.9990005
+-9.921875 0.03125 -2.1329994
+-9.90625 0.21875 -2.6819992
+-9.890625 0.21875 -2.8169975
+-10 0 -1.8199997
+-9.984375 0.03125 -1.9570007
+-9.90625 0.21875 -2.6419983
+-9.890625 0.25 -2.7770004
+-10 0 -1.7779999
+-9.984375 0.03125 -1.9150009
+-9.890625 0.25 -2.7369995
+-10 0 -1.7389984
+-9.984375 0.03125 -1.875
+-9.890625 0.25 -2.697998
+-9.84375 0.25 -2.8330002
+-10 0 -1.6969986
+-9.96875 0.03125 -1.8330002
+-9.890625 0.25 -2.6580009
+-9.875 0.28125 -2.7939987
+-10 -0.03125 -1.5149994
+-10.015625 0 -1.6569977
+-9.96875 0.03125 -1.7919998
+-9.875 0.28125 -2.7539978
+-10 -0.03125 -1.4729996
+-10.015625 0 -1.6149979
+-9.96875 0.03125 -1.75
+-9.875 0.28125 -2.7150002
+-10.015625 -0.03125 -1.4319992
+-10.015625 0 -1.572998
+-9.953125 0.03125 -1.7059975
+-9.875 0.28125 -2.6739998
+-9.859375 0.3125 -2.8099976
+-10.015625 -0.03125 -1.3899994
+-10 0 -1.5299988
+-9.96875 0.03125 -1.6660004
+-9.859375 0.3125 -2.7700005
+-10.015625 -0.03125 -1.3479996
+-10 0 -1.487999
+-9.859375 0.3125 -2.7290001
+-10.015625 -0.03125 -1.3029976
+-10 0 -1.4440002
+-9.859375 0.34375 -2.6879997
+-9.8125 0.34375 -2.8240013
+-10.015625 -0.03125 -1.2599983
+-10 0 -1.3999977
+-9.859375 0.34375 -2.6479988
+-9.84375 0.375 -2.7840004
+-10.015625 -0.03125 -1.2179985
+-10.015625 0.03125 -1.3600006
+-9.84375 0.375 -2.7439995
+-10.015625 0 -1.1759987
+-10 0 -1.3159981
+-9.8125 0.34375 -2.7019997
+-10.015625 -0.03125 -1.132
+-10 0 -1.2719994
+-9.84375 0.375 -2.6619987
+-9.828125 0.40625 -2.7989998
+-11.171875 0.3125 0.35499954
+-10.046875 0 -1.0919991
+-10 0 -1.2299995
+-9.828125 0.40625 -2.7589989
+-10.015625 -0.03125 -1.0470009
+-10 0 -1.1879997
+-9.828125 0.40625 -2.718998
+-11.046875 0.25 0.33200073
+-10.046875 -0.03125 -1.0050011
+-10.015625 0 -1.1459999
+-9.828125 0.40625 -2.6800003
+-11.171875 0.34375 0.3409996
+-10.046875 -0.03125 -0.96199799
+-10.015625 0 -1.1040001
+-9.796875 0.4375 -2.7770004
+-11.109375 0.28125 0.40100098
+-10.046875 -0.03125 -0.91999817
+-10.015625 0 -1.0610008
+-9.796875 0.4375 -2.7369995
+-10.96875 0.21875 0.34500122
+-10.046875 -0.03125 -0.87400055
+-10.015625 0 -1.019001
+-9.796875 0.4375 -2.6969986
+-11.15625 0.34375 0.33600235
+-10.046875 -0.03125 -0.83099747
+-10.015625 0 -0.97399902
+-9.796875 0.4375 -2.6559982
+-11.15625 0.34375 0.37900162
+-10.015625 -0.03125 -0.78499985
+-10.015625 0 -0.93199921
+-11.125 0.3125 0.42900085
+-10.046875 -0.03125 -0.74499893
+-10.046875 0 -0.88899994
+-10.046875 0 -0.84499741
+-9.96875 0 -0.97900009
+-11.15625 0.375 0.36800003
+-10.046875 0 -0.80099869
+-10 0.03125 -0.94099808
+-11.15625 0.34375 0.41600037
+-10.859375 0.15625 0.35800171
+-10.0625 0 -0.76099777
+-10 0 -0.89899826
+-11.015625 0.28125 0.35700226
+-10.046875 0 -0.71500015
+-10 0 -0.85499954
+-11.15625 0.375 0.36000061
+-10.046875 -0.03125 -0.67300034
+-10.015625 0.03125 -0.81599808
+-11.125 0.375 0.4070015
+-10.875 0.21875 0.3390007
+-10.0625 -0.03125 -0.63000107
+-10.015625 0 -0.77099991
+-11.125 0.34375 0.45100021
+-10.90625 0.21875 0.3769989
+-10.046875 -0.03125 -0.58499908
+-10.015625 0 -0.72800064
+-11.125 0.40625 0.34799957
+-10.875 0.25 0.28000259
+-10.046875 -0.03125 -0.54100037
+-10.046875 0 -0.68899918
+-11.109375 0.375 0.39599991
+-10.875 0.21875 0.32500076
+-10.046875 0 -0.64500046
+-11.125 0.375 0.43600082
+-10.859375 0.21875 0.36999893
+-10.0625 0 -0.60699844
+-10.9375 0.25 0.39099884
+-10.046875 0 -0.56299973
+-10.015625 0 -0.70599747
+-11.15625 0.40625 0.36999893
+-10.84375 0.21875 0.31399918
+-10.0625 0 -0.52399826
+-10.015625 0.03125 -0.66699982
+-11.109375 0.375 0.42300034
+-10.84375 0.21875 0.35800171
+-10.0625 -0.03125 -0.48099899
+-10.015625 0 -0.625
+-10.875 0.21875 0.39099884
+-10.0625 -0.03125 -0.43799973
+-10.046875 0 -0.58399963
+-11.125 0.4375 0.35499954
+-10.875 0.28125 0.28800201
+-10.015625 -0.0625 -0.38800049
+-10.046875 0 -0.54000092
+-11.125 0.40625 0.40299988
+-10.84375 0.21875 0.3409996
+-10.046875 0 -0.49900055
+-11.109375 0.375 0.44800186
+-10.90625 0.25 0.37200165
+-10.046875 0 -0.45700073
+-10.015625 0.03125 -0.60200119
+-11.125 0.4375 0.34199905
+-10.90625 0.3125 0.26599884
+-10.0625 -0.03125 -0.41500092
+-10.046875 0.03125 -0.56100082
+-11.109375 0.40625 0.38800049
+-10.859375 0.25 0.31999969
+-10.0625 -0.03125 -0.3730011
+-10.046875 0 -0.51799774
+-11.109375 0.40625 0.43300247
+-10.859375 0.25 0.35900116
+-10.0625 -0.03125 -0.32799911
+-10.046875 0 -0.47599792
+-10.921875 0.28125 0.38600159
+-10.0625 0 -0.43600082
+-11.125 0.4375 0.36800003
+-10.859375 0.28125 0.30200195
+-10.0625 0 -0.39400101
+-10 0 -0.5340004
+-11.125 0.40625 0.4109993
+-10.84375 0.25 0.34799957
+-10.0625 -0.03125 -0.34899902
+-10.015625 0 -0.49499893
+-11.09375 0.375 0.46699905
+-10.875 0.25 0.38199997
+-10.0625 -0.03125 -0.30500031
+-10.046875 0 -0.45299911
+-11.125 0.4375 0.35300064
+-10.84375 0.28125 0.29100037
+-10.0625 -0.03125 -0.26300049
+-10.046875 0 -0.40999985
+-11.109375 0.40625 0.39900208
+-10.84375 0.25 0.33300018
+-10.0625 0 -0.36899948
+-11.109375 0.40625 0.44700241
+-10.859375 0.25 0.3730011
+-10.0625 -0.03125 -0.3219986
+-10 0 -0.46500015
+-11.109375 0.4375 0.34300232
+-10.84375 0.28125 0.27400208
+-10.0625 -0.03125 -0.27999878
+-10.046875 0 -0.42699814
+-11.109375 0.40625 0.38899994
+-10.84375 0.25 0.32099915
+-10.0625 -0.03125 -0.23299789
+-10.046875 0 -0.38399887
+-11.109375 0.40625 0.43199921
+-10.859375 0.28125 0.35900116
+-10.046875 0 -0.3390007
+-11.078125 0.40625 0.34199905
+-10.0625 0 -0.29499817
+-11.125 0.4375 0.3710022
+-10.84375 0.28125 0.30900192
+-10.0625 -0.03125 -0.25
+-10.015625 0 -0.39500046
+-11.109375 0.40625 0.42399979
+-10.84375 0.25 0.35400009
+-10.0625 -0.03125 -0.20399857
+-10.046875 0 -0.35400009
+-10.9375 0.3125 0.3710022
+-10.0625 0 -0.31100082
+-11.125 0.4375 0.36000061
+-10.828125 0.25 0.3030014
+-10.0625 0 -0.26599884
+-9.984375 0 -0.40299988
+-11.109375 0.40625 0.41200256
+-10.84375 0.25 0.34400177
+-10.0625 -0.03125 -0.21999741
+-10.046875 0 -0.36700058
+-11.09375 0.375 0.46300125
+-10.875 0.28125 0.37800217
+-10.0625 -0.03125 -0.17200089
+-10.046875 0 -0.3239975
+-11.125 0.4375 0.35000229
+-10.859375 0.28125 0.28000259
+-10.0625 0 -0.27999878
+-11.109375 0.40625 0.39799881
+-10.828125 0.25 0.33200073
+-10.0625 -0.03125 -0.23400116
+-10.015625 0 -0.3789978
+-11.109375 0.40625 0.44700241
+-10.859375 0.28125 0.36899948
+-10.0625 -0.03125 -0.18799973
+-10.046875 0 -0.3390007
+-11.109375 0.4375 0.34600067
+-10.0625 0 -0.29599762
+-11.109375 0.40625 0.38800049
+-10.84375 0.28125 0.31800079
+-10.0625 0 -0.25
+-11.109375 0.40625 0.43600082
+-10.859375 0.28125 0.35700226
+-10.0625 -0.03125 -0.20399857
+-10.046875 0 -0.35099792
+-10.921875 0.28125 0.38899994
+-10.0625 0 -0.30899811
+-11.125 0.4375 0.37200165
+-10.84375 0.25 0.30599976
+-10.0625 0 -0.26300049
+-11.109375 0.40625 0.42399979
+-10.84375 0.25 0.35000229
+-10.0625 -0.03125 -0.2179985
+-10.046875 0 -0.36700058
+-10.90625 0.25 0.38500214
+-10.046875 0 -0.32299805
+-11.125 0.40625 0.36500168
+-10.828125 0.25 0.3030014
+-10.0625 0 -0.27799988
+-10 0 -0.41999817
+-11.125 0.40625 0.41400146
+-10.84375 0.25 0.3409996
+-10.0625 -0.03125 -0.22800064
+-10.046875 0 -0.38000107
+-10.859375 0.25 0.38500214
+-10.0625 0 -0.33699799
+-11.15625 0.40625 0.35200119
+-10.0625 0 -0.29100037
+-10.015625 0 -0.43600082
+-11.125 0.375 0.40200043
+-10.84375 0.21875 0.33399963
+-10.0625 -0.03125 -0.24300003
+-10.015625 0 -0.39199829
+-11.125 0.375 0.45199966
+-10.875 0.25 0.36899948
+-10.0625 0 -0.35099792
+-11.15625 0.40625 0.3409996
+-10.84375 0.25 0.27600098
+-10.046875 -0.03125 -0.30099869
+-10.015625 0 -0.45000076
+-11.125 0.375 0.39300156
+-10.84375 0.21875 0.31999969
+-10.0625 -0.03125 -0.25500107
+-10.015625 0 -0.40499878
+-11.125 0.34375 0.44100189
+-10.875 0.21875 0.36199951
+-10.0625 0 -0.36399841
+-11.125 0.375 0.3390007
+-10.0625 -0.03125 -0.31499863
+-10.015625 0 -0.4640007
+-11.125 0.375 0.38399887
+-10.828125 0.21875 0.31900024
+-10.046875 0 -0.41999817
+-11.125 0.34375 0.43799973
+-10.859375 0.1875 0.36299896
+-10.0625 0 -0.3730011
+-10 0 -0.51799774
+-10.0625 -0.03125 -0.32299805
+-10.046875 0 -0.47599792
+-11.15625 0.375 0.37900162
+-10.859375 0.21875 0.30200195
+-10.046875 0 -0.43099976
+-11.125 0.3125 0.43300247
+-10.84375 0.1875 0.35700226
+-10.046875 -0.03125 -0.38199997
+-10.015625 0 -0.53300095
+-11.078125 0.3125 0.34199905
+-10.046875 -0.03125 -0.33300018
+-10.046875 0 -0.48799896
+-11.171875 0.375 0.36700058
+-10.046875 0 -0.44300079
+-9.984375 0 -0.58799744
+-11.125 0.3125 0.42499924
+-10.0625 -0.03125 -0.39400101
+-10.015625 0 -0.54700089
+-10.046875 0 -0.50099945
+-11.171875 0.34375 0.36199951
+-10.046875 -0.03125 -0.45100021
+-10.015625 0 -0.60300064
+-10.90625 0.1875 0.33100128
+-10.046875 0 -0.55899811
+-10.046875 -0.03125 -0.50999832
+-10 0 -0.6609993
+-11.171875 0.3125 0.35700226
+-10.046875 -0.03125 -0.46299744
+-10.046875 0 -0.61800003
+-10.046875 0 -0.56900024
+-11.046875 0.25 0.33399963
+-10.046875 -0.03125 -0.51900101
+-10.015625 0 -0.67499924
+-11.171875 0.3125 0.35000229
+-10.0625 0 -0.63100052
+-10.046875 -0.03125 -0.58099747
+-10 0 -0.72999954
+-10.046875 -0.03125 -0.52999878
+-10.046875 0 -0.68799973
+-10.046875 0 -0.63899994
+-10 0 -0.78699875
+-10.046875 -0.03125 -0.5890007
+-10.015625 0 -0.74399948
+-10.046875 0 -0.69799805
+-9.9375 -0.03125 -0.83599854
+-10.046875 -0.03125 -0.64799881
+-10.015625 0 -0.80199814
+-10.046875 0 -0.75999832
+-10.046875 0 -0.78899765
+-10.046875 -0.03125 -0.73799896
+-10.015625 0.03125 -0.89299774
+-10.015625 -0.03125 -0.68600082
+-10.015625 0 -0.84499741
+-10.046875 0 -0.79899979
+-10 0.03125 -0.95199966
+-10.046875 -0.03125 -0.75
+-10.015625 0 -0.90599823
+-10.015625 0 -0.85799789
+-10 0.03125 -1.0109978
+-9.796875 0.4375 -2.6969986
+-10.015625 -0.03125 -0.80999756
+-10.015625 0 -0.96699905
+-9.796875 0.40625 -2.6520004
+-10.015625 0 -0.92099762
+-9.984375 0.03125 -1.072998
+-9.765625 0.4375 -2.7589989
+-10.015625 -0.03125 -0.8730011
+-10.015625 0 -1.0289993
+-9.796875 0.4375 -2.7159996
+-10.015625 0 -0.98099899
+-10 0.03125 -1.1349983
+-9.828125 0.40625 -2.6709976
+-10.015625 -0.03125 -0.93199921
+-10 0 -1.0890007
+-9.796875 0.4375 -2.7789993
+-10.015625 0 -1.0429993
+-9.984375 0.03125 -1.1940002
+-9.796875 0.40625 -2.7350006
+-10.015625 -0.03125 -0.99499893
+-10 0 -1.1499977
+-9.828125 0.40625 -2.6909981
+-10.046875 0 -1.105999
+-9.984375 0.03125 -1.2579994
+-9.84375 0.375 -2.6459999
+-9.828125 0.40625 -2.7989998
+-10.015625 -0.03125 -1.0569992
+-10 0 -1.2129974
+-9.828125 0.40625 -2.7550011
+-10.015625 0 -1.1669998
+-9.984375 0.03125 -1.3219986
+-9.8125 0.375 -2.7109985
+-10 -0.03125 -1.1170006
+-10 0 -1.276001
+-9.84375 0.34375 -2.6669998
+-10.015625 0 -1.2299995
+-10 0.03125 -1.3849983
+-9.8125 0.375 -2.776001
+-10 -0.03125 -1.1779976
+-10 0 -1.3390007
+-9.84375 0.34375 -2.7319984
+-10 0 -1.2910004
+-9.984375 0.03125 -1.4469986
+-9.859375 0.34375 -2.6879997
+-10 0 -1.401001
+-9.953125 0.03125 -1.5519981
+-9.859375 0.3125 -2.6419983
+-9.84375 0.34375 -2.7970009
+-10.015625 0 -1.3540001
+-9.984375 0.03125 -1.5099983
+-9.859375 0.34375 -2.7519989
+-10 0 -1.4650002
+-9.953125 0.03125 -1.6170006
+-9.859375 0.3125 -2.7080002
+-10 -0.03125 -1.4169998
+-9.984375 0.03125 -1.572998
+-9.875 0.28125 -2.6639977
+-9.84375 0.3125 -2.8169975
+-10 0 -1.5289993
+-9.984375 0.03125 -1.6839981
+-9.859375 0.28125 -2.7729988
+-10 -0.03125 -1.480999
+-10 0.03125 -1.6389999
+-9.875 0.28125 -2.7290001
+-10 0 -1.5919991
+-9.984375 0.03125 -1.7480011
+-9.875 0.25 -2.6839981
+-9.875 0.3125 -2.8400002
+-9.984375 -0.0625 -1.5410004
+-10 0 -1.7029991
+-9.953125 0.03125 -1.8579979
+-9.875 0.28125 -2.7949982
+-10 -0.03125 -1.6549988
+-9.984375 0.03125 -1.8120003
+-9.875 0.25 -2.75
+-9.984375 0 -1.7679977
+-9.96875 0.03125 -1.9249992
+-9.875 0.21875 -2.704998
+-9.984375 -0.03125 -1.718998
+-9.984375 0 -1.8789978
+-9.90625 0.21875 -2.6619987
+-9.875 0.25 -2.8159981
+-10 0 -1.8339996
+-9.96875 0.03125 -1.9889984
+-9.890625 0.21875 -2.7729988
+-9.984375 -0.03125 -1.7859993
+-9.984375 0 -1.9449997
+-9.953125 0.03125 -2.098999
+-9.90625 0.21875 -2.7280006
+-9.984375 0 -1.8979988
+-9.984375 0.03125 -2.0559998
+-9.9375 0.1875 -2.6829987
+-9.890625 0.21875 -2.8390007
+-9.984375 0 -2.0099983
+-9.953125 0.03125 -2.1650009
+-9.9375 0.15625 -2.6380005
+-9.90625 0.21875 -2.7949982
+-9.984375 -0.03125 -1.9630013
+-9.984375 0.03125 -2.1209984
+-9.921875 0.03125 -2.276001
+-9.9375 0.1875 -2.75
+-9.984375 0 -2.0760002
+-9.96875 0.03125 -2.2329979
+-9.90625 0.125 -2.7039986
+-9.984375 0 -2.1870003
+-9.953125 0.03125 -2.343998
+-9.953125 0.125 -2.6599998
+-9.90625 0.15625 -2.8159981
+-9.984375 -0.03125 -2.1409988
+-9.96875 0.03125 -2.2999992
+-9.953125 0.15625 -2.7729988
+-9.984375 0 -2.2539978
+-9.953125 0.03125 -2.4109993
+-9.953125 0.125 -2.7280006
+-9.984375 -0.03125 -2.2080002
+-9.984375 0.03125 -2.368
+-9.921875 0.03125 -2.5239983
+-9.96875 0.09375 -2.6839981
+-9.984375 0 -2.3219986
+-9.953125 0.03125 -2.4799995
+-9.984375 0.09375 -2.6399994
+-9.953125 0.125 -2.7970009
+-9.96875 0 -2.4360008
+-9.953125 0.03125 -2.5929985
+-9.96875 0.09375 -2.7529984
+-9.984375 -0.03125 -2.3899994
+-9.96875 0.03125 -2.5489998
+-9.984375 0.09375 -2.7089996
+-9.96875 0 -2.5039978
+-9.984375 0.0625 -2.6639977
+-9.953125 0.0625 -2.8209991
+-9.96875 -0.03125 -2.4580002
+-9.96875 0.03125 -2.618
+-9.96875 0.0625 -2.7770004
+-9.96875 -0.03125 -2.572998
+-9.984375 0.03125 -2.7340012
+-9.875 0.03125 -2.8889999
+-10 0.03125 -2.6899986
+-9.953125 0.03125 -2.8470001
+-10 0 -2.6459999
+-9.96875 0.03125 -2.8029976
+-9.921875 0.0625 -2.9630013
+-10.015625 0 -2.7609978
+-9.953125 0.03125 -2.9199982
+-9.90625 0.0625 -3.0779991
+-10.015625 0 -2.7169991
+-9.96875 0 -2.8759995
+-9.921875 0.03125 -3.0349998
+-10.046875 -0.03125 -2.6739998
+-9.96875 -0.03125 -2.829998
+-9.953125 0.03125 -2.9899979
+-9.90625 0.0625 -3.151001
+-10.015625 -0.03125 -2.7900009
+-9.96875 0 -2.947998
+-9.953125 0.03125 -3.1069984
+-10.046875 -0.03125 -2.7439995
+-9.96875 0.03125 -3.0629997
+-9.890625 0.03125 -3.2229996
+-10.0625 -0.0625 -2.7000008
+-9.9375 -0.03125 -3.0200005
+-9.953125 0.03125 -3.1790009
+-9.90625 0.0625 -3.3390007
+-10.0625 -0.09375 -2.6559982
+-10.015625 -0.0625 -2.8169975
+-9.953125 0 -3.1359978
+-9.921875 0.03125 -3.2959976
+-10.015625 -0.09375 -2.7709999
+-9.921875 -0.03125 -3.0909996
+-9.953125 0.03125 -3.2519989
+-9.90625 0.0625 -3.4119987
+-10.078125 -0.09375 -2.7299995
+-9.9375 -0.03125 -3.2080002
+-9.953125 0.03125 -3.3689995
+-9.875 0.0625 -3.5289993
+-10.078125 -0.125 -2.6839981
+-9.953125 0 -3.3250008
+-9.921875 0.03125 -3.4850006
+-10.09375 -0.15625 -2.6399994
+-10.0625 -0.125 -2.8009987
+-9.921875 -0.03125 -3.2819977
+-9.921875 0 -3.4419975
+-9.890625 0.03125 -3.6030006
+-10.03125 -0.15625 -2.7560005
+-9.953125 0 -3.3989983
+-9.921875 0.03125 -3.5599976
+-9.875 0.0625 -3.7210007
+-10.09375 -0.15625 -2.711998
+-9.953125 0 -3.5169983
+-9.90625 0.03125 -3.6779976
+-10.109375 -0.1875 -2.6709976
+-10.078125 -0.15625 -2.8310013
+-9.921875 -0.03125 -3.473999
+-9.921875 0.03125 -3.6349983
+-9.875 0.03125 -3.7970009
+-10.09375 -0.15625 -2.7869987
+-9.953125 0 -3.5919991
+-9.921875 0.03125 -3.7529984
+-9.859375 0.0625 -3.9160004
+-10.109375 -0.1875 -2.743
+-9.921875 0 -3.7099991
+-9.890625 0.03125 -3.8719978
+-10.125 -0.21875 -2.697998
+-9.921875 -0.03125 -3.6669998
+-9.921875 0.03125 -3.8279991
+-9.875 0.03125 -3.9910011
+-10.125 -0.25 -2.6539993
+-10.109375 -0.21875 -2.8159981
+-9.90625 0 -3.7859993
+-9.90625 0.03125 -3.9469986
+-9.859375 0.0625 -4.112999
+-10.125 -0.21875 -2.7719994
+-9.90625 0 -3.9039993
+-9.890625 0.03125 -4.0669975
+-10.15625 -0.25 -2.7280006
+-9.90625 -0.03125 -3.8619995
+-9.921875 0.03125 -4.0249977
+-9.875 0.0625 -4.1879997
+-10.15625 -0.28125 -2.6829987
+-9.90625 0 -3.9819984
+-9.90625 0.03125 -4.144001
+-9.859375 0.0625 -4.3089981
+-10.1875 -0.3125 -2.637001
+-10.171875 -0.28125 -2.8009987
+-9.90625 0 -4.1009979
+-9.890625 0.03125 -4.2630005
+-9.828125 0.0625 -4.4290009
+-10.171875 -0.3125 -2.7550011
+-9.890625 -0.03125 -4.0579987
+-9.890625 0 -4.2200012
+-9.84375 0.03125 -4.3839989
+-10.1875 -0.3125 -2.7099991
+-9.90625 0 -4.1759987
+-9.90625 0.03125 -4.3380013
+-9.859375 0.0625 -4.5039978
+-10.1875 -0.34375 -2.6650009
+-9.890625 0 -4.2959976
+-9.890625 0.03125 -4.4589996
+-9.8125 0.0625 -4.6259995
+-10.1875 -0.34375 -2.7819977
+-9.890625 -0.03125 -4.2529984
+-9.890625 0 -4.4150009
+-9.84375 0.03125 -4.579998
+-9.890625 -0.03125 -4.3719978
+-9.890625 0.03125 -4.5349998
+-9.859375 0.0625 -4.7010002
+-9.890625 0 -4.4920006
+-9.875 0.03125 -4.6569977
+-9.828125 0.0625 -4.8239975
+-9.875 -0.0625 -4.4500008
+-9.84375 0.03125 -4.7779999
+-9.875 -0.03125 -4.5699997
+-9.828125 0.0625 -4.8999977
+-9.921875 0.0625 -4.848999
+-9.828125 0.0625 -5.0219994
+-9.875 0.0625 -4.973999
+-9.796875 0.0625 -5.1459999
+-9.828125 0.0625 -5.0970001
+-9.8125 0.0625 -5.2210007
+-9.859375 0.0625 -5.2959976
+-9.828125 0.0625 -5.4209976
diff --git a/examples/official/RangeImage/range_image_border_extraction.py b/examples/official/RangeImage/range_image_border_extraction.py
new file mode 100644
index 000000000..9c442cc32
--- /dev/null
+++ b/examples/official/RangeImage/range_image_border_extraction.py
@@ -0,0 +1,262 @@
+# -*- coding: utf-8 -*-
+# How to extract borders from range images
+# http://pointclouds.org/documentation/tutorials/range_image_border_extraction.php#range-image-border-extraction
+
+import pcl
+import numpy as np
+import random
+import argparse
+
+import pcl.pcl_visualization
+
+# -----Parameters-----
+angular_resolution = 0.5
+# pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;
+coordinate_frame = pcl.CythonCoordinateFrame_Type.CAMERA_FRAME
+setUnseenToMaxRange = False;
+
+# -----Help-----
+# void printUsage (const char* progName)
+# {
+# std::cout << "\n\nUsage: "<\n\n"
+# << "Options:\n"
+# << "-------------------------------------------\n"
+# << "-r angular resolution in degrees (default "< coordinate frame (default "<< (int)coordinate_frame<<")\n"
+# << "-m Treat all unseen points to max range\n"
+# << "-h this help\n"
+# << "\n\n";
+# }
+
+# -----Main-----
+# // --------------
+# int main (int argc, char** argv)
+# // -----Parse Command Line Arguments-----
+# if (pcl::console::find_argument (argc, argv, "-h") >= 0)
+# {
+# printUsage (argv[0]);
+# return 0;
+# }
+# if (pcl::console::find_argument (argc, argv, "-m") >= 0)
+# {
+# setUnseenToMaxRange = true;
+# cout << "Setting unseen values in range image to maximum range readings.\n";
+# }
+# int tmp_coordinate_frame;
+# if (pcl::console::parse (argc, argv, "-c", tmp_coordinate_frame) >= 0)
+# {
+# coordinate_frame = pcl::RangeImage::CoordinateFrame (tmp_coordinate_frame);
+# cout << "Using coordinate frame "<< (int)coordinate_frame<<".\n";
+# }
+# if (pcl::console::parse (argc, argv, "-r", angular_resolution) >= 0)
+# cout << "Setting angular resolution to "< angular resolution in degrees (default = angular_resolution)\n'
+ '-c coordinate frame (default = coordinate_frame)\n'
+ '-m Treat all unseen points as max range\n'
+ '-h this help\n\n\n;')
+
+args = parser.parse_args()
+
+setUnseenToMaxRange = args.UnseenToMaxRange
+# coordinate_frame = pcl.RangeImage.CoordinateFrame (args.CoordinateFrame)
+# angular_resolution = pcl.deg2rad (args.AngularResolution)
+
+# // -----Read pcd file or create example point cloud if not given-----
+# pcl::PointCloud::Ptr point_cloud_ptr (new pcl::PointCloud);
+# pcl::PointCloud& point_cloud = *point_cloud_ptr;
+point_cloud = pcl.PointCloud()
+
+# pcl::PointCloud far_ranges;
+# Eigen::Affine3f scene_sensor_pose (Eigen::Affine3f::Identity ());
+# scene_sensor_pose = (Eigen::Affine3f::Identity ())
+
+# std::vector pcd_filename_indices = pcl::console::parse_file_extension_argument (argc, argv, "pcd");
+pcd_filename_indices = ''
+# pcd_filename_indices = [0, 0, 0]
+
+##
+# if (!pcd_filename_indices.empty ())
+# {
+# std::string filename = argv[pcd_filename_indices[0]];
+# if (pcl::io::loadPCDFile (filename, point_cloud) == -1)
+# {
+# cout << "Was not able to open file \""< Genarating example point cloud.\n\n";
+# for (float x=-0.5f; x<=0.5f; x+=0.01f)
+# {
+# for (float y=-0.5f; y<=0.5f; y+=0.01f)
+# {
+# PointType point; point.x = x; point.y = y; point.z = 2.0f - y;
+# point_cloud.points.push_back (point);
+# }
+# }
+# point_cloud.width = (int) point_cloud.points.size (); point_cloud.height = 1;
+# }
+
+if len(pcd_filename_indices) != 0:
+ # point_cloud = pcl.load(argv[0])
+ point_cloud = pcl.load('test_pcd.pcd')
+ far_ranges_filename = 'test_pcd.pcd'
+
+ far_ranges = pcl.load_PointWithViewpoint(far_ranges_filename)
+else:
+ setUnseenToMaxRange = True
+ print ('No *.pcd file given = Genarating example point cloud.\n')
+
+ count = 0
+ points = np.zeros((100 * 100, 3), dtype=np.float32)
+
+ # float NG
+ for x in range(-50, 50, 1):
+ for y in range(-50, 50, 1):
+ points[count][0] = x * 0.01
+ points[count][1] = y * 0.01
+ points[count][2] = 2.0 - y * 0.01
+ count = count + 1
+
+ point_cloud = pcl.PointCloud()
+ point_cloud.from_array(points)
+
+ far_ranges = pcl.PointCloud_PointWithViewpoint()
+
+
+##
+# Create RangeImage from the PointCloud
+noise_level = 0.0
+min_range = 0.0
+border_size = 1
+
+# boost::shared_ptr range_image_ptr (new pcl::RangeImage);
+# pcl::RangeImage& range_image = *range_image_ptr;
+# range_image.createFromPointCloud (point_cloud, angular_resolution, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f),
+# scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size);
+# range_image.integrateFarRanges (far_ranges);
+# if (setUnseenToMaxRange)
+# range_image.setUnseenToMaxRange ();
+##
+range_image = point_cloud.make_RangeImage()
+range_image.CreateFromPointCloud (point_cloud,
+ angular_resolution, pcl.deg2rad (360.0), pcl.deg2rad (180.0),
+ coordinate_frame, noise_level, min_range, border_size)
+print ('range_image::integrateFarRanges.\n')
+if setUnseenToMaxRange == True:
+ range_image.SetUnseenToMaxRange ()
+
+
+# -----Open 3D viewer and add point cloud-----
+# pcl::visualization::PCLVisualizer viewer ("3D Viewer");
+# viewer.setBackgroundColor (1, 1, 1);
+# viewer.addCoordinateSystem (1.0f, "global");
+# pcl::visualization::PointCloudColorHandlerCustom point_cloud_color_handler (point_cloud_ptr, 0, 0, 0);
+# viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");
+# // PointCloudColorHandlerCustom range_image_color_handler (range_image_ptr, 150, 150, 150);
+# // viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image");
+# // viewer.setPointCloudRenderingProperties (PCL_VISUALIZER_POINT_SIZE, 2, "range image");
+##
+# viewer = pcl.pcl_visualization.PCLVisualizering('3D Viewer')
+viewer = pcl.pcl_visualization.PCLVisualizering()
+viewer.SetBackgroundColor (1.0, 1.0, 1.0)
+range_image_color_handler = pcl.pcl_visualization.PointCloudColorHandleringCustom (point_cloud, 0, 0, 0)
+# viewer.AddPointCloud (range_image, range_image_color_handler, 'range image')
+viewer.AddPointCloud (point_cloud, 'range image')
+# viewer.AddPointCloud_ColorHandler
+# viewer.SetPointCloudRenderingProperties (pcl.pcl_visualization.PCLVISUALIZER_POINT_SIZE, 1, propName = 'range image')
+# NG - ([setPointCloudRenderingProperties] Could not find any PointCloud datasets with id !)
+# viewer.SetPointCloudRenderingProperties (pcl.pcl_visualization.PCLVISUALIZER_POINT_SIZE, 1)
+
+
+##
+# Extract borders
+# pcl::RangeImageBorderExtractor border_extractor (&range_image);
+# pcl::PointCloud border_descriptions;
+# border_extractor.compute (border_descriptions);
+
+##
+# // ----------------------------------
+# // -----Show points in 3D viewer-----
+# // ----------------------------------
+# pcl::PointCloud::Ptr border_points_ptr(new pcl::PointCloud),
+# veil_points_ptr(new pcl::PointCloud),
+# shadow_points_ptr(new pcl::PointCloud);
+# pcl::PointCloud& border_points = *border_points_ptr,
+# & veil_points = * veil_points_ptr,
+# & shadow_points = *shadow_points_ptr;
+# for (int y=0; y< (int)range_image.height; ++y)
+# {
+# for (int x=0; x< (int)range_image.width; ++x)
+# {
+# if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__OBSTACLE_BORDER])
+# border_points.points.push_back (range_image.points[y*range_image.width + x]);
+# if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__VEIL_POINT])
+# veil_points.points.push_back (range_image.points[y*range_image.width + x]);
+# if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__SHADOW_BORDER])
+# shadow_points.points.push_back (range_image.points[y*range_image.width + x]);
+# }
+# }
+# pcl::visualization::PointCloudColorHandlerCustom border_points_color_handler (border_points_ptr, 0, 255, 0);
+# viewer.addPointCloud (border_points_ptr, border_points_color_handler, "border points");
+# viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "border points");
+# pcl::visualization::PointCloudColorHandlerCustom veil_points_color_handler (veil_points_ptr, 255, 0, 0);
+# viewer.addPointCloud (veil_points_ptr, veil_points_color_handler, "veil points");
+# viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "veil points");
+# pcl::visualization::PointCloudColorHandlerCustom shadow_points_color_handler (shadow_points_ptr, 0, 255, 255);
+# viewer.addPointCloud (shadow_points_ptr, shadow_points_color_handler, "shadow points");
+# viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "shadow points");
+#
+
+
+
+##
+# //-------------------------------------
+# // -----Show points on range image-----
+# // ------------------------------------
+# pcl::visualization::RangeImageVisualizer* range_image_borders_widget = NULL;
+# range_image_borders_widget =
+# pcl::visualization::RangeImageVisualizer::getRangeImageBordersWidget (range_image, -std::numeric_limits::infinity (), std::numeric_limits