├── .gitignore ├── ICL-NUIMdataset └── of_kt0 │ ├── associations.txt │ ├── depth │ ├── 1.png │ ├── 10.png │ ├── 100.png │ ├── 101.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 5.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 57.png │ ├── 58.png │ ├── 59.png │ ├── 6.png │ ├── 60.png │ ├── 61.png │ ├── 62.png │ ├── 63.png │ ├── 64.png │ ├── 65.png │ ├── 66.png │ ├── 67.png │ ├── 68.png │ ├── 69.png │ ├── 7.png │ ├── 70.png │ ├── 71.png │ ├── 72.png │ ├── 73.png │ ├── 74.png │ ├── 75.png │ ├── 76.png │ ├── 77.png │ ├── 78.png │ ├── 79.png │ ├── 8.png │ ├── 80.png │ ├── 81.png │ ├── 82.png │ ├── 83.png │ ├── 84.png │ ├── 85.png │ ├── 86.png │ ├── 87.png │ ├── 88.png │ ├── 89.png │ ├── 9.png │ ├── 90.png │ ├── 91.png │ ├── 92.png │ ├── 93.png │ ├── 94.png │ ├── 95.png │ ├── 96.png │ ├── 97.png │ ├── 98.png │ └── 99.png │ ├── groundtruth.txt │ └── rgb │ ├── 1.png │ ├── 10.png │ ├── 100.png │ ├── 101.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 34.png │ ├── 35.png │ ├── 36.png │ ├── 37.png │ ├── 38.png │ ├── 39.png │ ├── 4.png │ ├── 40.png │ ├── 41.png │ ├── 42.png │ ├── 43.png │ ├── 44.png │ ├── 45.png │ ├── 46.png │ ├── 47.png │ ├── 48.png │ ├── 49.png │ ├── 5.png │ ├── 50.png │ ├── 51.png │ ├── 52.png │ ├── 53.png │ ├── 54.png │ ├── 55.png │ ├── 56.png │ ├── 57.png │ ├── 58.png │ ├── 59.png │ ├── 6.png │ ├── 60.png │ ├── 61.png │ ├── 62.png │ ├── 63.png │ ├── 64.png │ ├── 65.png │ ├── 66.png │ ├── 67.png │ ├── 68.png │ ├── 69.png │ ├── 7.png │ ├── 70.png │ ├── 71.png │ ├── 72.png │ ├── 73.png │ ├── 74.png │ ├── 75.png │ ├── 76.png │ ├── 77.png │ ├── 78.png │ ├── 79.png │ ├── 8.png │ ├── 80.png │ ├── 81.png │ ├── 82.png │ ├── 83.png │ ├── 84.png │ ├── 85.png │ ├── 86.png │ ├── 87.png │ ├── 88.png │ ├── 89.png │ ├── 9.png │ ├── 90.png │ ├── 91.png │ ├── 92.png │ ├── 93.png │ ├── 94.png │ ├── 95.png │ ├── 96.png │ ├── 97.png │ ├── 98.png │ └── 99.png ├── LICENSE ├── MWMS_core ├── Interval_Stabbing │ ├── addon │ │ └── lsd_1.6 │ │ │ ├── COPYING │ │ │ ├── Makefile │ │ │ ├── Matlab │ │ │ ├── MEX │ │ │ │ └── MEX_lsd_cmd.c │ │ │ ├── MEX_lsd_cmd.mexw64 │ │ │ ├── README.md │ │ │ ├── compileMex.m │ │ │ ├── lsd.m │ │ │ ├── lsdf.m │ │ │ ├── lsdfb.m │ │ │ └── test_lsd.m │ │ │ ├── README.txt │ │ │ ├── doc │ │ │ ├── annotated.html │ │ │ ├── doxygen.css │ │ │ ├── files.html │ │ │ ├── formula.repository │ │ │ ├── functions.html │ │ │ ├── functions_vars.html │ │ │ ├── globals.html │ │ │ ├── globals_defs.html │ │ │ ├── globals_func.html │ │ │ ├── globals_type.html │ │ │ ├── graph_legend.dot │ │ │ ├── graph_legend.html │ │ │ ├── index.html │ │ │ ├── lsd_8c-source.html │ │ │ ├── lsd_8c.html │ │ │ ├── lsd_8h-source.html │ │ │ ├── lsd_8h.html │ │ │ ├── structcoorlist.html │ │ │ ├── structimage__char__s.html │ │ │ ├── structimage__double__s.html │ │ │ ├── structimage__int__s.html │ │ │ ├── structntuple__list__s.html │ │ │ ├── structpoint.html │ │ │ ├── structrect.html │ │ │ └── structrect__iter.html │ │ │ ├── doxygen.config │ │ │ ├── lsd.c │ │ │ ├── lsd.h │ │ │ ├── lsd_call_example.c │ │ │ └── lsd_cmd.c │ ├── computeHorizontalDDfromTheta.m │ ├── computeThetaInterval.m │ ├── maxStabbing.m │ ├── parametrizeHorizontalDD.m │ └── sortEndPts.m ├── ManhattanMaxStabbingIntervals.m ├── MeanShift.m ├── addon │ └── lsd_1.6 │ │ ├── COPYING │ │ ├── Makefile │ │ ├── Matlab │ │ ├── MEX │ │ │ └── MEX_lsd_cmd.c │ │ ├── MEX_lsd_cmd.mexw64 │ │ ├── README.md │ │ ├── compileMex.m │ │ ├── lsd.m │ │ ├── lsdf.m │ │ ├── lsdfb.m │ │ └── test_lsd.m │ │ ├── README.txt │ │ ├── doc │ │ ├── annotated.html │ │ ├── doxygen.css │ │ ├── files.html │ │ ├── formula.repository │ │ ├── functions.html │ │ ├── functions_vars.html │ │ ├── globals.html │ │ ├── globals_defs.html │ │ ├── globals_func.html │ │ ├── globals_type.html │ │ ├── graph_legend.dot │ │ ├── graph_legend.html │ │ ├── index.html │ │ ├── lsd_8c-source.html │ │ ├── lsd_8c.html │ │ ├── lsd_8h-source.html │ │ ├── lsd_8h.html │ │ ├── structcoorlist.html │ │ ├── structimage__char__s.html │ │ ├── structimage__double__s.html │ │ ├── structimage__int__s.html │ │ ├── structntuple__list__s.html │ │ ├── structpoint.html │ │ ├── structrect.html │ │ └── structrect__iter.html │ │ ├── doxygen.config │ │ ├── lsd.c │ │ ├── lsd.h │ │ ├── lsd_call_example.c │ │ └── lsd_cmd.c ├── angle2rotmtx.m ├── clusterManhattanMaxStabbingLines.m ├── computeConsistencyMeasure1.m ├── computeConsistencyMeasure2.m ├── computeNumInXYZCone.m ├── computeOptimalMF.m ├── computeRotationMatrixDifference.m ├── convertManhattanThetaInterval.m ├── detectPlaneRANSAC.m ├── downsampleDepth.m ├── downsampleImage.m ├── downsampleKmatrix.m ├── estimateLineModel.m ├── estimatePlaneModel.m ├── estimatePlaneNormalRANSAC.m ├── estimateSurfaceNormalGradient.m ├── estimateSurfaceNormalGradient_mex.mexw64 ├── extractLinesAndGreatcircle.m ├── extractUniqueLines.m ├── findInvalidManhattanLines.m ├── getImgInTUMRGBDdataset.m ├── getImgPyramid.m ├── getSyncTUMRGBDdataset.m ├── inThresforPlane.m ├── initialize_cam_TUM_RGBD.m ├── load_param_MWMS.m ├── main_script_ICL_NUIM.m ├── orthogonalDistanceResidual.m ├── parametrizeVerticalDD.m ├── plot_MW_theta_interval_aligned.m ├── plot_Manhattan_camera_frame.m ├── plot_display_text.m ├── plot_extended_lines.m ├── plot_image_lines.m ├── plot_tracked_single_plane.m ├── plot_true_camera_frame.m ├── plots_status_with_true.m ├── q2r.m ├── r2q.m ├── rawICLNUIMdataset_load.m ├── refineOrthogonalParallelLines.m ├── rotmtx2angle.m ├── roveFeatureGeneration.m ├── seekManhattanWorld.m ├── seekPlaneManhattanWorld.m ├── setupParams_ICL_NUIM.m ├── trackManhattanWorld.m ├── trackSinglePlane.m └── undistortPts_normal.m ├── README.md ├── overview.png └── result.png /.gitignore: -------------------------------------------------------------------------------- 1 | ICL-NUIMdataset/of_kt0/ICRA2022 2 | *.doc 3 | *.tmp 4 | *.pptx 5 | *.pdf 6 | 7 | -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/1.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/10.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/100.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/101.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/11.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/12.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/13.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/14.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/15.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/16.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/17.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/18.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/19.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/2.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/20.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/21.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/22.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/23.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/24.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/25.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/26.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/27.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/28.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/29.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/3.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/30.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/31.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/32.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/33.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/34.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/35.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/36.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/37.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/38.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/39.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/4.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/40.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/41.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/42.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/43.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/44.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/45.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/46.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/47.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/48.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/49.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/5.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/50.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/51.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/52.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/53.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/54.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/55.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/56.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/57.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/58.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/59.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/6.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/60.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/61.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/62.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/63.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/64.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/65.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/66.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/67.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/68.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/69.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/7.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/70.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/71.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/72.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/73.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/74.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/75.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/76.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/77.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/78.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/79.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/8.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/80.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/81.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/82.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/83.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/84.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/85.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/86.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/87.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/88.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/89.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/9.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/90.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/91.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/92.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/93.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/94.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/95.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/96.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/97.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/98.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/depth/99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/depth/99.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/1.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/10.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/100.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/101.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/11.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/12.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/13.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/14.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/15.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/16.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/17.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/18.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/19.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/2.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/20.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/21.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/22.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/23.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/24.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/25.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/26.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/27.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/28.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/29.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/3.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/30.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/31.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/32.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/33.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/34.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/35.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/35.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/36.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/37.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/37.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/38.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/39.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/39.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/4.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/40.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/41.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/42.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/42.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/43.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/44.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/44.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/45.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/45.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/46.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/46.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/47.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/48.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/49.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/49.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/5.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/50.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/51.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/51.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/52.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/52.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/53.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/54.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/54.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/55.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/55.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/56.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/57.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/58.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/59.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/6.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/60.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/61.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/61.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/62.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/62.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/63.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/63.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/64.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/65.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/66.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/67.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/67.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/68.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/68.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/69.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/69.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/7.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/70.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/71.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/71.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/72.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/73.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/74.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/75.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/76.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/77.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/78.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/78.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/79.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/79.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/8.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/80.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/81.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/82.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/82.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/83.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/84.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/85.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/86.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/87.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/87.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/88.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/88.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/89.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/89.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/9.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/90.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/91.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/92.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/93.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/94.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/95.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/96.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/97.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/97.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/98.png -------------------------------------------------------------------------------- /ICL-NUIMdataset/of_kt0/rgb/99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/ICL-NUIMdataset/of_kt0/rgb/99.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Pyojin Kim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Makefile: -------------------------------------------------------------------------------- 1 | # ----------------------------------------------------------------------------- 2 | # 3 | # LSD - Line Segment Detector on digital images 4 | # 5 | # Copyright (c) 2007-2011 rafael grompone von gioi 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU Affero General Public License as 9 | # published by the Free Software Foundation, either version 3 of the 10 | # License, or (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU Affero General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Affero General Public License 18 | # along with this program. If not, see . 19 | # 20 | # ----------------------------------------------------------------------------- 21 | 22 | all: lsd lsd_call_example 23 | 24 | lsd: lsd.c lsd.h lsd_cmd.c 25 | cc -O3 -o lsd lsd_cmd.c lsd.c -lm 26 | 27 | lsd_call_example: lsd.c lsd.h lsd_call_example.c 28 | cc -o lsd_call_example lsd_call_example.c lsd.c -lm 29 | 30 | doc: lsd.c lsd.h doxygen.config 31 | doxygen doxygen.config 32 | 33 | clean: 34 | rm -f lsd lsd_call_example 35 | 36 | cleandoc: 37 | rm -rf doc 38 | 39 | # ----------------------------------------------------------------------------- 40 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/MEX_lsd_cmd.mexw64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/MEX_lsd_cmd.mexw64 -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/README.md: -------------------------------------------------------------------------------- 1 | ## Matlab wrapper for LSD 2 | 3 | ### LSD Program : 4 | 5 | If you want to use the lsd program : 6 | - Go to the current directory with Matlab 7 | - Within Matlab, type : 8 | 9 | >compileMex 10 | 11 | You can now use the lsd function within matlab 12 | 13 | Type : 14 | > help lsd 15 | 16 | in Matlab to see how it works. 17 | 18 | *Paul-Darius Sarmadi - July 2014* 19 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/compileMex.m: -------------------------------------------------------------------------------- 1 | mex MEX/MEX_lsd_cmd.c ../lsd.c -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/lsd.m: -------------------------------------------------------------------------------- 1 | function out=lsd(image,option,normalize_image) 2 | % LSD returns an array containing datas concerning line segments detected 3 | % in an image 4 | % out = LSD(A) returns line segments belonging to A 5 | % 6 | % INPUT : 7 | % ======= 8 | % 9 | % A must be a double matrix. 10 | % To load it from an image on your computer -which has to be a .pgm file- use the following command : 11 | % A=double(imread('adress/of/file.pgm')) 12 | % 13 | % OPTIONS : 14 | % ========= 15 | % 16 | % Even if default options are optimized, you can change them as you wish. 17 | % Just use a structure containing them or the ones you need. 18 | % For example, if you want a scale equals to one and a sigma_coef equals to 0.7, type the following command : 19 | % option.scale=1; 20 | % option.sigma_coef=0.8; 21 | % out = LSD(A,option) 22 | % 23 | % You can name your structure as you want. However its components have to respect some rules : 24 | % 25 | % SCALE : 26 | % name as a component of the optional structure : scale 27 | % type : double 28 | % default value : 0.8 29 | % minimum value : 0.0 30 | % maximum value : - 31 | % Scale image by Gaussian filter before processing. 32 | % 33 | % SIGMA COEFFICIENT : 34 | % name as a component of the optional structure : sigma_coef 35 | % type : double 36 | % default value : 0.6 37 | % minimum value : 0.0 38 | % maximum value : - 39 | % Sigma for Gaussian filter is computed as sigma_coef/scale. 40 | % 41 | % QUANTIZATION : 42 | % name as a component of the optional structure : quant 43 | % type : double 44 | % default value : 2.0 45 | % minimum value : 0.0 46 | % maximum value : - 47 | % Bound to quantization error on the gradient norm. 48 | % 49 | % ANGLE TOLERANCE : 50 | % name as a component of the optional structure : ang_th 51 | % type : double 52 | % default value : 22.5 53 | % minimum value : 0.0 54 | % maximum value : 180.0 55 | % Gradient angle tolerance in degrees. 56 | % 57 | % DETECTION THRESHOLD : 58 | % name as a component of the optional structure : log_eps 59 | % type : double 60 | % default value : 0.0 61 | % minimum value : - 62 | % maximum value : - 63 | % Detection threshold, -log10(max. NFA) 64 | % 65 | % DENSITY : 66 | % name as a component of the optional structure : density_th 67 | % type : double 68 | % default value : 0.7 69 | % minimum value : 0.0 70 | % maximum value : 1.0 71 | % Minimal density of region points in a rectangle to be accepted. 72 | % 73 | % NUMBER OF BINS : 74 | % name as a component of the optional structure : n_bins 75 | % type : integer 76 | % default value : 1024 77 | % minimum value : 1 78 | % maximum value : - 79 | % Number of bins in 'ordering' of gradient modulus. 80 | % 81 | % RETURNED VALUE : 82 | % ================ 83 | % 84 | % The returned value is a matrix. 85 | % Each row represents a segment. 86 | % The first column contains x1 87 | % The second column contains y1 88 | % The third column contains x2 89 | % The fourth column contains y2 90 | % The three last columns contain other informations available at the following adress : 91 | % http://www.ipol.im/pub/art/2012/gjmr-lsd/ 92 | % 93 | % NOTE: think to modify the mex because it does not handle colors. Images 94 | % have to be renormalized 95 | 96 | if(~ismatrix(image)) 97 | image=rgb2gray(image); 98 | end 99 | 100 | if(nargin<3) 101 | normalize_image=1; 102 | end 103 | 104 | if(normalize_image) 105 | image=floor(256*image/max(max(image))); 106 | end 107 | 108 | if (~exist('option', 'var')) 109 | out=MEX_lsd_cmd(image); 110 | else 111 | out=MEX_lsd_cmd(image,option); 112 | end -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/lsdf.m: -------------------------------------------------------------------------------- 1 | %-------------------------------------------------------------------------- 2 | % Real-time Camera Orientation and Vanishing Point Estimation (ROVE) 3 | % Copyright (C) 2015 Jeong-Kyun Lee and Kuk-Jin Yoon 4 | % 5 | % This program is free software: you can redistribute it and/or modify 6 | % it under the terms of the GNU General Public License as published by 7 | % the Free Software Foundation, either version 3 of the License, or 8 | % any later version. 9 | % 10 | % This program is distributed in the hope that it will be useful, 11 | % but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | % GNU General Public License for more details. 14 | % 15 | % You should have received a copy of the GNU General Public License 16 | % along with this program. If not, see . 17 | %-------------------------------------------------------------------------- 18 | % If you use this code, please cite: 19 | % Jeong-Kyun Lee and Kuk-Jin Yoon, 'Real-Time Joint Estimation of Camera 20 | % Orientation and Vanishing Points', The IEEE Conference on Computer 21 | % Vision and Pattern Recognition (CVPR), Boston, June, 2015. 22 | %-------------------------------------------------------------------------- 23 | function [ lines n ] = lsdf( img, thr ) 24 | % img : uint8 image with 0 ~ 255 25 | % lines : < n x 7 >, x1,y1,x2,y2,width,p,-log10(NFA) 26 | % n : the number of lines 27 | 28 | lines = lsd(double(img)); 29 | [n c] = size(lines); 30 | s = zeros(n,c); 31 | s(1:end,1:4) = 1; 32 | lines = lines + s; 33 | 34 | dx = lines(:,1) - lines(:,3); 35 | dy = lines(:,2) - lines(:,4); 36 | iflag = dx.^2 + dy.^2 > thr; 37 | 38 | lines = lines(iflag, :); 39 | n = size(lines,1); 40 | 41 | end 42 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/lsdfb.m: -------------------------------------------------------------------------------- 1 | %-------------------------------------------------------------------------- 2 | % Real-time Camera Orientation and Vanishing Point Estimation (ROVE) 3 | % Copyright (C) 2015 Jeong-Kyun Lee and Kuk-Jin Yoon 4 | % 5 | % This program is free software: you can redistribute it and/or modify 6 | % it under the terms of the GNU General Public License as published by 7 | % the Free Software Foundation, either version 3 of the License, or 8 | % any later version. 9 | % 10 | % This program is distributed in the hope that it will be useful, 11 | % but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | % GNU General Public License for more details. 14 | % 15 | % You should have received a copy of the GNU General Public License 16 | % along with this program. If not, see . 17 | %-------------------------------------------------------------------------- 18 | % If you use this code, please cite: 19 | % Jeong-Kyun Lee and Kuk-Jin Yoon, 'Real-Time Joint Estimation of Camera 20 | % Orientation and Vanishing Points', The IEEE Conference on Computer 21 | % Vision and Pattern Recognition (CVPR), Boston, June, 2015. 22 | %-------------------------------------------------------------------------- 23 | function [ lines n ] = lsdfb( img, thr, bound ) 24 | % img : uint8 image with 0 ~ 255 25 | % lines : < n x 7 >, x1,y1,x2,y2,width,p,-log10(NFA) 26 | % n : the number of lines 27 | 28 | [h w] = size(img); 29 | img = img(bound+1:h-bound,bound+1:w-bound); 30 | 31 | lines = lsd(double(img)); 32 | [n c] = size(lines); 33 | s = zeros(n,c); 34 | s(1:end,1:4) = 1 + bound; 35 | lines = lines + s; 36 | 37 | dx = lines(:,1) - lines(:,3); 38 | dy = lines(:,2) - lines(:,4); 39 | iflag = dx.^2 + dy.^2 > thr; 40 | 41 | lines = lines(iflag, :); 42 | n = size(lines,1); 43 | 44 | end 45 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/Matlab/test_lsd.m: -------------------------------------------------------------------------------- 1 | X=double(imread('input.png')); 2 | % The image has to be between 0 and 255. 3 | % The image has to be black and white 4 | 5 | output_lsd=lsd(X); 6 | figure, 7 | hold on 8 | imagesc(X); 9 | colormap gray; 10 | for i=1:size(output_lsd,1) 11 | plot([output_lsd(i,1),output_lsd(i,3)],[output_lsd(i,2),output_lsd(i,4)]); 12 | end 13 | axis ij 14 | hold off 15 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/annotated.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Annotated Index 4 | 5 | 6 | 7 | 8 |

LSD Data Structures

Here are the data structures with brief descriptions: 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
coorlistChained list of coordinates
image_char_sChar image data type
image_double_sDouble image data type
image_int_sInt image data type
ntuple_list_s'list of n-tuple' data type
pointA point (or pixel)
rectRectangle structure: line segment with width
rect_iterRectangle points iterator
18 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 19 | 20 | doxygen 21 | 1.3.4
22 | 23 | 24 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/files.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Index 4 | 5 | 6 | 7 | 8 |

LSD File List

Here is a list of all files with brief descriptions: 9 | 10 | 11 |
lsd.c [code]LSD module code
lsd.h [code]LSD module header
12 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 13 | 14 | doxygen 15 | 1.3.4
16 | 17 | 18 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/formula.repository: -------------------------------------------------------------------------------- 1 | \form#0:\[ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} \] 2 | \form#1:\[ G(x,y) = G(x) * G(y) \] 3 | \form#2:\[ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. \] 4 | \form#3:\[ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } (x+5.5)^{x+0.5} e^{-(x+5.5)} \] 5 | \form#4:\[ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) \] 6 | \form#5:\[ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x \] 7 | \form#6:\[ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). \] 8 | \form#7:\[ \mathrm{NFA} = NT \cdot B(n,k,p) \] 9 | \form#8:\[ B(n,k,p) = \sum_{j=k}^n \left(\begin{array}{c}n\\j\end{array}\right) p^{j} (1-p)^{n-j} \] 10 | \form#9:\[ \left(\begin{array}{c}n\\k\end{array}\right) = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. \] 11 | \form#10:\[ A = \left(\begin{array}{cc} Ixx & Ixy \\ Ixy & Iyy \\ \end{array}\right) \] 12 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/functions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Compound Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 | Here is a list of all struct and union fields with links to the structures/unions they belong to:

37 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 38 | 39 | doxygen 40 | 1.3.4
41 | 42 | 43 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/functions_vars.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Compound Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

37 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 38 | 39 | doxygen 40 | 1.3.4
41 | 42 | 43 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/globals_defs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

25 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 26 | 27 | doxygen 28 | 1.3.4
29 | 30 | 31 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/globals_type.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

    12 |
  • image_char 13 | : lsd.c
  • image_double 14 | : lsd.c
  • image_int 15 | : lsd.c
  • ntuple_list 16 | : lsd.c
17 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 18 | 19 | doxygen 20 | 1.3.4
21 | 22 | 23 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/graph_legend.dot: -------------------------------------------------------------------------------- 1 | digraph G 2 | { 3 | edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; 4 | node [fontname="Helvetica",fontsize=10,shape=record]; 5 | Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",style="filled" fontcolor="white"]; 6 | Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 7 | Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPublicBase.html"]; 8 | Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 9 | Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="red",URL="$classTruncated.html"]; 10 | Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="Helvetica"]; 11 | Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classProtectedBase.html"]; 12 | Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="Helvetica"]; 13 | Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPrivateBase.html"]; 14 | Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 15 | Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="grey75"]; 16 | Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 17 | Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; 18 | Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="Helvetica"]; 19 | Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; 20 | Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="Helvetica"]; 21 | Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classUsed.html"]; 22 | } 23 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: LSD code documentation 4 | 5 | 6 | 7 | 8 |

LSD code documentation

9 |

10 | This is an implementation of the Line Segment Detector described in the paper:

11 | "LSD: A Fast Line Segment Detector with a False Detection Control" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010.

12 | and in more details in the CMLA Technical Report:

13 | "LSD: A Line Segment Detector, Technical Report", by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall, CMLA, ENS Cachan, 2010.

14 | The version implemented here includes some further improvements described in the following publication, of which this code is part:

15 | "LSD: a Line Segment Detector" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd

16 | The module's main function is lsd().

17 | The source code is contained in two files: lsd.h and lsd.c.

18 | HISTORY:

    19 |
  • version 1.6 - nov 2011:
      20 |
    • changes in the interface,
    • max_grad parameter removed,
    • the factor 11 was added to the number of test to consider the different precision values tested,
    • a minor bug corrected in the gradient sorting code,
    • the algorithm now also returns p and log_nfa for each detection,
    • a minor bug was corrected in the image scaling,
    • the angle comparison in "isaligned" changed from < to <=,
    • "eps" variable renamed "log_eps",
    • "lsd_scale_region" interface was added,
    • minor changes to comments.
    21 |
  • version 1.5 - dec 2010: Changes in 'refine', -W option added, and more comments added.
  • version 1.4 - jul 2010: lsd_scale interface added and doxygen doc.
  • version 1.3 - feb 2010: Multiple bug correction and improved code.
  • version 1.2 - dec 2009: First full Ansi C Language version.
  • version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and correction to partially handle "angle problem".
  • version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language version.
22 |

23 |

Author:
rafael grompone von gioi <grompone@gmail.com>
24 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 25 | 26 | doxygen 27 | 1.3.4
28 | 29 | 30 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/doc/structpoint.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: point struct Reference 4 | 5 | 6 | 7 | 8 |

point Struct Reference


Detailed Description

9 | A point (or pixel). 10 |

11 | 12 |

13 | Definition at line 149 of file lsd.c. 14 | 15 | 16 | 17 | 18 | 19 | 20 |

Data Fields

int x
int y
21 |


Field Documentation

22 |

23 | 24 | 25 | 31 | 32 |
26 | 27 | 28 |
int point::x 29 |
30 |
33 | 34 | 35 | 38 | 46 | 47 |
36 |   37 | 39 | 40 |

41 | 42 |

43 | Definition at line 149 of file lsd.c. 44 |

45 | Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().

48 |

49 | 50 | 51 | 57 | 58 |
52 | 53 | 54 |
int point::y 55 |
56 |
59 | 60 | 61 | 64 | 72 | 73 |
62 |   63 | 65 | 66 |

67 | 68 |

69 | Definition at line 149 of file lsd.c. 70 |

71 | Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().

74 |


The documentation for this struct was generated from the following file: 76 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 77 | 78 | doxygen 79 | 1.3.4
80 | 81 | 82 | -------------------------------------------------------------------------------- /MWMS_core/Interval_Stabbing/addon/lsd_1.6/lsd_call_example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "lsd.h" 4 | 5 | int main(void) 6 | { 7 | double * image; 8 | double * out; 9 | int x,y,i,j,n; 10 | int X = 128; /* x image size */ 11 | int Y = 128; /* y image size */ 12 | 13 | /* create a simple image: left half black, right half gray */ 14 | image = (double *) malloc( X * Y * sizeof(double) ); 15 | if( image == NULL ) 16 | { 17 | mexErrMsgTxt("error: not enough memory\n"); 18 | } 19 | for(x=0;x 6 | # 7 | # This program is free software: you can redistribute it and/or modify 8 | # it under the terms of the GNU Affero General Public License as 9 | # published by the Free Software Foundation, either version 3 of the 10 | # License, or (at your option) any later version. 11 | # 12 | # This program is distributed in the hope that it will be useful, 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 | # GNU Affero General Public License for more details. 16 | # 17 | # You should have received a copy of the GNU Affero General Public License 18 | # along with this program. If not, see . 19 | # 20 | # ----------------------------------------------------------------------------- 21 | 22 | all: lsd lsd_call_example 23 | 24 | lsd: lsd.c lsd.h lsd_cmd.c 25 | cc -O3 -o lsd lsd_cmd.c lsd.c -lm 26 | 27 | lsd_call_example: lsd.c lsd.h lsd_call_example.c 28 | cc -o lsd_call_example lsd_call_example.c lsd.c -lm 29 | 30 | doc: lsd.c lsd.h doxygen.config 31 | doxygen doxygen.config 32 | 33 | clean: 34 | rm -f lsd lsd_call_example 35 | 36 | cleandoc: 37 | rm -rf doc 38 | 39 | # ----------------------------------------------------------------------------- 40 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/MEX_lsd_cmd.mexw64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/MWMS_core/addon/lsd_1.6/Matlab/MEX_lsd_cmd.mexw64 -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/README.md: -------------------------------------------------------------------------------- 1 | ## Matlab wrapper for LSD 2 | 3 | ### LSD Program : 4 | 5 | If you want to use the lsd program : 6 | - Go to the current directory with Matlab 7 | - Within Matlab, type : 8 | 9 | >compileMex 10 | 11 | You can now use the lsd function within matlab 12 | 13 | Type : 14 | > help lsd 15 | 16 | in Matlab to see how it works. 17 | 18 | *Paul-Darius Sarmadi - July 2014* 19 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/compileMex.m: -------------------------------------------------------------------------------- 1 | mex MEX/MEX_lsd_cmd.c ../lsd.c -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/lsd.m: -------------------------------------------------------------------------------- 1 | function out=lsd(image,option,normalize_image) 2 | % LSD returns an array containing datas concerning line segments detected 3 | % in an image 4 | % out = LSD(A) returns line segments belonging to A 5 | % 6 | % INPUT : 7 | % ======= 8 | % 9 | % A must be a double matrix. 10 | % To load it from an image on your computer -which has to be a .pgm file- use the following command : 11 | % A=double(imread('adress/of/file.pgm')) 12 | % 13 | % OPTIONS : 14 | % ========= 15 | % 16 | % Even if default options are optimized, you can change them as you wish. 17 | % Just use a structure containing them or the ones you need. 18 | % For example, if you want a scale equals to one and a sigma_coef equals to 0.7, type the following command : 19 | % option.scale=1; 20 | % option.sigma_coef=0.8; 21 | % out = LSD(A,option) 22 | % 23 | % You can name your structure as you want. However its components have to respect some rules : 24 | % 25 | % SCALE : 26 | % name as a component of the optional structure : scale 27 | % type : double 28 | % default value : 0.8 29 | % minimum value : 0.0 30 | % maximum value : - 31 | % Scale image by Gaussian filter before processing. 32 | % 33 | % SIGMA COEFFICIENT : 34 | % name as a component of the optional structure : sigma_coef 35 | % type : double 36 | % default value : 0.6 37 | % minimum value : 0.0 38 | % maximum value : - 39 | % Sigma for Gaussian filter is computed as sigma_coef/scale. 40 | % 41 | % QUANTIZATION : 42 | % name as a component of the optional structure : quant 43 | % type : double 44 | % default value : 2.0 45 | % minimum value : 0.0 46 | % maximum value : - 47 | % Bound to quantization error on the gradient norm. 48 | % 49 | % ANGLE TOLERANCE : 50 | % name as a component of the optional structure : ang_th 51 | % type : double 52 | % default value : 22.5 53 | % minimum value : 0.0 54 | % maximum value : 180.0 55 | % Gradient angle tolerance in degrees. 56 | % 57 | % DETECTION THRESHOLD : 58 | % name as a component of the optional structure : log_eps 59 | % type : double 60 | % default value : 0.0 61 | % minimum value : - 62 | % maximum value : - 63 | % Detection threshold, -log10(max. NFA) 64 | % 65 | % DENSITY : 66 | % name as a component of the optional structure : density_th 67 | % type : double 68 | % default value : 0.7 69 | % minimum value : 0.0 70 | % maximum value : 1.0 71 | % Minimal density of region points in a rectangle to be accepted. 72 | % 73 | % NUMBER OF BINS : 74 | % name as a component of the optional structure : n_bins 75 | % type : integer 76 | % default value : 1024 77 | % minimum value : 1 78 | % maximum value : - 79 | % Number of bins in 'ordering' of gradient modulus. 80 | % 81 | % RETURNED VALUE : 82 | % ================ 83 | % 84 | % The returned value is a matrix. 85 | % Each row represents a segment. 86 | % The first column contains x1 87 | % The second column contains y1 88 | % The third column contains x2 89 | % The fourth column contains y2 90 | % The three last columns contain other informations available at the following adress : 91 | % http://www.ipol.im/pub/art/2012/gjmr-lsd/ 92 | % 93 | % NOTE: think to modify the mex because it does not handle colors. Images 94 | % have to be renormalized 95 | 96 | if(~ismatrix(image)) 97 | image=rgb2gray(image); 98 | end 99 | 100 | if(nargin<3) 101 | normalize_image=1; 102 | end 103 | 104 | if(normalize_image) 105 | image=floor(256*image/max(max(image))); 106 | end 107 | 108 | if (~exist('option', 'var')) 109 | out=MEX_lsd_cmd(image); 110 | else 111 | out=MEX_lsd_cmd(image,option); 112 | end -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/lsdf.m: -------------------------------------------------------------------------------- 1 | %-------------------------------------------------------------------------- 2 | % Real-time Camera Orientation and Vanishing Point Estimation (ROVE) 3 | % Copyright (C) 2015 Jeong-Kyun Lee and Kuk-Jin Yoon 4 | % 5 | % This program is free software: you can redistribute it and/or modify 6 | % it under the terms of the GNU General Public License as published by 7 | % the Free Software Foundation, either version 3 of the License, or 8 | % any later version. 9 | % 10 | % This program is distributed in the hope that it will be useful, 11 | % but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | % GNU General Public License for more details. 14 | % 15 | % You should have received a copy of the GNU General Public License 16 | % along with this program. If not, see . 17 | %-------------------------------------------------------------------------- 18 | % If you use this code, please cite: 19 | % Jeong-Kyun Lee and Kuk-Jin Yoon, 'Real-Time Joint Estimation of Camera 20 | % Orientation and Vanishing Points', The IEEE Conference on Computer 21 | % Vision and Pattern Recognition (CVPR), Boston, June, 2015. 22 | %-------------------------------------------------------------------------- 23 | function [ lines n ] = lsdf( img, thr ) 24 | % img : uint8 image with 0 ~ 255 25 | % lines : < n x 7 >, x1,y1,x2,y2,width,p,-log10(NFA) 26 | % n : the number of lines 27 | 28 | lines = lsd(double(img)); 29 | [n c] = size(lines); 30 | s = zeros(n,c); 31 | s(1:end,1:4) = 1; 32 | lines = lines + s; 33 | 34 | dx = lines(:,1) - lines(:,3); 35 | dy = lines(:,2) - lines(:,4); 36 | iflag = dx.^2 + dy.^2 > thr; 37 | 38 | lines = lines(iflag, :); 39 | n = size(lines,1); 40 | 41 | end 42 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/lsdfb.m: -------------------------------------------------------------------------------- 1 | %-------------------------------------------------------------------------- 2 | % Real-time Camera Orientation and Vanishing Point Estimation (ROVE) 3 | % Copyright (C) 2015 Jeong-Kyun Lee and Kuk-Jin Yoon 4 | % 5 | % This program is free software: you can redistribute it and/or modify 6 | % it under the terms of the GNU General Public License as published by 7 | % the Free Software Foundation, either version 3 of the License, or 8 | % any later version. 9 | % 10 | % This program is distributed in the hope that it will be useful, 11 | % but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | % GNU General Public License for more details. 14 | % 15 | % You should have received a copy of the GNU General Public License 16 | % along with this program. If not, see . 17 | %-------------------------------------------------------------------------- 18 | % If you use this code, please cite: 19 | % Jeong-Kyun Lee and Kuk-Jin Yoon, 'Real-Time Joint Estimation of Camera 20 | % Orientation and Vanishing Points', The IEEE Conference on Computer 21 | % Vision and Pattern Recognition (CVPR), Boston, June, 2015. 22 | %-------------------------------------------------------------------------- 23 | function [ lines n ] = lsdfb( img, thr, bound ) 24 | % img : uint8 image with 0 ~ 255 25 | % lines : < n x 7 >, x1,y1,x2,y2,width,p,-log10(NFA) 26 | % n : the number of lines 27 | 28 | [h w] = size(img); 29 | img = img(bound+1:h-bound,bound+1:w-bound); 30 | 31 | lines = lsd(double(img)); 32 | [n c] = size(lines); 33 | s = zeros(n,c); 34 | s(1:end,1:4) = 1 + bound; 35 | lines = lines + s; 36 | 37 | dx = lines(:,1) - lines(:,3); 38 | dy = lines(:,2) - lines(:,4); 39 | iflag = dx.^2 + dy.^2 > thr; 40 | 41 | lines = lines(iflag, :); 42 | n = size(lines,1); 43 | 44 | end 45 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/Matlab/test_lsd.m: -------------------------------------------------------------------------------- 1 | X=double(imread('input.png')); 2 | % The image has to be between 0 and 255. 3 | % The image has to be black and white 4 | 5 | output_lsd=lsd(X); 6 | figure, 7 | hold on 8 | imagesc(X); 9 | colormap gray; 10 | for i=1:size(output_lsd,1) 11 | plot([output_lsd(i,1),output_lsd(i,3)],[output_lsd(i,2),output_lsd(i,4)]); 12 | end 13 | axis ij 14 | hold off 15 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/annotated.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Annotated Index 4 | 5 | 6 | 7 | 8 |

LSD Data Structures

Here are the data structures with brief descriptions: 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
coorlistChained list of coordinates
image_char_sChar image data type
image_double_sDouble image data type
image_int_sInt image data type
ntuple_list_s'list of n-tuple' data type
pointA point (or pixel)
rectRectangle structure: line segment with width
rect_iterRectangle points iterator
18 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 19 | 20 | doxygen 21 | 1.3.4
22 | 23 | 24 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/files.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Index 4 | 5 | 6 | 7 | 8 |

LSD File List

Here is a list of all files with brief descriptions: 9 | 10 | 11 |
lsd.c [code]LSD module code
lsd.h [code]LSD module header
12 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 13 | 14 | doxygen 15 | 1.3.4
16 | 17 | 18 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/formula.repository: -------------------------------------------------------------------------------- 1 | \form#0:\[ G(x,y) = \frac{1}{2\pi\sigma^2} e^{-\frac{x^2+y^2}{2\sigma^2}} \] 2 | \form#1:\[ G(x,y) = G(x) * G(y) \] 3 | \form#2:\[ G(x) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{x^2}{2\sigma^2}}. \] 4 | \form#3:\[ \Gamma(x) = \frac{ \sum_{n=0}^{N} q_n x^n }{ \Pi_{n=0}^{N} (x+n) } (x+5.5)^{x+0.5} e^{-(x+5.5)} \] 5 | \form#4:\[ \log\Gamma(x) = \log\left( \sum_{n=0}^{N} q_n x^n \right) + (x+0.5) \log(x+5.5) - (x+5.5) - \sum_{n=0}^{N} \log(x+n) \] 6 | \form#5:\[ \Gamma(x) = \sqrt{\frac{2\pi}{x}} \left( \frac{x}{e} \sqrt{ x\sinh(1/x) + \frac{1}{810x^6} } \right)^x \] 7 | \form#6:\[ \log\Gamma(x) = 0.5\log(2\pi) + (x-0.5)\log(x) - x + 0.5x\log\left( x\sinh(1/x) + \frac{1}{810x^6} \right). \] 8 | \form#7:\[ \mathrm{NFA} = NT \cdot B(n,k,p) \] 9 | \form#8:\[ B(n,k,p) = \sum_{j=k}^n \left(\begin{array}{c}n\\j\end{array}\right) p^{j} (1-p)^{n-j} \] 10 | \form#9:\[ \left(\begin{array}{c}n\\k\end{array}\right) = \frac{ \Gamma(n+1) }{ \Gamma(k+1) \cdot \Gamma(n-k+1) }. \] 11 | \form#10:\[ A = \left(\begin{array}{cc} Ixx & Ixy \\ Ixy & Iyy \\ \end{array}\right) \] 12 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/functions.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Compound Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 | Here is a list of all struct and union fields with links to the structures/unions they belong to:

37 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 38 | 39 | doxygen 40 | 1.3.4
41 | 42 | 43 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/functions_vars.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: Compound Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

37 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 38 | 39 | doxygen 40 | 1.3.4
41 | 42 | 43 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/globals_defs.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

25 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 26 | 27 | doxygen 28 | 1.3.4
29 | 30 | 31 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/globals_type.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: File Member Index 4 | 5 | 6 | 7 | 8 | 9 | 10 |

11 |

    12 |
  • image_char 13 | : lsd.c
  • image_double 14 | : lsd.c
  • image_int 15 | : lsd.c
  • ntuple_list 16 | : lsd.c
17 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 18 | 19 | doxygen 20 | 1.3.4
21 | 22 | 23 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/graph_legend.dot: -------------------------------------------------------------------------------- 1 | digraph G 2 | { 3 | edge [fontname="Helvetica",fontsize=10,labelfontname="Helvetica",labelfontsize=10]; 4 | node [fontname="Helvetica",fontsize=10,shape=record]; 5 | Node9 [shape="box",label="Inherited",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",style="filled" fontcolor="white"]; 6 | Node10 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 7 | Node10 [shape="box",label="PublicBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPublicBase.html"]; 8 | Node11 -> Node10 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 9 | Node11 [shape="box",label="Truncated",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="red",URL="$classTruncated.html"]; 10 | Node13 -> Node9 [dir=back,color="darkgreen",fontsize=10,style="solid",fontname="Helvetica"]; 11 | Node13 [shape="box",label="ProtectedBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classProtectedBase.html"]; 12 | Node14 -> Node9 [dir=back,color="firebrick4",fontsize=10,style="solid",fontname="Helvetica"]; 13 | Node14 [shape="box",label="PrivateBase",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classPrivateBase.html"]; 14 | Node15 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 15 | Node15 [shape="box",label="Undocumented",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="grey75"]; 16 | Node16 -> Node9 [dir=back,color="midnightblue",fontsize=10,style="solid",fontname="Helvetica"]; 17 | Node16 [shape="box",label="Templ< int >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; 18 | Node17 -> Node16 [dir=back,color="orange",fontsize=10,style="dashed",label="< int >",fontname="Helvetica"]; 19 | Node17 [shape="box",label="Templ< T >",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classTempl.html"]; 20 | Node18 -> Node9 [dir=back,color="darkorchid3",fontsize=10,style="dashed",label="m_usedClass",fontname="Helvetica"]; 21 | Node18 [shape="box",label="Used",fontsize=10,height=0.2,width=0.4,fontname="Helvetica",color="black",URL="$classUsed.html"]; 22 | } 23 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: LSD code documentation 4 | 5 | 6 | 7 | 8 |

LSD code documentation

9 |

10 | This is an implementation of the Line Segment Detector described in the paper:

11 | "LSD: A Fast Line Segment Detector with a False Detection Control" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 32, no. 4, pp. 722-732, April, 2010.

12 | and in more details in the CMLA Technical Report:

13 | "LSD: A Line Segment Detector, Technical Report", by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, Gregory Randall, CMLA, ENS Cachan, 2010.

14 | The version implemented here includes some further improvements described in the following publication, of which this code is part:

15 | "LSD: a Line Segment Detector" by Rafael Grompone von Gioi, Jeremie Jakubowicz, Jean-Michel Morel, and Gregory Randall, Image Processing On Line, 2012. DOI:10.5201/ipol.2012.gjmr-lsd http://dx.doi.org/10.5201/ipol.2012.gjmr-lsd

16 | The module's main function is lsd().

17 | The source code is contained in two files: lsd.h and lsd.c.

18 | HISTORY:

    19 |
  • version 1.6 - nov 2011:
      20 |
    • changes in the interface,
    • max_grad parameter removed,
    • the factor 11 was added to the number of test to consider the different precision values tested,
    • a minor bug corrected in the gradient sorting code,
    • the algorithm now also returns p and log_nfa for each detection,
    • a minor bug was corrected in the image scaling,
    • the angle comparison in "isaligned" changed from < to <=,
    • "eps" variable renamed "log_eps",
    • "lsd_scale_region" interface was added,
    • minor changes to comments.
    21 |
  • version 1.5 - dec 2010: Changes in 'refine', -W option added, and more comments added.
  • version 1.4 - jul 2010: lsd_scale interface added and doxygen doc.
  • version 1.3 - feb 2010: Multiple bug correction and improved code.
  • version 1.2 - dec 2009: First full Ansi C Language version.
  • version 1.1 - sep 2009: Systematic subsampling to scale 0.8 and correction to partially handle "angle problem".
  • version 1.0 - jan 2009: First complete Megawave2 and Ansi C Language version.
22 |

23 |

Author:
rafael grompone von gioi <grompone@gmail.com>
24 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 25 | 26 | doxygen 27 | 1.3.4
28 | 29 | 30 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/doc/structpoint.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | LSD: point struct Reference 4 | 5 | 6 | 7 | 8 |

point Struct Reference


Detailed Description

9 | A point (or pixel). 10 |

11 | 12 |

13 | Definition at line 149 of file lsd.c. 14 | 15 | 16 | 17 | 18 | 19 | 20 |

Data Fields

int x
int y
21 |


Field Documentation

22 |

23 | 24 | 25 | 31 | 32 |
26 | 27 | 28 |
int point::x 29 |
30 |
33 | 34 | 35 | 38 | 46 | 47 |
36 |   37 | 39 | 40 |

41 | 42 |

43 | Definition at line 149 of file lsd.c. 44 |

45 | Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().

48 |

49 | 50 | 51 | 57 | 58 |
52 | 53 | 54 |
int point::y 55 |
56 |
59 | 60 | 61 | 64 | 72 | 73 |
62 |   63 | 65 | 66 |

67 | 68 |

69 | Definition at line 149 of file lsd.c. 70 |

71 | Referenced by get_theta(), reduce_region_radius(), refine(), region2rect(), and region_grow().

74 |


The documentation for this struct was generated from the following file: 76 |
Generated on Fri Nov 11 11:11:11 2011 for LSD by 77 | 78 | doxygen 79 | 1.3.4
80 | 81 | 82 | -------------------------------------------------------------------------------- /MWMS_core/addon/lsd_1.6/lsd_call_example.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include "lsd.h" 4 | 5 | int main(void) 6 | { 7 | double * image; 8 | double * out; 9 | int x,y,i,j,n; 10 | int X = 128; /* x image size */ 11 | int Y = 128; /* y image size */ 12 | 13 | /* create a simple image: left half black, right half gray */ 14 | image = (double *) malloc( X * Y * sizeof(double) ); 15 | if( image == NULL ) 16 | { 17 | mexErrMsgTxt("error: not enough memory\n"); 18 | } 19 | for(x=0;x maxMatchingNum) 63 | maxMatchingNum = matchingNum; 64 | maxMatchingIdx = goodMatchingIdx; 65 | maxPlaneModel = normPlaneModel; 66 | 67 | % calculate the number of iterations (http://en.wikipedia.org/wiki/RANSAC) 68 | matchingRatio = matchingNum / totalPointNum; 69 | ransacIterNum = ceil(log(0.01)/log(1-(matchingRatio)^samplePointNum)); 70 | end 71 | 72 | ransacIterCnt = ransacIterCnt + 1; 73 | if (ransacIterCnt >= ransacIterNum || ransacIterCnt >= ransacMaxIterNum) 74 | break; 75 | end 76 | end 77 | 78 | 79 | end 80 | 81 | 82 | 83 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /MWMS_core/downsampleDepth.m: -------------------------------------------------------------------------------- 1 | function [downsampledDepthImg] = downsampleDepth(srcDepthImg) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: downsampleDepth 4 | % 5 | % Description: 6 | % Get the down sampling (default down sample rate is 2, other down sample rate 7 | % like 4,8... can be realized by execute this func for multiple times) image of the input depth image. 8 | % 9 | % Example: 10 | % OUTPUT: 11 | % downsampledDepthImg: downsampled depth image. (double) [m x n image] -> [m/2 x n/2 image] 12 | % 13 | % INPUT: 14 | % srcDepthImg: The input source depth image (double) 15 | % 16 | % NOTE: 17 | % The input image must a single channel one. 18 | % 19 | % Author: Pyojin Kim 20 | % Email: pjinkim1215@gmail.com 21 | % Website: 22 | % 23 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 | % log: 25 | % 2015-04-05 : Complete 26 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 | % 28 | 29 | %% do down sampling 30 | 31 | downsampledDepthImg = ( srcDepthImg(0+(1:2:end), 0+(1:2:end)) + srcDepthImg(1+(1:2:end), 0+(1:2:end)) + srcDepthImg(0+(1:2:end), 1+(1:2:end)) + srcDepthImg(1+(1:2:end), 1+(1:2:end)) ) ./ ... 32 | ( sign(srcDepthImg(0+(1:2:end), 0+(1:2:end))) + sign(srcDepthImg(1+(1:2:end), 0+(1:2:end))) + sign(srcDepthImg(0+(1:2:end), 1+(1:2:end))) + sign(srcDepthImg(1+(1:2:end), 1+(1:2:end))) ); 33 | 34 | downsampledDepthImg(isnan(downsampledDepthImg)) = 0; 35 | 36 | end -------------------------------------------------------------------------------- /MWMS_core/downsampleImage.m: -------------------------------------------------------------------------------- 1 | function [downsampledImg] = downsampleImage(srcImg) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: downsampleImage 4 | % 5 | % Description: 6 | % Get the down sampling (default down sample rate is 2, other down sample rate 7 | % like 4,8... can be realized by execute this func for multiple times) image of the input image. 8 | % 9 | % Example: 10 | % OUTPUT: 11 | % downsampledImg: downsampled image. (double) [m x n image] -> [m/2 x n/2 image] 12 | % 13 | % INPUT: 14 | % srcImg: The input source image (double) 15 | % 16 | % NOTE: 17 | % The input image must a single channel one. 18 | % 19 | % Author: Pyojin Kim 20 | % Email: pjinkim1215@gmail.com 21 | % Website: 22 | % 23 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24 | % log: 25 | % 2015-04-05 : Complete 26 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 | % 28 | 29 | %% check the srcImg 30 | 31 | if size(srcImg,3) == 3 32 | srcImg = double(rgb2gray(srcImg)); 33 | else 34 | srcImg = double(srcImg); 35 | end 36 | 37 | %% do down sampling 38 | 39 | downsampledImg = ( srcImg(0+(1:2:end), 0+(1:2:end)) + srcImg(1+(1:2:end), 0+(1:2:end)) + ... 40 | srcImg(0+(1:2:end), 1+(1:2:end)) + srcImg(1+(1:2:end), 1+(1:2:end)) ) * 0.25; 41 | 42 | end -------------------------------------------------------------------------------- /MWMS_core/downsampleKmatrix.m: -------------------------------------------------------------------------------- 1 | function [downsampledKmatrix] = downsampleKmatrix(srcKmatrix) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: downsampleKmatrix 4 | % 5 | % Description: 6 | % get the down sampling K matrix ( camera calibration matrix ) 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % downsampledKmatrix: downsampled camera calibration matrix 11 | % 12 | % INPUT: 13 | % srcKmatrix: original camera calibration matrix ( intrinsic parameter K ) 14 | % 15 | % NOTE: 16 | % srcKmatrix = [fx 0 cx; 17 | % 0 fy cy; 18 | % 0 0 1] 19 | % 20 | % Author: Pyojin Kim 21 | % Email: pjinkim1215@gmail.com 22 | % Website: 23 | % 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | % log: 26 | % 2016-04-05 : Complete 27 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 | % 29 | 30 | % this is because we interpolate in such a way, that 31 | % the image is discretized at the exact pixel-values (e.g. 3,7), and 32 | % not at the center of each pixel (e.g. 3.5, 7.5). 33 | downsampledKmatrix = [srcKmatrix(1,1)/2 0 (srcKmatrix(1,3)+0.5)/2-0.5; 34 | 0 srcKmatrix(2,2)/2 (srcKmatrix(2,3)+0.5)/2-0.5; 35 | 0 0 1]; 36 | 37 | end -------------------------------------------------------------------------------- /MWMS_core/estimateLineModel.m: -------------------------------------------------------------------------------- 1 | function [normLineModel] = estimateLineModel(P1, P2) 2 | % Project: 3 | % Function: estimateLineModel 4 | % 5 | % Description: 6 | % get the line model parameters [a,b,c] <= 'a*x + b*y + c = 0' 7 | % 8 | % Example: 9 | % OUTPUT : 10 | % normLineModel: normalized line model parameters - [a,b,c] 11 | % 12 | % 13 | % INPUT : 14 | % P1 : Point #1 on the line [X,Y]; 15 | % P2 : Point #2 on the line [X,Y]; 16 | % 17 | % NOTE: 18 | % 19 | % 20 | % Author: Pyojin Kim 21 | % Email: pjinkim1215@gmail.com 22 | % Website: 23 | % 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | % log: 26 | % 2017-09-30 : Complete 27 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 | % 29 | 30 | 31 | % calculate the [a, b, c] in the line equation 32 | a = P2(2) - P1(2); 33 | b = P1(1) - P2(1); 34 | c = P2(1) * P1(2) - P1(1) * P2(2); 35 | 36 | 37 | % calculate the model parameters of the line equation 38 | lineModel = [a, b, c]; 39 | normLineModel = lineModel ./ (min(abs(lineModel))); 40 | 41 | 42 | % check the validity of the line equation 43 | % a * P1(1) + b * P1(2) + c 44 | % a * P2(1) + b * P2(2) + c 45 | % normLineModel(1) * P1(1) + normLineModel(2) * P1(2) + normLineModel(3) 46 | % normLineModel(1) * P2(1) + normLineModel(2) * P2(2) + normLineModel(3) 47 | 48 | 49 | end 50 | -------------------------------------------------------------------------------- /MWMS_core/estimatePlaneModel.m: -------------------------------------------------------------------------------- 1 | function [normPlaneModel] = estimatePlaneModel(P1, P2, P3) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: estimatePlaneModel 4 | % 5 | % Description: 6 | % get the plane model's parameters [a,b,c,d] <= 'a*x + b*y + c*z + d = 0' 7 | % 8 | % Example: 9 | % OUTPUT : 10 | % normPlaneModel: normalized plane model Parameters - [a,b,c,d] 11 | % of the plane equation with 3 points. 12 | % (a,b,c) : the normal vector of the plane 13 | % 14 | % INPUT : 15 | % P1 : Point #1 on the plnae [X,Y,Z]; 16 | % P2 : Point #2 on the plnae [X,Y,Z]; 17 | % P3 : Point #3 on the plnae [X,Y,Z]; 18 | % 19 | % NOTE: 20 | % The P1,P2,P3 should be three non-collinear points (three points not on a line!!) 21 | % 22 | % Author: Pyojin Kim 23 | % Email: pjinkim1215@gmail.com 24 | % Website: 25 | % 26 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 | % log: 28 | % 2017-01-22 : Complete 29 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 | % 31 | 32 | 33 | % calculate the normal vector of the plane 34 | normalVector = cross(P1-P2, P1-P3); 35 | 36 | 37 | % calculate the model parameters of the plane eqn 38 | temp_d = -(normalVector(1)*P1(1) + normalVector(2)*P1(2) + normalVector(3)*P1(3)); 39 | planeModel = [normalVector, temp_d]; 40 | normPlaneModel = planeModel ./ (min(abs(planeModel))); 41 | 42 | 43 | % check the validity of the plane equation 44 | % a = normPlaneModel(1); 45 | % b = normPlaneModel(2); 46 | % c = normPlaneModel(3); 47 | % d = normPlaneModel(4); 48 | % a*P1(1) + b*P1(2) + c*P1(3) + d 49 | % a*P2(1) + b*P2(2) + c*P2(3) + d 50 | % a*P3(1) + b*P3(2) + c*P3(3) + d 51 | 52 | 53 | % plot the calculated plane based on P1, P2, P3 54 | % points=[P1' P2' P3']; % using the given data 55 | % fill3(points(1,:), points(2,:), points(3,:),'r'); grid on; 56 | 57 | 58 | end 59 | -------------------------------------------------------------------------------- /MWMS_core/estimatePlaneNormalRANSAC.m: -------------------------------------------------------------------------------- 1 | function [planeNormalVector, planePixelPoint] = estimatePlaneNormalRANSAC(imageCur, depthCur, cam, optsLAPO) 2 | 3 | % assign current image pyramid 4 | L = optsLAPO.imagePyramidLevel; 5 | K = cam.K_pyramid(:,:,L); 6 | Kinv = inv(K); 7 | 8 | 9 | %% plane normal vector with RANSAC 10 | 11 | % assign current camera parameters 12 | imageHeight = size(imageCur, 1); 13 | imageWidth = size(imageCur, 2); 14 | 15 | 16 | % pixel and depth value 17 | pixelPtsRef = zeros(3, imageHeight*imageWidth); 18 | depthPtsRef = zeros(3, imageHeight*imageWidth); 19 | pixelCnt = 0; 20 | for v = 1:imageHeight 21 | for u = 1:imageWidth 22 | if (depthCur(v,u) >= optsLAPO.minimumDepth) 23 | pixelCnt = pixelCnt + 1; 24 | 25 | pixelPtsRef(:,pixelCnt) = [u; v; 1]; 26 | depthPtsRef(:,pixelCnt) = depthCur(v,u) * ones(3,1); 27 | end 28 | end 29 | end 30 | pixelPtsRef(:,(pixelCnt+1):end) = []; 31 | depthPtsRef(:,(pixelCnt+1):end) = []; 32 | 33 | 34 | % 3D point cloud 35 | normPtsRef = Kinv * pixelPtsRef; 36 | pointCloudRef = normPtsRef .* depthPtsRef; 37 | 38 | 39 | % do plane RANSAC 40 | [planeIdx, ~, planeModel] = detectPlaneRANSAC(pointCloudRef, optsLAPO.planeInlierThreshold); 41 | planePixelPoint = pixelPtsRef(:,planeIdx); 42 | planeNormalVector = planeModel(1:3) / norm(planeModel(1:3)); 43 | planeNormalVector = planeNormalVector.'; 44 | 45 | 46 | end 47 | 48 | -------------------------------------------------------------------------------- /MWMS_core/estimateSurfaceNormalGradient_mex.mexw64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/MWMS_core/estimateSurfaceNormalGradient_mex.mexw64 -------------------------------------------------------------------------------- /MWMS_core/extractLinesAndGreatcircle.m: -------------------------------------------------------------------------------- 1 | function [lines, greatcirclePoints, greatcircleNormals] = extractLinesAndGreatcircle(imageCurForLine, cam, optsMWMS) 2 | 3 | % assign current parameters 4 | lineDetector = optsMWMS.lineDetector; 5 | lineLength = optsMWMS.lineLength; 6 | K = cam.K; 7 | Kinv = inv(K); 8 | 9 | 10 | % line detection 11 | dimageCurForLine = double(imageCurForLine); 12 | if (strcmp(lineDetector,'lsd')) 13 | [lines, ~] = lsdf(dimageCurForLine, (lineLength^2)); 14 | elseif (strcmp(lineDetector,'gpa')) 15 | [lines, ~] = gpa(imageCurForLine, lineLength); 16 | end 17 | lines = extractUniqueLines(imageCurForLine, lines, cam); 18 | 19 | 20 | % great circle normal vector 21 | numLines = size(lines,1); 22 | greatcirclePoints = zeros(numLines,6); 23 | greatcircleNormals = zeros(numLines,3); 24 | for k = 1:numLines 25 | 26 | % line information 27 | linedata = lines(k,1:4); 28 | 29 | % normalized, undistorted image plane 30 | pt1_p_d = [linedata(1:2), 1].'; 31 | pt2_p_d = [linedata(3:4), 1].'; 32 | pt1_n_d = Kinv * pt1_p_d; 33 | pt2_n_d = Kinv * pt2_p_d; 34 | pt1_n_u = [undistortPts_normal(pt1_n_d(1:2), cam); 1]; 35 | pt2_n_u = [undistortPts_normal(pt2_n_d(1:2), cam); 1]; 36 | 37 | % two points (r=1) on the great circle 38 | pt1_sphere = pt1_n_u / norm(pt1_n_u); 39 | pt2_sphere = pt2_n_u / norm(pt2_n_u); 40 | greatcirclePoints(k,:) = [pt1_sphere.', pt2_sphere.']; 41 | 42 | % normal vector of great circle 43 | circleNormal = cross(pt1_n_u.', pt2_n_u.'); 44 | circleNormal = circleNormal / norm(circleNormal); 45 | greatcircleNormals(k,:) = circleNormal; 46 | end 47 | 48 | 49 | end -------------------------------------------------------------------------------- /MWMS_core/extractUniqueLines.m: -------------------------------------------------------------------------------- 1 | function [lines_final] = extractUniqueLines(imageCurForLine, lines, cam) 2 | 3 | % assign current parameters 4 | K = cam.K_pyramid(:,:,1); 5 | Kinv = inv(K); 6 | imageHeight = size(imageCurForLine,1); 7 | imageWidth = size(imageCurForLine,2); 8 | 9 | 10 | % line information for 1-line RANSAC 11 | numLines = size(lines,1); 12 | greatcircleNormal = zeros(numLines,3); 13 | lineLength = zeros(numLines,1); 14 | for k = 1:numLines 15 | 16 | % line pixel information 17 | linedata = lines(k,1:4); 18 | length = sqrt((linedata(1)-linedata(3))^2 + (linedata(2)-linedata(4))^2); 19 | 20 | % normalized image plane 21 | ptEnd1_p_d = [linedata(1:2), 1].'; 22 | ptEnd2_p_d = [linedata(3:4), 1].'; 23 | ptEnd1_n_d = Kinv * ptEnd1_p_d; 24 | ptEnd2_n_d = Kinv * ptEnd2_p_d; 25 | ptEnd1_n_u = [undistortPts_normal(ptEnd1_n_d(1:2), cam); 1]; 26 | ptEnd2_n_u = [undistortPts_normal(ptEnd2_n_d(1:2), cam); 1]; 27 | 28 | % normal vector of great circle 29 | circleNormal = cross(ptEnd1_n_u.', ptEnd2_n_u.'); 30 | circleNormal = circleNormal / norm(circleNormal); 31 | 32 | % save the result 33 | greatcircleNormal(k,:) = circleNormal; 34 | lineLength(k) = length; 35 | end 36 | 37 | 38 | % cluster related (close) line segments 39 | lineIdx = zeros(numLines,1); 40 | numUniqueLine = 0; 41 | lines_unique = []; 42 | greatcircleNormal_unique = []; 43 | lineLength_unique = []; 44 | lineIdx_unique = []; 45 | while (true) 46 | 47 | % reset valid line information 48 | lines = lines((lineIdx==0),:); 49 | greatcircleNormal = greatcircleNormal((lineIdx==0),:); 50 | lineLength = lineLength((lineIdx==0),:); 51 | 52 | 53 | % stop if lines is empty 54 | if (isempty(lines)) 55 | break; 56 | end 57 | 58 | 59 | % find close line index 60 | lineCloseIdx = (abs(greatcircleNormal(1,:) * greatcircleNormal.') > cos(deg2rad(2))).'; 61 | 62 | 63 | % assign related line information 64 | numUniqueLine = numUniqueLine + 1; 65 | lines_unique = [lines_unique; lines(lineCloseIdx,:)]; 66 | greatcircleNormal_unique = [greatcircleNormal_unique; greatcircleNormal(lineCloseIdx,:)]; 67 | lineLength_unique = [lineLength_unique; lineLength(lineCloseIdx,:)]; 68 | lineIdx_unique = [lineIdx_unique; ones(sum(lineCloseIdx),1) * numUniqueLine]; 69 | lineIdx = lineCloseIdx; 70 | end 71 | 72 | 73 | % find unique line segments 74 | lines_final = []; 75 | for k = 1:numUniqueLine 76 | 77 | % current line index 78 | lineIdx = find(lineIdx_unique == k); 79 | numCloseLine = size(lineIdx,1); 80 | 81 | % save unique line 82 | if (numCloseLine == 1) 83 | lines_final = [lines_final; lines_unique(lineIdx,:)]; 84 | elseif (numCloseLine >= 2) 85 | [~, maxLineIdx] = max(lineLength_unique(lineIdx,:)); 86 | lines_final = [lines_final; lines_unique(lineIdx(maxLineIdx),:)]; 87 | end 88 | end 89 | 90 | 91 | % remove useless lines 92 | removeLineIdx_u = find(lines_final(:,1) > (imageWidth - 4) & lines_final(:,3) > (imageWidth - 4)); 93 | removeLineIdx_v = find(lines_final(:,2) > (imageHeight - 4) & lines_final(:,4) > (imageHeight - 4)); 94 | removeLineIdx = [removeLineIdx_u; removeLineIdx_v]; 95 | lines_final(removeLineIdx,:) = []; 96 | 97 | 98 | end 99 | 100 | -------------------------------------------------------------------------------- /MWMS_core/findInvalidManhattanLines.m: -------------------------------------------------------------------------------- 1 | function [invalidIndex] = findInvalidManhattanLines(vDD, lineNormals, optsMWMS) 2 | 3 | % assign current parameters 4 | vDDAngleThreshold = optsMWMS.verticalLineNormalAngleThreshold; % degree 5 | polarAngleThreshold = optsMWMS.verticalPolarRegionAngleThreshold; % degree 6 | 7 | invalidIndex = []; 8 | numLines = size(lineNormals,2); 9 | 10 | 11 | % find invalid image lines for vertical dominant direction 12 | for k = 1:numLines 13 | 14 | % compute angle distance between line normal and vDD 15 | lineNormal = lineNormals(:,k); 16 | angleDistance = abs(90 - rad2deg(acos(vDD.' * lineNormal))); 17 | if (angleDistance <= vDDAngleThreshold) 18 | invalidIndex = [invalidIndex, k]; 19 | end 20 | end 21 | 22 | 23 | % find invalid image lines near the polar region of vertical dominant direction 24 | for k = 1:numLines 25 | 26 | % compute angle distance between line normal and vDD 27 | lineNormal = lineNormals(:,k); 28 | angleDistance = rad2deg(acos(vDD.' * lineNormal)); 29 | if ((angleDistance <= polarAngleThreshold) || (angleDistance >= 180 - polarAngleThreshold)) 30 | invalidIndex = [invalidIndex, k]; 31 | end 32 | end 33 | 34 | 35 | % return invalid line index 36 | invalidIndex = unique(invalidIndex); 37 | 38 | 39 | % lineNormals_invalid = lineNormals(:,invalidIndex); 40 | % lineNormals(:,invalidIndex) = []; 41 | % 42 | % lines_invalid = lines(invalidIndex,:); 43 | % lines(invalidIndex,:) = []; 44 | 45 | 46 | end 47 | 48 | 49 | % % plot invalid line normals on the Gaussian sphere 50 | % figure; 51 | % plot_unit_sphere(1, 20, 0.5); hold on; grid on; axis equal; 52 | % for k = 1:size(lineNormals_invalid,2) 53 | % normal = lineNormals_invalid(:,k); 54 | % plot3(normal(1),normal(2),normal(3),'o','MarkerSize',10,'LineWidth',1.5,'Color','k','MarkerFaceColor',[0.5,0.5,0.5]); 55 | % end 56 | % plot_vertical_dominant_direction(vDD, 'm', 0.01); 57 | % plot_vertical_dominant_plane(vDD, 1.5, 'm'); hold off; 58 | % f = FigureRotator(gca()); 59 | % % 60 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /MWMS_core/getImgInTUMRGBDdataset.m: -------------------------------------------------------------------------------- 1 | function [targetImage] = getImgInTUMRGBDdataset(datasetPath, TUMRGBDdataset, cam, frameIdx, imgType) 2 | % Project: Depth enhanced visual odometry 3 | % Function: getImgInTUMRGBDdataset 4 | % 5 | % Description: 6 | % get gray, rgb, and depth image from TUM RGBD dataset 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % targetImage : imported images to workspace from [datasetPath] 11 | % if imgType is 'gray' -> targetImage is a gray image. (uint8) 12 | % if imgType is 'depth' -> targetImage is a depth image [m]. (double) 13 | % if imgType is 'rgb' -> targetImage is a rgb image. (uint8) 14 | % 15 | % INPUT: 16 | % datasetPath: absolute path to TUM RGBD dataset directory 17 | % TUMRGBDdataset: compact and synchronized rgb, depth, Vicon datasets 18 | % cam: camera calibration parameters 19 | % frameIdx: frame index of TUM RGBD dataset ( 1-based index ) 20 | % ImgType: the type of images ( 'gray' or 'depth' or 'rgb' ) 21 | % 22 | % NOTE: 23 | % 24 | % Author: Pyojin Kim 25 | % Email: pjinkim1215@gmail.com 26 | % Website: 27 | % 28 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 | % log: 30 | % 2016-12-01: Complete 31 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 | % 33 | 34 | 35 | % read rgb and depth images 36 | imRgb = imread([ datasetPath '/' TUMRGBDdataset.rgb.imgName{frameIdx} ]); 37 | imDepth = imread([ datasetPath '/' TUMRGBDdataset.depth.imgName{frameIdx} ]); 38 | 39 | 40 | % determine what imgType is ( 'gray' or 'depth' or 'rgb' ) 41 | if ( strcmp(imgType, 'gray') ) 42 | 43 | % convert rgb to gray image 44 | targetImage = uint8(rgb2gray(imRgb)); 45 | 46 | % show current situation 47 | fprintf('----''%s'' images are imported to workspace [%04d] ---- \n', imgType, frameIdx); 48 | 49 | 50 | elseif ( strcmp(imgType, 'depth') ) 51 | 52 | % convert raw depth image to depth image [m] 53 | targetImage = double( double(imDepth) / cam.scaleFactor ); 54 | 55 | % show current situation 56 | fprintf('----''%s'' images are imported to workspace [%04d] ---- \n', imgType, frameIdx); 57 | 58 | 59 | elseif ( strcmp(imgType, 'rgb') ) 60 | 61 | % raw rgb image 62 | targetImage = imRgb; 63 | 64 | % show current situation 65 | fprintf('----''%s'' images are imported to workspace [%04d] ---- \n', imgType, frameIdx); 66 | 67 | 68 | else 69 | 70 | fprintf('\nWrong input(imgType) parameter!!! \n'); 71 | fprintf('What is the ''%s'' ??\n',imgType); 72 | error('Wrong input(imgType) parameter!!!') 73 | 74 | end 75 | 76 | end -------------------------------------------------------------------------------- /MWMS_core/getImgPyramid.m: -------------------------------------------------------------------------------- 1 | function [I1RefPyr, D1RefPyr] = getImgPyramid(I1Ref, D1Ref, maxPyramidLevel) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: getImgPyramid 4 | % 5 | % Description: 6 | % read input and depth images, and generate their pyramid images. 7 | % 8 | % Example: 9 | % OUTPUT : 10 | % I1RefPyr: gray image pyramid of the selected reference gray image 11 | % D1RefPyr: depth image pyramid with respect to I1RefPyr 12 | % 13 | % INPUT : 14 | % I1Ref: A rgb or gray input image (with uint8 type) 15 | % D1Ref: A depth input image (with double type) 16 | % maxPyramidLevel: options for PIVO process like below 17 | % 18 | % NOTE: 19 | % 20 | % 21 | % Author: Pyojin Kim 22 | % Email: pjinkim1215@gmail.com 23 | % Website: 24 | % 25 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | % log: 27 | % 2017-03-22 : Complete 28 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 | % 30 | 31 | % image pyramid reduction 32 | for i = 2:maxPyramidLevel 33 | I1Ref = impyramid(I1Ref, 'reduce'); %downsampleImage(I1Ref); 34 | D1Ref = downsampleDepth(D1Ref); 35 | end 36 | I1RefPyr = I1Ref; 37 | D1RefPyr = D1Ref; 38 | 39 | 40 | end 41 | -------------------------------------------------------------------------------- /MWMS_core/getSyncTUMRGBDdataset.m: -------------------------------------------------------------------------------- 1 | function [TUMRGBDdatasetNet] = getSyncTUMRGBDdataset(rawTUMRGBDdataset, imInit, M) 2 | % Project: Depth enhanced visual odometry 3 | % Function: getSyncTUMRGBDdataset 4 | % 5 | % Description: 6 | % get synchronized rgb, depth and Vicon data from rawTUMRGBDdataset 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % TUMRGBDdataset: compact and synchronized rgb, depth, Vicon datasets 11 | % 12 | % INPUT: 13 | % rawTUMRGBDdataset: raw TUM RGBD dataset variable from 'rawTUMRGBDdataset_load(datasetPath)' 14 | % imInit: first image index (1-based index) 15 | % M: number of images 16 | % 17 | % 18 | % NOTE: 19 | % 20 | % Author: Pyojin Kim 21 | % Email: pjinkim1215@gmail.com 22 | % Website: 23 | % 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | % log: 26 | % 2017-01-22: Complete 27 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 28 | % 29 | 30 | 31 | % copy from rawTUMRGBDdataset 32 | TUMRGBDdataset = rawTUMRGBDdataset; 33 | 34 | 35 | % normalize the time stamps in rgb, depth, ground truth data 36 | minReferenceTime = min([TUMRGBDdataset.rgb.time(1), TUMRGBDdataset.depth.time(1), TUMRGBDdataset.vicon.time(1)]); 37 | TUMRGBDdataset.rgb.ntime = double(TUMRGBDdataset.rgb.time - minReferenceTime); 38 | TUMRGBDdataset.depth.ntime = double(TUMRGBDdataset.depth.time - minReferenceTime); 39 | TUMRGBDdataset.vicon.ntime = double(TUMRGBDdataset.vicon.time - minReferenceTime); 40 | 41 | 42 | %% synchronize depth, vicon ntime w.r.t. rgb ntime 43 | 44 | 45 | % depth part 46 | matchingTimeIdx_depth = zeros(size(TUMRGBDdataset.rgb.ntime,2),2); 47 | for i = 1:size(matchingTimeIdx_depth,1) 48 | temp_difference = abs( TUMRGBDdataset.depth.ntime - TUMRGBDdataset.rgb.ntime(i) ); 49 | [~,minTimeIdx] = min(temp_difference); 50 | 51 | matchingTimeIdx_depth(i,1) = minTimeIdx; % ntime in depth index 52 | matchingTimeIdx_depth(i,2) = i; % ntime in rgb index 53 | end 54 | 55 | TUMRGBDdataset.rgb.matchingTimeIdx_depth = matchingTimeIdx_depth.'; 56 | 57 | 58 | % vicon part 59 | matchingTimeIdx_Vicon = zeros(size(TUMRGBDdataset.rgb.ntime,2),2); 60 | for i = 1:size(matchingTimeIdx_Vicon,1) 61 | temp_difference = abs( TUMRGBDdataset.vicon.ntime - TUMRGBDdataset.rgb.ntime(i) ); 62 | [~,minTimeIdx] = min(temp_difference); 63 | 64 | matchingTimeIdx_Vicon(i,1) = minTimeIdx; % ntime in Vicon index 65 | matchingTimeIdx_Vicon(i,2) = i; % ntime in rgb index 66 | end 67 | 68 | TUMRGBDdataset.vicon.ntime_Sync = TUMRGBDdataset.vicon.ntime(matchingTimeIdx_Vicon(:,1)); 69 | TUMRGBDdataset.vicon.p_gc_Sync = TUMRGBDdataset.vicon.p_gc(:,matchingTimeIdx_Vicon(:,1)); 70 | TUMRGBDdataset.vicon.q_gc_Sync = TUMRGBDdataset.vicon.q_gc(:,matchingTimeIdx_Vicon(:,1)); 71 | 72 | 73 | %% extract pre-defined interval from [imInit] to [imInit+M-1] 74 | 75 | 76 | % re-load rgb information 77 | TUMRGBDdatasetNet.rgb.ntime = TUMRGBDdataset.rgb.ntime(:,(imInit):(imInit+M-1)); 78 | for k=1:M 79 | TUMRGBDdatasetNet.rgb.imgName{k} = TUMRGBDdataset.rgb.imgName{imInit+k-1}; 80 | end 81 | TUMRGBDdatasetNet.rgb.K = TUMRGBDdataset.rgb.K; 82 | TUMRGBDdatasetNet.rgb.distortion = TUMRGBDdataset.rgb.distortion; 83 | 84 | 85 | % re-load depth information 86 | for k=1:M 87 | depthIdx = TUMRGBDdataset.rgb.matchingTimeIdx_depth(1,imInit+k-1); 88 | 89 | TUMRGBDdatasetNet.depth.ntime(k) = TUMRGBDdataset.depth.ntime(:,depthIdx); 90 | TUMRGBDdatasetNet.depth.imgName{k} = TUMRGBDdataset.depth.imgName{depthIdx}; 91 | end 92 | TUMRGBDdatasetNet.depth.scaleFactor = TUMRGBDdataset.depth.scaleFactor; 93 | 94 | 95 | % re-load ground-truth data 96 | TUMRGBDdatasetNet.vicon.ntime_Sync = TUMRGBDdataset.vicon.ntime_Sync(:,(imInit):(imInit+M-1)); 97 | TUMRGBDdatasetNet.vicon.p_gc_Sync = TUMRGBDdataset.vicon.p_gc_Sync(:,(imInit):(imInit+M-1)); 98 | TUMRGBDdatasetNet.vicon.q_gc_Sync = TUMRGBDdataset.vicon.q_gc_Sync(:,(imInit):(imInit+M-1)); 99 | 100 | 101 | end 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /MWMS_core/inThresforPlane.m: -------------------------------------------------------------------------------- 1 | function [matchingNum, goodMatchingIdx] = inThresforPlane(pointCloudRef, normPlaneModel, distance) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: inThresforPlane 4 | % 5 | % Description: 6 | % get the index of 3D points satisfying [Distance] < [Threshold], 7 | % 'distance' means the length between the 3D points and the plane. 8 | % 9 | % Example: 10 | % OUTPUT : 11 | % matchingNum: the number of 3D points satisfying [DIstance] < [Threshold] 12 | % goodMatchingIdx: index of 3D points satisfying [DIstance] < [Threshold] 13 | % 14 | % INPUT : 15 | % pointCloudRef : 3D feature points expressed in camera frame [m] - [x;y;z] 16 | % normPlaneModel: normalized plane model - [a,b,c,d] 17 | % 'a*x + b*y + c*z + d = 0' 18 | % distance: threshold distance [m] between the point and the plane 19 | % 20 | % NOTE: 21 | % 22 | % Author: Pyojin Kim 23 | % Email: pjinkim1215@gmail.com 24 | % Website: 25 | % 26 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 27 | % log: 28 | % 2017-01-22 : Complete 29 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 30 | % 31 | 32 | 33 | % set parameters 34 | numPoint = size(pointCloudRef, 2); 35 | distanceEachPoint = zeros(1, numPoint); 36 | 37 | 38 | % assign plane model parameters 39 | a = normPlaneModel(1); 40 | b = normPlaneModel(2); 41 | c = normPlaneModel(3); 42 | d = normPlaneModel(4); 43 | 44 | 45 | % distance between each point and plane 46 | denominator = sqrt(a^2 + b^2 + c^2); 47 | for k = 1:numPoint 48 | distanceEachPoint(k) = abs((a*pointCloudRef(1,k) + b*pointCloudRef(2,k) + c*pointCloudRef(3,k) + d) / (denominator)); 49 | end 50 | 51 | 52 | % determine inlier or not 53 | matchingNum = sum(distanceEachPoint <= distance); 54 | goodMatchingIdx = find(distanceEachPoint <= distance); 55 | 56 | 57 | end 58 | -------------------------------------------------------------------------------- /MWMS_core/initialize_cam_TUM_RGBD.m: -------------------------------------------------------------------------------- 1 | function [cam] = initialize_cam_TUM_RGBD(TUMRGBDdataset, maxPyramidLevel) 2 | % camera calibration parameters from TUM RGBD dataset 3 | 4 | 5 | % intrinsic camera calibration parameters 6 | cam.K = TUMRGBDdataset.rgb.K; 7 | 8 | cam.k1 = TUMRGBDdataset.rgb.distortion(1); 9 | cam.k2 = TUMRGBDdataset.rgb.distortion(2); 10 | cam.p1 = TUMRGBDdataset.rgb.distortion(3); 11 | cam.p2 = TUMRGBDdataset.rgb.distortion(4); 12 | cam.p3 = TUMRGBDdataset.rgb.distortion(5); 13 | 14 | 15 | % intrinsic camera calibration K parameters for multi-level pyramid 16 | K_pyramid = zeros(3,3,maxPyramidLevel); 17 | K_pyramid(:,:,1) = cam.K; 18 | 19 | % perform pyramid reduction with average values 20 | for k = 2:maxPyramidLevel 21 | K_pyramid(:,:,k) = downsampleKmatrix(K_pyramid(:,:,k-1)); 22 | end 23 | cam.K_pyramid = K_pyramid; 24 | 25 | 26 | % image size parameters 27 | cam.nRows = 480; 28 | cam.nCols = 640; 29 | 30 | 31 | % scale factor to recover depth image 32 | cam.scaleFactor = TUMRGBDdataset.depth.scaleFactor; 33 | 34 | 35 | end -------------------------------------------------------------------------------- /MWMS_core/load_param_MWMS.m: -------------------------------------------------------------------------------- 1 | function [optsMWMS] = load_param_MWMS 2 | % Project: Manhattan World Estimation with Max Stabbing (MWMS) 3 | % Function: load_param_MWMS 4 | % 5 | % Description: 6 | % get the initial parameters with respect to the MWMS algorithm 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % optsMWMS: options for MWMS process like below 11 | % 12 | % INPUT: 13 | % 14 | % 15 | % NOTE: 16 | % The parameters below are initialized as the CVPR paper 17 | % 18 | % Author: Pyojin Kim 19 | % Email: pjinkim1215@gmail.com 20 | % Website: 21 | % 22 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23 | % log: 24 | % 2020-03-13: Complete 25 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | % 27 | 28 | 29 | % line detection parameters 30 | optsMWMS.lineDetector = 'lsd'; % 'gpa' 31 | optsMWMS.lineDescriptor = 'lbd'; 32 | optsMWMS.lineLength = 100; 33 | 34 | 35 | % plane detection and tracking parameters 36 | optsMWMS.imagePyramidLevel = 2; 37 | optsMWMS.minimumDepth = 0.4; 38 | optsMWMS.maximumDepth = 8; 39 | optsMWMS.planeInlierThreshold = 0.02; 40 | optsMWMS.cellsize = 10; 41 | optsMWMS.minSampleRatio = 0.15; 42 | 43 | optsMWMS.numInitialization = 200; 44 | optsMWMS.iterNum = 200; 45 | optsMWMS.convergeAngle = deg2rad(0.001); 46 | optsMWMS.halfApexAngle = deg2rad(10); 47 | optsMWMS.c = 20; 48 | optsMWMS.ratio = 0.1; 49 | 50 | 51 | % horizontal direction detection parameters 52 | optsMWMS.verticalLineNormalAngleThreshold = 3.0; % degree 53 | optsMWMS.verticalPolarRegionAngleThreshold = 6.0; % degree 54 | 55 | 56 | % Kalman filter parameters 57 | optsMWMS.initialVPAngleNoise = deg2rad(1); 58 | optsMWMS.processNoise = deg2rad(0.5); 59 | optsMWMS.measurementNoise = deg2rad(0.5); 60 | 61 | 62 | end 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /MWMS_core/orthogonalDistanceResidual.m: -------------------------------------------------------------------------------- 1 | function [residuals] = orthogonalDistanceResidual(lineEndPixelPoints, centerPixelPoint, lineMFLabel, K, R_cM_initial, planeNormalVector, angle) 2 | % Project: Manhattan World Estimation with Max Stabbing (MWMS) 3 | % Function: orthogonalDistanceResidual 4 | % 5 | % Description: 6 | % residual return function for lsqnonlin in MATLAB 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % residuals: 11 | % 12 | % 13 | % INPUT: 14 | % lineEndPixelPoints: N x 4 15 | % centerPixelPoint: N x 2 16 | % lineMFLabel: N x 1 17 | % K: camera intrinsic parameter 18 | % planeNormalVector: axis in axis-angle representation 19 | % angle: angle in axis-angle representation 20 | % 21 | % 22 | % NOTE: 23 | % 24 | % Author: Pyojin Kim 25 | % Email: pjinkim@sookmyung.ac.kr 26 | % Website: 27 | % 28 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 | % log: 30 | % 2021-02-25: Complete 31 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32 | % 33 | 34 | 35 | % pre-defined variables 36 | numLines = size(lineEndPixelPoints,1); 37 | axisAngle = [planeNormalVector; angle]; 38 | R_axisAngle = vrrotvec2mat(axisAngle); 39 | 40 | 41 | % initial R_cM 42 | VP_x = R_cM_initial(:,1); 43 | VP_y = R_cM_initial(:,2); 44 | VP_z = R_cM_initial(:,3); 45 | 46 | 47 | % rotated R_cM with axis-angle 48 | VP_x_rotated = R_axisAngle * VP_x; 49 | VP_y_rotated = R_axisAngle * VP_y; 50 | VP_z = VP_z; 51 | VP_x_rotated_n = VP_x_rotated ./ VP_x_rotated(3); 52 | VP_x_rotated_p = K * VP_x_rotated_n; 53 | VP_y_rotated_n = VP_y_rotated ./ VP_y_rotated(3); 54 | VP_y_rotated_p = K * VP_y_rotated_n; 55 | 56 | R_cM_rotated_p = [VP_x_rotated_p, VP_y_rotated_p, zeros(3,1)]; 57 | 58 | 59 | % orthogonal distance with end points 60 | residuals = zeros(numLines,2); 61 | for m = 1:numLines 62 | 63 | % current VP index 64 | vpIdx = lineMFLabel(m); 65 | VP_p = R_cM_rotated_p(:,vpIdx); 66 | 67 | 68 | % general line equation 69 | centerpt = centerPixelPoint(m,:); 70 | lineModel = estimateLineModel(VP_p(1:2), centerpt); 71 | A = lineModel(1); 72 | B = lineModel(2); 73 | C = lineModel(3); 74 | 75 | 76 | % orthogonal distance 77 | linedata = lineEndPixelPoints(m,:); 78 | denominator = sqrt(A^2 + B^2); 79 | d_pt1 = (abs(A*linedata(1) + B*linedata(2) + C) / denominator); 80 | d_pt2 = (abs(A*linedata(3) + B*linedata(4) + C) / denominator); 81 | residuals(m,1) = d_pt1; 82 | residuals(m,2) = d_pt2; 83 | end 84 | residuals = residuals(:); 85 | 86 | 87 | end 88 | -------------------------------------------------------------------------------- /MWMS_core/parametrizeVerticalDD.m: -------------------------------------------------------------------------------- 1 | function [alpha, beta, ManhattanDirection_Z] = parametrizeVerticalDD(ManhattanDirection_Z) 2 | 3 | % convert from vertical dominant direction to alpha, beta 4 | beta = asin(ManhattanDirection_Z(3)); 5 | alpha = atan(ManhattanDirection_Z(2)/ManhattanDirection_Z(1)); 6 | 7 | 8 | % check Manhattan Z direction vector is on the hemisphere 9 | vDD = [cos(alpha) * cos(beta); sin(alpha) * cos(beta); sin(beta)]; 10 | if (norm(vDD - ManhattanDirection_Z) > 0.001) 11 | 12 | % choose the opposite direction 13 | ManhattanDirection_Z = -ManhattanDirection_Z; 14 | beta = asin(ManhattanDirection_Z(3)); 15 | alpha = atan(ManhattanDirection_Z(2)/ManhattanDirection_Z(1)); 16 | end 17 | 18 | 19 | end 20 | 21 | -------------------------------------------------------------------------------- /MWMS_core/plot_MW_theta_interval_aligned.m: -------------------------------------------------------------------------------- 1 | function plot_MW_theta_interval_aligned(vpInfo, optimalProbe, thetaIntervals) 2 | 3 | % calculate the number of shifted candidate intervals 4 | numIntervals = size(thetaIntervals,1); 5 | ManhattanOriginIndex = []; 6 | ManhattanShiftIndex = []; 7 | for k = 1:numIntervals 8 | 9 | % Manhattan world theta interval 10 | startPoint = thetaIntervals(k,1); 11 | endPoint = thetaIntervals(k,2); 12 | lineIndex = thetaIntervals(k,3); 13 | isShifted = boolean(thetaIntervals(k,4)); 14 | 15 | 16 | % check valid theta interval 17 | if ((startPoint <= optimalProbe) && (optimalProbe <= endPoint)) 18 | if (isShifted == 0) 19 | ManhattanOriginIndex = [ManhattanOriginIndex, lineIndex]; 20 | else 21 | ManhattanShiftIndex = [ManhattanShiftIndex, lineIndex]; 22 | end 23 | end 24 | end 25 | numOriginIndex = numel(unique(ManhattanOriginIndex)); 26 | numShiftIndex = numel(unique(ManhattanShiftIndex)); 27 | 28 | 29 | % find RGB color of origin or shift 30 | if (vpInfo(1).n == numOriginIndex) 31 | originRGBColor = 'r'; 32 | elseif (vpInfo(2).n == numOriginIndex) 33 | originRGBColor = 'g'; 34 | elseif (vpInfo(3).n == numOriginIndex) 35 | originRGBColor = 'b'; 36 | else 37 | error('Something is wrong in plot_MW_theta_interval!'); 38 | end 39 | if (vpInfo(1).n == numShiftIndex) 40 | shiftRGBColor = 'r'; 41 | elseif (vpInfo(2).n == numShiftIndex) 42 | shiftRGBColor = 'g'; 43 | elseif (vpInfo(3).n == numShiftIndex) 44 | shiftRGBColor = 'b'; 45 | else 46 | error('Something is wrong in plot_MW_theta_interval!'); 47 | end 48 | 49 | 50 | % plot each MW theta interval 51 | for k = 1:numIntervals 52 | 53 | % Manhattan world theta interval 54 | startPoint = thetaIntervals(k,1); 55 | endPoint = thetaIntervals(k,2); 56 | lineIndex = thetaIntervals(k,3); 57 | isShifted = boolean(thetaIntervals(k,4)); 58 | 59 | 60 | % plot each theta interval 61 | if ((startPoint <= optimalProbe) && (optimalProbe <= endPoint)) 62 | if (isShifted == 0) 63 | line([rad2deg(startPoint), rad2deg(endPoint)], [lineIndex, lineIndex],'color',originRGBColor,'LineWidth',3.5); 64 | elseif (isShifted == 1) 65 | line([rad2deg(startPoint), rad2deg(endPoint)], [lineIndex, lineIndex],'color',shiftRGBColor,'LineWidth',3.5); 66 | else 67 | error('Something is wrong in plot_MW_theta_interval!'); 68 | end 69 | else 70 | line([rad2deg(startPoint), rad2deg(endPoint)], [lineIndex, lineIndex],'color','k','LineWidth',3.5); 71 | end 72 | end 73 | line([rad2deg(optimalProbe), rad2deg(optimalProbe)],[0, (numIntervals+1)],'color','m','LineWidth',2.0); 74 | 75 | 76 | end 77 | 78 | 79 | -------------------------------------------------------------------------------- /MWMS_core/plot_Manhattan_camera_frame.m: -------------------------------------------------------------------------------- 1 | function plot_Manhattan_camera_frame(R_cM, R_gc) 2 | 3 | % convert new global frame only for good view 4 | R_gnew_g = [0 0 -1; 1 0 0; 0 -1 0]; 5 | 6 | 7 | % background grid black lines 8 | bglines = [-2 -2 2 -2 2 2; 9 | -2 -2 0 -2 2 0; 10 | -2 -2 -2 -2 2 -2; 11 | 0 -2 -2 0 2 -2; 12 | 2 -2 -2 2 2 -2; 13 | 2 -2 2 -2 -2 2; 14 | 2 -2 0 -2 -2 0; 15 | 2 -2 -2 -2 -2 -2; 16 | 2 -2 2 2 -2 -2; 17 | 0 -2 2 0 -2 -2; 18 | -2 -2 2 -2 -2 -2; 19 | -2 0 2 -2 0 -2; 20 | -2 2 2 -2 2 -2; 21 | 2 0 -2 -2 0 -2; 22 | 2 2 -2 -2 2 -2]; 23 | for k = 1:size(bglines,1) 24 | plot3([bglines(k,1) bglines(k,4)], [bglines(k,2) bglines(k,5)], [bglines(k,3) bglines(k,6)], 'k'); 25 | end 26 | 27 | 28 | % camera orientation 29 | camDir = R_gnew_g * R_gc * [2 0 0 0; 0 2 0 0; 0 0 2 0]; 30 | plot3([camDir(1,1) camDir(1,4)], [camDir(2,1) camDir(2,4)], [camDir(3,1) camDir(3,4)], 'r:', 'LineWidth', 4); 31 | plot3([camDir(1,2) camDir(1,4)], [camDir(2,2) camDir(2,4)], [camDir(3,2) camDir(3,4)], 'g:', 'LineWidth', 4); 32 | plot3([camDir(1,3) camDir(1,4)], [camDir(2,3) camDir(2,4)], [camDir(3,3) camDir(3,4)], 'b:', 'LineWidth', 4); 33 | 34 | 35 | % Manhattan frame (vanishing points) 36 | vpColors = [1 0 0; 37 | 0 1 0; 38 | 0 0 1]; 39 | for k = 1:3 40 | vpVector = R_gc * R_cM(:,k); 41 | vpDir = R_gnew_g * [-2*vpVector, 2*vpVector]; 42 | plot3(vpDir(1,:), vpDir(2,:), vpDir(3,:), 'Color', vpColors(k,:), 'LineWidth', 3); 43 | text(vpDir(1,2)*1.1, vpDir(2,2)*1.1, vpDir(3,2)*1.1, ['\bf\fontsize{16}VD ' num2str(k)]); 44 | end 45 | 46 | 47 | end -------------------------------------------------------------------------------- /MWMS_core/plot_display_text.m: -------------------------------------------------------------------------------- 1 | function plot_display_text(R_cM, sNV, vpInfo, optsMWMS) 2 | 3 | % number of sNV 4 | numNV = computeNumInXYZCone(R_cM, sNV, optsMWMS.halfApexAngle); 5 | 6 | 7 | % number of lines 8 | numLines = zeros(1,3); 9 | numLines(1) = vpInfo(1).n; 10 | numLines(2) = vpInfo(2).n; 11 | numLines(3) = vpInfo(3).n; 12 | 13 | 14 | % display current status 15 | text(7, 10, sprintf('sNV: %05d, %05d, %05d', numNV(1), numNV(2), numNV(3)), 'Color', 'y', 'FontSize', 11, 'FontWeight', 'bold'); 16 | text(7, 22, sprintf('lines: %05d, %05d, %05d', numLines(1), numLines(2), numLines(3)), 'Color', 'y', 'FontSize', 11, 'FontWeight', 'bold'); 17 | 18 | 19 | end 20 | 21 | -------------------------------------------------------------------------------- /MWMS_core/plot_extended_lines.m: -------------------------------------------------------------------------------- 1 | function plot_extended_lines(R_cM, vpInfo, imageCurForLine, cam, optsMWMS) 2 | 3 | % assign current parameters 4 | L = optsMWMS.imagePyramidLevel; 5 | imageHeight = size(imageCurForLine,1); 6 | imageWidth = size(imageCurForLine,2); 7 | 8 | 9 | %% plot extended lines and VPs 10 | 11 | % plot clustered lines 12 | for k = 1:vpInfo(1).n 13 | linePixelPts = vpInfo(1).line(k).data; 14 | pt1_pixel = linePixelPts(1:2); 15 | pt2_pixel = linePixelPts(3:4); 16 | 17 | % plot extended line to VP 18 | u_start = 1; 19 | u_end = imageWidth; 20 | m = (pt2_pixel(2) - pt1_pixel(2)) / (pt2_pixel(1) - pt1_pixel(1)); 21 | v_start = m * (u_start-pt1_pixel(1)) + pt1_pixel(2); 22 | v_end = m * (u_end-pt1_pixel(1)) + pt1_pixel(2); 23 | 24 | % re-arrange pixel point 25 | linePixelPts = [u_start, v_start, u_end, v_end] / (2^(L-1)); 26 | plot([linePixelPts(1),linePixelPts(3)],[linePixelPts(2),linePixelPts(4)],'r','LineWidth',2.0); 27 | end 28 | for k = 1:vpInfo(2).n 29 | linePixelPts = vpInfo(2).line(k).data; 30 | pt1_pixel = linePixelPts(1:2); 31 | pt2_pixel = linePixelPts(3:4); 32 | 33 | % plot extended line to VP 34 | u_start = 1; 35 | u_end = imageWidth; 36 | m = (pt2_pixel(2) - pt1_pixel(2)) / (pt2_pixel(1) - pt1_pixel(1)); 37 | v_start = m * (u_start-pt1_pixel(1)) + pt1_pixel(2); 38 | v_end = m * (u_end-pt1_pixel(1)) + pt1_pixel(2); 39 | 40 | % re-arrange pixel point 41 | linePixelPts = [u_start, v_start, u_end, v_end] / (2^(L-1)); 42 | plot([linePixelPts(1),linePixelPts(3)],[linePixelPts(2),linePixelPts(4)],'g','LineWidth',2.0); 43 | end 44 | for k = 1:vpInfo(3).n 45 | linePixelPts = vpInfo(3).line(k).data; 46 | pt1_pixel = linePixelPts(1:2); 47 | pt2_pixel = linePixelPts(3:4); 48 | 49 | % plot extended line to VP 50 | u_start = 1; 51 | u_end = imageWidth; 52 | m = (pt2_pixel(2) - pt1_pixel(2)) / (pt2_pixel(1) - pt1_pixel(1)); 53 | v_start = m * (u_start-pt1_pixel(1)) + pt1_pixel(2); 54 | v_end = m * (u_end-pt1_pixel(1)) + pt1_pixel(2); 55 | 56 | % re-arrange pixel point 57 | linePixelPts = [u_start, v_start, u_end, v_end] / (2^(L-1)); 58 | plot([linePixelPts(1),linePixelPts(3)],[linePixelPts(2),linePixelPts(4)],'b','LineWidth',2.0); 59 | end 60 | 61 | 62 | % plot all VPs 63 | for k = 1:3 64 | 65 | % initial VP point 66 | VP = R_cM(:,k); 67 | VP_n = VP ./ VP(3); 68 | VP_p = cam.K * VP_n; 69 | 70 | 71 | % plot VPs 72 | VP_p_plot = VP_p / (2^(L-1)); 73 | scatter(VP_p_plot(1),VP_p_plot(2),150,[1 1 0],'o'); 74 | scatter(VP_p_plot(1),VP_p_plot(2),50,[1 1 0],'o'); 75 | scatter(VP_p_plot(1),VP_p_plot(2),10,[1 1 0],'o'); 76 | end 77 | 78 | 79 | end 80 | 81 | -------------------------------------------------------------------------------- /MWMS_core/plot_image_lines.m: -------------------------------------------------------------------------------- 1 | function plot_image_lines(imageCurForLine, cam, optsMWMS) 2 | 3 | % assign current parameters 4 | lineDetector = optsMWMS.lineDetector; 5 | lineLength = optsMWMS.lineLength; 6 | 7 | 8 | % line detection 9 | dimageCurForLine = double(imageCurForLine); 10 | if (strcmp(lineDetector,'lsd')) 11 | [lines, ~] = lsdf(dimageCurForLine, (lineLength^2)); 12 | elseif (strcmp(lineDetector,'gpa')) 13 | [lines, ~] = gpa(imageCurForLine, lineLength); 14 | end 15 | lines = extractUniqueLines(imageCurForLine, lines, cam); 16 | 17 | 18 | % plot image and lines 19 | imshow(imageCurForLine,[]); hold on; 20 | for k = 1:size(lines,1) 21 | plot([lines(k,1),lines(k,3)],[lines(k,2),lines(k,4)],'LineWidth',2.5); 22 | end 23 | 24 | 25 | end 26 | 27 | -------------------------------------------------------------------------------- /MWMS_core/plot_tracked_single_plane.m: -------------------------------------------------------------------------------- 1 | function plot_tracked_single_plane(imageShow, R_cM, planeNormalVector, surfaceNormalVector, surfacePixelPoint, optsMWMS) 2 | 3 | % assign current parameters 4 | imageHeight = size(imageShow,1); 5 | imageWidth = size(imageShow,2); 6 | halfApexAngle = optsMWMS.halfApexAngle; 7 | ManhattanXYZIndex = find(abs(planeNormalVector.' * R_cM) > cos(deg2rad(5))); 8 | if (ManhattanXYZIndex == 1) 9 | planeRGBColor = [255;0;0]; % X axis: red 10 | elseif (ManhattanXYZIndex == 2) 11 | planeRGBColor = [0;255;0]; % Y axis: green 12 | elseif (ManhattanXYZIndex == 3) 13 | planeRGBColor = [0;0;255]; % Z axis: blue 14 | else 15 | error('Something is wrong in plot_tracked_single_plane!'); 16 | end 17 | 18 | 19 | %% project normal vectors to plane normal vector 20 | 21 | % default parameters 22 | numNormalVector = size(surfaceNormalVector,2); 23 | planeIndex = ones(1,numNormalVector) * -1000; 24 | 25 | % projection on plane normal vector axis 26 | R_cM = seekPlaneManhattanWorld(planeNormalVector); 27 | R_Mc = R_cM.'; 28 | n_j = R_Mc * surfaceNormalVector; 29 | 30 | % check within half apex angle 31 | lambda = sqrt(n_j(1,:).*n_j(1,:) + n_j(2,:).*n_j(2,:)); 32 | index = find(lambda <= sin(halfApexAngle)); 33 | planeIndex(:,index) = 1; 34 | 35 | 36 | %% plot tracked single plane segmentation results 37 | 38 | % construct plane RGB mask 39 | planeRGBMask = uint8(zeros(imageHeight,imageWidth,3)); 40 | for k = 1:numNormalVector 41 | 42 | % current pixel position 43 | tempPixel = surfacePixelPoint(:,k); 44 | a = planeIndex(k); 45 | 46 | % check tracked single plane or not 47 | if (a == 1) 48 | % R / G / B 49 | for m = 1:size(tempPixel,2) 50 | u = tempPixel(1,m); 51 | v = tempPixel(2,m); 52 | planeRGBMask(v,u,1) = planeRGBColor(1); 53 | planeRGBMask(v,u,2) = planeRGBColor(2); 54 | planeRGBMask(v,u,3) = planeRGBColor(3); 55 | end 56 | else 57 | % gray 58 | for m = 1:size(tempPixel,2) 59 | u = tempPixel(1,m); 60 | v = tempPixel(2,m); 61 | planeRGBMask(v,u,1) = 150; 62 | planeRGBMask(v,u,2) = 150; 63 | planeRGBMask(v,u,3) = 150; 64 | end 65 | end 66 | end 67 | 68 | 69 | % plot plane segmentation results 70 | imshow(imageShow,[]); hold on; 71 | h_planeRGBMask = imshow(planeRGBMask,[]); 72 | set(h_planeRGBMask, 'AlphaData', 0.5); 73 | 74 | 75 | end -------------------------------------------------------------------------------- /MWMS_core/plot_true_camera_frame.m: -------------------------------------------------------------------------------- 1 | function plot_true_camera_frame(R_gc_true) 2 | 3 | % convert new global frame only for good view 4 | R_gnew_g = [0 0 -1; 1 0 0; 0 -1 0]; 5 | 6 | 7 | % camera orientation 8 | camDir = R_gnew_g * R_gc_true * [2 0 0 0; 0 2 0 0; 0 0 2 0]; 9 | plot3([camDir(1,1) camDir(1,4)], [camDir(2,1) camDir(2,4)], [camDir(3,1) camDir(3,4)], 'k', 'LineWidth', 1.5); 10 | plot3([camDir(1,2) camDir(1,4)], [camDir(2,2) camDir(2,4)], [camDir(3,2) camDir(3,4)], 'k', 'LineWidth', 1.5); 11 | plot3([camDir(1,3) camDir(1,4)], [camDir(2,3) camDir(2,4)], [camDir(3,3) camDir(3,4)], 'k', 'LineWidth', 1.5); 12 | 13 | 14 | end -------------------------------------------------------------------------------- /MWMS_core/plots_status_with_true.m: -------------------------------------------------------------------------------- 1 | if (toVisualize) 2 | %% update lines & plane on RGB image 3 | 4 | axes(ha1); cla; 5 | plot_tracked_single_plane(imageCurForMW, R_cM, pNV, sNV, sPP, optsMWMS); hold on; 6 | plot_extended_lines(R_cM, vpInfo, imageCurForLine, cam, optsMWMS); 7 | plot_display_text(R_cM, sNV, vpInfo, optsMWMS); hold off; 8 | title('Tracked Single Plane and MW Lines on the Image'); 9 | 10 | %% update all lines on gray image 11 | 12 | axes(ha2); cla; 13 | plot_image_lines(imageCurForLine, cam, optsMWMS); hold off; 14 | title('All Detected Lines on the Image'); 15 | 16 | %% update optimal probe & Manhattan theta intervals 17 | 18 | axes(ha3); cla; 19 | plot_MW_theta_interval_aligned(vpInfo, optimalProbe, thetaIntervals); grid on; xlim([0 90]); 20 | xlabel('Theta [deg]'); ylabel('Line Index'); 21 | title('Optimal Probe and MW Theta Intervals'); 22 | 23 | %% update 3-DoF camera orientation 24 | 25 | axes(ha4); cla; 26 | hold on; grid on; axis equal; view(130,30); 27 | plot_Manhattan_camera_frame(R_cM, R_gc_MWMS(:,:,imgIdx)); 28 | plot_true_camera_frame(R_gc_true(:,:,imgIdx)); hold off; 29 | title('3-DoF Camera Orientation'); 30 | refresh; pause(0.01); 31 | 32 | %% save current figure 33 | 34 | if (toSave) 35 | % save directory for MAT data 36 | SaveDir = [datasetPath '/ICRA2022']; 37 | if (~exist( SaveDir, 'dir' )) 38 | mkdir(SaveDir); 39 | end 40 | 41 | % save directory for images 42 | SaveImDir = [SaveDir '/MWMS']; 43 | if (~exist( SaveImDir, 'dir' )) 44 | mkdir(SaveImDir); 45 | end 46 | 47 | pause(0.01); refresh; 48 | saveImg = getframe(h); 49 | imwrite(saveImg.cdata , [SaveImDir sprintf('/%06d.png', imgIdx)]); 50 | end 51 | end 52 | -------------------------------------------------------------------------------- /MWMS_core/q2r.m: -------------------------------------------------------------------------------- 1 | function R = q2r( q ) 2 | % Project: Patch-based illumination-variant DVO 3 | % Function: q2r 4 | % 5 | % Description: 6 | % This function convert from unit orientation quaternion to rotation matrix 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % R = rotation matrix (3x3) defined as [inertial frame] = R * [body frame] (R = R_gb) 11 | % 12 | % INPUT: 13 | % quatVector: quaternion vector composed of [qw qx qy qz] 14 | % 15 | % NOTE: 16 | % 17 | % Author: Pyojin Kim 18 | % Email: pjinkim1215@gmail.com 19 | % Website: 20 | % 21 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22 | % log: 23 | % 2015-02-06: Complete 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | % 26 | 27 | % quaternion to dcm 28 | q = q/norm(q); 29 | 30 | a = q(1); 31 | b = q(2); 32 | c = q(3); 33 | d = q(4); 34 | R=[ a*a+b*b-c*c-d*d, 2*(b*c-a*d), 2*(b*d+a*c); 35 | 2*(b*c+a*d), a*a-b*b+c*c-d*d, 2*(c*d-a*b); 36 | 2*(b*d-a*c), 2*(c*d+a*b), a*a-b*b-c*c+d*d; ]; 37 | 38 | end -------------------------------------------------------------------------------- /MWMS_core/r2q.m: -------------------------------------------------------------------------------- 1 | function [q] = r2q( R ) 2 | % Project: Patch-based illumination-variant DVO 3 | % Function: r2q 4 | % 5 | % Description: 6 | % This function convert from rotation matrix to unit orientation quaternion 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % quatVector: quaternion vector composed of [qw qx qy qz] 11 | % 12 | % INPUT: 13 | % R = rotation matrix (3x3) defined as [inertial frame] = R * [body frame] (R = R_gb) 14 | % 15 | % NOTE: 16 | % 17 | % Author: Pyojin Kim 18 | % Email: pjinkim1215@gmail.com 19 | % Website: 20 | % 21 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 22 | % log: 23 | % 2015-02-06: Complete 24 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 25 | % 26 | 27 | q1 = 0.5 * sqrt(1+R(1,1)+R(2,2)+R(3,3)); 28 | q2 = (1/(4*q1))*(R(3,2)-R(2,3)); 29 | q3 = (1/(4*q1))*(R(1,3)-R(3,1)); 30 | q4 = (1/(4*q1))*(R(2,1)-R(1,2)); 31 | 32 | q = [q1;q2;q3;q4]; 33 | 34 | end 35 | 36 | -------------------------------------------------------------------------------- /MWMS_core/rawICLNUIMdataset_load.m: -------------------------------------------------------------------------------- 1 | function [rawICLNUIMdataset] = rawICLNUIMdataset_load(datasetPath) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: rawICLNUIMdataset_load 4 | % 5 | % Description: 6 | % get raw rgb, depth, and Vicon data from ICL NUIM dataset 7 | % 8 | % Example: 9 | % OUTPUT: 10 | % rawICLNUIMdataset: 11 | % 12 | % INPUT: 13 | % datasetPath: directory of folder which includes the groundtruth.txt from this m.file 14 | % 15 | % 16 | % NOTE: 17 | % 18 | % Author: Pyojin Kim 19 | % Email: pjinkim@sookmyung.ac.kr 20 | % Website: http://mpil.sookmyung.ac.kr/ 21 | % 22 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 23 | % log: 24 | % 2017-02-10: Complete 25 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | % 27 | 28 | 29 | %% import data from text files 30 | 31 | 32 | % import ground-truth data 33 | delimiter = ' '; 34 | textData_groundtruth = importdata([datasetPath '/groundtruth.txt'], delimiter); 35 | 36 | 37 | % import time_sync (rgb and depth) data 38 | fileID = fopen([datasetPath, '/associations.txt'], 'r'); 39 | textData_timesync = textscan(fileID, '%f64 %s %f64 %s'); 40 | fclose(fileID); 41 | 42 | 43 | %% load ground-truth and rgb data 44 | 45 | 46 | % load ground-truth data 47 | rawICLNUIMdataset.vicon.time = textData_groundtruth(:,1).'; 48 | rawICLNUIMdataset.vicon.p_gc = [textData_groundtruth(:,2).'; -textData_groundtruth(:,3).'; textData_groundtruth(:,4).']; 49 | rawICLNUIMdataset.vicon.q_gc = [textData_groundtruth(:,8).'; textData_groundtruth(:,5).'; textData_groundtruth(:,6).'; textData_groundtruth(:,7).']; 50 | 51 | 52 | % convert camera frame (to my convention) 53 | q_gc_temp = rawICLNUIMdataset.vicon.q_gc; 54 | numData = size(q_gc_temp, 2); 55 | q_gc_convert = zeros(4, numData); 56 | for k = 1:numData 57 | R_gc_true = q2r(q_gc_temp(:, k)); 58 | angle_true = rotmtx2angle(R_gc_true.'); 59 | 60 | angle_true_convert = [-angle_true(1); angle_true(2); -angle_true(3)]; 61 | R_gc_true_convert = angle2rotmtx(angle_true_convert).'; 62 | 63 | q_gc_convert(:,k) = r2q(R_gc_true_convert); 64 | end 65 | rawICLNUIMdataset.vicon.q_gc = q_gc_convert; 66 | 67 | 68 | % load synchronized rgb data 69 | K = eye(3); 70 | K(1,1) = 481.2; % fx 71 | K(2,2) = 480.0; % fy 72 | K(1,3) = 319.5; % cx 73 | K(2,3) = 239.5; % cy 74 | distortion = [0, 0, 0, 0, 0]; % d0 d1 d2 d3 d4 75 | 76 | 77 | rawICLNUIMdataset.rgb.time = textData_timesync{3}.'; 78 | rawICLNUIMdataset.rgb.imgName = textData_timesync{4}.'; 79 | rawICLNUIMdataset.rgb.K = K; 80 | rawICLNUIMdataset.rgb.distortion = distortion; 81 | 82 | 83 | % load synchronized depth data 84 | rawICLNUIMdataset.depth.time = textData_timesync{1}.'; 85 | rawICLNUIMdataset.depth.imgName = textData_timesync{2}.'; 86 | rawICLNUIMdataset.depth.scaleFactor = 5000; 87 | 88 | 89 | end 90 | -------------------------------------------------------------------------------- /MWMS_core/refineOrthogonalParallelLines.m: -------------------------------------------------------------------------------- 1 | function [R_cM_final, clusteredLinesIdx_final] = refineOrthogonalParallelLines(R_cM_initial, clusteredLinesIdx, planeNormalVector, lines, cam) 2 | 3 | % line information for multiple lines refinement 4 | numLines = size(lines,1); 5 | lineEndPixelPoints = zeros(numLines,4); 6 | centerPixelPoint = zeros(numLines,2); 7 | for k = 1:numLines 8 | 9 | % line pixel information 10 | linedata = lines(k,1:4); 11 | centerpt = (linedata(1:2) + linedata(3:4))/2; 12 | 13 | 14 | % save the result 15 | lineEndPixelPoints(k,:) = linedata; 16 | centerPixelPoint(k,:) = centerpt; 17 | end 18 | 19 | 20 | % refine Manhattan MnS results 21 | if (isempty(clusteredLinesIdx{1}) && isempty(clusteredLinesIdx{2})) 22 | R_cM_final = zeros(3); 23 | clusteredLinesIdx_final = cell(1,3); 24 | else 25 | % re-arrange line information for nonlinear optimization 26 | lineEndPixelPoints_inMF = []; 27 | centerPixelPoint_inMF = []; 28 | lineMFLabel_inMF = []; 29 | for k = 1:2 30 | 31 | % current lines in VPs 32 | linesInVP = lines(clusteredLinesIdx{k},:); 33 | numLinesInVP = size(linesInVP,1); 34 | 35 | % line pixel point information 36 | lineEndPixelPoints_inMF = [lineEndPixelPoints_inMF; lineEndPixelPoints(clusteredLinesIdx{k},:)]; 37 | centerPixelPoint_inMF = [centerPixelPoint_inMF; centerPixelPoint(clusteredLinesIdx{k},:)]; 38 | lineMFLabel_inMF = [lineMFLabel_inMF; ones(numLinesInVP,1) * k]; 39 | end 40 | 41 | 42 | % run nonlinear optimization using lsqnonlin in Matlab (Levenberg-Marquardt) 43 | options = optimoptions(@lsqnonlin,'Algorithm','levenberg-marquardt','Display','iter-detailed'); 44 | [vec,resnorm,residuals,exitflag] = lsqnonlin(@(x) orthogonalDistanceResidual(lineEndPixelPoints_inMF,centerPixelPoint_inMF,lineMFLabel_inMF,cam.K,R_cM_initial,planeNormalVector,x),0,[],[],options); 45 | 46 | 47 | % optimal R_cM for multiple lines refinement 48 | R_cM_final = computeOptimalMF(R_cM_initial, planeNormalVector, vec); 49 | clusteredLinesIdx_final = clusteredLinesIdx; 50 | end 51 | 52 | 53 | end 54 | 55 | -------------------------------------------------------------------------------- /MWMS_core/rotmtx2angle.m: -------------------------------------------------------------------------------- 1 | function [eulerAngle]= rotmtx2angle( R ) 2 | % Project: Patch-based Illumination invariant Visual Odometry (PIVO) 3 | % Function: rotmtx2angle 4 | % 5 | % Description: 6 | % This function return the euler angle along x,y and z direction 7 | % from rotation matrix to [phi;theta;psi] angle defined as ZYX sequence 8 | % 9 | % Example: 10 | % OUTPUT: 11 | % eulerAngle: angle vector composed of [phi;theta;psi] 12 | % phi = Rotation angle along x direction in radians 13 | % theta = Rotation angle along y direction in radians 14 | % psi = Rotation angle along z direction in radians 15 | % 16 | % INPUT: 17 | % R = rotation matrix (3x3) defined as [body frame] = R * [inertial frame] (R = R_bg) 18 | % 19 | % NOTE: 20 | % 21 | % Author: Pyojin Kim 22 | % Email: pjinkim1215@gmail.com 23 | % Website: 24 | % 25 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 26 | % log: 27 | % 2017-02-06: Complete 28 | %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 | % 30 | 31 | % change rotMtxBody / [Inertial frame] = rotMtxBody * [Body frame] 32 | rotMtxBody = R.'; 33 | 34 | phi=atan2( rotMtxBody(3,2) , rotMtxBody(3,3) ); 35 | theta=asin( -rotMtxBody(3,1) ); 36 | psi=atan2( rotMtxBody(2,1) , rotMtxBody(1,1) ); 37 | 38 | eulerAngle = [phi;theta;psi]; 39 | 40 | end 41 | 42 | 43 | -------------------------------------------------------------------------------- /MWMS_core/seekManhattanWorld.m: -------------------------------------------------------------------------------- 1 | function [R_cM, vpInfo, planeNormalVector, surfaceNormalVector, surfacePixelPoint, optimalProbe, thetaIntervals] = seekManhattanWorld(imageCurForLine, imageCur, depthCur, cam, optsMWMS) 2 | 3 | % assign current parameters 4 | lineDetector = optsMWMS.lineDetector; 5 | lineDescriptor = optsMWMS.lineDescriptor; 6 | dimageCurForLine = double(imageCurForLine); 7 | K = cam.K_pyramid(:,:,1); 8 | Kinv = inv(K); 9 | 10 | 11 | %% initialize and seek dominant plane 12 | 13 | % detect dominant plane and surface normals 14 | [pNV, ~] = estimatePlaneNormalRANSAC(imageCur, depthCur, cam, optsMWMS); 15 | [sNV, sPP] = estimateSurfaceNormalGradient_mex(imageCur, depthCur, cam, optsMWMS); 16 | surfaceNormalVector = sNV; 17 | surfacePixelPoint = sPP; 18 | 19 | 20 | % refine plane normal vector 21 | [pNV, isTracked] = trackSinglePlane(pNV, sNV, optsMWMS); 22 | planeNormalVector = pNV; 23 | if (isTracked == 0) 24 | disp(num2str(imgIdx)); 25 | disp('lost plane tracking!'); 26 | R_cM = []; 27 | vpInfo = []; 28 | planeNormalVector = []; 29 | return; 30 | end 31 | 32 | 33 | % check plane normal vector is on the hemisphere 34 | [~, ~, planeNormalVector] = parametrizeVerticalDD(planeNormalVector); 35 | 36 | 37 | %% seek Manhattan world directions (R_cM) with interval max stabbing 38 | 39 | % detect lines and related line normals 40 | [lines, ~, lineNormals] = extractLinesAndGreatcircle(imageCurForLine, cam, optsMWMS); 41 | lineNormals = lineNormals.'; 42 | 43 | 44 | % find useless (invalid) lines for Manhattan world 45 | invalidIndex = findInvalidManhattanLines(planeNormalVector, lineNormals, optsMWMS); 46 | lineNormals(:,invalidIndex) = []; 47 | lines(invalidIndex,:) = []; 48 | 49 | 50 | % estimate Manhattan world directions (R_cM) with max stabbing 51 | [R_cM, optimalProbe, thetaIntervals] = ManhattanMaxStabbingIntervals(planeNormalVector, lineNormals); 52 | [clusteredLinesIdx] = clusterManhattanMaxStabbingLines(R_cM, optimalProbe, thetaIntervals); 53 | [R_cM, clusteredLinesIdx] = refineOrthogonalParallelLines(R_cM, clusteredLinesIdx, planeNormalVector, lines, cam); 54 | linesVP = cell(1,3); 55 | for k = 1:3 56 | 57 | % current lines in VPs 58 | linesInVP = lines(clusteredLinesIdx{k},:); 59 | numLinesInVP = size(linesInVP,1); 60 | 61 | % line clustering for each VP 62 | line = struct('data',{},'length',{},'centerpt',{},'linenormal',{},'circlenormal',{}); 63 | numLinesCnt = 0; 64 | for m = 1:numLinesInVP 65 | [linedata, centerpt, len, ~, linenormal, circlenormal] = roveFeatureGeneration(dimageCurForLine, linesInVP(m,1:4), Kinv, lineDescriptor); 66 | if (~isempty(linedata)) 67 | numLinesCnt = numLinesCnt+1; 68 | line(numLinesCnt) = struct('data',linedata,'length',len,'centerpt',centerpt,'linenormal',linenormal,'circlenormal',circlenormal); 69 | end 70 | end 71 | 72 | % save line clustering results 73 | linesVP{k} = line; 74 | end 75 | 76 | 77 | % initialize vpInfo 78 | vpInfo = struct('n',{},'line',{},'index',{}); 79 | for k = 1:3 80 | 81 | % current VP info 82 | line = linesVP{k}; 83 | numLine = size(line,2); 84 | vpInfo(k) = struct('n',numLine,'line',line,'index',k); 85 | end 86 | 87 | 88 | end 89 | 90 | -------------------------------------------------------------------------------- /MWMS_core/seekPlaneManhattanWorld.m: -------------------------------------------------------------------------------- 1 | function [temp_R_cM] = seekPlaneManhattanWorld(planeNormalVector) 2 | 3 | % temporary vector 4 | tempVector = rand(3,1); 5 | tempVector = tempVector / norm(tempVector); 6 | 7 | 8 | % vanishing point 1 9 | tempVP1 = cross(planeNormalVector,tempVector); 10 | tempVP1 = tempVP1 / norm(tempVP1); 11 | 12 | 13 | % vanishing point 2 14 | tempVP2 = cross(planeNormalVector,tempVP1); 15 | tempVP2 = tempVP2 / norm(tempVP2); 16 | 17 | 18 | % temporary Manhattan frame for single plane 19 | temp_R_cM = [tempVP1, tempVP2, planeNormalVector]; 20 | 21 | 22 | end 23 | 24 | -------------------------------------------------------------------------------- /MWMS_core/setupParams_ICL_NUIM.m: -------------------------------------------------------------------------------- 1 | %% ICL NUIM dataset can be downloaded from: https://www.doc.ic.ac.uk/~ahanda/VaFRIC/iclnuim.html 2 | 3 | 4 | switch( expCase ) 5 | 6 | case 1 7 | datasetPath = '../ICL-NUIMdataset/of_kt0'; 8 | 9 | imInit = 1; % first image index, (1-based index) 10 | M = 100; % number of images 11 | 12 | 13 | end 14 | -------------------------------------------------------------------------------- /MWMS_core/trackSinglePlane.m: -------------------------------------------------------------------------------- 1 | function [pNV_update, isTracked] = trackSinglePlane(planeNormalVector, surfaceNormalVector, optsLAPO) 2 | 3 | % pre-defined variables 4 | minSampleRatio = optsLAPO.minSampleRatio; 5 | iterNum = optsLAPO.iterNum; 6 | convergeAngle = optsLAPO.convergeAngle; 7 | halfApexAngle = optsLAPO.halfApexAngle; 8 | c = optsLAPO.c; 9 | 10 | 11 | %% track single plane (Manhattan world frame) 12 | 13 | % initial model parameters 14 | pNV = planeNormalVector; 15 | pNV_update = pNV; 16 | numNormalVector = size(surfaceNormalVector, 2); 17 | minSampleNum = round(numNormalVector * minSampleRatio); 18 | 19 | 20 | % do mean shift iteration 21 | for iterCount = 1:iterNum 22 | 23 | % for next iteration 24 | pNV = pNV_update; 25 | 26 | 27 | % project to plane normal vector (Manhattan frame axis) 28 | R_cM = seekPlaneManhattanWorld(pNV); 29 | R_Mc = R_cM.'; 30 | n_j = R_Mc * surfaceNormalVector; 31 | 32 | lambda = sqrt(n_j(1,:).*n_j(1,:) + n_j(2,:).*n_j(2,:)); 33 | conicIdx = find(lambda < sin(halfApexAngle)); 34 | n_j_inlier = n_j(:,conicIdx); 35 | 36 | tan_alfa = lambda(conicIdx)./abs(n_j(3,conicIdx)); 37 | alfa = asin(lambda(conicIdx)); 38 | m_j = [alfa./tan_alfa.*n_j_inlier(1,:)./n_j_inlier(3,:); 39 | alfa./tan_alfa.*n_j_inlier(2,:)./n_j_inlier(3,:)]; 40 | 41 | select = ~isnan(m_j); 42 | select2 = select(1,:).*select(2,:); 43 | select3 = find(select2 == 1); 44 | m_j = m_j(:,select3); 45 | 46 | 47 | % number of surface normal vector 48 | if (size(m_j, 2) >= minSampleNum) 49 | 50 | % perform mean shift 51 | [s_j, ~] = MeanShift(m_j, c); 52 | 53 | % new plane normal vector 54 | alfa = norm(s_j); 55 | ma_p = tan(alfa)/alfa * s_j; 56 | pNV_update = R_Mc.' * [ma_p; 1]; 57 | pNV_update = pNV_update / norm(pNV_update); 58 | else 59 | 60 | % return invalid result 61 | pNV_update = []; 62 | isTracked = 0; 63 | return; 64 | end 65 | 66 | 67 | % check convergence 68 | if (acos(pNV.' * pNV_update) < convergeAngle) 69 | break; 70 | end 71 | end 72 | 73 | isTracked = 1; 74 | 75 | 76 | end 77 | 78 | 79 | -------------------------------------------------------------------------------- /MWMS_core/undistortPts_normal.m: -------------------------------------------------------------------------------- 1 | function [p_n_u] = undistortPts_normal(p_n_d, cam) 2 | 3 | % normalize uv_distorted 4 | p_n_d = p_n_d(1:2); 5 | p_n_u = p_n_d; 6 | 7 | 8 | while (1) 9 | 10 | error = distort_normal(p_n_u, cam) - p_n_d; 11 | p_n_u = p_n_u - error; 12 | 13 | if ( sum(abs(error)) < 1e-9 ) 14 | break; 15 | end 16 | end 17 | 18 | 19 | end 20 | 21 | 22 | function [p_n_d] = distort_normal(p_n_u, cam) 23 | 24 | x = p_n_u(1); 25 | y = p_n_u(2); 26 | k1 = cam.k1; 27 | k2 = cam.k2; 28 | k3 = 0; 29 | p1 = cam.p1; 30 | p2 = cam.p2; 31 | 32 | r2 = x*x + y*y; 33 | radial_d = 1 + k1*r2 + k2*r2*r2 + k3*r2*r2*r2; 34 | x_d = radial_d * x + 2*p1*x*y + p2*(r2 + 2*x*x); 35 | y_d = radial_d * y + p1*(r2 + 2*y*y) + 2*p2*x*y; 36 | 37 | p_n_d = [x_d; y_d]; 38 | 39 | end -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Manhattan World Max Stabbing (MWMS) 2 | This repository provides supplementary materials and a MATLAB implementation of IEEE Robotics and Automation Letters (RA-L) with ICRA 2022 paper: "Quasi-globally Optimal and Real-time Visual Compass in Manhattan Structured Environments" for the purpose of research and study only. 3 | Note that this repository only includes simplified proposed 3-DoF rotation estimation example codes to understand how MWMS works in Manhattan structured environments. 4 | 5 | ![MWMS](https://github.com/PyojinKim/MWMS/blob/main/overview.png) 6 | 7 | 8 | # 1. Goal 9 | Our goal is to estimate the drift-free 3-DoF rotational motion of the camera with respect to the indoor/outdoor Manhattan structured environments called a Manhattan frame (MF). 10 | MWMS first detects and tracks the vertical dominant direction (VDD) from an RGB-D camera or an IMU to compute 2-DoF of the MF rotation, and then searches for the optimal third DoF by the proposed Mine-and-Stab (MnS). 11 | Once we find an initial rotation estimate of the camera, we refine the absolute camera orientation by minimizing the average orthogonal distance from the endpoints of the lines to the MW axes. 12 | Our method is insensitive to noise and can achieve quasi-global optimality in terms of maximizing the number of inlier lines in real-time. 13 | 14 | ![MWMS](https://github.com/PyojinKim/MWMS/blob/main/result.png) 15 | 16 | It is noteworthy that without loss of generality, the dominant plane in any direction can be treated as a vertical dominant direction (VDD) in an indoor structured environment. 17 | 18 | 19 | # 2. Prerequisites 20 | We have tested this package on the MATLAB R2020a on Windows 10 64-bit. 21 | Some of the functions such as estimateSurfaceNormalGradient_mex.mexw64 are compiled as MEX files to speed up the surface normal computation. 22 | You can use estimateSurfaceNormalGradient.m instead if you cannot compile the MEX file in your OS. 23 | 24 | 25 | # 3. Usage 26 | * Download the ICL-NUIM dataset from https://www.doc.ic.ac.uk/~ahanda/VaFRIC/iclnuim.html, 'of kt0' is recommended. 27 | 28 | * Or, Use the ICL-NUIMdataset/of_kt0/ included in this package. 29 | 30 | * Define 'datasetPath' correctly in your directory at setupParams_ICL_NUIM.m file. 31 | 32 | * Run MWMS_core/main_script_ICL_NUIM.m, which will give you the 3-DoF camera orientation tracking results. Enjoy! :) 33 | 34 | 35 | # 4. License 36 | The package is licensed under the MIT License, see http://opensource.org/licenses/MIT. 37 | 38 | if you use MWMS in an academic work, please cite: 39 | 40 | @inproceedings{kim2022quasi, 41 | author = {Kim, Pyojin and Li, Haoang and Joo, Kyungdon}, 42 | title = {Quasi-globally Optimal and Real-time Visual Compass in Manhattan Structured Environments}, 43 | year = {2022}, 44 | booktitle = {IEEE Robotics and Automation Letters (RA-L)}, 45 | } 46 | 47 | -------------------------------------------------------------------------------- /overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/overview.png -------------------------------------------------------------------------------- /result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/PyojinKim/MWMS/a8b748e65d26156f011a3761b344a6312a6e4c70/result.png --------------------------------------------------------------------------------