├── .autoenv.zsh ├── .autoenv_leave.zsh ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── CPPLINT.cfg ├── LICENSE ├── README.md ├── build.sh ├── data ├── labels │ ├── camera-intrinsics.color.txt │ ├── frame-000000.color.png │ ├── frame-000000.depth.png │ ├── frame-000000.pose.txt │ ├── frame-000000.segm.png │ ├── frame-000001.color.png │ ├── frame-000001.depth.png │ ├── frame-000001.pose.txt │ ├── frame-000001.segm.png │ ├── frame-000002.color.png │ ├── frame-000002.depth.png │ ├── frame-000002.pose.txt │ ├── frame-000002.segm.png │ ├── frame-000003.color.png │ ├── frame-000003.depth.png │ ├── frame-000003.pose.txt │ ├── frame-000003.segm.png │ ├── frame-000004.color.png │ ├── frame-000004.depth.png │ ├── frame-000004.pose.txt │ ├── frame-000004.segm.png │ ├── frame-000005.color.png │ ├── frame-000005.depth.png │ ├── frame-000005.pose.txt │ ├── frame-000005.segm.png │ ├── frame-000006.color.png │ ├── frame-000006.depth.png │ ├── frame-000006.pose.txt │ ├── frame-000006.segm.png │ ├── frame-000007.color.png │ ├── frame-000007.depth.png │ ├── frame-000007.pose.txt │ ├── frame-000007.segm.png │ ├── frame-000008.color.png │ ├── frame-000008.depth.png │ ├── frame-000008.pose.txt │ ├── frame-000008.segm.png │ ├── frame-000009.color.png │ ├── frame-000009.depth.png │ ├── frame-000009.pose.txt │ ├── frame-000009.segm.png │ ├── frame-000010.color.png │ ├── frame-000010.depth.png │ ├── frame-000010.pose.txt │ ├── frame-000010.segm.png │ ├── frame-000011.color.png │ ├── frame-000011.depth.png │ ├── frame-000011.pose.txt │ ├── frame-000011.segm.png │ ├── frame-000012.color.png │ ├── frame-000012.depth.png │ ├── frame-000012.pose.txt │ ├── frame-000012.segm.png │ ├── frame-000013.color.png │ ├── frame-000013.depth.png │ ├── frame-000013.pose.txt │ ├── frame-000013.segm.png │ ├── frame-000014.color.png │ ├── frame-000014.depth.png │ ├── frame-000014.pose.txt │ └── frame-000014.segm.png └── masks │ ├── camera-intrinsics.color.txt │ ├── frame-000000.color.png │ ├── frame-000000.depth.png │ ├── frame-000000.mask.png │ ├── frame-000000.pose.txt │ ├── frame-000001.color.png │ ├── frame-000001.depth.png │ ├── frame-000001.mask.png │ ├── frame-000001.pose.txt │ ├── frame-000002.color.png │ ├── frame-000002.depth.png │ ├── frame-000002.mask.png │ ├── frame-000002.pose.txt │ ├── frame-000003.color.png │ ├── frame-000003.depth.png │ ├── frame-000003.mask.png │ ├── frame-000003.pose.txt │ ├── frame-000004.color.png │ ├── frame-000004.depth.png │ ├── frame-000004.mask.png │ ├── frame-000004.pose.txt │ ├── frame-000005.color.png │ ├── frame-000005.depth.png │ ├── frame-000005.mask.png │ ├── frame-000005.pose.txt │ ├── frame-000006.color.png │ ├── frame-000006.depth.png │ ├── frame-000006.mask.png │ ├── frame-000006.pose.txt │ ├── frame-000007.color.png │ ├── frame-000007.depth.png │ ├── frame-000007.mask.png │ ├── frame-000007.pose.txt │ ├── frame-000008.color.png │ ├── frame-000008.depth.png │ ├── frame-000008.mask.png │ ├── frame-000008.pose.txt │ ├── frame-000009.color.png │ ├── frame-000009.depth.png │ ├── frame-000009.mask.png │ ├── frame-000009.pose.txt │ ├── frame-000010.color.png │ ├── frame-000010.depth.png │ ├── frame-000010.mask.png │ ├── frame-000010.pose.txt │ ├── frame-000011.color.png │ ├── frame-000011.depth.png │ ├── frame-000011.mask.png │ ├── frame-000011.pose.txt │ ├── frame-000012.color.png │ ├── frame-000012.depth.png │ ├── frame-000012.mask.png │ ├── frame-000012.pose.txt │ ├── frame-000013.color.png │ ├── frame-000013.depth.png │ ├── frame-000013.mask.png │ ├── frame-000013.pose.txt │ ├── frame-000014.color.png │ ├── frame-000014.depth.png │ ├── frame-000014.mask.png │ └── frame-000014.pose.txt ├── demo.py ├── include └── utils.hpp ├── src ├── bilateral_filter.cpp ├── label_fusion.cpp ├── label_view.cpp ├── marching_cubes.cpp ├── mask_fusion.cpp ├── mask_view.cpp └── organized_point_cloud.cpp └── static ├── label_fusion.png └── mask_fusion.png /.autoenv.zsh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | setup() { 4 | export _LD_LIBRARY_PATH=$LD_LIBRARY_PATH 5 | export _CMAKE_PREFIX_PATH=$CMAKE_PREFIX_PATH 6 | export _PATH=$PATH 7 | 8 | export CMAKE_PREFIX_PATH=$_autoenv_this_dir/devel 9 | export LD_LIBRARY_PATH=$_autoenv_this_dir/devel/lib 10 | export PATH=$_autoenv_this_dir/devel/bin:$_autoenv_this_dir/build:$PATH 11 | } 12 | 13 | _autoenv_this_dir=${0:a:h} 14 | setup -------------------------------------------------------------------------------- /.autoenv_leave.zsh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env zsh 2 | 3 | leave () { 4 | export PATH=$_PATH 5 | export LD_LIBRARY_PATH=$_LD_LIBRARY_PATH 6 | export CMAKE_PREFIX_PATH=$_CMAKE_PREFIX_PATH 7 | } 8 | 9 | leave 10 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /devel/ 3 | 4 | *.ply 5 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "octomap"] 2 | path = octomap 3 | url = https://github.com/wkentaro/octomap.git 4 | branch = label_fusion 5 | [submodule "pcl"] 6 | path = pcl 7 | url = https://github.com/PointCloudLibrary/pcl.git 8 | version = master 9 | -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required(VERSION 2.8) 2 | 3 | project(mask_fusion) 4 | 5 | find_package(octomap REQUIRED) 6 | include_directories(${OCTOMAP_INCLUDE_DIRS}) 7 | 8 | find_package(OpenCV REQUIRED) 9 | include_directories(${OpenCV_INCLUDE_DIRS}) 10 | 11 | if(NOT APPLE) 12 | find_package(OpenMP) 13 | set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") 14 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") 15 | endif() 16 | 17 | find_package(PCL REQUIRED) 18 | include_directories(${PCL_INCLUDE_DIRS}) 19 | 20 | include_directories(/usr/include/eigen3) 21 | 22 | include_directories(include) 23 | 24 | add_executable(mask_view src/mask_view.cpp) 25 | target_link_libraries(mask_view ${OpenCV_LIBRARIES} ${PCL_LIBRARIES}) 26 | 27 | add_executable(mask_fusion src/mask_fusion.cpp) 28 | target_link_libraries(mask_fusion ${OpenCV_LIBRARIES} ${OCTOMAP_LIBRARIES} ${PCL_LIBRARIES}) 29 | 30 | add_executable(label_view src/label_view.cpp) 31 | target_link_libraries(label_view ${OpenCV_LIBRARIES} ${PCL_LIBRARIES}) 32 | 33 | add_executable(label_fusion src/label_fusion.cpp) 34 | target_link_libraries(label_fusion ${OpenCV_LIBRARIES} ${OCTOMAP_LIBRARIES} ${PCL_LIBRARIES}) 35 | 36 | add_executable(marching_cubes src/marching_cubes.cpp) 37 | target_link_libraries(marching_cubes ${OpenCV_LIBRARIES} ${OCTOMAP_LIBRARIES} ${PCL_LIBRARIES}) 38 | 39 | add_executable(bilateral_filter src/bilateral_filter.cpp) 40 | target_link_libraries(bilateral_filter ${OpenCV_LIBRARIES} ${OCTOMAP_LIBRARIES} ${PCL_LIBRARIES}) 41 | 42 | add_executable(organized_point_cloud src/organized_point_cloud.cpp) 43 | target_link_libraries(organized_point_cloud ${OpenCV_LIBRARIES} ${OCTOMAP_LIBRARIES} ${PCL_LIBRARIES}) 44 | -------------------------------------------------------------------------------- /CPPLINT.cfg: -------------------------------------------------------------------------------- 1 | set noparent 2 | filter=-build/include_order 3 | filter=-whitespace/braces 4 | filter=-whitespace/newline 5 | linelength=120 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2017 Kentaro Wada 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # label-fusion: Volumetric Fusion of Multiple Semantic Labels 2 | 3 | 4 | 5 | C++ code to fuse multiple object labels or mask into OctoMap, 6 | which can be then used for 3d reconstruction of objects. 7 | It works with and without depth inputs, so can be applied for depth insensible objects: 8 | texture-less (for stereo), black (for ir), and transparent. 9 | 10 | 11 | ## Requirements 12 | 13 | - [OpenCV](http://opencv.org) (tested with OpenCV 2.4.8) 14 | - [Eigen](http://eigen.tuxfamily.org) 15 | - [octomap (modified version)](https://github.com/wkentaro/octomap/tree/label_fusion) (automatically resolved by `build.sh`) 16 | - [PCL](http://pointclouds.org) (tested with PCL 1.7.1) 17 | 18 | 19 | ## Installation 20 | 21 | ```bash 22 | git clone https://github.com/wkentaro/label-fusion.git 23 | cd label-fusion 24 | ./build.sh 25 | ``` 26 | 27 | 28 | ## Demo 29 | 30 | 31 | ### Fusion of multiple labels 32 | 33 | ```bash 34 | ./demo.py label_view # see inputs 35 | ./demo.py label_fusion 36 | ./demo.py label_fusion --depth # use depth 37 | ``` 38 | 39 | 40 | ### Fusion of multiple masks 41 | 42 | We also support fusing multiple masks: 43 | 44 | 45 | 46 | ```bash 47 | ./demo.py mask_view # see inputs 48 | ./demo.py mask_fusion 49 | ./demo.py mask_fusion --depth # use depth 50 | ``` 51 | 52 | 53 | ## License 54 | 55 | MIT License (see `LICENSE` file). 56 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -x 4 | 5 | THIS_DIR=$(pwd) 6 | 7 | git submodule update --init --recursive 8 | 9 | export CMAKE_PREFIX_PATH=${THIS_DIR}/devel 10 | 11 | for ext in octomap/octomap pcl; do 12 | mkdir -p ${THIS_DIR}/${ext}/build 13 | cd ${THIS_DIR}/${ext}/build 14 | cmake .. -DCMAKE_INSTALL_PREFIX:PATH=$CMAKE_PREFIX_PATH 15 | make install -j 16 | cd ${THIS_DIR} 17 | done 18 | 19 | mkdir -p build 20 | cd build 21 | cmake .. 22 | make -j 23 | 24 | set +x 25 | -------------------------------------------------------------------------------- /data/labels/camera-intrinsics.color.txt: -------------------------------------------------------------------------------- 1 | 6.11685730e+02 0.00000000e+00 3.17676056e+02 2 | 0.00000000e+00 6.11685791e+02 2.43151840e+02 3 | 0.00000000e+00 0.00000000e+00 1.00000000e+00 4 | -------------------------------------------------------------------------------- /data/labels/frame-000000.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000000.color.png -------------------------------------------------------------------------------- /data/labels/frame-000000.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000000.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000000.pose.txt: -------------------------------------------------------------------------------- 1 | 4.73180178e-01 -5.95957678e-05 8.80965672e-01 1.15680073e+00 2 | -8.80965142e-01 1.06664665e-03 4.73179966e-01 9.91077126e-02 3 | -9.67878604e-04 -9.99999429e-01 4.52214257e-04 1.14966408e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000000.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000000.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000001.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000001.color.png -------------------------------------------------------------------------------- /data/labels/frame-000001.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000001.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000001.pose.txt: -------------------------------------------------------------------------------- 1 | 2.71455159e-01 -4.89992896e-04 9.62450963e-01 1.12788705e+00 2 | -9.62451088e-01 -1.61762686e-04 2.71455112e-01 1.71700863e-01 3 | 2.26775761e-05 -9.99999867e-01 -5.15505512e-04 1.14927862e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000001.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000001.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000002.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000002.color.png -------------------------------------------------------------------------------- /data/labels/frame-000002.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000002.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000002.pose.txt: -------------------------------------------------------------------------------- 1 | 5.69735300e-02 -1.17690317e-03 9.98374996e-01 1.11523223e+00 2 | -9.98375688e-01 -1.12886118e-04 5.69734365e-02 2.48311484e-01 3 | 4.56504594e-05 -9.99999301e-01 -1.18142303e-03 1.14817537e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000002.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000002.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000003.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000003.color.png -------------------------------------------------------------------------------- /data/labels/frame-000003.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000003.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000003.pose.txt: -------------------------------------------------------------------------------- 1 | -1.61034291e-01 -2.82727720e-04 9.86948771e-01 1.11942867e+00 2 | -9.86948591e-01 -6.22413768e-04 -1.61034440e-01 3.26085975e-01 3 | 6.59819403e-04 -9.99999766e-01 -1.78807766e-04 1.14893724e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000003.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000003.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000004.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000004.color.png -------------------------------------------------------------------------------- /data/labels/frame-000004.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000004.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000004.pose.txt: -------------------------------------------------------------------------------- 1 | -3.70283433e-01 6.24081593e-04 9.28918613e-01 1.13907736e+00 2 | -9.28918619e-01 4.14184982e-04 -3.70283713e-01 4.01531963e-01 3 | -6.15831389e-04 -9.99999719e-01 4.26355175e-04 1.15056270e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000004.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000004.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000005.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000005.color.png -------------------------------------------------------------------------------- /data/labels/frame-000005.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000005.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000005.pose.txt: -------------------------------------------------------------------------------- 1 | -3.69797062e-01 -1.60618139e-01 9.15124006e-01 1.14436438e+00 2 | -9.29112512e-01 6.42145207e-02 -3.64179126e-01 3.99806261e-01 3 | -2.70475769e-04 -9.84925535e-01 -1.72978664e-01 1.21227125e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000005.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000005.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000006.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000006.color.png -------------------------------------------------------------------------------- /data/labels/frame-000006.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000006.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000006.pose.txt: -------------------------------------------------------------------------------- 1 | -1.59619880e-01 -1.71236618e-01 9.72213719e-01 1.12442216e+00 2 | -9.87178548e-01 2.77763342e-02 -1.57184570e-01 3.26166550e-01 3 | -8.87789804e-05 -9.84838310e-01 -1.73474771e-01 1.21174837e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000006.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000006.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000007.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000007.color.png -------------------------------------------------------------------------------- /data/labels/frame-000007.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000007.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000007.pose.txt: -------------------------------------------------------------------------------- 1 | 5.74448602e-02 -1.72584691e-01 9.83318164e-01 1.12032791e+00 2 | -9.98347873e-01 -1.11836102e-02 5.63600226e-02 2.48853978e-01 3 | 1.27017000e-03 -9.84931191e-01 -1.72942000e-01 1.21223937e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000007.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000007.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000008.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000008.color.png -------------------------------------------------------------------------------- /data/labels/frame-000008.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000008.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000008.pose.txt: -------------------------------------------------------------------------------- 1 | 2.71937455e-01 -1.67833190e-01 9.47566378e-01 1.13247261e+00 2 | -9.62314434e-01 -4.64296090e-02 2.67946304e-01 1.72730884e-01 3 | -9.75146557e-04 -9.84721439e-01 -1.74134251e-01 1.21170570e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000008.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000008.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000009.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000009.color.png -------------------------------------------------------------------------------- /data/labels/frame-000009.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000009.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000009.pose.txt: -------------------------------------------------------------------------------- 1 | 4.73463657e-01 -1.53336013e-01 8.67363956e-01 1.16218744e+00 2 | -8.80813233e-01 -8.19048496e-02 4.66325685e-01 1.01733706e-01 3 | -4.63206850e-04 -9.84773915e-01 -1.73839359e-01 1.21143652e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000009.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000009.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000010.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000010.color.png -------------------------------------------------------------------------------- /data/labels/frame-000010.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000010.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000010.pose.txt: -------------------------------------------------------------------------------- 1 | 4.73919300e-01 -3.00148346e-01 8.27835411e-01 1.17542811e+00 2 | -8.80567907e-01 -1.62404782e-01 4.45224491e-01 1.09989648e-01 3 | 8.11034833e-04 -9.39965774e-01 -3.41267761e-01 1.27289326e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000010.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000010.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000011.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000011.color.png -------------------------------------------------------------------------------- /data/labels/frame-000011.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000011.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000011.pose.txt: -------------------------------------------------------------------------------- 1 | 2.70729680e-01 -3.30503312e-01 9.04142135e-01 1.14915128e+00 2 | -9.62655403e-01 -9.30688551e-02 2.54229745e-01 1.76341358e-01 3 | 1.23700578e-04 -9.39204849e-01 -3.43357300e-01 1.27061527e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000011.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000011.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000012.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000012.color.png -------------------------------------------------------------------------------- /data/labels/frame-000012.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000012.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000012.pose.txt: -------------------------------------------------------------------------------- 1 | 5.62382198e-02 -3.42308847e-01 9.37902935e-01 1.13626378e+00 2 | -9.98417027e-01 -1.84920690e-02 5.31176474e-02 2.49162313e-01 3 | -8.38874849e-04 -9.39405502e-01 -3.42806943e-01 1.27150149e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000012.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000012.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000013.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000013.color.png -------------------------------------------------------------------------------- /data/labels/frame-000013.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000013.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000013.pose.txt: -------------------------------------------------------------------------------- 1 | -1.59993004e-01 -3.36902766e-01 9.27846304e-01 1.13988845e+00 2 | -9.87118068e-01 5.42263460e-02 -1.50523830e-01 3.22366710e-01 3 | 3.98179939e-04 -9.39976611e-01 -3.41238644e-01 1.27270098e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000013.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000013.segm.png -------------------------------------------------------------------------------- /data/labels/frame-000014.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000014.color.png -------------------------------------------------------------------------------- /data/labels/frame-000014.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000014.depth.png -------------------------------------------------------------------------------- /data/labels/frame-000014.pose.txt: -------------------------------------------------------------------------------- 1 | -3.71191625e-01 -3.17996000e-01 8.72407773e-01 1.16029719e+00 2 | -9.28555557e-01 1.25941538e-01 -3.49175180e-01 3.92798346e-01 3 | 1.16393402e-03 -9.39689988e-01 -3.42025397e-01 1.27126338e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/labels/frame-000014.segm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/labels/frame-000014.segm.png -------------------------------------------------------------------------------- /data/masks/camera-intrinsics.color.txt: -------------------------------------------------------------------------------- 1 | 6.11355347e+02 0.00000000e+00 3.37405731e+02 2 | 0.00000000e+00 6.11355408e+02 2.47190155e+02 3 | 0.00000000e+00 0.00000000e+00 1.00000000e+00 4 | -------------------------------------------------------------------------------- /data/masks/frame-000000.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000000.color.png -------------------------------------------------------------------------------- /data/masks/frame-000000.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000000.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000000.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000000.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000000.pose.txt: -------------------------------------------------------------------------------- 1 | 4.37806917e-01 1.16081784e-04 8.99069013e-01 1.16278293e+00 2 | -8.99068949e-01 -3.40775447e-04 4.37806930e-01 -1.64047595e-01 3 | 3.57202055e-04 -9.99999935e-01 -4.48283203e-05 9.21537468e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000001.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000001.color.png -------------------------------------------------------------------------------- /data/masks/frame-000001.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000001.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000001.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000001.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000001.pose.txt: -------------------------------------------------------------------------------- 1 | 2.33392315e-01 -1.80330090e-03 9.72380983e-01 1.13684965e+00 2 | -9.72382578e-01 -8.31475248e-04 2.33391155e-01 -8.99792793e-02 3 | 3.87636237e-04 -9.99998028e-01 -1.94755831e-03 9.19478605e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000002.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000002.color.png -------------------------------------------------------------------------------- /data/masks/frame-000002.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000002.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000002.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000002.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000002.pose.txt: -------------------------------------------------------------------------------- 1 | 1.79378315e-02 -1.65397127e-03 9.99837736e-01 1.12730803e+00 2 | -9.99839036e-01 -3.99211288e-04 1.79371945e-02 -1.22413770e-02 3 | 3.69478906e-04 -9.99998553e-01 -1.66086603e-03 9.19518481e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000003.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000003.color.png -------------------------------------------------------------------------------- /data/masks/frame-000003.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000003.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000003.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000003.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000003.pose.txt: -------------------------------------------------------------------------------- 1 | -1.99648274e-01 -1.01592749e-03 9.79867101e-01 1.13432269e+00 2 | -9.79867206e-01 1.13447544e-03 -1.99647119e-01 6.48985998e-02 3 | -9.08808164e-04 -9.99998840e-01 -1.22197009e-03 9.20009271e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000004.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000004.color.png -------------------------------------------------------------------------------- /data/masks/frame-000004.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000004.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000004.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000004.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000004.pose.txt: -------------------------------------------------------------------------------- 1 | -4.06389670e-01 -1.15545020e-03 9.13699130e-01 1.15788365e+00 2 | -9.13699607e-01 -2.32300785e-04 -4.06390176e-01 1.39703098e-01 3 | 6.81816634e-04 -9.99999305e-01 -9.61329752e-04 9.20202289e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000005.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000005.color.png -------------------------------------------------------------------------------- /data/masks/frame-000005.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000005.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000005.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000005.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000005.pose.txt: -------------------------------------------------------------------------------- 1 | -4.07437546e-01 -1.59052778e-01 8.99275742e-01 1.16313476e+00 2 | -9.13233066e-01 7.10830261e-02 -4.01188946e-01 1.36107866e-01 3 | -1.13024830e-04 -9.84707783e-01 -1.74214149e-01 9.82413004e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000006.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000006.color.png -------------------------------------------------------------------------------- /data/masks/frame-000006.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000006.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000006.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000006.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000006.pose.txt: -------------------------------------------------------------------------------- 1 | -2.00326638e-01 -1.69836205e-01 9.64896317e-01 1.13900593e+00 2 | -9.79728683e-01 3.57040646e-02 -1.97121605e-01 6.34460856e-02 3 | -9.72335287e-04 -9.84825306e-01 -1.73545876e-01 9.83165489e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000007.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000007.color.png -------------------------------------------------------------------------------- /data/masks/frame-000007.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000007.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000007.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000007.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000007.pose.txt: -------------------------------------------------------------------------------- 1 | 1.67793730e-02 -1.72610817e-01 9.84847175e-01 1.13234247e+00 2 | -9.99859121e-01 -2.46687696e-03 1.66027785e-02 -1.32923161e-02 3 | -4.36322350e-04 -9.84987015e-01 -1.72627892e-01 9.83654859e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000008.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000008.color.png -------------------------------------------------------------------------------- /data/masks/frame-000008.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000008.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000008.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000008.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000008.pose.txt: -------------------------------------------------------------------------------- 1 | 2.33054699e-01 -1.68678298e-01 9.57722893e-01 1.14222296e+00 2 | -9.72463578e-01 -4.01086485e-02 2.29577626e-01 -8.85386267e-02 3 | -3.11792319e-04 -9.84854775e-01 -1.73381010e-01 9.83334573e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000009.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000009.color.png -------------------------------------------------------------------------------- /data/masks/frame-000009.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000009.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000009.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000009.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000009.pose.txt: -------------------------------------------------------------------------------- 1 | 4.37918901e-01 -1.55538126e-01 8.85457468e-01 1.16795367e+00 2 | -8.99014085e-01 -7.66885652e-02 4.31152571e-01 -1.61103426e-01 3 | 8.43799806e-04 -9.84848595e-01 -1.73414338e-01 9.83405955e-01 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000010.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000010.color.png -------------------------------------------------------------------------------- /data/masks/frame-000010.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000010.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000010.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000010.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000010.pose.txt: -------------------------------------------------------------------------------- 1 | 4.37347068e-01 -3.07301919e-01 8.45158608e-01 1.18210266e+00 2 | -8.99292477e-01 -1.48650649e-01 4.11310132e-01 -1.54667039e-01 3 | -7.63016723e-04 -9.39930059e-01 -3.41366230e-01 1.04361068e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000011.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000011.color.png -------------------------------------------------------------------------------- /data/masks/frame-000011.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000011.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000011.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000011.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000011.pose.txt: -------------------------------------------------------------------------------- 1 | 2.32392499e-01 -3.31663962e-01 9.14326387e-01 1.15828302e+00 2 | -9.72622017e-01 -7.96043669e-02 2.18333589e-01 -8.55444217e-02 3 | 3.70990016e-04 -9.40033064e-01 -3.41083129e-01 1.04400259e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000012.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000012.color.png -------------------------------------------------------------------------------- /data/masks/frame-000012.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000012.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000012.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000012.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000012.pose.txt: -------------------------------------------------------------------------------- 1 | 1.64225207e-02 -3.41936300e-01 9.39579623e-01 1.14820094e+00 2 | -9.99864883e-01 -6.29130099e-03 1.51866614e-02 -1.36488029e-02 3 | 7.18307417e-04 -9.39702073e-01 -3.41993418e-01 1.04316512e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000013.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000013.color.png -------------------------------------------------------------------------------- /data/masks/frame-000013.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000013.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000013.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000013.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000013.pose.txt: -------------------------------------------------------------------------------- 1 | -2.00714956e-01 -3.33844891e-01 9.21010909e-01 1.15533320e+00 2 | -9.79649619e-01 6.87466023e-02 -1.88574996e-01 5.92708850e-02 3 | -3.61571811e-04 -9.40117808e-01 -3.40849492e-01 1.04451741e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /data/masks/frame-000014.color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000014.color.png -------------------------------------------------------------------------------- /data/masks/frame-000014.depth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000014.depth.png -------------------------------------------------------------------------------- /data/masks/frame-000014.mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/data/masks/frame-000014.mask.png -------------------------------------------------------------------------------- /data/masks/frame-000014.pose.txt: -------------------------------------------------------------------------------- 1 | -4.06273650e-01 -3.12387039e-01 8.58694392e-01 1.17767934e+00 2 | -9.13750694e-01 1.40106369e-01 -3.81352690e-01 1.31085494e-01 3 | -1.17891563e-03 -9.39566146e-01 -3.42365400e-01 1.04303219e+00 4 | 0.00000000e+00 0.00000000e+00 0.00000000e+00 1.00000000e+00 5 | -------------------------------------------------------------------------------- /demo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import argparse 4 | import distutils.spawn 5 | import os.path as osp 6 | import subprocess 7 | 8 | 9 | here = osp.dirname(osp.abspath(__file__)) 10 | 11 | 12 | def open_mesh(mesh_file): 13 | if distutils.spawn.find_executable('meshlab'): 14 | cmd = 'meshlab %s' % mesh_file 15 | subprocess.call(cmd, shell=True) 16 | else: 17 | print('Please install meshlab to view mesh file %s' % mesh_file) 18 | print(' sudo apt-get install meshlab') 19 | 20 | 21 | def demo_fusion(name, use_depth): 22 | input_type = name.split('_')[0] 23 | 24 | exe = osp.join(here, 'build/%s' % name) 25 | data_path = osp.join(here, 'data/%ss' % input_type) 26 | if use_depth: 27 | cmd = '%s --depth %s' % (exe, data_path) 28 | else: 29 | cmd = '%s %s' % (exe, data_path) 30 | subprocess.call(cmd, shell=True) 31 | 32 | out_file = osp.join(here, '%s.ply' % name) 33 | open_mesh(out_file) 34 | 35 | 36 | def demo_view(name): 37 | input_type = name.split('_')[0] 38 | 39 | cmd = '%s %s' % (osp.join(here, 'build/%s' % name), 40 | osp.join(here, 'data/%ss' % input_type)) 41 | subprocess.call(cmd, shell=True) 42 | 43 | out_file = osp.join(here, '%s.ply' % name) 44 | open_mesh(out_file) 45 | 46 | 47 | def main(): 48 | parser = argparse.ArgumentParser() 49 | parser.add_argument('name', choices=['mask_view', 'mask_fusion', 50 | 'label_view', 'label_fusion']) 51 | parser.add_argument('-d', '--depth', action='store_true') 52 | args = parser.parse_args() 53 | if args.name.endswith('_fusion'): 54 | demo_fusion(name=args.name, use_depth=args.depth) 55 | elif args.name.endswith('_view'): 56 | if args.depth: 57 | print('--depth is not supported for demo: %s' % args.name) 58 | return 59 | demo_view(name=args.name) 60 | else: 61 | print('Unsupported demo: %s' % args.name) 62 | 63 | 64 | if __name__ == '__main__': 65 | main() 66 | -------------------------------------------------------------------------------- /include/utils.hpp: -------------------------------------------------------------------------------- 1 | #include 2 | 3 | #include 4 | #include 5 | #include 6 | #include 7 | 8 | namespace utils 9 | { 10 | 11 | Eigen::MatrixXf 12 | loadMatrixFromFile(std::string filename, int M, int N) 13 | { 14 | Eigen::MatrixXf matrix(M, N); 15 | FILE* fp; 16 | if ((fp = fopen(filename.c_str(), "r")) == 0) 17 | { 18 | throw std::invalid_argument("File does not exist."); 19 | } 20 | for (int j = 0; j < M; j++) 21 | { 22 | for (int i = 0; i < N; i++) 23 | { 24 | float tmp; 25 | int iret = fscanf(fp, "%f", &tmp); 26 | matrix(j, i) = tmp; 27 | } 28 | } 29 | fclose(fp); 30 | return matrix; 31 | } 32 | 33 | float 34 | get_color(int c, int x, int max) 35 | { 36 | float colors[6][3] = { {1,0,1}, {0,0,1}, {0,1,1}, {0,1,0}, {1,1,0}, {1,0,0} }; 37 | float ratio = ((float)x/max)*5; 38 | int i = floor(ratio); 39 | int j = ceil(ratio); 40 | ratio -= i; 41 | float r = (1-ratio) * colors[i][c] + ratio*colors[j][c]; 42 | return r; 43 | } 44 | 45 | cv::Scalar 46 | get_label_color(unsigned int label_id, unsigned int n_label) 47 | { 48 | unsigned int offset = label_id * 123457 % n_label; 49 | float red = get_color(2, offset, n_label); 50 | float green = get_color(1, offset, n_label); 51 | float blue = get_color(0, offset, n_label); 52 | return cv::Scalar(red, green, blue); 53 | } 54 | 55 | cv::Mat 56 | loadSegmFile(std::string filename) 57 | { 58 | cv::Mat segm = cv::imread(filename, 0); 59 | if (segm.empty()) 60 | { 61 | std::cout << "Error: segm image file not read!" << std::endl; 62 | cv::waitKey(0); 63 | } 64 | // cv::imshow("segm", segm); 65 | // cv::waitKey(0); 66 | for (int j = 0; j < segm.rows; ++j) 67 | { 68 | for (int i = 0; i < segm.cols; ++i) { 69 | segm.at(j, i) = segm.at(j, i) / 6; 70 | } 71 | } 72 | return segm; 73 | } 74 | 75 | cv::Mat 76 | loadDepthFile(std::string filename) 77 | { 78 | cv::Mat depth_raw = cv::imread(filename, CV_LOAD_IMAGE_UNCHANGED); 79 | if (depth_raw.empty()) 80 | { 81 | std::cout << "Error: depth image file not read!" << std::endl; 82 | cv::waitKey(0); 83 | } 84 | cv::Mat depth(depth_raw.rows, depth_raw.cols, CV_32FC1); 85 | for (size_t j = 0; j < depth_raw.rows; ++j) 86 | { 87 | for (size_t i = 0; i < depth_raw.cols; ++i) 88 | { 89 | float tmp = static_cast(depth_raw.at(j, i) >> 3) / 1e4; 90 | if (tmp < 0.3) // nan for too small depth 91 | { 92 | depth.at(j, i) = std::numeric_limits::quiet_NaN(); 93 | } 94 | else 95 | { 96 | depth.at(j, i) = tmp; 97 | } 98 | } 99 | } 100 | return depth; 101 | } 102 | 103 | cv::Mat 104 | colorizeDepth(cv::Mat depth) 105 | { 106 | double min_value, max_value; 107 | cv::minMaxLoc(depth, &min_value, &max_value); 108 | cv::Mat depth_viz(depth.rows, depth.cols, CV_8UC3); 109 | cv::Mat(depth - min_value).convertTo( 110 | depth_viz, CV_8UC3, 255.0 / (max_value - min_value)); 111 | cv::applyColorMap(depth_viz, depth_viz, 2); // JET 112 | for (size_t j = 0; j < depth_viz.rows; ++j) 113 | { 114 | for (size_t i = 0; i < depth_viz.cols; ++i) 115 | { 116 | if (std::isnan(depth.at(j, i))) 117 | { 118 | depth_viz.at(j, i) = cv::Vec3b(0, 0, 0); 119 | } 120 | } 121 | } 122 | return depth_viz; 123 | } 124 | 125 | cv::Mat 126 | colorizeLabel(cv::Mat label, unsigned int n_label) 127 | { 128 | cv::Mat label_viz = cv::Mat::zeros(label.rows, label.cols, CV_8UC3); 129 | for (size_t j = 0; j < label.rows; j++) 130 | { 131 | for (size_t i = 0; i < label.cols; i++) 132 | { 133 | unsigned int label_id = static_cast(label.at(j, i)); 134 | assert(0 <= label_id && label_id < n_label); 135 | if (label_id != 0) { 136 | cv::Scalar color = utils::get_label_color(label_id, /*n_label=*/n_label); 137 | label_viz.at(j, i) = cv::Vec3b(color[2] * 255, color[1] * 255, color[0] * 255); 138 | } 139 | } 140 | } 141 | return label_viz; 142 | } 143 | 144 | pcl::PointXYZRGB 145 | depthToPoint(Eigen::Matrix4f cam_pose, Eigen::Matrix3f cam_K, float u, float v, float d, 146 | unsigned char r, unsigned char g, unsigned char b) 147 | { 148 | Eigen::Vector3f uv(u, v, 1); 149 | uv = cam_K.inverse() * uv; 150 | Eigen::Vector4f pt3d_(uv(0) * d, uv(1) * d, d, 1); 151 | pt3d_ = cam_pose * pt3d_; 152 | 153 | pcl::PointXYZRGB point(r, g, b); 154 | point.x = pt3d_(0); 155 | point.y = pt3d_(1); 156 | point.z = pt3d_(2); 157 | return point; 158 | } 159 | 160 | void 161 | splitext(std::string filename, std::string& basename, std::string& ext) 162 | { 163 | size_t ext_index = filename.find_last_of("."); 164 | basename = filename.substr(0, ext_index); 165 | ext = filename.substr(ext_index, basename.size()); 166 | } 167 | 168 | } // namespace utils 169 | -------------------------------------------------------------------------------- /src/bilateral_filter.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | #include "utils.hpp" 12 | 13 | int 14 | main(int argc, char *argv[]) 15 | { 16 | if (argc != 2) 17 | { 18 | printf("%s IN_FILE\n", argv[0]); 19 | return 1; 20 | } 21 | std::string in_file(argv[1]); 22 | 23 | // parameters used in kinfu 24 | float sigma_s = 4.5f; 25 | float sigma_r = 0.03f; 26 | 27 | // load cloud 28 | pcl::PointCloud::Ptr cloud(new pcl::PointCloud); 29 | pcl::io::loadPCDFile(in_file, *cloud); 30 | 31 | // bilateral filter 32 | pcl::FastBilateralFilter::Ptr filter(new pcl::FastBilateralFilter); 33 | filter->setInputCloud(cloud); 34 | filter->setSigmaS(sigma_s); 35 | filter->setSigmaR(sigma_r); 36 | // 37 | pcl::PointCloud::Ptr out_cloud(new pcl::PointCloud); 38 | filter->applyFilter(*out_cloud); 39 | 40 | // save filtered output 41 | std::string basename; 42 | std::string ext; 43 | utils::splitext(in_file, basename, ext); 44 | std::string out_file = basename + ".bf" + ext; 45 | pcl::io::savePCDFile(out_file, *out_cloud); 46 | std::cout << "Wrote point cloud to: " << out_file << std::endl; 47 | } 48 | -------------------------------------------------------------------------------- /src/label_fusion.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | 20 | #include "utils.hpp" 21 | 22 | void 23 | usage(const char** argv) 24 | { 25 | printf("Usage: %s [--depth] DATA_PATH\n", argv[0]); 26 | } 27 | 28 | int 29 | main(int argc, const char** argv) 30 | { 31 | bool use_depth; 32 | std::string data_path; 33 | if (argc == 3 && (std::string(argv[1]) == "--depth")) 34 | { 35 | use_depth = true; 36 | data_path = std::string(argv[2]); 37 | } 38 | else if (argc == 2) 39 | { 40 | use_depth = false; 41 | data_path = std::string(argv[1]); 42 | } 43 | else 44 | { 45 | usage(argv); 46 | return 1; 47 | } 48 | 49 | int n_views = 15; 50 | double resolution = 0.01; 51 | double threshold = 0.9; 52 | unsigned int n_label = 40; 53 | unsigned int ksize = 10; 54 | 55 | octomap::LabelCountingOcTree octree(/*resolution=*/resolution, /*n_label=*/n_label); 56 | 57 | // cam_info: intrinsic parameter of color camera 58 | std::string cam_K_file = data_path + "/camera-intrinsics.color.txt"; 59 | Eigen::Matrix3f cam_K = utils::loadMatrixFromFile(cam_K_file, 3, 3); 60 | std::cout << "cam_K" << std::endl << cam_K << std::endl << std::endl; 61 | 62 | pcl::PointCloud cloud; 63 | for (int frame_idx = 0; frame_idx < n_views; frame_idx++) 64 | { 65 | std::ostringstream curr_frame_prefix; 66 | curr_frame_prefix << std::setw(6) << std::setfill('0') << frame_idx; 67 | std::cout << "frame-" + curr_frame_prefix.str() << std::endl << std::endl; 68 | 69 | // segmentation file 70 | std::string segm_file = data_path + "/frame-" + curr_frame_prefix.str() + ".segm.png"; 71 | cv::Mat segm = utils::loadSegmFile(segm_file); 72 | // cv::Mat segm_viz = utils::colorizeLabel(segm, #<{(|n_label=|)}>#n_label); 73 | // cv::imshow("segm_viz", segm_viz); 74 | // cv::waitKey(0); 75 | 76 | cv::Mat depth; 77 | if (use_depth) 78 | { 79 | std::string depth_file = data_path + "/frame-" + curr_frame_prefix.str() + ".depth.png"; 80 | depth = utils::loadDepthFile(depth_file); 81 | // cv::Mat depth_viz = utils::colorizeDepth(depth); 82 | // cv::imshow("depth_viz", depth_viz); 83 | // cv::waitKey(0); 84 | } 85 | 86 | // pose: world -> camera 87 | std::string pose_file = data_path + "/frame-" + curr_frame_prefix.str() + ".pose.txt"; 88 | Eigen::Matrix4f cam_pose = utils::loadMatrixFromFile(pose_file, 4, 4); 89 | std::cout << "cam_pose" << std::endl << cam_pose << std::endl << std::endl; 90 | 91 | // camera origin 92 | Eigen::Vector4f origin_(0, 0, 0, 1); 93 | origin_ = cam_pose * origin_; 94 | Eigen::Vector3f origin(origin_(0), origin_(1), origin_(2)); 95 | 96 | // visualize camera origin 97 | pcl::PointXYZRGB pt(255, 0, 0); 98 | pt.x = origin(0); 99 | pt.y = origin(1); 100 | pt.z = origin(2); 101 | cloud.push_back(pt); 102 | 103 | std::map occupied_cells; 104 | octomap::KeySet occupied_cells_all; 105 | octomap::KeySet unoccupied_cells; 106 | #pragma omp parallel for 107 | for (int v = 0; v < segm.rows; v += ksize) 108 | { 109 | for (int u = 0; u < segm.cols; u += ksize) 110 | { 111 | float d = std::numeric_limits::quiet_NaN(); 112 | if (use_depth) 113 | { 114 | d = depth.at(v, u); 115 | } 116 | 117 | Eigen::Vector3f uv(u, v, 1); 118 | uv = cam_K.inverse() * uv; 119 | Eigen::Vector4f direction_(uv(0), uv(1), uv(2), 1); // with depth 120 | Eigen::Vector4f direction_far_(direction_(0), direction_(1), direction_(2), 1); // without depth 121 | if (!std::isnan(d)) 122 | { 123 | direction_(0) *= d; 124 | direction_(1) *= d; 125 | direction_(2) = d; 126 | } 127 | direction_ = cam_pose * direction_; 128 | direction_far_ = cam_pose * direction_far_; 129 | Eigen::Vector3f direction(direction_(0), direction_(1), direction_(2)); 130 | Eigen::Vector3f direction_far(direction_far_(0), direction_far_(1), direction_far_(2)); 131 | 132 | // visualize ray direction 133 | pcl::PointXYZRGB pt(0, 0, 255); 134 | pt.x = direction_far(0); 135 | pt.y = direction_far(1); 136 | pt.z = direction_far(2); 137 | #pragma omp critical 138 | cloud.push_back(pt); 139 | 140 | octomap::point3d pt_origin(origin(0), origin(1), origin(2)); 141 | octomap::point3d pt_direction(direction(0), direction(1), direction(2)); 142 | octomap::point3d pt_direction_far(direction_far(0), direction_far(1), direction_far(2)); 143 | unsigned int label_id = static_cast(segm.at(v, u)); 144 | if (label_id != 0) 145 | { 146 | octomap::KeyRay key_ray; 147 | octree.computeRayKeys(pt_origin, pt_direction_far, key_ray); 148 | #pragma omp critical 149 | occupied_cells[label_id].insert(key_ray.begin(), key_ray.end()); 150 | } 151 | if (!std::isnan(d)) 152 | { 153 | octomap::KeyRay key_ray; 154 | if (octree.computeRayKeys(pt_origin, pt_direction, key_ray)) 155 | { 156 | #pragma omp critical 157 | unoccupied_cells.insert(key_ray.begin(), key_ray.end()); 158 | } 159 | } 160 | } 161 | } 162 | for (octomap::KeySet::iterator it = unoccupied_cells.begin(), end = unoccupied_cells.end(); 163 | it != end; ++it) 164 | { 165 | if (occupied_cells_all.find(*it) == occupied_cells_all.end()) 166 | { 167 | octree.updateNode(*it, /*label=*/-1, /*hit=*/false, /*reset=*/true); 168 | } 169 | } 170 | for (unsigned int label_id = 1; label_id < n_label; label_id++) 171 | { 172 | for (octomap::KeySet::iterator it = occupied_cells[label_id].begin(), end = occupied_cells[label_id].end(); 173 | it != end; ++it) 174 | { 175 | octree.updateNode(*it, /*label=*/label_id); 176 | } 177 | } 178 | } 179 | 180 | // visualize 3d segmentation 181 | octomap::point3d_list node_centers; 182 | std::vector node_labels; 183 | octree.getCentersMinHits(node_centers, node_labels, static_cast(threshold * n_views)); 184 | unsigned int index = 0; 185 | for (octomap::point3d_list::iterator it = node_centers.begin(), end = node_centers.end(); it != end; ++it) 186 | { 187 | unsigned int label_id = node_labels[index]; 188 | cv::Scalar color = utils::get_label_color(label_id, /*n_label=*/n_label); 189 | pcl::PointXYZRGB pt(color[0] * 255, color[1] * 255, color[2] * 255); 190 | pt.x = (*it).x(); 191 | pt.y = (*it).y(); 192 | pt.z = (*it).z(); 193 | cloud.push_back(pt); 194 | index += 1; 195 | } 196 | assert(index == node_labels.size()); 197 | std::string out_file("label_fusion.pcd"); 198 | pcl::io::savePCDFile(out_file, cloud); 199 | std::cout << "Wrote mask fusion result to: " << out_file << std::endl; 200 | } 201 | -------------------------------------------------------------------------------- /src/label_view.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "utils.hpp" 19 | 20 | int 21 | main(int argc, const char** argv) 22 | { 23 | if (argc != 2) 24 | { 25 | printf("Usage: %s DATA_PATH\n", argv[0]); 26 | return 1; 27 | } 28 | std::string data_path(argv[1]); 29 | 30 | int n_views = 15; 31 | unsigned int n_label = 40; 32 | 33 | // cam_info: intrinsic parameter of color camera 34 | std::string cam_K_file = data_path + "/camera-intrinsics.color.txt"; 35 | Eigen::Matrix3f cam_K = utils::loadMatrixFromFile(cam_K_file, 3, 3); 36 | std::cout << "cam_K" << std::endl << cam_K << std::endl << std::endl; 37 | 38 | pcl::PointCloud cloud_color; 39 | pcl::PointCloud cloud_segm; 40 | for (int frame_idx = 0; frame_idx < n_views; frame_idx++) 41 | { 42 | std::ostringstream curr_frame_prefix; 43 | curr_frame_prefix << std::setw(6) << std::setfill('0') << frame_idx; 44 | std::cout << "frame-" + curr_frame_prefix.str() << std::endl << std::endl; 45 | 46 | // img file 47 | std::string img_file = data_path + "/frame-" + curr_frame_prefix.str() + ".color.png"; 48 | cv::Mat img = cv::imread(img_file); 49 | 50 | // segmentation file 51 | std::string segm_file = data_path + "/frame-" + curr_frame_prefix.str() + ".segm.png"; 52 | cv::Mat segm = utils::loadSegmFile(segm_file); 53 | cv::Mat segm_viz = utils::colorizeLabel(segm, /*n_label=*/n_label); 54 | 55 | // depth file 56 | std::string depth_file = data_path + "/frame-" + curr_frame_prefix.str() + ".depth.png"; 57 | cv::Mat depth = utils::loadDepthFile(depth_file); 58 | cv::Mat depth_viz = utils::colorizeDepth(depth); 59 | 60 | cv::Mat viz; 61 | cv::hconcat(img, depth_viz, viz); 62 | cv::hconcat(viz, segm_viz, viz); 63 | cv::resize(viz, viz, cv::Size(), 0.5, 0.5); 64 | 65 | cv::imshow(argv[1], viz); 66 | cv::waitKey(30); 67 | 68 | // pose: world -> camera 69 | std::string pose_file = data_path + "/frame-" + curr_frame_prefix.str() + ".pose.txt"; 70 | Eigen::Matrix4f cam_pose = utils::loadMatrixFromFile(pose_file, 4, 4); 71 | std::cout << "cam_pose" << std::endl << cam_pose << std::endl << std::endl; 72 | 73 | // visualize camera origin 74 | { 75 | Eigen::Vector4f origin_(0, 0, 0, 1); 76 | origin_ = cam_pose * origin_; 77 | Eigen::Vector3f origin(origin_(0), origin_(1), origin_(2)); 78 | pcl::PointXYZRGB pt(255, 0, 0); 79 | pt.x = origin(0); 80 | pt.y = origin(1); 81 | pt.z = origin(2); 82 | cloud_color.push_back(pt); 83 | cloud_segm.push_back(pt); 84 | } 85 | 86 | #pragma omp parallel for 87 | for (size_t v = 0; v < depth.rows; v++) 88 | { 89 | for (size_t u = 0; u < depth.cols; u++) 90 | { 91 | float d = depth.at(v, u); 92 | if (std::isnan(d)) 93 | { 94 | continue; 95 | } 96 | 97 | cv::Vec3b color = img.at(v, u); 98 | pcl::PointXYZRGB pt_color = utils::depthToPoint( 99 | cam_pose, cam_K, u, v, d, color[2], color[1], color[0]); 100 | #pragma omp critical 101 | cloud_color.push_back(pt_color); 102 | 103 | cv::Vec3b color_label = segm_viz.at(v, u); 104 | pcl::PointXYZRGB pt_segm(color_label[2], color_label[1], color_label[0]); 105 | pt_segm.x = pt_color.x; 106 | pt_segm.y = pt_color.y; 107 | pt_segm.z = pt_color.z; 108 | #pragma omp critical 109 | cloud_segm.push_back(pt_segm); 110 | } 111 | } 112 | } 113 | 114 | std::string out_file; 115 | out_file = "label_view.color.pcd"; 116 | pcl::io::savePCDFile(out_file, cloud_color); 117 | std::cout << "Wrote point cloud result to: " << out_file << std::endl; 118 | 119 | out_file = "label_view.segm.pcd"; 120 | pcl::io::savePCDFile(out_file, cloud_segm); 121 | std::cout << "Wrote point cloud result to: " << out_file << std::endl; 122 | } 123 | -------------------------------------------------------------------------------- /src/marching_cubes.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | #include 15 | 16 | int 17 | main(int argc, char** argv) 18 | { 19 | pcl::PointCloud::Ptr cloud(new pcl::PointCloud); 20 | 21 | if (pcl::io::loadPCDFile(argv[1], *cloud) == -1) 22 | { 23 | std::cout << "ERROR: couldn't find file" << std::endl; 24 | return 1; 25 | } 26 | else 27 | { 28 | std::cout << "loaded" << std::endl; 29 | 30 | pcl::NormalEstimationOMP ne; 31 | pcl::search::KdTree::Ptr tree1(new pcl::search::KdTree); 32 | tree1->setInputCloud(cloud); 33 | ne.setInputCloud(cloud); 34 | ne.setSearchMethod(tree1); 35 | ne.setKSearch(10); 36 | pcl::PointCloud::Ptr normals(new pcl::PointCloud); 37 | ne.compute(*normals); 38 | 39 | // Concatenate the XYZ and normal fields* 40 | pcl::PointCloud::Ptr cloud_with_normals(new pcl::PointCloud); 41 | pcl::concatenateFields(*cloud, *normals, *cloud_with_normals); 42 | 43 | // Create search tree* 44 | pcl::search::KdTree::Ptr tree(new pcl::search::KdTree); 45 | tree->setInputCloud(cloud_with_normals); 46 | 47 | std::cout << "begin marching cubes reconstruction" << std::endl; 48 | 49 | pcl::MarchingCubesHoppe mc; 50 | pcl::PolygonMesh::Ptr triangles(new pcl::PolygonMesh); 51 | mc.setIsoLevel(0.0f); 52 | mc.setGridResolution(50, 50, 50); 53 | mc.setPercentageExtendGrid(0.0f); 54 | mc.setInputCloud(cloud_with_normals); 55 | mc.setSearchMethod(tree); 56 | mc.reconstruct(*triangles); 57 | 58 | std::cout << triangles->polygons.size() << " triangles created" << std::endl; 59 | 60 | pcl::PolygonMesh output; 61 | mc.reconstruct(output); 62 | std::string out_file("marching_cubes.ply"); 63 | pcl::io::savePLYFile(out_file, output); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/mask_fusion.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "utils.hpp" 19 | 20 | void 21 | usage(const char** argv) 22 | { 23 | printf("Usage: %s [--depth] DATA_PATH\n", argv[0]); 24 | } 25 | 26 | int 27 | main(int argc, const char** argv) 28 | { 29 | bool use_depth; 30 | std::string data_path; 31 | if (argc == 3 && (std::string(argv[1]) == "--depth")) 32 | { 33 | use_depth = true; 34 | data_path = std::string(argv[2]); 35 | } 36 | else if (argc == 2) 37 | { 38 | use_depth = false; 39 | data_path = std::string(argv[1]); 40 | } 41 | else 42 | { 43 | usage(argv); 44 | return 1; 45 | } 46 | 47 | int n_views = 15; 48 | double resolution = 0.01; 49 | double threshold = 0.95; 50 | unsigned int ksize = 10; 51 | 52 | octomap::CountingOcTree octree(/*resolution=*/resolution); 53 | 54 | // cam_info: intrinsic parameter of color camera 55 | std::string cam_K_file = data_path + "/camera-intrinsics.color.txt"; 56 | Eigen::Matrix3f cam_K = utils::loadMatrixFromFile(cam_K_file, 3, 3); 57 | std::cout << "cam_K" << std::endl << cam_K << std::endl << std::endl; 58 | 59 | pcl::PointCloud cloud; 60 | for (int frame_idx = 0; frame_idx < n_views; frame_idx++) 61 | { 62 | std::ostringstream curr_frame_prefix; 63 | curr_frame_prefix << std::setw(6) << std::setfill('0') << frame_idx; 64 | std::cout << "frame-" + curr_frame_prefix.str() << std::endl << std::endl; 65 | 66 | // mask file 67 | std::string mask_file = data_path + "/frame-" + curr_frame_prefix.str() + ".mask.png"; 68 | cv::Mat mask = cv::imread(mask_file, 0); 69 | 70 | cv::Mat depth; 71 | if (use_depth) 72 | { 73 | std::string depth_file = data_path + "/frame-" + curr_frame_prefix.str() + ".depth.png"; 74 | depth = utils::loadDepthFile(depth_file); 75 | // cv::Mat depth_viz = utils::colorizeDepth(depth); 76 | // cv::imshow("depth_viz", depth_viz); 77 | // cv::waitKey(0); 78 | } 79 | 80 | // pose: world -> camera 81 | std::string pose_file = data_path + "/frame-" + curr_frame_prefix.str() + ".pose.txt"; 82 | Eigen::Matrix4f cam_pose = utils::loadMatrixFromFile(pose_file, 4, 4); 83 | std::cout << "cam_pose" << std::endl << cam_pose << std::endl << std::endl; 84 | 85 | // camera origin 86 | Eigen::Vector4f origin_(0, 0, 0, 1); 87 | origin_ = cam_pose * origin_; 88 | Eigen::Vector3f origin(origin_(0), origin_(1), origin_(2)); 89 | 90 | // visualize camera origin 91 | pcl::PointXYZRGB pt(255, 0, 0); 92 | pt.x = origin(0); 93 | pt.y = origin(1); 94 | pt.z = origin(2); 95 | cloud.push_back(pt); 96 | 97 | octomap::KeySet occupied_cells; 98 | octomap::KeySet unoccupied_cells; 99 | #pragma omp parallel for 100 | for (int v = 0; v < mask.rows; v += ksize) 101 | { 102 | for (int u = 0; u < mask.cols; u += ksize) 103 | { 104 | float d = std::numeric_limits::quiet_NaN(); 105 | if (use_depth) 106 | { 107 | d = depth.at(v, u); 108 | } 109 | 110 | Eigen::Vector3f uv(u, v, 1); 111 | uv = cam_K.inverse() * uv; 112 | Eigen::Vector4f direction_(uv(0), uv(1), uv(2), 1); // with depth 113 | Eigen::Vector4f direction_far_(direction_(0), direction_(1), direction_(2), 1); // without depth 114 | if (!std::isnan(d)) 115 | { 116 | direction_(0) *= d; 117 | direction_(1) *= d; 118 | direction_(2) = d; 119 | } 120 | direction_ = cam_pose * direction_; 121 | direction_far_ = cam_pose * direction_far_; 122 | Eigen::Vector3f direction(direction_(0), direction_(1), direction_(2)); 123 | Eigen::Vector3f direction_far(direction_far_(0), direction_far_(1), direction_far_(2)); 124 | 125 | // visualize ray direction 126 | pcl::PointXYZRGB pt(0, 0, 255); 127 | pt.x = direction_far(0); 128 | pt.y = direction_far(1); 129 | pt.z = direction_far(2); 130 | #pragma omp critical 131 | cloud.push_back(pt); 132 | 133 | octomap::point3d pt_origin(origin(0), origin(1), origin(2)); 134 | octomap::point3d pt_direction(direction(0), direction(1), direction(2)); 135 | octomap::point3d pt_direction_far(direction_far(0), direction_far(1), direction_far(2)); 136 | if (mask.at(v, u) > 127) 137 | { 138 | octomap::KeyRay key_ray; 139 | octree.computeRayKeys(pt_origin, pt_direction_far, key_ray); 140 | #pragma omp critical 141 | occupied_cells.insert(key_ray.begin(), key_ray.end()); 142 | } 143 | if (!std::isnan(d)) 144 | { 145 | octomap::KeyRay key_ray; 146 | if (octree.computeRayKeys(pt_origin, pt_direction, key_ray)) 147 | { 148 | #pragma omp critical 149 | unoccupied_cells.insert(key_ray.begin(), key_ray.end()); 150 | } 151 | } 152 | } 153 | } 154 | for (octomap::KeySet::iterator it = unoccupied_cells.begin(), end = unoccupied_cells.end(); it != end; ++it) 155 | { 156 | octree.updateNode(*it, /*hit=*/false, /*reset=*/true); 157 | } 158 | for (octomap::KeySet::iterator it = occupied_cells.begin(), end = occupied_cells.end(); it != end; ++it) 159 | { 160 | if (unoccupied_cells.find(*it) == unoccupied_cells.end()) 161 | { 162 | octree.updateNode(*it, /*hit=*/true); 163 | } 164 | } 165 | } 166 | 167 | // visualize 3d segmentation 168 | octomap::point3d_list node_centers; 169 | octree.getCentersMinHits(node_centers, static_cast(threshold * n_views)); 170 | for (octomap::point3d_list::iterator it = node_centers.begin(), end = node_centers.end(); it != end; ++it) 171 | { 172 | pcl::PointXYZRGB pt(0, 255, 0); 173 | pt.x = (*it).x(); 174 | pt.y = (*it).y(); 175 | pt.z = (*it).z(); 176 | cloud.push_back(pt); 177 | } 178 | std::string out_file("mask_fusion.pcd"); 179 | pcl::io::savePCDFile(out_file, cloud); 180 | std::cout << "Wrote mask fusion result to: " << out_file << std::endl; 181 | } 182 | -------------------------------------------------------------------------------- /src/mask_view.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "utils.hpp" 19 | 20 | int 21 | main(int argc, const char** argv) 22 | { 23 | if (argc != 2) 24 | { 25 | printf("Usage: %s DATA_PATH\n", argv[0]); 26 | return 1; 27 | } 28 | std::string data_path(argv[1]); 29 | 30 | int n_views = 15; 31 | 32 | // cam_info: intrinsic parameter of color camera 33 | std::string cam_K_file = data_path + "/camera-intrinsics.color.txt"; 34 | Eigen::Matrix3f cam_K = utils::loadMatrixFromFile(cam_K_file, 3, 3); 35 | std::cout << "cam_K" << std::endl << cam_K << std::endl << std::endl; 36 | 37 | pcl::PointCloud cloud_color; 38 | pcl::PointCloud cloud_mask; 39 | for (int frame_idx = 0; frame_idx < n_views; frame_idx++) 40 | { 41 | std::ostringstream curr_frame_prefix; 42 | curr_frame_prefix << std::setw(6) << std::setfill('0') << frame_idx; 43 | std::cout << "frame-" + curr_frame_prefix.str() << std::endl << std::endl; 44 | 45 | // img file 46 | std::string img_file = data_path + "/frame-" + curr_frame_prefix.str() + ".color.png"; 47 | cv::Mat img = cv::imread(img_file); 48 | 49 | // mask file 50 | std::string mask_file = data_path + "/frame-" + curr_frame_prefix.str() + ".mask.png"; 51 | cv::Mat mask = cv::imread(mask_file, 0); 52 | cv::Mat mask_viz; 53 | cv::cvtColor(mask, mask_viz, cv::COLOR_GRAY2BGR); 54 | 55 | // depth file 56 | std::string depth_file = data_path + "/frame-" + curr_frame_prefix.str() + ".depth.png"; 57 | cv::Mat depth = utils::loadDepthFile(depth_file); 58 | cv::Mat depth_viz = utils::colorizeDepth(depth); 59 | 60 | cv::Mat viz; 61 | cv::hconcat(img, depth_viz, viz); 62 | cv::hconcat(viz, mask_viz, viz); 63 | cv::resize(viz, viz, cv::Size(), 0.5, 0.5); 64 | 65 | cv::imshow(argv[1], viz); 66 | cv::waitKey(30); 67 | 68 | // pose: world -> camera 69 | std::string pose_file = data_path + "/frame-" + curr_frame_prefix.str() + ".pose.txt"; 70 | Eigen::Matrix4f cam_pose = utils::loadMatrixFromFile(pose_file, 4, 4); 71 | std::cout << "cam_pose" << std::endl << cam_pose << std::endl << std::endl; 72 | 73 | // visualize camera origin 74 | { 75 | Eigen::Vector4f origin_(0, 0, 0, 1); 76 | origin_ = cam_pose * origin_; 77 | Eigen::Vector3f origin(origin_(0), origin_(1), origin_(2)); 78 | pcl::PointXYZRGB pt(255, 0, 0); 79 | pt.x = origin(0); 80 | pt.y = origin(1); 81 | pt.z = origin(2); 82 | cloud_color.push_back(pt); 83 | cloud_mask.push_back(pt); 84 | } 85 | 86 | #pragma omp parallel for 87 | for (size_t v = 0; v < depth.rows; v++) 88 | { 89 | for (size_t u = 0; u < depth.cols; u++) 90 | { 91 | float d = depth.at(v, u); 92 | if (std::isnan(d)) 93 | { 94 | continue; 95 | } 96 | 97 | cv::Vec3b color = img.at(v, u); 98 | pcl::PointXYZRGB pt_color = utils::depthToPoint( 99 | cam_pose, cam_K, u, v, d, color[2], color[1], color[0]); 100 | #pragma omp critical 101 | cloud_color.push_back(pt_color); 102 | 103 | uint8_t m = mask.at(v, u); 104 | pcl::PointXYZRGB pt_mask(m, m, m); 105 | pt_mask.x = pt_color.x; 106 | pt_mask.y = pt_color.y; 107 | pt_mask.z = pt_color.z; 108 | #pragma omp critical 109 | cloud_mask.push_back(pt_mask); 110 | } 111 | } 112 | } 113 | 114 | std::string out_file; 115 | out_file = "mask_view.color.pcd"; 116 | pcl::io::savePCDFile(out_file, cloud_color); 117 | std::cout << "Wrote point cloud result to: " << out_file << std::endl; 118 | 119 | out_file = "mask_view.mask.pcd"; 120 | pcl::io::savePCDFile(out_file, cloud_mask); 121 | std::cout << "Wrote point cloud result to: " << out_file << std::endl; 122 | } 123 | -------------------------------------------------------------------------------- /src/organized_point_cloud.cpp: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Copyright (c) 2017, Kentaro Wada, University of Tokyo 3 | // ---------------------------------------------------------------------------- 4 | 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include 13 | #include 14 | #include 15 | #include 16 | #include 17 | 18 | #include "utils.hpp" 19 | 20 | int main(int argc, char* argv[]) 21 | { 22 | if (argc != 2) 23 | { 24 | printf("Usage: %s DATA_PATH\n", argv[0]); 25 | return 1; 26 | } 27 | std::string data_path(argv[1]); 28 | 29 | for (int frame_idx = 0; frame_idx < 15; frame_idx++) 30 | { 31 | // frame_idx 32 | std::ostringstream curr_frame_prefix; 33 | curr_frame_prefix << std::setw(6) << std::setfill('0') << frame_idx; 34 | std::cout << "frame-" + curr_frame_prefix.str() << std::endl << std::endl; 35 | 36 | // cam_info: intrinsic parameter of color camera 37 | std::string cam_K_file = data_path + "/camera-intrinsics.color.txt"; 38 | Eigen::Matrix3f cam_K = utils::loadMatrixFromFile(cam_K_file, 3, 3); 39 | std::cout << "cam_K" << std::endl << cam_K << std::endl << std::endl; 40 | 41 | // img file 42 | std::string img_file = data_path + "/frame-" + curr_frame_prefix.str() + ".color.png"; 43 | cv::Mat img = cv::imread(img_file); 44 | 45 | // depth file 46 | std::string depth_file = data_path + "/frame-" + curr_frame_prefix.str() + ".depth.png"; 47 | cv::Mat depth = utils::loadDepthFile(depth_file); 48 | 49 | // pose: world -> camera 50 | std::string pose_file = data_path + "/frame-" + curr_frame_prefix.str() + ".pose.txt"; 51 | Eigen::Matrix4f cam_pose = utils::loadMatrixFromFile(pose_file, 4, 4); 52 | std::cout << "cam_pose" << std::endl << cam_pose << std::endl << std::endl; 53 | 54 | pcl::PointCloud::Ptr cloud(new pcl::PointCloud); 55 | cloud->points.resize(depth.rows * depth.cols); 56 | cloud->height = depth.rows; 57 | cloud->width = depth.cols; 58 | #pragma omp parallel for 59 | for (size_t v = 0; v < depth.rows; v++) 60 | { 61 | for (size_t u = 0; u < depth.cols; u++) 62 | { 63 | float d = depth.at(v, u); 64 | 65 | pcl::PointXYZRGB pt; 66 | if (std::isnan(d)) 67 | { 68 | pt = pcl::PointXYZRGB(); 69 | } 70 | else 71 | { 72 | cv::Vec3b color = img.at(v, u); 73 | pt = utils::depthToPoint(cam_pose, cam_K, u, v, d, color[2], color[1], color[0]); 74 | } 75 | cloud->at(u, v) = pt; 76 | } 77 | } 78 | 79 | std::string out_file = "frame-" + curr_frame_prefix.str() + ".color.pcd"; 80 | std::cout << "Wrote point cloud result to: " << out_file << std::endl; 81 | pcl::io::savePCDFile(out_file, *cloud); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /static/label_fusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/static/label_fusion.png -------------------------------------------------------------------------------- /static/mask_fusion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wkentaro/label-fusion/cf1af103627073bf0dc225ee05589db649a13169/static/mask_fusion.png --------------------------------------------------------------------------------