diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1f9f33ee14cb4fa876bb02a205e26d3eb307f45d..71e44a17c842598098919b36d9f937434a8917b8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -25,10 +25,10 @@ before_script: # Provision efficiently the local LFS cache before checkout - git lfs fetch origin $CI_COMMIT_SHA # Checkout the expected branch - - git checkout $CI_COMMIT_REF_NAME + - git checkout -f -q $CI_COMMIT_SHA after_script: - - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_CDASH + - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_API_TOKEN stages: - precheck diff --git a/CI/check_twin_pipelines.py b/CI/check_twin_pipelines.py index d2a6113924677266de8cf30f8d35debc8ee2c3ea..7f05c1809cf02ae3d37b8bfd984a4bbf24756906 100644 --- a/CI/check_twin_pipelines.py +++ b/CI/check_twin_pipelines.py @@ -64,25 +64,29 @@ if __name__ == "__main__": sha1 = env['CI_COMMIT_SHA'] # are we in a merge_request pipeline ? if 'CI_MERGE_REQUEST_IID' in env.keys(): - if not CheckEnvParameters(['K8S_SECRET_TWIN_PIPELINE','CI_PROJECT_ID','CI_PIPELINE_ID']): + if not CheckEnvParameters(['K8S_SECRET_API_TOKEN']): + print("Make sure you have set a valid acces token for Gitlab API") + print("The K8S_SECRET_API_TOKEN environment variable should be set in 'Settings -> CI/CD -> Variables'") sys.exit(1) - mrInfo = GitlabRequest('merge_requests/'+env['CI_MERGE_REQUEST_IID'],token=env['K8S_SECRET_TWIN_PIPELINE']) + if not CheckEnvParameters(['CI_PROJECT_ID','CI_PIPELINE_ID']): + sys.exit(1) + mrInfo = GitlabRequest('merge_requests/'+env['CI_MERGE_REQUEST_IID'],token=env['K8S_SECRET_API_TOKEN']) wip_regex = re.compile("^[Ww][Ii][Pp]:") # is it a "WIP" merge request ? if wip_regex.search(mrInfo["title"]): # Yes: cancel the current pipeline print("Cancel current pipeline "+env['CI_PIPELINE_ID']) GitlabRequest('pipelines/'+env['CI_PIPELINE_ID']+'/cancel', data={}, \ - project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE']) + project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_API_TOKEN']) time.sleep(180) print("Error: this pipeline should have been canceled") sys.exit(1) else: # No: cancel any previous "normal" pipeline on the same SHA1 - jres = GitlabRequest('pipelines?sha='+sha1, project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE']) + jres = GitlabRequest('pipelines?sha='+sha1, project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_API_TOKEN']) for item in jres: if item["id"] < int(env['CI_PIPELINE_ID']) and item["status"] == "running": print("Cancel pipeline "+str(item["id"])) jres2 = GitlabRequest('pipelines/'+str(item["id"])+'/cancel', data={}, \ - project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_TWIN_PIPELINE']) + project=env['CI_PROJECT_ID'], token=env['K8S_SECRET_API_TOKEN']) diff --git a/CI/configure_option.cmake b/CI/configure_options.cmake similarity index 97% rename from CI/configure_option.cmake rename to CI/configure_options.cmake index d0b41c6adc0fe7546fecfbb698a5710cf849755d..861e24eeccea3d816cdb31da419ef6fda03459af 100644 --- a/CI/configure_option.cmake +++ b/CI/configure_options.cmake @@ -55,8 +55,7 @@ OTB_USE_SSE_FLAGS:BOOL=ON OTB_MPIEXEC_OPT:STRING=--allow-run-as-root") set (otb_wrap_option -"OTB_WRAP_JAVA:BOOL=ON -OTB_WRAP_PYTHON:BOOL=ON") +"OTB_WRAP_PYTHON:BOOL=ON") set (otb_data_option "OTB_DATA_USE_LARGEINPUT:BOOL=OFF diff --git a/CI/main_ci.cmake b/CI/main_ci.cmake index eba3829c5017383a253e86a2d197ec0f1b860f1a..052fae88822b9b6d4d20b435f55bfb1090990b33 100644 --- a/CI/main_ci.cmake +++ b/CI/main_ci.cmake @@ -84,7 +84,7 @@ message(STATUS "CI profile : ${ci_profile}") #The following file set the CONFIGURE_OPTIONS variable set (ENABLE_DOXYGEN OFF) set (CONFIGURE_OPTIONS "") -include ( "${CMAKE_CURRENT_LIST_DIR}/configure_option.cmake" ) +include ( "${CMAKE_CURRENT_LIST_DIR}/configure_options.cmake" ) # Sources are already checked out : do nothing for update set(CTEST_GIT_UPDATE_CUSTOM echo No update) diff --git a/CI/main_superbuild.cmake b/CI/main_superbuild.cmake index 7697f95fd7c69c72704af2e2da4dbb9b2c2f9fce..b969dc6a0346c2099ea241d4fbe16ae84523d5f5 100644 --- a/CI/main_superbuild.cmake +++ b/CI/main_superbuild.cmake @@ -17,14 +17,12 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# This script is a prototype for the future CI, it may evolve rapidly in a near future include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" ) -# This script is a prototype for the future CI, it may evolve rapidly in a near future set (ENV{LANG} "C") # Only ascii output get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) -get_filename_component(CI_PROJ_DIR ${OTB_SOURCE_DIR} DIRECTORY) -get_filename_component(CI_ROOT_DIR ${CI_PROJ_DIR} DIRECTORY) ########################################################################### ########################################################################### @@ -56,7 +54,7 @@ set( GIT "${CTEST_GIT_COMMAND}" ) execute_process( COMMAND ${GIT} "clone" "${REMOTE}" "--branch" "${BRANCH_NAME}" "--depth" "1" "superbuild-artifact" - WORKING_DIRECTORY ${CI_PROJ_DIR} + WORKING_DIRECTORY ${OTB_SOURCE_DIR} RESULT_VARIABLE clone_res OUTPUT_VARIABLE clone_out ERROR_VARIABLE clone_err @@ -83,17 +81,17 @@ endif() set (CMAKE_COMMAND "cmake") execute_process( COMMAND ${CMAKE_COMMAND} "-E" "tar" "xf" - "${CI_PROJ_DIR}/superbuild-artifact/SuperBuild_Install.tar" - WORKING_DIRECTORY ${CI_ROOT_DIR} + "${OTB_SOURCE_DIR}/superbuild-artifact/SuperBuild_Install.tar" + WORKING_DIRECTORY ${OTB_SOURCE_DIR} ) -set( XDK_PATH "${CI_ROOT_DIR}/xdk") +set( XDK_PATH "${OTB_SOURCE_DIR}/xdk") if ( DEBUG ) if ( EXISTS "${XDK_PATH}") - message("Tar file exists at ${XDK_PATH}") + message("Xdk folder exists at ${XDK_PATH}") else() - message("Something went wrong no tar file in ${XDK_PATH}") + message("Something went wrong no folder in ${XDK_PATH}") endif() endif() @@ -118,7 +116,7 @@ set ( CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/" ) set ( PROJECT_SOURCE_DIR "${OTB_SOURCE_DIR}" ) set (CONFIGURE_OPTIONS "") -include ( "${CMAKE_CURRENT_LIST_DIR}/configure_option.cmake" ) +include ( "${CMAKE_CURRENT_LIST_DIR}/configure_options.cmake" ) # SuperBuild case : one more configure option set ( CONFIGURE_OPTIONS "${CONFIGURE_OPTIONS}-DCMAKE_PREFIX_PATH=${XDK_PATH};") @@ -133,10 +131,11 @@ set( GEOTIFF_CSV "${XDK_PATH}/share/epsg_csv" ) set( PROJ_LIB "${XDK_PATH}/share" ) set( CTEST_ENVIRONMENT "PATH=${XDK_PATH}/lib:${XDK_PATH}/bin:$ENV{PATH} -GDAL_DATA= GDAL_DATA -GEOTIFF_CSV= GEOTIFF_CSV -PROJ_LIB= PROJ_LIB ") +# It seems that we do not need that +# GDAL_DATA= GDAL_DATA +# GEOTIFF_CSV= GEOTIFF_CSV +# PROJ_LIB= PROJ_LIB # Sources are already checked out : do nothing for update set(CTEST_GIT_UPDATE_CUSTOM echo No update) diff --git a/CI/prepare_superbuild.cmake b/CI/prepare_superbuild.cmake index 016c7825e0c4d4ac7c81d5ccccdb704898ca4ae3..169e612394f8e9c0bd616e4ab8f80a759a401d33 100644 --- a/CI/prepare_superbuild.cmake +++ b/CI/prepare_superbuild.cmake @@ -23,13 +23,6 @@ include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" ) set (ENV{LANG} "C") # Only ascii output get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) -get_filename_component(CI_PROJ_DIR ${OTB_SOURCE_DIR} DIRECTORY) -get_filename_component(CI_ROOT_DIR ${CI_PROJ_DIR} DIRECTORY) - -# In GitLab we have : -# OTB_SOURCE_DIR=/builds/{project_dir}/otb -# CI_PROJ_DIR=/builds/{project_dir} -# CI_ROOT_DIR=/builds set ( DEBUG "1" ) @@ -52,7 +45,7 @@ set_dash_build_name() # This is platform dependent, and the next step (build) also # depends on that, as some paths are hardcoded # This can be fixed with a packaging of OTB_DEPENDS -set (CTEST_INSTALL_DIRECTORY "${CI_ROOT_DIR}/xdk/") +set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/xdk/") # HACK # This is needed because when using return() function ctest is trying @@ -82,7 +75,7 @@ ctest_update( SOURCE "${OTB_SOURCE_DIR}" ) set(CTEST_BUILD_FLAGS "-j16") set ( SB_CONFIGURE_OPTIONS "") -include( "${CMAKE_CURRENT_LIST_DIR}/../SuperBuild/CI/configure_options.cmake" ) +include( "${CMAKE_CURRENT_LIST_DIR}/sb_configure_options.cmake" ) ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" SOURCE "${SUPERBUILD_SOURCE_DIR}" @@ -116,8 +109,7 @@ foreach(sb_file ${sb_file_list}) file(APPEND ${SB_TXT} "${sb_file}${CONTENTS}") endforeach(sb_file) file(READ "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" CMAKE_ORIG) -string(REPLACE "${CI_PROJ_DIR}" "" CMAKE_UNIFIED ${CMAKE_ORIG}) -file(APPEND ${SB_TXT} "CMakeCache.txt${CMAKE_UNIFIED}") +file(APPEND ${SB_TXT} "CMakeCache.txt${CMAKE_ORIG}") file ( MD5 "${SB_TXT}" SB_MD5) message ( "SB_MD5 = ${SB_MD5}" ) file (REMOVE ${SB_TXT}) @@ -180,7 +172,6 @@ ctest_submit() # TODO right now we rely on ctest_build to know whether there has been an error # in build, whereas SuperBuild does not necessarily return an error if something # goes wrong -set ( SB_ARTIFACT_GIT "${CI_PROJ_DIR}/superbuild-artifact" ) # REPOSITORY_GIT_URL and REMOTE whould be the same. Right now there are # different because one is https and one is ssh. Both should be ssh. @@ -190,8 +181,9 @@ set( REPOSITORY_GIT_URL "git@gitlab.orfeo-toolbox.org:gbonnefille/superbuild-art execute_process( COMMAND ${GIT} "clone" "${REPOSITORY_GIT_URL}" "--branch" "master" "--depth" "1" "superbuild-artifact" - WORKING_DIRECTORY "${CI_PROJ_DIR}" + WORKING_DIRECTORY "${OTB_SOURCE_DIR}" ) +set ( SB_ARTIFACT_GIT "${OTB_SOURCE_DIR}/superbuild-artifact" ) # setting up the repo # StrictHostKeyChecking so we don't have to add the host as a known key @@ -260,24 +252,15 @@ endif() set ( SB_TAR_NAME "SuperBuild_Install.tar" ) -# create the tar -# We need to create tar in its directory to avoid weird name in file -# "tar: Removing leading `../../' from member names" -# WARNING -# We are creating a tar containing xdk/.., so when extracting the archive in -# an other environment the output file will be xdk... Obvious isn't it? -# Well... Not for everyone... +# Creating the tar # May be for easier maintainability the tar name should be the same as the # file inside. execute_process( - COMMAND ${CMAKE_COMMAND} "-E" "tar" "cf" "${SB_TAR_NAME}" + COMMAND ${CMAKE_COMMAND} "-E" "tar" "cf" "${SB_ARTIFACT_GIT}/${SB_TAR_NAME}" -- "${CTEST_INSTALL_DIRECTORY}" - WORKING_DIRECTORY ${CI_ROOT_DIR} + WORKING_DIRECTORY ${OTB_SOURCE_DIR} ) -# We need to copy the tar file, as it is on a different partition in the gitlab -# context -file ( COPY "${CI_ROOT_DIR}/${SB_TAR_NAME}" DESTINATION "${SB_ARTIFACT_GIT}") # In a near futur it might be nice to clean up the mess we made... diff --git a/SuperBuild/CI/configure_options.cmake b/CI/sb_configure_options.cmake similarity index 100% rename from SuperBuild/CI/configure_options.cmake rename to CI/sb_configure_options.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ffe654ab3f8e0b5a2892cc95206595e3b23f1f8..c162d39a17e6c8203d186fdad434ae93a651dc74 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -165,9 +165,6 @@ endif() if(NOT OTB_INSTALL_PYTHON_DIR) set(OTB_INSTALL_PYTHON_DIR "${OTB_INSTALL_LIBRARY_DIR}/otb/python") endif() -if(NOT OTB_INSTALL_JAVA_DIR) - set(OTB_INSTALL_JAVA_DIR "${OTB_INSTALL_LIBRARY_DIR}/otb/java") -endif() if(NOT OTB_INSTALL_DATA_DIR) set(OTB_INSTALL_DATA_DIR "share/otb") endif() @@ -533,7 +530,6 @@ foreach(otb_option CMAKE_CXX_FLAGS ${option_list} OTB_WRAP_PYTHON - OTB_WRAP_JAVA OTB_DATA_ROOT OTB_USE_OPENMP OTB_USE_SSE_FLAGS diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png deleted file mode 100644 index 21b0d0b017d140ad17456c384e583e7cf308297a..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:34a5f9e6daad51f0e614fe07e4755422c8420fda029e7ad7302de31a92535982 -size 1340160 diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png deleted file mode 100644 index c2d86e289fa134625e4e008e8b5765201acd9478..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:870c0d619c315c9843cd9a5aedc44a34471d5fecbc9306a492efbb47c19530b9 -size 1340628 diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml deleted file mode 100644 index 761fbb2f643719fcae011bda40747b745e89f458..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadByStepsExampleOutput.png.aux.xml +++ /dev/null @@ -1,27 +0,0 @@ -<PAMDataset> - <SRS>PROJCS["WGS 84 / UTM zone 32N", - GEOGCS["WGS 84", - DATUM["WGS_1984", - SPHEROID["WGS 84",6378137,298.257223563, - AUTHORITY["EPSG","7030"]], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich",0], - UNIT["degree",0.0174532925199433], - AUTHORITY["EPSG","4326"]], - PROJECTION["Transverse_Mercator"], - PARAMETER["latitude_of_origin",0], - PARAMETER["central_meridian",9], - PARAMETER["scale_factor",0.9996], - PARAMETER["false_easting",500000], - PARAMETER["false_northing",0], - UNIT["metre",1, - AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","32632"]]</SRS> - <GeoTransform> 4.3913640000000002e+05, 5.9999999999999998e-01, 0.0000000000000000e+00, 5.2737065999999996e+06, 0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform> - <Metadata domain="IMAGE_STRUCTURE"> - <MDI key="INTERLEAVE">PIXEL</MDI> - </Metadata> - <Metadata> - <MDI key="AREA_OR_POINT">Area</MDI> - </Metadata> -</PAMDataset> diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png deleted file mode 100644 index 3bb75ceacc22bea2c6e5b72383c4b972febd74fa..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b68d89bfa22c07d91a304ff20c04aa4c242197a66cf24b4f7957cc863c1fd2f7 -size 15199 diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png deleted file mode 100644 index bb6e778dc5e12c0296d21e697596fa5ea9eb8c0d..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:079e3734a9c954f76d4b58596b0ffe9b0bbecb92958774bb7b6c433cb9b7a36d -size 15220 diff --git a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml deleted file mode 100644 index 21ce935f9d0862129f77af6bd48d60cba2eabf67..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/ExtractRoadExampleOutput.png.aux.xml +++ /dev/null @@ -1,24 +0,0 @@ -<PAMDataset> - <SRS>PROJCS["WGS 84 / UTM zone 32N", - GEOGCS["WGS 84", - DATUM["WGS_1984", - SPHEROID["WGS 84",6378137,298.257223563, - AUTHORITY["EPSG","7030"]], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich",0], - UNIT["degree",0.0174532925199433], - AUTHORITY["EPSG","4326"]], - PROJECTION["Transverse_Mercator"], - PARAMETER["latitude_of_origin",0], - PARAMETER["central_meridian",9], - PARAMETER["scale_factor",0.9996], - PARAMETER["false_easting",500000], - PARAMETER["false_northing",0], - UNIT["metre",1, - AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","32632"]]</SRS> - <GeoTransform> 4.3913640000000002e+05, 5.9999999999999998e-01, 0.0000000000000000e+00, 5.2737065999999996e+06, 0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform> - <Metadata> - <MDI key="AREA_OR_POINT">Area</MDI> - </Metadata> -</PAMDataset> diff --git a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png deleted file mode 100644 index 426eb10b3d9e1e644289252ae467dbd16d37a9ee..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingExampleOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4015aa8e7dcf8993def02252301d5f91eb73b970fecd277f799194551bc99ce0 -size 35299 diff --git a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png b/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png deleted file mode 100644 index eed540571c0e9fe756b6835a6a8782e25d6da40e..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/SeamCarvingOtherExampleOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:da8f331a2806a0c06405abcd7806ebdb668e13a74457151313f13a5ed7c57a32 -size 45234 diff --git a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml b/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml deleted file mode 100644 index 761fbb2f643719fcae011bda40747b745e89f458..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png.aux.xml +++ /dev/null @@ -1,27 +0,0 @@ -<PAMDataset> - <SRS>PROJCS["WGS 84 / UTM zone 32N", - GEOGCS["WGS 84", - DATUM["WGS_1984", - SPHEROID["WGS 84",6378137,298.257223563, - AUTHORITY["EPSG","7030"]], - AUTHORITY["EPSG","6326"]], - PRIMEM["Greenwich",0], - UNIT["degree",0.0174532925199433], - AUTHORITY["EPSG","4326"]], - PROJECTION["Transverse_Mercator"], - PARAMETER["latitude_of_origin",0], - PARAMETER["central_meridian",9], - PARAMETER["scale_factor",0.9996], - PARAMETER["false_easting",500000], - PARAMETER["false_northing",0], - UNIT["metre",1, - AUTHORITY["EPSG","9001"]], - AUTHORITY["EPSG","32632"]]</SRS> - <GeoTransform> 4.3913640000000002e+05, 5.9999999999999998e-01, 0.0000000000000000e+00, 5.2737065999999996e+06, 0.0000000000000000e+00, -5.9999999999999998e-01</GeoTransform> - <Metadata domain="IMAGE_STRUCTURE"> - <MDI key="INTERLEAVE">PIXEL</MDI> - </Metadata> - <Metadata> - <MDI key="AREA_OR_POINT">Area</MDI> - </Metadata> -</PAMDataset> diff --git a/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif b/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif index 0225c9d196f05cec5b484ecdcc45a096f2f3ce03..4361cfbb8aafbcc98f9c8ac99e40739f62f9aaf1 100644 --- a/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif +++ b/Data/Baseline/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndex.tif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42df562a687bdf13d65cacc6da48666b28da72efa79d7d668e607cf82eba4c11 -size 68855 +oid sha256:91667b86ce412524444bde780eee2c7f0baff0c05ecdc5b66a49aca39bc60dda +size 65842 diff --git a/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif b/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif deleted file mode 100644 index 0882267d3bfa84e1cf7089f0f6f7aeb50c632151..0000000000000000000000000000000000000000 --- a/Data/Baseline/Examples/Radiometry/NDVIRAndNIRVegetationIndex.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5727e5525e7597823337b25ca4a86b18f96606d68a8fd8b624c6d3a8796372b4 -size 63578 diff --git a/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.1.txt b/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.1.txt new file mode 100644 index 0000000000000000000000000000000000000000..20e589ba2a9407e406e8511baf12a44bc63c2a43 --- /dev/null +++ b/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.1.txt @@ -0,0 +1 @@ +io.mse: 0.003289417131 diff --git a/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.txt b/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.txt new file mode 100644 index 0000000000000000000000000000000000000000..aec10cefd80236745402a3c392cbc9590a666de6 --- /dev/null +++ b/Data/Baseline/OTB-Applications/Files/apTvClTrainVectorRegressionModel.txt @@ -0,0 +1 @@ +io.mse: 0.001359587419 diff --git a/Data/Baseline/OTB-Applications/Files/apTvTestApplicationOutputXML_All.xml b/Data/Baseline/OTB-Applications/Files/apTvTestApplicationOutputXML_All.xml index 1c1803f11a3e483a5a25f2ef137c8cfca743b4b0..df8aac655e0b4d274795174d53e1cb443eebac8e 100644 --- a/Data/Baseline/OTB-Applications/Files/apTvTestApplicationOutputXML_All.xml +++ b/Data/Baseline/OTB-Applications/Files/apTvTestApplicationOutputXML_All.xml @@ -5,7 +5,6 @@ <name>TestApplication</name> <descr>This application helps developers to test parameters types</descr> <doc> - <name>Test</name> <longdescr>The purpose of this application is to test parameters types.</longdescr> <authors>OTB-Team</authors> <limitations>None</limitations> diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf deleted file mode 100644 index 872a668071680090e04ee4154d26d68b18630e90..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9d6c2cacc6b2947ee21de06212d8456f1ad1dd817eb08f0cca74a461982e6fc -size 13050 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp deleted file mode 100644 index 0ae7cfbd6a7bb8fd9ede0766fb817fafdaef3a1b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:03dc018b3fda6afc76870dbb82d43cf954b483d451a44bc9609547a646cd5f69 -size 17244 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx deleted file mode 100644 index d7d3c02a05f660729a7ea7f614bb249b23c8dfdb..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9ddb05befb0e32de1d63c65853967329a2e279c8b47ead80a68e659a11f2d692 -size 1516 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf deleted file mode 100644 index 872a668071680090e04ee4154d26d68b18630e90..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f9d6c2cacc6b2947ee21de06212d8456f1ad1dd817eb08f0cca74a461982e6fc -size 13050 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp deleted file mode 100644 index d989282e41d5a15672cd37b1ec88f1cf38868494..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a761c4931a9325ce306da5c82f1be3c709ab0f888aeab4a412932872c3e8d79d -size 23692 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx deleted file mode 100644 index de9ebdc4ff20d670b2fcea817a3e9ffc5835fb36..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1f99f80a26a8df140d6cdb44d9ed2f1a32a2477927138eca8c5aec56b9ab66e9 -size 1516 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf deleted file mode 100644 index 0a7f2145c124cc5de965a72bb2b58d5209ddb9ca..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c11d7da214ea38b7c3c0083a92ee13467c13dca735075c01d8ddb73124bc4437 -size 1881 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp deleted file mode 100644 index f4493a2480785e067a59ea8563bff53f69594f84..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6b7569316bbb6954532949243743a6a02bf59b8e6f15e8768ab74cd49d18ff9 -size 2948 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx deleted file mode 100644 index 902c5a761865f19597c28d48f90b02dccbb32fcf..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd87422448e1242a1b30eb69ae88d4a36a96bfc2d00764a8ec3c35e02063a1c7 -size 292 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf deleted file mode 100644 index 0a7f2145c124cc5de965a72bb2b58d5209ddb9ca..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c11d7da214ea38b7c3c0083a92ee13467c13dca735075c01d8ddb73124bc4437 -size 1881 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp deleted file mode 100644 index e549ed0a01f161cd1bb1e48d37d67a1bb984818c..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1a477f4f647ebb0feff76da6fe3b92adcac25972372a94e5fa9b5db4b3be02d -size 4084 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx deleted file mode 100644 index 911a74cdb5a4c9e5647301206e325a1f1f2192cf..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:956ffd6cbb30ed2bc8c585e8c938477943d920f7309981a9864bf8f98ae3f992 -size 292 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf deleted file mode 100644 index 9254d4d3c5008b4dff3d1cd4653a1c8e3d6820c2..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970b377a49bf3308da27de62de02dc2000e666a4cc49a220023e212cc5082896 -size 713 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp deleted file mode 100644 index b8d4601a93154c3eb59f2a18c30d1e4c224a4af5..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6e9dbd487f0d15fc07a187b9e38649eaef4829ff8a64ffbbe0ebf59c0ced2848 -size 1172 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx deleted file mode 100644 index b7889485ca6f854bec6f1120cc7157177b7d3062..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eade214003f288170371c708073838963df379c9d55bfb68b77c488c94d10b7e -size 164 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf deleted file mode 100644 index 9254d4d3c5008b4dff3d1cd4653a1c8e3d6820c2..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:970b377a49bf3308da27de62de02dc2000e666a4cc49a220023e212cc5082896 -size 713 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp deleted file mode 100644 index b3b4cc6c6425eb929a2a6fe0b4c3611afb8e04ca..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3b83881bd76b1347059066ae1057d27cf0497cb92ac6cb16e07ec3d5ee29f5bd -size 1172 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx b/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx deleted file mode 100644 index 1b5b61f68e07a0b7e530125c3df3fe5484a228cd..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78741d544b7ebd7211d6f2655d31b801443f6a60a75ec18a1dfe94e80f51852c -size 164 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf deleted file mode 100644 index 1227f9a239e9e54e85d947eb4eee51ed810d3fe4..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e98e653523faa8868276d04332dc8a207b8e99bb2e86814c2ecf3e71f64184d -size 3097 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp deleted file mode 100644 index f4493a2480785e067a59ea8563bff53f69594f84..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f6b7569316bbb6954532949243743a6a02bf59b8e6f15e8768ab74cd49d18ff9 -size 2948 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx deleted file mode 100644 index 902c5a761865f19597c28d48f90b02dccbb32fcf..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bd87422448e1242a1b30eb69ae88d4a36a96bfc2d00764a8ec3c35e02063a1c7 -size 292 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf deleted file mode 100644 index 1227f9a239e9e54e85d947eb4eee51ed810d3fe4..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e98e653523faa8868276d04332dc8a207b8e99bb2e86814c2ecf3e71f64184d -size 3097 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp deleted file mode 100644 index e549ed0a01f161cd1bb1e48d37d67a1bb984818c..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c1a477f4f647ebb0feff76da6fe3b92adcac25972372a94e5fa9b5db4b3be02d -size 4084 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx deleted file mode 100644 index 911a74cdb5a4c9e5647301206e325a1f1f2192cf..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_gt.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:956ffd6cbb30ed2bc8c585e8c938477943d920f7309981a9864bf8f98ae3f992 -size 292 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf deleted file mode 100644 index 9ba00259ac7d3effd149c9bde7c15def5fb69d93..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6ac3987c4408a1c86528898189249cc26502b02b536a0e64a5106f0d230b3a8b -size 33 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj deleted file mode 100644 index da98376fa44ea626ab3c6ca1debe4660482e548b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.prj +++ /dev/null @@ -1 +0,0 @@ -PROJCS["WGS_1984_UTM_Zone_31N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["Meter",1]] \ No newline at end of file diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp deleted file mode 100644 index f970b67678a899f87859859d3bcb35a9b4c6c525..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:926401bfc2997f7c001f827859a1281ceb6f688660720f605f14f3e54207568e -size 100 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx b/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx deleted file mode 100644 index f970b67678a899f87859859d3bcb35a9b4c6c525..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB-Applications/Files/cdbTvVectorDataDSValidationOutpout_LI_wr.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:926401bfc2997f7c001f827859a1281ceb6f688660720f605f14f3e54207568e -size 100 diff --git a/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif b/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif new file mode 100644 index 0000000000000000000000000000000000000000..ce0ecbe5e6e8ea678c4ce3a6e7701d725de1658a --- /dev/null +++ b/Data/Baseline/OTB-Applications/Images/apTvClKMeansImageClassificationInputCentroids.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28427a2e951d1b56636568b966922a2d99f68c8e3f477aab99904fa5971fc42d +size 66540 diff --git a/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt b/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt deleted file mode 100644 index 4a22e8ff04fcc5b9c47c42cd28b5191c0977cbc6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt +++ /dev/null @@ -1,18048 +0,0 @@ ---- -Label : 1 -Position : [244.61, 1.64508] -Measurements : [1399.95, 310113, 0.266257, -0.476478] ---- -Label : 1 -Position : [241.128, 6.12] -Measurements : [1466.45, 487704, 0.232991, -1.2636] ---- -Label : 1 -Position : [145.371, 6.6365] -Measurements : [1208.23, 386771, 0.401874, -0.981297] ---- -Label : 1 -Position : [633.408, 8.68] -Measurements : [1465.12, 382959, 0.372033, -1.244] ---- -Label : 1 -Position : [250.856, 9.192] -Measurements : [993.262, 136479, 0.278658, -0.930991] ---- -Label : 1 -Position : [255.214, 10.1541] -Measurements : [1078.76, 119096, 0.313496, -0.642462] ---- -Label : 1 -Position : [390.951, 10.5048] -Measurements : [1572.18, 315723, -0.278482, -0.414006] ---- -Label : 1 -Position : [243.582, 10.5278] -Measurements : [1045.65, 500117, 1.10216, -0.141367] ---- -Label : 1 -Position : [732.736, 10.728] -Measurements : [1762.88, 822066, -0.103484, -1.57081] ---- -Label : 1 -Position : [137.973, 11.0771] -Measurements : [1256.87, 159712, 0.616424, 0.726392] ---- -Label : 1 -Position : [141.8, 11.24] -Measurements : [1091.2, 260850, 0.559676, -0.294604] ---- -Label : 1 -Position : [731.097, 11.4464] -Measurements : [1592.97, 893144, 0.148556, -1.60652] ---- -Label : 1 -Position : [633.484, 11.7069] -Measurements : [1417.94, 406889, 0.473387, -1.23179] ---- -Label : 1 -Position : [631.412, 12.0436] -Measurements : [1338.02, 330638, 0.756367, -0.51725] ---- -Label : 1 -Position : [388.688, 12.264] -Measurements : [1610.63, 268830, -0.15682, -0.3936] ---- -Label : 1 -Position : [255.69, 13.11] -Measurements : [1106.66, 105507, 0.132854, -0.843231] ---- -Label : 1 -Position : [632.879, 13.4648] -Measurements : [1188.96, 285530, 1.08638, 0.33468] ---- -Label : 1 -Position : [636.692, 13.4681] -Measurements : [1033.69, 268840, 1.51544, 1.83386] ---- -Label : 1 -Position : [736.543, 13.4748] -Measurements : [1164.8, 883154, 1.1134, -0.431529] ---- -Label : 1 -Position : [390.222, 13.9819] -Measurements : [1660.22, 229802, 0.0782276, -0.814122] ---- -Label : 1 -Position : [632.384, 14.312] -Measurements : [1012.4, 177711, 0.772086, 0.107333] ---- -Label : 1 -Position : [21.4766, 14.8077] -Measurements : [795.261, 357152, 1.18748, 0.459446] ---- -Label : 1 -Position : [392.641, 16.0582] -Measurements : [1638.22, 226522, 0.14735, -0.93468] ---- -Label : 1 -Position : [249.832, 17.896] -Measurements : [1307.62, 466036, 1.02525, 0.247706] ---- -Label : 1 -Position : [392.272, 17.896] -Measurements : [1615.52, 211561, 0.107659, -0.903024] ---- -Label : 1 -Position : [463.44, 17.896] -Measurements : [1208.43, 545199, 0.88799, -0.0947112] ---- -Label : 1 -Position : [24.0958, 18.4597] -Measurements : [1141.29, 306141, 1.15167, 1.3369] ---- -Label : 1 -Position : [245.902, 18.73] -Measurements : [1440.71, 720124, 0.354696, -1.28161] ---- -Label : 1 -Position : [22.504, 19.432] -Measurements : [1278.26, 415437, 0.803853, -0.10986] ---- -Label : 1 -Position : [514.821, 20.527] -Measurements : [1898.42, 453807, 0.1057, -1.21854] ---- -Label : 1 -Position : [463.682, 20.8592] -Measurements : [1761.42, 608797, 0.142866, -1.24805] ---- -Label : 1 -Position : [516.176, 20.968] -Measurements : [1914.58, 572565, -0.0181663, -1.35972] ---- -Label : 1 -Position : [153.662, 21.1989] -Measurements : [1506.15, 580964, -0.152713, -1.35291] ---- -Label : 1 -Position : [388.377, 21.2292] -Measurements : [1267.5, 207452, 0.360062, -0.744269] ---- -Label : 1 -Position : [250.729, 22.2607] -Measurements : [1073.09, 473769, 1.24396, 0.868018] ---- -Label : 1 -Position : [516.187, 22.3915] -Measurements : [2146.87, 480967, -0.342337, -1.23822] ---- -Label : 1 -Position : [462.482, 22.4791] -Measurements : [2129.57, 517522, -0.267177, -1.15811] ---- -Label : 1 -Position : [506.96, 22.504] -Measurements : [1908.17, 249995, 0.161354, -0.726865] ---- -Label : 1 -Position : [398.494, 22.8755] -Measurements : [1657.21, 181656, 0.00827773, -0.871096] ---- -Label : 1 -Position : [737.143, 23.0831] -Measurements : [783.959, 227622, 1.37876, 0.616613] ---- -Label : 1 -Position : [465.466, 23.1043] -Measurements : [2152.34, 547081, -0.158895, -1.23519] ---- -Label : 1 -Position : [509.553, 23.3008] -Measurements : [1965.67, 280987, 0.0783567, -1.00579] ---- -Label : 1 -Position : [732.224, 24.04] -Measurements : [1025.3, 238485, 0.672238, -0.889804] ---- -Label : 1 -Position : [781.738, 24.5256] -Measurements : [464.236, 23392.7, 1.45716, 0.94265] ---- -Label : 1 -Position : [501.188, 24.5512] -Measurements : [1608.93, 167753, 0.226801, -0.447532] ---- -Label : 1 -Position : [468.56, 24.552] -Measurements : [2138.24, 554036, -0.226939, -0.996085] ---- -Label : 1 -Position : [151.016, 25.064] -Measurements : [1748.73, 214056, 0.0103525, -0.888018] ---- -Label : 1 -Position : [399.44, 25.064] -Measurements : [1504.12, 316982, -0.312925, -0.924175] ---- -Label : 1 -Position : [26.6549, 26.0814] -Measurements : [1091.79, 305305, 0.576538, -0.74217] ---- -Label : 1 -Position : [28.136, 26.6] -Measurements : [1120.4, 265311, 0.662549, -0.538509] ---- -Label : 1 -Position : [511.833, 26.6849] -Measurements : [1906.72, 445497, -0.27535, -1.01516] ---- -Label : 1 -Position : [499.28, 27.624] -Measurements : [1507.84, 123543, -0.351548, -0.862913] ---- -Label : 1 -Position : [398.49, 27.822] -Measurements : [1379.79, 415076, -0.0775959, -1.37466] ---- -Label : 1 -Position : [736.674, 28.041] -Measurements : [684.173, 210658, 1.89014, 2.60705] ---- -Label : 1 -Position : [785.231, 28.2292] -Measurements : [779.812, 223683, 1.6827, 2.81675] ---- -Label : 1 -Position : [785.984, 29.16] -Measurements : [790.413, 215790, 1.75073, 3.0408] ---- -Label : 1 -Position : [503.064, 29.2999] -Measurements : [1488.67, 276999, -0.132504, -0.813677] ---- -Label : 1 -Position : [467.211, 29.4727] -Measurements : [2357.58, 460440, -0.774753, -0.199534] ---- -Label : 1 -Position : [154.914, 29.6333] -Measurements : [1296.44, 486853, 0.554433, -0.211259] ---- -Label : 1 -Position : [33.1288, 31.4463] -Measurements : [709.888, 109907, 0.782466, 0.0455805] ---- -Label : 1 -Position : [474.192, 32.744] -Measurements : [2346.91, 320418, -1.04922, 0.608591] ---- -Label : 1 -Position : [474.373, 35.4507] -Measurements : [2561.21, 202660, -0.843659, 0.465157] ---- -Label : 1 -Position : [469.383, 36.2274] -Measurements : [2513.07, 331345, -1.47677, 2.25475] ---- -Label : 1 -Position : [477.776, 38.888] -Measurements : [2501.1, 299662, -0.407297, -0.786396] ---- -Label : 1 -Position : [476.508, 40.2221] -Measurements : [2547.82, 277359, -0.337944, -0.875621] ---- -Label : 1 -Position : [481.204, 41.0933] -Measurements : [2436.21, 246087, -0.848396, -0.195383] ---- -Label : 1 -Position : [146.811, 42.9006] -Measurements : [651.591, 127745, 1.1435, 0.595122] ---- -Label : 1 -Position : [480.125, 44.6418] -Measurements : [2439.53, 235119, -0.839143, -0.361184] ---- -Label : 1 -Position : [150.438, 44.8023] -Measurements : [786.291, 238061, 0.976615, 0.295175] ---- -Label : 1 -Position : [639.04, 45.032] -Measurements : [1011.28, 306948, 0.537234, -0.97489] ---- -Label : 1 -Position : [401.488, 45.544] -Measurements : [1072.85, 211038, 0.179089, -1.22378] ---- -Label : 1 -Position : [396.788, 46.1598] -Measurements : [938.122, 220132, 0.588968, -0.970861] ---- -Label : 1 -Position : [482.896, 46.568] -Measurements : [2462.39, 198571, -0.789782, -0.439342] ---- -Label : 1 -Position : [478.701, 46.9408] -Measurements : [2528.31, 225390, -0.654415, -0.417266] ---- -Label : 1 -Position : [30.696, 47.08] -Measurements : [1279.16, 397520, 0.40258, -1.13234] ---- -Label : 1 -Position : [148.456, 47.08] -Measurements : [1060.5, 232907, 0.789113, 0.21222] ---- -Label : 1 -Position : [636.712, 47.2538] -Measurements : [993.879, 330254, 0.537125, -1.12924] ---- -Label : 1 -Position : [399.698, 47.6833] -Measurements : [1003.16, 238939, 0.366465, -1.29767] ---- -Label : 1 -Position : [32.0718, 48.8004] -Measurements : [1227.68, 366444, 0.396699, -1.1008] ---- -Label : 1 -Position : [483.182, 48.8229] -Measurements : [2470.79, 165384, -0.700125, -0.47963] ---- -Label : 1 -Position : [146.13, 48.9529] -Measurements : [1140.38, 163198, 0.522848, -0.842353] ---- -Label : 1 -Position : [280.813, 49.2236] -Measurements : [942.677, 241572, 0.526166, -0.794988] ---- -Label : 1 -Position : [639.248, 49.3982] -Measurements : [833.569, 350365, 1.02295, -0.452583] ---- -Label : 1 -Position : [32.9101, 51.4564] -Measurements : [914.108, 389934, 1.14525, 0.0384974] ---- -Label : 1 -Position : [481.821, 51.4818] -Measurements : [2514.74, 201478, -0.496563, -0.814439] ---- -Label : 1 -Position : [281.576, 53.224] -Measurements : [982.418, 185655, 0.818729, -0.322751] ---- -Label : 1 -Position : [150.504, 53.736] -Measurements : [1613.92, 300809, -0.104234, -0.926321] ---- -Label : 1 -Position : [485.968, 53.736] -Measurements : [2291.15, 219738, -0.0303204, -0.791027] ---- -Label : 1 -Position : [408.469, 54.7806] -Measurements : [1503.82, 414269, 0.102071, -0.983995] ---- -Label : 1 -Position : [485.552, 55.1294] -Measurements : [2260.99, 198482, -0.173856, -0.770322] ---- -Label : 1 -Position : [512.892, 55.3723] -Measurements : [1247.32, 321649, -0.307241, -1.43016] ---- -Label : 1 -Position : [406.096, 55.784] -Measurements : [1487.85, 324277, 0.0955268, -0.564059] ---- -Label : 1 -Position : [402.194, 56.0926] -Measurements : [1173.87, 227091, -0.0469741, -1.26695] ---- -Label : 1 -Position : [487.202, 56.3229] -Measurements : [2209.63, 203604, -0.0750906, -0.907866] ---- -Label : 1 -Position : [146.981, 56.3887] -Measurements : [1464.68, 161968, -0.540099, -0.799225] ---- -Label : 1 -Position : [147.923, 56.7645] -Measurements : [1574.03, 169744, -0.52637, -0.269704] ---- -Label : 1 -Position : [646.398, 57.769] -Measurements : [1019.1, 248626, 0.220451, -0.359875] ---- -Label : 1 -Position : [514.128, 57.832] -Measurements : [1207.79, 357121, -0.139803, -1.63507] ---- -Label : 1 -Position : [286.376, 57.8966] -Measurements : [762.626, 160955, 1.02396, -0.0826948] ---- -Label : 1 -Position : [149.827, 57.9983] -Measurements : [1734.81, 223766, -0.145279, -0.214388] ---- -Label : 1 -Position : [512.777, 58.3428] -Measurements : [1407.02, 230704, -0.777545, -0.589553] ---- -Label : 1 -Position : [410.743, 59.3163] -Measurements : [1466.21, 370036, 0.00546922, -1.14312] ---- -Label : 1 -Position : [489.552, 59.88] -Measurements : [2206.16, 199262, 0.139083, -0.632729] ---- -Label : 1 -Position : [150.504, 60.392] -Measurements : [1564.09, 285351, 0.00264356, -0.629832] ---- -Label : 1 -Position : [641.343, 61.6995] -Measurements : [1123.44, 401059, 0.127394, -1.27937] ---- -Label : 1 -Position : [524.025, 62.343] -Measurements : [678.39, 220280, 1.76188, 2.84388] ---- -Label : 1 -Position : [642.624, 62.44] -Measurements : [1281.61, 341332, -0.199448, -1.04494] ---- -Label : 1 -Position : [526.376, 63.0292] -Measurements : [755.474, 235552, 1.2852, 1.36501] ---- -Label : 1 -Position : [409.68, 63.464] -Measurements : [1344.05, 363137, 0.32516, -1.07766] ---- -Label : 1 -Position : [489.304, 64.2746] -Measurements : [2550.7, 245615, -0.353762, -0.684571] ---- -Label : 1 -Position : [153.747, 64.3541] -Measurements : [1127.62, 387477, 0.528247, -0.89447] ---- -Label : 1 -Position : [528.797, 65.0709] -Measurements : [923.884, 206711, 0.785987, 0.772355] ---- -Label : 1 -Position : [411.712, 65.1208] -Measurements : [1195.28, 444668, 0.501999, -1.10361] ---- -Label : 1 -Position : [736.373, 65.2588] -Measurements : [925.973, 569079, 0.923134, -0.82582] ---- -Label : 1 -Position : [526.416, 66.024] -Measurements : [937.748, 200420, 0.787841, 0.832355] ---- -Label : 1 -Position : [634.566, 66.0589] -Measurements : [1107.19, 437732, 0.288566, -0.990485] ---- -Label : 1 -Position : [408.468, 66.9523] -Measurements : [1271.67, 345809, 0.447664, -0.87485] ---- -Label : 1 -Position : [493.648, 67.048] -Measurements : [2565.87, 318345, -0.862812, 0.120293] ---- -Label : 1 -Position : [489.309, 67.1856] -Measurements : [2778.19, 156517, -0.590919, -0.103957] ---- -Label : 1 -Position : [151.016, 67.56] -Measurements : [951.112, 257371, 0.707459, -0.969823] ---- -Label : 1 -Position : [494.365, 68.7431] -Measurements : [2469.63, 425073, -0.873973, -0.285714] ---- -Label : 1 -Position : [531.024, 69.096] -Measurements : [1060.1, 152696, 0.894956, 1.33329] ---- -Label : 1 -Position : [532.841, 69.2365] -Measurements : [1031.55, 152734, 0.893183, 1.52887] ---- -Label : 1 -Position : [731.712, 69.608] -Measurements : [1750.46, 494126, -0.476515, -0.796277] ---- -Label : 1 -Position : [639.552, 70.12] -Measurements : [1435.04, 407739, -0.113456, -1.35784] ---- -Label : 1 -Position : [151.236, 71.2708] -Measurements : [651.874, 196335, 1.62119, 1.23144] ---- -Label : 1 -Position : [407.12, 71.656] -Measurements : [1190.02, 321318, 0.830741, -0.0541515] ---- -Label : 1 -Position : [501.307, 71.8869] -Measurements : [1765.1, 370415, 0.368729, -0.5675] ---- -Label : 1 -Position : [724.253, 72.0387] -Measurements : [1547.51, 427895, 0.253832, -0.914729] ---- -Label : 1 -Position : [38.4345, 72.907] -Measurements : [1163, 314130, 0.310145, -0.713743] ---- -Label : 1 -Position : [299.15, 73.1046] -Measurements : [973.079, 407487, 0.788035, -0.760626] ---- -Label : 1 -Position : [497.744, 73.192] -Measurements : [2045.32, 569107, -0.0844212, -1.21743] ---- -Label : 1 -Position : [730.479, 73.5615] -Measurements : [1501, 609631, 0.0505779, -1.44031] ---- -Label : 1 -Position : [530.782, 73.6834] -Measurements : [992.847, 70865.1, -0.139589, -0.777455] ---- -Label : 1 -Position : [534.608, 74.728] -Measurements : [1076.39, 54277.8, -0.0403846, -0.619779] ---- -Label : 1 -Position : [722.496, 74.728] -Measurements : [1309.99, 278624, 0.633246, -0.191714] ---- -Label : 1 -Position : [637.029, 74.9055] -Measurements : [1013.84, 510831, 0.825043, -0.926402] ---- -Label : 1 -Position : [534.278, 75.1308] -Measurements : [1098.33, 55019.9, 0.384065, 0.538966] ---- -Label : 1 -Position : [35.304, 75.24] -Measurements : [1287.51, 361736, 0.298422, -1.14136] ---- -Label : 1 -Position : [297.825, 75.3346] -Measurements : [986.428, 433855, 0.69096, -0.968558] ---- -Label : 1 -Position : [411.711, 75.5489] -Measurements : [1704.36, 500308, -0.110353, -1.16457] ---- -Label : 1 -Position : [300.112, 75.752] -Measurements : [1106.38, 364343, 0.585591, -0.972097] ---- -Label : 1 -Position : [40.0663, 75.8806] -Measurements : [1062.4, 201917, 0.444531, -0.966213] ---- -Label : 1 -Position : [725.415, 76.5828] -Measurements : [1286.91, 369058, 0.39385, -0.929769] ---- -Label : 1 -Position : [415.312, 76.776] -Measurements : [1848.33, 716938, -0.219702, -1.43866] ---- -Label : 1 -Position : [537.68, 77.8] -Measurements : [1196.33, 128090, 0.647327, 0.501685] ---- -Label : 1 -Position : [534.852, 78.2465] -Measurements : [1133.03, 99343, 0.339302, 0.434633] ---- -Label : 0 -Position : [92.1127, 78.4374] -Measurements : [1109.44, 7506.35, -1.04267, 1.00777] ---- -Label : 1 -Position : [411.345, 78.5972] -Measurements : [1717.57, 450220, 0.0725332, -1.28834] ---- -Label : 1 -Position : [533.148, 78.6543] -Measurements : [1080.99, 84062.9, -0.0894858, -0.408748] ---- -Label : 0 -Position : [95.3936, 78.7711] -Measurements : [1108.25, 13396.4, 0.482908, 2.23481] ---- -Label : 0 -Position : [109.322, 79.1238] -Measurements : [1071.97, 37925.4, 0.685131, 0.956957] ---- -Label : 0 -Position : [87.738, 80.0104] -Measurements : [1150.49, 9287.65, -2.39312, 5.91688] ---- -Label : 1 -Position : [499.792, 80.36] -Measurements : [2213.86, 503045, -0.259567, -1.03712] ---- -Label : 1 -Position : [418.984, 80.6891] -Measurements : [1368.77, 549868, 0.845426, -0.36176] ---- -Label : 1 -Position : [723.008, 80.872] -Measurements : [1358.47, 349551, 0.640774, -0.592525] ---- -Label : 1 -Position : [411.116, 81.0041] -Measurements : [1510.43, 419937, 0.407037, -0.773012] ---- -Label : 1 -Position : [720.457, 81.2607] -Measurements : [1383.69, 273300, 0.731504, -0.0320697] ---- -Label : 1 -Position : [230.957, 81.8943] -Measurements : [1454.9, 546540, 0.382177, -1.32888] ---- -Label : 1 -Position : [541.264, 81.896] -Measurements : [1450.31, 245132, 0.273894, -0.251411] ---- -Label : 1 -Position : [231.437, 82.1053] -Measurements : [1430.38, 486833, 0.534145, -1.08849] ---- -Label : 1 -Position : [310.374, 82.6047] -Measurements : [971.624, 327632, 0.823834, -0.376812] ---- -Label : 1 -Position : [536.303, 82.9859] -Measurements : [1378.75, 215446, 0.727624, 0.327514] ---- -Label : 1 -Position : [313.09, 83.2544] -Measurements : [1152.17, 286801, 0.79644, 0.0569467] ---- -Label : 1 -Position : [505.03, 83.2899] -Measurements : [1781.76, 209495, 0.398465, -0.453074] ---- -Label : 1 -Position : [720.173, 83.6023] -Measurements : [1486.33, 258472, 0.324757, -0.256891] ---- -Label : 1 -Position : [502.527, 84.2095] -Measurements : [1706.72, 379939, 0.435575, -0.540791] ---- -Label : 1 -Position : [545.971, 84.3644] -Measurements : [1502.72, 189370, 0.597719, 0.193823] ---- -Label : 1 -Position : [500.389, 84.472] -Measurements : [1762.43, 576006, 0.400357, -0.902264] ---- -Label : 1 -Position : [247.76, 84.5176] -Measurements : [1046.37, 432718, 0.45893, -1.19884] ---- -Label : 1 -Position : [508.496, 84.968] -Measurements : [1742.37, 188795, -0.0165191, -0.493912] ---- -Label : 1 -Position : [234.984, 85.992] -Measurements : [1204.86, 228773, 0.848148, 0.435681] ---- -Label : 1 -Position : [415.824, 85.992] -Measurements : [1133.36, 175910, 0.251633, -1.14509] ---- -Label : 1 -Position : [643.648, 85.992] -Measurements : [1312.1, 349484, 0.214303, -0.569861] ---- -Label : 1 -Position : [793.834, 86.3359] -Measurements : [1049.86, 177361, 0.109025, -1.09353] ---- -Label : 1 -Position : [641.83, 86.7441] -Measurements : [1244.36, 350427, 0.403563, -0.466927] ---- -Label : 1 -Position : [545.977, 86.789] -Measurements : [1617.33, 249607, 0.533211, -0.250782] ---- -Label : 1 -Position : [227.816, 87.016] -Measurements : [1616.24, 348367, -0.0880458, -1.27861] ---- -Label : 1 -Position : [311.376, 87.016] -Measurements : [1637.86, 483075, 0.141674, -0.8608] ---- -Label : 1 -Position : [793.152, 87.016] -Measurements : [994.897, 211129, 0.201361, -1.31052] ---- -Label : 1 -Position : [234.962, 87.1838] -Measurements : [1255.91, 256777, 0.748086, 0.224963] ---- -Label : 1 -Position : [251.155, 87.3764] -Measurements : [1410.69, 266279, -0.0403681, -0.772312] ---- -Label : 1 -Position : [647.236, 87.4288] -Measurements : [1342.99, 275609, 0.507612, -0.116743] ---- -Label : 1 -Position : [512.434, 88.3334] -Measurements : [1930.01, 222004, -0.329513, -0.876027] ---- -Label : 1 -Position : [220.961, 88.5146] -Measurements : [1387.2, 218699, -0.310078, -1.0715] ---- -Label : 1 -Position : [250.344, 88.552] -Measurements : [1371.55, 260591, -0.0649667, -0.638483] ---- -Label : 1 -Position : [508.06, 88.9408] -Measurements : [1737.51, 353590, -0.341023, -0.77548] ---- -Label : 1 -Position : [513.104, 89.064] -Measurements : [1953.25, 243690, -0.482045, -0.747181] ---- -Label : 1 -Position : [514.67, 89.8881] -Measurements : [1926.18, 238072, -0.35238, -0.936509] ---- -Label : 1 -Position : [544.848, 90.088] -Measurements : [1625.45, 328196, 0.343572, -0.436161] ---- -Label : 1 -Position : [722.496, 90.088] -Measurements : [1379.22, 213429, -0.901277, -0.752079] ---- -Label : 1 -Position : [645.793, 90.2686] -Measurements : [1288.29, 169307, 0.171626, 0.355703] ---- -Label : 1 -Position : [208.699, 90.2753] -Measurements : [974.846, 163077, -0.0711373, -1.42608] ---- -Label : 1 -Position : [416.173, 90.3642] -Measurements : [813.742, 220021, 1.01131, -0.443239] ---- -Label : 1 -Position : [789.228, 90.7935] -Measurements : [717.319, 255956, 1.15583, -0.290952] ---- -Label : 1 -Position : [541.634, 90.8781] -Measurements : [1618.67, 263329, 0.568741, 0.274917] ---- -Label : 1 -Position : [229.384, 91.0036] -Measurements : [1566.22, 295184, 0.0635331, -1.00503] ---- -Label : 1 -Position : [314.538, 91.1327] -Measurements : [1477.03, 507536, 0.697796, -0.781491] ---- -Label : 1 -Position : [510.1, 91.1933] -Measurements : [1862.81, 416812, -0.734054, -0.438029] ---- -Label : 1 -Position : [219.112, 91.624] -Measurements : [1330.96, 264912, -0.198132, -1.41048] ---- -Label : 1 -Position : [646.208, 91.624] -Measurements : [1225.45, 143585, -0.386217, -0.99674] ---- -Label : 1 -Position : [312.4, 92.136] -Measurements : [1530.97, 560692, 0.338826, -1.08327] ---- -Label : 1 -Position : [516.458, 92.2009] -Measurements : [1770.19, 312177, 0.040679, -1.30023] ---- -Label : 1 -Position : [726.724, 92.3023] -Measurements : [1237.89, 272684, -0.37824, -1.59925] ---- -Label : 1 -Position : [719.156, 92.5538] -Measurements : [1067.91, 339129, 0.110837, -1.81924] ---- -Label : 1 -Position : [209.896, 93.16] -Measurements : [979.264, 145084, -0.0279663, -1.22398] ---- -Label : 1 -Position : [645.654, 93.3011] -Measurements : [1147.74, 144378, -0.25268, -1.09159] ---- -Label : 1 -Position : [255.976, 93.672] -Measurements : [1574.34, 174765, -0.433033, -0.118507] ---- -Label : 1 -Position : [516.176, 94.184] -Measurements : [1704.18, 339435, 0.0761093, -1.13292] ---- -Label : 1 -Position : [215.59, 94.2739] -Measurements : [1138.59, 256619, 0.291274, -1.27282] ---- -Label : 1 -Position : [310.847, 95.7036] -Measurements : [1171.76, 652815, 0.7876, -0.659716] ---- -Label : 1 -Position : [208.894, 95.9693] -Measurements : [900.298, 165919, 0.0614197, -1.36078] ---- -Label : 1 -Position : [317.024, 97.5957] -Measurements : [1090.27, 343145, 0.700512, -0.545723] ---- -Label : 1 -Position : [259.572, 97.6378] -Measurements : [1136.85, 270942, 0.24863, -0.766387] ---- -Label : 1 -Position : [522.782, 98.1872] -Measurements : [1734.26, 206765, -0.3432, -0.991281] ---- -Label : 1 -Position : [252.666, 98.5213] -Measurements : [1171.93, 215554, 0.310786, -1.03181] ---- -Label : 1 -Position : [523.087, 98.5224] -Measurements : [1729.93, 210981, -0.348607, -1.00413] ---- -Label : 1 -Position : [715.883, 98.8042] -Measurements : [888.529, 233329, 0.476561, -1.30497] ---- -Label : 1 -Position : [520.272, 99.304] -Measurements : [1806.94, 192973, -0.680368, -0.0148814] ---- -Label : 1 -Position : [527.616, 99.4919] -Measurements : [1637.93, 233703, -0.216636, -0.989002] ---- -Label : 1 -Position : [158.965, 100.627] -Measurements : [1057.99, 576974, 0.506057, -1.36932] ---- -Label : 1 -Position : [319.424, 101.19] -Measurements : [1289, 357238, 0.00683936, -1.27157] ---- -Label : 1 -Position : [518.634, 101.39] -Measurements : [1690.59, 367844, -0.604401, -0.491386] ---- -Label : 1 -Position : [257.705, 101.623] -Measurements : [1051.64, 198055, 0.185547, -1.15064] ---- -Label : 1 -Position : [714.293, 101.693] -Measurements : [1210.87, 228499, -0.287881, -0.99352] ---- -Label : 1 -Position : [167.379, 101.709] -Measurements : [955.185, 446514, 1.0842, -0.413929] ---- -Label : 1 -Position : [716.352, 101.864] -Measurements : [1162.44, 277330, -0.218701, -1.30119] ---- -Label : 1 -Position : [162.792, 102.376] -Measurements : [1307.06, 507986, 0.191174, -1.53486] ---- -Label : 1 -Position : [318.032, 102.376] -Measurements : [1422.34, 334825, -0.446, -0.904958] ---- -Label : 1 -Position : [523.344, 102.888] -Measurements : [1894.2, 194640, -0.749489, -0.154715] ---- -Label : 1 -Position : [261.826, 103.644] -Measurements : [1160.42, 144003, -0.371143, -0.82547] ---- -Label : 1 -Position : [262.12, 103.912] -Measurements : [1183.55, 151938, -0.242121, -0.650662] ---- -Label : 1 -Position : [557.136, 103.912] -Measurements : [1492.43, 305852, -0.200073, -0.403389] ---- -Label : 0 -Position : [118.265, 104.411] -Measurements : [1242.47, 30363.2, 3.0769, 10.8863] ---- -Label : 1 -Position : [667.802, 105.478] -Measurements : [988.599, 207015, 0.450568, -0.583402] ---- -Label : 1 -Position : [528.325, 105.5] -Measurements : [1643.96, 309566, -0.205076, -1.30918] ---- -Label : 1 -Position : [712.708, 105.576] -Measurements : [1529.85, 199512, -0.446041, -0.403548] ---- -Label : 1 -Position : [552.95, 105.776] -Measurements : [1457.92, 306223, -0.28068, -0.184712] ---- -Label : 1 -Position : [318.374, 106.244] -Measurements : [1380.64, 286111, -0.334023, -0.932676] ---- -Label : 1 -Position : [319.056, 107.496] -Measurements : [1257.26, 294835, -0.104061, -1.29524] ---- -Label : 1 -Position : [263.398, 107.806] -Measurements : [1323.32, 141925, 0.548271, 1.09352] ---- -Label : 1 -Position : [267.24, 108.008] -Measurements : [1297.52, 289741, 0.367777, -0.55024] ---- -Label : 1 -Position : [669.76, 108.008] -Measurements : [1096.11, 207340, 0.330401, -0.997764] ---- -Label : 1 -Position : [266.811, 108.092] -Measurements : [1317.16, 247175, 0.400011, -0.191347] ---- -Label : 1 -Position : [712.768, 108.52] -Measurements : [1649.63, 164183, -0.465255, -0.542033] ---- -Label : 1 -Position : [560.955, 108.68] -Measurements : [1783.91, 228472, -0.233207, -0.411194] ---- -Label : 1 -Position : [715.55, 108.875] -Measurements : [1505.38, 281221, -0.452804, -1.02453] ---- -Label : 1 -Position : [320.201, 109.112] -Measurements : [1094.93, 289132, 0.307046, -1.16672] ---- -Label : 1 -Position : [524.368, 109.544] -Measurements : [1682.74, 307050, -0.41468, -0.57049] ---- -Label : 1 -Position : [565.896, 109.876] -Measurements : [1602.1, 208530, 0.235627, -0.639146] ---- -Label : 1 -Position : [703.909, 110.454] -Measurements : [1554.45, 180969, -0.292626, -0.692169] ---- -Label : 1 -Position : [666.324, 110.829] -Measurements : [953.362, 231893, 0.559366, -0.695741] ---- -Label : 1 -Position : [710.066, 110.97] -Measurements : [1638.12, 226903, -0.642881, -0.373772] ---- -Label : 1 -Position : [561.232, 111.592] -Measurements : [1847.63, 154407, 0.0181275, -0.555982] ---- -Label : 1 -Position : [706.624, 111.592] -Measurements : [1599.78, 168121, -0.300517, -0.586663] ---- -Label : 0 -Position : [111.176, 111.596] -Measurements : [1132.23, 45687.3, -0.693308, 1.8718] ---- -Label : 1 -Position : [526.561, 112.25] -Measurements : [1579.72, 235304, -0.244512, -0.651862] ---- -Label : 1 -Position : [699.749, 112.672] -Measurements : [1251.2, 255559, -0.0256705, -0.969806] ---- -Label : 1 -Position : [563.428, 112.678] -Measurements : [1795.67, 165651, 0.152948, -0.511471] ---- -Label : 1 -Position : [167.335, 113.116] -Measurements : [769.335, 232433, 1.19259, 0.182167] ---- -Label : 1 -Position : [325.712, 113.128] -Measurements : [979.65, 157331, 0.858817, 0.281219] ---- -Label : 1 -Position : [523.294, 113.255] -Measurements : [1442.84, 351951, -0.308333, -0.896829] ---- -Label : 1 -Position : [162.792, 113.56] -Measurements : [923.253, 210067, 0.779048, -0.527959] ---- -Label : 1 -Position : [164.882, 113.932] -Measurements : [894.756, 219335, 0.809942, -0.485659] ---- -Label : 1 -Position : [321.412, 114.382] -Measurements : [729.804, 160832, 1.59829, 2.50418] ---- -Label : 1 -Position : [700.48, 114.664] -Measurements : [1297.14, 241601, 0.141907, -0.876793] ---- -Label : 1 -Position : [528.992, 115.24] -Measurements : [1439.84, 214192, -0.0367069, -0.966983] ---- -Label : 1 -Position : [683.072, 115.688] -Measurements : [1369.02, 382654, 0.110694, -1.30542] ---- -Label : 1 -Position : [787.649, 116.056] -Measurements : [1069.04, 298355, 0.349867, -1.02274] ---- -Label : 1 -Position : [282.045, 116.276] -Measurements : [888.759, 514390, 1.21048, -0.158209] ---- -Label : 1 -Position : [703.015, 116.342] -Measurements : [1255.66, 230138, 0.165227, -0.861112] ---- -Label : 1 -Position : [532.728, 116.619] -Measurements : [1301.11, 192281, 0.316429, -0.825745] ---- -Label : 1 -Position : [328.936, 117.268] -Measurements : [899.582, 131603, 0.749477, 0.890214] ---- -Label : 1 -Position : [786.872, 117.296] -Measurements : [1271.02, 329826, 0.083441, -0.856405] ---- -Label : 1 -Position : [784.771, 117.505] -Measurements : [1346.42, 300073, -0.0267144, -0.645099] ---- -Label : 1 -Position : [686.252, 117.957] -Measurements : [986.837, 440009, 1.04617, -0.347022] ---- -Label : 1 -Position : [787.104, 119.325] -Measurements : [1331.1, 302350, 0.178207, -0.702826] ---- -Label : 1 -Position : [279.016, 119.704] -Measurements : [1349.87, 654100, 0.242578, -1.36819] ---- -Label : 1 -Position : [425.724, 119.956] -Measurements : [928.918, 279548, 0.342888, -1.45729] ---- -Label : 1 -Position : [534.518, 119.975] -Measurements : [1287.76, 203152, 0.38779, -0.597426] ---- -Label : 1 -Position : [679.096, 120.442] -Measurements : [1277.73, 392586, 0.0631674, -1.13376] ---- -Label : 0 -Position : [111.436, 121.004] -Measurements : [973.243, 48617, -0.721266, -0.840469] ---- -Label : 0 -Position : [81.0551, 121.076] -Measurements : [1105.47, 10824.7, 0.584296, 0.979848] ---- -Label : 0 -Position : [129.052, 121.197] -Measurements : [760.452, 15625.3, 0.0282606, 1.66524] ---- -Label : 1 -Position : [425.568, 121.384] -Measurements : [966.733, 244442, 0.385685, -1.39025] ---- -Label : 1 -Position : [530.528, 121.384] -Measurements : [1425.93, 204361, -0.0090095, -0.614752] ---- -Label : 1 -Position : [282.599, 121.848] -Measurements : [1174.81, 688615, 0.662836, -1.10586] ---- -Label : 1 -Position : [784.312, 121.904] -Measurements : [1460.44, 284210, 0.116577, -0.888131] ---- -Label : 1 -Position : [41.9856, 122.153] -Measurements : [783.859, 240284, 0.783098, -0.674306] ---- -Label : 0 -Position : [95.8715, 122.848] -Measurements : [897.204, 40152.7, 0.103602, -1.7928] ---- -Label : 1 -Position : [787.268, 123.75] -Measurements : [1288.25, 293997, 0.573319, -0.808307] ---- -Label : 1 -Position : [275.095, 123.757] -Measurements : [1673.88, 435774, -0.0841427, -0.793278] ---- -Label : 1 -Position : [530.447, 123.991] -Measurements : [1404.69, 249970, 0.0651425, -0.575455] ---- -Label : 1 -Position : [44.52, 124.312] -Measurements : [1072.95, 256575, 0.527127, -0.594927] ---- -Label : 1 -Position : [278.504, 125.336] -Measurements : [1561.76, 478849, 0.0748846, -0.945546] ---- -Label : 1 -Position : [778.168, 126] -Measurements : [1290.07, 281976, 0.14496, -0.793504] ---- -Label : 1 -Position : [429.459, 126.113] -Measurements : [499.872, 76914.2, 3.16918, 10.2205] ---- -Label : 1 -Position : [279.561, 127.608] -Measurements : [1526.21, 498000, 0.116888, -0.971512] ---- -Label : 1 -Position : [776.613, 127.692] -Measurements : [1048.91, 274883, 0.0767666, -1.46346] ---- -Label : 1 -Position : [583.501, 127.812] -Measurements : [630.413, 101710, 1.0013, -0.341788] ---- -Label : 1 -Position : [165.864, 127.896] -Measurements : [1046.98, 195802, 0.375744, -0.594556] ---- -Label : 1 -Position : [535.648, 128.552] -Measurements : [1884.15, 177643, -0.521138, -0.0654111] ---- -Label : 1 -Position : [45.4843, 128.665] -Measurements : [1155.56, 186924, 0.370493, -0.529542] ---- -Label : 1 -Position : [168.958, 128.857] -Measurements : [1124.04, 244409, 0.047706, -1.13973] ---- -Label : 1 -Position : [583.459, 129.25] -Measurements : [739.246, 115252, 0.379303, -1.31422] ---- -Label : 1 -Position : [535.975, 129.426] -Measurements : [1867.47, 209846, -0.799698, 0.459274] ---- -Label : 1 -Position : [164.638, 129.947] -Measurements : [951.631, 191198, 0.365229, -0.689925] ---- -Label : 1 -Position : [780.877, 130.637] -Measurements : [909.113, 222529, 0.69993, -0.85232] ---- -Label : 1 -Position : [532.503, 130.641] -Measurements : [1613.34, 345253, -0.412173, -0.812511] ---- -Label : 1 -Position : [280.552, 130.968] -Measurements : [1328.1, 409007, 0.231777, -0.884732] ---- -Label : 1 -Position : [581.184, 132.352] -Measurements : [959.499, 83611.4, -0.632973, -0.573179] ---- -Label : 1 -Position : [276.709, 132.601] -Measurements : [1227.19, 254635, 0.547162, -0.808944] ---- -Label : 1 -Position : [46.568, 133.528] -Measurements : [1344.19, 255406, 0.319402, -0.901558] ---- -Label : 1 -Position : [287.255, 134.418] -Measurements : [767.178, 207829, 1.15703, 0.124504] ---- -Label : 1 -Position : [282.831, 134.513] -Measurements : [1130.19, 295781, 0.431002, -1.03989] ---- -Label : 1 -Position : [51.3268, 134.638] -Measurements : [1256.62, 200843, 0.550443, -0.672985] ---- -Label : 1 -Position : [325.728, 135.72] -Measurements : [1343.55, 563424, 0.181802, -1.46002] ---- -Label : 1 -Position : [42.7433, 136.251] -Measurements : [1155.67, 347608, 0.508557, -1.01234] ---- -Label : 1 -Position : [321.8, 137.406] -Measurements : [1200.88, 639851, 0.479749, -1.38497] ---- -Label : 1 -Position : [559.277, 138.527] -Measurements : [1579.95, 149686, -0.143497, -0.535129] ---- -Label : 0 -Position : [126.879, 138.925] -Measurements : [971.829, 62864.1, -0.530778, -1.04523] ---- -Label : 1 -Position : [322.458, 138.968] -Measurements : [1192.2, 684416, 0.461354, -1.47774] ---- -Label : 1 -Position : [284.136, 139.16] -Measurements : [807.465, 100527, 0.496844, -0.935616] ---- -Label : 1 -Position : [285.511, 139.706] -Measurements : [771.995, 106183, 0.644265, -0.823326] ---- -Label : 1 -Position : [560.704, 140.544] -Measurements : [1612.83, 142992, -0.239338, -0.434783] ---- -Label : 1 -Position : [206.54, 142.21] -Measurements : [793.994, 101125, 0.191725, -1.34298] ---- -Label : 1 -Position : [427.788, 142.527] -Measurements : [611.776, 111051, 1.26625, 0.671914] ---- -Label : 1 -Position : [555.427, 142.816] -Measurements : [1617.08, 150326, -0.177052, -1.05987] ---- -Label : 1 -Position : [164.84, 144.28] -Measurements : [966.97, 277437, 0.962301, -0.230972] ---- -Label : 1 -Position : [556.096, 145.152] -Measurements : [1678.88, 200841, -0.329494, -0.882302] ---- -Label : 1 -Position : [163.359, 145.282] -Measurements : [1006.48, 258708, 0.930751, -0.241716] ---- -Label : 1 -Position : [564.854, 145.326] -Measurements : [1175.97, 251257, 0.558618, -0.630028] ---- -Label : 1 -Position : [54.9896, 145.451] -Measurements : [640.903, 61901.6, 0.849688, -0.31097] ---- -Label : 1 -Position : [168.815, 145.821] -Measurements : [760.356, 243685, 1.40623, 0.849425] ---- -Label : 1 -Position : [432.736, 145.96] -Measurements : [871.897, 200631, 0.417074, -0.772109] ---- -Label : 1 -Position : [202.216, 146.328] -Measurements : [735.998, 77507.3, 0.486003, -1.20397] ---- -Label : 1 -Position : [199.37, 147.35] -Measurements : [718.547, 93630.1, 0.353925, -1.40405] ---- -Label : 1 -Position : [439.491, 147.445] -Measurements : [708.74, 207666, 1.36753, 0.801427] ---- -Label : 1 -Position : [288.658, 147.677] -Measurements : [820.014, 405995, 1.28555, 0.346208] ---- -Label : 1 -Position : [293.013, 147.905] -Measurements : [689.878, 362867, 1.92391, 2.28359] ---- -Label : 1 -Position : [555.565, 148.116] -Measurements : [1626, 177019, 0.0103185, -1.14299] ---- -Label : 1 -Position : [435.109, 149.683] -Measurements : [1119.72, 281166, 0.430565, -0.748525] ---- -Label : 1 -Position : [50.664, 150.424] -Measurements : [987.126, 342024, 0.981039, 9.90691e-05] ---- -Label : 0 -Position : [100.443, 151.887] -Measurements : [964.573, 24883.9, 0.241763, -1.53948] ---- -Label : 1 -Position : [288.864, 152.104] -Measurements : [1148.26, 381276, 0.332974, -0.883249] ---- -Label : 1 -Position : [435.296, 152.104] -Measurements : [1228.6, 368882, 0.566702, -0.73073] ---- -Label : 1 -Position : [548.117, 152.945] -Measurements : [1248.03, 146106, -0.718104, -0.195879] ---- -Label : 1 -Position : [437.238, 153.945] -Measurements : [1162.21, 400716, 0.603825, -0.726079] ---- -Label : 1 -Position : [49.582, 154.739] -Measurements : [952.488, 406598, 1.13155, -0.0186492] ---- -Label : 0 -Position : [93.9722, 154.808] -Measurements : [1190, 42335.4, 0.741809, -0.136511] ---- -Label : 1 -Position : [549.952, 155.904] -Measurements : [1215.97, 145716, -0.712105, -0.179858] ---- -Label : 1 -Position : [437.856, 157.736] -Measurements : [1194.07, 376919, 0.749542, -0.509319] ---- -Label : 1 -Position : [290.912, 158.76] -Measurements : [1105.7, 220256, 0.171187, -1.18595] ---- -Label : 1 -Position : [286.405, 158.931] -Measurements : [1013.65, 174437, 0.530106, -0.759662] ---- -Label : 0 -Position : [116.922, 158.994] -Measurements : [1020.36, 27234.7, -1.59742, 1.84507] ---- -Label : 1 -Position : [548.215, 159] -Measurements : [1010.95, 229876, -0.162641, -1.4615] ---- -Label : 1 -Position : [435.795, 159.645] -Measurements : [1084.69, 319821, 1.08762, 0.482812] ---- -Label : 1 -Position : [173.172, 160.418] -Measurements : [910.603, 360753, 0.92316, -0.711811] ---- -Label : 1 -Position : [434.626, 161.185] -Measurements : [991.996, 185225, 1.224, 1.78436] ---- -Label : 1 -Position : [296.135, 161.251] -Measurements : [1171.76, 456721, 0.430665, -1.07225] ---- -Label : 1 -Position : [288.841, 161.311] -Measurements : [1144.47, 257208, 0.493746, -0.647602] ---- -Label : 1 -Position : [439.961, 161.588] -Measurements : [1235, 383454, 0.625274, -0.770277] ---- -Label : 1 -Position : [170.472, 161.688] -Measurements : [1108.1, 440775, 0.496568, -1.33749] ---- -Label : 1 -Position : [51.24, 162.517] -Measurements : [721.785, 254747, 1.65975, 1.89345] ---- -Label : 1 -Position : [439.392, 163.368] -Measurements : [1222.62, 298314, 0.82134, -0.208641] ---- -Label : 1 -Position : [169.046, 163.37] -Measurements : [1166.61, 393993, 0.507265, -1.33034] ---- -Label : 1 -Position : [439.227, 163.469] -Measurements : [1222.62, 298314, 0.82134, -0.208641] ---- -Label : 0 -Position : [80.6968, 163.915] -Measurements : [1146.21, 8771.87, 0.102303, -1.03749] ---- -Label : 1 -Position : [53.736, 165.272] -Measurements : [800.873, 221357, 1.64339, 2.1331] ---- -Label : 1 -Position : [293.165, 165.495] -Measurements : [1445.16, 315696, 0.193153, -0.948964] ---- -Label : 0 -Position : [85.073, 165.554] -Measurements : [1088.24, 17474.6, -1.2738, 1.97941] ---- -Label : 1 -Position : [293.984, 165.928] -Measurements : [1445.16, 315696, 0.193153, -0.948964] ---- -Label : 1 -Position : [51.1578, 167.01] -Measurements : [763.843, 231835, 1.73052, 2.19185] ---- -Label : 1 -Position : [343.648, 169] -Measurements : [928.066, 235749, 0.533846, -1.16419] ---- -Label : 1 -Position : [346.821, 169.459] -Measurements : [840.941, 229802, 0.898385, -0.643969] ---- -Label : 1 -Position : [200.924, 169.571] -Measurements : [1027.23, 540995, 0.645869, -1.15679] ---- -Label : 0 -Position : [115.217, 169.683] -Measurements : [846.398, 16393.4, 0.466025, -0.546362] ---- -Label : 1 -Position : [343.379, 169.888] -Measurements : [928.066, 235749, 0.533846, -1.16419] ---- -Label : 1 -Position : [202.371, 170.412] -Measurements : [1227.81, 562870, 0.311362, -1.45724] ---- -Label : 0 -Position : [87.0626, 170.842] -Measurements : [904.53, 31835.2, -0.157591, -1.63508] ---- -Label : 1 -Position : [458.099, 171.513] -Measurements : [1748.77, 230032, -0.80657, -0.0312607] ---- -Label : 0 -Position : [100.77, 171.907] -Measurements : [752.345, 4246.94, 0.00409903, 1.81988] ---- -Label : 1 -Position : [205.288, 171.928] -Measurements : [1381.38, 545814, 0.219604, -1.5491] ---- -Label : 1 -Position : [172.454, 172.899] -Measurements : [769.186, 229563, 1.00374, -0.192638] ---- -Label : 0 -Position : [130.268, 173.077] -Measurements : [1041.78, 13687.9, -1.06755, 0.613121] ---- -Label : 1 -Position : [453.728, 174.12] -Measurements : [1576.33, 275832, -0.406668, -0.164106] ---- -Label : 1 -Position : [466.46, 174.791] -Measurements : [1265.68, 242176, 0.590304, -0.316957] ---- -Label : 1 -Position : [452.318, 175.335] -Measurements : [1454.43, 318888, -0.35921, -0.585877] ---- -Label : 0 -Position : [118.619, 176.382] -Measurements : [947.783, 25016.6, 1.87238, 9.26613] ---- -Label : 1 -Position : [175.785, 176.617] -Measurements : [1179.15, 363424, -0.0431143, -1.2454] ---- -Label : 1 -Position : [459.36, 176.68] -Measurements : [1814.73, 239735, -0.461905, -0.741981] ---- -Label : 1 -Position : [718.776, 176.688] -Measurements : [1344.26, 143039, -0.283975, -0.23451] ---- -Label : 1 -Position : [174.568, 177.048] -Measurements : [1301.67, 324422, -0.302307, -0.943574] ---- -Label : 1 -Position : [172.228, 177.982] -Measurements : [1196.49, 338762, -0.117432, -1.20676] ---- -Label : 1 -Position : [463.593, 177.989] -Measurements : [1584.79, 262685, 0.139275, -1.06502] ---- -Label : 1 -Position : [469.066, 178.497] -Measurements : [1225.01, 192878, 0.14609, -0.472889] ---- -Label : 1 -Position : [457.188, 178.617] -Measurements : [1739.82, 252758, -0.392531, -0.697884] ---- -Label : 1 -Position : [468.064, 178.728] -Measurements : [1205.72, 165909, 0.0544097, -0.530043] ---- -Label : 1 -Position : [179.848, 179.5] -Measurements : [1073.83, 372779, 0.505805, -1.2185] ---- -Label : 1 -Position : [472.734, 179.848] -Measurements : [1420.95, 280567, -0.215442, -1.17759] ---- -Label : 0 -Position : [84.4024, 180.274] -Measurements : [962.054, 19438, -0.666317, -1.0598] ---- -Label : 1 -Position : [721.135, 180.474] -Measurements : [1119.45, 175922, 0.651067, -0.624889] ---- -Label : 1 -Position : [715.191, 181.662] -Measurements : [1145.86, 190723, 0.308976, -1.0098] ---- -Label : 1 -Position : [176.104, 182.168] -Measurements : [1168.06, 351181, 0.24595, -1.3993] ---- -Label : 1 -Position : [476.256, 182.312] -Measurements : [1413.98, 381507, -0.104882, -1.43638] ---- -Label : 0 -Position : [119.927, 182.936] -Measurements : [1034.32, 35375, 2.20187, 6.84498] ---- -Label : 1 -Position : [480.888, 183.168] -Measurements : [993.334, 432702, 0.897719, -0.792276] ---- -Label : 0 -Position : [87.6863, 183.363] -Measurements : [1015.35, 69459.9, 0.914419, 0.550633] ---- -Label : 0 -Position : [78.6616, 183.498] -Measurements : [1011.36, 3655.02, 0.373185, -0.928352] ---- -Label : 0 -Position : [124.706, 185.457] -Measurements : [1051.73, 78638.7, 0.59633, 0.921091] ---- -Label : 1 -Position : [875.834, 190.969] -Measurements : [1006.11, 50158.9, -1.03185, 0.406372] ---- -Label : 1 -Position : [24.0479, 194.139] -Measurements : [511.819, 36538.6, 1.00629, -0.471377] ---- -Label : 1 -Position : [28.4819, 194.312] -Measurements : [587.787, 94716.6, 2.0327, 5.3558] ---- -Label : 1 -Position : [210.686, 194.708] -Measurements : [1081.93, 616511, 0.465294, -1.48121] ---- -Label : 1 -Position : [883.424, 194.798] -Measurements : [890.391, 102875, -0.151164, -1.5192] ---- -Label : 1 -Position : [880.712, 195.648] -Measurements : [824.918, 104315, 0.0428919, -1.56379] ---- -Label : 1 -Position : [206.437, 195.744] -Measurements : [1013.23, 662647, 0.759068, -1.05212] ---- -Label : 1 -Position : [28.648, 199.064] -Measurements : [654.467, 82489.4, 2.02281, 5.76205] ---- -Label : 1 -Position : [211.432, 199.064] -Measurements : [1510.98, 504539, -0.00991282, -1.47667] ---- -Label : 0 -Position : [64.8357, 200.144] -Measurements : [1033.71, 10272.1, 0.797339, 4.29059] ---- -Label : 0 -Position : [106.807, 200.498] -Measurements : [1029.8, 16500.3, -1.30319, 1.23472] ---- -Label : 1 -Position : [711.024, 201.745] -Measurements : [859.114, 162654, 0.969496, 0.252542] ---- -Label : 0 -Position : [108.755, 201.787] -Measurements : [1033.13, 17517, -1.16156, 1.03798] ---- -Label : 1 -Position : [706.632, 202.304] -Measurements : [909.044, 205380, 0.669954, -0.913504] ---- -Label : 1 -Position : [862.044, 202.522] -Measurements : [1090.65, 501719, 0.629952, -1.05298] ---- -Label : 0 -Position : [133.631, 203.069] -Measurements : [1015.21, 19261.5, -2.2191, 4.98905] ---- -Label : 1 -Position : [176.3, 203.428] -Measurements : [1100.39, 432746, 0.522518, -1.20115] ---- -Label : 1 -Position : [891.78, 203.667] -Measurements : [891.333, 421627, 0.970045, -0.602316] ---- -Label : 1 -Position : [357.984, 204.328] -Measurements : [1249.78, 497817, 0.531452, -0.822011] ---- -Label : 1 -Position : [889.843, 204.868] -Measurements : [785.969, 382163, 1.34655, 0.298143] ---- -Label : 1 -Position : [360.317, 205.079] -Measurements : [1113.8, 357503, 0.535817, -1.1484] ---- -Label : 1 -Position : [179.176, 205.208] -Measurements : [1108.75, 417131, 0.654059, -1.15038] ---- -Label : 1 -Position : [176.006, 206.321] -Measurements : [1168.34, 376583, 0.497907, -1.13431] ---- -Label : 1 -Position : [863.816, 206.912] -Measurements : [1183.23, 443396, 0.635468, -1.05555] ---- -Label : 1 -Position : [703.397, 207.005] -Measurements : [556.119, 75660.8, 1.9211, 2.94926] ---- -Label : 1 -Position : [894.536, 207.424] -Measurements : [984.415, 380697, 0.85635, -0.735312] ---- -Label : 1 -Position : [301.117, 207.52] -Measurements : [1469.09, 244028, -0.346245, -0.798871] ---- -Label : 1 -Position : [361.807, 208.293] -Measurements : [1054.72, 357596, 0.695484, -1.06173] ---- -Label : 1 -Position : [305.152, 208.656] -Measurements : [1062.9, 253742, 0.257437, -1.23242] ---- -Label : 0 -Position : [103.974, 208.707] -Measurements : [1044.9, 5652.95, -1.27797, 4.6118] ---- -Label : 0 -Position : [65.0811, 209.122] -Measurements : [1141.98, 18419.1, 1.57678, 2.24398] ---- -Label : 1 -Position : [861.112, 210.405] -Measurements : [1267.54, 360823, 0.35263, -1.10572] ---- -Label : 1 -Position : [308.787, 210.95] -Measurements : [793.141, 216224, 0.916479, -0.735237] ---- -Label : 1 -Position : [862.601, 211.896] -Measurements : [1143.86, 404827, 0.63832, -0.810785] ---- -Label : 1 -Position : [719.041, 213.273] -Measurements : [1026.08, 78610.5, 0.290094, -0.7538] ---- -Label : 1 -Position : [860.232, 214.592] -Measurements : [1031.01, 233719, 0.582786, -0.737979] ---- -Label : 1 -Position : [860.301, 216.547] -Measurements : [1022.67, 230172, 0.624532, -0.629547] ---- -Label : 1 -Position : [363.225, 216.858] -Measurements : [1988.31, 684467, -0.379378, -1.06607] ---- -Label : 1 -Position : [364.128, 217.64] -Measurements : [1897.61, 738105, -0.237603, -1.31869] ---- -Label : 1 -Position : [714.824, 218.176] -Measurements : [821.876, 154001, 0.536069, -0.777765] ---- -Label : 1 -Position : [715.735, 218.326] -Measurements : [890.303, 150882, 0.244042, -0.991735] ---- -Label : 0 -Position : [88.1349, 218.534] -Measurements : [1005.05, 11746.3, 3.01618, 13.4804] ---- -Label : 1 -Position : [867.549, 218.703] -Measurements : [697.238, 154574, 0.835332, -0.779369] ---- -Label : 1 -Position : [181.278, 218.732] -Measurements : [1296.75, 706447, 0.139058, -1.41445] ---- -Label : 0 -Position : [108.14, 218.817] -Measurements : [1065.29, 12187.3, -0.513496, 0.415816] ---- -Label : 1 -Position : [863.377, 219.477] -Measurements : [891.208, 233894, 0.672972, -0.61997] ---- -Label : 0 -Position : [133.607, 219.558] -Measurements : [915.083, 13643.5, -0.846548, 1.17435] ---- -Label : 1 -Position : [362.863, 219.67] -Measurements : [1842.68, 942342, -0.175373, -1.51707] ---- -Label : 1 -Position : [182.248, 220.056] -Measurements : [1535.29, 537093, -0.166385, -1.12571] ---- -Label : 1 -Position : [911.873, 220.529] -Measurements : [981.263, 152723, -0.273252, -1.40202] ---- -Label : 1 -Position : [182.637, 220.599] -Measurements : [1535.29, 537093, -0.166385, -1.12571] ---- -Label : 0 -Position : [128.703, 221.589] -Measurements : [951.459, 16191.8, -0.296294, -0.532626] ---- -Label : 1 -Position : [308.951, 222.08] -Measurements : [802.338, 214555, 0.903603, -0.0462955] ---- -Label : 1 -Position : [184.7, 222.318] -Measurements : [1566.67, 404076, 0.0908016, -0.81289] ---- -Label : 1 -Position : [867.4, 223.296] -Measurements : [1096.75, 236870, 0.240736, -0.759973] ---- -Label : 1 -Position : [907.336, 223.296] -Measurements : [755.819, 144529, 0.752759, -0.785582] ---- -Label : 1 -Position : [31.72, 223.64] -Measurements : [1053.28, 328868, 0.739464, -0.768644] ---- -Label : 1 -Position : [908.159, 223.694] -Measurements : [807.086, 151692, 0.501415, -1.17477] ---- -Label : 0 -Position : [67.2161, 223.945] -Measurements : [1176.23, 47964.9, 1.78288, 3.78042] ---- -Label : 1 -Position : [310.272, 224.016] -Measurements : [1111.51, 495259, 0.570385, -0.92457] ---- -Label : 1 -Position : [182.76, 224.152] -Measurements : [1647.78, 296626, 0.42371, -0.782878] ---- -Label : 1 -Position : [310.937, 224.798] -Measurements : [1111.51, 495259, 0.570385, -0.92457] ---- -Label : 1 -Position : [30.803, 225.572] -Measurements : [1017.8, 355643, 0.745761, -0.834526] ---- -Label : 1 -Position : [183.029, 225.933] -Measurements : [1579.74, 304237, 0.664633, -0.598438] ---- -Label : 0 -Position : [123.133, 226.472] -Measurements : [1068.52, 3217.49, -1.00626, 3.16216] ---- -Label : 1 -Position : [869.224, 226.677] -Measurements : [1015.9, 256264, 0.58223, -0.843968] ---- -Label : 1 -Position : [864.84, 226.88] -Measurements : [1052.3, 226196, 0.529199, -0.607237] ---- -Label : 1 -Position : [710.279, 227.086] -Measurements : [792.157, 134777, 0.50578, -1.19546] ---- -Label : 1 -Position : [862.126, 227.76] -Measurements : [897.374, 215853, 0.983941, 0.153139] ---- -Label : 1 -Position : [33.1171, 227.914] -Measurements : [953.108, 238848, 1.13436, 0.817858] ---- -Label : 1 -Position : [710.216, 228.416] -Measurements : [825.895, 135704, 0.384101, -1.28101] ---- -Label : 0 -Position : [60.2701, 228.586] -Measurements : [1064.9, 6211.3, 0.60023, -0.0306526] ---- -Label : 1 -Position : [311.296, 230.672] -Measurements : [1409.32, 536504, 0.104209, -1.54309] ---- -Label : 1 -Position : [715.214, 231.314] -Measurements : [1009.83, 170971, 0.706218, -0.136483] ---- -Label : 1 -Position : [313.87, 231.412] -Measurements : [1305.46, 574078, 0.335705, -1.51573] ---- -Label : 1 -Position : [906.824, 232] -Measurements : [1111.36, 291222, 0.176541, -1.13685] ---- -Label : 0 -Position : [56.9019, 233.286] -Measurements : [986.829, 7168.76, 0.00846685, -0.22224] ---- -Label : 1 -Position : [908.439, 234.492] -Measurements : [1340.28, 250918, 0.0879431, -0.964828] ---- -Label : 1 -Position : [16.2852, 234.852] -Measurements : [710.914, 168826, 0.682616, -0.931927] ---- -Label : 1 -Position : [904.699, 234.95] -Measurements : [1288.72, 315961, -0.0711211, -1.09406] ---- -Label : 1 -Position : [714.312, 235.072] -Measurements : [1209.51, 258403, 0.177586, -1.38318] ---- -Label : 1 -Position : [863.816, 235.072] -Measurements : [766.333, 86142.7, 0.605089, -0.663795] ---- -Label : 1 -Position : [309.719, 235.559] -Measurements : [835.819, 436572, 1.32409, 0.251109] ---- -Label : 1 -Position : [902.899, 235.683] -Measurements : [1206.66, 332303, 0.0196027, -1.31272] ---- -Label : 1 -Position : [712.613, 237.484] -Measurements : [1349.88, 286555, -0.357925, -1.10482] ---- -Label : 1 -Position : [712.354, 237.977] -Measurements : [1349.88, 286555, -0.357925, -1.10482] ---- -Label : 1 -Position : [20.5315, 238.029] -Measurements : [999.687, 183217, 0.0516971, -1.25309] ---- -Label : 1 -Position : [712.214, 238.36] -Measurements : [1449.11, 265176, -0.603101, -0.696948] ---- -Label : 1 -Position : [865.587, 239.052] -Measurements : [956.124, 120560, 0.0173135, -0.96128] ---- -Label : 1 -Position : [908.872, 239.168] -Measurements : [1200.91, 308237, 0.290084, -1.18105] ---- -Label : 1 -Position : [864.745, 239.275] -Measurements : [985.691, 99090.4, 0.117515, -0.727384] ---- -Label : 1 -Position : [16.872, 239.4] -Measurements : [1051.28, 134981, 0.16584, -0.893489] ---- -Label : 1 -Position : [904.082, 241.154] -Measurements : [985.929, 314813, 0.739275, -0.681034] ---- -Label : 1 -Position : [709.237, 241.399] -Measurements : [1246.95, 290046, -0.0863159, -1.28883] ---- -Label : 1 -Position : [859.941, 241.414] -Measurements : [999.436, 118709, -0.0629683, -1.29704] ---- -Label : 1 -Position : [1265.2, 241.432] -Measurements : [1182.54, 392403, 0.261345, -1.10779] ---- -Label : 1 -Position : [712.264, 241.728] -Measurements : [1372.76, 262720, -0.233318, -1.27239] ---- -Label : 1 -Position : [908.5, 241.804] -Measurements : [1162.23, 266354, 0.359413, -0.89179] ---- -Label : 1 -Position : [1258.66, 241.961] -Measurements : [1380.11, 132033, -0.161983, -0.62962] ---- -Label : 1 -Position : [864.84, 242.752] -Measurements : [868.386, 132788, 0.518228, -0.988712] ---- -Label : 0 -Position : [60.1129, 242.932] -Measurements : [971.734, 29827.2, -0.779773, 0.373738] ---- -Label : 0 -Position : [69.4194, 243.353] -Measurements : [812.667, 19641.8, -0.0692841, -0.810869] ---- -Label : 1 -Position : [1261.98, 244.224] -Measurements : [1464.19, 199725, 0.186734, -0.800198] ---- -Label : 0 -Position : [89.3778, 245.656] -Measurements : [1048.57, 22865.6, 1.52316, 6.60573] ---- -Label : 0 -Position : [61.823, 246.283] -Measurements : [958.351, 50894.5, -0.00415467, -0.677129] ---- -Label : 1 -Position : [909.384, 246.336] -Measurements : [1293.84, 420251, 0.629286, -0.612363] ---- -Label : 1 -Position : [317.44, 247.056] -Measurements : [1159.36, 246411, 0.235154, -0.610881] ---- -Label : 1 -Position : [864.598, 247.06] -Measurements : [762.301, 134820, 0.911803, -0.445678] ---- -Label : 1 -Position : [319.013, 247.654] -Measurements : [1104.21, 250637, 0.397901, -0.618335] ---- -Label : 1 -Position : [175.779, 247.798] -Measurements : [1806.55, 134620, 0.309509, 0.210585] ---- -Label : 0 -Position : [56.7737, 248.059] -Measurements : [1115.22, 21316.3, -1.19701, 3.65595] ---- -Label : 1 -Position : [1265.57, 248.32] -Measurements : [1400.04, 386926, 0.0969364, -1.31645] ---- -Label : 1 -Position : [15.7121, 248.405] -Measurements : [1530.52, 287904, -0.323624, -1.15259] ---- -Label : 0 -Position : [148.004, 248.757] -Measurements : [854.813, 21760, -1.06542, 0.133153] ---- -Label : 1 -Position : [1217.95, 248.832] -Measurements : [1759.71, 361715, -0.213039, -0.93058] ---- -Label : 1 -Position : [1264.53, 249.024] -Measurements : [1379.49, 389613, 0.157555, -1.28122] ---- -Label : 1 -Position : [911.806, 249.282] -Measurements : [1679.18, 384588, 0.282877, -1.10675] ---- -Label : 1 -Position : [865.553, 249.663] -Measurements : [807.124, 204699, 1.02958, -0.302475] ---- -Label : 1 -Position : [1261.11, 249.752] -Measurements : [1404.83, 235070, 0.0643815, -0.710326] ---- -Label : 1 -Position : [177.146, 249.785] -Measurements : [1549.26, 315187, 0.0983008, -0.594274] ---- -Label : 0 -Position : [109.77, 249.914] -Measurements : [1040.92, 10459.9, -1.00389, 0.317522] ---- -Label : 1 -Position : [382.501, 250.062] -Measurements : [1663.87, 892093, 0.0432028, -1.16457] ---- -Label : 1 -Position : [15.3317, 250.121] -Measurements : [1498.05, 334465, -0.36862, -1.2321] ---- -Label : 1 -Position : [15.848, 250.152] -Measurements : [1498.05, 334465, -0.36862, -1.2321] ---- -Label : 1 -Position : [178.664, 250.152] -Measurements : [1327.07, 335769, 0.366534, -0.659771] ---- -Label : 1 -Position : [869.147, 250.29] -Measurements : [684.653, 183146, 1.66781, 1.39747] ---- -Label : 1 -Position : [1213.93, 250.322] -Measurements : [1213.22, 579259, 0.469411, -1.20637] ---- -Label : 1 -Position : [1221.8, 250.708] -Measurements : [1587.12, 604175, -0.00410846, -1.49415] ---- -Label : 1 -Position : [310.122, 250.76] -Measurements : [1212.15, 161163, 0.775936, -0.250635] ---- -Label : 1 -Position : [909.279, 251.316] -Measurements : [1651.8, 443221, 0.0674686, -1.17702] ---- -Label : 1 -Position : [315.586, 251.505] -Measurements : [1322.33, 219288, 0.155867, -0.990853] ---- -Label : 1 -Position : [387.072, 251.664] -Measurements : [1931.64, 390549, 0.0234496, -0.208043] ---- -Label : 1 -Position : [910.92, 251.968] -Measurements : [1668.13, 461662, 0.0513141, -1.22413] ---- -Label : 0 -Position : [126.898, 252.351] -Measurements : [1016.3, 14954.5, -0.048602, -0.46863] ---- -Label : 1 -Position : [1250.34, 252.962] -Measurements : [1247.53, 322880, 0.536272, -0.834595] ---- -Label : 1 -Position : [865.352, 253.504] -Measurements : [853.489, 186985, 0.952944, -0.308027] ---- -Label : 1 -Position : [385.403, 253.939] -Measurements : [2102.93, 424272, 0.0861453, -0.380908] ---- -Label : 1 -Position : [865.352, 254.016] -Measurements : [856.453, 184444, 0.972312, -0.286989] ---- -Label : 1 -Position : [1182.35, 254.449] -Measurements : [1790.33, 484783, 0.0652818, -0.908935] ---- -Label : 1 -Position : [867.44, 254.474] -Measurements : [799.701, 196500, 1.15071, -0.0449687] ---- -Label : 1 -Position : [1196.12, 254.549] -Measurements : [2041.64, 1.02109e+06, -0.411857, -1.54142] ---- -Label : 1 -Position : [860.792, 254.757] -Measurements : [913.826, 138391, 0.559833, -0.863263] ---- -Label : 1 -Position : [908.357, 254.809] -Measurements : [1412.23, 647217, 0.247126, -1.5408] ---- -Label : 1 -Position : [1168.67, 254.831] -Measurements : [1889.79, 719158, 0.194722, -1.24675] ---- -Label : 1 -Position : [310.272, 255.248] -Measurements : [1217.14, 279089, 0.136048, -1.25992] ---- -Label : 0 -Position : [128.566, 255.441] -Measurements : [1109.3, 10061.8, -0.0638821, -1.40931] ---- -Label : 0 -Position : [96.3641, 255.457] -Measurements : [1132.96, 4614.7, -1.08726, 0.881292] ---- -Label : 1 -Position : [310.445, 255.895] -Measurements : [1217.14, 279089, 0.136048, -1.25992] ---- -Label : 1 -Position : [388.99, 256.192] -Measurements : [1854.75, 384452, 0.0546601, -0.696502] ---- -Label : 0 -Position : [60.9885, 256.605] -Measurements : [1113.98, 5532.94, -0.270312, 0.848228] ---- -Label : 1 -Position : [392.192, 256.784] -Measurements : [1501.8, 363354, 0.333766, -0.925513] ---- -Label : 1 -Position : [1180.58, 257.024] -Measurements : [2054.02, 331210, -0.221277, -0.0659788] ---- -Label : 1 -Position : [1194.91, 257.024] -Measurements : [2405.62, 471670, -0.778642, 0.188787] ---- -Label : 1 -Position : [1199.29, 257.124] -Measurements : [1605.35, 1.08056e+06, 0.42958, -1.44912] ---- -Label : 1 -Position : [314.796, 257.433] -Measurements : [1240.97, 511114, 0.392849, -1.28138] ---- -Label : 1 -Position : [1247.65, 257.536] -Measurements : [1223.46, 410436, 0.424089, -1.26315] ---- -Label : 1 -Position : [1249.77, 258.028] -Measurements : [1099.47, 419054, 0.765379, -0.891461] ---- -Label : 1 -Position : [1169.31, 258.56] -Measurements : [2003.74, 564609, 0.333267, -1.26695] ---- -Label : 0 -Position : [126.415, 258.636] -Measurements : [1129.71, 9506.17, -0.0137887, -1.38408] ---- -Label : 0 -Position : [121.642, 258.691] -Measurements : [1088.5, 3613.66, 0.00197447, -0.0827409] ---- -Label : 1 -Position : [390.1, 258.793] -Measurements : [1520, 467194, 0.135573, -1.29076] ---- -Label : 1 -Position : [400.896, 258.832] -Measurements : [1221.76, 239991, 0.442484, -0.513054] ---- -Label : 1 -Position : [1183.53, 259.491] -Measurements : [1973.27, 608379, -0.260823, -1.15329] ---- -Label : 1 -Position : [404.432, 259.873] -Measurements : [1150.14, 189804, 0.76918, 0.402144] ---- -Label : 1 -Position : [1152.51, 260.063] -Measurements : [1204.8, 182669, -0.132697, -0.997134] ---- -Label : 0 -Position : [106.77, 261.044] -Measurements : [1206.28, 1061.79, -0.410888, 0.180622] ---- -Label : 1 -Position : [1130.61, 261.144] -Measurements : [2561.17, 171090, -0.547921, -0.417651] ---- -Label : 1 -Position : [401.118, 261.371] -Measurements : [1123.23, 242041, 0.695339, -0.13039] ---- -Label : 1 -Position : [310.784, 261.392] -Measurements : [1544.54, 506822, -0.163673, -1.30474] ---- -Label : 1 -Position : [1143.48, 261.44] -Measurements : [1644.65, 321743, -0.0512625, -0.222908] ---- -Label : 0 -Position : [109.951, 261.974] -Measurements : [1190.55, 1282.52, -0.0150936, -0.135875] ---- -Label : 1 -Position : [913.452, 262.109] -Measurements : [934.031, 178900, 0.995524, -0.137872] ---- -Label : 1 -Position : [910.92, 262.208] -Measurements : [931.175, 190355, 0.998872, -0.112188] ---- -Label : 1 -Position : [311.33, 262.536] -Measurements : [1620.59, 526601, -0.288033, -1.24224] ---- -Label : 1 -Position : [399.863, 262.561] -Measurements : [1043.41, 249290, 0.564103, -0.323788] ---- -Label : 1 -Position : [1156.51, 262.656] -Measurements : [1462.4, 127159, -0.424693, -0.313032] ---- -Label : 1 -Position : [1147.07, 262.849] -Measurements : [1327.42, 371238, 0.294475, -1.32257] ---- -Label : 1 -Position : [1148.14, 262.952] -Measurements : [1294.73, 319986, 0.319489, -1.14969] ---- -Label : 1 -Position : [1167.25, 263.328] -Measurements : [1410.77, 486064, 1.27753, 0.761903] ---- -Label : 1 -Position : [1277.3, 263.8] -Measurements : [1038.55, 584822, 0.921905, -0.822194] ---- -Label : 1 -Position : [1107.2, 264.013] -Measurements : [2270.68, 226124, 0.0254142, -0.165368] ---- -Label : 1 -Position : [1160.18, 264.541] -Measurements : [1375.61, 208659, -0.14888, -1.05241] ---- -Label : 1 -Position : [908.278, 264.649] -Measurements : [1037.61, 286517, 0.530986, -0.985511] ---- -Label : 1 -Position : [313.04, 264.976] -Measurements : [1618.61, 570162, -0.266746, -1.41386] ---- -Label : 1 -Position : [1108.67, 265.389] -Measurements : [2377.87, 180581, 0.0326631, 0.255546] ---- -Label : 1 -Position : [401.408, 265.488] -Measurements : [947.133, 135441, 0.302264, -1.14469] ---- -Label : 1 -Position : [1126.07, 265.536] -Measurements : [2279.57, 195603, -0.44005, -0.0712758] ---- -Label : 1 -Position : [1134.78, 265.536] -Measurements : [2563.78, 322725, -0.600678, 0.164533] ---- -Label : 1 -Position : [1121.19, 266.037] -Measurements : [1943.03, 310356, -0.431312, -0.823779] ---- -Label : 1 -Position : [913.852, 266.153] -Measurements : [1109.52, 216541, 0.626918, -0.725646] ---- -Label : 1 -Position : [649.269, 266.252] -Measurements : [599.908, 71670.4, 2.3928, 4.93111] ---- -Label : 1 -Position : [1102.36, 266.371] -Measurements : [1796.64, 385031, 0.621278, -0.841863] ---- -Label : 1 -Position : [1116.34, 266.56] -Measurements : [1939.34, 318779, -0.529652, -0.991538] ---- -Label : 1 -Position : [731.72, 266.816] -Measurements : [1678.78, 356094, -0.371261, -1.03643] ---- -Label : 1 -Position : [1111.4, 266.824] -Measurements : [2391.49, 238823, -0.671226, 1.18281] ---- -Label : 1 -Position : [215.528, 267.048] -Measurements : [1048.73, 261716, 0.360984, -1.20366] ---- -Label : 1 -Position : [401.209, 267.138] -Measurements : [848.653, 146968, 0.61596, -0.959477] ---- -Label : 1 -Position : [1275.3, 267.264] -Measurements : [1515.46, 474401, 0.135607, -0.936487] ---- -Label : 1 -Position : [310.784, 267.536] -Measurements : [1784.98, 291353, -0.0732586, -0.961432] ---- -Label : 1 -Position : [732.312, 267.725] -Measurements : [1624.88, 397607, -0.266751, -1.21683] ---- -Label : 1 -Position : [737.788, 267.985] -Measurements : [1495.01, 406252, -0.0158629, -1.35555] ---- -Label : 1 -Position : [1106.62, 268.096] -Measurements : [2313.08, 382844, -0.30995, -0.775084] ---- -Label : 1 -Position : [1087.05, 268.174] -Measurements : [1116.31, 303861, 0.177003, -1.28857] ---- -Label : 1 -Position : [1115.53, 268.414] -Measurements : [2125.92, 383864, -0.4904, -0.522071] ---- -Label : 1 -Position : [1011.65, 268.45] -Measurements : [1449.4, 301681, 0.494051, -0.180817] ---- -Label : 1 -Position : [1015.43, 268.595] -Measurements : [1394.81, 214594, 1.5058, 1.77877] ---- -Label : 1 -Position : [735.943, 268.816] -Measurements : [1467.98, 466659, -0.0267311, -1.39712] ---- -Label : 1 -Position : [1126.18, 268.858] -Measurements : [2266.99, 280026, -0.601528, 0.0327727] ---- -Label : 1 -Position : [912.456, 268.864] -Measurements : [1056.26, 218909, 0.78688, -0.543438] ---- -Label : 1 -Position : [218.636, 269.021] -Measurements : [861.409, 263711, 0.985571, -0.461672] ---- -Label : 1 -Position : [1006.08, 269.187] -Measurements : [1053.38, 498724, 0.880973, -0.493719] ---- -Label : 1 -Position : [418.065, 269.348] -Measurements : [1047.11, 345073, 0.493225, -1.00819] ---- -Label : 1 -Position : [737.864, 269.376] -Measurements : [1377.22, 426667, 0.0218243, -1.34089] ---- -Label : 0 -Position : [95.9609, 269.49] -Measurements : [1213.82, 658.775, -0.438727, 2.60562] ---- -Label : 0 -Position : [68.1328, 269.557] -Measurements : [1072.21, 3184.61, -1.33882, 3.11863] ---- -Label : 1 -Position : [1130.29, 269.584] -Measurements : [2501.73, 275315, -0.678864, 0.10208] ---- -Label : 1 -Position : [314.053, 269.852] -Measurements : [1566.75, 365869, -0.192031, -0.989876] ---- -Label : 1 -Position : [1279.13, 269.863] -Measurements : [1127.24, 620688, 0.865744, -0.656894] ---- -Label : 1 -Position : [646.216, 269.888] -Measurements : [632.767, 85002.5, 1.93003, 2.94433] ---- -Label : 1 -Position : [504.57, 269.916] -Measurements : [1273.55, 200571, 0.942077, 0.818227] ---- -Label : 1 -Position : [1101.6, 269.958] -Measurements : [1666.82, 398976, 0.855085, -0.575542] ---- -Label : 1 -Position : [17.5717, 270.067] -Measurements : [770.188, 189094, 0.675891, -0.738604] ---- -Label : 1 -Position : [1011.9, 270.144] -Measurements : [1379.92, 367636, 0.435525, -0.60348] ---- -Label : 1 -Position : [1099.45, 270.144] -Measurements : [1333.36, 162280, 1.33995, 2.04295] ---- -Label : 1 -Position : [1051.49, 270.18] -Measurements : [877.43, 112723, 0.443687, -1.01122] ---- -Label : 1 -Position : [1048.25, 270.656] -Measurements : [783.695, 115229, 0.976985, -0.304765] ---- -Label : 1 -Position : [741.602, 270.67] -Measurements : [1321.47, 331540, 0.143417, -1.38843] ---- -Label : 1 -Position : [214.695, 270.934] -Measurements : [920.819, 278819, 0.74437, -0.933229] ---- -Label : 1 -Position : [17.0385, 270.938] -Measurements : [770.188, 189094, 0.675891, -0.738604] ---- -Label : 1 -Position : [528.172, 270.996] -Measurements : [886.537, 78060.2, -0.434116, -1.0551] ---- -Label : 1 -Position : [430.351, 271.052] -Measurements : [1192.49, 204780, 0.518345, -0.639888] ---- -Label : 1 -Position : [1089.72, 271.168] -Measurements : [1274.5, 276691, -0.224789, -1.12192] ---- -Label : 1 -Position : [1056.66, 271.427] -Measurements : [1004.53, 125629, 0.209047, -0.959801] ---- -Label : 1 -Position : [1063.69, 271.95] -Measurements : [1199.48, 184916, 0.975555, 0.752526] ---- -Label : 1 -Position : [497.964, 271.993] -Measurements : [1134.95, 141407, 0.251246, 0.0948628] ---- -Label : 1 -Position : [648.455, 272.008] -Measurements : [635.512, 81595.2, 2.05721, 3.32723] ---- -Label : 1 -Position : [1008.3, 272.118] -Measurements : [1108.59, 517710, 0.804248, -0.709147] ---- -Label : 1 -Position : [1006.78, 272.192] -Measurements : [939.057, 480229, 1.2488, 0.245804] ---- -Label : 1 -Position : [913.661, 272.262] -Measurements : [1010.54, 241337, 0.778371, -0.550833] ---- -Label : 1 -Position : [1045.81, 272.426] -Measurements : [687.398, 106725, 1.55161, 1.27755] ---- -Label : 1 -Position : [525.824, 272.656] -Measurements : [779.155, 72012, -0.0877633, -1.51572] ---- -Label : 1 -Position : [424.758, 273.124] -Measurements : [1106.27, 250153, 0.821168, -0.349988] ---- -Label : 1 -Position : [420.864, 273.168] -Measurements : [971.07, 327912, 0.863181, -0.524252] ---- -Label : 1 -Position : [178.328, 273.213] -Measurements : [777.815, 279267, 1.22349, 0.0729725] ---- -Label : 1 -Position : [740.122, 273.634] -Measurements : [1206.5, 377291, 0.275537, -1.35118] ---- -Label : 0 -Position : [101.587, 273.676] -Measurements : [1149.28, 9386.47, -1.92092, 4.36196] ---- -Label : 1 -Position : [314.368, 273.68] -Measurements : [1408.4, 266236, -0.0165045, -1.1435] ---- -Label : 1 -Position : [746.324, 273.844] -Measurements : [1014.73, 264450, 1.02647, 0.13557] ---- -Label : 1 -Position : [921.037, 273.907] -Measurements : [1124.67, 112792, -0.058301, -1.22011] ---- -Label : 1 -Position : [422.099, 274.108] -Measurements : [1027.75, 301602, 0.795925, -0.542135] ---- -Label : 1 -Position : [313.585, 274.132] -Measurements : [1322.23, 249323, -0.0515938, -1.21853] ---- -Label : 1 -Position : [425.984, 274.192] -Measurements : [1051.8, 272227, 0.85042, -0.319709] ---- -Label : 1 -Position : [502.272, 274.192] -Measurements : [1164.56, 304728, 0.669936, -0.490368] ---- -Label : 1 -Position : [16.36, 274.216] -Measurements : [948.219, 141586, 0.406117, -0.555703] ---- -Label : 1 -Position : [742.984, 274.496] -Measurements : [1138.91, 311444, 0.65742, -0.907084] ---- -Label : 1 -Position : [432.128, 274.704] -Measurements : [956.932, 237159, 1.20648, 0.350252] ---- -Label : 1 -Position : [1069.08, 274.914] -Measurements : [1366.27, 660416, 0.487956, -1.31934] ---- -Label : 1 -Position : [1087.83, 275.463] -Measurements : [891.113, 310761, 0.837804, -0.756201] ---- -Label : 0 -Position : [90.9274, 275.472] -Measurements : [1140.01, 16565.8, -1.24683, 1.16419] ---- -Label : 1 -Position : [1069.24, 275.776] -Measurements : [1468.46, 696259, 0.31273, -1.49559] ---- -Label : 1 -Position : [317.099, 276.092] -Measurements : [1457.27, 373348, 0.161787, -0.912438] ---- -Label : 1 -Position : [174.568, 276.264] -Measurements : [1040.6, 268999, 0.436337, -1.16028] ---- -Label : 1 -Position : [1059, 276.288] -Measurements : [1128.86, 172664, 0.185102, -0.839022] ---- -Label : 1 -Position : [529.616, 276.682] -Measurements : [534.419, 52732.9, 1.64724, 1.27171] ---- -Label : 1 -Position : [316.416, 276.752] -Measurements : [1403.25, 359905, 0.222155, -0.835988] ---- -Label : 1 -Position : [170.162, 277.019] -Measurements : [1051.99, 187144, 0.503535, -0.85975] ---- -Label : 1 -Position : [427.213, 277.039] -Measurements : [850.466, 244173, 1.08429, 0.220032] ---- -Label : 1 -Position : [916.552, 277.568] -Measurements : [1408.61, 397947, 0.270215, -1.24312] ---- -Label : 1 -Position : [320.447, 278.196] -Measurements : [1471.97, 415102, 0.120275, -1.11773] ---- -Label : 1 -Position : [431.718, 278.245] -Measurements : [751.49, 200757, 1.53889, 1.33916] ---- -Label : 1 -Position : [309.754, 278.32] -Measurements : [986.378, 229596, 1.05617, 0.135274] ---- -Label : 1 -Position : [756.158, 278.327] -Measurements : [1083.21, 133860, 0.16863, -0.116669] ---- -Label : 1 -Position : [748.053, 279.364] -Measurements : [846.623, 199501, 0.97813, 0.193646] ---- -Label : 1 -Position : [458.066, 279.736] -Measurements : [931.116, 143281, 0.0806578, -1.23171] ---- -Label : 1 -Position : [458.24, 279.824] -Measurements : [931.116, 143281, 0.0806578, -1.23171] ---- -Label : 1 -Position : [1064.38, 279.893] -Measurements : [1477.24, 471231, 0.357937, -1.16676] ---- -Label : 0 -Position : [58.0083, 280.441] -Measurements : [1092.19, 4189, -1.46914, 1.92006] ---- -Label : 1 -Position : [920.136, 281.664] -Measurements : [1413.13, 448823, 0.325568, -1.03628] ---- -Label : 1 -Position : [919.335, 281.879] -Measurements : [1502.83, 404140, 0.210886, -0.979899] ---- -Label : 1 -Position : [751.2, 282.04] -Measurements : [846.636, 179486, 1.11059, 0.34977] ---- -Label : 1 -Position : [23.0543, 282.059] -Measurements : [1060.61, 148375, 0.423553, -1.28133] ---- -Label : 1 -Position : [923.619, 283.372] -Measurements : [936.111, 447133, 1.21034, 0.0298327] ---- -Label : 1 -Position : [320, 283.408] -Measurements : [1223.09, 319019, 0.394555, -1.04137] ---- -Label : 1 -Position : [24.04, 283.944] -Measurements : [1109.57, 185013, 0.71294, -0.317033] ---- -Label : 1 -Position : [315.997, 284.254] -Measurements : [811.549, 105376, 1.51785, 2.92169] ---- -Label : 1 -Position : [456.405, 284.475] -Measurements : [636.738, 126317, 1.13706, -0.175113] ---- -Label : 1 -Position : [329.344, 284.507] -Measurements : [1232.13, 472271, 0.126069, -1.51784] ---- -Label : 0 -Position : [99.7498, 285.182] -Measurements : [1137.23, 5584.55, -1.27538, 1.00551] ---- -Label : 0 -Position : [134.817, 285.219] -Measurements : [881.613, 33029.8, 0.190826, -0.832184] ---- -Label : 1 -Position : [920.04, 285.427] -Measurements : [1098.97, 582074, 0.937742, -0.694146] ---- -Label : 1 -Position : [319.756, 285.975] -Measurements : [1062.69, 245338, 0.659867, -0.730357] ---- -Label : 1 -Position : [25.3173, 286.576] -Measurements : [1390.7, 392585, 0.475601, -0.862898] ---- -Label : 1 -Position : [326.144, 286.992] -Measurements : [1657.95, 321479, -0.262079, -0.556645] ---- -Label : 1 -Position : [1266.57, 287.599] -Measurements : [750.605, 328821, 1.18861, 0.297508] ---- -Label : 0 -Position : [82.092, 287.773] -Measurements : [1124.65, 5412.04, -0.83463, 2.52339] ---- -Label : 1 -Position : [327.007, 288.245] -Measurements : [1677.36, 315908, -0.263151, -0.565996] ---- -Label : 0 -Position : [53.4166, 288.46] -Measurements : [1084.23, 3188.59, -1.87187, 7.62871] ---- -Label : 0 -Position : [88.6119, 289.825] -Measurements : [1087.09, 18243.3, -2.03716, 4.80537] ---- -Label : 1 -Position : [241.64, 290.6] -Measurements : [1209.43, 504772, 0.448527, -1.37282] ---- -Label : 1 -Position : [324.126, 291.315] -Measurements : [1566.78, 298983, -0.0161348, -0.958735] ---- -Label : 1 -Position : [328.704, 291.6] -Measurements : [1633.21, 369999, -0.306372, -0.837135] ---- -Label : 1 -Position : [1271.2, 291.84] -Measurements : [1374.78, 214062, 0.214429, -0.478408] ---- -Label : 1 -Position : [302.592, 292.112] -Measurements : [1169.63, 179053, 0.71615, 0.337299] ---- -Label : 1 -Position : [950.114, 292.328] -Measurements : [1680.49, 291601, 1.32211, 0.949927] ---- -Label : 1 -Position : [1301.92, 292.352] -Measurements : [955.762, 370696, 0.795185, -0.645999] ---- -Label : 1 -Position : [1304.67, 292.855] -Measurements : [979.718, 336644, 0.835387, -0.556105] ---- -Label : 1 -Position : [303.353, 292.861] -Measurements : [1265.01, 181410, 0.710102, 0.106154] ---- -Label : 1 -Position : [245.825, 293.012] -Measurements : [919.762, 436385, 1.24983, 0.0658546] ---- -Label : 0 -Position : [107.608, 293.118] -Measurements : [1138.94, 1207.44, 0.129752, 0.0825713] ---- -Label : 1 -Position : [18.3898, 293.199] -Measurements : [2086.84, 553354, -0.499861, -0.93361] ---- -Label : 0 -Position : [103.183, 293.283] -Measurements : [1152.1, 969.171, 0.477588, 0.25307] ---- -Label : 1 -Position : [18.408, 293.672] -Measurements : [2086.84, 553354, -0.499861, -0.93361] ---- -Label : 0 -Position : [88.8033, 294.394] -Measurements : [1098.51, 11313.5, -3.58635, 13.8647] ---- -Label : 1 -Position : [306.176, 294.672] -Measurements : [1590.16, 252463, -0.0388323, -0.731191] ---- -Label : 1 -Position : [237.841, 294.969] -Measurements : [870.203, 441129, 1.23734, -0.0204835] ---- -Label : 1 -Position : [1306.59, 295.279] -Measurements : [658.351, 211218, 2.04249, 3.60718] ---- -Label : 0 -Position : [60.9388, 296.015] -Measurements : [1116.95, 1229.84, -1.56664, 3.49758] ---- -Label : 1 -Position : [299.216, 296.028] -Measurements : [900.519, 209900, 0.852429, -0.26981] ---- -Label : 1 -Position : [325.213, 296.53] -Measurements : [1405.13, 297875, 0.283657, -0.866397] ---- -Label : 1 -Position : [1275.42, 296.595] -Measurements : [1302.59, 305126, 0.494154, -0.588778] ---- -Label : 1 -Position : [1266.34, 296.68] -Measurements : [1298.97, 495857, 0.221354, -1.40382] ---- -Label : 1 -Position : [309.328, 296.733] -Measurements : [1853.68, 244272, -0.47485, -0.211116] ---- -Label : 1 -Position : [307.33, 296.858] -Measurements : [1784.36, 267463, -0.148655, -0.787287] ---- -Label : 1 -Position : [949.856, 296.888] -Measurements : [1770.62, 407193, 0.170323, -0.727444] ---- -Label : 1 -Position : [309.656, 297.175] -Measurements : [1901.04, 232764, -0.380573, -0.113782] ---- -Label : 1 -Position : [920.403, 297.197] -Measurements : [871.386, 96826.8, 0.503393, 0.0888838] ---- -Label : 1 -Position : [331.776, 297.232] -Measurements : [1420.68, 292436, -0.352953, -1.10581] ---- -Label : 1 -Position : [946.274, 297.246] -Measurements : [1599.99, 398568, -0.00129816, -0.766958] ---- -Label : 1 -Position : [251.368, 297.256] -Measurements : [993.275, 297765, 0.849048, -0.309308] ---- -Label : 1 -Position : [334.915, 297.361] -Measurements : [1084.38, 351454, 0.426584, -1.24256] ---- -Label : 1 -Position : [1274.27, 297.984] -Measurements : [1332.96, 331269, 0.468437, -0.752828] ---- -Label : 1 -Position : [22.0759, 297.999] -Measurements : [1652.09, 1.02569e+06, 0.211875, -1.65132] ---- -Label : 1 -Position : [311.296, 298.256] -Measurements : [1904.36, 261410, -0.702658, 0.32137] ---- -Label : 1 -Position : [1279.21, 298.307] -Measurements : [764.869, 140157, 0.896752, -0.579133] ---- -Label : 0 -Position : [69.7364, 298.37] -Measurements : [1089.44, 758.82, 0.398235, 0.174431] ---- -Label : 1 -Position : [917.303, 298.463] -Measurements : [897.027, 103491, 0.573066, 0.103263] ---- -Label : 1 -Position : [760.643, 298.511] -Measurements : [1266.55, 482232, 0.14761, -1.41716] ---- -Label : 1 -Position : [249.713, 298.849] -Measurements : [923.881, 333406, 0.947606, -0.355207] ---- -Label : 1 -Position : [919.136, 298.936] -Measurements : [946.786, 100771, 0.478163, -0.0212239] ---- -Label : 1 -Position : [757.222, 299.487] -Measurements : [1173.88, 493903, 0.320998, -1.36487] ---- -Label : 1 -Position : [248.122, 299.506] -Measurements : [855.49, 348116, 1.14937, -0.0696434] ---- -Label : 1 -Position : [317.066, 300.764] -Measurements : [1403.29, 280627, 0.168902, -1.20865] ---- -Label : 1 -Position : [328.18, 300.867] -Measurements : [1576.27, 251724, -0.352038, -0.661689] ---- -Label : 1 -Position : [760.928, 300.984] -Measurements : [1313.81, 416547, 0.211536, -1.34137] ---- -Label : 0 -Position : [83.0857, 301.136] -Measurements : [1035.29, 17717.4, -1.12875, -0.0603737] ---- -Label : 1 -Position : [313.574, 301.201] -Measurements : [1721.09, 342123, -0.319195, -0.541381] ---- -Label : 1 -Position : [915.915, 301.724] -Measurements : [788.007, 96760.5, 0.517847, -0.515003] ---- -Label : 1 -Position : [314.88, 301.84] -Measurements : [1661.9, 323981, -0.126379, -0.61667] ---- -Label : 1 -Position : [312.988, 301.877] -Measurements : [1741.87, 349458, -0.422613, -0.414977] ---- -Label : 1 -Position : [922.947, 302.058] -Measurements : [842.803, 140645, 0.708456, -0.642811] ---- -Label : 1 -Position : [863.369, 302.592] -Measurements : [1190.46, 653707, 0.437242, -1.42451] ---- -Label : 0 -Position : [73.1564, 302.927] -Measurements : [1063.72, 1571.58, -1.30126, 2.84423] ---- -Label : 1 -Position : [327.977, 303.362] -Measurements : [1374.89, 362764, -0.025753, -1.1578] ---- -Label : 1 -Position : [920.672, 304.056] -Measurements : [796.024, 135541, 0.988091, -0.0791952] ---- -Label : 1 -Position : [329.562, 304.413] -Measurements : [1460.62, 367780, -0.306666, -0.969825] ---- -Label : 1 -Position : [860.914, 304.582] -Measurements : [1465.11, 534631, -0.0360755, -1.30213] ---- -Label : 1 -Position : [858.72, 305.08] -Measurements : [1509.21, 378380, 0.120227, -0.875933] ---- -Label : 0 -Position : [141.946, 305.672] -Measurements : [1002.69, 8849.39, -0.255284, -1.37972] ---- -Label : 1 -Position : [332.288, 305.936] -Measurements : [1537.35, 457147, -0.304897, -1.12936] ---- -Label : 0 -Position : [73.7017, 307.667] -Measurements : [1036.37, 4929.06, -2.51853, 7.21282] ---- -Label : 1 -Position : [274.663, 307.725] -Measurements : [1783.92, 511878, -0.317551, -1.27095] ---- -Label : 1 -Position : [318.464, 308.496] -Measurements : [1011.89, 221130, 0.296984, -0.978957] ---- -Label : 0 -Position : [97.176, 309.451] -Measurements : [1058.1, 69435.8, 1.18385, 3.79824] ---- -Label : 1 -Position : [852.789, 310.726] -Measurements : [937.268, 343837, 1.06517, 0.251392] ---- -Label : 1 -Position : [320.521, 310.807] -Measurements : [841.622, 155065, 0.508284, -1.18065] ---- -Label : 1 -Position : [278.504, 311.08] -Measurements : [1513.87, 542416, -0.160913, -1.29831] ---- -Label : 1 -Position : [855.136, 311.224] -Measurements : [965.681, 422064, 1.06772, 0.0207412] ---- -Label : 1 -Position : [180.397, 311.562] -Measurements : [878.252, 502288, 1.09733, -0.399046] ---- -Label : 1 -Position : [317.416, 313.271] -Measurements : [676.317, 150744, 1.09745, -0.225275] ---- -Label : 1 -Position : [282.503, 313.562] -Measurements : [1098.62, 561433, 0.660325, -1.02543] ---- -Label : 0 -Position : [107.163, 313.761] -Measurements : [1136.26, 34082.8, 2.67994, 10.7748] ---- -Label : 0 -Position : [101.056, 313.921] -Measurements : [1005.03, 34591.4, -1.2708, 0.688471] ---- -Label : 1 -Position : [1292.36, 314.111] -Measurements : [1329.83, 361625, 0.536734, 0.451267] ---- -Label : 1 -Position : [851.409, 315.023] -Measurements : [518.923, 65611, 3.04831, 8.99739] ---- -Label : 1 -Position : [171.161, 315.662] -Measurements : [1166.81, 347315, 0.114413, -1.49268] ---- -Label : 1 -Position : [175.592, 315.688] -Measurements : [1324.94, 428503, 0.0213319, -1.40666] ---- -Label : 0 -Position : [126.002, 316.031] -Measurements : [1013.5, 6676.78, -0.423331, -0.903568] ---- -Label : 1 -Position : [1289.13, 317.056] -Measurements : [1501.1, 375295, 0.550041, -0.423567] ---- -Label : 1 -Position : [36.6487, 318.64] -Measurements : [892.864, 160753, 0.504941, 0.140527] ---- -Label : 0 -Position : [125.931, 319.107] -Measurements : [1040.87, 4890.14, -0.827509, -0.402262] ---- -Label : 1 -Position : [30.0153, 320.214] -Measurements : [748.116, 203575, 0.936712, 0.052045] ---- -Label : 1 -Position : [1287.55, 320.754] -Measurements : [1689.01, 354636, 0.0633067, -0.810724] ---- -Label : 1 -Position : [1297.4, 321.937] -Measurements : [1304.25, 118013, 0.104143, -0.45438] ---- -Label : 1 -Position : [1293.74, 322.688] -Measurements : [1461.73, 260869, 0.75782, 0.380715] ---- -Label : 1 -Position : [32.232, 323.36] -Measurements : [1124.61, 194880, 0.0505048, -0.763606] ---- -Label : 0 -Position : [76.8648, 324.006] -Measurements : [1036.07, 2884.28, -1.72646, 3.59258] ---- -Label : 1 -Position : [1298.34, 324.213] -Measurements : [1342.83, 161102, 0.218354, -0.630706] ---- -Label : 1 -Position : [897.156, 324.979] -Measurements : [801.316, 273652, 1.11685, 0.472567] ---- -Label : 1 -Position : [30.0511, 325.259] -Measurements : [1221.26, 161346, -0.149396, -0.575983] ---- -Label : 1 -Position : [898.656, 327.096] -Measurements : [900.46, 295303, 0.911096, -0.1566] ---- -Label : 1 -Position : [1295.33, 327.368] -Measurements : [1534.61, 306883, 0.337662, -0.275422] ---- -Label : 1 -Position : [28.136, 328.992] -Measurements : [1137.4, 208439, -0.176804, -1.21257] ---- -Label : 1 -Position : [1299.88, 329.856] -Measurements : [1868.54, 474080, 0.300947, -0.990441] ---- -Label : 1 -Position : [1295.53, 330.382] -Measurements : [1676.95, 511605, 0.300156, -0.778508] ---- -Label : 1 -Position : [896.2, 331.308] -Measurements : [745.264, 314389, 1.45924, 0.790869] ---- -Label : 1 -Position : [31.393, 332.068] -Measurements : [1478.44, 305886, 0.15462, -0.427132] ---- -Label : 1 -Position : [24.995, 332.951] -Measurements : [1004.96, 319137, 0.450735, -1.16757] ---- -Label : 1 -Position : [35.304, 333.088] -Measurements : [1513.98, 266411, 0.837431, -0.169678] ---- -Label : 1 -Position : [819.585, 335.624] -Measurements : [965.229, 172634, 0.236331, -0.664568] ---- -Label : 1 -Position : [32.9505, 335.688] -Measurements : [1660.38, 405910, -0.0888662, -1.11764] ---- -Label : 1 -Position : [388.574, 338.077] -Measurements : [1447.9, 1.08173e+06, 0.354629, -1.54885] ---- -Label : 1 -Position : [379.864, 339.331] -Measurements : [1453.77, 583560, 0.233993, -1.32254] ---- -Label : 1 -Position : [30.184, 339.744] -Measurements : [1722.53, 324170, -0.15393, -0.845581] ---- -Label : 1 -Position : [823.904, 339.896] -Measurements : [1025.37, 218483, 0.41484, -1.05394] ---- -Label : 1 -Position : [34.9349, 340.373] -Measurements : [1653.74, 352450, 0.173884, -1.07396] ---- -Label : 1 -Position : [384.512, 341.016] -Measurements : [1824.12, 664849, -0.0639393, -1.36818] ---- -Label : 1 -Position : [828.343, 341.341] -Measurements : [759.314, 234096, 1.27466, 0.175611] ---- -Label : 1 -Position : [31.5786, 342.049] -Measurements : [1783.36, 255148, -0.283535, -0.372619] ---- -Label : 1 -Position : [28.3428, 345.376] -Measurements : [1622.15, 158889, -0.389945, -0.751115] ---- -Label : 0 -Position : [128.417, 347.494] -Measurements : [966.241, 9470.65, -0.427983, -0.896549] ---- -Label : 1 -Position : [27.1152, 347.569] -Measurements : [1385.11, 243190, -0.218321, -1.37813] ---- -Label : 1 -Position : [28.136, 348.448] -Measurements : [1354.97, 291130, -0.24537, -1.52809] ---- -Label : 1 -Position : [225.383, 351.282] -Measurements : [1295.44, 543542, 0.426287, -1.28963] ---- -Label : 0 -Position : [116.786, 352.671] -Measurements : [1058.12, 12116.4, -2.85104, 9.29506] ---- -Label : 0 -Position : [75.7368, 354.428] -Measurements : [1166.54, 15632.4, 0.894411, 0.616058] ---- -Label : 1 -Position : [248.515, 354.812] -Measurements : [1673.76, 799735, -0.145397, -1.43538] ---- -Label : 1 -Position : [494.684, 354.912] -Measurements : [1102.73, 384686, 0.55021, -0.81691] ---- -Label : 1 -Position : [224.232, 355.104] -Measurements : [1503.57, 547230, 0.0527112, -1.52581] ---- -Label : 1 -Position : [1127.2, 355.598] -Measurements : [2074.99, 518193, -0.127428, -0.528294] ---- -Label : 1 -Position : [195.826, 356.224] -Measurements : [1082.07, 447669, 0.668964, -1.10361] ---- -Label : 0 -Position : [116.528, 356.833] -Measurements : [1029.76, 17913.7, -1.57809, 2.68615] ---- -Label : 1 -Position : [491.52, 356.84] -Measurements : [1473.24, 249410, 0.051303, -0.701314] ---- -Label : 1 -Position : [32.7376, 358.172] -Measurements : [651.011, 91448.5, 1.12431, 0.166156] ---- -Label : 1 -Position : [250.856, 358.176] -Measurements : [1872.36, 643647, -0.398515, -1.24] ---- -Label : 1 -Position : [238.575, 358.399] -Measurements : [971.085, 358901, 0.319499, -1.43387] ---- -Label : 1 -Position : [187.979, 358.403] -Measurements : [978.642, 459926, 0.606149, -1.29002] ---- -Label : 1 -Position : [241.14, 359.299] -Measurements : [1337.75, 254469, -0.313284, -0.814633] ---- -Label : 1 -Position : [228.903, 359.66] -Measurements : [943.164, 542799, 1.27245, 0.224254] ---- -Label : 1 -Position : [191.976, 360.224] -Measurements : [1198.38, 403389, 0.441222, -1.23737] ---- -Label : 1 -Position : [1130.68, 360.296] -Measurements : [2754.45, 546386, -0.828121, -0.255403] ---- -Label : 1 -Position : [39.073, 360.72] -Measurements : [801.782, 71520.4, 0.527475, -0.79077] ---- -Label : 1 -Position : [36.328, 360.736] -Measurements : [740.09, 76900.7, 0.948317, -0.264433] ---- -Label : 1 -Position : [207.336, 360.736] -Measurements : [1083.65, 351551, 0.59436, -0.972166] ---- -Label : 1 -Position : [240.616, 360.736] -Measurements : [1279.16, 259201, -0.336081, -0.905844] ---- -Label : 1 -Position : [209.926, 360.996] -Measurements : [1096.49, 335651, 0.644743, -0.93957] ---- -Label : 1 -Position : [255.149, 361.25] -Measurements : [1025.33, 820394, 1.13797, -0.401646] ---- -Label : 1 -Position : [492.046, 361.688] -Measurements : [1324.93, 304446, 0.359948, -0.787004] ---- -Label : 1 -Position : [202.507, 362.779] -Measurements : [758.795, 326023, 1.61784, 1.14283] ---- -Label : 1 -Position : [1125.69, 364.397] -Measurements : [1748.95, 385271, 1.11641, 0.443763] ---- -Label : 0 -Position : [81.9451, 364.568] -Measurements : [1063.34, 5854.01, 1.05216, 1.8461] ---- -Label : 1 -Position : [1178.06, 365.985] -Measurements : [886.928, 465178, 1.2481, 0.126126] ---- -Label : 1 -Position : [273.896, 366.368] -Measurements : [1143.48, 374598, 0.659708, -0.333251] ---- -Label : 1 -Position : [284.648, 367.392] -Measurements : [954.907, 45656.6, -0.231089, -0.665454] ---- -Label : 1 -Position : [1173.93, 367.744] -Measurements : [1157.86, 403720, 0.581964, -0.807707] ---- -Label : 1 -Position : [525.596, 367.949] -Measurements : [783.268, 364467, 1.24925, 0.334774] ---- -Label : 1 -Position : [539.152, 368.117] -Measurements : [1193.28, 631823, 0.900507, -0.490804] ---- -Label : 1 -Position : [278.747, 369.105] -Measurements : [1012.5, 237941, 1.47042, 2.26681] ---- -Label : 1 -Position : [520.393, 369.211] -Measurements : [1048.66, 416895, 0.492326, -1.15095] ---- -Label : 1 -Position : [277.177, 370.136] -Measurements : [945.034, 189340, 1.48244, 2.90752] ---- -Label : 1 -Position : [1171.98, 370.626] -Measurements : [931.69, 433750, 1.15905, -0.0595133] ---- -Label : 1 -Position : [534.528, 370.664] -Measurements : [1029.14, 364186, 1.57702, 2.36234] ---- -Label : 1 -Position : [287.482, 371.23] -Measurements : [948.184, 59057.7, -0.36291, -0.629689] ---- -Label : 1 -Position : [284.838, 372.084] -Measurements : [899.306, 58401.6, -0.24318, -0.633071] ---- -Label : 1 -Position : [524.288, 372.2] -Measurements : [1197.62, 302897, 0.49929, -1.03499] ---- -Label : 0 -Position : [77.9561, 372.201] -Measurements : [1079.98, 4207.35, 1.0146, 1.71099] ---- -Label : 1 -Position : [538.046, 372.35] -Measurements : [988.993, 339383, 0.971352, -0.151821] ---- -Label : 0 -Position : [150.227, 372.757] -Measurements : [1229.14, 32996.4, 0.494297, -0.745172] ---- -Label : 1 -Position : [293.1, 373.368] -Measurements : [1033.2, 93170.5, -0.255542, -1.0312] ---- -Label : 1 -Position : [293.376, 373.784] -Measurements : [1033.2, 93170.5, -0.255542, -1.0312] ---- -Label : 1 -Position : [289.037, 374.518] -Measurements : [1029.61, 71054.5, -0.145656, -0.636408] ---- -Label : 0 -Position : [84.4049, 374.771] -Measurements : [1094.08, 3891.08, 1.58465, 3.49479] ---- -Label : 0 -Position : [120.432, 375.219] -Measurements : [1059.57, 5005.6, -1.1571, 1.0382] ---- -Label : 0 -Position : [78.0707, 375.487] -Measurements : [1096, 2134.87, 0.634839, 0.533664] ---- -Label : 0 -Position : [100.413, 375.896] -Measurements : [1008.28, 2170.33, -0.190925, 0.356895] ---- -Label : 0 -Position : [76.9407, 376.385] -Measurements : [1086.16, 2849, 0.236747, 0.129677] ---- -Label : 0 -Position : [130.29, 377.145] -Measurements : [803.267, 33189.8, 0.0741495, -1.07347] ---- -Label : 0 -Position : [92.1529, 377.833] -Measurements : [1097.99, 23128, 1.60171, 2.06603] ---- -Label : 1 -Position : [342.528, 377.88] -Measurements : [2102.24, 570240, -0.402955, -0.962667] ---- -Label : 1 -Position : [339.165, 379.291] -Measurements : [1648.96, 1.05003e+06, 0.00722861, -1.66277] ---- -Label : 1 -Position : [543.092, 379.536] -Measurements : [957.537, 484110, 1.15973, -0.240661] ---- -Label : 1 -Position : [341.942, 380.04] -Measurements : [2050.94, 955353, -0.509036, -1.19656] ---- -Label : 1 -Position : [302.487, 380.29] -Measurements : [1173.98, 306768, 0.517941, -0.576989] ---- -Label : 1 -Position : [303.104, 380.44] -Measurements : [1196.92, 304257, 0.46022, -0.652252] ---- -Label : 1 -Position : [538.112, 380.904] -Measurements : [1462.03, 477712, -0.0318375, -1.56297] ---- -Label : 1 -Position : [306.948, 381.111] -Measurements : [1084.41, 333473, 0.793099, -0.507717] ---- -Label : 0 -Position : [88.715, 381.723] -Measurements : [1182.13, 22355.7, 0.821427, 0.160565] ---- -Label : 0 -Position : [83.9033, 381.786] -Measurements : [1159.53, 12281.8, 1.15369, 0.567158] ---- -Label : 1 -Position : [306.29, 382.778] -Measurements : [1067.05, 332709, 0.879665, -0.402924] ---- -Label : 0 -Position : [128.7, 383.382] -Measurements : [964.54, 14395.5, -0.909606, 0.452174] ---- -Label : 1 -Position : [307.712, 384.024] -Measurements : [974.267, 307598, 1.31357, 0.6633] ---- -Label : 1 -Position : [542.991, 384.142] -Measurements : [800.182, 341701, 1.78415, 1.97101] ---- -Label : 1 -Position : [33.768, 384.288] -Measurements : [895.824, 389002, 1.04428, 0.136469] ---- -Label : 1 -Position : [536.073, 384.29] -Measurements : [1412.41, 447854, 0.018311, -1.41854] ---- -Label : 1 -Position : [300.132, 384.395] -Measurements : [1134.16, 182243, 0.36602, -0.510284] ---- -Label : 0 -Position : [158.793, 384.688] -Measurements : [1111.14, 3448.12, 1.253, 2.86972] ---- -Label : 1 -Position : [531.32, 385.221] -Measurements : [1307.26, 334628, 0.361351, -1.09807] ---- -Label : 1 -Position : [37.3792, 385.999] -Measurements : [1415.47, 544143, 0.291589, -1.07497] ---- -Label : 0 -Position : [139.365, 386.319] -Measurements : [947.557, 10998, -0.0164515, 0.296629] ---- -Label : 1 -Position : [535.04, 386.536] -Measurements : [1242.39, 374640, 0.38586, -1.17141] ---- -Label : 1 -Position : [36.8771, 386.802] -Measurements : [1558.57, 639819, 0.534264, -0.486779] ---- -Label : 1 -Position : [41.448, 387.872] -Measurements : [1798.25, 571746, 0.245078, -0.362471] ---- -Label : 1 -Position : [38.4414, 389.267] -Measurements : [1888.62, 689619, 0.227818, -0.778128] ---- -Label : 0 -Position : [91.5758, 389.307] -Measurements : [1046.18, 19292.2, -1.00928, 1.27428] ---- -Label : 1 -Position : [42.6246, 391.71] -Measurements : [1499.46, 652634, 0.552446, -0.592604] ---- -Label : 1 -Position : [723.528, 394.24] -Measurements : [1293.89, 534656, 0.679288, -0.906691] ---- -Label : 1 -Position : [728.358, 394.385] -Measurements : [913.576, 452985, 1.67101, 1.66701] ---- -Label : 1 -Position : [540.672, 394.728] -Measurements : [1036.92, 192689, 0.928732, 0.0844256] ---- -Label : 0 -Position : [120.329, 394.979] -Measurements : [1030.67, 2088.07, -0.00292882, 0.536204] ---- -Label : 1 -Position : [53.7728, 396.652] -Measurements : [1747.54, 297395, -0.0596843, -0.46686] ---- -Label : 1 -Position : [535.693, 396.687] -Measurements : [797.866, 72402.5, 0.441314, -0.190174] ---- -Label : 1 -Position : [541.504, 397.342] -Measurements : [889.472, 163983, 1.30112, 1.33362] ---- -Label : 1 -Position : [350.908, 398.532] -Measurements : [711.83, 191618, 1.49223, 1.16671] ---- -Label : 1 -Position : [724.205, 398.75] -Measurements : [914.407, 561175, 1.41964, 0.668516] ---- -Label : 1 -Position : [49.64, 399.136] -Measurements : [1760.79, 435440, -0.108817, -1.11199] ---- -Label : 0 -Position : [154.43, 402.69] -Measurements : [1092.67, 22119.1, -1.14498, 1.42765] ---- -Label : 1 -Position : [353.28, 402.968] -Measurements : [774.807, 170130, 1.42406, 1.2049] ---- -Label : 1 -Position : [51.6486, 403.384] -Measurements : [1166.88, 578105, 0.863849, -0.616763] ---- -Label : 0 -Position : [117.844, 404.396] -Measurements : [1114.43, 17962.6, -0.886597, 1.18863] ---- -Label : 1 -Position : [62.6858, 404.419] -Measurements : [1178.35, 195504, -0.197495, -1.1333] ---- -Label : 1 -Position : [797.47, 406.143] -Measurements : [507.064, 68048.2, 2.42962, 5.13555] ---- -Label : 1 -Position : [916.831, 406.245] -Measurements : [762.472, 180066, 1.11748, 0.000988982] ---- -Label : 1 -Position : [353.501, 407.75] -Measurements : [553.966, 92119.4, 2.7191, 8.09168] ---- -Label : 1 -Position : [62.44, 407.84] -Measurements : [1245.64, 169765, -0.405401, -0.676118] ---- -Label : 1 -Position : [778.594, 407.894] -Measurements : [837.78, 215531, 0.113253, -1.73944] ---- -Label : 1 -Position : [915.08, 408.576] -Measurements : [807.777, 176175, 0.957463, -0.240786] ---- -Label : 1 -Position : [782.408, 409.088] -Measurements : [933.179, 138430, -0.216412, -1.48188] ---- -Label : 1 -Position : [1221.77, 410.184] -Measurements : [622.695, 204200, 2.32691, 4.57398] ---- -Label : 1 -Position : [909.181, 410.456] -Measurements : [791.064, 183726, 0.602742, -0.857243] ---- -Label : 1 -Position : [909.936, 410.463] -Measurements : [791.064, 183726, 0.602742, -0.857243] ---- -Label : 1 -Position : [60.9822, 410.709] -Measurements : [1115.57, 283113, 0.167235, -0.842756] ---- -Label : 1 -Position : [1217.52, 410.993] -Measurements : [873.734, 255944, 1.00293, 0.00975804] ---- -Label : 1 -Position : [792.648, 411.136] -Measurements : [809.283, 112909, 0.610934, -0.836807] ---- -Label : 1 -Position : [797.575, 411.37] -Measurements : [646.996, 115608, 1.21774, 0.226855] ---- -Label : 1 -Position : [68.061, 411.652] -Measurements : [1527.87, 247014, 0.0294026, -0.994186] ---- -Label : 1 -Position : [910.294, 412.547] -Measurements : [877.468, 169613, 0.63092, -0.651071] ---- -Label : 1 -Position : [909.448, 413.184] -Measurements : [801.535, 146704, 0.620722, -0.356229] ---- -Label : 1 -Position : [766.03, 413.862] -Measurements : [1172.6, 420361, 0.143245, -1.58112] ---- -Label : 1 -Position : [786.791, 413.942] -Measurements : [856.077, 110795, 0.25185, -1.26631] ---- -Label : 1 -Position : [1216.94, 414.368] -Measurements : [899.022, 240505, 1.06321, 0.0829718] ---- -Label : 1 -Position : [813.192, 415.232] -Measurements : [1239.04, 426480, 0.267245, -1.28562] ---- -Label : 1 -Position : [930.922, 415.586] -Measurements : [685.414, 204379, 1.13662, -0.232027] ---- -Label : 1 -Position : [768.166, 415.721] -Measurements : [1317.51, 403060, -0.172306, -1.51637] ---- -Label : 1 -Position : [873.984, 415.872] -Measurements : [590.38, 105650, 1.47544, 0.897345] ---- -Label : 1 -Position : [65.512, 416.032] -Measurements : [1700.58, 290380, -0.00680515, -0.94794] ---- -Label : 1 -Position : [768.584, 416.256] -Measurements : [1324.42, 393554, -0.179794, -1.47335] ---- -Label : 1 -Position : [893.119, 416.688] -Measurements : [939.527, 283659, 0.743562, -0.525585] ---- -Label : 1 -Position : [895.112, 417.28] -Measurements : [1010.12, 246797, 0.683016, -0.43508] ---- -Label : 1 -Position : [898.12, 417.804] -Measurements : [925.398, 290458, 0.789421, -0.527365] ---- -Label : 1 -Position : [74.6812, 419.043] -Measurements : [2073.43, 401342, -0.473729, -0.575139] ---- -Label : 1 -Position : [814.578, 419.262] -Measurements : [1315.69, 325948, 0.0345118, -1.23242] ---- -Label : 1 -Position : [871.048, 419.328] -Measurements : [733.64, 129512, 0.892418, -0.248229] ---- -Label : 1 -Position : [933, 419.328] -Measurements : [809.058, 194305, 0.70812, -0.886597] ---- -Label : 1 -Position : [812.492, 419.453] -Measurements : [1345.87, 287357, 0.113904, -1.18225] ---- -Label : 1 -Position : [839.957, 419.915] -Measurements : [694.174, 213573, 1.54485, 1.61826] ---- -Label : 1 -Position : [929.023, 419.974] -Measurements : [753.367, 175046, 0.94208, -0.369347] ---- -Label : 1 -Position : [873.528, 420.529] -Measurements : [704.959, 134564, 1.02537, -0.144874] ---- -Label : 1 -Position : [61.7148, 420.762] -Measurements : [1297.15, 418280, 0.0260362, -1.39948] ---- -Label : 1 -Position : [67.1091, 421.524] -Measurements : [2090.08, 373632, -0.210323, -0.807548] ---- -Label : 1 -Position : [752.214, 421.931] -Measurements : [537.312, 68072.8, 2.30821, 5.25888] ---- -Label : 1 -Position : [70.12, 422.4] -Measurements : [2191.55, 339292, -0.23023, -0.915324] ---- -Label : 1 -Position : [937.318, 423.034] -Measurements : [695.305, 185857, 1.32909, 0.562202] ---- -Label : 1 -Position : [837.256, 423.936] -Measurements : [925.997, 238192, 1.06973, 0.37556] ---- -Label : 1 -Position : [832.613, 425.314] -Measurements : [875.074, 270150, 1.01821, 0.275156] ---- -Label : 1 -Position : [851.894, 425.835] -Measurements : [832.761, 248294, 0.902637, -0.383226] ---- -Label : 1 -Position : [749.64, 425.984] -Measurements : [948.649, 228955, 0.59698, -0.368217] ---- -Label : 1 -Position : [932.488, 425.984] -Measurements : [900.822, 204635, 0.88108, -0.337504] ---- -Label : 1 -Position : [849.053, 426.665] -Measurements : [897.195, 255519, 0.571282, -0.869123] ---- -Label : 1 -Position : [76.264, 428.544] -Measurements : [2078.04, 544048, -0.674, -0.757565] ---- -Label : 1 -Position : [932.095, 428.584] -Measurements : [975.434, 208625, 0.782362, -0.425091] ---- -Label : 1 -Position : [934.89, 428.811] -Measurements : [1028.9, 241061, 0.446194, -0.928905] ---- -Label : 1 -Position : [849.032, 429.056] -Measurements : [1000.48, 196126, 0.467166, -0.538497] ---- -Label : 1 -Position : [77.6479, 429.295] -Measurements : [1910.85, 706300, -0.350016, -1.35219] ---- -Label : 1 -Position : [746.676, 429.75] -Measurements : [820.053, 132976, 0.335664, -1.09905] ---- -Label : 1 -Position : [936.584, 430.08] -Measurements : [1140.85, 249119, 0.263103, -1.2232] ---- -Label : 1 -Position : [928.885, 430.352] -Measurements : [944.775, 82908.1, 2.11441, 4.56546] ---- -Label : 1 -Position : [738.527, 430.575] -Measurements : [734.847, 139994, 0.397738, -1.51246] ---- -Label : 1 -Position : [74.5684, 432.482] -Measurements : [1827.99, 720857, -0.278373, -1.50905] ---- -Label : 1 -Position : [737.864, 435.2] -Measurements : [1140.51, 105335, -0.643868, 0.011529] ---- -Label : 1 -Position : [672.865, 435.417] -Measurements : [1248.64, 112865, -0.6497, -0.0570891] ---- -Label : 1 -Position : [682.741, 436.392] -Measurements : [898.573, 104883, 0.0898886, -1.54981] ---- -Label : 1 -Position : [656.46, 436.438] -Measurements : [1432.53, 206091, 0.0160037, -0.296242] ---- -Label : 1 -Position : [937.347, 437.214] -Measurements : [1049.51, 321651, 0.84056, -0.508625] ---- -Label : 1 -Position : [658.622, 437.368] -Measurements : [1482.82, 215613, -0.027055, -0.532193] ---- -Label : 1 -Position : [640.604, 437.684] -Measurements : [1082.08, 153135, -0.222277, -0.77468] ---- -Label : 1 -Position : [734.722, 437.912] -Measurements : [1299.21, 171901, 0.266516, -0.402334] ---- -Label : 1 -Position : [937.457, 437.972] -Measurements : [1049.51, 321651, 0.84056, -0.508625] ---- -Label : 1 -Position : [939.144, 438.272] -Measurements : [942.2, 368227, 0.999028, -0.387843] ---- -Label : 1 -Position : [672.84, 439.808] -Measurements : [1341.3, 50934.4, -0.237102, -0.109797] ---- -Label : 1 -Position : [731.47, 440.295] -Measurements : [1543.35, 192591, -0.541051, -0.550148] ---- -Label : 1 -Position : [680.008, 440.832] -Measurements : [1002.36, 81505.6, -0.463097, -0.845906] ---- -Label : 1 -Position : [648.203, 441.225] -Measurements : [1456.05, 76576, -0.301807, -0.307563] ---- -Label : 1 -Position : [653.384, 441.344] -Measurements : [1440.78, 201937, 0.232302, -0.554821] ---- -Label : 1 -Position : [663.112, 441.344] -Measurements : [1519.93, 156782, -0.36463, -0.306364] ---- -Label : 1 -Position : [731.351, 441.687] -Measurements : [1609.03, 156861, -0.587035, -0.233024] ---- -Label : 1 -Position : [645.192, 442.368] -Measurements : [1377.53, 56943.5, -0.341322, -0.169495] ---- -Label : 1 -Position : [669.538, 443.666] -Measurements : [1487.23, 111575, -0.186545, 0.397046] ---- -Label : 1 -Position : [735.304, 443.904] -Measurements : [1497.63, 133602, -0.206007, -0.360222] ---- -Label : 1 -Position : [664.384, 444.177] -Measurements : [1439.95, 157756, -0.514591, -0.0999737] ---- -Label : 1 -Position : [110.414, 444.201] -Measurements : [1226.8, 349611, 0.349913, -1.02005] ---- -Label : 1 -Position : [952.316, 444.335] -Measurements : [1743.24, 866919, -0.137912, -1.48944] ---- -Label : 1 -Position : [951.3, 444.617] -Measurements : [1778.24, 853610, -0.223107, -1.43039] ---- -Label : 1 -Position : [676.492, 444.813] -Measurements : [1270.74, 99444.8, -0.00502241, 0.149872] ---- -Label : 1 -Position : [656.548, 445.354] -Measurements : [1301.54, 217731, 0.0955151, -0.488249] ---- -Label : 1 -Position : [947.848, 445.952] -Measurements : [1813.38, 783301, -0.345384, -1.33575] ---- -Label : 1 -Position : [223.344, 446.637] -Measurements : [1469.86, 350234, 0.777706, -1.01709] ---- -Label : 1 -Position : [726.6, 446.976] -Measurements : [1447.13, 333995, -0.618639, -0.924742] ---- -Label : 1 -Position : [639.048, 448] -Measurements : [1447.78, 182699, -0.258972, -0.39761] ---- -Label : 1 -Position : [721.647, 448.221] -Measurements : [759.222, 356559, 1.21082, -0.230607] ---- -Label : 1 -Position : [12.6462, 448.44] -Measurements : [590.987, 157505, 2.89706, 8.34738] ---- -Label : 1 -Position : [107.496, 448.512] -Measurements : [1167.97, 385140, 0.626117, -1.09912] ---- -Label : 1 -Position : [5.97659, 448.64] -Measurements : [843.677, 310246, 1.22992, 0.562628] ---- -Label : 1 -Position : [725.176, 448.99] -Measurements : [1152.06, 457489, 0.0494439, -1.71895] ---- -Label : 1 -Position : [527.264, 449.024] -Measurements : [1501.23, 430478, 0.240216, -1.26203] ---- -Label : 1 -Position : [635.034, 449.472] -Measurements : [1528.93, 243575, -0.072693, -0.587377] ---- -Label : 1 -Position : [126.56, 449.935] -Measurements : [1001.15, 259217, 0.90875, 0.120479] ---- -Label : 1 -Position : [136.162, 450.295] -Measurements : [1408.87, 289870, 0.156769, -0.651482] ---- -Label : 1 -Position : [642.2, 450.737] -Measurements : [1339.4, 246355, -0.00699209, -1.06775] ---- -Label : 1 -Position : [134.958, 451.037] -Measurements : [1556.1, 207411, 0.488355, -0.699886] ---- -Label : 1 -Position : [532.103, 451.064] -Measurements : [938.794, 438279, 1.3906, 0.723337] ---- -Label : 1 -Position : [8.168, 451.072] -Measurements : [891.489, 271182, 1.42058, 0.888739] ---- -Label : 1 -Position : [132.373, 451.389] -Measurements : [1369.93, 246994, 0.291618, -0.402372] ---- -Label : 1 -Position : [528.146, 451.419] -Measurements : [1457.72, 515785, 0.180012, -1.46798] ---- -Label : 1 -Position : [227.304, 451.584] -Measurements : [1723.93, 415019, -0.421554, -1.04184] ---- -Label : 1 -Position : [172.324, 451.762] -Measurements : [1071.59, 153993, 0.0261246, -1.32803] ---- -Label : 1 -Position : [159.783, 451.861] -Measurements : [1174.08, 384040, 0.389188, -1.10244] ---- -Label : 1 -Position : [117.508, 452.061] -Measurements : [1065.74, 455476, 0.451643, -1.24023] ---- -Label : 1 -Position : [120.296, 452.096] -Measurements : [1142.42, 390763, 0.390965, -1.10479] ---- -Label : 1 -Position : [630.835, 452.729] -Measurements : [1712.56, 204054, -0.083229, -0.749053] ---- -Label : 1 -Position : [160.598, 452.779] -Measurements : [1340.07, 411914, 0.162113, -1.07011] ---- -Label : 1 -Position : [103.578, 452.943] -Measurements : [863.427, 322920, 1.41546, 0.647504] ---- -Label : 1 -Position : [130.536, 453.12] -Measurements : [1207.1, 343233, 0.392211, -0.873326] ---- -Label : 1 -Position : [632.392, 453.12] -Measurements : [1630.88, 310333, -0.208692, -0.798324] ---- -Label : 1 -Position : [137.192, 453.632] -Measurements : [1410.34, 390508, 0.0476933, -1.17026] ---- -Label : 1 -Position : [165.352, 454.144] -Measurements : [1377.33, 358512, 0.106841, -0.794038] ---- -Label : 1 -Position : [159.72, 454.656] -Measurements : [1135.01, 412079, 0.458963, -1.18434] ---- -Label : 1 -Position : [627.266, 454.69] -Measurements : [1813.18, 123260, -0.451422, 0.66334] ---- -Label : 1 -Position : [119.219, 454.966] -Measurements : [1070.43, 393972, 0.613021, -0.87558] ---- -Label : 1 -Position : [632.88, 454.968] -Measurements : [1620.44, 333709, -0.26508, -0.871962] ---- -Label : 1 -Position : [170.984, 455.168] -Measurements : [1154.49, 335000, 0.541179, -0.5096] ---- -Label : 1 -Position : [230.572, 455.458] -Measurements : [1297.81, 720899, 0.302012, -1.66048] ---- -Label : 1 -Position : [524.704, 455.68] -Measurements : [1461.43, 275397, -0.0221619, -1.24211] ---- -Label : 1 -Position : [733.529, 456.156] -Measurements : [985.235, 354557, 1.02509, -0.035532] ---- -Label : 1 -Position : [178.399, 456.568] -Measurements : [901.986, 90239.4, 0.228443, -1.02427] ---- -Label : 1 -Position : [168.29, 456.615] -Measurements : [1219.06, 354372, 0.442171, -0.583136] ---- -Label : 1 -Position : [523.599, 456.697] -Measurements : [1456.96, 276360, -0.184469, -1.43522] ---- -Label : 1 -Position : [625.736, 456.704] -Measurements : [1781.29, 137156, -0.409457, 0.828819] ---- -Label : 1 -Position : [158.219, 456.753] -Measurements : [908.059, 332555, 1.08846, -0.280884] ---- -Label : 1 -Position : [167.416, 456.84] -Measurements : [1223.36, 356828, 0.394666, -0.591263] ---- -Label : 1 -Position : [201.192, 457.216] -Measurements : [933.378, 107552, 0.155343, -1.21194] ---- -Label : 1 -Position : [273.116, 457.427] -Measurements : [848.93, 83433.7, 0.295688, -1.00214] ---- -Label : 1 -Position : [629.339, 457.918] -Measurements : [1686.46, 275729, -0.613071, -0.069262] ---- -Label : 1 -Position : [180.712, 458.24] -Measurements : [876.781, 102409, 0.452063, -1.0902] ---- -Label : 1 -Position : [735.922, 459.682] -Measurements : [1071.95, 321085, 0.857073, -0.0962083] ---- -Label : 1 -Position : [526.677, 460.001] -Measurements : [966.999, 314004, 0.947694, -0.537469] ---- -Label : 1 -Position : [205.748, 460.103] -Measurements : [642.427, 130680, 1.36858, 0.481237] ---- -Label : 1 -Position : [625.038, 460.253] -Measurements : [1676.56, 259427, -0.406202, -0.472816] ---- -Label : 1 -Position : [734.28, 460.8] -Measurements : [1112.77, 301639, 0.829453, -0.103574] ---- -Label : 1 -Position : [611.928, 461.373] -Measurements : [2567.36, 214202, -0.566806, -0.227441] ---- -Label : 1 -Position : [271.776, 461.824] -Measurements : [759.403, 126917, 0.834422, -0.716463] ---- -Label : 1 -Position : [518.56, 461.824] -Measurements : [1307.04, 323766, 0.306164, -1.28303] ---- -Label : 1 -Position : [620.616, 461.824] -Measurements : [2111.78, 217234, -0.248365, -0.0132417] ---- -Label : 1 -Position : [659.702, 462.007] -Measurements : [1248.87, 212375, 0.401319, -0.193886] ---- -Label : 1 -Position : [199.358, 462.094] -Measurements : [748.954, 113780, 0.730454, -0.77978] ---- -Label : 1 -Position : [649.759, 462.286] -Measurements : [1453.68, 237955, 0.186743, -0.814412] ---- -Label : 1 -Position : [183.715, 462.562] -Measurements : [759.815, 116531, 0.787376, -0.591159] ---- -Label : 1 -Position : [516.198, 462.776] -Measurements : [1390.06, 307902, 0.0886769, -1.32882] ---- -Label : 1 -Position : [624.499, 462.86] -Measurements : [1735.56, 265981, -0.143995, -0.538694] ---- -Label : 1 -Position : [672.438, 463.223] -Measurements : [1531.3, 222375, -0.446837, -0.585857] ---- -Label : 1 -Position : [667.841, 463.359] -Measurements : [1589.94, 159504, -0.554411, 0.397613] ---- -Label : 1 -Position : [612.936, 463.36] -Measurements : [2598.89, 156365, -0.283363, -0.214999] ---- -Label : 1 -Position : [390.699, 463.9] -Measurements : [953.982, 240329, 0.61246, -0.859345] ---- -Label : 1 -Position : [523.006, 464.194] -Measurements : [841.746, 288683, 1.57323, 1.47777] ---- -Label : 1 -Position : [515.643, 464.224] -Measurements : [1451.89, 324658, -0.165424, -1.29347] ---- -Label : 1 -Position : [281.805, 464.821] -Measurements : [928.544, 152499, 1.37436, 1.32432] ---- -Label : 1 -Position : [653.937, 465.168] -Measurements : [1389.95, 285490, 0.214694, -0.895179] ---- -Label : 1 -Position : [653.384, 465.408] -Measurements : [1389.95, 285490, 0.214694, -0.895179] ---- -Label : 1 -Position : [274.286, 465.806] -Measurements : [857.849, 226369, 1.49462, 1.87932] ---- -Label : 1 -Position : [287.268, 465.866] -Measurements : [1078.32, 153800, 0.57181, -0.646066] ---- -Label : 1 -Position : [611.021, 465.919] -Measurements : [2485.31, 306380, -0.760804, 0.243711] ---- -Label : 1 -Position : [667.72, 465.92] -Measurements : [1564.51, 137936, -0.497085, 0.0519529] ---- -Label : 1 -Position : [674.725, 466.001] -Measurements : [1530.88, 140729, -0.636649, -0.152479] ---- -Label : 1 -Position : [678.056, 466.002] -Measurements : [1532.06, 83942.1, -0.180043, -0.455521] ---- -Label : 1 -Position : [276.016, 466.205] -Measurements : [952.3, 291512, 1.1692, 0.491303] ---- -Label : 1 -Position : [384.456, 466.368] -Measurements : [1200, 607760, 0.80133, -0.41372] ---- -Label : 1 -Position : [386.464, 466.432] -Measurements : [1125.23, 479432, 1.04214, 0.507311] ---- -Label : 1 -Position : [513.44, 466.432] -Measurements : [1369.01, 301165, -0.0199302, -1.17659] ---- -Label : 1 -Position : [661.064, 466.432] -Measurements : [1260.88, 161930, -0.404024, -1.03649] ---- -Label : 1 -Position : [648.776, 466.944] -Measurements : [1512.77, 152713, -0.139271, -0.353782] ---- -Label : 1 -Position : [600.963, 466.963] -Measurements : [1834.42, 313683, -0.532998, -0.841125] ---- -Label : 1 -Position : [684.599, 467.37] -Measurements : [1694.71, 253093, 0.878805, 0.87761] ---- -Label : 1 -Position : [673.864, 467.968] -Measurements : [1509.78, 182834, -0.878857, -0.121597] ---- -Label : 1 -Position : [509.795, 468.69] -Measurements : [1027.48, 320735, 0.417012, -1.27672] ---- -Label : 1 -Position : [286.624, 468.992] -Measurements : [1206.55, 227639, 0.507718, -0.884645] ---- -Label : 1 -Position : [681.544, 468.992] -Measurements : [1587.81, 80805.8, -0.0797492, -0.512911] ---- -Label : 1 -Position : [691.784, 468.992] -Measurements : [1775.09, 688022, 0.0733174, -1.31853] ---- -Label : 1 -Position : [295.159, 469.076] -Measurements : [1028.37, 293475, 0.537221, -0.974873] ---- -Label : 1 -Position : [653.331, 469.441] -Measurements : [1216.76, 326841, 0.399981, -1.069] ---- -Label : 1 -Position : [279.456, 470.016] -Measurements : [1403.17, 443849, 0.320208, -1.12955] ---- -Label : 1 -Position : [696.435, 470.087] -Measurements : [1156.01, 810201, 0.965591, -0.669568] ---- -Label : 1 -Position : [652.34, 470.298] -Measurements : [1258.21, 328927, 0.285839, -1.17462] ---- -Label : 1 -Position : [688.477, 470.455] -Measurements : [2075.94, 403218, -0.0546087, -0.871039] ---- -Label : 1 -Position : [291.232, 470.528] -Measurements : [1168.67, 287214, 0.341977, -1.23997] ---- -Label : 1 -Position : [605.768, 470.528] -Measurements : [2008.97, 370555, -0.237468, -1.17684] ---- -Label : 1 -Position : [946.824, 470.528] -Measurements : [1182.53, 452263, 0.410711, -1.08387] ---- -Label : 1 -Position : [979.08, 470.528] -Measurements : [1124.51, 172228, 0.00631101, -0.495241] ---- -Label : 1 -Position : [663.943, 470.916] -Measurements : [980.862, 272147, 0.507777, -1.19139] ---- -Label : 1 -Position : [278.716, 470.972] -Measurements : [1345.94, 451075, 0.424035, -1.01057] ---- -Label : 1 -Position : [646.216, 471.552] -Measurements : [1416.11, 135173, -0.516086, 0.147008] ---- -Label : 1 -Position : [287.53, 471.65] -Measurements : [1266.02, 291761, 0.181795, -1.20823] ---- -Label : 1 -Position : [305.483, 472.232] -Measurements : [851.741, 145638, 0.614204, -0.549991] ---- -Label : 1 -Position : [942.072, 472.475] -Measurements : [1080.61, 259532, 0.906377, 0.00731661] ---- -Label : 1 -Position : [595.016, 472.576] -Measurements : [1733.34, 258212, -0.923884, 0.41868] ---- -Label : 1 -Position : [674.557, 472.772] -Measurements : [1178.34, 323354, -0.0910261, -1.57363] ---- -Label : 1 -Position : [603.635, 473.302] -Measurements : [1828.64, 345464, -0.149438, -1.21791] ---- -Label : 1 -Position : [596.698, 473.35] -Measurements : [1801.51, 234249, -0.893691, 0.772139] ---- -Label : 1 -Position : [302.496, 473.6] -Measurements : [770.137, 141844, 0.831649, -0.042973] ---- -Label : 1 -Position : [975.604, 473.764] -Measurements : [734.778, 229011, 1.4425, 0.677822] ---- -Label : 1 -Position : [945.652, 474.193] -Measurements : [1086.58, 408459, 0.865398, -0.512015] ---- -Label : 1 -Position : [393.54, 474.219] -Measurements : [889.456, 175725, 0.398089, -1.348] ---- -Label : 1 -Position : [595.621, 474.305] -Measurements : [1634.54, 332590, -0.780356, -0.443124] ---- -Label : 1 -Position : [642.405, 474.507] -Measurements : [1119.84, 193572, 0.0912902, -1.22246] ---- -Label : 1 -Position : [984.041, 474.739] -Measurements : [1030.24, 67486.9, 1.69136, 5.19346] ---- -Label : 1 -Position : [640.473, 475.355] -Measurements : [1203.43, 284781, 0.363382, -0.937126] ---- -Label : 1 -Position : [645.391, 475.639] -Measurements : [1151.9, 217534, 0.0959684, -1.21377] ---- -Label : 1 -Position : [301.851, 477.024] -Measurements : [618.76, 127621, 1.36534, 0.804601] ---- -Label : 1 -Position : [585.007, 477.305] -Measurements : [1752.69, 854804, -0.271332, -1.66488] ---- -Label : 1 -Position : [394.656, 477.696] -Measurements : [962.181, 163602, 0.16848, -1.41959] ---- -Label : 1 -Position : [638.536, 477.696] -Measurements : [1442.73, 359236, -0.160607, -1.18064] ---- -Label : 1 -Position : [637.067, 478.758] -Measurements : [1573.2, 297211, -0.494839, -0.696645] ---- -Label : 1 -Position : [394.519, 478.865] -Measurements : [949.41, 168507, 0.222663, -1.45861] ---- -Label : 1 -Position : [630.498, 479.245] -Measurements : [1458.34, 210081, -0.662255, -0.293045] ---- -Label : 1 -Position : [951.158, 479.53] -Measurements : [937.038, 530658, 1.27414, 0.101329] ---- -Label : 1 -Position : [641.352, 480.053] -Measurements : [1197.5, 391696, 0.488033, -1.12034] ---- -Label : 1 -Position : [731.162, 480.868] -Measurements : [1263.68, 481731, -0.0628712, -1.36047] ---- -Label : 1 -Position : [586.312, 482.304] -Measurements : [2034.1, 656355, -0.712533, -0.891031] ---- -Label : 1 -Position : [632.904, 482.304] -Measurements : [1578.34, 145295, -0.733559, 0.759693] ---- -Label : 1 -Position : [735.304, 482.304] -Measurements : [1440.9, 344893, -0.171774, -1.07776] ---- -Label : 1 -Position : [734.321, 482.861] -Measurements : [1441.99, 353070, -0.218023, -1.07339] ---- -Label : 1 -Position : [585.111, 483.776] -Measurements : [2245.78, 457103, -0.922618, 0.179196] ---- -Label : 1 -Position : [947.848, 484.352] -Measurements : [1574.49, 715859, -0.0598153, -1.51141] ---- -Label : 1 -Position : [8.51251, 485.431] -Measurements : [1805.83, 466518, -0.142368, -1.41604] ---- -Label : 1 -Position : [12.5016, 485.884] -Measurements : [1478.71, 579231, 0.23233, -1.4544] ---- -Label : 1 -Position : [10.216, 486.4] -Measurements : [1634.46, 592205, 0.0274422, -1.53076] ---- -Label : 1 -Position : [499.616, 486.4] -Measurements : [1222.39, 408170, 1.03882, 0.510449] ---- -Label : 1 -Position : [579.144, 486.912] -Measurements : [2287.17, 292801, -0.0577149, -0.856645] ---- -Label : 1 -Position : [583.259, 488.644] -Measurements : [2202.24, 423646, -0.324615, -0.814626] ---- -Label : 1 -Position : [949.453, 488.933] -Measurements : [1459.24, 867769, 0.210254, -1.74431] ---- -Label : 1 -Position : [503.87, 489.373] -Measurements : [1535.91, 816763, 0.397311, -1.28715] ---- -Label : 1 -Position : [576.907, 489.936] -Measurements : [2092.3, 380156, 0.0469166, -0.749972] ---- -Label : 1 -Position : [501.263, 490.444] -Measurements : [1553.88, 831211, 0.334438, -1.26877] ---- -Label : 1 -Position : [623.688, 490.496] -Measurements : [1385.06, 196047, -0.0627731, -0.31764] ---- -Label : 1 -Position : [623.287, 490.496] -Measurements : [1385.06, 196047, -0.0627731, -0.31764] ---- -Label : 1 -Position : [576.157, 490.778] -Measurements : [2061.91, 415334, -0.00792183, -0.74725] ---- -Label : 1 -Position : [572.488, 492.544] -Measurements : [2011.88, 208174, -0.153713, -0.797107] ---- -Label : 1 -Position : [732.061, 492.682] -Measurements : [1602.18, 476941, -0.00997003, -1.05825] ---- -Label : 1 -Position : [618.056, 493.056] -Measurements : [1788.18, 306689, -0.0969786, -0.420362] ---- -Label : 1 -Position : [734.28, 493.056] -Measurements : [1634.44, 455847, -0.015764, -1.15104] ---- -Label : 1 -Position : [603.847, 494.106] -Measurements : [1298.54, 224126, -0.259836, -1.18882] ---- -Label : 1 -Position : [575.65, 494.291] -Measurements : [1782.06, 330329, -0.130985, -1.03466] ---- -Label : 1 -Position : [729.907, 494.373] -Measurements : [1390.16, 495869, 0.302212, -1.06107] ---- -Label : 1 -Position : [611.4, 494.592] -Measurements : [1885.62, 259295, 0.309637, -0.253785] ---- -Label : 1 -Position : [622.606, 494.642] -Measurements : [1490.11, 334726, 0.188528, -0.605431] ---- -Label : 1 -Position : [609.133, 494.79] -Measurements : [1800.15, 307297, 0.0990803, 0.0708499] ---- -Label : 1 -Position : [567.368, 495.104] -Measurements : [2071.38, 169363, -0.596077, 0.0499229] ---- -Label : 1 -Position : [626.27, 495.425] -Measurements : [906.501, 202015, 0.58991, -1.14779] ---- -Label : 1 -Position : [615.016, 496.026] -Measurements : [2092.95, 284510, -0.48603, -0.207901] ---- -Label : 1 -Position : [605.256, 496.64] -Measurements : [1603.12, 156612, -0.369224, -0.457503] ---- -Label : 1 -Position : [563.805, 496.676] -Measurements : [1945.84, 180293, -0.344369, -0.709229] ---- -Label : 1 -Position : [571.648, 497.294] -Measurements : [1779.53, 314936, -0.102267, -0.873214] ---- -Label : 1 -Position : [486.816, 497.664] -Measurements : [1242.64, 518903, 0.413495, -1.22599] ---- -Label : 1 -Position : [618.792, 498.021] -Measurements : [1743.46, 597174, -0.165338, -1.41454] ---- -Label : 1 -Position : [568.863, 498.375] -Measurements : [1800.74, 318115, -0.2904, -0.817692] ---- -Label : 1 -Position : [616.193, 498.896] -Measurements : [1975.23, 473384, -0.484713, -0.981863] ---- -Label : 1 -Position : [561.736, 499.2] -Measurements : [2045.06, 243167, -0.346029, -0.381696] ---- -Label : 1 -Position : [486.047, 500.458] -Measurements : [1458.84, 576927, -0.040075, -1.43101] ---- -Label : 1 -Position : [159.843, 500.629] -Measurements : [1140.23, 393318, 0.157327, -1.44197] ---- -Label : 1 -Position : [483.806, 501.158] -Measurements : [1033.09, 541746, 0.559267, -1.25066] ---- -Label : 1 -Position : [560.411, 502.687] -Measurements : [2057.6, 381052, -0.540689, -0.812765] ---- -Label : 1 -Position : [158.184, 503.416] -Measurements : [1210.1, 336723, 0.189294, -1.42545] ---- -Label : 1 -Position : [157.188, 503.548] -Measurements : [1223.15, 338510, 0.135225, -1.44452] ---- -Label : 1 -Position : [589.887, 507.44] -Measurements : [1018.12, 368438, 0.551036, -1.37301] ---- -Label : 1 -Position : [586.888, 507.744] -Measurements : [1334.74, 371569, 8.25283e-05, -1.29959] ---- -Label : 1 -Position : [547.464, 510.816] -Measurements : [814.369, 223260, 1.06843, -0.165695] ---- -Label : 1 -Position : [584.15, 511.687] -Measurements : [1687.62, 311475, -0.320604, -0.882119] ---- -Label : 1 -Position : [104.747, 511.999] -Measurements : [1525.06, 391382, -0.381421, -1.1031] ---- -Label : 1 -Position : [590.953, 512.092] -Measurements : [914.364, 335495, 0.938643, -0.64015] ---- -Label : 1 -Position : [106.456, 512.57] -Measurements : [1743.35, 288541, -0.483654, -0.858208] ---- -Label : 1 -Position : [581.768, 512.864] -Measurements : [1607.66, 357197, -0.180509, -1.06948] ---- -Label : 1 -Position : [552.257, 512.972] -Measurements : [945.685, 241239, 1.12092, 1.00038] ---- -Label : 1 -Position : [121.482, 513.271] -Measurements : [1005.89, 316069, 0.404876, -1.07252] ---- -Label : 1 -Position : [548.961, 513.526] -Measurements : [894.349, 216036, 0.758409, -0.657154] ---- -Label : 1 -Position : [689.131, 514.299] -Measurements : [1452.15, 587562, 0.242572, -1.3598] ---- -Label : 1 -Position : [356.936, 514.651] -Measurements : [484.692, 28252.9, 1.48956, 1.46586] ---- -Label : 1 -Position : [938.241, 515.137] -Measurements : [1253.94, 661102, 0.320473, -1.27212] ---- -Label : 1 -Position : [96.3726, 515.228] -Measurements : [1099, 329868, 0.0967388, -1.48977] ---- -Label : 1 -Position : [583.944, 516.097] -Measurements : [1250.48, 528501, 0.63992, -1.22281] ---- -Label : 1 -Position : [689.146, 516.399] -Measurements : [1480.8, 583600, 0.238853, -1.28642] ---- -Label : 1 -Position : [575.112, 516.448] -Measurements : [1470.05, 338931, -0.235598, -1.41402] ---- -Label : 1 -Position : [104.424, 516.728] -Measurements : [1812.31, 242021, -0.118784, -1.00816] ---- -Label : 1 -Position : [141.104, 516.996] -Measurements : [903.29, 272847, 0.848775, -0.00361943] ---- -Label : 1 -Position : [115.573, 517.463] -Measurements : [1559.22, 330148, -0.253316, -0.737935] ---- -Label : 1 -Position : [685.886, 517.899] -Measurements : [2086.71, 401218, -0.515338, -0.744113] ---- -Label : 1 -Position : [571.016, 517.984] -Measurements : [1774.74, 199647, -1.0021, 0.287335] ---- -Label : 1 -Position : [98.792, 518.264] -Measurements : [1252.79, 377801, 0.0753794, -1.02657] ---- -Label : 1 -Position : [111.08, 518.264] -Measurements : [1541.59, 286974, 0.201137, -0.922379] ---- -Label : 1 -Position : [122.344, 518.264] -Measurements : [1257.91, 325551, -0.0265268, -1.46217] ---- -Label : 1 -Position : [96.5051, 518.298] -Measurements : [1002.74, 321256, 0.344161, -1.38253] ---- -Label : 1 -Position : [113.021, 518.435] -Measurements : [1499.71, 270976, 0.198964, -0.59934] ---- -Label : 1 -Position : [560.923, 518.462] -Measurements : [1441.46, 205320, 0.0966524, -0.866899] ---- -Label : 1 -Position : [936.288, 518.872] -Measurements : [1437.21, 480694, 0.251076, -1.00875] ---- -Label : 1 -Position : [688.264, 519.008] -Measurements : [1620.6, 483499, -0.105316, -1.08265] ---- -Label : 1 -Position : [570.85, 519.23] -Measurements : [1756.46, 313467, -0.75002, -0.419572] ---- -Label : 1 -Position : [355.264, 519.32] -Measurements : [503.265, 25277, 1.48944, 1.75196] ---- -Label : 1 -Position : [575.022, 519.364] -Measurements : [1277.05, 407981, 0.283681, -1.59171] ---- -Label : 1 -Position : [113.401, 519.512] -Measurements : [1459.1, 249996, 0.430455, -0.532729] ---- -Label : 1 -Position : [674.083, 519.722] -Measurements : [2350.35, 467233, 0.128373, -0.580424] ---- -Label : 1 -Position : [116.712, 519.8] -Measurements : [1630.29, 236205, -0.106491, -0.682769] ---- -Label : 1 -Position : [121.085, 519.846] -Measurements : [1371.5, 328759, -0.174011, -1.29959] ---- -Label : 1 -Position : [574.771, 519.928] -Measurements : [1365.02, 398939, 0.0656178, -1.66324] ---- -Label : 1 -Position : [675.446, 520.461] -Measurements : [2364.69, 420460, 0.0850419, -0.324506] ---- -Label : 1 -Position : [681.096, 520.544] -Measurements : [2077.24, 277552, -0.133201, -0.951526] ---- -Label : 1 -Position : [119.524, 521.265] -Measurements : [1547.95, 334549, -0.173422, -1.1656] ---- -Label : 1 -Position : [671.88, 521.568] -Measurements : [2196.3, 643005, 0.129993, -1.06851] ---- -Label : 1 -Position : [569.104, 521.638] -Measurements : [1644.6, 400594, -0.341815, -1.17246] ---- -Label : 1 -Position : [139.24, 521.848] -Measurements : [1330.17, 212572, 0.565509, -0.446046] ---- -Label : 1 -Position : [358.245, 522.281] -Measurements : [484.339, 20957.1, 1.95807, 3.62854] ---- -Label : 1 -Position : [575.842, 522.293] -Measurements : [1018.99, 397500, 0.960803, -0.702018] ---- -Label : 1 -Position : [932.217, 522.472] -Measurements : [1170.02, 516493, 0.668956, -0.663862] ---- -Label : 1 -Position : [564.872, 522.592] -Measurements : [1806.28, 211491, -0.39852, -0.0913888] ---- -Label : 1 -Position : [82.6851, 522.857] -Measurements : [1113.26, 218590, 0.076288, -1.28177] ---- -Label : 1 -Position : [82.408, 522.872] -Measurements : [1113.26, 218590, 0.076288, -1.28177] ---- -Label : 1 -Position : [73.2248, 523.267] -Measurements : [1424.03, 296586, -0.29191, -0.568026] ---- -Label : 1 -Position : [685.084, 523.582] -Measurements : [1843.59, 518391, -0.108008, -1.2111] ---- -Label : 1 -Position : [668.946, 523.587] -Measurements : [1680.36, 608905, 0.627474, -0.892091] ---- -Label : 1 -Position : [666.248, 524.64] -Measurements : [1291.07, 555317, 1.14039, 0.50806] ---- -Label : 1 -Position : [137.199, 524.875] -Measurements : [1281.35, 240553, 0.277879, -0.246804] ---- -Label : 1 -Position : [555, 524.933] -Measurements : [1755.88, 349913, -0.0863422, -0.396929] ---- -Label : 1 -Position : [561.8, 525.664] -Measurements : [1811.89, 270634, -0.40539, -0.0551912] ---- -Label : 1 -Position : [74.216, 525.944] -Measurements : [1402.89, 270133, -0.103743, -0.461858] ---- -Label : 1 -Position : [76.8979, 526.203] -Measurements : [1397.18, 224316, 0.126265, -0.257325] ---- -Label : 1 -Position : [145.384, 526.456] -Measurements : [1591.45, 574618, 0.269258, -1.27814] ---- -Label : 1 -Position : [555.289, 526.476] -Measurements : [1992.2, 316911, -0.10351, -0.286562] ---- -Label : 1 -Position : [552.298, 526.695] -Measurements : [2046.1, 402442, -0.394638, -0.639538] ---- -Label : 1 -Position : [668.937, 527.078] -Measurements : [1372.07, 450753, 0.543306, -0.851504] ---- -Label : 1 -Position : [79.7832, 527.152] -Measurements : [1259.84, 186494, 0.798769, 0.262099] ---- -Label : 1 -Position : [143.417, 527.593] -Measurements : [1671.51, 518053, 0.173787, -1.27215] ---- -Label : 1 -Position : [561.084, 528.195] -Measurements : [1596.5, 460391, -0.0946448, -1.12658] ---- -Label : 1 -Position : [640.274, 528.224] -Measurements : [998.217, 148805, 0.513197, -0.15954] ---- -Label : 1 -Position : [562.383, 528.385] -Measurements : [1532.77, 485423, -0.00953177, -1.26468] ---- -Label : 1 -Position : [552.584, 528.736] -Measurements : [2238.68, 247271, -0.482622, 0.00651976] ---- -Label : 1 -Position : [555.656, 528.736] -Measurements : [2080.56, 306242, -0.367825, 0.026926] ---- -Label : 1 -Position : [143.943, 529.013] -Measurements : [1456.08, 638703, 0.444392, -1.24277] ---- -Label : 1 -Position : [548.488, 530.784] -Measurements : [1994.98, 443247, -0.199228, -1.0123] ---- -Label : 1 -Position : [549.047, 530.799] -Measurements : [2049.62, 413702, -0.410612, -0.646898] ---- -Label : 1 -Position : [552.159, 531.462] -Measurements : [1991.5, 603721, -0.622387, -0.859583] ---- -Label : 1 -Position : [158.215, 531.896] -Measurements : [1517.91, 573203, 0.035411, -1.40464] ---- -Label : 1 -Position : [859.597, 532.098] -Measurements : [897.279, 397788, 1.08328, -0.132882] ---- -Label : 1 -Position : [856.416, 532.184] -Measurements : [1075.53, 457210, 0.670769, -1.10685] ---- -Label : 1 -Position : [650.888, 532.32] -Measurements : [1206.69, 211731, -0.230262, -1.15974] ---- -Label : 1 -Position : [642.696, 532.832] -Measurements : [1109.7, 101368, -0.0213611, -1.14778] ---- -Label : 1 -Position : [559.738, 532.941] -Measurements : [1306.38, 586416, 0.431628, -1.36615] ---- -Label : 1 -Position : [857.559, 533.069] -Measurements : [993.012, 443832, 0.896378, -0.736828] ---- -Label : 1 -Position : [155.112, 533.112] -Measurements : [1708.82, 409969, -0.266895, -0.903948] ---- -Label : 1 -Position : [632.794, 533.126] -Measurements : [1260.26, 164790, -0.0556231, -0.775306] ---- -Label : 1 -Position : [155.888, 534.121] -Measurements : [1713.74, 370551, -0.212855, -0.781483] ---- -Label : 1 -Position : [653.29, 534.833] -Measurements : [962.62, 266794, 0.507258, -1.28953] ---- -Label : 1 -Position : [652.171, 535.158] -Measurements : [965.637, 220720, 0.468729, -1.27748] ---- -Label : 1 -Position : [634.504, 535.392] -Measurements : [1224.84, 140926, 0.172546, -0.799324] ---- -Label : 1 -Position : [629.701, 535.862] -Measurements : [1250.58, 117243, 0.0808624, -0.748968] ---- -Label : 1 -Position : [638.105, 536.373] -Measurements : [1177.01, 152568, 0.217958, -0.751288] ---- -Label : 1 -Position : [845.715, 536.895] -Measurements : [972.932, 247036, 0.664486, -0.780894] ---- -Label : 1 -Position : [630.584, 537.125] -Measurements : [1221.53, 145059, 0.291194, -0.854623] ---- -Label : 1 -Position : [626.536, 537.176] -Measurements : [1151.67, 111131, 0.261392, -0.655329] ---- -Label : 1 -Position : [154.961, 537.412] -Measurements : [1580.2, 286988, 0.0357721, -0.632949] ---- -Label : 1 -Position : [159.208, 537.72] -Measurements : [1307.54, 402378, 0.336769, -0.940364] ---- -Label : 1 -Position : [739.604, 538.335] -Measurements : [1008.33, 313859, 0.109282, -1.58644] ---- -Label : 1 -Position : [628.36, 538.464] -Measurements : [1161.36, 122119, 0.38234, -0.75588] ---- -Label : 1 -Position : [685.754, 538.863] -Measurements : [1286.44, 209253, 0.0299302, -0.67024] ---- -Label : 1 -Position : [969.568, 539.352] -Measurements : [1770.55, 329781, -0.214014, -0.797349] ---- -Label : 1 -Position : [154.99, 539.973] -Measurements : [1426.38, 313698, -0.00452222, -1.11009] ---- -Label : 1 -Position : [893.28, 540.376] -Measurements : [1501.89, 665187, 0.164338, -1.44047] ---- -Label : 1 -Position : [968.573, 540.837] -Measurements : [1664.59, 483957, -0.386499, -0.964287] ---- -Label : 1 -Position : [850.272, 541.4] -Measurements : [1215.94, 427054, 0.201133, -1.33611] ---- -Label : 1 -Position : [619.656, 541.536] -Measurements : [1369.65, 227500, 0.62844, 0.175853] ---- -Label : 1 -Position : [740.488, 541.536] -Measurements : [1158.46, 213541, -0.0769387, -1.35516] ---- -Label : 1 -Position : [738.541, 541.554] -Measurements : [1094.43, 228086, 0.0288894, -1.34753] ---- -Label : 1 -Position : [620.565, 541.692] -Measurements : [1301.34, 203838, 0.601099, 0.695094] ---- -Label : 1 -Position : [919.392, 541.912] -Measurements : [1076.82, 127660, -0.465827, -0.285083] ---- -Label : 1 -Position : [683.745, 542.12] -Measurements : [1400.62, 141217, 0.263412, -0.51923] ---- -Label : 1 -Position : [847.487, 542.132] -Measurements : [1152.36, 429045, 0.280138, -1.31061] ---- -Label : 1 -Position : [968.737, 542.16] -Measurements : [1560.14, 540243, -0.191867, -1.24116] ---- -Label : 1 -Position : [693.48, 542.19] -Measurements : [966.508, 423764, 0.948472, -0.766761] ---- -Label : 1 -Position : [916.057, 543.093] -Measurements : [1316.77, 71402.8, 0.0575627, 0.692385] ---- -Label : 1 -Position : [897.54, 543.251] -Measurements : [733.187, 484756, 2.10572, 3.03883] ---- -Label : 1 -Position : [689.288, 543.584] -Measurements : [1394.32, 344312, -0.167991, -1.38606] ---- -Label : 1 -Position : [613.512, 544.096] -Measurements : [1888.24, 314658, -0.583711, -0.672326] ---- -Label : 1 -Position : [619.007, 544.412] -Measurements : [1341.67, 276825, 0.49454, -0.3906] ---- -Label : 1 -Position : [68.6158, 545.038] -Measurements : [988.67, 256931, 1.21836, 0.677322] ---- -Label : 1 -Position : [892.053, 545.25] -Measurements : [996.108, 714571, 1.17468, -0.247991] ---- -Label : 1 -Position : [602.542, 545.255] -Measurements : [1098.34, 463152, 0.443857, -1.44794] ---- -Label : 1 -Position : [372.869, 545.29] -Measurements : [647.698, 162205, 1.54662, 1.56244] ---- -Label : 1 -Position : [368.064, 545.432] -Measurements : [889.225, 194181, 0.667855, -0.706854] ---- -Label : 1 -Position : [167.649, 545.473] -Measurements : [1166.57, 771684, 0.433882, -1.53255] ---- -Label : 1 -Position : [171.602, 545.671] -Measurements : [1186.39, 748694, 0.458735, -1.48851] ---- -Label : 1 -Position : [612.092, 545.756] -Measurements : [1971.11, 274734, -0.802306, -0.182576] ---- -Label : 1 -Position : [922.904, 546.419] -Measurements : [731.19, 136447, 0.710832, -1.14612] ---- -Label : 1 -Position : [912.736, 546.52] -Measurements : [1229.94, 213367, -0.0924437, -0.877466] ---- -Label : 1 -Position : [605.257, 546.527] -Measurements : [1570.41, 602172, -0.372313, -1.4091] ---- -Label : 1 -Position : [681.608, 546.656] -Measurements : [1296.6, 121584, -0.0814027, -0.254927] ---- -Label : 1 -Position : [606.856, 547.168] -Measurements : [1653.51, 567992, -0.466753, -1.22783] ---- -Label : 1 -Position : [915.447, 547.538] -Measurements : [1292.9, 196033, -0.286121, -0.742374] ---- -Label : 1 -Position : [674.991, 548.364] -Measurements : [1440.87, 101237, 0.445724, 2.17182] ---- -Label : 1 -Position : [836.785, 548.445] -Measurements : [847.022, 121326, 0.374717, -0.940934] ---- -Label : 1 -Position : [677.95, 548.448] -Measurements : [1383.8, 90159.1, -0.820815, 0.505858] ---- -Label : 1 -Position : [368.574, 548.632] -Measurements : [897.774, 171249, 0.848018, -0.299431] ---- -Label : 1 -Position : [610.801, 548.665] -Measurements : [1890.6, 333818, -0.660998, -0.598264] ---- -Label : 1 -Position : [839.198, 548.815] -Measurements : [747.295, 157001, 0.689483, -1.03939] ---- -Label : 1 -Position : [66.536, 548.984] -Measurements : [1204.27, 331009, 0.518502, -0.763793] ---- -Label : 1 -Position : [585.897, 549.025] -Measurements : [1470.37, 254436, -0.550692, -0.452917] ---- -Label : 1 -Position : [842.535, 549.101] -Measurements : [630.592, 146847, 1.24269, 0.0450036] ---- -Label : 1 -Position : [168.936, 549.496] -Measurements : [1453.63, 641926, -0.0154559, -1.6177] ---- -Label : 1 -Position : [837.472, 549.592] -Measurements : [832.63, 139672, 0.380043, -1.20935] ---- -Label : 1 -Position : [910.551, 549.666] -Measurements : [1068.28, 361318, 0.116333, -1.5643] ---- -Label : 1 -Position : [662.29, 549.743] -Measurements : [1588.06, 253787, 0.272125, -0.706776] ---- -Label : 1 -Position : [685.762, 549.883] -Measurements : [1281.77, 292865, 0.131181, -1.09337] ---- -Label : 1 -Position : [842.293, 549.984] -Measurements : [630.592, 146847, 1.24269, 0.0450036] ---- -Label : 1 -Position : [596.061, 550.501] -Measurements : [953.189, 151523, -0.126436, -1.40287] ---- -Label : 1 -Position : [595.737, 550.569] -Measurements : [1034.29, 139565, -0.365157, -1.10216] ---- -Label : 1 -Position : [595.592, 550.752] -Measurements : [1034.29, 139565, -0.365157, -1.10216] ---- -Label : 1 -Position : [675.464, 550.752] -Measurements : [1380.79, 112696, -0.562892, 0.967104] ---- -Label : 1 -Position : [657.811, 551.747] -Measurements : [1093.01, 204903, -0.127794, -1.09142] ---- -Label : 1 -Position : [68.4228, 552.116] -Measurements : [1406.42, 258037, 0.349544, -0.802103] ---- -Label : 1 -Position : [66.024, 552.568] -Measurements : [1390.64, 292310, 0.187832, -0.970916] ---- -Label : 1 -Position : [659.08, 553.312] -Measurements : [1192.45, 235697, -0.121543, -1.0075] ---- -Label : 1 -Position : [666.76, 553.312] -Measurements : [1736, 410110, -0.170472, -1.17004] ---- -Label : 1 -Position : [587.912, 553.428] -Measurements : [1762.04, 176261, 0.654696, -0.138235] ---- -Label : 1 -Position : [663.729, 553.605] -Measurements : [1664.34, 365946, -0.0719111, -0.932129] ---- -Label : 1 -Position : [839.008, 553.688] -Measurements : [757.783, 166356, 0.590803, -1.22261] ---- -Label : 1 -Position : [584.429, 553.752] -Measurements : [1920.63, 172586, 0.0358339, -0.551255] ---- -Label : 1 -Position : [592.358, 553.79] -Measurements : [1338.35, 131925, 0.18481, 0.00550019] ---- -Label : 1 -Position : [590.472, 553.824] -Measurements : [1510.32, 182766, 0.214998, 0.0218474] ---- -Label : 1 -Position : [662.748, 554.538] -Measurements : [1457.25, 373951, 0.127051, -0.88248] ---- -Label : 1 -Position : [63.8955, 554.694] -Measurements : [1126.88, 315603, 0.363359, -0.777913] ---- -Label : 1 -Position : [584.71, 555.181] -Measurements : [1974.39, 198851, -0.0698433, -0.841522] ---- -Label : 1 -Position : [583.304, 556.384] -Measurements : [2037.44, 206148, -0.219064, -0.843401] ---- -Label : 1 -Position : [68.6961, 557.213] -Measurements : [1536.18, 171132, 0.0439612, -0.613123] ---- -Label : 1 -Position : [580.232, 557.408] -Measurements : [2125.47, 208773, -0.644862, -0.235574] ---- -Label : 1 -Position : [174.719, 557.733] -Measurements : [898.759, 187005, 0.383145, -1.2097] ---- -Label : 1 -Position : [402.869, 557.851] -Measurements : [1334.78, 720938, 0.0307956, -1.69772] ---- -Label : 1 -Position : [384.96, 558.232] -Measurements : [1402.2, 291162, -0.572213, -0.683802] ---- -Label : 1 -Position : [557.563, 558.329] -Measurements : [1469.41, 146080, 0.0394042, -0.622513] ---- -Label : 1 -Position : [578.735, 558.744] -Measurements : [2063.1, 304911, -0.658747, -0.429547] ---- -Label : 1 -Position : [380.415, 559.509] -Measurements : [1030.78, 387391, 0.189618, -1.72118] ---- -Label : 1 -Position : [173.544, 559.608] -Measurements : [935.883, 178358, 0.323128, -1.25073] ---- -Label : 1 -Position : [404.575, 559.807] -Measurements : [1550.19, 540365, -0.248425, -1.49692] ---- -Label : 1 -Position : [574.088, 559.968] -Measurements : [1726.03, 558886, -0.134103, -1.40458] ---- -Label : 1 -Position : [265.694, 560.218] -Measurements : [1215.62, 396161, 0.385144, -1.13635] ---- -Label : 1 -Position : [628.311, 560.542] -Measurements : [1049.43, 413327, 0.593478, -0.651241] ---- -Label : 1 -Position : [560.433, 560.556] -Measurements : [1323.59, 205601, 0.216717, -0.770939] ---- -Label : 1 -Position : [561.288, 560.992] -Measurements : [1273.38, 238064, 0.245399, -0.938592] ---- -Label : 1 -Position : [65.512, 561.144] -Measurements : [1367.59, 185858, -0.232455, -0.952684] ---- -Label : 1 -Position : [833.312, 561.535] -Measurements : [748.389, 117808, 0.87673, 0.372487] ---- -Label : 1 -Position : [174.745, 562.247] -Measurements : [887.213, 182805, 0.537509, -1.18353] ---- -Label : 1 -Position : [751.027, 562.25] -Measurements : [1129.39, 160728, -0.38824, -1.14525] ---- -Label : 1 -Position : [632.968, 562.528] -Measurements : [1315.61, 443125, 0.279018, -1.09643] ---- -Label : 1 -Position : [577.494, 562.593] -Measurements : [1740.11, 515743, 0.0375038, -1.55101] ---- -Label : 1 -Position : [401.856, 562.84] -Measurements : [1858.27, 373124, -0.72865, -0.387901] ---- -Label : 1 -Position : [385.847, 562.841] -Measurements : [1493.7, 121529, -0.55157, -0.364009] ---- -Label : 1 -Position : [266.588, 562.939] -Measurements : [1385.16, 382181, 0.0929111, -1.15831] ---- -Label : 1 -Position : [746.12, 563.04] -Measurements : [1030.86, 186221, 0.0629092, -1.47482] ---- -Label : 1 -Position : [63.9099, 563.448] -Measurements : [1259.14, 220281, 0.0236837, -1.07392] ---- -Label : 1 -Position : [548.352, 563.508] -Measurements : [1621.1, 186553, -0.408011, -0.233939] ---- -Label : 1 -Position : [60.8789, 563.579] -Measurements : [961.026, 207415, 0.515273, -0.754784] ---- -Label : 1 -Position : [637.953, 563.604] -Measurements : [1077.7, 557523, 0.877909, -0.850592] ---- -Label : 1 -Position : [266.728, 563.704] -Measurements : [1443.75, 340373, -0.00392614, -1.00391] ---- -Label : 1 -Position : [511.636, 563.716] -Measurements : [741.791, 48736.9, 0.0456055, -0.831354] ---- -Label : 1 -Position : [389.056, 564.376] -Measurements : [1552.88, 219631, -0.046529, -0.744055] ---- -Label : 1 -Position : [271.17, 564.402] -Measurements : [1011.81, 458750, 0.876486, -0.545166] ---- -Label : 1 -Position : [569.686, 564.755] -Measurements : [955.968, 348778, 2.13753, 3.77168] ---- -Label : 1 -Position : [61.986, 564.807] -Measurements : [1071.06, 226942, 0.344579, -0.963342] ---- -Label : 1 -Position : [835.426, 565.056] -Measurements : [826.632, 174667, 1.04292, 0.201201] ---- -Label : 1 -Position : [543.368, 565.088] -Measurements : [1550.01, 275781, -0.0652288, -1.07195] ---- -Label : 1 -Position : [386.036, 565.286] -Measurements : [1426.85, 142805, -0.0853821, -0.743422] ---- -Label : 1 -Position : [531.431, 566.444] -Measurements : [1161.49, 436970, 0.42866, -1.35793] ---- -Label : 1 -Position : [837.984, 566.488] -Measurements : [853.543, 217003, 0.844863, -0.525593] ---- -Label : 1 -Position : [514.506, 567.217] -Measurements : [811.119, 30515, 0.131191, -0.529126] ---- -Label : 1 -Position : [261.608, 567.288] -Measurements : [1396.15, 162422, 0.333017, 0.678383] ---- -Label : 1 -Position : [514.696, 567.648] -Measurements : [811.119, 30515, 0.131191, -0.529126] ---- -Label : 1 -Position : [388.104, 567.705] -Measurements : [1402.95, 215284, 0.331956, -0.933168] ---- -Label : 1 -Position : [750.551, 567.846] -Measurements : [783.311, 226485, 0.698776, -0.987802] ---- -Label : 1 -Position : [68.072, 568.312] -Measurements : [1101.56, 234792, 0.320168, -1.23589] ---- -Label : 1 -Position : [546.841, 568.539] -Measurements : [1359.75, 295609, 0.10771, -1.13195] ---- -Label : 1 -Position : [977.56, 568.583] -Measurements : [1460.08, 168090, 0.305359, -1.12439] ---- -Label : 1 -Position : [403.547, 568.903] -Measurements : [1802.22, 320711, -0.394287, -0.573665] ---- -Label : 1 -Position : [543.272, 569.248] -Measurements : [1208.41, 233405, 0.537796, -0.647323] ---- -Label : 1 -Position : [261.948, 569.404] -Measurements : [1237.46, 196129, 0.0414693, -0.258032] ---- -Label : 1 -Position : [406.517, 570.499] -Measurements : [1690.69, 354578, -0.217451, -0.722075] ---- -Label : 1 -Position : [530.568, 570.72] -Measurements : [1551.89, 430978, -0.344007, -1.19749] ---- -Label : 1 -Position : [254.952, 570.872] -Measurements : [854.434, 197704, 0.815986, -0.783936] ---- -Label : 1 -Position : [404.416, 571.032] -Measurements : [1914.2, 278546, -0.454741, -0.0690502] ---- -Label : 1 -Position : [505.448, 571.474] -Measurements : [763.208, 95622.2, 0.199647, -1.07823] ---- -Label : 1 -Position : [635.94, 571.514] -Measurements : [888.983, 142813, 0.347177, -1.11481] ---- -Label : 1 -Position : [184.542, 571.529] -Measurements : [882.651, 320351, 0.668785, -0.916971] ---- -Label : 1 -Position : [251.019, 572.145] -Measurements : [785.131, 188297, 1.19931, 0.112167] ---- -Label : 1 -Position : [639.624, 572.256] -Measurements : [962.002, 145217, 0.253866, -1.05929] ---- -Label : 1 -Position : [529.055, 572.424] -Measurements : [1712.57, 324797, -0.422305, -0.685713] ---- -Label : 1 -Position : [254.04, 572.445] -Measurements : [822.708, 169408, 1.04385, -0.219536] ---- -Label : 1 -Position : [978.824, 572.481] -Measurements : [1556.71, 170622, -0.350726, -0.666874] ---- -Label : 1 -Position : [70.6349, 572.587] -Measurements : [1135.09, 370077, 0.336241, -1.53432] ---- -Label : 1 -Position : [978.272, 572.632] -Measurements : [1556.71, 170622, -0.350726, -0.666874] ---- -Label : 1 -Position : [521.382, 572.646] -Measurements : [1156.46, 187809, 1.03322, 0.140461] ---- -Label : 1 -Position : [523.4, 572.768] -Measurements : [1343.39, 253992, 0.636051, -0.690359] ---- -Label : 1 -Position : [539.784, 572.768] -Measurements : [870.082, 95191, 0.968062, 1.2117] ---- -Label : 1 -Position : [509.064, 573.28] -Measurements : [873.357, 71712.8, 0.234021, -0.551763] ---- -Label : 1 -Position : [642.027, 573.887] -Measurements : [961.326, 156466, 0.453651, -1.2085] ---- -Label : 1 -Position : [409.875, 573.926] -Measurements : [1744.69, 639076, -0.23923, -1.33732] ---- -Label : 1 -Position : [542.833, 574.579] -Measurements : [1007.82, 131515, 1.04116, 1.11113] ---- -Label : 1 -Position : [511.082, 574.72] -Measurements : [884.891, 72490.3, 0.188584, -0.699274] ---- -Label : 1 -Position : [179.688, 574.968] -Measurements : [1170.41, 239662, 0.36655, -0.867454] ---- -Label : 1 -Position : [527.026, 575.482] -Measurements : [1650.04, 269915, 0.116529, -0.938832] ---- -Label : 1 -Position : [183.561, 576.483] -Measurements : [1111.18, 237710, 0.605415, -0.878042] ---- -Label : 1 -Position : [406.976, 577.688] -Measurements : [1732.12, 616186, -0.158667, -1.44916] ---- -Label : 1 -Position : [71.3052, 578.356] -Measurements : [1130.47, 277750, 0.555065, -1.03163] ---- -Label : 1 -Position : [71.144, 578.552] -Measurements : [1130.47, 277750, 0.555065, -1.03163] ---- -Label : 1 -Position : [248.241, 578.62] -Measurements : [1304.08, 408362, 0.135407, -1.33895] ---- -Label : 1 -Position : [746.632, 578.912] -Measurements : [1120.32, 386986, 0.13633, -1.36769] ---- -Label : 1 -Position : [245.736, 579.576] -Measurements : [1616.03, 309322, -0.36443, -0.641314] ---- -Label : 1 -Position : [743.621, 579.768] -Measurements : [1033.71, 372602, 0.40827, -1.20577] ---- -Label : 1 -Position : [748.2, 579.824] -Measurements : [1138.5, 313170, 0.228065, -1.0469] ---- -Label : 1 -Position : [493.349, 580.168] -Measurements : [988.673, 372587, 0.660684, -0.886268] ---- -Label : 1 -Position : [926.194, 580.478] -Measurements : [1023.71, 465297, 0.468546, -1.3932] ---- -Label : 1 -Position : [244.925, 580.944] -Measurements : [1678.39, 316686, -0.375423, -0.631309] ---- -Label : 1 -Position : [405.149, 581.285] -Measurements : [1317.17, 655870, 0.565245, -1.24558] ---- -Label : 1 -Position : [839.447, 581.833] -Measurements : [802.678, 295910, 1.09132, -0.000274494] ---- -Label : 1 -Position : [243.287, 582.179] -Measurements : [1631.35, 381332, -0.294742, -0.978722] ---- -Label : 1 -Position : [68.3426, 582.724] -Measurements : [842.06, 258088, 0.941284, -0.285413] ---- -Label : 1 -Position : [495.24, 583.008] -Measurements : [1205.29, 379650, 0.294275, -1.22413] ---- -Label : 1 -Position : [495.224, 583.154] -Measurements : [1205.29, 379650, 0.294275, -1.22413] ---- -Label : 1 -Position : [743.721, 583.698] -Measurements : [1251.07, 298139, -0.0894589, -1.02486] ---- -Label : 1 -Position : [853.971, 583.894] -Measurements : [710.569, 284400, 1.45034, 0.705734] ---- -Label : 1 -Position : [924.738, 584.356] -Measurements : [1500.64, 279100, -0.714514, -0.373187] ---- -Label : 1 -Position : [841.056, 584.408] -Measurements : [848.275, 265194, 1.14014, 0.165961] ---- -Label : 1 -Position : [925.536, 584.408] -Measurements : [1457.3, 291992, -0.708653, -0.483691] ---- -Label : 1 -Position : [837.943, 584.962] -Measurements : [918.6, 205224, 0.986566, 0.719513] ---- -Label : 1 -Position : [246.76, 585.208] -Measurements : [1561.69, 395193, 0.0846826, -1.27315] ---- -Label : 1 -Position : [11.24, 585.72] -Measurements : [1143.59, 408355, 0.749213, -0.760661] ---- -Label : 1 -Position : [11.7226, 585.96] -Measurements : [1143.59, 408355, 0.749213, -0.760661] ---- -Label : 1 -Position : [898.592, 587.811] -Measurements : [579.844, 176294, 1.89768, 2.30228] ---- -Label : 1 -Position : [747.656, 588.128] -Measurements : [1010.54, 216731, 0.348892, -0.96938] ---- -Label : 1 -Position : [851.296, 588.504] -Measurements : [1151.27, 422687, 0.338834, -1.46978] ---- -Label : 1 -Position : [715.921, 588.879] -Measurements : [701.596, 152342, 1.35382, 0.642622] ---- -Label : 1 -Position : [904.458, 589.052] -Measurements : [1162.55, 285568, -0.31184, -1.37231] ---- -Label : 1 -Position : [462.229, 589.187] -Measurements : [839.65, 121406, 0.483044, -0.0888554] ---- -Label : 1 -Position : [233.563, 589.361] -Measurements : [1622.14, 727175, -0.0163402, -1.34372] ---- -Label : 1 -Position : [11.6735, 589.581] -Measurements : [1086.43, 414430, 0.918486, -0.546414] ---- -Label : 1 -Position : [244.748, 589.826] -Measurements : [1313.36, 449772, 0.537817, -1.04497] ---- -Label : 1 -Position : [711.128, 590.216] -Measurements : [1057.7, 176709, 0.229219, -0.86216] ---- -Label : 1 -Position : [749.165, 590.339] -Measurements : [1017.2, 222417, 0.32214, -1.06224] ---- -Label : 1 -Position : [478.928, 590.672] -Measurements : [1262.51, 320258, 0.0130173, -1.19643] ---- -Label : 1 -Position : [902.496, 591.576] -Measurements : [1277.2, 270413, -0.623602, -0.924674] ---- -Label : 1 -Position : [757.32, 591.865] -Measurements : [843.647, 68779.1, 1.13773, 0.714861] ---- -Label : 1 -Position : [461.887, 592.259] -Measurements : [933.14, 145461, 0.280867, -0.367128] ---- -Label : 1 -Position : [463.056, 592.72] -Measurements : [972.805, 136255, 0.208593, -0.39157] ---- -Label : 1 -Position : [854.326, 592.743] -Measurements : [1046.82, 399715, 0.715332, -1.05331] ---- -Label : 1 -Position : [480.773, 593.01] -Measurements : [1091.26, 361036, 0.615515, -1.08109] ---- -Label : 1 -Position : [862.585, 593.05] -Measurements : [1039.14, 445840, 0.434074, -1.31525] ---- -Label : 1 -Position : [482.201, 593.436] -Measurements : [946.43, 338296, 1.09066, -0.272114] ---- -Label : 1 -Position : [237.544, 593.912] -Measurements : [1775.91, 505416, -0.189363, -0.979268] ---- -Label : 1 -Position : [76.7464, 593.912] -Measurements : [660.127, 151778, 1.05948, -0.202266] ---- -Label : 1 -Position : [711.567, 594.355] -Measurements : [1274.37, 277809, 0.320062, -0.780299] ---- -Label : 1 -Position : [72.471, 595.219] -Measurements : [828.364, 245901, 0.451359, -1.33849] ---- -Label : 1 -Position : [754.136, 595.336] -Measurements : [878.371, 154193, 0.857089, -0.0780638] ---- -Label : 1 -Position : [757.393, 596.246] -Measurements : [981.482, 152651, 0.989848, -0.00492299] ---- -Label : 1 -Position : [860.168, 597.073] -Measurements : [1137.38, 272944, 0.225, -1.17512] ---- -Label : 1 -Position : [866.144, 597.208] -Measurements : [1257.32, 360017, 0.16117, -1.37078] ---- -Label : 1 -Position : [647.128, 597.384] -Measurements : [1561.71, 168324, 0.318716, -1.08179] ---- -Label : 1 -Position : [878.693, 597.435] -Measurements : [550.549, 81253.4, 1.04893, 0.0897637] ---- -Label : 1 -Position : [233.886, 597.516] -Measurements : [1708.33, 525824, 0.250936, -1.02923] ---- -Label : 1 -Position : [231.503, 597.681] -Measurements : [1726.27, 622316, 0.0226395, -1.30381] ---- -Label : 1 -Position : [860, 597.72] -Measurements : [1137.38, 272944, 0.225, -1.17512] ---- -Label : 1 -Position : [870.141, 598.328] -Measurements : [939.392, 446753, 0.893889, -0.854915] ---- -Label : 1 -Position : [653.09, 598.483] -Measurements : [1777.2, 431892, -0.418814, -0.77937] ---- -Label : 1 -Position : [74.728, 598.52] -Measurements : [913.674, 181069, 0.425305, -1.0491] ---- -Label : 1 -Position : [402.401, 598.682] -Measurements : [744.985, 140465, 1.07279, -0.0605856] ---- -Label : 1 -Position : [882.528, 598.744] -Measurements : [582.059, 75458.8, 1.03263, -0.020056] ---- -Label : 1 -Position : [650.528, 598.905] -Measurements : [1828.76, 266579, -0.150144, -0.455498] ---- -Label : 1 -Position : [864.829, 599.396] -Measurements : [1304.75, 320838, 0.0112484, -1.25766] ---- -Label : 1 -Position : [643.57, 600.182] -Measurements : [1354.87, 205802, 0.35983, -0.804705] ---- -Label : 1 -Position : [236.008, 600.568] -Measurements : [1416.61, 340729, 0.36803, -0.68806] ---- -Label : 1 -Position : [879.16, 601.397] -Measurements : [539.633, 67361.4, 1.39999, 1.17747] ---- -Label : 1 -Position : [400.08, 601.424] -Measurements : [928.427, 131395, 0.287644, -1.10852] ---- -Label : 1 -Position : [756.696, 601.992] -Measurements : [965.798, 199167, 0.818095, -0.442147] ---- -Label : 1 -Position : [650.2, 602.504] -Measurements : [1923.79, 198597, 0.00330806, -0.807094] ---- -Label : 1 -Position : [757.708, 603.448] -Measurements : [944.493, 208444, 0.831763, -0.455454] ---- -Label : 1 -Position : [956.679, 603.612] -Measurements : [970.499, 684615, 1.1671, -0.159297] ---- -Label : 1 -Position : [401.375, 603.957] -Measurements : [995.404, 183760, 0.236748, -1.2496] ---- -Label : 1 -Position : [461.393, 604.89] -Measurements : [1021.32, 155816, 0.027004, -1.36898] ---- -Label : 1 -Position : [237.863, 604.999] -Measurements : [1170.57, 213156, 0.0315384, -1.42252] ---- -Label : 1 -Position : [459.427, 605.004] -Measurements : [1051.56, 154372, -0.196236, -1.22849] ---- -Label : 1 -Position : [228.235, 605.075] -Measurements : [941.204, 142612, 0.534915, -0.338781] ---- -Label : 1 -Position : [228.844, 605.703] -Measurements : [941.204, 142612, 0.534915, -0.338781] ---- -Label : 1 -Position : [460.496, 606.032] -Measurements : [1040.11, 157960, -0.139297, -1.28395] ---- -Label : 1 -Position : [647.393, 606.296] -Measurements : [1589.79, 156739, 0.454352, -1.17883] ---- -Label : 1 -Position : [952.672, 606.424] -Measurements : [1622.38, 532442, -0.0479366, -1.22267] ---- -Label : 0 -Position : [557.598, 606.698] -Measurements : [996.762, 12374.8, 1.36408, 1.58708] ---- -Label : 1 -Position : [752.5, 606.756] -Measurements : [644.077, 199924, 1.64222, 1.51838] ---- -Label : 1 -Position : [954.957, 607.045] -Measurements : [1493.77, 706392, 0.0411678, -1.52663] ---- -Label : 1 -Position : [402.128, 608.592] -Measurements : [1131, 191411, -0.0195369, -1.19049] ---- -Label : 1 -Position : [625.624, 608.648] -Measurements : [1661.4, 34736.2, 0.660168, 1.94285] ---- -Label : 1 -Position : [687.576, 608.648] -Measurements : [1257.51, 75274.1, -0.399507, -0.759956] ---- -Label : 1 -Position : [231.912, 609.272] -Measurements : [1164.12, 111774, -0.0561663, -0.94059] ---- -Label : 1 -Position : [690.292, 609.977] -Measurements : [1167.77, 132603, -0.383219, -1.08329] ---- -Label : 1 -Position : [400.974, 610.01] -Measurements : [1307.3, 117289, -0.332864, -0.470128] ---- -Label : 1 -Position : [682.408, 610.606] -Measurements : [1357.08, 104314, 0.429524, 0.249075] ---- -Label : 1 -Position : [406.029, 611.106] -Measurements : [855.939, 211554, 0.773161, -0.739853] ---- -Label : 1 -Position : [622.078, 611.881] -Measurements : [1593.51, 53048.9, -0.411448, 2.05418] ---- -Label : 1 -Position : [407.019, 611.953] -Measurements : [769.182, 192695, 1.10807, -0.0263169] ---- -Label : 1 -Position : [627.24, 612.058] -Measurements : [1469.08, 94869.6, -0.14857, 0.0954542] ---- -Label : 1 -Position : [691.021, 612.203] -Measurements : [1174.15, 157046, 0.0377585, -0.761364] ---- -Label : 1 -Position : [618.968, 612.232] -Measurements : [1518.66, 43584.4, -0.902702, 0.764844] ---- -Label : 0 -Position : [553.348, 612.359] -Measurements : [908.398, 1915.39, -0.588395, 2.46765] ---- -Label : 1 -Position : [621.214, 612.44] -Measurements : [1553.12, 51804.4, -0.32645, 0.803664] ---- -Label : 1 -Position : [22.504, 612.856] -Measurements : [1574.99, 469838, -0.564517, -0.977363] ---- -Label : 1 -Position : [677.848, 613.256] -Measurements : [1339.91, 129476, 0.817102, -0.41253] ---- -Label : 1 -Position : [165.443, 614.299] -Measurements : [914.874, 374348, 1.26298, 0.189669] ---- -Label : 1 -Position : [229.864, 614.392] -Measurements : [1399.63, 94221.3, -0.461732, 0.0481431] ---- -Label : 1 -Position : [397.52, 614.736] -Measurements : [1155.51, 195162, -0.211604, -1.331] ---- -Label : 1 -Position : [399.149, 615.156] -Measurements : [1028.56, 215820, 0.159365, -1.44649] ---- -Label : 1 -Position : [160.928, 615.23] -Measurements : [1209.76, 251965, 0.825494, -0.131135] ---- -Label : 1 -Position : [27.0727, 615.61] -Measurements : [1730.59, 507650, -0.412145, -1.16127] ---- -Label : 1 -Position : [162.792, 615.928] -Measurements : [1132.84, 305035, 0.799962, -0.431372] ---- -Label : 1 -Position : [24.9003, 616.489] -Measurements : [1884.29, 338993, -0.572864, -0.677153] ---- -Label : 1 -Position : [620.246, 616.856] -Measurements : [1399.81, 79414.4, -0.494323, 0.0157049] ---- -Label : 1 -Position : [25.064, 617.464] -Measurements : [1740.64, 474181, -0.301654, -1.28318] ---- -Label : 1 -Position : [679.078, 617.517] -Measurements : [1228.53, 118710, 1.39538, 0.899681] ---- -Label : 1 -Position : [763.626, 617.551] -Measurements : [904.116, 171680, 0.285781, -0.837869] ---- -Label : 1 -Position : [449.464, 617.587] -Measurements : [1007.73, 429732, 0.754016, -0.924057] ---- -Label : 1 -Position : [757.66, 617.863] -Measurements : [715.401, 195274, 0.866902, -0.585923] ---- -Label : 1 -Position : [225.465, 618.122] -Measurements : [1576.52, 140558, -0.51971, 0.515011] ---- -Label : 0 -Position : [517.259, 618.376] -Measurements : [905.346, 10356.9, 1.09423, 6.74397] ---- -Label : 1 -Position : [226.963, 619.391] -Measurements : [1593.66, 122213, -0.346648, -0.566329] ---- -Label : 1 -Position : [27.9968, 620.279] -Measurements : [1347.66, 633807, 0.486464, -1.41245] ---- -Label : 1 -Position : [22.8439, 620.437] -Measurements : [1362.71, 527984, 0.241686, -1.31979] ---- -Label : 1 -Position : [227.304, 621.048] -Measurements : [1500.74, 182489, -0.265723, -1.05499] ---- -Label : 1 -Position : [397.74, 621.228] -Measurements : [1294.33, 608484, 0.435371, -1.35002] ---- -Label : 1 -Position : [224.9, 621.331] -Measurements : [1588.34, 212879, 0.0994024, -0.55914] ---- -Label : 0 -Position : [547.315, 621.367] -Measurements : [858.335, 12813.8, -1.24825, 2.37543] ---- -Label : 1 -Position : [630.232, 621.448] -Measurements : [1653.59, 243765, 0.166521, -0.863138] ---- -Label : 1 -Position : [445.648, 621.904] -Measurements : [1793.47, 249477, -0.341991, -0.941242] ---- -Label : 1 -Position : [1005.62, 622.247] -Measurements : [1290, 558674, 0.089665, -1.45355] ---- -Label : 1 -Position : [760.28, 622.472] -Measurements : [1312.64, 200230, 0.0510056, -1.0254] ---- -Label : 0 -Position : [503.897, 622.593] -Measurements : [1289.92, 77478, 0.527279, -0.703087] ---- -Label : 1 -Position : [394.96, 622.928] -Measurements : [1422.88, 538847, 0.183259, -1.32484] ---- -Label : 1 -Position : [438.111, 623.097] -Measurements : [1093.15, 381161, 0.882787, -0.0819444] ---- -Label : 1 -Position : [966.471, 623.478] -Measurements : [1008.86, 339500, 0.264693, -1.43376] ---- -Label : 1 -Position : [1008.55, 623.648] -Measurements : [1514.1, 375138, -0.128177, -0.92859] ---- -Label : 1 -Position : [223.525, 623.759] -Measurements : [1628.24, 297663, 0.401837, -0.302095] ---- -Label : 1 -Position : [393.035, 623.839] -Measurements : [1374.65, 553140, 0.235271, -1.24485] ---- -Label : 0 -Position : [547.771, 624.497] -Measurements : [838.306, 16471.2, -0.594663, 0.551508] ---- -Label : 1 -Position : [634.282, 624.588] -Measurements : [1429.07, 187364, 0.614137, -0.202062] ---- -Label : 1 -Position : [439.392, 624.681] -Measurements : [1146.97, 307115, 0.7285, -0.0404627] ---- -Label : 1 -Position : [1012.4, 624.732] -Measurements : [1424.75, 329039, 0.62268, -0.974572] ---- -Label : 1 -Position : [449.939, 624.807] -Measurements : [1480.06, 291421, -0.161697, -1.38779] ---- -Label : 1 -Position : [225.674, 624.859] -Measurements : [1495.61, 236804, 0.610501, 0.709149] ---- -Label : 1 -Position : [632.719, 625.139] -Measurements : [1538.43, 244454, 0.493099, -0.61549] ---- -Label : 1 -Position : [225.969, 625.226] -Measurements : [1448.69, 236898, 0.744014, 0.995808] ---- -Label : 1 -Position : [78.7339, 625.981] -Measurements : [1050.8, 606251, 0.572999, -1.08684] ---- -Label : 1 -Position : [87.1652, 625.993] -Measurements : [862.626, 242984, 2.05207, 4.50996] ---- -Label : 1 -Position : [83.432, 626.68] -Measurements : [1136.01, 516264, 0.740574, -0.643966] ---- -Label : 1 -Position : [963.496, 626.72] -Measurements : [1209.7, 261596, 0.0189527, -1.39528] ---- -Label : 1 -Position : [635.963, 626.817] -Measurements : [1394.26, 175477, 0.622809, -0.210303] ---- -Label : 1 -Position : [761.875, 626.825] -Measurements : [1599.66, 226034, -0.28443, -0.746557] ---- -Label : 1 -Position : [224.232, 627.192] -Measurements : [1511.04, 270670, 0.76139, 0.454238] ---- -Label : 1 -Position : [966.576, 627.42] -Measurements : [1038.25, 308571, 0.312293, -1.42961] ---- -Label : 0 -Position : [515.403, 628.015] -Measurements : [879.467, 5137.89, 1.44959, 7.48975] ---- -Label : 1 -Position : [442.576, 628.048] -Measurements : [1210.42, 127373, 0.50762, 0.935571] ---- -Label : 1 -Position : [650.696, 628.182] -Measurements : [1123.87, 49497.6, -0.17434, -0.770055] ---- -Label : 1 -Position : [652.76, 628.616] -Measurements : [1155.73, 53051.8, -0.286533, -0.816427] ---- -Label : 0 -Position : [515.568, 628.895] -Measurements : [879.467, 5137.89, 1.44959, 7.48975] ---- -Label : 1 -Position : [759.256, 629.128] -Measurements : [1422.45, 342307, 0.0222468, -1.29925] ---- -Label : 1 -Position : [657.442, 629.734] -Measurements : [1198.25, 50291.5, -0.26236, -0.802717] ---- -Label : 1 -Position : [80.3839, 629.97] -Measurements : [1577.12, 441700, -0.0447074, -1.22484] ---- -Label : 1 -Position : [80.36, 630.264] -Measurements : [1578.59, 429767, 0.0344501, -1.3347] ---- -Label : 1 -Position : [79.8048, 630.576] -Measurements : [1586.45, 443481, -0.0441499, -1.3246] ---- -Label : 0 -Position : [527.556, 630.69] -Measurements : [838.26, 11052.5, -0.579509, 0.0756377] ---- -Label : 1 -Position : [635.352, 631.688] -Measurements : [1494.18, 177045, 0.113623, -0.553691] ---- -Label : 1 -Position : [763.164, 631.767] -Measurements : [1168.13, 466586, 0.570538, -1.34331] ---- -Label : 1 -Position : [18.92, 631.8] -Measurements : [991.241, 285977, 0.742128, -0.833555] ---- -Label : 1 -Position : [220.508, 632.123] -Measurements : [1796.79, 199863, -0.200005, 0.62394] ---- -Label : 1 -Position : [20.5197, 632.497] -Measurements : [933.061, 287088, 0.961963, -0.518892] ---- -Label : 1 -Position : [959.4, 633.376] -Measurements : [899.198, 208629, 0.690542, -0.496948] ---- -Label : 1 -Position : [719.32, 633.736] -Measurements : [1354.96, 147443, -0.106377, -0.998034] ---- -Label : 0 -Position : [527.043, 633.867] -Measurements : [809.132, 12263.1, -0.249287, -0.605208] ---- -Label : 1 -Position : [963.67, 633.894] -Measurements : [683.155, 178853, 1.46831, 1.35291] ---- -Label : 1 -Position : [19.7224, 634.069] -Measurements : [900.164, 311706, 0.949301, -0.563988] ---- -Label : 1 -Position : [718.006, 634.517] -Measurements : [1284.63, 177830, -0.0829044, -1.11961] ---- -Label : 0 -Position : [540.648, 634.618] -Measurements : [953.967, 12861.9, 0.655317, -0.783391] ---- -Label : 1 -Position : [689.461, 635.13] -Measurements : [962.756, 73066.3, 1.23401, 1.33694] ---- -Label : 1 -Position : [636.717, 635.378] -Measurements : [1767.92, 224343, -0.00251318, -0.939323] ---- -Label : 1 -Position : [220.136, 635.896] -Measurements : [1851.48, 216171, -1.1947, 1.02695] ---- -Label : 1 -Position : [638.717, 636.163] -Measurements : [1830.87, 257753, -0.200122, -1.08728] ---- -Label : 1 -Position : [693.72, 636.296] -Measurements : [1169.43, 154007, 0.853101, -0.184185] ---- -Label : 1 -Position : [78.312, 636.408] -Measurements : [1254.12, 337591, 0.914237, -0.500015] ---- -Label : 1 -Position : [716.984, 636.418] -Measurements : [1056.63, 183055, 0.551762, -0.683357] ---- -Label : 1 -Position : [691.927, 636.819] -Measurements : [1062.01, 102471, 0.95495, -0.0353323] ---- -Label : 1 -Position : [79.7674, 636.826] -Measurements : [1269.06, 357447, 0.850762, -0.718324] ---- -Label : 1 -Position : [638.936, 637.832] -Measurements : [1840.86, 258591, -0.283776, -1.00201] ---- -Label : 1 -Position : [658.176, 637.861] -Measurements : [1511.8, 191555, -0.180277, -1.022] ---- -Label : 1 -Position : [955.556, 637.937] -Measurements : [736.643, 96568.3, 0.53228, -0.945341] ---- -Label : 1 -Position : [224.634, 638.018] -Measurements : [1553.21, 383484, -0.176531, -1.49962] ---- -Label : 1 -Position : [660.782, 638.093] -Measurements : [1584.1, 160129, -0.305115, -0.649177] ---- -Label : 1 -Position : [78.7125, 638.388] -Measurements : [1077.97, 164820, 1.10866, 0.606104] ---- -Label : 1 -Position : [661.464, 638.856] -Measurements : [1571.78, 150928, -0.285468, -0.612174] ---- -Label : 1 -Position : [367.348, 639.047] -Measurements : [969.606, 336796, 0.849322, 0.144531] ---- -Label : 1 -Position : [639.406, 639.134] -Measurements : [1864.95, 246250, -0.0962476, -0.97583] ---- -Label : 1 -Position : [215.9, 640.49] -Measurements : [891.219, 491725, 1.09034, -0.512876] ---- -Label : 1 -Position : [217.138, 640.535] -Measurements : [1124.14, 627990, 0.534546, -1.48007] ---- -Label : 1 -Position : [719.32, 641.416] -Measurements : [1052.48, 162883, 0.627541, -0.31508] ---- -Label : 1 -Position : [220.648, 641.528] -Measurements : [1223.89, 581861, 0.3473, -1.58541] ---- -Label : 1 -Position : [371.92, 641.872] -Measurements : [1371.47, 628345, 0.335862, -1.28753] ---- -Label : 1 -Position : [164.925, 642.383] -Measurements : [997.215, 332672, 0.447158, -1.20729] ---- -Label : 0 -Position : [487.669, 643.062] -Measurements : [872.865, 130906, 0.678553, -0.488235] ---- -Label : 1 -Position : [72.68, 643.064] -Measurements : [1370.61, 174143, 0.412515, -0.152904] ---- -Label : 1 -Position : [71.1286, 643.487] -Measurements : [1363.65, 159548, 0.516921, 0.155043] ---- -Label : 1 -Position : [721.987, 643.529] -Measurements : [1151.98, 186851, 0.602096, -0.273056] ---- -Label : 0 -Position : [481.56, 643.934] -Measurements : [1278.77, 75714.6, 0.499343, -0.533136] ---- -Label : 1 -Position : [345.932, 643.965] -Measurements : [898.039, 109657, 0.293744, -0.800513] ---- -Label : 0 -Position : [526.188, 644.129] -Measurements : [800.554, 7117.08, -1.27835, 1.38297] ---- -Label : 1 -Position : [17.5728, 644.171] -Measurements : [784.825, 151363, 0.590761, -0.902371] ---- -Label : 1 -Position : [14.824, 644.6] -Measurements : [887.17, 130667, 0.193671, -0.962131] ---- -Label : 1 -Position : [68.6911, 644.736] -Measurements : [1438.19, 306986, 0.809448, 0.131956] ---- -Label : 1 -Position : [375.677, 646.253] -Measurements : [1160.14, 710975, 0.786928, -1.10194] ---- -Label : 1 -Position : [715.046, 646.263] -Measurements : [1019.72, 75845.4, 0.954942, 2.73266] ---- -Label : 1 -Position : [68.3374, 646.365] -Measurements : [1720.93, 455144, 0.476677, -0.793437] ---- -Label : 1 -Position : [646.903, 646.556] -Measurements : [2221.57, 434222, -0.264716, -0.912646] ---- -Label : 1 -Position : [666.584, 647.048] -Measurements : [1246.22, 122547, 0.136985, -0.769833] ---- -Label : 1 -Position : [767.949, 647.067] -Measurements : [743.155, 147586, 1.46344, 2.33072] ---- -Label : 1 -Position : [167.912, 647.16] -Measurements : [1545.59, 352033, 0.124075, -0.683738] ---- -Label : 1 -Position : [646.616, 647.56] -Measurements : [2209.56, 442573, -0.202485, -1.07395] ---- -Label : 1 -Position : [19.2643, 647.622] -Measurements : [725.527, 126482, 1.09316, -0.0232116] ---- -Label : 1 -Position : [425.173, 647.85] -Measurements : [1161.71, 463657, 0.197698, -1.6399] ---- -Label : 1 -Position : [350.928, 648.528] -Measurements : [982.83, 225073, 0.652522, -0.376124] ---- -Label : 1 -Position : [667.803, 648.61] -Measurements : [1294.38, 127354, 0.258762, -0.450068] ---- -Label : 1 -Position : [348.665, 649.488] -Measurements : [906.754, 267424, 0.902725, -0.104222] ---- -Label : 1 -Position : [646.31, 649.623] -Measurements : [2089.38, 509254, 0.0794223, -1.32463] ---- -Label : 1 -Position : [666.352, 649.786] -Measurements : [1253.58, 111373, 0.299511, -0.699559] ---- -Label : 1 -Position : [428.24, 650.576] -Measurements : [1481.36, 351115, -0.356533, -1.06592] ---- -Label : 1 -Position : [166.567, 650.653] -Measurements : [1549.69, 340416, -0.105348, -0.760685] ---- -Label : 1 -Position : [71.656, 650.744] -Measurements : [1988.6, 427646, 0.196713, -1.2895] ---- -Label : 1 -Position : [69.8398, 650.968] -Measurements : [1962.14, 468000, 0.119201, -1.24634] ---- -Label : 1 -Position : [764.888, 651.144] -Measurements : [1163.79, 318225, 0.551722, -0.860368] ---- -Label : 1 -Position : [424.362, 652.544] -Measurements : [1749.67, 347800, -0.614633, -0.673145] ---- -Label : 1 -Position : [760.961, 652.765] -Measurements : [1084.96, 348471, 0.60671, -0.862569] ---- -Label : 1 -Position : [337.464, 653.225] -Measurements : [1154.71, 184391, -0.160176, -0.523177] ---- -Label : 1 -Position : [968.483, 654.121] -Measurements : [761.38, 227911, 0.923138, -0.448279] ---- -Label : 1 -Position : [726.114, 654.151] -Measurements : [1745.4, 689909, 0.0751936, -1.6574] ---- -Label : 1 -Position : [336.08, 654.16] -Measurements : [1144.03, 180941, -0.409782, -0.920301] ---- -Label : 1 -Position : [1017.77, 654.368] -Measurements : [1214.95, 241826, -0.380885, -0.958212] ---- -Label : 1 -Position : [335.701, 654.57] -Measurements : [1115.77, 188132, -0.314346, -1.09653] ---- -Label : 1 -Position : [162.28, 654.84] -Measurements : [1295.62, 216478, 0.161164, -1.08242] ---- -Label : 1 -Position : [665.715, 654.854] -Measurements : [1262.22, 90788.8, 0.0866523, -0.832344] ---- -Label : 1 -Position : [1020.47, 654.876] -Measurements : [1352.78, 96442.4, 0.458003, -0.821514] ---- -Label : 1 -Position : [651.771, 655.597] -Measurements : [1336.6, 52841.8, -0.173577, -0.896528] ---- -Label : 1 -Position : [722.657, 655.597] -Measurements : [1649.8, 515605, 0.0252072, -1.561] ---- -Label : 1 -Position : [70.3483, 655.777] -Measurements : [1849.38, 489910, 0.204139, -0.945411] ---- -Label : 1 -Position : [645.958, 655.794] -Measurements : [1404.18, 94598.8, 1.04068, 1.87631] ---- -Label : 0 -Position : [538.063, 656.278] -Measurements : [877.367, 68801.9, 1.44427, 3.37491] ---- -Label : 0 -Position : [556.593, 656.368] -Measurements : [795.135, 39279.8, 1.82693, 7.55009] ---- -Label : 1 -Position : [1021.26, 656.547] -Measurements : [1240.64, 137130, 0.375484, -0.4541] ---- -Label : 1 -Position : [961.58, 657.077] -Measurements : [921.766, 190029, 0.170197, -1.06815] ---- -Label : 1 -Position : [766.413, 657.165] -Measurements : [1197.69, 410140, 0.437892, -1.31718] ---- -Label : 1 -Position : [665.048, 657.288] -Measurements : [1204.65, 67675.6, 0.879421, -0.115793] ---- -Label : 1 -Position : [422.608, 657.744] -Measurements : [1596.29, 549647, -0.345803, -1.2793] ---- -Label : 1 -Position : [162.151, 657.783] -Measurements : [1068.91, 340271, 0.452176, -1.23948] ---- -Label : 1 -Position : [649.176, 657.8] -Measurements : [1294.57, 60500.7, -0.229286, -1.02879] ---- -Label : 1 -Position : [769.496, 657.8] -Measurements : [1112.1, 356364, 0.716973, -1.06177] ---- -Label : 1 -Position : [72.168, 657.912] -Measurements : [1648.33, 355796, 0.463576, -0.237449] ---- -Label : 1 -Position : [965.032, 657.952] -Measurements : [922.708, 217739, 0.337217, -1.14451] ---- -Label : 0 -Position : [483.084, 658.044] -Measurements : [854.813, 3977.18, -0.266403, -0.294176] ---- -Label : 1 -Position : [327.57, 658.195] -Measurements : [837.054, 108616, 0.42112, -0.807673] ---- -Label : 1 -Position : [764.587, 658.316] -Measurements : [1001.37, 406383, 0.71888, -1.00224] ---- -Label : 1 -Position : [422.673, 658.76] -Measurements : [1481.02, 644628, -0.112398, -1.5576] ---- -Label : 1 -Position : [724.952, 658.824] -Measurements : [2079.1, 431633, -0.646768, -0.357068] ---- -Label : 1 -Position : [167.184, 659.083] -Measurements : [627.541, 154888, 1.80979, 2.8991] ---- -Label : 1 -Position : [205.567, 659.474] -Measurements : [651.925, 146220, 1.19523, 0.194839] ---- -Label : 0 -Position : [518.574, 660.945] -Measurements : [783.345, 17212.2, -0.228475, -1.30841] ---- -Label : 1 -Position : [72.7293, 661.025] -Measurements : [1441.44, 331111, 0.107511, -1.00881] ---- -Label : 1 -Position : [421.074, 661.214] -Measurements : [957.763, 588225, 1.00047, -0.617813] ---- -Label : 1 -Position : [668.466, 661.664] -Measurements : [1138.64, 63929.5, 1.33893, 0.921879] ---- -Label : 0 -Position : [537.113, 661.682] -Measurements : [790.204, 19786, -0.135555, 0.571849] ---- -Label : 1 -Position : [325.84, 662.352] -Measurements : [985.124, 93874.5, -0.279558, -0.827325] ---- -Label : 0 -Position : [536.07, 662.384] -Measurements : [797.187, 14836.7, -0.85645, 0.644137] ---- -Label : 1 -Position : [209.384, 663.032] -Measurements : [772.789, 133137, 0.821945, -0.533571] ---- -Label : 1 -Position : [213.506, 663.095] -Measurements : [689.269, 115301, 1.32993, 0.721288] ---- -Label : 1 -Position : [73.192, 664.056] -Measurements : [1245.63, 312267, 0.50745, -0.608178] ---- -Label : 1 -Position : [655.963, 664.085] -Measurements : [1458.53, 143172, 0.548294, 0.220907] ---- -Label : 1 -Position : [77.8493, 665.478] -Measurements : [1116.62, 214089, 1.50817, 1.70207] ---- -Label : 1 -Position : [621.528, 665.992] -Measurements : [1799.15, 149477, 0.423776, -0.610854] ---- -Label : 1 -Position : [651.224, 666.504] -Measurements : [1556.11, 163002, 0.247162, -0.496522] ---- -Label : 1 -Position : [618.79, 666.802] -Measurements : [1766.73, 195275, 0.604378, -0.214534] ---- -Label : 1 -Position : [321.858, 666.888] -Measurements : [655.148, 144978, 0.794163, -0.989915] ---- -Label : 1 -Position : [1016.38, 667.902] -Measurements : [1286.93, 587223, 0.282382, -1.19698] ---- -Label : 1 -Position : [410.125, 668.006] -Measurements : [1083.49, 320184, 0.43898, -1.02464] ---- -Label : 1 -Position : [77.7727, 668.073] -Measurements : [1009.71, 241215, 1.43994, 1.92425] ---- -Label : 1 -Position : [653.23, 668.291] -Measurements : [1681.02, 206143, 0.176655, -0.784201] ---- -Label : 0 -Position : [515.781, 668.499] -Measurements : [883.445, 8828.79, -0.8104, -0.0532019] ---- -Label : 1 -Position : [616.685, 668.705] -Measurements : [1728.95, 215951, 0.392863, -0.847413] ---- -Label : 1 -Position : [968.773, 669.793] -Measurements : [934.552, 257789, 0.524287, -1.14392] ---- -Label : 1 -Position : [1013.61, 670.298] -Measurements : [1234.39, 684096, 0.306861, -1.45858] ---- -Label : 0 -Position : [588.996, 670.617] -Measurements : [1422.8, 29963.7, 2.69111, 11.7876] ---- -Label : 1 -Position : [973.736, 670.752] -Measurements : [1520.1, 278319, -0.516057, -0.285793] ---- -Label : 0 -Position : [579.748, 671.414] -Measurements : [1431.96, 106078, 2.46061, 6.13458] ---- -Label : 1 -Position : [972.275, 671.734] -Measurements : [1490.81, 277405, -0.266265, -0.31192] ---- -Label : 0 -Position : [547.265, 672.059] -Measurements : [778.818, 37190.3, -0.0268415, -0.167969] ---- -Label : 1 -Position : [655.444, 672.47] -Measurements : [1908.63, 351348, -0.181535, -1.13199] ---- -Label : 1 -Position : [622.04, 672.648] -Measurements : [2141.65, 148466, 0.248506, -0.988989] ---- -Label : 1 -Position : [413.272, 672.656] -Measurements : [1135.69, 307467, 0.510597, -0.642238] ---- -Label : 1 -Position : [1018.28, 672.8] -Measurements : [1856.35, 259595, 0.156641, -1.14678] ---- -Label : 1 -Position : [620.299, 673.163] -Measurements : [2093.52, 175901, 0.0830093, -0.786095] ---- -Label : 1 -Position : [622.065, 673.247] -Measurements : [2112.96, 147719, 0.390355, -0.875959] ---- -Label : 1 -Position : [688.381, 673.909] -Measurements : [1205.05, 119376, 0.00799213, -1.24933] ---- -Label : 0 -Position : [534.536, 674.111] -Measurements : [919.752, 4337.91, 0.87782, 2.11114] ---- -Label : 0 -Position : [527.383, 674.5] -Measurements : [1096.82, 117395, 1.82919, 2.56327] ---- -Label : 1 -Position : [653.784, 675.208] -Measurements : [1890.34, 311800, 0.0807829, -1.1148] ---- -Label : 1 -Position : [690.648, 675.208] -Measurements : [1286.24, 100594, -0.176539, -0.686918] ---- -Label : 1 -Position : [693.533, 675.27] -Measurements : [1304.31, 78387.3, 0.229361, -0.822617] ---- -Label : 1 -Position : [975.774, 675.582] -Measurements : [1929.67, 134623, 0.0651155, -0.819899] ---- -Label : 0 -Position : [515.307, 675.665] -Measurements : [943.436, 54382.4, 2.37623, 6.52189] ---- -Label : 1 -Position : [407.64, 675.728] -Measurements : [1320.52, 304427, 0.147623, -1.17011] ---- -Label : 1 -Position : [622.12, 675.976] -Measurements : [2115.05, 146358, 0.425116, -0.960373] ---- -Label : 0 -Position : [534.066, 676.051] -Measurements : [936.045, 5261.81, 0.805183, 1.68575] ---- -Label : 1 -Position : [406.791, 676.117] -Measurements : [1314.99, 364777, 0.149226, -1.20072] ---- -Label : 0 -Position : [517.311, 676.278] -Measurements : [1079.21, 166704, 1.74736, 2.69667] ---- -Label : 1 -Position : [649.626, 676.426] -Measurements : [1551.55, 277559, 0.683601, -0.796943] ---- -Label : 1 -Position : [416.29, 677.167] -Measurements : [950.588, 113002, 0.397363, -0.430585] ---- -Label : 1 -Position : [977.832, 677.408] -Measurements : [2012.3, 168949, 0.0242875, -0.752349] ---- -Label : 1 -Position : [405.518, 677.462] -Measurements : [1348.23, 425943, 0.170571, -1.16512] ---- -Label : 1 -Position : [621.528, 678.792] -Measurements : [1901.38, 149894, 0.692104, -0.182475] ---- -Label : 0 -Position : [574.408, 679.108] -Measurements : [1168.51, 40995.7, -0.122898, -0.763841] ---- -Label : 0 -Position : [576.008, 679.187] -Measurements : [1225.92, 27986.3, 0.01316, -1.15928] ---- -Label : 1 -Position : [616.812, 679.71] -Measurements : [1531.25, 168993, 1.15595, 0.159621] ---- -Label : 1 -Position : [407.84, 680.184] -Measurements : [1199.85, 485625, 0.779406, -0.83389] ---- -Label : 1 -Position : [982.286, 680.676] -Measurements : [1718.36, 187728, -0.105281, -0.680188] ---- -Label : 0 -Position : [487.025, 680.714] -Measurements : [906.276, 4556.15, -0.882028, 0.577918] ---- -Label : 1 -Position : [650.951, 680.747] -Measurements : [1500.31, 229516, 1.0241, 0.26796] ---- -Label : 1 -Position : [402.038, 680.978] -Measurements : [1215.16, 449075, 0.66182, -0.729854] ---- -Label : 1 -Position : [978.217, 681.305] -Measurements : [1859.57, 134594, 0.480071, -0.713095] ---- -Label : 1 -Position : [402.52, 681.36] -Measurements : [1196.93, 425444, 0.760612, -0.485687] ---- -Label : 1 -Position : [725.531, 681.621] -Measurements : [1202.61, 67219.6, -0.122566, -0.647671] ---- -Label : 1 -Position : [658.167, 682.413] -Measurements : [1695.73, 147622, 0.607021, -0.154088] ---- -Label : 1 -Position : [980.904, 682.528] -Measurements : [1767.16, 144774, -0.0258514, -0.405201] ---- -Label : 1 -Position : [390.15, 684.46] -Measurements : [1117.16, 507760, 0.367595, -1.535] ---- -Label : 1 -Position : [737.24, 684.936] -Measurements : [1320.38, 42841.3, -0.2018, -0.224263] ---- -Label : 1 -Position : [387.16, 684.944] -Measurements : [1321.3, 447000, -0.0174756, -1.54706] ---- -Label : 1 -Position : [736.083, 685.06] -Measurements : [1356.46, 37994.9, -0.310419, -0.145552] ---- -Label : 1 -Position : [739.274, 685.082] -Measurements : [1299.13, 47068.5, -0.184465, -0.579972] ---- -Label : 1 -Position : [654.296, 685.448] -Measurements : [1673.69, 194879, 0.246342, -0.327918] ---- -Label : 1 -Position : [55.272, 685.536] -Measurements : [838.736, 170550, 0.679353, -0.423567] ---- -Label : 1 -Position : [49.5741, 685.626] -Measurements : [901.655, 111832, 0.557721, 0.103901] ---- -Label : 1 -Position : [56.8424, 685.661] -Measurements : [807.758, 161795, 0.781385, -0.132215] ---- -Label : 0 -Position : [548.86, 685.866] -Measurements : [980.933, 42147.1, 1.13393, 3.13981] ---- -Label : 1 -Position : [49.64, 686.048] -Measurements : [928.037, 101081, 0.61425, 0.203384] ---- -Label : 0 -Position : [485.44, 686.102] -Measurements : [887.81, 19268.9, 0.995044, 2.67467] ---- -Label : 0 -Position : [543.41, 686.241] -Measurements : [1041.13, 52347.5, 1.95783, 4.51984] ---- -Label : 0 -Position : [524.397, 686.464] -Measurements : [1162.19, 101653, 2.18648, 6.96006] ---- -Label : 1 -Position : [682.968, 686.472] -Measurements : [1222.65, 98592.7, 0.160611, -0.661722] ---- -Label : 1 -Position : [727, 686.472] -Measurements : [1356.1, 57905.2, -0.57116, -0.0947079] ---- -Label : 1 -Position : [978.983, 686.91] -Measurements : [1613.2, 163208, -0.22867, 0.642146] ---- -Label : 1 -Position : [713.863, 687.646] -Measurements : [1451.33, 140160, 0.00523052, -1.12502] ---- -Label : 1 -Position : [206.972, 687.695] -Measurements : [983.275, 355616, 0.789767, -0.482866] ---- -Label : 1 -Position : [206.566, 687.709] -Measurements : [983.275, 355616, 0.789767, -0.482866] ---- -Label : 1 -Position : [723.544, 687.898] -Measurements : [1297.93, 69015.3, 0.276871, -0.616712] ---- -Label : 1 -Position : [686.711, 688.307] -Measurements : [1377.23, 77359.3, 0.895343, 1.77447] ---- -Label : 0 -Position : [571.043, 688.738] -Measurements : [901.792, 4547.6, -0.731337, 1.4039] ---- -Label : 1 -Position : [719.579, 688.845] -Measurements : [1393.49, 144740, 0.696712, -0.663996] ---- -Label : 1 -Position : [164.969, 688.965] -Measurements : [715.536, 325148, 1.52069, 0.96285] ---- -Label : 1 -Position : [715.736, 689.032] -Measurements : [1542.32, 151163, 0.153088, -0.905249] ---- -Label : 1 -Position : [54.8825, 689.621] -Measurements : [1011.74, 114194, 0.406325, -0.163878] ---- -Label : 1 -Position : [391.765, 689.631] -Measurements : [1081.16, 376163, 0.707204, -0.953504] ---- -Label : 0 -Position : [551.418, 689.811] -Measurements : [884.593, 30976, 1.06188, 3.67884] ---- -Label : 1 -Position : [708.545, 690.159] -Measurements : [1726.49, 235613, 0.0238457, -1.00875] ---- -Label : 1 -Position : [983.464, 690.208] -Measurements : [1331.81, 367534, -0.0399181, -1.23515] ---- -Label : 1 -Position : [47.6013, 690.502] -Measurements : [856.738, 146734, 0.692348, -0.287713] ---- -Label : 1 -Position : [703.96, 690.568] -Measurements : [1779.34, 256063, -0.276257, -1.10143] ---- -Label : 0 -Position : [477.421, 690.616] -Measurements : [798.826, 8898.81, 0.203135, 0.557101] ---- -Label : 0 -Position : [490.179, 690.819] -Measurements : [989.34, 15028.7, 0.0997386, 1.83382] ---- -Label : 0 -Position : [524.779, 690.85] -Measurements : [1113.43, 104904, 2.49195, 7.80539] ---- -Label : 1 -Position : [206.824, 691.168] -Measurements : [1355.14, 281065, 0.155999, -0.747438] ---- -Label : 1 -Position : [685.015, 691.303] -Measurements : [1412.51, 70869.9, 0.99385, 1.72712] ---- -Label : 0 -Position : [469.71, 691.368] -Measurements : [856.655, 9324.99, -1.14346, 0.142251] ---- -Label : 0 -Position : [505.637, 691.796] -Measurements : [1017.56, 93842.1, 3.18601, 10.3167] ---- -Label : 0 -Position : [448.147, 691.965] -Measurements : [1044.07, 17306.6, 0.694973, -0.20513] ---- -Label : 1 -Position : [701.035, 692.544] -Measurements : [1724.98, 298547, -0.054249, -1.47061] ---- -Label : 1 -Position : [630.264, 693.2] -Measurements : [1801.23, 94509.7, 0.18025, -0.41504] ---- -Label : 1 -Position : [163.816, 693.216] -Measurements : [1430.95, 600693, 0.0389097, -1.39027] ---- -Label : 1 -Position : [983.618, 693.519] -Measurements : [1098.45, 345384, 0.535119, -0.963905] ---- -Label : 0 -Position : [503.696, 693.567] -Measurements : [956.55, 54666.3, 3.53276, 13.4114] ---- -Label : 1 -Position : [982.624, 693.645] -Measurements : [1145.16, 334227, 0.389084, -1.02992] ---- -Label : 1 -Position : [47.3356, 693.752] -Measurements : [886.538, 138820, 0.746525, -0.023753] ---- -Label : 1 -Position : [46.8316, 693.921] -Measurements : [861.162, 136460, 0.719406, -0.0108743] ---- -Label : 1 -Position : [165.907, 695.516] -Measurements : [1514.23, 699505, 0.108439, -1.49279] ---- -Label : 1 -Position : [30.5928, 696.046] -Measurements : [812.548, 105313, 0.29701, -1.10928] ---- -Label : 1 -Position : [42.984, 696.288] -Measurements : [720.49, 107204, 1.23598, 1.21211] ---- -Label : 1 -Position : [633.507, 696.501] -Measurements : [1730.11, 73242.4, 1.22178, 0.729323] ---- -Label : 1 -Position : [211.513, 696.641] -Measurements : [1484.06, 184561, -0.0754644, -1.38894] ---- -Label : 0 -Position : [440.551, 697.159] -Measurements : [1089.97, 25064.2, 0.78966, -0.1101] ---- -Label : 1 -Position : [299.608, 697.232] -Measurements : [794.254, 213956, 1.26757, 0.359448] ---- -Label : 0 -Position : [490.757, 697.281] -Measurements : [1123.08, 113316, 1.94013, 3.9328] ---- -Label : 1 -Position : [30.696, 697.312] -Measurements : [855.093, 101910, 0.396883, -0.694619] ---- -Label : 1 -Position : [364.632, 697.744] -Measurements : [989.14, 197569, 0.23462, -1.34218] ---- -Label : 1 -Position : [634.847, 697.976] -Measurements : [1628.92, 74376.4, 0.984118, 1.91579] ---- -Label : 1 -Position : [161.256, 698.336] -Measurements : [2052.31, 332781, -0.612827, -0.186191] ---- -Label : 1 -Position : [164.181, 698.869] -Measurements : [1811.12, 580326, -0.282066, -1.27242] ---- -Label : 1 -Position : [158.924, 698.901] -Measurements : [2032.69, 246344, -0.385655, 0.209423] ---- -Label : 1 -Position : [299.17, 698.99] -Measurements : [837.191, 227512, 1.06925, -0.197763] ---- -Label : 1 -Position : [164.612, 699.103] -Measurements : [1729.77, 648245, -0.137421, -1.44267] ---- -Label : 0 -Position : [488.985, 699.288] -Measurements : [1108.09, 122490, 1.81843, 3.34549] ---- -Label : 1 -Position : [367.681, 699.56] -Measurements : [987.821, 191059, 0.243993, -1.24114] ---- -Label : 1 -Position : [205.788, 699.67] -Measurements : [1275.03, 447995, 0.21942, -1.51897] ---- -Label : 1 -Position : [209.384, 699.872] -Measurements : [1357.6, 398827, -0.00553489, -1.47772] ---- -Label : 1 -Position : [349.034, 700.386] -Measurements : [708.733, 135316, 0.638928, -1.19979] ---- -Label : 1 -Position : [981.928, 700.448] -Measurements : [949.902, 103593, 0.402101, 0.0802957] ---- -Label : 1 -Position : [979.481, 700.679] -Measurements : [995.192, 101721, 0.236388, -0.0629493] ---- -Label : 1 -Position : [360.412, 700.9] -Measurements : [853.195, 166116, 0.566104, -0.899401] ---- -Label : 1 -Position : [353.368, 701.328] -Measurements : [819.785, 124189, 0.12974, -1.48596] ---- -Label : 1 -Position : [300.57, 701.388] -Measurements : [1008.2, 441653, 0.94759, -0.383009] ---- -Label : 1 -Position : [154.947, 701.613] -Measurements : [1868.02, 288631, -0.285888, -0.699148] ---- -Label : 1 -Position : [32.7158, 701.613] -Measurements : [815.192, 74028.6, 0.59833, -0.330883] ---- -Label : 0 -Position : [498.827, 701.643] -Measurements : [868.608, 8156.59, 0.150489, -0.898373] ---- -Label : 1 -Position : [24.5461, 701.854] -Measurements : [1030.43, 225769, 0.325376, -1.01796] ---- -Label : 0 -Position : [574.13, 702.349] -Measurements : [905.362, 28444.8, 3.08757, 9.50173] ---- -Label : 1 -Position : [25.576, 703.456] -Measurements : [1099.73, 182046, 0.412705, -0.961149] ---- -Label : 1 -Position : [155.112, 703.456] -Measurements : [1785.8, 404679, -0.276363, -0.775961] ---- -Label : 1 -Position : [978.969, 703.885] -Measurements : [1095.63, 44329.1, 0.997515, 2.32127] ---- -Label : 1 -Position : [299.717, 704.649] -Measurements : [1367.15, 628364, 0.342345, -1.0069] ---- -Label : 0 -Position : [520.946, 705.086] -Measurements : [871.161, 8660.73, -0.560863, 0.205994] ---- -Label : 0 -Position : [519.869, 705.272] -Measurements : [873.83, 8245.93, -0.699065, 0.38047] ---- -Label : 1 -Position : [150.78, 705.75] -Measurements : [1483.63, 272587, 0.280781, -0.730247] ---- -Label : 1 -Position : [299.096, 705.936] -Measurements : [1483.34, 557034, 0.114789, -0.854361] ---- -Label : 1 -Position : [350.728, 706.152] -Measurements : [500.694, 68732.8, 2.36473, 4.51725] ---- -Label : 1 -Position : [21.8929, 706.172] -Measurements : [808.934, 280206, 0.923856, -0.651785] ---- -Label : 0 -Position : [546.041, 707.56] -Measurements : [927.314, 878.759, 0.900077, 0.942395] ---- -Label : 0 -Position : [542.421, 708.379] -Measurements : [955.462, 8109.82, 3.30465, 15.8433] ---- -Label : 1 -Position : [153.064, 710.112] -Measurements : [1490.61, 162933, -0.374763, -0.439229] ---- -Label : 1 -Position : [157.228, 710.235] -Measurements : [1216.04, 314988, 0.162348, -1.26141] ---- -Label : 1 -Position : [302.798, 710.389] -Measurements : [1823.33, 579270, -0.287856, -0.998621] ---- -Label : 1 -Position : [294.963, 710.607] -Measurements : [1455.99, 239799, -0.230773, -0.575386] ---- -Label : 0 -Position : [536.318, 710.642] -Measurements : [1029.55, 50313.8, 1.05986, 2.76013] ---- -Label : 0 -Position : [533.06, 710.674] -Measurements : [1010.07, 54411.4, 1.10119, 2.35511] ---- -Label : 0 -Position : [546.055, 711.866] -Measurements : [912.763, 631.624, 0.515326, 0.425384] ---- -Label : 0 -Position : [510.557, 712.676] -Measurements : [951.179, 9523.27, 0.350709, 1.27443] ---- -Label : 1 -Position : [297.56, 713.104] -Measurements : [1457.39, 438392, -0.0212596, -1.09904] ---- -Label : 1 -Position : [18.916, 714.461] -Measurements : [876.194, 266915, 0.718832, -1.08181] ---- -Label : 1 -Position : [14.7209, 715.368] -Measurements : [1370.26, 497980, 0.5686, -0.134113] ---- -Label : 0 -Position : [452.911, 715.449] -Measurements : [1007.5, 3226.47, -0.743682, 6.73847] ---- -Label : 1 -Position : [149.48, 715.744] -Measurements : [1520.04, 119428, 0.040345, -1.16042] ---- -Label : 1 -Position : [148.225, 715.854] -Measurements : [1474.07, 113152, 0.106992, -1.10525] ---- -Label : 0 -Position : [463.798, 716.417] -Measurements : [917.118, 6401.58, -2.20401, 5.22719] ---- -Label : 1 -Position : [300.191, 716.606] -Measurements : [1025.55, 487672, 1.02716, -0.499084] ---- -Label : 1 -Position : [16.872, 717.28] -Measurements : [1305.97, 363071, 0.378194, -0.247805] ---- -Label : 0 -Position : [479.692, 717.48] -Measurements : [887.859, 3070.38, 0.126614, -0.179796] ---- -Label : 1 -Position : [144.227, 717.49] -Measurements : [1216.61, 99596, -0.1486, 0.192024] ---- -Label : 1 -Position : [14.807, 717.57] -Measurements : [1564.15, 447249, 0.4224, -0.257984] ---- -Label : 0 -Position : [398.984, 718.227] -Measurements : [1079.88, 9404.83, -0.785823, 3.18214] ---- -Label : 0 -Position : [435.373, 718.349] -Measurements : [946.567, 4530.59, 0.241578, 0.757157] ---- -Label : 0 -Position : [479.643, 718.359] -Measurements : [888.926, 3277.37, 0.109919, -0.451952] ---- -Label : 1 -Position : [150.555, 719.225] -Measurements : [1350.55, 203038, -0.398947, -0.835851] ---- -Label : 1 -Position : [143.848, 719.84] -Measurements : [1126.2, 105042, -0.601984, -0.0887272] ---- -Label : 1 -Position : [149.746, 720.238] -Measurements : [1288.84, 217938, -0.18522, -1.0689] ---- -Label : 0 -Position : [483.335, 720.341] -Measurements : [864.603, 4307.41, 0.452438, -0.605493] ---- -Label : 1 -Position : [10.728, 720.352] -Measurements : [1959.16, 289383, 0.202743, -0.765113] ---- -Label : 1 -Position : [6.76788, 720.422] -Measurements : [1990.33, 305216, -0.220494, -0.268993] ---- -Label : 0 -Position : [426.593, 720.486] -Measurements : [902.532, 3949.37, 0.506826, 2.43821] ---- -Label : 0 -Position : [516.346, 721.2] -Measurements : [919.769, 1646.43, -4.1801, 19.9773] ---- -Label : 0 -Position : [407.554, 722.727] -Measurements : [1074.67, 14572.7, 0.539467, 0.894414] ---- -Label : 0 -Position : [396.521, 722.912] -Measurements : [1089.46, 18536.5, 1.01886, 5.31848] ---- -Label : 1 -Position : [301.133, 723.324] -Measurements : [1082.89, 452901, 0.630436, -1.28609] ---- -Label : 1 -Position : [208.593, 723.495] -Measurements : [792.26, 264020, 1.46991, 1.21366] ---- -Label : 0 -Position : [400.205, 723.766] -Measurements : [1081.19, 16669.1, 0.725756, 4.98747] ---- -Label : 0 -Position : [539.691, 723.831] -Measurements : [883.911, 3124.93, -0.836513, 1.71221] ---- -Label : 1 -Position : [343.64, 724.368] -Measurements : [1363.48, 319999, 0.0557857, -0.395136] ---- -Label : 0 -Position : [554.138, 725.039] -Measurements : [837.309, 7230.07, -1.25863, 1.34441] ---- -Label : 0 -Position : [466.075, 725.567] -Measurements : [877.945, 9238.56, -0.168896, 1.45514] ---- -Label : 1 -Position : [296.536, 725.904] -Measurements : [1303.35, 326101, 0.119228, -1.40762] ---- -Label : 1 -Position : [340.171, 725.939] -Measurements : [1436.62, 265703, 0.131347, -0.25] ---- -Label : 1 -Position : [205.288, 726.496] -Measurements : [1142.84, 346413, 0.331069, -1.15071] ---- -Label : 1 -Position : [340.615, 726.943] -Measurements : [1450.16, 258917, 0.131909, -0.263018] ---- -Label : 1 -Position : [200.867, 727.247] -Measurements : [1373.48, 291841, 0.0125284, -0.975884] ---- -Label : 0 -Position : [581.972, 727.627] -Measurements : [923.717, 56879, 2.01018, 4.93828] ---- -Label : 1 -Position : [339.315, 727.777] -Measurements : [1387.39, 306196, 0.0890325, -0.480073] ---- -Label : 0 -Position : [402.263, 727.829] -Measurements : [1049.48, 22114.9, 0.479931, 0.00627351] ---- -Label : 0 -Position : [472.937, 727.956] -Measurements : [887.559, 14798.6, 1.63847, 4.70775] ---- -Label : 0 -Position : [567.791, 728.593] -Measurements : [821.142, 12877.4, -0.094109, 0.473949] ---- -Label : 0 -Position : [610.329, 728.81] -Measurements : [1068.94, 9102.36, 0.0778781, -0.422164] ---- -Label : 1 -Position : [131.786, 730.118] -Measurements : [645.702, 136877, 1.89997, 2.78578] ---- -Label : 1 -Position : [296.239, 730.356] -Measurements : [933.382, 413438, 0.865803, -0.800469] ---- -Label : 0 -Position : [404.326, 730.402] -Measurements : [987.636, 11928.6, 1.2798, 1.84055] ---- -Label : 1 -Position : [125.004, 731.019] -Measurements : [948.202, 145777, 1.04496, 0.252978] ---- -Label : 1 -Position : [339.032, 732.56] -Measurements : [1107.89, 243406, -0.151434, -1.39355] ---- -Label : 1 -Position : [126.952, 733.152] -Measurements : [932.05, 182010, 0.897258, -0.44654] ---- -Label : 0 -Position : [441.692, 733.191] -Measurements : [917.017, 7418.56, -1.11122, 1.63796] ---- -Label : 1 -Position : [340.749, 733.652] -Measurements : [1075.76, 262199, -0.110577, -1.50152] ---- -Label : 1 -Position : [200.13, 734.259] -Measurements : [1648.39, 145918, -0.613778, -0.147282] ---- -Label : 1 -Position : [202.216, 734.688] -Measurements : [1646.15, 127933, -0.421052, -0.373464] ---- -Label : 0 -Position : [449.489, 735.474] -Measurements : [785.06, 7171.23, 1.24803, 1.18435] ---- -Label : 0 -Position : [404.214, 736.317] -Measurements : [934.788, 2440.22, 0.395013, 2.19353] ---- -Label : 1 -Position : [197.596, 736.869] -Measurements : [1530.75, 371290, -0.359357, -0.891723] ---- -Label : 1 -Position : [128.925, 737.457] -Measurements : [880.94, 293498, 1.08283, -0.349099] ---- -Label : 0 -Position : [566.236, 739.33] -Measurements : [756.121, 8821.46, 0.228477, 0.574167] ---- -Label : 1 -Position : [204.4, 740.441] -Measurements : [1680.24, 279485, -0.341007, -0.554946] ---- -Label : 0 -Position : [527.65, 741.596] -Measurements : [770.698, 8427.35, 0.645325, -0.762257] ---- -Label : 0 -Position : [555.308, 741.75] -Measurements : [745.614, 14617.6, -0.559165, -0.338662] ---- -Label : 0 -Position : [406.845, 741.877] -Measurements : [951.874, 1633.05, -0.336642, 0.0556783] ---- -Label : 1 -Position : [207.293, 741.999] -Measurements : [1367.88, 267306, 0.347429, -0.853305] ---- -Label : 1 -Position : [124.904, 742.368] -Measurements : [1436.05, 245284, -0.0935654, -0.463012] ---- -Label : 1 -Position : [202.728, 742.368] -Measurements : [1941.4, 210551, -0.477076, -0.338577] ---- -Label : 0 -Position : [436.442, 742.88] -Measurements : [929.375, 3476.89, -2.89425, 9.90368] ---- -Label : 0 -Position : [608.333, 743.344] -Measurements : [676.344, 20690.8, 1.16242, 1.8409] ---- -Label : 0 -Position : [377.893, 744.509] -Measurements : [795.482, 8235.47, 0.619007, 0.212924] ---- -Label : 0 -Position : [448.467, 744.899] -Measurements : [916.978, 55301.6, 3.14786, 11.2395] ---- -Label : 1 -Position : [126.058, 745.517] -Measurements : [1303.37, 299609, 0.267953, -0.787432] ---- -Label : 1 -Position : [124.491, 746.281] -Measurements : [1358.46, 230129, 0.481434, -0.372796] ---- -Label : 0 -Position : [409.131, 746.994] -Measurements : [965.738, 13623.5, 0.15015, 7.06839] ---- -Label : 0 -Position : [405.584, 747.124] -Measurements : [968.589, 828.08, -0.212032, 0.319205] ---- -Label : 1 -Position : [123.368, 747.488] -Measurements : [1268.68, 236351, 0.613354, -0.0155157] ---- -Label : 1 -Position : [202.531, 749.362] -Measurements : [1550.72, 538206, -0.17467, -1.50601] ---- -Label : 1 -Position : [202.216, 749.536] -Measurements : [1550.72, 538206, -0.17467, -1.50601] ---- -Label : 1 -Position : [126.543, 750.378] -Measurements : [870.957, 174961, 0.776442, -0.0393626] ---- -Label : 1 -Position : [206.858, 750.895] -Measurements : [1323.48, 374871, 0.666633, -0.960716] ---- -Label : 0 -Position : [572.392, 751.168] -Measurements : [868.874, 42944, -0.252169, -1.00631] ---- -Label : 1 -Position : [111.08, 756.704] -Measurements : [682.166, 115105, 1.50987, 1.34086] ---- -Label : 1 -Position : [112.859, 758.152] -Measurements : [637.038, 116498, 1.7813, 2.06441] ---- -Label : 1 -Position : [190.72, 760.326] -Measurements : [1756.4, 804807, -0.336199, -1.44325] ---- -Label : 1 -Position : [109.278, 761.408] -Measurements : [518.056, 47028.6, 2.73031, 7.31028] ---- -Label : 1 -Position : [191.976, 762.848] -Measurements : [1929.87, 611779, -0.689289, -0.802071] ---- -Label : 1 -Position : [184.296, 765.408] -Measurements : [1980.57, 434789, -0.789138, -0.09661] ---- -Label : 0 -Position : [453.542, 765.888] -Measurements : [770.904, 4723.78, 1.27278, 0.867494] ---- -Label : 1 -Position : [182.834, 767.159] -Measurements : [1517.09, 731151, 0.0485414, -1.54421] ---- -Label : 1 -Position : [194.997, 767.624] -Measurements : [1576.76, 503234, 0.35626, -1.25176] ---- -Label : 0 -Position : [430.101, 767.938] -Measurements : [891.728, 9875.54, 0.0311174, -1.52266] ---- -Label : 1 -Position : [101.864, 768.48] -Measurements : [1253.94, 214279, -0.156842, -0.85546] ---- -Label : 1 -Position : [183.079, 770.282] -Measurements : [1145.28, 603485, 0.708353, -0.974022] ---- -Label : 0 -Position : [411.914, 770.36] -Measurements : [816.374, 7840.96, -0.848821, 0.660832] ---- -Label : 1 -Position : [103.579, 770.97] -Measurements : [1180.54, 197496, -0.144821, -1.14796] ---- -Label : 1 -Position : [98.8285, 771.336] -Measurements : [1330.28, 228535, -0.0586775, -0.898468] ---- -Label : 0 -Position : [398.203, 773.414] -Measurements : [891.812, 4488.79, -0.721596, -0.157861] ---- -Label : 1 -Position : [175.723, 774.71] -Measurements : [1351.99, 448310, -0.114202, -1.65025] ---- -Label : 1 -Position : [727.647, 776.137] -Measurements : [1361.34, 220402, 0.453899, -0.274435] ---- -Label : 1 -Position : [177.128, 777.184] -Measurements : [1542.77, 366358, -0.648092, -0.983654] ---- -Label : 1 -Position : [688.828, 778.215] -Measurements : [993.332, 69085.1, -0.464187, -0.403541] ---- -Label : 0 -Position : [423.556, 778.671] -Measurements : [873.206, 9689.22, 0.719962, -0.391072] ---- -Label : 1 -Position : [702.725, 780.122] -Measurements : [987.145, 235863, 0.622212, -0.818241] ---- -Label : 1 -Position : [725.208, 780.552] -Measurements : [1177.82, 331716, 0.617446, -0.759791] ---- -Label : 1 -Position : [178.707, 781.444] -Measurements : [1406.65, 350074, -0.116546, -1.37383] ---- -Label : 1 -Position : [643.8, 782.6] -Measurements : [837.502, 131171, 0.876622, 0.412439] ---- -Label : 1 -Position : [687.832, 782.6] -Measurements : [747.243, 106233, 0.728561, -0.706801] ---- -Label : 1 -Position : [647.243, 782.658] -Measurements : [894.672, 147214, 0.50246, -0.537846] ---- -Label : 0 -Position : [398.736, 782.81] -Measurements : [750.757, 3018.91, -0.243828, 3.54585] ---- -Label : 1 -Position : [173.429, 783.826] -Measurements : [1151.13, 361522, 0.388328, -1.18903] ---- -Label : 1 -Position : [728.049, 784.078] -Measurements : [776.553, 355639, 1.67998, 1.40744] ---- -Label : 1 -Position : [702.168, 784.136] -Measurements : [1045.13, 293026, 0.516226, -1.16655] ---- -Label : 1 -Position : [685.987, 784.181] -Measurements : [630.937, 107448, 1.47644, 0.762472] ---- -Label : 1 -Position : [698.181, 784.234] -Measurements : [915.99, 278636, 0.744965, -0.898467] ---- -Label : 1 -Position : [715.132, 785.009] -Measurements : [917.661, 246715, 0.828443, -0.633303] ---- -Label : 1 -Position : [753.989, 785.83] -Measurements : [953.973, 291075, 0.731503, -0.970358] ---- -Label : 1 -Position : [716.054, 786.124] -Measurements : [769.879, 190007, 1.34962, 0.560458] ---- -Label : 1 -Position : [755.699, 786.407] -Measurements : [828.681, 273702, 1.13027, -0.261738] ---- -Label : 1 -Position : [647.418, 786.811] -Measurements : [626.344, 124163, 1.98432, 3.64173] ---- -Label : 1 -Position : [167.663, 787.376] -Measurements : [1214.17, 374087, 0.247525, -1.3402] ---- -Label : 1 -Position : [711.384, 788.232] -Measurements : [1246.33, 514960, 0.692925, -0.79513] ---- -Label : 1 -Position : [169.448, 788.448] -Measurements : [1175.54, 368199, 0.390895, -1.21202] ---- -Label : 1 -Position : [87.2985, 788.683] -Measurements : [1396.07, 335246, -0.33232, -1.00375] ---- -Label : 1 -Position : [750.808, 788.744] -Measurements : [1078.01, 292720, 0.235907, -1.35835] ---- -Label : 1 -Position : [839.488, 788.81] -Measurements : [1014.05, 248274, 0.000140983, -1.46939] ---- -Label : 1 -Position : [92.136, 789.984] -Measurements : [1610.89, 669868, -0.161827, -1.0152] ---- -Label : 1 -Position : [841.374, 790.788] -Measurements : [934.327, 255970, 0.326117, -1.42665] ---- -Label : 1 -Position : [95.5657, 791.06] -Measurements : [2041.53, 828238, -0.326321, -0.996807] ---- -Label : 1 -Position : [842.968, 791.304] -Measurements : [871.098, 238724, 0.528133, -1.28029] ---- -Label : 1 -Position : [92.5887, 791.677] -Measurements : [2049.67, 547736, -0.181618, -0.257574] ---- -Label : 1 -Position : [600.916, 794.077] -Measurements : [660.541, 98200, 1.48347, 1.53605] ---- -Label : 1 -Position : [93.16, 795.104] -Measurements : [2123.82, 623187, -0.254688, -0.876846] ---- -Label : 1 -Position : [94.588, 795.95] -Measurements : [2146.49, 678407, -0.344582, -0.953312] ---- -Label : 1 -Position : [600.792, 796.424] -Measurements : [683.142, 117605, 1.41414, 1.15] ---- -Label : 1 -Position : [157.36, 799.948] -Measurements : [628.692, 221438, 2.03286, 2.85365] ---- -Label : 1 -Position : [598.809, 800.246] -Measurements : [651.803, 100101, 1.8684, 2.77073] ---- -Label : 1 -Position : [153.064, 803.8] -Measurements : [1235.38, 347266, -0.0708498, -1.4657] ---- -Label : 1 -Position : [582.033, 803.973] -Measurements : [1541.09, 669227, -0.189835, -1.27048] ---- -Label : 1 -Position : [583.896, 804.616] -Measurements : [1716.45, 635471, -0.308924, -1.05274] ---- -Label : 1 -Position : [583.731, 808.164] -Measurements : [1896.01, 789177, -0.135868, -1.35621] ---- -Label : 1 -Position : [153.003, 808.514] -Measurements : [1008.08, 348311, 0.510919, -1.24226] ---- -Label : 1 -Position : [1121.2, 809.614] -Measurements : [1393.42, 631285, 1.06351, -0.317079] ---- -Label : 1 -Position : [927.864, 810.944] -Measurements : [922.958, 219204, 0.729247, -0.639748] ---- -Label : 1 -Position : [1124.02, 814.52] -Measurements : [2098.79, 779215, -0.205201, -1.42675] ---- -Label : 1 -Position : [983.643, 814.68] -Measurements : [1406.45, 349006, 0.0679644, -0.7236] ---- -Label : 1 -Position : [504.817, 815.373] -Measurements : [1010.51, 273922, 0.254172, -1.4478] ---- -Label : 1 -Position : [927.928, 815.544] -Measurements : [1004.66, 237640, 0.332741, -1.12483] ---- -Label : 1 -Position : [526.689, 815.604] -Measurements : [1760.95, 600355, -0.540524, -0.951703] ---- -Label : 1 -Position : [923.869, 815.796] -Measurements : [852.063, 252255, 0.626028, -0.878785] ---- -Label : 1 -Position : [980.005, 815.833] -Measurements : [1171.83, 429539, 0.40623, -0.989969] ---- -Label : 1 -Position : [984.76, 816.568] -Measurements : [1251.43, 490108, 0.220337, -1.26225] ---- -Label : 1 -Position : [508.696, 818.136] -Measurements : [1017.42, 245081, 0.400866, -1.30747] ---- -Label : 1 -Position : [1126.45, 818.502] -Measurements : [1594.38, 1.16569e+06, 0.369868, -1.59389] ---- -Label : 1 -Position : [525.592, 819.16] -Measurements : [1939.86, 697908, -0.499201, -1.08774] ---- -Label : 1 -Position : [1011.67, 820.962] -Measurements : [699.013, 81657.6, 0.551357, -1.1875] ---- -Label : 1 -Position : [1091.68, 821.026] -Measurements : [1000.83, 398136, 1.14559, -0.118122] ---- -Label : 1 -Position : [522.719, 821.123] -Measurements : [1917.55, 882256, -0.451932, -1.08717] ---- -Label : 1 -Position : [508.462, 822.044] -Measurements : [839.852, 222281, 0.979814, -0.367721] ---- -Label : 1 -Position : [1010.62, 822.244] -Measurements : [693.392, 87487, 0.535667, -1.30036] ---- -Label : 1 -Position : [1012.41, 822.712] -Measurements : [706.398, 81647, 0.553716, -1.28203] ---- -Label : 1 -Position : [1096.6, 823.242] -Measurements : [1166.25, 478414, 0.61613, -1.1612] ---- -Label : 1 -Position : [1076.83, 824.726] -Measurements : [1101, 481090, 0.364083, -1.35838] ---- -Label : 1 -Position : [1096.72, 824.918] -Measurements : [1122.23, 469781, 0.733959, -1.00201] ---- -Label : 1 -Position : [1078.97, 827.32] -Measurements : [1418.91, 502602, 0.0250882, -1.28341] ---- -Label : 1 -Position : [1392.91, 829.002] -Measurements : [1066.29, 262211, 0.601476, -0.641817] ---- -Label : 1 -Position : [1390.94, 829.202] -Measurements : [1005.35, 265933, 0.610088, -0.575108] ---- -Label : 1 -Position : [1390.7, 829.344] -Measurements : [1005.35, 265933, 0.610088, -0.575108] ---- -Label : 1 -Position : [488.216, 829.912] -Measurements : [1675.12, 615787, -0.00773813, -1.42912] ---- -Label : 1 -Position : [486.43, 830.311] -Measurements : [1635.72, 765951, -0.15554, -1.46854] ---- -Label : 1 -Position : [1075.93, 831.578] -Measurements : [1252.62, 648251, 0.284949, -1.4399] ---- -Label : 1 -Position : [1389.76, 832.043] -Measurements : [944.15, 382907, 0.950516, -0.234103] ---- -Label : 1 -Position : [656.414, 832.214] -Measurements : [1014.19, 216866, 0.193605, -1.22599] ---- -Label : 1 -Position : [661.203, 832.696] -Measurements : [934.508, 187096, 0.403865, -1.17238] ---- -Label : 1 -Position : [657.112, 833.8] -Measurements : [1131.95, 224355, 0.191712, -1.08847] ---- -Label : 1 -Position : [1394.55, 834.327] -Measurements : [1207.62, 339921, 0.450709, -0.80088] ---- -Label : 1 -Position : [465.381, 834.549] -Measurements : [1269.39, 560439, 0.483274, -1.30411] ---- -Label : 1 -Position : [486.064, 834.81] -Measurements : [1472.21, 840553, 0.180824, -1.56869] ---- -Label : 1 -Position : [682.025, 836.066] -Measurements : [831.306, 369037, 1.16729, 0.119046] ---- -Label : 1 -Position : [461.08, 838.616] -Measurements : [1540.14, 621071, 0.0158363, -1.6649] ---- -Label : 1 -Position : [1393.74, 838.732] -Measurements : [1243.49, 422273, 0.134774, -1.22674] ---- -Label : 1 -Position : [745.941, 839.601] -Measurements : [721.25, 148263, 0.476498, -1.29222] ---- -Label : 1 -Position : [750.808, 839.944] -Measurements : [876.858, 171370, 0.0564525, -1.37813] ---- -Label : 1 -Position : [460.526, 840.057] -Measurements : [1461.23, 614667, 0.236308, -1.59414] ---- -Label : 1 -Position : [706.264, 840.456] -Measurements : [1518.17, 235134, 0.357997, -0.361697] ---- -Label : 1 -Position : [685.272, 840.968] -Measurements : [1410.48, 351858, -0.15485, -1.17376] ---- -Label : 1 -Position : [751.871, 841.211] -Measurements : [961.414, 123696, 0.00551949, -1.07051] ---- -Label : 1 -Position : [662.744, 841.48] -Measurements : [1760.19, 362517, -0.253148, -0.549244] ---- -Label : 1 -Position : [659.618, 841.535] -Measurements : [1759.12, 386165, -0.341652, -0.636809] ---- -Label : 1 -Position : [1394.55, 841.7] -Measurements : [1318.22, 289341, -0.0578254, -0.768137] ---- -Label : 1 -Position : [1393.92, 843.227] -Measurements : [1114.5, 316590, 0.0662469, -1.37404] ---- -Label : 1 -Position : [689.976, 844.064] -Measurements : [1713.82, 213085, -0.192337, -0.0320576] ---- -Label : 1 -Position : [664.721, 844.966] -Measurements : [1639.19, 328917, 0.0605871, -1.04421] ---- -Label : 1 -Position : [707.341, 845.123] -Measurements : [1566.02, 156165, 0.552855, -0.00697981] ---- -Label : 1 -Position : [1396.99, 845.125] -Measurements : [1255.95, 271208, -0.0655448, -0.837552] ---- -Label : 1 -Position : [706.142, 845.203] -Measurements : [1592.19, 147406, 0.544595, 0.237633] ---- -Label : 1 -Position : [13.5127, 847.721] -Measurements : [1584.98, 367069, -0.152733, -1.35335] ---- -Label : 1 -Position : [590.132, 847.762] -Measurements : [1044.98, 643190, 0.355244, -1.64142] ---- -Label : 1 -Position : [8.68, 848.856] -Measurements : [1711.14, 345707, -0.859543, -0.394889] ---- -Label : 1 -Position : [110.354, 849.309] -Measurements : [853.596, 335338, 1.12422, -0.017195] ---- -Label : 1 -Position : [595.049, 849.98] -Measurements : [1348, 508362, -0.109955, -1.45194] ---- -Label : 1 -Position : [993.792, 850.122] -Measurements : [915.718, 401442, 0.637145, -0.859409] ---- -Label : 1 -Position : [12.6837, 851.051] -Measurements : [2003.24, 168964, -1.29156, 1.49374] ---- -Label : 1 -Position : [593.112, 851.208] -Measurements : [1606.55, 308071, -0.57708, -0.623877] ---- -Label : 1 -Position : [104.202, 851.349] -Measurements : [1353.46, 410771, 0.113735, -0.935532] ---- -Label : 1 -Position : [11.2482, 852.281] -Measurements : [2060.85, 120579, -1.17542, 1.54768] ---- -Label : 1 -Position : [990.073, 852.401] -Measurements : [934.613, 391474, 0.823001, -0.501332] ---- -Label : 1 -Position : [106.984, 852.44] -Measurements : [1316.43, 304185, -0.13726, -1.05284] ---- -Label : 1 -Position : [421.144, 852.952] -Measurements : [779.29, 192547, 1.11826, -0.228148] ---- -Label : 1 -Position : [420.158, 853.031] -Measurements : [727.772, 192207, 1.28991, 0.219668] ---- -Label : 1 -Position : [993.976, 853.432] -Measurements : [959.583, 355747, 0.700384, -0.692653] ---- -Label : 1 -Position : [90.1196, 854.567] -Measurements : [1225.8, 242224, -0.00433429, -1.09973] ---- -Label : 1 -Position : [403.868, 854.704] -Measurements : [1012.63, 294462, 1.27885, 0.230693] ---- -Label : 1 -Position : [417.957, 855.686] -Measurements : [592.937, 187145, 1.79708, 1.78397] ---- -Label : 1 -Position : [14.312, 856.024] -Measurements : [1516.56, 502317, -0.10657, -1.62387] ---- -Label : 1 -Position : [94.696, 858.072] -Measurements : [1256.24, 233511, -0.0519922, -1.26718] ---- -Label : 1 -Position : [402.712, 858.584] -Measurements : [1140.94, 365857, 0.646759, -1.17146] ---- -Label : 1 -Position : [1088.95, 858.617] -Measurements : [639.46, 320670, 1.53932, 0.754779] ---- -Label : 1 -Position : [9.61627, 858.619] -Measurements : [1362.01, 538862, 0.0774656, -1.71921] ---- -Label : 1 -Position : [407.178, 858.736] -Measurements : [813.824, 358104, 1.40807, 0.538078] ---- -Label : 1 -Position : [86.9959, 859.599] -Measurements : [1315.49, 208442, -0.100612, -1.31077] ---- -Label : 1 -Position : [1350.27, 860.121] -Measurements : [1360.53, 466743, 0.31565, -1.10715] ---- -Label : 1 -Position : [87.528, 861.144] -Measurements : [1347.13, 190787, -0.0978204, -1.34031] ---- -Label : 1 -Position : [398.699, 861.411] -Measurements : [1127.94, 390716, 0.556052, -1.20021] ---- -Label : 1 -Position : [90.8185, 862.803] -Measurements : [1308.74, 218087, 0.116613, -1.41721] ---- -Label : 1 -Position : [84.8054, 863.139] -Measurements : [1304.88, 270682, -0.0658039, -1.12477] ---- -Label : 1 -Position : [1092.28, 863.16] -Measurements : [1103.4, 429164, 0.566091, -1.0663] ---- -Label : 1 -Position : [1351.54, 863.777] -Measurements : [1657.46, 491844, -0.343795, -1.09062] ---- -Label : 1 -Position : [536.344, 864.216] -Measurements : [1392.48, 504212, 0.0501853, -1.06102] ---- -Label : 1 -Position : [539.136, 864.336] -Measurements : [1301.44, 342270, 0.253072, -0.751042] ---- -Label : 1 -Position : [394.52, 865.24] -Measurements : [813.826, 242964, 1.46898, 1.19216] ---- -Label : 1 -Position : [536.249, 865.286] -Measurements : [1466.3, 423626, 0.0638285, -0.940062] ---- -Label : 1 -Position : [1351.97, 865.334] -Measurements : [1792.51, 366586, -0.637944, -0.320197] ---- -Label : 1 -Position : [1352.46, 866.495] -Measurements : [1969.74, 227778, -0.660137, 0.632833] ---- -Label : 1 -Position : [1089.01, 866.649] -Measurements : [915.721, 348570, 0.910774, -0.729368] ---- -Label : 1 -Position : [378.455, 867.208] -Measurements : [797.688, 131558, 0.693292, -0.00532097] ---- -Label : 1 -Position : [390.851, 867.792] -Measurements : [739.163, 253963, 1.71448, 1.76073] ---- -Label : 1 -Position : [1354.82, 868.282] -Measurements : [2085.98, 96248.3, -0.541486, 0.804039] ---- -Label : 1 -Position : [374.459, 869.947] -Measurements : [601.646, 103520, 1.39887, 1.23019] ---- -Label : 1 -Position : [1357.82, 870.712] -Measurements : [1951.38, 255655, -0.930187, 0.0135338] ---- -Label : 1 -Position : [1356.31, 871.223] -Measurements : [1937.93, 217556, -0.733659, -0.458504] ---- -Label : 1 -Position : [378.648, 871.384] -Measurements : [913.122, 213766, 0.454937, -0.925105] ---- -Label : 1 -Position : [1357.28, 874.426] -Measurements : [1755.66, 243534, -0.137658, -1.21485] ---- -Label : 1 -Position : [1359.45, 874.506] -Measurements : [1714.99, 247016, -0.354065, -0.706264] ---- -Label : 1 -Position : [1335.43, 876.67] -Measurements : [977.106, 190180, 0.805482, -0.0668259] ---- -Label : 1 -Position : [1331.47, 878.522] -Measurements : [1113.42, 217978, 0.398027, -0.938594] ---- -Label : 1 -Position : [1360.14, 879.342] -Measurements : [1504.3, 286266, -0.261859, -0.748138] ---- -Label : 1 -Position : [1360.6, 881.598] -Measurements : [1308.77, 363854, -0.0981414, -1.35151] ---- -Label : 1 -Position : [1327.44, 882.36] -Measurements : [1021.71, 186068, 0.622267, -0.562923] ---- -Label : 1 -Position : [1358.69, 884.162] -Measurements : [1018.02, 366700, 0.663221, -0.834437] ---- -Label : 1 -Position : [1323.72, 885.397] -Measurements : [987.997, 131056, 0.672591, 0.258901] ---- -Label : 1 -Position : [1370.23, 887.491] -Measurements : [1196.16, 483304, 0.395851, -1.30308] ---- -Label : 1 -Position : [1321.64, 889.991] -Measurements : [952.203, 119131, 0.526279, -0.42824] ---- -Label : 1 -Position : [1367.11, 891.22] -Measurements : [1581.9, 379109, -0.371943, -0.742567] ---- -Label : 1 -Position : [1370.21, 892.802] -Measurements : [1749.54, 333167, -0.436785, -0.755464] ---- -Label : 1 -Position : [1317.4, 894.677] -Measurements : [987.684, 163583, 0.974074, 0.672006] ---- -Label : 1 -Position : [441.28, 896.605] -Measurements : [754.039, 266570, 1.07992, -0.415476] ---- -Label : 1 -Position : [1338.58, 897.148] -Measurements : [844.142, 370783, 0.866646, -0.887677] ---- -Label : 1 -Position : [310.051, 897.317] -Measurements : [1642.91, 450312, 0.431277, -1.30074] ---- -Label : 1 -Position : [443.73, 897.595] -Measurements : [970.346, 372047, 0.597941, -0.922058] ---- -Label : 1 -Position : [1370.38, 897.774] -Measurements : [1736.55, 252793, -0.153219, -0.612233] ---- -Label : 1 -Position : [1338.95, 899.334] -Measurements : [929.947, 377326, 0.609126, -1.17868] ---- -Label : 1 -Position : [1372.53, 899.488] -Measurements : [1617.85, 327265, -0.166481, -0.959381] ---- -Label : 1 -Position : [311.118, 899.598] -Measurements : [1694.55, 458203, 0.145349, -1.2514] ---- -Label : 1 -Position : [311.576, 900.056] -Measurements : [1649.26, 509218, 0.147253, -1.31435] ---- -Label : 1 -Position : [1340.89, 900.231] -Measurements : [1210.14, 396268, 0.0399636, -1.22353] ---- -Label : 1 -Position : [1365.84, 900.386] -Measurements : [1347.79, 226145, 0.0430409, -0.888964] ---- -Label : 1 -Position : [1370.8, 901.031] -Measurements : [1654.92, 207509, -0.217958, -0.353529] ---- -Label : 1 -Position : [444.184, 901.08] -Measurements : [1408.5, 249528, 0.00859062, -0.0444654] ---- -Label : 1 -Position : [1371.71, 901.885] -Measurements : [1669.16, 227071, -0.334292, -0.384933] ---- -Label : 1 -Position : [1313.45, 902.279] -Measurements : [1155.08, 263720, 0.734679, -0.573918] ---- -Label : 1 -Position : [1344.99, 903.918] -Measurements : [1664.24, 131069, -0.158953, -0.355933] ---- -Label : 1 -Position : [1369.98, 903.918] -Measurements : [1552.83, 228220, -0.40741, -0.663213] ---- -Label : 1 -Position : [1347.3, 904.789] -Measurements : [1647.86, 194091, -0.571519, 0.058703] ---- -Label : 1 -Position : [1312.19, 905.26] -Measurements : [1214.92, 320095, 0.599268, -0.947832] ---- -Label : 1 -Position : [1381.36, 905.843] -Measurements : [1433.63, 366810, 0.00304647, -1.13223] ---- -Label : 1 -Position : [1311.4, 906.375] -Measurements : [1288.25, 352475, 0.512827, -1.00289] ---- -Label : 1 -Position : [1317.99, 906.767] -Measurements : [802.219, 244578, 1.82594, 2.25175] ---- -Label : 1 -Position : [1377.76, 907.194] -Measurements : [1812.67, 202106, -0.490066, -0.456009] ---- -Label : 1 -Position : [1344.2, 908.08] -Measurements : [1801.69, 247778, -0.207808, -0.247204] ---- -Label : 1 -Position : [1309.77, 909.028] -Measurements : [1503.32, 365710, 0.132882, -1.26226] ---- -Label : 1 -Position : [1304.98, 909.298] -Measurements : [1114.62, 257036, 1.48359, 0.992389] ---- -Label : 1 -Position : [1349.09, 909.652] -Measurements : [1808.35, 187628, 0.409092, -0.203753] ---- -Label : 1 -Position : [1314.06, 910.128] -Measurements : [1241.28, 552366, 0.560998, -1.12998] ---- -Label : 1 -Position : [278.78, 910.639] -Measurements : [1052.43, 198290, 0.709195, -0.44075] ---- -Label : 1 -Position : [1377.47, 910.662] -Measurements : [1805.52, 205937, -0.4432, -0.489332] ---- -Label : 1 -Position : [1310.99, 910.881] -Measurements : [1555.26, 428401, 0.0515261, -1.12426] ---- -Label : 1 -Position : [1344.38, 911.067] -Measurements : [1705.3, 348722, -0.280617, -0.572913] ---- -Label : 1 -Position : [1355.08, 911.266] -Measurements : [1334.08, 178895, 0.38702, -0.0808079] ---- -Label : 1 -Position : [1308.34, 912.263] -Measurements : [1651.1, 417759, -0.106689, -1.06493] ---- -Label : 1 -Position : [1380.88, 912.322] -Measurements : [1863.7, 217354, 0.09701, -0.801904] ---- -Label : 1 -Position : [1313.28, 912.39] -Measurements : [1374.87, 603493, 0.303465, -1.39198] ---- -Label : 1 -Position : [1379.81, 912.929] -Measurements : [1826.95, 207047, -0.0182558, -0.835847] ---- -Label : 1 -Position : [1315.99, 912.974] -Measurements : [1089.22, 523414, 0.905834, -0.723987] ---- -Label : 1 -Position : [1345.1, 913.112] -Measurements : [1656.43, 375478, -0.134821, -0.708498] ---- -Label : 1 -Position : [1309.8, 913.827] -Measurements : [1653.29, 424036, -0.168739, -0.998167] ---- -Label : 1 -Position : [1378.64, 914.07] -Measurements : [1754.65, 315330, -0.149315, -0.606496] ---- -Label : 1 -Position : [1347.47, 914.105] -Measurements : [1662.43, 324659, 0.123628, -0.606828] ---- -Label : 1 -Position : [1307.72, 914.158] -Measurements : [1562.79, 476833, 0.0181253, -1.19859] ---- -Label : 1 -Position : [279.009, 914.3] -Measurements : [1366.56, 388548, 0.0890594, -0.935212] ---- -Label : 1 -Position : [282.6, 915.312] -Measurements : [1487.31, 361021, -0.119785, -0.958643] ---- -Label : 1 -Position : [1350.72, 916.206] -Measurements : [1543.63, 247092, 0.268943, 0.293164] ---- -Label : 1 -Position : [1304.13, 916.83] -Measurements : [1185.31, 464956, 0.684796, -0.723125] ---- -Label : 1 -Position : [1384.22, 917.527] -Measurements : [2022.49, 317242, -0.743431, 0.0562226] ---- -Label : 1 -Position : [1380.29, 917.839] -Measurements : [1892.03, 310838, -0.269586, -0.727556] ---- -Label : 1 -Position : [9.704, 917.872] -Measurements : [1677.17, 344801, -0.0800956, -0.979602] ---- -Label : 1 -Position : [1306.08, 918.254] -Measurements : [1153.55, 579639, 0.70006, -0.88961] ---- -Label : 1 -Position : [1382.67, 918.254] -Measurements : [2033.86, 258517, -0.378087, -0.504246] ---- -Label : 1 -Position : [254.44, 918.896] -Measurements : [981.842, 225045, 1.12517, 0.722067] ---- -Label : 1 -Position : [1357.82, 919.479] -Measurements : [1411.59, 169269, 0.291539, -0.443166] ---- -Label : 1 -Position : [14.2546, 919.735] -Measurements : [1422.03, 435005, 0.445337, -1.21085] ---- -Label : 1 -Position : [258.811, 920.619] -Measurements : [755.978, 264977, 1.76497, 2.00019] ---- -Label : 1 -Position : [13.3561, 920.786] -Measurements : [1410.39, 378258, 0.446486, -1.14964] ---- -Label : 1 -Position : [396.701, 921.349] -Measurements : [851.464, 159996, 0.111258, -1.57735] ---- -Label : 1 -Position : [1386.77, 921.53] -Measurements : [1922.41, 233572, -0.216135, -0.277221] ---- -Label : 1 -Position : [250.275, 922.04] -Measurements : [749.487, 219285, 1.70187, 2.12975] ---- -Label : 1 -Position : [1388.03, 923.141] -Measurements : [1829.97, 211304, -0.81067, 0.407732] ---- -Label : 1 -Position : [396.742, 923.556] -Measurements : [975.906, 122734, -0.467624, -1.0378] ---- -Label : 1 -Position : [1358.51, 923.596] -Measurements : [1653.38, 168150, -0.316608, -0.74935] ---- -Label : 1 -Position : [1382.68, 923.698] -Measurements : [1621.07, 399783, -0.189171, -0.914576] ---- -Label : 1 -Position : [229.496, 924.766] -Measurements : [1467.21, 151784, 0.642844, 0.124609] ---- -Label : 1 -Position : [11.752, 926.064] -Measurements : [1088.83, 195833, 0.53577, -0.345884] ---- -Label : 1 -Position : [399.622, 926.262] -Measurements : [1108.24, 36530.4, -0.225094, 1.15346] ---- -Label : 1 -Position : [1362.37, 926.38] -Measurements : [1777.85, 323361, -0.187217, -0.537177] ---- -Label : 1 -Position : [11.9413, 926.939] -Measurements : [1088.83, 195833, 0.53577, -0.345884] ---- -Label : 1 -Position : [1360.68, 926.962] -Measurements : [1885.33, 225604, -0.252562, 0.534732] ---- -Label : 1 -Position : [1391.23, 928.576] -Measurements : [1614.94, 223249, -0.809094, -0.155135] ---- -Label : 1 -Position : [233.448, 928.624] -Measurements : [1379.28, 368824, 0.168835, -0.869992] ---- -Label : 1 -Position : [1388.41, 928.903] -Measurements : [1734.74, 137741, -0.727034, 0.556726] ---- -Label : 1 -Position : [387.983, 929.422] -Measurements : [1005.45, 195362, 0.856133, 0.591008] ---- -Label : 1 -Position : [383.225, 929.7] -Measurements : [1030.51, 271277, 0.571568, -0.601491] ---- -Label : 1 -Position : [15.453, 930.93] -Measurements : [597.419, 50386.3, 1.79512, 2.64196] ---- -Label : 1 -Position : [1385.97, 930.933] -Measurements : [1451.7, 250329, -0.40493, -0.896998] ---- -Label : 1 -Position : [1297.31, 930.943] -Measurements : [1085.54, 297588, 0.51451, -0.775278] ---- -Label : 1 -Position : [1359.33, 930.969] -Measurements : [2006.63, 187830, 0.129712, -0.113602] ---- -Label : 1 -Position : [383.201, 931.922] -Measurements : [1073.06, 230781, 0.71069, -0.323576] ---- -Label : 1 -Position : [1298.97, 932.232] -Measurements : [1287.64, 316610, 0.190588, -1.00842] ---- -Label : 1 -Position : [1392.48, 932.37] -Measurements : [1624.03, 205862, -0.994572, 0.209212] ---- -Label : 1 -Position : [231.717, 933.143] -Measurements : [788.692, 261960, 1.41576, 0.912168] ---- -Label : 1 -Position : [1392.09, 933.409] -Measurements : [1553.88, 228873, -0.832886, -0.297996] ---- -Label : 1 -Position : [1299.93, 933.836] -Measurements : [1336.81, 307293, 0.193923, -1.00883] ---- -Label : 1 -Position : [1364.15, 934.026] -Measurements : [1727.94, 239776, 0.582757, 0.0616711] ---- -Label : 1 -Position : [1358.67, 935.089] -Measurements : [1746.49, 301812, 0.425325, -0.322816] ---- -Label : 1 -Position : [1363.01, 936.294] -Measurements : [1740.47, 206841, 0.742914, 0.547904] ---- -Label : 1 -Position : [1367.89, 936.402] -Measurements : [1474.94, 214456, 0.291324, -0.240963] ---- -Label : 1 -Position : [1364.93, 936.909] -Measurements : [1681.28, 189985, 0.793199, 0.552424] ---- -Label : 1 -Position : [1295.84, 937.113] -Measurements : [1744.59, 254166, -0.655035, -0.0659341] ---- -Label : 1 -Position : [238.568, 937.328] -Measurements : [1752.95, 727925, -0.113518, -1.42252] ---- -Label : 1 -Position : [1395.21, 937.415] -Measurements : [960.416, 374398, 0.723517, -1.18658] ---- -Label : 1 -Position : [1292.5, 937.881] -Measurements : [1576.62, 342358, -0.162155, -1.15955] ---- -Label : 1 -Position : [1296.9, 937.911] -Measurements : [1757.45, 240680, -0.642067, -0.0605149] ---- -Label : 1 -Position : [1291.66, 939.699] -Measurements : [1655.87, 350009, -0.244849, -1.13558] ---- -Label : 1 -Position : [241.941, 940.249] -Measurements : [1421.3, 1.00111e+06, 0.39758, -1.49566] ---- -Label : 1 -Position : [1297.07, 940.39] -Measurements : [1764.71, 371315, -0.408776, -0.837409] ---- -Label : 1 -Position : [1290.94, 940.608] -Measurements : [1631.15, 359476, 0.051328, -1.16273] ---- -Label : 1 -Position : [235.818, 940.667] -Measurements : [1632.58, 957543, -0.0286218, -1.57044] ---- -Label : 1 -Position : [1293.96, 941.008] -Measurements : [1935.94, 255872, -0.38041, -0.147309] ---- -Label : 1 -Position : [1366.7, 941.209] -Measurements : [1621, 164736, 0.254338, -0.470992] ---- -Label : 1 -Position : [1368.61, 944.387] -Measurements : [1918.95, 264503, -0.491088, -0.661444] ---- -Label : 1 -Position : [1292.15, 944.486] -Measurements : [1936.13, 239531, -0.431684, 0.297378] ---- -Label : 1 -Position : [208.076, 945.005] -Measurements : [1776.23, 544390, -0.392976, -1.29132] ---- -Label : 1 -Position : [207.848, 946.032] -Measurements : [1730.32, 584975, -0.313938, -1.3991] ---- -Label : 1 -Position : [1369.11, 946.276] -Measurements : [2064.8, 199610, -0.540836, -0.163299] ---- -Label : 1 -Position : [1296.95, 946.402] -Measurements : [1611.98, 575976, -0.136454, -1.35887] ---- -Label : 1 -Position : [203.292, 947] -Measurements : [1529.59, 464873, 0.166712, -1.19976] ---- -Label : 1 -Position : [1369.16, 947.353] -Measurements : [2093.44, 168690, -0.366583, -0.451855] ---- -Label : 1 -Position : [195.048, 947.568] -Measurements : [1291.4, 320011, 0.34542, -0.736432] ---- -Label : 1 -Position : [1371.11, 947.7] -Measurements : [1976.45, 191598, -0.399862, -0.502816] ---- -Label : 1 -Position : [1290.92, 948.582] -Measurements : [1703.03, 435514, -0.361576, -0.8701] ---- -Label : 1 -Position : [196.05, 950.246] -Measurements : [1044.09, 406448, 0.725438, -0.619105] ---- -Label : 1 -Position : [1295.56, 950.571] -Measurements : [1245.72, 645404, 0.651453, -1.13169] ---- -Label : 1 -Position : [1372.97, 951.201] -Measurements : [1922.69, 219277, -0.27453, -0.934681] ---- -Label : 1 -Position : [1372.43, 951.858] -Measurements : [1922.69, 219277, -0.27453, -0.934681] ---- -Label : 1 -Position : [191.506, 951.889] -Measurements : [878.1, 319047, 1.26602, 0.503631] ---- -Label : 1 -Position : [1287.53, 952.088] -Measurements : [1048.82, 407059, 0.767239, -0.977461] ---- -Label : 1 -Position : [1376.4, 954.064] -Measurements : [1582.31, 246184, 0.125043, -0.313266] ---- -Label : 1 -Position : [888.663, 954.188] -Measurements : [1159.73, 23273.9, -1.05327, 2.42529] ---- -Label : 1 -Position : [841.554, 954.816] -Measurements : [979.789, 365070, 0.734822, -1.08396] ---- -Label : 1 -Position : [840.209, 956.297] -Measurements : [1253.09, 441696, 0.242059, -1.40154] ---- -Label : 1 -Position : [885.606, 956.63] -Measurements : [1239.21, 116137, 1.15831, 2.26557] ---- -Label : 1 -Position : [839.67, 957.321] -Measurements : [1475.47, 409509, -0.0776988, -1.14681] ---- -Label : 1 -Position : [1374.89, 957.593] -Measurements : [1540.92, 273953, 0.168189, -0.634327] ---- -Label : 1 -Position : [839.73, 957.858] -Measurements : [1475.47, 409509, -0.0776988, -1.14681] ---- -Label : 1 -Position : [883.191, 958.106] -Measurements : [1226.58, 281657, 0.36399, -0.120447] ---- -Label : 1 -Position : [1287.83, 958.414] -Measurements : [1188.42, 392427, 0.451114, -1.15636] ---- -Label : 1 -Position : [1285.41, 958.77] -Measurements : [1244.06, 390274, 0.293909, -1.26782] ---- -Label : 1 -Position : [1379.02, 958.919] -Measurements : [1452.55, 212764, -0.0662891, -0.542317] ---- -Label : 1 -Position : [887.32, 959.206] -Measurements : [1289.12, 175148, 1.253, 1.39717] ---- -Label : 1 -Position : [178.678, 959.246] -Measurements : [727.864, 115788, 0.698264, -0.893239] ---- -Label : 1 -Position : [834.72, 959.368] -Measurements : [1473.53, 282455, 0.17718, -0.792214] ---- -Label : 1 -Position : [281.167, 959.472] -Measurements : [1384.4, 574360, 0.148977, -1.39461] ---- -Label : 1 -Position : [1287.24, 960.05] -Measurements : [1363.4, 399184, 0.197987, -1.29322] ---- -Label : 1 -Position : [180.867, 960.145] -Measurements : [811.565, 147067, 0.572313, -0.79385] ---- -Label : 1 -Position : [1375.51, 960.314] -Measurements : [1477.23, 297461, 0.16776, -0.117573] ---- -Label : 1 -Position : [836.454, 960.316] -Measurements : [1604.09, 255789, 0.0548937, -0.684292] ---- -Label : 1 -Position : [883.967, 960.726] -Measurements : [1184.06, 320393, 0.364136, -0.490117] ---- -Label : 1 -Position : [1372.55, 960.819] -Measurements : [1213.1, 317284, 0.225814, -0.76732] ---- -Label : 1 -Position : [181.736, 960.88] -Measurements : [821.101, 138823, 0.610745, -0.6679] ---- -Label : 1 -Position : [287.251, 961.625] -Measurements : [1045.38, 721053, 0.987592, -0.6074] ---- -Label : 1 -Position : [839.617, 962.3] -Measurements : [1505.98, 347870, -0.10427, -0.87655] ---- -Label : 1 -Position : [880.215, 962.714] -Measurements : [917.971, 314032, 0.904646, -0.121773] ---- -Label : 1 -Position : [1377.76, 962.918] -Measurements : [1717.5, 287861, -0.0890835, -0.53074] ---- -Label : 1 -Position : [897.49, 963.068] -Measurements : [992.493, 123270, 0.677473, 0.387253] ---- -Label : 1 -Position : [1282.73, 963.327] -Measurements : [1352.54, 433273, -0.0321354, -1.3333] ---- -Label : 1 -Position : [283.624, 963.44] -Measurements : [1629.07, 593929, -0.104435, -1.32794] ---- -Label : 1 -Position : [1289.06, 964.131] -Measurements : [1147.7, 498800, 0.581777, -1.20601] ---- -Label : 1 -Position : [1382.68, 964.62] -Measurements : [1762.07, 247023, -0.242182, -0.021285] ---- -Label : 1 -Position : [281.159, 964.684] -Measurements : [1806.79, 393250, -0.267757, -0.7197] ---- -Label : 1 -Position : [885.074, 965.368] -Measurements : [1194.36, 303639, 0.605657, -0.551981] ---- -Label : 1 -Position : [267.288, 965.647] -Measurements : [1212.79, 606103, 0.615202, -1.18908] ---- -Label : 1 -Position : [1385.18, 966.271] -Measurements : [1618.88, 280590, -0.349398, -0.812694] ---- -Label : 1 -Position : [834.815, 966.46] -Measurements : [1318.66, 255139, 0.780854, 0.11283] ---- -Label : 1 -Position : [906.39, 966.591] -Measurements : [927.715, 215368, 0.761438, -0.607984] ---- -Label : 1 -Position : [279.652, 966.659] -Measurements : [1697.84, 399210, 0.00594428, -0.716991] ---- -Label : 1 -Position : [1280.94, 966.849] -Measurements : [1116.31, 445566, 0.535014, -1.16033] ---- -Label : 1 -Position : [1380.52, 967.415] -Measurements : [1941.89, 153684, -0.157177, 0.0782797] ---- -Label : 1 -Position : [901.58, 967.689] -Measurements : [1237.3, 315334, -0.00845597, -1.41541] ---- -Label : 1 -Position : [277.992, 968.56] -Measurements : [1393.87, 376511, 0.354448, -0.664421] ---- -Label : 1 -Position : [881.1, 968.918] -Measurements : [990.499, 202267, 0.648434, -0.236861] ---- -Label : 1 -Position : [834.601, 968.95] -Measurements : [1321.05, 194508, 0.335078, -0.528258] ---- -Label : 1 -Position : [1381.85, 969.062] -Measurements : [1861.88, 218240, -0.470967, 0.388907] ---- -Label : 1 -Position : [832.242, 969.803] -Measurements : [1405.66, 195558, 0.164312, -0.749677] ---- -Label : 1 -Position : [1390.21, 969.824] -Measurements : [1251.35, 199288, 0.139184, -0.902565] ---- -Label : 1 -Position : [881.902, 969.851] -Measurements : [993.101, 152971, 0.309769, -0.891556] ---- -Label : 1 -Position : [1279.41, 970.221] -Measurements : [1112.48, 367915, 0.449666, -1.15283] ---- -Label : 1 -Position : [266.216, 970.608] -Measurements : [1597.04, 574038, -0.0380824, -1.50985] ---- -Label : 1 -Position : [1381.49, 970.79] -Measurements : [1810.97, 259356, -0.737676, 0.505784] ---- -Label : 1 -Position : [834.041, 970.855] -Measurements : [1349.53, 218768, 0.114165, -0.795617] ---- -Label : 1 -Position : [832.358, 971.375] -Measurements : [1525.59, 227676, -0.0261145, -0.698119] ---- -Label : 1 -Position : [899.122, 971.785] -Measurements : [1452.86, 159947, -0.238656, -0.489898] ---- -Label : 1 -Position : [829.576, 972.77] -Measurements : [1547.52, 250192, 0.311495, -0.308267] ---- -Label : 1 -Position : [1282.32, 973.977] -Measurements : [1526.38, 469876, -0.0336208, -0.84676] ---- -Label : 1 -Position : [896.581, 974.116] -Measurements : [1309.6, 196984, 0.247839, -0.938235] ---- -Label : 1 -Position : [1385.54, 974.386] -Measurements : [1645.3, 162172, -0.0592037, -0.591863] ---- -Label : 1 -Position : [270.791, 974.484] -Measurements : [1152.94, 508081, 0.989463, -0.385044] ---- -Label : 1 -Position : [253.969, 974.856] -Measurements : [1318.6, 512263, 0.413012, -1.39054] ---- -Label : 1 -Position : [831.129, 975.062] -Measurements : [1679.04, 241175, 0.0265257, -0.246265] ---- -Label : 1 -Position : [897.535, 976.112] -Measurements : [1358.78, 196563, 0.12645, -0.830182] ---- -Label : 1 -Position : [901.227, 976.191] -Measurements : [1295.93, 264711, -0.0760443, -0.968626] ---- -Label : 1 -Position : [877.004, 976.29] -Measurements : [1116.66, 225062, 0.377058, -0.670743] ---- -Label : 1 -Position : [826.286, 976.862] -Measurements : [1351.26, 220933, 0.177212, -0.944346] ---- -Label : 1 -Position : [1284.15, 977.551] -Measurements : [1821.92, 280682, 0.200975, -0.625485] ---- -Label : 1 -Position : [248.008, 978.166] -Measurements : [1499.06, 699766, -0.0514878, -1.65725] ---- -Label : 1 -Position : [251.88, 978.288] -Measurements : [1656.71, 488833, -0.117968, -1.45545] ---- -Label : 1 -Position : [876.193, 978.927] -Measurements : [1149.59, 303422, 0.32204, -1.08348] ---- -Label : 1 -Position : [881.111, 979.819] -Measurements : [1152.07, 218253, 1.06564, 0.74056] ---- -Label : 1 -Position : [897.484, 979.977] -Measurements : [1162.16, 247030, 0.114829, -1.09992] ---- -Label : 1 -Position : [1386.36, 980.121] -Measurements : [1369.07, 133664, 0.511641, 0.451447] ---- -Label : 1 -Position : [827.852, 980.386] -Measurements : [1476.57, 191894, 0.0869782, -0.389603] ---- -Label : 1 -Position : [897.272, 980.399] -Measurements : [1101.28, 259293, 0.35185, -1.09649] ---- -Label : 1 -Position : [955.127, 980.592] -Measurements : [1214.9, 107748, 0.988645, 1.16339] ---- -Label : 1 -Position : [1281.46, 981.162] -Measurements : [1485.92, 231315, 0.493536, 0.599135] ---- -Label : 1 -Position : [1392.4, 981.27] -Measurements : [1260.96, 204932, 0.415416, 0.168656] ---- -Label : 1 -Position : [828.196, 981.294] -Measurements : [1546.73, 213615, 0.311081, -0.251995] ---- -Label : 1 -Position : [1280.27, 981.759] -Measurements : [1411.94, 194601, 0.310734, 0.383798] ---- -Label : 1 -Position : [1284.51, 982.712] -Measurements : [1447.79, 338113, 0.547702, 0.110556] ---- -Label : 1 -Position : [1385.26, 983.696] -Measurements : [1180.72, 177156, 0.0379326, -0.378221] ---- -Label : 1 -Position : [955.177, 983.774] -Measurements : [1075.65, 180390, 0.709784, -0.102524] ---- -Label : 1 -Position : [829.41, 983.858] -Measurements : [1389.14, 227555, -0.177149, -0.992502] ---- -Label : 1 -Position : [875.366, 984.073] -Measurements : [1417.13, 539295, 0.154007, -1.31158] ---- -Label : 1 -Position : [897.658, 984.445] -Measurements : [1169.97, 385368, 0.303398, -1.46837] ---- -Label : 1 -Position : [1384.29, 984.45] -Measurements : [1051.99, 197370, 0.288829, -0.769384] ---- -Label : 1 -Position : [1392.5, 984.626] -Measurements : [1346.61, 203993, 0.329467, -0.366172] ---- -Label : 1 -Position : [953.055, 984.735] -Measurements : [1021.22, 203614, 0.831625, -0.242744] ---- -Label : 1 -Position : [820.918, 984.776] -Measurements : [987.366, 151414, 0.459284, -0.507995] ---- -Label : 1 -Position : [831.953, 985.012] -Measurements : [1129.68, 334292, 0.341506, -1.41518] ---- -Label : 1 -Position : [1400.35, 985.37] -Measurements : [1050.77, 156916, 0.13651, -1.14777] ---- -Label : 1 -Position : [825.394, 985.711] -Measurements : [1158.59, 302558, 0.171643, -1.38353] ---- -Label : 1 -Position : [1390.67, 986.844] -Measurements : [1335.72, 231852, 0.10142, -0.421343] ---- -Label : 1 -Position : [874.373, 986.901] -Measurements : [1497.22, 455005, 0.125584, -1.17985] ---- -Label : 1 -Position : [235.056, 987.666] -Measurements : [823.383, 260125, 1.37442, 0.455146] ---- -Label : 1 -Position : [928.821, 987.682] -Measurements : [864.292, 283639, 1.0375, -0.290745] ---- -Label : 1 -Position : [875.401, 988.633] -Measurements : [1458.98, 484773, 0.172421, -1.21011] ---- -Label : 1 -Position : [876.574, 988.663] -Measurements : [1443.8, 471873, 0.304372, -1.19915] ---- -Label : 1 -Position : [892.875, 988.736] -Measurements : [1313.69, 352399, 0.0736347, -1.20572] ---- -Label : 1 -Position : [873.727, 988.988] -Measurements : [1417.67, 548627, 0.119971, -1.31317] ---- -Label : 1 -Position : [895.436, 988.988] -Measurements : [1323.42, 403326, -0.0106431, -1.40192] ---- -Label : 1 -Position : [1400.65, 988.995] -Measurements : [1094.77, 157604, 0.125781, -1.12968] ---- -Label : 1 -Position : [1275.77, 989.542] -Measurements : [957.331, 78178.5, 0.979546, 0.153178] ---- -Label : 1 -Position : [931.077, 989.802] -Measurements : [976.837, 240082, 0.840538, -0.420916] ---- -Label : 1 -Position : [931.071, 989.807] -Measurements : [976.837, 240082, 0.840538, -0.420916] ---- -Label : 1 -Position : [950.401, 990.117] -Measurements : [1090.42, 340565, 0.620222, -1.06339] ---- -Label : 1 -Position : [1395.78, 990.361] -Measurements : [1336.31, 173508, 0.508083, -0.226791] ---- -Label : 1 -Position : [823.788, 990.474] -Measurements : [947.459, 263002, 0.662846, -0.981008] ---- -Label : 1 -Position : [877.057, 991.052] -Measurements : [1147.23, 351626, 0.910869, -0.253719] ---- -Label : 1 -Position : [894.207, 991.446] -Measurements : [1506.11, 233771, -0.0437177, -0.863989] ---- -Label : 1 -Position : [1271.75, 991.563] -Measurements : [1068.1, 111909, 0.507661, -0.757213] ---- -Label : 1 -Position : [337.038, 991.959] -Measurements : [1843.31, 597338, -0.380222, -1.28537] ---- -Label : 1 -Position : [234.472, 992.112] -Measurements : [1199.61, 359850, 0.665756, -0.847942] ---- -Label : 1 -Position : [927.804, 992.513] -Measurements : [905.049, 259122, 0.880369, -0.410013] ---- -Label : 1 -Position : [953.538, 992.785] -Measurements : [1000.68, 358701, 0.877751, -0.825523] ---- -Label : 1 -Position : [890.335, 992.952] -Measurements : [1244.63, 203391, 0.478306, -0.77062] ---- -Label : 1 -Position : [336.288, 993.472] -Measurements : [1966.99, 667634, -0.431387, -1.31037] ---- -Label : 1 -Position : [228.84, 993.648] -Measurements : [888.157, 219491, 0.977918, 0.430083] ---- -Label : 1 -Position : [338.687, 993.799] -Measurements : [1777.53, 868985, -0.192584, -1.643] ---- -Label : 1 -Position : [1273.19, 993.931] -Measurements : [1297.16, 227104, 0.700475, -0.527313] ---- -Label : 1 -Position : [1275.78, 994.132] -Measurements : [1424.22, 238687, 0.447421, -0.910747] ---- -Label : 1 -Position : [822.937, 994.722] -Measurements : [1076.47, 241128, 0.311301, -1.01506] ---- -Label : 1 -Position : [894.384, 995.16] -Measurements : [1165.59, 344817, 0.441789, -1.02893] ---- -Label : 1 -Position : [899.112, 995.171] -Measurements : [874.958, 377127, 1.30061, 0.185286] ---- -Label : 1 -Position : [236.654, 995.231] -Measurements : [1108.41, 333085, 1.03938, -0.106948] ---- -Label : 1 -Position : [890.93, 995.542] -Measurements : [1033.65, 241372, 0.688002, -0.503646] ---- -Label : 1 -Position : [891.275, 995.774] -Measurements : [1090.8, 285980, 0.641451, -0.636577] ---- -Label : 1 -Position : [231.86, 996.209] -Measurements : [1120.07, 309761, 1.00491, 0.103579] ---- -Label : 1 -Position : [1271.67, 996.505] -Measurements : [1435.34, 134651, 0.466114, -0.459477] ---- -Label : 1 -Position : [950.422, 996.827] -Measurements : [896.464, 380539, 1.05439, -0.539485] ---- -Label : 1 -Position : [224.103, 996.846] -Measurements : [647.548, 91030.6, 0.941581, -0.386955] ---- -Label : 1 -Position : [931.881, 996.897] -Measurements : [1069.97, 301124, 0.975649, 0.108209] ---- -Label : 1 -Position : [929.433, 997.18] -Measurements : [1190.73, 388327, 0.616594, -0.605661] ---- -Label : 1 -Position : [1269.47, 998.164] -Measurements : [1441.64, 93522.6, 0.56024, -0.13933] ---- -Label : 1 -Position : [923.878, 998.225] -Measurements : [948.878, 366884, 0.777027, -0.704832] ---- -Label : 1 -Position : [1022.12, 999.198] -Measurements : [1219.98, 493217, 0.551643, -1.08479] ---- -Label : 1 -Position : [213.992, 999.28] -Measurements : [1030.47, 342705, 0.50527, -1.21772] ---- -Label : 1 -Position : [1392.66, 999.361] -Measurements : [987.046, 257082, 0.705102, -0.484276] ---- -Label : 1 -Position : [995.609, 999.441] -Measurements : [1377.52, 500426, 0.492417, -1.0831] ---- -Label : 1 -Position : [824.318, 999.503] -Measurements : [1141.09, 178572, 0.568994, -0.35397] ---- -Label : 1 -Position : [1394.14, 1000.19] -Measurements : [1184.25, 301255, 0.41854, -0.942255] ---- -Label : 1 -Position : [1392.1, 1000.64] -Measurements : [984.914, 275909, 0.697065, -0.681816] ---- -Label : 1 -Position : [886.747, 1000.76] -Measurements : [1089.03, 408982, 0.974528, -0.390945] ---- -Label : 1 -Position : [926.975, 1000.87] -Measurements : [1275.47, 390118, 0.353751, -0.819639] ---- -Label : 1 -Position : [1267.72, 1000.92] -Measurements : [1410.81, 161462, 0.262529, -0.405459] ---- -Label : 1 -Position : [1015.1, 1001.07] -Measurements : [1273.03, 279041, 0.329967, -0.609171] ---- -Label : 1 -Position : [888.128, 1001.33] -Measurements : [1127.05, 486644, 0.726622, -1.00996] ---- -Label : 1 -Position : [1019.48, 1001.39] -Measurements : [1442.73, 360975, 0.00625498, -0.806646] ---- -Label : 1 -Position : [216.181, 1001.43] -Measurements : [1105.2, 314518, 0.451184, -1.31583] ---- -Label : 1 -Position : [926.778, 1001.76] -Measurements : [1284.46, 379248, 0.369351, -0.787604] ---- -Label : 1 -Position : [869.934, 1002.46] -Measurements : [1390.57, 575316, 0.1615, -1.34199] ---- -Label : 1 -Position : [217.249, 1002.78] -Measurements : [1067.01, 328301, 0.513509, -1.24531] ---- -Label : 1 -Position : [992.86, 1003.43] -Measurements : [1779.6, 399661, -0.564617, -0.692851] ---- -Label : 1 -Position : [870.077, 1003.45] -Measurements : [1440.52, 504865, 0.209036, -1.25108] ---- -Label : 1 -Position : [1269.21, 1003.88] -Measurements : [1459.03, 128136, 0.663002, -0.357936] ---- -Label : 0 -Position : [282.567, 1003.91] -Measurements : [1252.8, 25843.1, -0.0383469, 0.362406] ---- -Label : 1 -Position : [703.424, 1004.03] -Measurements : [1048.61, 243968, 0.763644, -0.436417] ---- -Label : 1 -Position : [709.977, 1004.48] -Measurements : [1061.13, 206013, 0.896454, 0.163068] ---- -Label : 1 -Position : [888.882, 1004.55] -Measurements : [1141.59, 522293, 0.615074, -1.24156] ---- -Label : 1 -Position : [867.877, 1004.69] -Measurements : [1655.86, 395553, -0.341958, -0.729228] ---- -Label : 1 -Position : [868.94, 1004.78] -Measurements : [1633.78, 403401, -0.217203, -0.946224] ---- -Label : 1 -Position : [699.718, 1005.26] -Measurements : [1138.25, 139985, 0.205838, -0.342353] ---- -Label : 1 -Position : [991.52, 1005.97] -Measurements : [1882.88, 257856, -0.595033, -0.113627] ---- -Label : 1 -Position : [870.117, 1006.2] -Measurements : [1621.85, 380527, 0.147772, -1.32299] ---- -Label : 1 -Position : [696.433, 1006.28] -Measurements : [1140.91, 203703, 1.55049, 4.04098] ---- -Label : 1 -Position : [816.972, 1006.32] -Measurements : [817.865, 171304, 0.782614, -0.658862] ---- -Label : 1 -Position : [995.586, 1006.45] -Measurements : [1817.98, 382625, -0.518557, -0.947025] ---- -Label : 1 -Position : [867.066, 1006.56] -Measurements : [1794.13, 276251, -0.372612, -0.366228] ---- -Label : 1 -Position : [712.407, 1006.69] -Measurements : [1010.34, 158028, 0.929452, 0.548854] ---- -Label : 1 -Position : [696.714, 1006.9] -Measurements : [1140.91, 203703, 1.55049, 4.04098] ---- -Label : 1 -Position : [946.753, 1006.9] -Measurements : [1082.25, 462942, 0.647338, -1.08076] ---- -Label : 1 -Position : [710.077, 1007.22] -Measurements : [1227.13, 301506, 0.866963, -0.1058] ---- -Label : 1 -Position : [1019.48, 1007.53] -Measurements : [1693.31, 251576, -0.0321073, -0.569145] ---- -Label : 1 -Position : [693.992, 1007.61] -Measurements : [1565.98, 376726, 0.746471, -0.134896] ---- -Label : 1 -Position : [924.927, 1007.83] -Measurements : [1200.83, 331153, 0.368665, -0.861583] ---- -Label : 1 -Position : [704.215, 1007.92] -Measurements : [1282.04, 377201, 0.612415, -0.585596] ---- -Label : 1 -Position : [947.394, 1007.94] -Measurements : [1187.06, 489086, 0.440758, -1.25083] ---- -Label : 1 -Position : [1265.95, 1008.18] -Measurements : [1211.42, 202578, 0.746548, 0.0767465] ---- -Label : 1 -Position : [992.45, 1008.35] -Measurements : [1838.33, 274682, -0.375355, -0.516956] ---- -Label : 1 -Position : [1273.46, 1008.42] -Measurements : [1608.58, 302901, -0.015788, -1.12544] ---- -Label : 1 -Position : [824.096, 1008.47] -Measurements : [773.892, 144827, 1.03437, -0.0792007] ---- -Label : 1 -Position : [335.85, 1009.13] -Measurements : [704.709, 180870, 1.46501, 0.967326] ---- -Label : 1 -Position : [80.4177, 1009.16] -Measurements : [1237.15, 164794, 0.687169, -0.0888316] ---- -Label : 1 -Position : [987.753, 1009.31] -Measurements : [1416.1, 393782, -0.182936, -1.09392] ---- -Label : 1 -Position : [918.862, 1009.34] -Measurements : [851.816, 240039, 0.707326, -0.93859] ---- -Label : 1 -Position : [79.336, 1009.52] -Measurements : [1249.22, 159618, 0.804945, -0.0250845] ---- -Label : 1 -Position : [186.436, 1009.55] -Measurements : [1508.42, 512819, -0.437206, -1.35607] ---- -Label : 1 -Position : [1014.54, 1010.22] -Measurements : [1347.25, 325720, 0.553551, -0.607395] ---- -Label : 1 -Position : [865.651, 1010.22] -Measurements : [1790.28, 360478, -0.303782, -0.551975] ---- -Label : 1 -Position : [195.171, 1010.32] -Measurements : [1209.92, 481432, 0.606674, -0.833103] ---- -Label : 1 -Position : [689.47, 1010.38] -Measurements : [1805.01, 636897, 0.0295537, -1.13368] ---- -Label : 1 -Position : [673.432, 1010.39] -Measurements : [1336.94, 384086, 0.00522749, -1.45692] ---- -Label : 1 -Position : [699.446, 1010.49] -Measurements : [1230.52, 246358, 0.699893, 0.429139] ---- -Label : 1 -Position : [197.516, 1010.57] -Measurements : [1007.05, 491115, 1.05784, -0.0912116] ---- -Label : 0 -Position : [284.955, 1010.59] -Measurements : [1175.09, 34992.5, 0.439273, -0.52895] ---- -Label : 1 -Position : [1020.54, 1010.65] -Measurements : [1638.64, 299475, 0.0354473, -0.446996] ---- -Label : 1 -Position : [819.962, 1010.66] -Measurements : [1000.88, 192175, 0.401885, -0.845193] ---- -Label : 1 -Position : [865.838, 1010.66] -Measurements : [1790.28, 360478, -0.303782, -0.551975] ---- -Label : 1 -Position : [1019.11, 1010.79] -Measurements : [1665.97, 261209, 0.207698, -0.410138] ---- -Label : 1 -Position : [1021.94, 1010.79] -Measurements : [1572.58, 380566, -0.0685909, -0.775831] ---- -Label : 1 -Position : [667.983, 1010.87] -Measurements : [1403.72, 281906, 0.0296296, -0.897928] ---- -Label : 1 -Position : [984.209, 1011.02] -Measurements : [1070.4, 341697, 0.165734, -1.55756] ---- -Label : 1 -Position : [949.623, 1011.02] -Measurements : [1477.17, 489272, 0.202019, -1.11097] ---- -Label : 1 -Position : [925.642, 1011.05] -Measurements : [1355, 168027, -0.0345495, -0.550903] ---- -Label : 1 -Position : [672.676, 1011.2] -Measurements : [1410.35, 344015, -0.060858, -1.30959] ---- -Label : 1 -Position : [56.4424, 1011.35] -Measurements : [1359.7, 108998, 0.983302, 0.0592867] ---- -Label : 1 -Position : [1266.52, 1011.39] -Measurements : [1336.94, 247599, 1.14334, 0.649429] ---- -Label : 1 -Position : [949.78, 1011.48] -Measurements : [1477.17, 489272, 0.202019, -1.11097] ---- -Label : 1 -Position : [986.242, 1011.82] -Measurements : [1340.04, 355859, -0.313639, -1.18363] ---- -Label : 1 -Position : [1063.72, 1012.04] -Measurements : [1334.52, 218216, 0.43014, -0.821782] ---- -Label : 1 -Position : [673.82, 1012.06] -Measurements : [1313.82, 381209, 0.120558, -1.46653] ---- -Label : 1 -Position : [685.148, 1012.22] -Measurements : [1354.64, 892285, 0.370112, -1.52039] ---- -Label : 1 -Position : [331.168, 1012.42] -Measurements : [872.201, 167807, 0.808887, -0.581203] ---- -Label : 1 -Position : [186.477, 1012.43] -Measurements : [1958.34, 311656, -0.87901, 0.25566] ---- -Label : 1 -Position : [945.756, 1012.45] -Measurements : [1621.86, 332817, 0.286001, -0.772931] ---- -Label : 1 -Position : [195.048, 1012.59] -Measurements : [1341.3, 493984, 0.368361, -1.10725] ---- -Label : 1 -Position : [922.879, 1012.74] -Measurements : [1397.02, 194509, -0.394176, -0.492827] ---- -Label : 1 -Position : [927.255, 1012.75] -Measurements : [1319.35, 168888, 0.345695, -0.781819] ---- -Label : 1 -Position : [870.076, 1012.77] -Measurements : [1362.65, 346276, 0.995693, -0.378502] ---- -Label : 1 -Position : [944.969, 1012.9] -Measurements : [1553.33, 335442, 0.422129, -0.641062] ---- -Label : 1 -Position : [1268.01, 1012.91] -Measurements : [1505.08, 357987, 0.837311, -0.471997] ---- -Label : 1 -Position : [670.942, 1013.03] -Measurements : [1398.96, 363892, -0.0279529, -1.35289] ---- -Label : 1 -Position : [720.199, 1013.06] -Measurements : [2089.01, 248990, -0.384212, 0.283971] ---- -Label : 1 -Position : [721.875, 1013.18] -Measurements : [2198.27, 219843, -0.155778, -0.182142] ---- -Label : 1 -Position : [184.294, 1013.21] -Measurements : [1974.89, 352723, -0.964301, 0.507504] ---- -Label : 1 -Position : [1017.44, 1013.26] -Measurements : [1531.1, 381005, 0.247374, -0.963339] ---- -Label : 1 -Position : [1088.62, 1013.6] -Measurements : [930.082, 333463, 0.503889, -1.31492] ---- -Label : 1 -Position : [666.532, 1013.66] -Measurements : [1087.4, 355167, 0.615583, -0.850368] ---- -Label : 1 -Position : [718.961, 1013.66] -Measurements : [1858.75, 360391, -0.482358, -0.52879] ---- -Label : 1 -Position : [77.8269, 1013.67] -Measurements : [1090.83, 296080, 0.508568, -1.00207] ---- -Label : 1 -Position : [186.856, 1014.13] -Measurements : [2101.7, 221535, -0.704568, 0.395886] ---- -Label : 1 -Position : [1135.61, 1014.8] -Measurements : [1228.02, 201853, 0.404409, -0.332593] ---- -Label : 1 -Position : [59.1503, 1014.96] -Measurements : [1362.87, 193627, 0.434068, -0.849415] ---- -Label : 1 -Position : [1133.21, 1014.99] -Measurements : [1159.18, 249625, 0.367655, -0.651623] ---- -Label : 1 -Position : [182.248, 1015.15] -Measurements : [1803.83, 444958, -0.550203, -0.577508] ---- -Label : 1 -Position : [864.199, 1015.16] -Measurements : [1580.98, 309313, 0.230618, -0.634304] ---- -Label : 1 -Position : [921.54, 1015.26] -Measurements : [1374.97, 170005, -0.306728, -0.351232] ---- -Label : 0 -Position : [295.886, 1015.38] -Measurements : [942.082, 26170.4, -1.51034, 2.19124] ---- -Label : 1 -Position : [333.215, 1015.51] -Measurements : [657.631, 129639, 1.62728, 1.56926] ---- -Label : 1 -Position : [924.758, 1015.53] -Measurements : [1375.63, 122818, 0.388242, -0.525013] ---- -Label : 1 -Position : [1086.67, 1015.6] -Measurements : [1155.62, 297921, -0.082828, -1.31987] ---- -Label : 1 -Position : [55.272, 1015.66] -Measurements : [1421.39, 228913, 0.114756, -1.18742] ---- -Label : 1 -Position : [988.764, 1015.72] -Measurements : [1747, 192495, -0.70219, 0.628138] ---- -Label : 1 -Position : [916.676, 1015.95] -Measurements : [873.293, 253077, 0.619499, -1.04358] ---- -Label : 1 -Position : [814.228, 1015.98] -Measurements : [1596.2, 484646, -0.0122618, -1.15247] ---- -Label : 1 -Position : [1065.29, 1016.05] -Measurements : [1479.7, 227645, -0.0332878, -1.08239] ---- -Label : 1 -Position : [1062.34, 1016.09] -Measurements : [1544.05, 173198, -0.395395, -0.837399] ---- -Label : 1 -Position : [726.612, 1016.1] -Measurements : [2505.57, 215771, -0.443571, -1.00279] ---- -Label : 1 -Position : [863.672, 1016.26] -Measurements : [1480.3, 366424, 0.198295, -0.682477] ---- -Label : 1 -Position : [810.009, 1016.4] -Measurements : [1611.51, 482474, 0.121139, -1.10883] ---- -Label : 1 -Position : [1135.03, 1016.42] -Measurements : [1132.47, 264809, 0.479531, -0.858834] ---- -Label : 1 -Position : [882.738, 1016.43] -Measurements : [808.791, 183831, 1.08666, -0.122231] ---- -Label : 1 -Position : [1012.11, 1016.54] -Measurements : [1075.15, 284075, 0.640175, -0.200572] ---- -Label : 1 -Position : [1088.45, 1016.72] -Measurements : [1174.37, 332319, -0.0538544, -1.48596] ---- -Label : 1 -Position : [1059.02, 1016.84] -Measurements : [1415.14, 253189, -0.398233, -1.02097] ---- -Label : 1 -Position : [1007.46, 1017.03] -Measurements : [808.232, 152855, 1.05815, 1.12507] ---- -Label : 1 -Position : [946.022, 1017.22] -Measurements : [1264.41, 466567, 0.695817, -0.526606] ---- -Label : 1 -Position : [882.754, 1017.57] -Measurements : [809.583, 181378, 1.1162, -0.0656009] ---- -Label : 1 -Position : [726.009, 1017.64] -Measurements : [2507.08, 224688, -0.455013, -0.97684] ---- -Label : 1 -Position : [920.831, 1017.66] -Measurements : [1313.54, 199176, -0.484826, -0.416592] ---- -Label : 1 -Position : [941.66, 1017.77] -Measurements : [1053.78, 276813, 0.701267, -0.5894] ---- -Label : 1 -Position : [1062.49, 1017.77] -Measurements : [1555.64, 169523, -0.333063, -0.878641] ---- -Label : 1 -Position : [736.771, 1017.96] -Measurements : [2099.71, 384312, 0.314329, -0.894207] ---- -Label : 1 -Position : [738.224, 1018.28] -Measurements : [1970.34, 390868, 0.566064, -0.615688] ---- -Label : 1 -Position : [886.533, 1018.6] -Measurements : [718.274, 164740, 1.5961, 1.2792] ---- -Label : 1 -Position : [984.698, 1018.64] -Measurements : [1664.76, 442059, -0.603316, -0.580731] ---- -Label : 1 -Position : [187.35, 1018.84] -Measurements : [1859.34, 464470, -0.307346, -1.12286] ---- -Label : 1 -Position : [862.151, 1018.85] -Measurements : [1264.47, 439200, 0.571673, -0.639777] ---- -Label : 1 -Position : [989.174, 1019] -Measurements : [1744.47, 314479, -0.364403, -0.523934] ---- -Label : 1 -Position : [1264.32, 1019.05] -Measurements : [1342.94, 74487.3, 0.300554, 0.745904] ---- -Label : 1 -Position : [1087.69, 1019.52] -Measurements : [1344.85, 209870, -0.381023, -0.823602] ---- -Label : 1 -Position : [867.407, 1019.66] -Measurements : [1107.94, 285563, 1.4988, 1.83825] ---- -Label : 1 -Position : [738.195, 1019.91] -Measurements : [1991.97, 398039, 0.687494, -0.573591] ---- -Label : 1 -Position : [936.976, 1020.05] -Measurements : [1033.79, 219848, 0.759106, -0.407318] ---- -Label : 1 -Position : [721.718, 1020.26] -Measurements : [2227.96, 470670, -0.909593, -0.0630635] ---- -Label : 1 -Position : [738.533, 1020.27] -Measurements : [2003.48, 415460, 0.699372, -0.6297] ---- -Label : 1 -Position : [1085.44, 1020.51] -Measurements : [1376.22, 163704, -0.358114, -0.831619] ---- -Label : 1 -Position : [812.46, 1020.57] -Measurements : [2077.83, 216722, -0.575687, 0.558243] ---- -Label : 1 -Position : [813.409, 1020.9] -Measurements : [2067, 279280, -0.671777, 0.218464] ---- -Label : 1 -Position : [984.081, 1020.91] -Measurements : [1795.22, 411441, -0.670199, -0.264932] ---- -Label : 1 -Position : [1016.45, 1020.92] -Measurements : [854.084, 249593, 1.17708, 0.201372] ---- -Label : 1 -Position : [170.763, 1020.97] -Measurements : [734.544, 129177, 0.817929, -0.615007] ---- -Label : 1 -Position : [986.102, 1020.99] -Measurements : [1942.9, 225167, -0.391199, 0.0327143] ---- -Label : 1 -Position : [861.695, 1021.2] -Measurements : [1126.9, 344118, 0.630967, -0.611473] ---- -Label : 1 -Position : [733.575, 1021.42] -Measurements : [2325.61, 338787, 0.0441115, -1.03222] ---- -Label : 1 -Position : [741.358, 1021.42] -Measurements : [1600.48, 132763, 0.217706, 0.087064] ---- -Label : 1 -Position : [1064.32, 1022.06] -Measurements : [1382.81, 205260, 0.142206, -1.26915] ---- -Label : 1 -Position : [1268.34, 1022.33] -Measurements : [1330.16, 197968, -0.223445, -0.612095] ---- -Label : 1 -Position : [1131.8, 1022.61] -Measurements : [1085.66, 390413, 0.43084, -1.36876] ---- -Label : 1 -Position : [175.08, 1022.78] -Measurements : [1166.78, 167020, -0.319599, -0.729617] ---- -Label : 1 -Position : [986.325, 1022.91] -Measurements : [1866.08, 355468, -0.67631, -0.244939] ---- -Label : 1 -Position : [1009.93, 1022.98] -Measurements : [1031.95, 522264, 0.837611, -0.843353] ---- -Label : 1 -Position : [986.306, 1023.1] -Measurements : [1751.63, 460529, -0.473679, -0.913764] ---- -Label : 1 -Position : [1060.85, 1023.1] -Measurements : [1576.69, 157170, -0.641684, -0.343446] ---- -Label : 1 -Position : [815.865, 1023.23] -Measurements : [1805.28, 582916, -0.302783, -1.32167] ---- -Label : 1 -Position : [653.921, 1023.46] -Measurements : [1388.13, 586669, 0.153146, -1.53759] ---- -Label : 1 -Position : [655.063, 1023.49] -Measurements : [1428.91, 551402, 0.102909, -1.50477] ---- -Label : 1 -Position : [855.637, 1023.5] -Measurements : [1093.63, 423964, 0.488439, -1.04901] ---- -Label : 1 -Position : [862.968, 1023.55] -Measurements : [1119.25, 357591, 0.897059, -0.252146] ---- -Label : 1 -Position : [1267.46, 1023.56] -Measurements : [1384.85, 187349, -0.237141, -0.541418] ---- -Label : 1 -Position : [1131.76, 1023.79] -Measurements : [1121.9, 387088, 0.377765, -1.41704] ---- -Label : 1 -Position : [656.101, 1024.08] -Measurements : [1418.41, 575588, 0.154365, -1.577] ---- -Label : 1 -Position : [749.55, 1024.29] -Measurements : [2003.47, 254689, 0.190488, -0.639311] ---- -Label : 1 -Position : [1080.88, 1024.32] -Measurements : [1165.23, 164307, 0.160771, -0.914066] ---- -Label : 1 -Position : [814.771, 1024.45] -Measurements : [1751.83, 639973, -0.275082, -1.37547] ---- -Label : 1 -Position : [756.95, 1024.53] -Measurements : [1505.41, 270464, -0.0122335, -1.01706] ---- -Label : 1 -Position : [1057.35, 1024.58] -Measurements : [1583.02, 131644, -0.981531, 0.853314] ---- -Label : 1 -Position : [656.443, 1024.59] -Measurements : [1418.41, 575588, 0.154365, -1.577] ---- -Label : 1 -Position : [761.921, 1024.92] -Measurements : [1373.73, 222951, 0.158324, -0.943853] ---- -Label : 1 -Position : [1060.18, 1024.96] -Measurements : [1554.76, 156984, -0.766471, -0.197774] ---- -Label : 1 -Position : [941.525, 1025] -Measurements : [1312.09, 517932, 0.252852, -1.452] ---- -Label : 1 -Position : [940.841, 1025.14] -Measurements : [1504.59, 491499, -0.129409, -1.33678] ---- -Label : 1 -Position : [1262.27, 1025.2] -Measurements : [1701.02, 157066, -0.030413, -1.02152] ---- -Label : 1 -Position : [326.048, 1025.22] -Measurements : [980.903, 218349, 0.906212, -0.191418] ---- -Label : 1 -Position : [1133.28, 1025.3] -Measurements : [1191.19, 328797, 0.343022, -1.34542] ---- -Label : 1 -Position : [810.542, 1025.4] -Measurements : [1539.92, 573228, -0.0647194, -1.34218] ---- -Label : 1 -Position : [1082.96, 1025.52] -Measurements : [1277.9, 187131, -0.0419008, -1.03164] ---- -Label : 1 -Position : [642.366, 1025.53] -Measurements : [1360.34, 487289, 0.210597, -1.41078] ---- -Label : 1 -Position : [880.863, 1025.66] -Measurements : [1131.23, 314135, 0.380774, -1.07941] ---- -Label : 1 -Position : [762.185, 1025.69] -Measurements : [1523.17, 215515, 0.0387865, -0.51673] ---- -Label : 1 -Position : [1083.4, 1025.84] -Measurements : [1309.23, 185522, -0.123782, -1.0246] ---- -Label : 1 -Position : [177.093, 1025.86] -Measurements : [1210.52, 113802, -0.172761, -0.929843] ---- -Label : 1 -Position : [944.637, 1025.93] -Measurements : [1107.62, 572645, 0.802953, -0.963507] ---- -Label : 1 -Position : [328.101, 1026.07] -Measurements : [843.462, 252753, 1.24953, 0.263152] ---- -Label : 1 -Position : [1257.29, 1026.1] -Measurements : [1615.18, 266341, -0.198848, -1.00919] ---- -Label : 1 -Position : [858.874, 1026.22] -Measurements : [1459.64, 420848, -0.0181147, -1.26278] ---- -Label : 1 -Position : [815.491, 1026.28] -Measurements : [1355.87, 674522, 0.453067, -1.3458] ---- -Label : 1 -Position : [644.935, 1026.34] -Measurements : [1294.27, 573366, 0.480333, -1.17723] ---- -Label : 1 -Position : [1057.99, 1026.37] -Measurements : [1542.85, 137728, -0.791577, 0.323243] ---- -Label : 1 -Position : [935.254, 1026.67] -Measurements : [1476.71, 354669, 0.173339, -1.11225] ---- -Label : 1 -Position : [1007.2, 1026.78] -Measurements : [1350.49, 363882, 0.0987247, -0.793205] ---- -Label : 1 -Position : [812.409, 1026.82] -Measurements : [1430.55, 598980, 0.169515, -1.4309] ---- -Label : 0 -Position : [272.167, 1027.14] -Measurements : [1038.38, 48306.7, 0.966819, 0.267208] ---- -Label : 1 -Position : [756.103, 1027.16] -Measurements : [1731.74, 230366, -0.0394879, -0.223761] ---- -Label : 1 -Position : [1064.07, 1027.57] -Measurements : [1167.02, 145886, 0.587079, -0.65369] ---- -Label : 0 -Position : [257.6, 1027.78] -Measurements : [1244.32, 27589.8, -0.135492, -0.0876443] ---- -Label : 1 -Position : [882.117, 1027.78] -Measurements : [1285.63, 493198, 0.446053, -0.904536] ---- -Label : 1 -Position : [640.762, 1027.88] -Measurements : [1659.11, 430891, -0.0117133, -0.967989] ---- -Label : 1 -Position : [1060.53, 1028.02] -Measurements : [1464.46, 197097, -0.474405, -0.804553] ---- -Label : 1 -Position : [655.379, 1028.06] -Measurements : [1125.46, 628663, 0.801665, -1.02351] ---- -Label : 1 -Position : [749.852, 1028.2] -Measurements : [2075.55, 282163, -0.0782922, -0.504301] ---- -Label : 0 -Position : [251.691, 1028.21] -Measurements : [1301.12, 23487.7, -0.680369, 0.843609] ---- -Label : 1 -Position : [860.775, 1028.35] -Measurements : [1402.43, 398964, 0.309612, -1.18305] ---- -Label : 1 -Position : [754.064, 1028.61] -Measurements : [1832.58, 232607, -0.0412702, 0.161256] ---- -Label : 1 -Position : [1080.66, 1028.79] -Measurements : [1290.42, 163005, 0.151376, -0.800647] ---- -Label : 1 -Position : [324.001, 1028.87] -Measurements : [997.57, 206857, 0.829232, 0.116221] ---- -Label : 1 -Position : [883.836, 1028.89] -Measurements : [1301.99, 537376, 0.407466, -1.08298] ---- -Label : 1 -Position : [941.932, 1029.02] -Measurements : [1701.05, 509993, -0.448159, -1.15055] ---- -Label : 1 -Position : [856.671, 1029.06] -Measurements : [1398.6, 473694, 0.0240091, -1.35056] ---- -Label : 1 -Position : [763.886, 1029.21] -Measurements : [1895.26, 241352, 0.54383, -0.635985] ---- -Label : 1 -Position : [940.022, 1029.24] -Measurements : [1814.52, 390505, -0.638647, -0.609735] ---- -Label : 1 -Position : [880.454, 1029.34] -Measurements : [1686.67, 360723, 0.0448314, -0.593499] ---- -Label : 1 -Position : [856.826, 1029.5] -Measurements : [1398.6, 473694, 0.0240091, -1.35056] ---- -Label : 1 -Position : [1005.78, 1029.5] -Measurements : [1460.45, 253642, 0.0529343, -0.417337] ---- -Label : 1 -Position : [1260.13, 1029.62] -Measurements : [1903.15, 202993, -1.15059, 0.948008] ---- -Label : 1 -Position : [167.4, 1029.94] -Measurements : [1184.95, 299723, 0.890291, -0.132169] ---- -Label : 1 -Position : [877.518, 1029.95] -Measurements : [1681.92, 292992, 0.11127, -0.448425] ---- -Label : 0 -Position : [269.418, 1029.99] -Measurements : [1007.05, 33156.2, 1.00998, 0.401464] ---- -Label : 0 -Position : [242.957, 1030.17] -Measurements : [1255, 17424.4, 0.972226, 1.28589] ---- -Label : 1 -Position : [1085.1, 1030.21] -Measurements : [1213.74, 312211, 0.187014, -1.36812] ---- -Label : 1 -Position : [1082.17, 1030.22] -Measurements : [1386.25, 206264, -0.0311393, -0.962463] ---- -Label : 1 -Position : [857.55, 1030.27] -Measurements : [1387.95, 471130, 0.100029, -1.37031] ---- -Label : 1 -Position : [1080.94, 1030.34] -Measurements : [1387.24, 180290, 0.0585538, -0.683365] ---- -Label : 1 -Position : [935.021, 1030.51] -Measurements : [1781.97, 356160, -0.486212, -0.757765] ---- -Label : 1 -Position : [159.303, 1030.58] -Measurements : [1594.29, 338365, -0.0868325, -0.801627] ---- -Label : 1 -Position : [1265.33, 1030.69] -Measurements : [1695.76, 273317, -0.462513, -0.875079] ---- -Label : 1 -Position : [1077.03, 1031.25] -Measurements : [1282.05, 192334, 0.626232, 0.0199522] ---- -Label : 0 -Position : [238.223, 1031.41] -Measurements : [1242.49, 20201.5, 1.26403, 1.00798] ---- -Label : 1 -Position : [1133.58, 1031.57] -Measurements : [1138.15, 219688, 0.795919, -0.185524] ---- -Label : 1 -Position : [1007.2, 1031.7] -Measurements : [1587, 215822, -0.011973, -0.360132] ---- -Label : 1 -Position : [1053.89, 1031.7] -Measurements : [1632.77, 177635, -0.646424, 0.16489] ---- -Label : 1 -Position : [1261.45, 1031.75] -Measurements : [1730.4, 392720, -0.76864, -0.749569] ---- -Label : 1 -Position : [935.162, 1031.77] -Measurements : [1837.56, 326526, -0.571069, -0.575642] ---- -Label : 1 -Position : [987.652, 1031.91] -Measurements : [1094.94, 289525, 0.761332, -0.686408] ---- -Label : 0 -Position : [286.021, 1032.02] -Measurements : [809.406, 62497.4, -0.102264, -1.50675] ---- -Label : 1 -Position : [760.207, 1032.15] -Measurements : [1838.53, 420923, -0.207162, -0.858116] ---- -Label : 1 -Position : [875.645, 1032.28] -Measurements : [1668.09, 400150, -0.100869, -0.837956] ---- -Label : 1 -Position : [912.242, 1032.29] -Measurements : [1383.41, 495121, -0.0460259, -1.38845] ---- -Label : 1 -Position : [146.655, 1032.44] -Measurements : [976.944, 414042, 0.830243, -0.821906] ---- -Label : 1 -Position : [881.681, 1032.46] -Measurements : [1866.71, 517759, -0.461058, -0.74473] ---- -Label : 1 -Position : [770.849, 1032.48] -Measurements : [1482.36, 236619, -0.306471, -1.02113] ---- -Label : 1 -Position : [165.265, 1032.68] -Measurements : [1441.79, 419345, 0.471949, -1.10492] ---- -Label : 1 -Position : [1054.74, 1032.72] -Measurements : [1669.25, 137403, -0.218256, -0.588729] ---- -Label : 1 -Position : [167.408, 1032.75] -Measurements : [1186.03, 287936, 1.0184, -0.0205003] ---- -Label : 1 -Position : [983.03, 1032.93] -Measurements : [1266.25, 393476, 0.0919286, -1.56161] ---- -Label : 1 -Position : [1082.36, 1032.97] -Measurements : [1400.67, 269406, 0.146483, -0.878449] ---- -Label : 1 -Position : [160.744, 1033.02] -Measurements : [1654.36, 371864, -0.0919938, -1.01792] ---- -Label : 1 -Position : [641.956, 1033.32] -Measurements : [1798.7, 652497, -0.262156, -1.22929] ---- -Label : 1 -Position : [150.804, 1033.44] -Measurements : [1500.68, 423158, -0.400539, -0.989649] ---- -Label : 1 -Position : [913.804, 1033.56] -Measurements : [1552.28, 446671, -0.225919, -1.07268] ---- -Label : 1 -Position : [1126.38, 1033.72] -Measurements : [1046.26, 131728, -0.0776579, -1.03481] ---- -Label : 1 -Position : [915.27, 1033.85] -Measurements : [1469.71, 511551, -0.0580154, -1.31591] ---- -Label : 1 -Position : [938.285, 1033.87] -Measurements : [1870.49, 422287, -0.774424, -0.493746] ---- -Label : 1 -Position : [1129.3, 1034.03] -Measurements : [1170.67, 120077, 0.0862773, -0.443696] ---- -Label : 1 -Position : [155.112, 1034.04] -Measurements : [1866.39, 233003, -0.627476, 0.160293] ---- -Label : 1 -Position : [852.409, 1034.04] -Measurements : [896.976, 279769, 1.03476, 0.430181] ---- -Label : 1 -Position : [637.977, 1034.07] -Measurements : [1287.39, 779676, 0.484678, -1.39557] ---- -Label : 1 -Position : [1011.28, 1034.07] -Measurements : [1293.2, 338822, 0.0345925, -1.18182] ---- -Label : 1 -Position : [813.164, 1034.09] -Measurements : [975.84, 428454, 1.19036, -0.0895063] ---- -Label : 1 -Position : [1054.49, 1034.15] -Measurements : [1674.4, 160525, -0.293266, -0.353772] ---- -Label : 1 -Position : [937.974, 1034.15] -Measurements : [1875.16, 377493, -0.676508, -0.513657] ---- -Label : 1 -Position : [883.58, 1034.17] -Measurements : [1658.68, 762804, -0.0607206, -1.51013] ---- -Label : 1 -Position : [1080.12, 1034.44] -Measurements : [1502.55, 215302, -0.00869173, -0.625372] ---- -Label : 1 -Position : [1056.53, 1034.79] -Measurements : [1610.14, 153409, -0.0891148, -0.630557] ---- -Label : 1 -Position : [807.369, 1034.87] -Measurements : [1442.14, 509837, -0.0458841, -1.32057] ---- -Label : 1 -Position : [153.259, 1034.89] -Measurements : [1870.4, 198087, -0.768268, 0.704529] ---- -Label : 1 -Position : [1005.16, 1035.2] -Measurements : [1482.87, 282322, -0.213725, -0.869752] ---- -Label : 1 -Position : [929.824, 1035.22] -Measurements : [1538.04, 338878, 0.272465, -1.4371] ---- -Label : 1 -Position : [808.494, 1035.23] -Measurements : [1543.7, 523076, -0.0880556, -1.07464] ---- -Label : 1 -Position : [774.828, 1035.69] -Measurements : [969.554, 332057, 1.07781, -0.334684] ---- -Label : 1 -Position : [1260.87, 1035.75] -Measurements : [1154.42, 711934, 0.434936, -1.60446] ---- -Label : 1 -Position : [879.225, 1035.9] -Measurements : [1967.05, 492325, -0.558617, -0.502236] ---- -Label : 1 -Position : [638.094, 1035.98] -Measurements : [1348.38, 858416, 0.438947, -1.44851] ---- -Label : 1 -Position : [148.968, 1036.09] -Measurements : [1426.17, 489730, -0.176841, -1.53226] ---- -Label : 1 -Position : [912.592, 1036.42] -Measurements : [1529.38, 475893, -0.18154, -1.23275] ---- -Label : 1 -Position : [934.287, 1036.61] -Measurements : [1907.55, 314310, -0.838271, -0.0506724] ---- -Label : 1 -Position : [770.767, 1036.78] -Measurements : [1281.68, 328566, 0.208758, -1.37306] ---- -Label : 0 -Position : [239.025, 1036.85] -Measurements : [1293.66, 16028.4, 1.08529, 0.360448] ---- -Label : 1 -Position : [911.26, 1037.02] -Measurements : [1361.74, 564362, 0.162223, -1.46272] ---- -Label : 1 -Position : [913.631, 1037.12] -Measurements : [1528.85, 468633, -0.0826088, -1.29753] ---- -Label : 1 -Position : [983.695, 1037.27] -Measurements : [1497.89, 280322, -0.229051, -1.21935] ---- -Label : 1 -Position : [854.778, 1037.28] -Measurements : [795.104, 129969, 0.519423, -1.2366] ---- -Label : 1 -Position : [158.596, 1037.38] -Measurements : [1512.37, 464476, 0.205104, -1.25934] ---- -Label : 1 -Position : [627.62, 1037.41] -Measurements : [1154.03, 300318, -0.0207254, -1.47387] ---- -Label : 1 -Position : [981.554, 1037.71] -Measurements : [1611.52, 221362, -0.560527, -0.604136] ---- -Label : 1 -Position : [631.524, 1037.74] -Measurements : [1015.36, 333822, 0.481501, -1.47823] ---- -Label : 1 -Position : [979.753, 1037.84] -Measurements : [1644.13, 214514, -0.536419, -0.433746] ---- -Label : 1 -Position : [1055.53, 1038.25] -Measurements : [1397.33, 349448, -0.0910156, -1.19059] ---- -Label : 1 -Position : [155.898, 1038.33] -Measurements : [1628.8, 421966, -0.151455, -1.27603] ---- -Label : 1 -Position : [322.976, 1038.53] -Measurements : [1139.71, 247121, 0.663428, -0.28784] ---- -Label : 1 -Position : [1080.92, 1038.65] -Measurements : [1707.92, 285089, -0.225023, -0.595941] ---- -Label : 0 -Position : [289.017, 1038.73] -Measurements : [1082.72, 22752.4, -2.76782, 7.6198] ---- -Label : 1 -Position : [1007.61, 1039.07] -Measurements : [1363.53, 271353, 0.377418, -0.884089] ---- -Label : 1 -Position : [125.861, 1039.14] -Measurements : [651.268, 187701, 2.35487, 4.8285] ---- -Label : 1 -Position : [321.93, 1039.41] -Measurements : [1155.02, 217567, 0.711923, 0.0246444] ---- -Label : 1 -Position : [321.633, 1039.68] -Measurements : [1155.02, 217567, 0.711923, 0.0246444] ---- -Label : 1 -Position : [622.903, 1040.3] -Measurements : [713.301, 212250, 1.3097, 0.285215] ---- -Label : 1 -Position : [135.026, 1040.52] -Measurements : [1656.79, 358402, -0.325768, -0.925886] ---- -Label : 1 -Position : [806.446, 1040.97] -Measurements : [1907.42, 332193, 0.273794, -0.395531] ---- -Label : 1 -Position : [1079.3, 1040.99] -Measurements : [1769.55, 232067, -0.216072, -0.34918] ---- -Label : 1 -Position : [1129.3, 1040.99] -Measurements : [1334.24, 161281, 0.198236, -0.875272] ---- -Label : 1 -Position : [976.563, 1041.09] -Measurements : [1606.62, 295623, -0.690447, -0.437781] ---- -Label : 1 -Position : [1051.44, 1041.11] -Measurements : [1048.97, 312331, 0.602824, -0.978273] ---- -Label : 1 -Position : [1131.81, 1041.21] -Measurements : [1272.24, 167795, 0.541475, -0.911862] ---- -Label : 1 -Position : [853.113, 1041.47] -Measurements : [695.979, 130009, 0.928513, -0.739818] ---- -Label : 1 -Position : [138.728, 1041.72] -Measurements : [1528.77, 400717, -0.0632972, -1.30892] ---- -Label : 1 -Position : [932.269, 1041.78] -Measurements : [1658.61, 355829, -0.0486442, -0.947067] ---- -Label : 1 -Position : [1082.81, 1042.25] -Measurements : [1521.01, 459423, -0.109999, -1.35876] ---- -Label : 1 -Position : [617.439, 1042.25] -Measurements : [683.637, 107433, 1.58998, 3.88638] ---- -Label : 1 -Position : [1050.53, 1042.3] -Measurements : [1041.54, 326445, 0.664316, -0.842964] ---- -Label : 1 -Position : [805.073, 1042.66] -Measurements : [1821.69, 329339, 0.399071, -0.209585] ---- -Label : 1 -Position : [1003.57, 1042.9] -Measurements : [1194.3, 219613, 0.969682, 0.253967] ---- -Label : 1 -Position : [1006.7, 1042.96] -Measurements : [1234.41, 231249, 0.697452, -0.182632] ---- -Label : 1 -Position : [905.134, 1043.02] -Measurements : [855.489, 273619, 0.9507, -0.646299] ---- -Label : 1 -Position : [1126.51, 1043.19] -Measurements : [1514.7, 189144, -0.227025, -0.440306] ---- -Label : 1 -Position : [978.948, 1043.45] -Measurements : [1564.47, 298323, -0.429589, -0.908748] ---- -Label : 1 -Position : [1258.19, 1043.57] -Measurements : [867.112, 505976, 1.11019, -0.0693125] ---- -Label : 1 -Position : [129, 1043.77] -Measurements : [813.898, 180564, 0.982528, -0.177614] ---- -Label : 1 -Position : [800.931, 1043.81] -Measurements : [1365.89, 243373, 0.684081, 0.0443715] ---- -Label : 1 -Position : [809.213, 1044.01] -Measurements : [1440.64, 670291, 0.518934, -0.90807] ---- -Label : 1 -Position : [872.671, 1044.09] -Measurements : [1045.58, 211320, 0.219806, -0.887694] ---- -Label : 1 -Position : [1074.61, 1044.52] -Measurements : [1560.07, 251991, -0.761766, -0.360482] ---- -Label : 1 -Position : [865.912, 1044.84] -Measurements : [968.715, 60020.7, 0.143519, 0.358597] ---- -Label : 1 -Position : [1077.25, 1045.09] -Measurements : [1772.23, 238859, -0.522419, -0.0823446] ---- -Label : 1 -Position : [617.38, 1045.19] -Measurements : [954.533, 398827, 1.36306, 0.764816] ---- -Label : 1 -Position : [870.265, 1045.34] -Measurements : [1098.49, 168294, 0.155758, -0.537022] ---- -Label : 1 -Position : [907.724, 1045.44] -Measurements : [1015.01, 282826, 0.536376, -1.17681] ---- -Label : 1 -Position : [932.663, 1045.5] -Measurements : [1180.45, 349897, 0.663551, -0.326637] ---- -Label : 1 -Position : [1127.43, 1045.54] -Measurements : [1517.45, 179369, 0.137356, -0.868399] ---- -Label : 1 -Position : [982.624, 1045.68] -Measurements : [1229.86, 235079, 0.368175, -1.04298] ---- -Label : 1 -Position : [909.126, 1045.73] -Measurements : [1056.16, 263460, 0.519544, -1.18938] ---- -Label : 1 -Position : [134.316, 1045.82] -Measurements : [1433.67, 392368, 0.120719, -1.12437] ---- -Label : 1 -Position : [803.169, 1045.88] -Measurements : [1528.5, 261624, 0.239072, 0.147247] ---- -Label : 1 -Position : [871.946, 1045.89] -Measurements : [1121.3, 183930, 0.051699, -0.663256] ---- -Label : 1 -Position : [1126.84, 1045.91] -Measurements : [1542.98, 183047, 0.00208728, -0.749214] ---- -Label : 1 -Position : [937.331, 1046] -Measurements : [842.393, 271272, 1.59062, 1.84349] ---- -Label : 1 -Position : [1007.36, 1046.25] -Measurements : [1027.95, 126471, 0.395127, 0.0841846] ---- -Label : 1 -Position : [129.758, 1046.26] -Measurements : [835.443, 191020, 0.735665, -0.829876] ---- -Label : 1 -Position : [1050.22, 1046.32] -Measurements : [1166.11, 280870, 0.366481, -0.873089] ---- -Label : 1 -Position : [977.763, 1046.59] -Measurements : [1381.23, 416021, 0.00481041, -1.44734] ---- -Label : 1 -Position : [1051.71, 1046.62] -Measurements : [1128.98, 271536, 0.485715, -0.689879] ---- -Label : 1 -Position : [617.04, 1046.74] -Measurements : [1071.1, 491430, 1.08382, -0.103324] ---- -Label : 1 -Position : [317.32, 1047.15] -Measurements : [1051.57, 119132, 1.19844, 2.23283] ---- -Label : 1 -Position : [1079.83, 1047.45] -Measurements : [1709.19, 330201, -0.498402, -0.741726] ---- -Label : 1 -Position : [316.186, 1047.52] -Measurements : [1088.32, 93810.7, 1.79004, 3.65468] ---- -Label : 1 -Position : [1003.52, 1047.54] -Measurements : [1304.44, 198918, 0.956867, 0.606773] ---- -Label : 1 -Position : [615.033, 1047.83] -Measurements : [1035.56, 387285, 1.27463, 0.513677] ---- -Label : 1 -Position : [1256.13, 1048.14] -Measurements : [1293.1, 506495, 0.514867, -0.861389] ---- -Label : 1 -Position : [870.214, 1048.59] -Measurements : [1022.73, 216333, 0.219913, -0.987739] ---- -Label : 1 -Position : [1008.35, 1048.69] -Measurements : [957.903, 178701, 0.957115, 1.44583] ---- -Label : 1 -Position : [1046.83, 1049.01] -Measurements : [1520.06, 183308, -0.391479, -0.4481] ---- -Label : 1 -Position : [1079.76, 1049.24] -Measurements : [1565.78, 348606, -0.172452, -1.18587] ---- -Label : 1 -Position : [925.042, 1049.38] -Measurements : [987.199, 173607, 0.761037, -0.00246961] ---- -Label : 1 -Position : [997.141, 1049.77] -Measurements : [1508.23, 214924, 0.0442669, -0.34706] ---- -Label : 1 -Position : [1121.95, 1050.21] -Measurements : [1586.91, 392851, -0.360307, -0.806532] ---- -Label : 1 -Position : [910.547, 1050.22] -Measurements : [1105.9, 189706, 0.586327, -0.596418] ---- -Label : 1 -Position : [318.88, 1050.3] -Measurements : [952.444, 145415, 1.00934, 1.53209] ---- -Label : 1 -Position : [975.208, 1050.47] -Measurements : [1533.34, 656235, 0.105515, -1.41531] ---- -Label : 1 -Position : [798.224, 1050.5] -Measurements : [1153.53, 233636, 0.770138, -0.127555] ---- -Label : 0 -Position : [258.748, 1050.65] -Measurements : [1095.94, 8304.45, -0.799745, 0.674058] ---- -Label : 1 -Position : [803.218, 1050.67] -Measurements : [1384.5, 329222, 0.187012, -1.15357] ---- -Label : 1 -Position : [797.255, 1050.72] -Measurements : [1074.87, 174195, 0.767915, -0.0886368] ---- -Label : 1 -Position : [1121.3, 1050.76] -Measurements : [1586.91, 392851, -0.360307, -0.806532] ---- -Label : 1 -Position : [801.53, 1051.21] -Measurements : [1281.85, 334847, 0.510889, -0.923391] ---- -Label : 1 -Position : [1048.99, 1051.23] -Measurements : [1639.05, 160186, -0.186034, -0.907807] ---- -Label : 1 -Position : [1075.2, 1051.23] -Measurements : [1777.11, 225173, -0.42666, -0.343258] ---- -Label : 1 -Position : [1125.61, 1051.23] -Measurements : [1680.33, 256829, 0.313642, -0.747994] ---- -Label : 0 -Position : [288.453, 1051.36] -Measurements : [1109.3, 5293.05, -0.468844, -0.386417] ---- -Label : 1 -Position : [998.609, 1051.64] -Measurements : [1716.58, 219349, -0.309246, 0.065714] ---- -Label : 1 -Position : [115.87, 1051.99] -Measurements : [799.408, 133161, 0.768401, -0.92898] ---- -Label : 1 -Position : [610.417, 1052.16] -Measurements : [1142.33, 363484, 0.792953, -0.683519] ---- -Label : 1 -Position : [930.143, 1052.23] -Measurements : [1134.03, 277817, 0.422687, -1.06236] ---- -Label : 1 -Position : [906.668, 1052.28] -Measurements : [1341.53, 402028, 0.576998, -0.385132] ---- -Label : 1 -Position : [111.592, 1052.47] -Measurements : [1077.79, 205038, 0.550374, -0.120052] ---- -Label : 1 -Position : [1076.54, 1052.6] -Measurements : [1719.44, 267034, -0.481618, -0.39879] ---- -Label : 1 -Position : [928.127, 1052.67] -Measurements : [1100.97, 257146, 0.569195, -0.773579] ---- -Label : 1 -Position : [846.177, 1052.84] -Measurements : [964.73, 380438, 0.969626, -0.105411] ---- -Label : 1 -Position : [974.442, 1052.87] -Measurements : [1697.81, 604654, -0.248171, -1.27509] ---- -Label : 1 -Position : [865.223, 1052.9] -Measurements : [732.874, 61694.9, 0.568375, -0.298471] ---- -Label : 1 -Position : [1256.8, 1052.9] -Measurements : [1059.92, 589559, 0.929202, -0.525249] ---- -Label : 1 -Position : [972.573, 1053.33] -Measurements : [1837.58, 448769, -0.418098, -0.807762] ---- -Label : 1 -Position : [905.387, 1053.35] -Measurements : [1505.94, 495612, 0.458989, -0.72498] ---- -Label : 1 -Position : [972.479, 1053.35] -Measurements : [1837.58, 448769, -0.418098, -0.807762] ---- -Label : 1 -Position : [1070.35, 1053.57] -Measurements : [1412.66, 299370, 0.0755788, -1.06022] ---- -Label : 1 -Position : [1001.8, 1053.9] -Measurements : [1623.29, 318967, -0.107101, -0.908495] ---- -Label : 1 -Position : [1046.03, 1053.96] -Measurements : [1738.85, 193868, -0.540937, -0.185425] ---- -Label : 1 -Position : [929.796, 1054.1] -Measurements : [1217.79, 261489, 0.358849, -1.12273] ---- -Label : 1 -Position : [337.332, 1054.88] -Measurements : [850.507, 324075, 1.46102, 1.45049] ---- -Label : 1 -Position : [844.012, 1055] -Measurements : [1419.14, 510664, 0.266561, -1.12152] ---- -Label : 1 -Position : [105.448, 1055.03] -Measurements : [1094.18, 181039, 1.02743, 0.853446] ---- -Label : 1 -Position : [1127.23, 1055.08] -Measurements : [1594.68, 350975, 0.602476, -1.09504] ---- -Label : 1 -Position : [106.684, 1055.2] -Measurements : [1111.09, 176408, 0.994577, 0.791618] ---- -Label : 1 -Position : [1117.07, 1055.26] -Measurements : [1654.44, 484840, -0.658031, -0.876579] ---- -Label : 1 -Position : [1072.75, 1055.33] -Measurements : [1546.28, 313498, -0.0150045, -0.962835] ---- -Label : 1 -Position : [611.919, 1055.36] -Measurements : [1528.36, 490826, 0.133547, -1.3979] ---- -Label : 1 -Position : [850.808, 1055.79] -Measurements : [1153.16, 505734, 1.02158, -0.149594] ---- -Label : 1 -Position : [1049, 1055.81] -Measurements : [1702.35, 225970, -0.417514, -0.487913] ---- -Label : 0 -Position : [289.116, 1055.85] -Measurements : [1135.28, 5788.38, -0.00519308, -0.0597098] ---- -Label : 1 -Position : [1046.3, 1055.85] -Measurements : [1659.61, 300955, -0.571582, -0.577136] ---- -Label : 1 -Position : [997.856, 1055.89] -Measurements : [1727.6, 268656, -0.353362, -0.680182] ---- -Label : 1 -Position : [1048.17, 1056.15] -Measurements : [1632.04, 305645, -0.488434, -0.701371] ---- -Label : 1 -Position : [1068.69, 1056.52] -Measurements : [1336.91, 292278, 0.0955927, -1.21503] ---- -Label : 1 -Position : [997.79, 1056.56] -Measurements : [1748.74, 289518, -0.449271, -0.697178] ---- -Label : 1 -Position : [105.819, 1056.7] -Measurements : [1066.3, 142990, 1.07015, 1.20709] ---- -Label : 1 -Position : [98.792, 1057.08] -Measurements : [802.419, 177501, 1.07965, 0.648146] ---- -Label : 1 -Position : [904.654, 1057.1] -Measurements : [2022.07, 438824, -0.296728, -1.06199] ---- -Label : 1 -Position : [101.372, 1057.14] -Measurements : [974.655, 130285, 0.97067, 0.635444] ---- -Label : 1 -Position : [906.668, 1057.19] -Measurements : [1966.3, 443170, -0.0517302, -1.31557] ---- -Label : 1 -Position : [976.976, 1057.22] -Measurements : [1785.62, 347067, 0.0505175, -0.760573] ---- -Label : 1 -Position : [911.113, 1057.25] -Measurements : [1420.77, 441843, 1.32058, 0.458534] ---- -Label : 1 -Position : [926.929, 1057.38] -Measurements : [1042.01, 234798, 0.758304, -0.471581] ---- -Label : 1 -Position : [973.214, 1057.38] -Measurements : [2010.68, 228552, -0.293219, -0.0684569] ---- -Label : 1 -Position : [1121.93, 1057.38] -Measurements : [2000.37, 242978, -0.753109, -0.0060464] ---- -Label : 1 -Position : [339.872, 1057.47] -Measurements : [1148.04, 340716, 1.04136, 0.425993] ---- -Label : 1 -Position : [868.985, 1057.6] -Measurements : [784.432, 182482, 1.81052, 2.81234] ---- -Label : 1 -Position : [102.221, 1057.61] -Measurements : [1025.33, 125675, 0.91573, 0.506751] ---- -Label : 1 -Position : [841.688, 1057.8] -Measurements : [1294.57, 649347, 0.262355, -1.28919] ---- -Label : 1 -Position : [1126.57, 1057.87] -Measurements : [1595.36, 347265, 0.588473, -1.04231] ---- -Label : 1 -Position : [607.171, 1057.95] -Measurements : [1565.33, 337078, 0.124421, -0.827565] ---- -Label : 1 -Position : [868.796, 1058.07] -Measurements : [845.924, 203528, 1.6002, 1.73355] ---- -Label : 1 -Position : [993.941, 1058.13] -Measurements : [1508.46, 327185, 0.0190726, -1.05082] ---- -Label : 1 -Position : [924.641, 1058.15] -Measurements : [925.107, 153068, 1.08353, 0.886399] ---- -Label : 0 -Position : [207.424, 1058.21] -Measurements : [962.915, 7884.55, 0.396345, 0.364765] ---- -Label : 1 -Position : [340.703, 1058.28] -Measurements : [1207.9, 284350, 1.29453, 0.898262] ---- -Label : 1 -Position : [1069.29, 1058.31] -Measurements : [1519.54, 322567, -0.203577, -1.13118] ---- -Label : 1 -Position : [846.059, 1058.41] -Measurements : [1712.39, 476106, -0.0555056, -1.10709] ---- -Label : 1 -Position : [905.675, 1058.44] -Measurements : [2100.28, 379834, -0.342308, -1.08011] ---- -Label : 1 -Position : [800.302, 1058.58] -Measurements : [1219.53, 356753, 0.833432, -0.54805] ---- -Label : 1 -Position : [846.996, 1058.58] -Measurements : [1712.39, 476106, -0.0555056, -1.10709] ---- -Label : 1 -Position : [1121.44, 1058.67] -Measurements : [1911.98, 346773, -0.678545, -0.581628] ---- -Label : 1 -Position : [103.624, 1059.05] -Measurements : [994.706, 129850, 1.05942, 0.690652] ---- -Label : 1 -Position : [606.321, 1059.12] -Measurements : [1773.98, 283211, 0.150544, -0.804767] ---- -Label : 1 -Position : [996.486, 1059.13] -Measurements : [1671.17, 282950, -0.0334571, -0.997012] ---- -Label : 1 -Position : [968.705, 1059.56] -Measurements : [1725.68, 370500, -0.532943, -0.693264] ---- -Label : 1 -Position : [1119.06, 1059.83] -Measurements : [1708.38, 483007, -0.4506, -1.11343] ---- -Label : 1 -Position : [866.25, 1059.97] -Measurements : [867.421, 177349, 1.68383, 2.31091] ---- -Label : 1 -Position : [804.462, 1059.99] -Measurements : [1359.06, 438861, 0.542758, -1.20987] ---- -Label : 1 -Position : [999.118, 1060.01] -Measurements : [1454.32, 434362, 0.182151, -1.27538] ---- -Label : 1 -Position : [924.319, 1060.19] -Measurements : [970.069, 166881, 0.714521, -0.267998] ---- -Label : 1 -Position : [1071.11, 1060.24] -Measurements : [1524.65, 352321, -0.203653, -1.27576] ---- -Label : 1 -Position : [863.633, 1060.45] -Measurements : [780.231, 91256.6, 2.29349, 7.20465] ---- -Label : 1 -Position : [1069.23, 1060.56] -Measurements : [1477.95, 387995, -0.225492, -1.27019] ---- -Label : 1 -Position : [921.279, 1060.58] -Measurements : [885.65, 105641, 0.800119, 0.599259] ---- -Label : 1 -Position : [312.71, 1060.64] -Measurements : [1365.12, 221263, 0.879898, -0.505644] ---- -Label : 1 -Position : [849.731, 1060.8] -Measurements : [1515.81, 526526, 0.576047, -1.1026] ---- -Label : 1 -Position : [866.118, 1060.88] -Measurements : [864.166, 178458, 1.68781, 2.29674] ---- -Label : 1 -Position : [995.332, 1061.06] -Measurements : [1497.22, 291500, 0.422557, -0.754634] ---- -Label : 1 -Position : [903.559, 1061.06] -Measurements : [2125.98, 400561, -0.77346, -0.27881] ---- -Label : 1 -Position : [319.267, 1061.85] -Measurements : [971.91, 434783, 0.907669, -0.7131] ---- -Label : 1 -Position : [605.555, 1061.85] -Measurements : [1930.81, 240604, 0.0233634, -0.761725] ---- -Label : 1 -Position : [314.784, 1062.08] -Measurements : [1351.44, 315591, 0.322096, -1.01958] ---- -Label : 1 -Position : [799.932, 1062.09] -Measurements : [1679.64, 467193, 0.090277, -1.34986] ---- -Label : 1 -Position : [1119.52, 1062.16] -Measurements : [1320.5, 535895, 0.262037, -1.4792] ---- -Label : 0 -Position : [264.919, 1062.22] -Measurements : [947.521, 9754.69, -2.22606, 6.17138] ---- -Label : 1 -Position : [845.358, 1062.26] -Measurements : [1857.4, 361084, -0.216791, -0.73041] ---- -Label : 1 -Position : [610.995, 1062.44] -Measurements : [1566.65, 553475, 0.164027, -1.41697] ---- -Label : 1 -Position : [971.166, 1063.11] -Measurements : [1648.51, 277050, -0.0587585, -0.892408] ---- -Label : 1 -Position : [903.391, 1063.34] -Measurements : [2034.85, 437816, -0.604398, -0.73877] ---- -Label : 1 -Position : [1259.12, 1063.4] -Measurements : [1408, 480784, 0.0517758, -0.955122] ---- -Label : 1 -Position : [869.884, 1063.41] -Measurements : [859.995, 206160, 1.54423, 1.43863] ---- -Label : 1 -Position : [600.996, 1063.63] -Measurements : [1561.85, 299040, -0.108586, -0.62191] ---- -Label : 1 -Position : [792.851, 1063.67] -Measurements : [1300.18, 343930, 0.587613, -0.640732] ---- -Label : 1 -Position : [905.344, 1063.86] -Measurements : [1980.23, 477944, -0.338716, -1.22766] ---- -Label : 1 -Position : [866.677, 1064.28] -Measurements : [925.403, 225097, 1.11015, 0.174159] ---- -Label : 1 -Position : [925.29, 1064.75] -Measurements : [1024.01, 258943, 0.593828, -0.984644] ---- -Label : 1 -Position : [796.615, 1065.13] -Measurements : [1758.95, 279434, 0.159316, -0.738881] ---- -Label : 1 -Position : [845.523, 1065.26] -Measurements : [1644.56, 338287, 0.065939, -0.726038] ---- -Label : 1 -Position : [1260.22, 1065.34] -Measurements : [1726.87, 382837, 0.238911, -0.796858] ---- -Label : 1 -Position : [966.954, 1065.73] -Measurements : [1330.81, 283578, 0.341488, -0.602699] ---- -Label : 1 -Position : [1116.6, 1065.83] -Measurements : [1212.69, 517389, 0.32524, -1.53127] ---- -Label : 1 -Position : [994.103, 1065.98] -Measurements : [1482.39, 234906, 0.460918, -0.489004] ---- -Label : 0 -Position : [231.642, 1066.08] -Measurements : [848.298, 35588, 0.140787, -0.506194] ---- -Label : 1 -Position : [1264.43, 1066.37] -Measurements : [1894.16, 431908, -0.152023, -1.14118] ---- -Label : 1 -Position : [992.488, 1066.51] -Measurements : [1469.24, 246718, 0.326009, -0.548977] ---- -Label : 1 -Position : [902.572, 1066.62] -Measurements : [1937.24, 395620, -0.648701, -0.727676] ---- -Label : 1 -Position : [842.49, 1066.77] -Measurements : [1637.13, 347456, -0.126214, -0.368328] ---- -Label : 0 -Position : [289.664, 1066.88] -Measurements : [1471.52, 60326.6, 0.474587, -1.09782] ---- -Label : 1 -Position : [602.315, 1067] -Measurements : [1699.82, 300423, -0.113697, -0.517193] ---- -Label : 1 -Position : [998.833, 1067.04] -Measurements : [1295.64, 399196, 0.467405, -0.87565] ---- -Label : 1 -Position : [1068.52, 1067.27] -Measurements : [1026.09, 352227, 0.795086, -0.529614] ---- -Label : 1 -Position : [335.48, 1067.6] -Measurements : [1001.06, 223427, 0.538648, -0.846757] ---- -Label : 1 -Position : [898.804, 1067.67] -Measurements : [1749.79, 509874, -0.613197, -0.866149] ---- -Label : 1 -Position : [844.011, 1067.84] -Measurements : [1588.18, 319056, 0.176613, -0.452007] ---- -Label : 1 -Position : [968.298, 1068.02] -Measurements : [1186.48, 319544, 0.971109, 0.500699] ---- -Label : 1 -Position : [794.383, 1068.1] -Measurements : [1531.21, 369563, -0.146678, -0.79932] ---- -Label : 1 -Position : [862.431, 1068.25] -Measurements : [1164.19, 327143, 0.40999, -0.918946] ---- -Label : 1 -Position : [790.878, 1068.61] -Measurements : [1062.67, 268315, 0.437988, -0.950832] ---- -Label : 0 -Position : [180.523, 1068.69] -Measurements : [1071.55, 18919.2, 0.469124, -0.0707115] ---- -Label : 1 -Position : [844.631, 1068.79] -Measurements : [1465.66, 323926, 0.0957246, -0.738181] ---- -Label : 1 -Position : [600.989, 1069.08] -Measurements : [1365.89, 411326, 0.227273, -1.10557] ---- -Label : 1 -Position : [995.106, 1069.22] -Measurements : [1603.19, 308413, 0.183582, -1.20052] ---- -Label : 1 -Position : [860.674, 1069.33] -Measurements : [1285.42, 343648, 0.320842, -0.878393] ---- -Label : 1 -Position : [600.586, 1069.36] -Measurements : [1365.89, 411326, 0.227273, -1.10557] ---- -Label : 0 -Position : [276.915, 1069.5] -Measurements : [1030.63, 44566, -1.1906, 0.792699] ---- -Label : 1 -Position : [1116.19, 1069.66] -Measurements : [1524.84, 521870, -0.300372, -1.50815] ---- -Label : 1 -Position : [332.784, 1069.77] -Measurements : [857.081, 262337, 0.870197, -0.727657] ---- -Label : 1 -Position : [900.114, 1069.89] -Measurements : [1881.1, 263231, -0.563128, -0.26125] ---- -Label : 1 -Position : [794.567, 1070.05] -Measurements : [1281.75, 396428, 0.132021, -1.19865] ---- -Label : 1 -Position : [922.189, 1070.08] -Measurements : [1289, 453605, 0.249878, -1.479] ---- -Label : 1 -Position : [1112.63, 1070.3] -Measurements : [1687.14, 348641, -0.606228, -0.744031] ---- -Label : 1 -Position : [1114.23, 1070.35] -Measurements : [1746.72, 349510, -0.801723, -0.467484] ---- -Label : 1 -Position : [1114.58, 1070.41] -Measurements : [1746.72, 349510, -0.801723, -0.467484] ---- -Label : 1 -Position : [896.297, 1070.56] -Measurements : [1574.03, 471911, -0.441687, -1.05252] ---- -Label : 1 -Position : [843.719, 1070.87] -Measurements : [1229.55, 349929, 0.214774, -1.21616] ---- -Label : 1 -Position : [1040.39, 1070.89] -Measurements : [1013.16, 322562, 0.523158, -0.729431] ---- -Label : 1 -Position : [1066.19, 1070.89] -Measurements : [931.271, 200962, 0.558388, -1.13704] ---- -Label : 1 -Position : [967.427, 1071.23] -Measurements : [941.259, 131265, -0.0610348, -1.39455] ---- -Label : 1 -Position : [842.918, 1071.57] -Measurements : [1110.06, 378066, 0.457115, -1.1367] ---- -Label : 1 -Position : [338.822, 1071.67] -Measurements : [1018.08, 119680, 1.3749, 0.611555] ---- -Label : 1 -Position : [1253.36, 1071.74] -Measurements : [1539.84, 421758, -0.0912068, -1.44408] ---- -Label : 1 -Position : [1068.76, 1071.76] -Measurements : [830.833, 161066, 0.85298, -0.748251] ---- -Label : 1 -Position : [596.732, 1072.26] -Measurements : [1088.59, 238493, 0.256296, -1.36753] ---- -Label : 1 -Position : [970.785, 1072.27] -Measurements : [894.876, 123202, 0.502103, -0.646614] ---- -Label : 1 -Position : [994.922, 1072.53] -Measurements : [1782.24, 231276, -0.343096, -0.735451] ---- -Label : 1 -Position : [895.714, 1072.61] -Measurements : [1489.41, 469906, -0.35282, -1.16363] ---- -Label : 1 -Position : [866.36, 1072.77] -Measurements : [1229.22, 471682, 0.455838, -1.23022] ---- -Label : 1 -Position : [916.774, 1072.95] -Measurements : [1281.79, 415539, 0.486748, -1.14991] ---- -Label : 0 -Position : [286.474, 1073.27] -Measurements : [1494.5, 107251, 0.528237, -1.1887] ---- -Label : 1 -Position : [921.604, 1073.35] -Measurements : [1560.31, 507638, -0.086204, -1.25262] ---- -Label : 1 -Position : [960.695, 1073.5] -Measurements : [857.156, 267104, 0.795523, -0.712916] ---- -Label : 1 -Position : [842.382, 1073.51] -Measurements : [901.878, 272405, 0.770158, -0.837331] ---- -Label : 1 -Position : [861.612, 1073.58] -Measurements : [1770.69, 275464, -0.415215, -0.684394] ---- -Label : 1 -Position : [1257.74, 1073.64] -Measurements : [1933.22, 374694, -0.434486, -0.630972] ---- -Label : 1 -Position : [899.759, 1073.76] -Measurements : [1838.89, 257462, -0.325163, -0.402379] ---- -Label : 1 -Position : [1044.41, 1073.9] -Measurements : [1175.24, 465016, 0.940931, 0.0780993] ---- -Label : 1 -Position : [600.686, 1074.13] -Measurements : [1241.33, 275759, 0.0843598, -1.2792] ---- -Label : 1 -Position : [991.703, 1074.41] -Measurements : [1747.47, 203351, -0.254667, -0.48618] ---- -Label : 1 -Position : [1113.74, 1074.58] -Measurements : [1940.71, 182133, -1.0065, 0.714931] ---- -Label : 1 -Position : [792.051, 1074.67] -Measurements : [715.469, 228424, 1.44681, 0.596601] ---- -Label : 1 -Position : [899.295, 1074.81] -Measurements : [1835.52, 268824, -0.262589, -0.454564] ---- -Label : 1 -Position : [599.746, 1074.88] -Measurements : [1220.5, 269013, 0.0416882, -1.30075] ---- -Label : 1 -Position : [1038.78, 1075.17] -Measurements : [1631.37, 426967, 0.0229473, -0.664653] ---- -Label : 1 -Position : [966.322, 1075.34] -Measurements : [1158.12, 439663, 0.487083, -1.21011] ---- -Label : 1 -Position : [1037.3, 1075.37] -Measurements : [1547.85, 496089, 0.0398388, -0.83847] ---- -Label : 1 -Position : [1042.74, 1075.57] -Measurements : [1506.97, 438894, 0.491883, -0.674477] ---- -Label : 1 -Position : [1256.57, 1075.64] -Measurements : [1985.18, 305919, -0.749865, -0.148024] ---- -Label : 1 -Position : [315.651, 1075.87] -Measurements : [596.397, 101244, 2.07012, 3.22618] ---- -Label : 1 -Position : [77.8, 1076.02] -Measurements : [1929.62, 458453, -0.111483, -1.18215] ---- -Label : 1 -Position : [896.631, 1076.25] -Measurements : [1699.78, 271108, -0.550469, 0.140458] ---- -Label : 1 -Position : [916.334, 1076.8] -Measurements : [1403.13, 391279, 0.346963, -1.17856] ---- -Label : 1 -Position : [894.636, 1076.99] -Measurements : [1412.66, 425870, -0.290103, -1.1361] ---- -Label : 1 -Position : [965.431, 1077.04] -Measurements : [1439.73, 533332, -0.0946199, -1.43516] ---- -Label : 1 -Position : [993.069, 1077.31] -Measurements : [1643.59, 327515, -0.463382, -0.770623] ---- -Label : 1 -Position : [310.904, 1077.33] -Measurements : [927.341, 162883, 0.594919, -0.649925] ---- -Label : 1 -Position : [77.286, 1077.38] -Measurements : [1945.15, 439803, -0.099796, -1.20879] ---- -Label : 1 -Position : [333.001, 1077.42] -Measurements : [1039.98, 270648, 0.813768, -0.396275] ---- -Label : 1 -Position : [991.236, 1077.45] -Measurements : [1650.33, 249390, -0.382364, -0.559288] ---- -Label : 1 -Position : [987.44, 1077.69] -Measurements : [1573.01, 233269, -0.163239, -0.518413] ---- -Label : 1 -Position : [73.2249, 1077.84] -Measurements : [1438.74, 626886, 0.307536, -1.11043] ---- -Label : 1 -Position : [920.375, 1077.86] -Measurements : [1738.94, 342593, -0.0267431, -0.827248] ---- -Label : 1 -Position : [1039.16, 1077.86] -Measurements : [1547.48, 514159, 0.0941747, -1.05196] ---- -Label : 1 -Position : [920.966, 1077.86] -Measurements : [1738.94, 342593, -0.0267431, -0.827248] ---- -Label : 1 -Position : [599.358, 1077.96] -Measurements : [966.224, 232590, 0.643817, -1.08672] ---- -Label : 0 -Position : [214.447, 1078.07] -Measurements : [721.977, 29834.3, -0.0459263, -1.38373] ---- -Label : 1 -Position : [311.36, 1078.2] -Measurements : [866.952, 197828, 0.939155, -0.265792] ---- -Label : 1 -Position : [967.904, 1078.26] -Measurements : [1397.09, 541304, 0.181655, -1.38845] ---- -Label : 1 -Position : [860.383, 1078.49] -Measurements : [1567.44, 521605, -0.154939, -1.54392] ---- -Label : 1 -Position : [861.111, 1078.54] -Measurements : [1595.14, 513244, -0.210322, -1.52303] ---- -Label : 1 -Position : [894.835, 1078.89] -Measurements : [1437.07, 431862, -0.355293, -1.14035] ---- -Label : 1 -Position : [896.018, 1078.9] -Measurements : [1690.76, 263301, -0.484804, -0.0525624] ---- -Label : 1 -Position : [1257.2, 1078.93] -Measurements : [2076.1, 359988, -0.501825, -0.368702] ---- -Label : 1 -Position : [840.602, 1079.54] -Measurements : [755.837, 189173, 1.54833, 1.52975] ---- -Label : 1 -Position : [920.037, 1079.92] -Measurements : [1582.08, 431210, 0.214176, -1.04835] ---- -Label : 1 -Position : [331.896, 1080.4] -Measurements : [1079.64, 292382, 0.545597, -0.813138] ---- -Label : 1 -Position : [837.166, 1080.7] -Measurements : [869.584, 259128, 1.00008, -0.32103] ---- -Label : 1 -Position : [917.098, 1080.72] -Measurements : [1234.31, 458614, 0.707147, -0.681752] ---- -Label : 1 -Position : [858.3, 1081.12] -Measurements : [1244.4, 442540, 0.652034, -0.968102] ---- -Label : 1 -Position : [1111.28, 1081.13] -Measurements : [1994.06, 277345, -0.218568, -0.189735] ---- -Label : 1 -Position : [857.654, 1081.17] -Measurements : [1188.35, 401978, 0.80195, -0.655809] ---- -Label : 1 -Position : [987.55, 1081.54] -Measurements : [1686.29, 203534, -0.465899, -0.140304] ---- -Label : 1 -Position : [920.487, 1082.01] -Measurements : [1183.15, 471970, 1.06077, 0.191637] ---- -Label : 0 -Position : [257.478, 1082.03] -Measurements : [1124.28, 24691.8, -0.74802, 1.9546] ---- -Label : 1 -Position : [1258.56, 1082.25] -Measurements : [1682.68, 660515, 0.225929, -1.26408] ---- -Label : 1 -Position : [987.201, 1082.33] -Measurements : [1754.46, 190202, -0.0437528, -0.751095] ---- -Label : 1 -Position : [1114.23, 1082.56] -Measurements : [1754.38, 495281, -0.0284473, -1.2201] ---- -Label : 1 -Position : [990.889, 1082.89] -Measurements : [1656.11, 317262, -0.523784, -0.681794] ---- -Label : 1 -Position : [896.428, 1083] -Measurements : [1336.07, 490480, 0.171446, -1.22902] ---- -Label : 1 -Position : [963.383, 1083.18] -Measurements : [2234.85, 198235, -0.567996, 0.269718] ---- -Label : 1 -Position : [894.069, 1083.46] -Measurements : [1033.45, 480487, 0.688529, -0.967521] ---- -Label : 1 -Position : [900.901, 1083.68] -Measurements : [1317.95, 372376, 0.568797, -0.575312] ---- -Label : 1 -Position : [1254.56, 1083.89] -Measurements : [1192.77, 386288, 0.857423, -0.620612] ---- -Label : 1 -Position : [331.163, 1084.4] -Measurements : [1143.3, 249384, 0.579623, -0.684709] ---- -Label : 1 -Position : [967.159, 1084.82] -Measurements : [1895.45, 510439, -0.0225459, -1.42963] ---- -Label : 1 -Position : [963.393, 1084.97] -Measurements : [2306.45, 209188, -0.657404, 0.575012] ---- -Label : 1 -Position : [1110.05, 1085.23] -Measurements : [1925.52, 361631, -0.28424, -0.484604] ---- -Label : 1 -Position : [839.129, 1085.34] -Measurements : [863.717, 179706, 1.10735, 0.620948] ---- -Label : 1 -Position : [1115.81, 1085.36] -Measurements : [1520.48, 515730, 0.589413, -1.0736] ---- -Label : 0 -Position : [219.044, 1085.89] -Measurements : [1206.72, 30036.2, -0.773169, -0.764504] ---- -Label : 1 -Position : [1105.82, 1085.89] -Measurements : [1409.69, 559898, 0.0741824, -1.21507] ---- -Label : 1 -Position : [858.335, 1086.28] -Measurements : [1309.72, 398950, 0.703431, -0.444962] ---- -Label : 1 -Position : [914.356, 1086.63] -Measurements : [1140.36, 355302, 0.590514, -0.980791] ---- -Label : 1 -Position : [1111.94, 1086.98] -Measurements : [1880.54, 396975, -0.210773, -0.79487] ---- -Label : 1 -Position : [310.231, 1087.07] -Measurements : [1009.42, 515162, 1.00145, -0.545091] ---- -Label : 1 -Position : [1105, 1087.36] -Measurements : [1260.09, 549398, 0.27972, -1.21554] ---- -Label : 1 -Position : [307.832, 1087.57] -Measurements : [1279.73, 432804, 0.57088, -0.97877] ---- -Label : 1 -Position : [989.188, 1087.69] -Measurements : [1723.64, 349520, -0.349601, -0.572529] ---- -Label : 1 -Position : [962.154, 1088.1] -Measurements : [2283.52, 271865, -0.59973, -0.166411] ---- -Label : 0 -Position : [192.306, 1088.22] -Measurements : [928.518, 48296.5, 0.110534, -0.0699811] ---- -Label : 1 -Position : [1027.18, 1088.36] -Measurements : [775.299, 246501, 0.794162, -0.850706] ---- -Label : 1 -Position : [856.069, 1088.57] -Measurements : [1638.53, 389914, 0.132686, -0.915477] ---- -Label : 1 -Position : [913.822, 1089.32] -Measurements : [1025.2, 385520, 0.833213, -0.806066] ---- -Label : 1 -Position : [994.122, 1089.91] -Measurements : [1095.31, 549862, 0.982881, -0.422543] ---- -Label : 1 -Position : [988.788, 1089.99] -Measurements : [1689.6, 319573, -0.0963518, -0.663632] ---- -Label : 1 -Position : [309.636, 1090.01] -Measurements : [1036.69, 511944, 1.00362, -0.492388] ---- -Label : 1 -Position : [957.325, 1090.26] -Measurements : [1818.3, 586214, -0.51928, -0.803871] ---- -Label : 1 -Position : [861.099, 1090.5] -Measurements : [1317.37, 630893, 0.594882, -1.03761] ---- -Label : 1 -Position : [856.483, 1090.61] -Measurements : [1793.77, 390805, -0.0429731, -0.853561] ---- -Label : 1 -Position : [1032.9, 1090.67] -Measurements : [900.749, 498700, 1.15203, -0.130886] ---- -Label : 1 -Position : [3.83146, 1091.01] -Measurements : [1331.57, 196835, 1.24546, 0.672271] ---- -Label : 1 -Position : [1028.51, 1091.37] -Measurements : [1172.9, 513420, 0.428752, -1.01562] ---- -Label : 1 -Position : [1108.41, 1091.37] -Measurements : [1351.51, 535827, 0.399753, -0.853249] ---- -Label : 0 -Position : [142.98, 1091.38] -Measurements : [1070, 9078.42, -0.88087, 0.923298] ---- -Label : 1 -Position : [856.697, 1091.6] -Measurements : [1807.37, 393397, -0.0973794, -0.900549] ---- -Label : 1 -Position : [985.092, 1091.78] -Measurements : [1734.76, 265564, -0.221991, -0.595334] ---- -Label : 1 -Position : [607.864, 1091.89] -Measurements : [880.579, 542044, 0.951025, -0.64557] ---- -Label : 1 -Position : [1262.18, 1091.98] -Measurements : [548.588, 93782.4, 1.38609, 1.61379] ---- -Label : 1 -Position : [1055.57, 1092.17] -Measurements : [1272.1, 344471, 0.139039, -1.47984] ---- -Label : 1 -Position : [991.827, 1092.28] -Measurements : [1418.46, 580540, 0.232185, -1.37755] ---- -Label : 1 -Position : [964.894, 1093.12] -Measurements : [1877.96, 578463, 0.104338, -1.51049] ---- -Label : 1 -Position : [960.106, 1093.42] -Measurements : [2092.33, 391258, -0.450804, -0.445903] ---- -Label : 1 -Position : [916.242, 1093.78] -Measurements : [1121.09, 348810, 0.533025, -1.0389] ---- -Label : 1 -Position : [854.581, 1093.88] -Measurements : [1592.07, 604030, 0.00240911, -1.34817] ---- -Label : 1 -Position : [958.886, 1094.17] -Measurements : [2009.72, 343332, -0.533888, -0.0558652] ---- -Label : 1 -Position : [892.169, 1094.2] -Measurements : [1186.33, 351057, 0.134356, -1.35697] ---- -Label : 1 -Position : [985.902, 1094.38] -Measurements : [1843.62, 222345, -0.128628, -0.414821] ---- -Label : 0 -Position : [259.044, 1094.82] -Measurements : [753.567, 68497.3, 0.272122, -1.48026] ---- -Label : 1 -Position : [853.83, 1094.88] -Measurements : [1409.6, 714758, 0.297433, -1.47687] ---- -Label : 1 -Position : [1269.54, 1094.96] -Measurements : [976.922, 240002, 0.417818, -0.905896] ---- -Label : 1 -Position : [7.656, 1094.97] -Measurements : [1485.79, 395766, 0.0283435, -1.18202] ---- -Label : 1 -Position : [855.503, 1095.08] -Measurements : [1441.48, 743631, 0.256967, -1.49925] ---- -Label : 1 -Position : [1107.51, 1095.19] -Measurements : [814.851, 377390, 1.44917, 0.534495] ---- -Label : 1 -Position : [888.779, 1095.35] -Measurements : [1335.52, 308509, -0.323976, -1.03263] ---- -Label : 1 -Position : [1267.17, 1095.35] -Measurements : [967.295, 218363, 0.461424, -0.676289] ---- -Label : 1 -Position : [613.408, 1095.48] -Measurements : [1703.96, 613294, -0.213562, -1.43754] ---- -Label : 1 -Position : [1058.41, 1095.88] -Measurements : [1524.43, 347279, -0.191113, -1.3013] ---- -Label : 0 -Position : [96.7612, 1096.08] -Measurements : [1269.01, 17415.6, 0.752649, 1.23866] ---- -Label : 1 -Position : [986.304, 1096.55] -Measurements : [1694.49, 375471, -0.272519, -0.83505] ---- -Label : 1 -Position : [609.918, 1096.6] -Measurements : [1610.28, 542468, -0.270672, -1.13973] ---- -Label : 0 -Position : [247.757, 1096.94] -Measurements : [1293.76, 71110.3, 0.607419, -0.764484] ---- -Label : 1 -Position : [327, 1097] -Measurements : [784.893, 157105, 1.30623, 1.11276] ---- -Label : 1 -Position : [1030.27, 1097.32] -Measurements : [1681.5, 376593, -0.320268, -1.04321] ---- -Label : 1 -Position : [984.682, 1097.52] -Measurements : [1761.07, 329786, -0.474931, -0.382438] ---- -Label : 1 -Position : [6.47254, 1097.54] -Measurements : [1484.49, 401640, 0.00481478, -1.20688] ---- -Label : 1 -Position : [326.734, 1097.57] -Measurements : [750.509, 165709, 1.39889, 1.17512] ---- -Label : 1 -Position : [912.622, 1097.71] -Measurements : [1143.47, 359919, 0.249579, -1.42336] ---- -Label : 1 -Position : [889.055, 1097.74] -Measurements : [1456.72, 196778, -0.348067, -0.47207] ---- -Label : 1 -Position : [303.904, 1097.82] -Measurements : [1087.77, 189526, 0.66936, -0.24755] ---- -Label : 0 -Position : [253.41, 1098.11] -Measurements : [895.033, 67286.7, -0.435044, -1.11304] ---- -Label : 1 -Position : [956.83, 1098.34] -Measurements : [1539.5, 616414, 0.00355931, -1.40037] ---- -Label : 0 -Position : [168.583, 1098.67] -Measurements : [752.491, 43880, 0.0205883, -1.39981] ---- -Label : 1 -Position : [985.723, 1098.98] -Measurements : [1657.69, 404132, -0.281057, -0.918316] ---- -Label : 1 -Position : [913.822, 1099.15] -Measurements : [1163.75, 338017, 0.246734, -1.38487] ---- -Label : 0 -Position : [270.11, 1099.24] -Measurements : [1096.86, 10493.4, 0.281709, 0.572445] ---- -Label : 1 -Position : [858.791, 1099.45] -Measurements : [787.524, 428708, 2.04554, 3.10989] ---- -Label : 1 -Position : [1060.11, 1099.56] -Measurements : [1514.94, 429286, -0.074932, -1.28052] ---- -Label : 0 -Position : [134.613, 1099.81] -Measurements : [973.458, 6331.39, -0.52856, -0.335983] ---- -Label : 1 -Position : [917.793, 1100.11] -Measurements : [1094.8, 299121, 0.518578, -1.10227] ---- -Label : 1 -Position : [890.983, 1100.11] -Measurements : [1400.35, 161844, 0.074681, -0.84253] ---- -Label : 1 -Position : [1359.6, 1100.5] -Measurements : [1774.64, 377057, -0.788745, -0.456058] ---- -Label : 1 -Position : [309.43, 1100.51] -Measurements : [559.242, 82491, 2.59435, 6.89053] ---- -Label : 1 -Position : [975.45, 1100.52] -Measurements : [1073.3, 233622, 0.609561, -0.584929] ---- -Label : 1 -Position : [324.58, 1100.56] -Measurements : [537.909, 48414.5, 2.28277, 5.78213] ---- -Label : 1 -Position : [978.538, 1100.79] -Measurements : [1282.55, 392357, 0.334611, -0.943155] ---- -Label : 1 -Position : [1029.74, 1100.79] -Measurements : [1784.61, 332989, -0.481679, -0.8367] ---- -Label : 1 -Position : [1055.13, 1100.79] -Measurements : [1793.87, 165248, -0.0695641, -0.163157] ---- -Label : 1 -Position : [958.643, 1101.01] -Measurements : [1300.85, 551935, 0.485265, -1.15511] ---- -Label : 1 -Position : [1374.05, 1101.19] -Measurements : [1659.42, 357622, -0.350888, -0.380255] ---- -Label : 1 -Position : [304.76, 1101.39] -Measurements : [1006.51, 251423, 0.519497, -1.10284] ---- -Label : 1 -Position : [887.826, 1101.43] -Measurements : [1458.54, 187384, -0.414354, -0.208829] ---- -Label : 1 -Position : [1366.24, 1101.9] -Measurements : [1712.72, 299374, -0.212772, -0.633687] ---- -Label : 1 -Position : [974.083, 1101.96] -Measurements : [959.43, 184929, 0.758253, -0.131308] ---- -Label : 1 -Position : [1370.64, 1101.99] -Measurements : [1396.58, 248339, -0.316641, -0.334658] ---- -Label : 1 -Position : [1058.75, 1102.49] -Measurements : [1628.46, 302853, -0.188964, -0.753754] ---- -Label : 1 -Position : [1.57639, 1102.61] -Measurements : [1601.33, 289616, -0.219549, -0.721911] ---- -Label : 1 -Position : [1351.91, 1102.71] -Measurements : [1484.21, 352827, -0.0893716, -0.946487] ---- -Label : 1 -Position : [1374.8, 1102.88] -Measurements : [1738.75, 288032, -0.372391, -0.0228555] ---- -Label : 1 -Position : [953.439, 1103.15] -Measurements : [984.832, 346054, 0.856744, -0.588939] ---- -Label : 0 -Position : [160.971, 1103.19] -Measurements : [724.351, 44779.5, -0.059758, -1.40541] ---- -Label : 0 -Position : [207.841, 1103.28] -Measurements : [1796.71, 54799.9, -0.671429, -0.369486] ---- -Label : 0 -Position : [108.015, 1103.47] -Measurements : [1269.7, 112492, 1.16842, 0.816407] ---- -Label : 0 -Position : [107.22, 1103.59] -Measurements : [1285.44, 109878, 1.12114, 0.730062] ---- -Label : 1 -Position : [1026.96, 1103.87] -Measurements : [1777.23, 320502, -0.294373, -0.329193] ---- -Label : 1 -Position : [890.33, 1104.27] -Measurements : [1299.04, 187758, 0.438932, -0.610869] ---- -Label : 1 -Position : [1362.6, 1104.36] -Measurements : [1950.16, 219665, -0.46113, -0.819057] ---- -Label : 1 -Position : [1383.49, 1104.36] -Measurements : [1244.92, 331576, 1.1062, 0.490336] ---- -Label : 1 -Position : [1382.66, 1104.39] -Measurements : [1401.5, 352386, 0.886507, -0.481211] ---- -Label : 1 -Position : [1354.91, 1104.62] -Measurements : [1682.52, 273612, -0.373785, -0.51851] ---- -Label : 1 -Position : [1059.7, 1104.76] -Measurements : [1350.82, 406200, 0.37374, -1.02033] ---- -Label : 1 -Position : [1368.34, 1104.77] -Measurements : [1691.7, 200827, 0.368456, -0.26652] ---- -Label : 1 -Position : [1023.87, 1104.96] -Measurements : [1458, 389818, -0.209666, -0.829614] ---- -Label : 1 -Position : [1025.89, 1105.49] -Measurements : [1756.79, 279987, -0.117236, -0.0488144] ---- -Label : 1 -Position : [8.95123, 1105.63] -Measurements : [1303.79, 454884, 0.291148, -1.36364] ---- -Label : 1 -Position : [1358.7, 1105.7] -Measurements : [2031.7, 158278, -0.423964, -0.477682] ---- -Label : 1 -Position : [5.096, 1105.72] -Measurements : [1570.48, 340261, -0.103748, -1.17403] ---- -Label : 1 -Position : [906.602, 1105.98] -Measurements : [964.055, 268656, 0.725827, -0.919944] ---- -Label : 1 -Position : [1376.12, 1106] -Measurements : [1828.25, 224641, -0.0527603, -0.740408] ---- -Label : 1 -Position : [1027.23, 1106.06] -Measurements : [1864.37, 211691, 0.211352, -0.57113] ---- -Label : 1 -Position : [1054.68, 1106.47] -Measurements : [1572.47, 307838, -0.072663, -0.763482] ---- -Label : 1 -Position : [1343.89, 1106.63] -Measurements : [981.832, 344030, 0.488675, -1.10683] ---- -Label : 1 -Position : [1347.04, 1106.82] -Measurements : [1366.16, 267692, -0.259933, -0.695874] ---- -Label : 1 -Position : [1101.96, 1107.06] -Measurements : [693.533, 246960, 1.72661, 1.89091] ---- -Label : 1 -Position : [1297.39, 1107.21] -Measurements : [1697.71, 187214, -0.204008, -0.379521] ---- -Label : 1 -Position : [1366.5, 1107.48] -Measurements : [1897.71, 183652, 0.0371842, -1.19696] ---- -Label : 1 -Position : [1280.99, 1107.58] -Measurements : [1486.57, 370590, -0.40729, -0.873565] ---- -Label : 1 -Position : [956.079, 1107.69] -Measurements : [1066.09, 285122, 0.601048, -0.64029] ---- -Label : 1 -Position : [1388.23, 1107.98] -Measurements : [735.539, 93974.7, 0.727868, -1.10259] ---- -Label : 1 -Position : [1286.68, 1108] -Measurements : [1931.54, 412761, -0.216404, -1.05659] ---- -Label : 1 -Position : [1278.63, 1108.05] -Measurements : [1336.12, 378464, -0.312573, -1.35284] ---- -Label : 1 -Position : [1354, 1108.05] -Measurements : [1738.64, 198563, -0.142728, -0.353238] ---- -Label : 1 -Position : [1045.38, 1108.09] -Measurements : [1177.11, 274813, 0.64846, -0.664975] ---- -Label : 1 -Position : [1286.83, 1108.46] -Measurements : [1931.06, 413266, -0.226095, -1.04297] ---- -Label : 1 -Position : [1053.66, 1108.46] -Measurements : [1422.39, 325971, 0.100455, -1.05721] ---- -Label : 1 -Position : [1104.34, 1108.46] -Measurements : [575.281, 57501.1, 1.22683, 1.04365] ---- -Label : 1 -Position : [946.603, 1108.5] -Measurements : [782.057, 193687, 1.07718, 0.646128] ---- -Label : 1 -Position : [1054.17, 1108.78] -Measurements : [1383.63, 338687, 0.129883, -1.06391] ---- -Label : 1 -Position : [1333.11, 1108.87] -Measurements : [1033.58, 287961, 0.39674, -1.13897] ---- -Label : 1 -Position : [10.8959, 1108.96] -Measurements : [1170.48, 463215, 0.493087, -1.38174] ---- -Label : 1 -Position : [1028.03, 1108.97] -Measurements : [1773.71, 216997, 0.405007, -0.17] ---- -Label : 1 -Position : [1052.52, 1109.13] -Measurements : [1367.04, 357078, 0.155066, -1.24615] ---- -Label : 1 -Position : [956.372, 1109.34] -Measurements : [1172.45, 242434, 0.337028, -0.490947] ---- -Label : 1 -Position : [1289.57, 1109.87] -Measurements : [1979.6, 404496, -0.406364, -0.864684] ---- -Label : 1 -Position : [978.567, 1109.96] -Measurements : [1150.55, 377732, 0.396928, -1.21534] ---- -Label : 1 -Position : [911.574, 1110.01] -Measurements : [845.849, 213549, 1.41013, 0.460357] ---- -Label : 1 -Position : [908.039, 1110.16] -Measurements : [945.205, 241040, 0.875315, -0.74] ---- -Label : 1 -Position : [1049.76, 1110.16] -Measurements : [1329.51, 413382, 0.208955, -1.4339] ---- -Label : 1 -Position : [1101.37, 1110.57] -Measurements : [995.652, 389863, 0.814415, -0.643937] ---- -Label : 1 -Position : [1324.85, 1110.69] -Measurements : [884.812, 314874, 1.11923, -0.151081] ---- -Label : 1 -Position : [1337.67, 1110.81] -Measurements : [957.856, 354605, 0.610579, -1.23341] ---- -Label : 1 -Position : [7.656, 1110.84] -Measurements : [1562, 411152, -0.244827, -1.25374] ---- -Label : 1 -Position : [978.49, 1110.98] -Measurements : [1232.67, 377358, 0.163689, -1.34218] ---- -Label : 1 -Position : [612.892, 1111.5] -Measurements : [864.653, 307860, 0.687751, -1.14504] ---- -Label : 1 -Position : [1096.4, 1111.57] -Measurements : [1354.82, 395499, 0.0452553, -1.24968] ---- -Label : 1 -Position : [951.457, 1111.8] -Measurements : [1278.37, 129893, 0.122527, 0.827308] ---- -Label : 1 -Position : [1025.59, 1111.8] -Measurements : [1434.87, 383222, 0.206401, -0.280155] ---- -Label : 1 -Position : [1307.06, 1112.04] -Measurements : [1687.16, 264750, 0.130994, -1.141] ---- -Label : 1 -Position : [2.80576, 1112.05] -Measurements : [1442.89, 286329, 0.0951319, -1.16083] ---- -Label : 1 -Position : [1293.79, 1112.15] -Measurements : [1753.35, 306211, -0.230339, -0.333576] ---- -Label : 1 -Position : [1280.12, 1112.24] -Measurements : [1545.92, 294644, -0.352696, -0.902354] ---- -Label : 1 -Position : [618.399, 1112.39] -Measurements : [1400.61, 378591, -0.269551, -1.18181] ---- -Label : 1 -Position : [1328.58, 1112.93] -Measurements : [796.678, 196306, 1.02998, -0.154111] ---- -Label : 1 -Position : [617.7, 1113.39] -Measurements : [1425.42, 362603, -0.337889, -1.06499] ---- -Label : 0 -Position : [130.119, 1113.8] -Measurements : [984.168, 59335, 0.30838, -1.12156] ---- -Label : 1 -Position : [8.58797, 1113.86] -Measurements : [1536.36, 404599, -0.164655, -1.29883] ---- -Label : 1 -Position : [956.635, 1113.88] -Measurements : [1268.47, 153921, 0.618902, -0.11014] ---- -Label : 1 -Position : [984.364, 1114.12] -Measurements : [1046.4, 337437, 0.667562, -0.749976] ---- -Label : 0 -Position : [248.516, 1114.17] -Measurements : [1113.12, 11579.1, -1.39855, 3.19304] ---- -Label : 1 -Position : [1101.55, 1114.5] -Measurements : [1282.52, 374272, 0.506245, -0.888592] ---- -Label : 1 -Position : [1320.41, 1114.6] -Measurements : [1032.15, 270371, 0.861253, -0.49313] ---- -Label : 1 -Position : [948.112, 1114.65] -Measurements : [1270.24, 179928, -0.104498, -0.519677] ---- -Label : 1 -Position : [891.655, 1114.67] -Measurements : [1530.64, 390562, -0.0528693, -1.10978] ---- -Label : 1 -Position : [1295.07, 1114.68] -Measurements : [1653.16, 179768, -0.267496, -0.691445] ---- -Label : 1 -Position : [1302.8, 1115.01] -Measurements : [1648.35, 236677, -0.464077, -1.00253] ---- -Label : 1 -Position : [1098.09, 1115.08] -Measurements : [1475.44, 305910, 0.0457305, -0.926588] ---- -Label : 1 -Position : [1302.74, 1115.3] -Measurements : [1648.35, 236677, -0.464077, -1.00253] ---- -Label : 1 -Position : [296.146, 1115.3] -Measurements : [1233.36, 173292, 0.214674, -0.832506] ---- -Label : 0 -Position : [260.476, 1115.4] -Measurements : [823.993, 24804.4, -0.332099, -0.353432] ---- -Label : 1 -Position : [894.226, 1115.45] -Measurements : [1443.88, 406293, 0.214301, -1.19304] ---- -Label : 1 -Position : [320.12, 1115.73] -Measurements : [1070.28, 292634, 0.670746, -0.554849] ---- -Label : 1 -Position : [1302.22, 1115.74] -Measurements : [1648.35, 236677, -0.464077, -1.00253] ---- -Label : 1 -Position : [974.292, 1115.86] -Measurements : [1336.8, 240706, -0.242379, -0.928976] ---- -Label : 1 -Position : [1310.58, 1116.24] -Measurements : [1252.35, 204340, 0.579078, -0.194194] ---- -Label : 1 -Position : [1024.84, 1116.43] -Measurements : [925.682, 275505, 0.602451, -1.18428] ---- -Label : 1 -Position : [953.459, 1116.57] -Measurements : [1343.78, 154165, 0.183803, -0.887349] ---- -Label : 1 -Position : [1315.21, 1116.59] -Measurements : [1089.48, 148798, 0.326079, -0.771989] ---- -Label : 1 -Position : [621.295, 1116.65] -Measurements : [1077.61, 392418, 0.611573, -1.22381] ---- -Label : 1 -Position : [950.638, 1116.71] -Measurements : [1398.97, 142219, -0.0764231, -0.526] ---- -Label : 1 -Position : [297.592, 1116.75] -Measurements : [1148.73, 207589, 0.288315, -1.13186] ---- -Label : 1 -Position : [7.144, 1116.98] -Measurements : [1672.28, 250227, -0.613578, -0.382394] ---- -Label : 1 -Position : [1315.69, 1117.06] -Measurements : [1052.25, 128330, 0.30612, -0.789024] ---- -Label : 1 -Position : [322.204, 1117.2] -Measurements : [1072.93, 231534, 1.07337, 0.251528] ---- -Label : 1 -Position : [976.936, 1117.26] -Measurements : [1466.07, 232995, 0.150008, -0.445359] ---- -Label : 1 -Position : [980.538, 1117.53] -Measurements : [1380.98, 200485, 0.198664, -0.4273] ---- -Label : 1 -Position : [318.379, 1117.76] -Measurements : [922.922, 330255, 0.989479, -0.28201] ---- -Label : 1 -Position : [293.031, 1118.43] -Measurements : [1183.39, 110523, 0.586584, -0.21553] ---- -Label : 1 -Position : [896.518, 1118.63] -Measurements : [1135.73, 502124, 0.773855, -0.946832] ---- -Label : 0 -Position : [162.013, 1118.89] -Measurements : [1046.11, 3723.81, -0.18434, -0.555536] ---- -Label : 1 -Position : [947.969, 1119.13] -Measurements : [1296.02, 313995, -0.281319, -1.34654] ---- -Label : 1 -Position : [1040.98, 1119.33] -Measurements : [817.424, 132441, 0.391018, -0.924471] ---- -Label : 0 -Position : [107.701, 1119.51] -Measurements : [1004.92, 15855.4, -0.504019, 1.26513] ---- -Label : 1 -Position : [617.7, 1119.53] -Measurements : [1110.42, 314501, 0.461469, -1.24448] ---- -Label : 1 -Position : [954.222, 1119.68] -Measurements : [1350.9, 197683, 0.187335, -1.30852] ---- -Label : 1 -Position : [979.157, 1120.44] -Measurements : [1218.54, 187873, 0.34507, 0.00234448] ---- -Label : 1 -Position : [1022.52, 1120.46] -Measurements : [1025.14, 321899, 0.33598, -1.43068] ---- -Label : 1 -Position : [1095.19, 1120.64] -Measurements : [1535.75, 232272, -0.142176, -0.500953] ---- -Label : 1 -Position : [1097.72, 1120.92] -Measurements : [1554.26, 258599, 0.0481866, -0.942775] ---- -Label : 0 -Position : [224.089, 1120.93] -Measurements : [1030.74, 2676.05, -2.31253, 8.00231] ---- -Label : 1 -Position : [1019.45, 1121.22] -Measurements : [1185.69, 358416, -0.0286825, -1.36273] ---- -Label : 1 -Position : [1095.64, 1121.22] -Measurements : [1529.92, 191916, -0.126115, -0.578863] ---- -Label : 1 -Position : [6.71789, 1121.62] -Measurements : [1591.16, 264087, -0.287199, -1.10858] ---- -Label : 1 -Position : [949.825, 1121.73] -Measurements : [1363.53, 299022, -0.430466, -1.25047] ---- -Label : 1 -Position : [1021.64, 1122.08] -Measurements : [1250.54, 324483, -0.13649, -1.24278] ---- -Label : 0 -Position : [230.059, 1122.35] -Measurements : [929.305, 11586.8, -0.75956, -0.103885] ---- -Label : 1 -Position : [974.394, 1123.27] -Measurements : [1524.68, 369930, 0.49282, -0.548381] ---- -Label : 1 -Position : [1044.44, 1123.27] -Measurements : [1032.55, 276660, -0.0447536, -1.51575] ---- -Label : 1 -Position : [1022.65, 1123.3] -Measurements : [1290.52, 294234, -0.0652611, -1.0898] ---- -Label : 1 -Position : [968.949, 1123.43] -Measurements : [1471.81, 415163, 0.457305, -0.784827] ---- -Label : 1 -Position : [624.191, 1124] -Measurements : [890.2, 244990, 1.03644, -0.172235] ---- -Label : 1 -Position : [621.857, 1124.07] -Measurements : [696.259, 94737.2, 2.18233, 5.84234] ---- -Label : 1 -Position : [949.818, 1124.09] -Measurements : [1065.72, 362022, 0.449653, -1.43843] ---- -Label : 1 -Position : [631.038, 1124.12] -Measurements : [1591.81, 319505, -0.41229, -0.844146] ---- -Label : 1 -Position : [9.704, 1124.15] -Measurements : [1231.3, 422557, 0.200027, -1.68301] ---- -Label : 0 -Position : [157.119, 1124.41] -Measurements : [1056.4, 38740.7, 0.247114, 1.08397] ---- -Label : 1 -Position : [626.302, 1124.45] -Measurements : [1135.07, 375979, 0.387306, -1.30277] ---- -Label : 1 -Position : [1018.56, 1124.71] -Measurements : [1454.8, 237028, -0.350559, -0.532075] ---- -Label : 1 -Position : [1018.22, 1124.91] -Measurements : [1454.8, 237028, -0.350559, -0.532075] ---- -Label : 1 -Position : [978.837, 1125.23] -Measurements : [1029.9, 317605, 1.10817, 0.583133] ---- -Label : 1 -Position : [1091.56, 1125.33] -Measurements : [1160.73, 394681, 0.120183, -1.66112] ---- -Label : 1 -Position : [10.8516, 1125.62] -Measurements : [1072.72, 420117, 0.609403, -1.38314] ---- -Label : 1 -Position : [1094, 1125.73] -Measurements : [1281.12, 329526, -0.17595, -1.51126] ---- -Label : 1 -Position : [1047.27, 1125.95] -Measurements : [1123.06, 295589, 0.135125, -1.40774] ---- -Label : 1 -Position : [744.838, 1126.11] -Measurements : [1022.72, 313192, 0.0629765, -1.35426] ---- -Label : 1 -Position : [969.889, 1126.14] -Measurements : [1628.39, 366728, 0.126048, -0.745168] ---- -Label : 1 -Position : [295.032, 1126.48] -Measurements : [1047.8, 249877, 0.483722, -1.19177] ---- -Label : 1 -Position : [291.874, 1126.57] -Measurements : [1226.69, 138531, 0.392667, -0.314183] ---- -Label : 1 -Position : [292.404, 1126.67] -Measurements : [1184.46, 174180, 0.208548, -0.657442] ---- -Label : 1 -Position : [969.433, 1126.79] -Measurements : [1628.39, 366728, 0.126048, -0.745168] ---- -Label : 0 -Position : [151.959, 1126.84] -Measurements : [1303.66, 157811, 0.0185304, -1.25052] ---- -Label : 0 -Position : [120.577, 1127.36] -Measurements : [928.118, 13857.8, -1.64526, 1.98989] ---- -Label : 1 -Position : [1039.26, 1127.91] -Measurements : [1241.12, 142161, -0.0150767, -0.759667] ---- -Label : 1 -Position : [5.30779, 1128.1] -Measurements : [944.431, 304391, 1.04353, -0.335558] ---- -Label : 1 -Position : [1044.95, 1128.21] -Measurements : [1454.37, 136002, -0.408306, -0.050401] ---- -Label : 1 -Position : [311.796, 1128.43] -Measurements : [516.136, 43139.8, 1.83871, 2.18098] ---- -Label : 1 -Position : [746.724, 1128.54] -Measurements : [1272.59, 222451, -0.216323, -0.631394] ---- -Label : 0 -Position : [100.428, 1128.93] -Measurements : [969.132, 17879.2, -1.87672, 3.23088] ---- -Label : 1 -Position : [629.988, 1128.95] -Measurements : [1700.89, 271813, -0.587899, -0.553474] ---- -Label : 1 -Position : [1086.68, 1129] -Measurements : [787.301, 243765, 0.993342, -0.472551] ---- -Label : 1 -Position : [317.693, 1129] -Measurements : [683.774, 58613.4, 0.188041, -0.887551] ---- -Label : 1 -Position : [971.558, 1129.4] -Measurements : [1583.45, 291772, 0.569015, -0.192093] ---- -Label : 1 -Position : [969.959, 1129.88] -Measurements : [1568.55, 315171, 0.451701, -0.295612] ---- -Label : 1 -Position : [1093.55, 1130.14] -Measurements : [1096.95, 319763, 0.296364, -1.56766] ---- -Label : 0 -Position : [159.72, 1130.31] -Measurements : [1085.67, 24078.9, -1.41563, 0.937455] ---- -Label : 1 -Position : [632.224, 1130.54] -Measurements : [1875.29, 224853, -0.527495, -0.187398] ---- -Label : 1 -Position : [36.0026, 1130.6] -Measurements : [1136.47, 392664, 0.141498, -1.26417] ---- -Label : 1 -Position : [1042.8, 1130.64] -Measurements : [1521.63, 124932, -0.389979, -0.22042] ---- -Label : 1 -Position : [758.59, 1130.77] -Measurements : [1512.8, 209622, -0.204781, -0.762893] ---- -Label : 1 -Position : [744.207, 1130.96] -Measurements : [1195.6, 321731, -0.103009, -1.15426] ---- -Label : 1 -Position : [972.346, 1131.46] -Measurements : [1481.66, 277398, 0.499083, 0.146027] ---- -Label : 1 -Position : [1091.02, 1131.51] -Measurements : [1122.69, 319490, 0.114157, -1.64666] ---- -Label : 0 -Position : [205.482, 1131.59] -Measurements : [1024.32, 12456.4, -2.56799, 8.61018] ---- -Label : 1 -Position : [43.844, 1131.87] -Measurements : [1165.39, 284950, 0.863729, -0.753485] ---- -Label : 1 -Position : [39.4, 1131.9] -Measurements : [1323.52, 251333, 0.317063, -1.07014] ---- -Label : 1 -Position : [314.488, 1132.62] -Measurements : [766.555, 98758.9, 0.502569, -0.347876] ---- -Label : 1 -Position : [755.735, 1132.64] -Measurements : [1504.91, 199923, 0.0839969, -1.0132] ---- -Label : 1 -Position : [631.11, 1133.04] -Measurements : [1912.48, 211997, -0.537191, -0.172032] ---- -Label : 1 -Position : [1013.17, 1133.05] -Measurements : [894.744, 184817, 0.300538, -1.50086] ---- -Label : 1 -Position : [1091.54, 1133.92] -Measurements : [1186.44, 283275, -0.077929, -1.60438] ---- -Label : 1 -Position : [636.554, 1134.26] -Measurements : [1660.44, 458292, -0.295868, -1.13566] ---- -Label : 1 -Position : [763.518, 1134.28] -Measurements : [1230.6, 175525, 0.292462, -0.451196] ---- -Label : 1 -Position : [632.855, 1134.69] -Measurements : [1893.81, 243747, -0.403782, -0.526413] ---- -Label : 0 -Position : [138.906, 1135.02] -Measurements : [853.322, 12556.1, -1.76641, 2.77119] ---- -Label : 0 -Position : [200.477, 1135.77] -Measurements : [828.799, 54698.7, -0.23034, -1.74816] ---- -Label : 0 -Position : [108.981, 1135.89] -Measurements : [983.519, 5901.38, 0.460685, -1.0713] ---- -Label : 1 -Position : [1041.57, 1135.97] -Measurements : [1251.27, 327451, -0.15749, -1.4196] ---- -Label : 1 -Position : [627.992, 1135.99] -Measurements : [1501.21, 319429, 0.354041, -1.01453] ---- -Label : 1 -Position : [291.948, 1136.01] -Measurements : [932.205, 216500, 0.937441, 0.266747] ---- -Label : 1 -Position : [1014.94, 1136.38] -Measurements : [1153.14, 210896, -0.307712, -1.17327] ---- -Label : 1 -Position : [751.069, 1136.78] -Measurements : [1308.03, 278297, 0.186299, -1.09681] ---- -Label : 1 -Position : [653.314, 1136.83] -Measurements : [1675.46, 782722, -0.111543, -1.20664] ---- -Label : 1 -Position : [964.966, 1136.94] -Measurements : [896.149, 238106, 0.953832, -0.326273] ---- -Label : 0 -Position : [132.735, 1137.13] -Measurements : [872.972, 4561.19, -0.534553, -0.715854] ---- -Label : 1 -Position : [969.07, 1137.19] -Measurements : [1169.75, 268077, 0.0518946, -1.35931] ---- -Label : 1 -Position : [756.638, 1137.43] -Measurements : [1260.57, 167288, 0.543398, -0.0136713] ---- -Label : 0 -Position : [141.091, 1137.53] -Measurements : [1042.07, 130453, 0.966673, -0.26523] ---- -Label : 1 -Position : [636.132, 1137.97] -Measurements : [1670.41, 480113, -0.268542, -1.1685] ---- -Label : 1 -Position : [1042.9, 1138.02] -Measurements : [1005.13, 312595, 0.562031, -1.28514] ---- -Label : 1 -Position : [289.4, 1138.26] -Measurements : [1010.6, 192603, 0.756089, 0.267923] ---- -Label : 1 -Position : [634.692, 1138.36] -Measurements : [1785.04, 378250, -0.29383, -1.0051] ---- -Label : 1 -Position : [637.73, 1138.36] -Measurements : [1490.32, 572827, -0.012165, -1.43545] ---- -Label : 1 -Position : [767.328, 1138.98] -Measurements : [714.19, 180572, 1.65842, 1.85807] ---- -Label : 1 -Position : [1087.85, 1139.65] -Measurements : [1557.74, 150628, -0.833591, 0.385313] ---- -Label : 1 -Position : [1044.49, 1139.7] -Measurements : [926.791, 294133, 0.952724, -0.73062] ---- -Label : 1 -Position : [286.235, 1139.74] -Measurements : [1169.68, 114625, 0.984141, 1.90722] ---- -Label : 1 -Position : [1092.81, 1139.97] -Measurements : [1459.3, 216384, -0.329166, -1.1956] ---- -Label : 0 -Position : [228.639, 1140.23] -Measurements : [1232.22, 46859.2, 0.371178, -1.35799] ---- -Label : 1 -Position : [1017.97, 1140.42] -Measurements : [1381.77, 200423, -0.277902, -0.420345] ---- -Label : 1 -Position : [651.697, 1140.42] -Measurements : [1749.46, 814711, -0.220851, -1.42414] ---- -Label : 0 -Position : [156.826, 1140.82] -Measurements : [1283.51, 161811, 0.675848, -0.56946] ---- -Label : 1 -Position : [1013.54, 1141.32] -Measurements : [1565.07, 120026, -0.53445, 1.17169] ---- -Label : 1 -Position : [647.501, 1141.55] -Measurements : [1495.26, 867369, 0.101414, -1.50972] ---- -Label : 1 -Position : [1014.54, 1141.7] -Measurements : [1576.32, 107979, -0.135096, 0.499446] ---- -Label : 1 -Position : [721.202, 1141.72] -Measurements : [956.677, 196307, 0.142456, -0.763618] ---- -Label : 1 -Position : [964.79, 1141.74] -Measurements : [625.868, 172911, 2.54853, 5.27219] ---- -Label : 0 -Position : [169.854, 1141.85] -Measurements : [1308.13, 58658.9, 0.526328, -0.868855] ---- -Label : 0 -Position : [171.863, 1141.92] -Measurements : [1435.59, 59089.7, 0.149777, -1.40351] ---- -Label : 1 -Position : [1088.57, 1142.41] -Measurements : [1621.93, 137380, -0.648513, -0.0471067] ---- -Label : 0 -Position : [129.945, 1142.46] -Measurements : [919.733, 933.24, -0.472886, 0.434218] ---- -Label : 1 -Position : [1009.14, 1143.37] -Measurements : [1468.03, 216957, -0.476265, -0.181204] ---- -Label : 0 -Position : [240.962, 1143.41] -Measurements : [843.451, 43046.5, -0.0668802, -1.1608] ---- -Label : 1 -Position : [1088.97, 1143.47] -Measurements : [1593.35, 153600, -0.526202, -0.464171] ---- -Label : 1 -Position : [1012.99, 1144.63] -Measurements : [1660.72, 121411, -0.0882883, -0.218307] ---- -Label : 0 -Position : [126.5, 1144.64] -Measurements : [918.687, 3970.85, -0.876945, 3.51086] ---- -Label : 1 -Position : [6.632, 1144.7] -Measurements : [2221.2, 349450, -0.814199, 0.21863] ---- -Label : 1 -Position : [720.51, 1144.93] -Measurements : [1024.62, 192598, -0.0422643, -0.732742] ---- -Label : 1 -Position : [1038.29, 1145.39] -Measurements : [1146.85, 292515, 0.493896, -0.273585] ---- -Label : 0 -Position : [136.404, 1145.43] -Measurements : [905.554, 1004.83, 0.788542, -0.0894318] ---- -Label : 1 -Position : [1010.03, 1145.8] -Measurements : [1591.95, 179658, -0.444554, 0.0879009] ---- -Label : 1 -Position : [1085.4, 1145.8] -Measurements : [1588.85, 150307, -0.56307, -0.154259] ---- -Label : 1 -Position : [722.799, 1146] -Measurements : [1136.63, 106376, 0.292177, 0.284196] ---- -Label : 1 -Position : [287.199, 1146.22] -Measurements : [1101.02, 247833, 0.400411, -1.08682] ---- -Label : 1 -Position : [1088.31, 1146.43] -Measurements : [1467.95, 222410, -0.324458, -1.12877] ---- -Label : 1 -Position : [1041.03, 1146.46] -Measurements : [1114.59, 438922, 0.88341, -0.170194] ---- -Label : 0 -Position : [165.737, 1146.89] -Measurements : [1149.03, 11686.3, 0.378348, -0.73669] ---- -Label : 1 -Position : [3.14686, 1147.61] -Measurements : [2315.14, 211255, -0.643725, 0.380212] ---- -Label : 1 -Position : [1006.06, 1147.66] -Measurements : [1407.08, 273096, -0.286826, -0.823738] ---- -Label : 1 -Position : [5.76968, 1147.75] -Measurements : [2361.71, 192047, -0.574013, 0.0944329] ---- -Label : 0 -Position : [95.8535, 1148.89] -Measurements : [1043.14, 4039.13, 0.34265, -0.976442] ---- -Label : 1 -Position : [286.84, 1149.01] -Measurements : [1117.53, 249389, 0.324471, -1.20021] ---- -Label : 1 -Position : [1086.57, 1149.1] -Measurements : [1433.75, 258862, -0.295462, -1.1583] ---- -Label : 1 -Position : [314.043, 1149.17] -Measurements : [826.213, 111604, 2.41388, 5.83775] ---- -Label : 0 -Position : [192.486, 1149.6] -Measurements : [1209.73, 54018, 0.352959, -1.42971] ---- -Label : 1 -Position : [1003.13, 1149.7] -Measurements : [1219.37, 389379, 0.0325397, -1.45289] ---- -Label : 1 -Position : [1034.21, 1149.78] -Measurements : [1454.99, 245800, 0.853194, 0.595] ---- -Label : 1 -Position : [1035.42, 1149.89] -Measurements : [1502.71, 269280, 0.806998, 0.273687] ---- -Label : 1 -Position : [309.224, 1150.05] -Measurements : [953.735, 197743, 1.02165, 0.178332] ---- -Label : 0 -Position : [230.115, 1150.06] -Measurements : [1163.99, 13498.4, 0.267976, 0.623753] ---- -Label : 1 -Position : [1007.35, 1150.61] -Measurements : [1595.08, 253254, -0.341438, -0.521532] ---- -Label : 1 -Position : [1084.17, 1150.71] -Measurements : [1475.29, 253947, -0.285451, -1.11393] ---- -Label : 0 -Position : [220.38, 1150.72] -Measurements : [1406.21, 45677.3, -0.887135, -0.654873] ---- -Label : 1 -Position : [6.64686, 1150.84] -Measurements : [2067.21, 313072, -0.488555, -0.721966] ---- -Label : 1 -Position : [774.755, 1151.02] -Measurements : [905.172, 304152, 0.737353, -0.883288] ---- -Label : 0 -Position : [91.127, 1151.09] -Measurements : [1173.03, 21051.2, 1.37188, 2.70561] ---- -Label : 1 -Position : [6.12, 1151.35] -Measurements : [1990.35, 281745, -0.410493, -0.84822] ---- -Label : 1 -Position : [1037.28, 1151.55] -Measurements : [1595.3, 336847, 0.242418, -0.754099] ---- -Label : 0 -Position : [227.787, 1151.76] -Measurements : [1181.88, 21940.6, 0.713167, 0.331678] ---- -Label : 1 -Position : [666.065, 1151.78] -Measurements : [1255.1, 705566, 0.311059, -1.2594] ---- -Label : 1 -Position : [1080.88, 1152.84] -Measurements : [1460.67, 278986, -0.15895, -0.692329] ---- -Label : 1 -Position : [1110.92, 1152.98] -Measurements : [1654.6, 296910, 0.40103, -1.11604] ---- -Label : 1 -Position : [1007.16, 1153.17] -Measurements : [1409.85, 367620, 0.140601, -1.3886] ---- -Label : 0 -Position : [229.56, 1153.27] -Measurements : [1206.73, 15553.6, -0.114988, 1.07142] ---- -Label : 1 -Position : [1037.59, 1153.44] -Measurements : [1598.85, 354198, 0.19774, -0.92183] ---- -Label : 1 -Position : [288.516, 1153.69] -Measurements : [772.077, 259186, 1.52119, 0.813144] ---- -Label : 1 -Position : [776.225, 1153.75] -Measurements : [1026.53, 339644, 0.545387, -1.15853] ---- -Label : 1 -Position : [2.78325, 1153.99] -Measurements : [1864.55, 216033, -0.0864642, -1.06612] ---- -Label : 1 -Position : [1087.3, 1154.25] -Measurements : [1103.6, 225363, 0.64597, -0.747493] ---- -Label : 1 -Position : [1110.26, 1154.52] -Measurements : [1739.89, 238706, 0.335358, -0.886881] ---- -Label : 0 -Position : [174.137, 1154.67] -Measurements : [1427.73, 47665.8, -0.630245, 0.509506] ---- -Label : 0 -Position : [145.05, 1154.7] -Measurements : [1221.8, 217789, 0.157037, -1.34233] ---- -Label : 1 -Position : [308.506, 1154.71] -Measurements : [940.75, 113844, 0.931214, 0.922325] ---- -Label : 0 -Position : [146.191, 1154.85] -Measurements : [1310.59, 242056, -0.125762, -1.39595] ---- -Label : 0 -Position : [102.193, 1155.2] -Measurements : [1118.24, 13183, 2.62639, 11.1511] ---- -Label : 1 -Position : [666.852, 1155.58] -Measurements : [1504.53, 639924, 0.0798386, -1.17231] ---- -Label : 1 -Position : [1034.2, 1155.63] -Measurements : [1637.8, 254615, 0.313633, -0.432779] ---- -Label : 1 -Position : [45.6109, 1155.75] -Measurements : [950.641, 388082, 0.550202, -1.27312] ---- -Label : 1 -Position : [1037.82, 1155.83] -Measurements : [1584.5, 376728, 0.0635747, -0.84991] ---- -Label : 1 -Position : [46.8161, 1156.08] -Measurements : [1136.68, 416802, 0.115468, -1.46727] ---- -Label : 1 -Position : [1032.58, 1157.1] -Measurements : [1525.62, 196565, -0.348416, -0.261578] ---- -Label : 1 -Position : [10.4649, 1157.13] -Measurements : [1282.26, 370987, 0.432619, -0.768665] ---- -Label : 1 -Position : [775.569, 1157.18] -Measurements : [1327.56, 259850, -0.136, -1.26029] ---- -Label : 1 -Position : [1081.8, 1157.22] -Measurements : [1610.31, 315715, 0.163968, -0.849958] ---- -Label : 1 -Position : [774.257, 1157.31] -Measurements : [1382.79, 219603, -0.214492, -1.06328] ---- -Label : 1 -Position : [1105, 1157.62] -Measurements : [1425.5, 190806, 0.0835614, -0.512457] ---- -Label : 1 -Position : [1080.89, 1157.67] -Measurements : [1666.01, 289439, 0.0934961, -0.818089] ---- -Label : 0 -Position : [171.875, 1157.77] -Measurements : [1355.3, 47895.1, -0.920909, 0.891197] ---- -Label : 1 -Position : [1111.32, 1157.98] -Measurements : [1760.22, 302281, -0.161825, -0.755027] ---- -Label : 0 -Position : [115.068, 1158.51] -Measurements : [994.761, 21197.4, -1.6234, 1.83583] ---- -Label : 1 -Position : [7.656, 1159.03] -Measurements : [1305.08, 295855, -0.0831315, -1.50138] ---- -Label : 1 -Position : [774.586, 1159.08] -Measurements : [1431.5, 203821, -0.396619, -0.917594] ---- -Label : 1 -Position : [769.236, 1159.26] -Measurements : [1335.92, 164932, 0.319891, -1.04671] ---- -Label : 1 -Position : [1034.28, 1159.48] -Measurements : [1450.07, 277183, -0.222387, -1.00844] ---- -Label : 1 -Position : [44.52, 1159.54] -Measurements : [1239.65, 490685, -0.0903567, -1.46974] ---- -Label : 0 -Position : [179.332, 1159.58] -Measurements : [1205.49, 43796.6, -0.0434319, -0.203013] ---- -Label : 1 -Position : [1037.62, 1159.82] -Measurements : [1319.67, 355350, 0.0921585, -1.41574] ---- -Label : 1 -Position : [671.115, 1160.14] -Measurements : [855.894, 444276, 1.88032, 2.42662] ---- -Label : 1 -Position : [1106.98, 1160.26] -Measurements : [1417.53, 144462, 0.596014, 0.463787] ---- -Label : 1 -Position : [305.64, 1160.29] -Measurements : [914.347, 122039, 0.866925, 0.920378] ---- -Label : 1 -Position : [1032.97, 1160.95] -Measurements : [1314, 325452, -0.0550434, -1.31711] ---- -Label : 1 -Position : [50.5872, 1160.97] -Measurements : [1673.48, 106613, -0.250052, 0.330115] ---- -Label : 0 -Position : [118.672, 1161.44] -Measurements : [943.731, 18417.6, -1.08217, -0.117994] ---- -Label : 1 -Position : [1081.16, 1161.54] -Measurements : [1778.86, 359125, 0.0385953, -0.998229] ---- -Label : 1 -Position : [306.024, 1161.67] -Measurements : [957.765, 98584.5, 1.28924, 1.91503] ---- -Label : 1 -Position : [48.798, 1161.95] -Measurements : [1687.78, 173141, -0.453277, 1.15164] ---- -Label : 1 -Position : [306.365, 1162.03] -Measurements : [967.185, 101075, 1.47147, 2.27644] ---- -Label : 0 -Position : [93.0062, 1162.4] -Measurements : [1360.46, 232997, 0.935395, -0.174343] ---- -Label : 1 -Position : [12.2981, 1162.52] -Measurements : [894.349, 254483, 1.09828, -0.34333] ---- -Label : 1 -Position : [679.14, 1162.95] -Measurements : [1225.94, 277101, 0.162187, -0.65047] ---- -Label : 1 -Position : [1078.84, 1163] -Measurements : [1769.8, 333630, -0.0293483, -0.710707] ---- -Label : 1 -Position : [282.684, 1163.14] -Measurements : [1146.41, 459797, 0.384399, -1.49957] ---- -Label : 1 -Position : [281.166, 1163.16] -Measurements : [1227.07, 403801, 0.23897, -1.44882] ---- -Label : 1 -Position : [775.34, 1163.24] -Measurements : [1368.95, 322228, -0.187189, -1.3608] ---- -Label : 1 -Position : [774.177, 1163.99] -Measurements : [1458.28, 268717, -0.362289, -1.03724] ---- -Label : 1 -Position : [678.286, 1164.26] -Measurements : [1244.35, 241009, -0.0883215, -0.634315] ---- -Label : 1 -Position : [280.552, 1164.38] -Measurements : [1255.74, 352484, 0.247431, -1.28641] ---- -Label : 1 -Position : [770.095, 1164.39] -Measurements : [1449.94, 272127, -0.241911, -0.944929] ---- -Label : 1 -Position : [1082.31, 1164.49] -Measurements : [1629.05, 450304, 0.211624, -1.18485] ---- -Label : 1 -Position : [682.569, 1164.63] -Measurements : [1591.97, 263869, 0.0242676, -0.852369] ---- -Label : 1 -Position : [53.736, 1164.66] -Measurements : [1796.13, 157909, 0.450942, -0.454492] ---- -Label : 1 -Position : [707.639, 1165.03] -Measurements : [1271.67, 634350, 0.194827, -1.31768] ---- -Label : 1 -Position : [1107.74, 1165.1] -Measurements : [1294.07, 183733, -0.123783, -0.809899] ---- -Label : 1 -Position : [1080.77, 1165.63] -Measurements : [1773.51, 357820, -0.043212, -0.953411] ---- -Label : 1 -Position : [776.707, 1165.82] -Measurements : [1175.26, 343226, 0.274219, -1.43895] ---- -Label : 1 -Position : [1103.3, 1165.99] -Measurements : [1388.72, 111477, 0.094887, -0.0160851] ---- -Label : 0 -Position : [178.895, 1166.25] -Measurements : [1201.14, 27570.1, 1.00641, 1.99209] ---- -Label : 1 -Position : [302.207, 1166.63] -Measurements : [1052.22, 283675, 0.725463, -0.484432] ---- -Label : 1 -Position : [686.513, 1166.64] -Measurements : [1588.11, 374684, -0.160246, -1.22808] ---- -Label : 1 -Position : [61.2249, 1166.72] -Measurements : [1381.32, 483799, 0.404876, -1.14896] ---- -Label : 1 -Position : [1100.73, 1166.73] -Measurements : [1330.61, 135362, 0.478571, 0.565417] ---- -Label : 1 -Position : [1078.02, 1167.1] -Measurements : [1667.27, 358577, 0.223234, -0.891751] ---- -Label : 1 -Position : [689.403, 1167.11] -Measurements : [1324.63, 501103, 0.433018, -1.4523] ---- -Label : 1 -Position : [771.719, 1167.27] -Measurements : [1276.21, 392712, 0.0712801, -1.50023] ---- -Label : 1 -Position : [1073.6, 1167.6] -Measurements : [1424.16, 411550, -0.282248, -1.18686] ---- -Label : 1 -Position : [708.044, 1168] -Measurements : [1499.85, 524059, -0.165003, -0.937737] ---- -Label : 1 -Position : [709.86, 1168.28] -Measurements : [1627.81, 372373, -0.135262, -0.359293] ---- -Label : 1 -Position : [304.408, 1168.35] -Measurements : [1142.16, 211147, 1.00798, 0.0174553] ---- -Label : 1 -Position : [302.568, 1168.99] -Measurements : [1102.22, 259636, 0.694823, -0.419347] ---- -Label : 1 -Position : [689.815, 1169.03] -Measurements : [1196.13, 470720, 0.763316, -0.956375] ---- -Label : 1 -Position : [60.904, 1169.27] -Measurements : [1368.07, 562764, 0.498212, -1.17687] ---- -Label : 1 -Position : [1097.62, 1169.43] -Measurements : [1213.18, 201338, 0.523949, 0.112324] ---- -Label : 0 -Position : [166.876, 1169.93] -Measurements : [1096.64, 6676.84, 1.02148, 1.16828] ---- -Label : 1 -Position : [1104.49, 1170] -Measurements : [1626.49, 183840, -0.02518, -0.151867] ---- -Label : 1 -Position : [806.033, 1170.33] -Measurements : [1158.68, 355309, 0.0438268, -1.25804] ---- -Label : 1 -Position : [278.397, 1170.37] -Measurements : [1205.98, 347297, 0.444187, -1.05963] ---- -Label : 1 -Position : [1100.84, 1170.5] -Measurements : [1525.53, 171933, 0.236063, 0.244859] ---- -Label : 0 -Position : [139.794, 1170.86] -Measurements : [930.684, 4478.8, 0.844888, -0.191425] ---- -Label : 1 -Position : [4.93162, 1171.5] -Measurements : [1118.23, 221427, 0.238215, -1.23187] ---- -Label : 1 -Position : [771.066, 1171.65] -Measurements : [830.07, 360156, 1.38665, 0.414918] ---- -Label : 1 -Position : [808.583, 1171.77] -Measurements : [1239.92, 313375, -0.109397, -1.03812] ---- -Label : 0 -Position : [118.333, 1171.89] -Measurements : [1020.45, 12099.2, -0.818138, 1.12655] ---- -Label : 1 -Position : [55.9968, 1172.8] -Measurements : [1544.15, 681175, 0.189277, -1.53925] ---- -Label : 1 -Position : [8.68, 1172.86] -Measurements : [1303.49, 426137, 0.651849, -0.78275] ---- -Label : 1 -Position : [1076.35, 1172.94] -Measurements : [1655.4, 363428, -0.100214, -1.25256] ---- -Label : 1 -Position : [1099.97, 1173.19] -Measurements : [1568.65, 202352, -0.171849, -0.172079] ---- -Label : 1 -Position : [5.95018, 1173.32] -Measurements : [1141.07, 267697, 0.616905, -0.542866] ---- -Label : 1 -Position : [272.168, 1173.36] -Measurements : [1493.27, 200158, 0.957997, -0.386417] ---- -Label : 1 -Position : [1074.75, 1173.65] -Measurements : [1720.63, 332586, -0.233922, -1.15701] ---- -Label : 1 -Position : [809.513, 1174.98] -Measurements : [1475.58, 172448, -0.12461, -0.319519] ---- -Label : 1 -Position : [274.92, 1175.14] -Measurements : [1414.44, 313497, 0.292329, -0.810036] ---- -Label : 1 -Position : [1103.28, 1175.18] -Measurements : [1840.97, 145460, -0.709086, 0.577184] ---- -Label : 0 -Position : [147.316, 1175.59] -Measurements : [1016.22, 5487.3, -0.104575, 1.26667] ---- -Label : 1 -Position : [807.354, 1175.87] -Measurements : [1582.88, 137255, -0.126631, -0.136175] ---- -Label : 1 -Position : [808.479, 1175.91] -Measurements : [1557.25, 146285, 0.00798069, -0.47452] ---- -Label : 1 -Position : [804.68, 1176.08] -Measurements : [1436.92, 254438, -0.571786, -0.327179] ---- -Label : 0 -Position : [173.258, 1176.28] -Measurements : [1160.75, 9792.88, -0.58472, 0.246237] ---- -Label : 1 -Position : [69.4278, 1176.54] -Measurements : [1811.43, 412728, -0.200677, -0.851505] ---- -Label : 1 -Position : [1102.07, 1177.05] -Measurements : [1789.93, 141051, -0.503698, 0.21021] ---- -Label : 1 -Position : [772.021, 1177.11] -Measurements : [765.338, 332384, 1.60682, 0.936659] ---- -Label : 1 -Position : [770.353, 1177.7] -Measurements : [870.617, 395075, 1.062, -0.561307] ---- -Label : 1 -Position : [65, 1177.98] -Measurements : [1710.7, 431309, -0.195393, -0.948929] ---- -Label : 1 -Position : [1150.42, 1178.15] -Measurements : [951.68, 212839, 0.349942, -0.967092] ---- -Label : 1 -Position : [1074.22, 1178.51] -Measurements : [1714.99, 309998, -0.321104, -0.952352] ---- -Label : 1 -Position : [821.954, 1178.58] -Measurements : [897.679, 150305, 0.42116, -0.794245] ---- -Label : 1 -Position : [1150.02, 1179.53] -Measurements : [996.775, 237733, 0.377424, -0.815537] ---- -Label : 1 -Position : [90.1359, 1180.11] -Measurements : [1068.05, 45901.2, 1.80289, 5.12569] ---- -Label : 1 -Position : [804.078, 1180.38] -Measurements : [1258.64, 277823, 0.00212332, -1.18351] ---- -Label : 1 -Position : [1104.13, 1180.45] -Measurements : [1603.25, 292510, -0.584487, -1.05308] ---- -Label : 1 -Position : [1076.57, 1180.46] -Measurements : [1433.87, 379487, 0.199152, -1.22763] ---- -Label : 1 -Position : [1073.93, 1180.61] -Measurements : [1447.55, 408477, -0.0256431, -1.23079] ---- -Label : 1 -Position : [769.262, 1181.19] -Measurements : [1289.29, 436584, 0.0565775, -1.55561] ---- -Label : 1 -Position : [6.12, 1181.56] -Measurements : [1267.28, 375035, 0.517701, -0.664949] ---- -Label : 1 -Position : [803.898, 1181.71] -Measurements : [1236.23, 307134, 0.0525878, -1.33434] ---- -Label : 1 -Position : [75.335, 1181.87] -Measurements : [1552.96, 800826, 0.402943, -1.29492] ---- -Label : 1 -Position : [1074.32, 1181.9] -Measurements : [1342.13, 373976, 0.146331, -1.28879] ---- -Label : 1 -Position : [1153.68, 1181.97] -Measurements : [1207.04, 246005, 0.0483445, -1.05673] ---- -Label : 1 -Position : [762.975, 1181.97] -Measurements : [1231.07, 278627, 0.389004, -1.07186] ---- -Label : 1 -Position : [11.102, 1181.99] -Measurements : [1413.08, 486277, 0.211868, -1.29281] ---- -Label : 1 -Position : [73.192, 1182.07] -Measurements : [1802.21, 810669, 0.037417, -1.50906] ---- -Label : 1 -Position : [66.443, 1182.3] -Measurements : [2019.14, 590751, -0.524916, -0.643552] ---- -Label : 1 -Position : [1097.15, 1182.38] -Measurements : [1527.3, 221353, -0.175875, -1.04613] ---- -Label : 1 -Position : [825.786, 1182.42] -Measurements : [1182.26, 286006, -0.0928366, -1.23431] ---- -Label : 1 -Position : [4.09723, 1182.5] -Measurements : [1179.43, 295213, 0.545959, -0.490188] ---- -Label : 1 -Position : [1151, 1182.52] -Measurements : [1252.11, 257518, 0.0621691, -0.767241] ---- -Label : 1 -Position : [1102.21, 1182.96] -Measurements : [1655.51, 252755, -0.665866, -0.796063] ---- -Label : 1 -Position : [73.1307, 1182.99] -Measurements : [1802.21, 810669, 0.037417, -1.50906] ---- -Label : 1 -Position : [825.112, 1183.15] -Measurements : [1271.38, 244428, -0.315896, -0.939105] ---- -Label : 1 -Position : [1097.56, 1183.19] -Measurements : [1487.83, 213545, 0.0659557, -1.1985] ---- -Label : 1 -Position : [1154.09, 1183.6] -Measurements : [1396.51, 230610, 0.187407, -0.703307] ---- -Label : 1 -Position : [766.394, 1183.65] -Measurements : [1588.02, 251511, -0.507433, -0.756907] ---- -Label : 0 -Position : [127.434, 1183.75] -Measurements : [948.533, 20332.5, -0.523438, -0.341544] ---- -Label : 0 -Position : [232.217, 1183.76] -Measurements : [1189.62, 27441.2, 0.0170941, -0.820611] ---- -Label : 0 -Position : [185.352, 1183.84] -Measurements : [1177.2, 5451.08, -0.058732, -0.683641] ---- -Label : 1 -Position : [87.528, 1184.12] -Measurements : [958.423, 119859, 0.322424, 0.165602] ---- -Label : 1 -Position : [91.2962, 1184.46] -Measurements : [1033.72, 33959.5, -0.458446, 1.763] ---- -Label : 1 -Position : [1100.25, 1184.95] -Measurements : [1531.14, 249588, -0.248127, -1.10074] ---- -Label : 1 -Position : [1099.03, 1184.95] -Measurements : [1530.41, 219911, -0.141532, -1.06876] ---- -Label : 1 -Position : [1153.44, 1185.01] -Measurements : [1598.93, 257100, -0.155389, -1.01089] ---- -Label : 1 -Position : [762.156, 1185.34] -Measurements : [1296.5, 340204, 0.0615162, -1.40969] ---- -Label : 1 -Position : [803.97, 1185.35] -Measurements : [1256.88, 326282, 0.10677, -1.45978] ---- -Label : 1 -Position : [1092.13, 1185.7] -Measurements : [1008.44, 171793, 0.79629, -0.0759009] ---- -Label : 1 -Position : [1093.23, 1186.01] -Measurements : [1033.28, 198643, 0.819167, 0.00458842] ---- -Label : 1 -Position : [799.162, 1186.11] -Measurements : [1355, 291078, -0.416914, -1.17096] ---- -Label : 1 -Position : [824.558, 1186.11] -Measurements : [1522.09, 153982, -0.232506, -0.131787] ---- -Label : 1 -Position : [1096.06, 1186.86] -Measurements : [1291.83, 210552, 0.428369, -0.748787] ---- -Label : 1 -Position : [798.694, 1186.94] -Measurements : [1289.91, 322788, -0.271621, -1.37939] ---- -Label : 1 -Position : [819.753, 1187.13] -Measurements : [1269.05, 226137, 0.0833932, -1.1808] ---- -Label : 1 -Position : [1097.74, 1187.34] -Measurements : [1269.99, 226143, 0.560891, -0.55951] ---- -Label : 0 -Position : [107.795, 1187.46] -Measurements : [974.298, 18497, -0.1773, -0.0338076] ---- -Label : 1 -Position : [1095.11, 1187.7] -Measurements : [1131.48, 221926, 0.653684, -0.257936] ---- -Label : 1 -Position : [1095.52, 1187.7] -Measurements : [1131.48, 221926, 0.653684, -0.257936] ---- -Label : 1 -Position : [1156.24, 1188.51] -Measurements : [1640.19, 261126, -0.23606, -1.13799] ---- -Label : 1 -Position : [826.156, 1188.61] -Measurements : [1394.35, 282487, -0.236088, -0.982104] ---- -Label : 1 -Position : [9.192, 1188.73] -Measurements : [1795.61, 156376, 0.41132, -0.33843] ---- -Label : 1 -Position : [766.394, 1189.39] -Measurements : [1274.08, 326507, 0.286603, -1.30143] ---- -Label : 1 -Position : [802.198, 1189.39] -Measurements : [1440.98, 246023, -0.415642, -1.16846] ---- -Label : 1 -Position : [768.045, 1189.66] -Measurements : [1195.73, 362902, 0.465562, -1.33141] ---- -Label : 1 -Position : [1091.93, 1189.68] -Measurements : [711.534, 82232.5, 0.94323, 0.64927] ---- -Label : 1 -Position : [798.879, 1190] -Measurements : [1584.3, 188729, -1.05308, 0.550662] ---- -Label : 1 -Position : [1152.48, 1190.3] -Measurements : [1672.47, 364311, -0.511787, -1.1885] ---- -Label : 1 -Position : [820.502, 1190.42] -Measurements : [1295, 269247, 0.1181, -1.21844] ---- -Label : 1 -Position : [1152.86, 1190.57] -Measurements : [1672.47, 364311, -0.511787, -1.1885] ---- -Label : 1 -Position : [13.8267, 1190.64] -Measurements : [1710.02, 199292, -0.326539, -0.647723] ---- -Label : 1 -Position : [821.69, 1191.02] -Measurements : [1331.21, 266615, 0.0752261, -1.15059] ---- -Label : 1 -Position : [1153.84, 1191.06] -Measurements : [1622.26, 391575, -0.391323, -1.31254] ---- -Label : 1 -Position : [1149.59, 1191.23] -Measurements : [1375.61, 524379, 0.0222752, -1.71337] ---- -Label : 1 -Position : [825.051, 1191.3] -Measurements : [1306.23, 295348, 0.0187257, -1.17552] ---- -Label : 1 -Position : [859.374, 1191.84] -Measurements : [1304.06, 396412, 0.130115, -1.16986] ---- -Label : 1 -Position : [5.81273, 1191.94] -Measurements : [1492.18, 147510, 0.0304225, -0.833112] ---- -Label : 0 -Position : [196.511, 1192.22] -Measurements : [1607.13, 44011.5, 0.123893, -1.41548] ---- -Label : 1 -Position : [761.952, 1192.6] -Measurements : [1265.09, 402702, 0.0570166, -1.51692] ---- -Label : 1 -Position : [1152.86, 1192.62] -Measurements : [1521.03, 511762, -0.23247, -1.65025] ---- -Label : 1 -Position : [75.5997, 1192.84] -Measurements : [749.381, 215968, 1.15818, 0.410867] ---- -Label : 1 -Position : [857.466, 1193.25] -Measurements : [1407.08, 322798, -0.0847183, -0.998472] ---- -Label : 1 -Position : [864.373, 1193.35] -Measurements : [1257.72, 212586, 0.994952, 0.534599] ---- -Label : 1 -Position : [799.162, 1193.48] -Measurements : [1620.7, 154920, -0.801872, -0.115901] ---- -Label : 1 -Position : [795.008, 1193.6] -Measurements : [1386.23, 330501, -0.58523, -0.985151] ---- -Label : 1 -Position : [798.663, 1193.86] -Measurements : [1609.82, 167327, -0.937791, 0.320673] ---- -Label : 1 -Position : [768.778, 1194.21] -Measurements : [932.05, 300184, 1.09552, -0.281007] ---- -Label : 1 -Position : [792.253, 1195.43] -Measurements : [1055.97, 354882, 0.22741, -1.40818] ---- -Label : 0 -Position : [161.728, 1195.56] -Measurements : [1050.87, 5899.31, -0.303962, -0.044112] ---- -Label : 1 -Position : [798.343, 1195.94] -Measurements : [1594.06, 172516, -0.800125, -0.0638567] ---- -Label : 1 -Position : [761.07, 1196.35] -Measurements : [1432.35, 364425, -0.190549, -1.39131] ---- -Label : 1 -Position : [857.326, 1196.35] -Measurements : [1250.1, 385819, 0.267622, -1.1927] ---- -Label : 1 -Position : [79.336, 1196.41] -Measurements : [1180.75, 443880, 0.317155, -1.13477] ---- -Label : 1 -Position : [765.898, 1197.04] -Measurements : [1071.85, 359810, 0.723553, -1.05485] ---- -Label : 1 -Position : [801.746, 1197.09] -Measurements : [1369.86, 230534, 0.126528, -1.48602] ---- -Label : 1 -Position : [294.771, 1197.31] -Measurements : [924.689, 354266, 0.825889, -0.750758] ---- -Label : 1 -Position : [853.573, 1197.33] -Measurements : [971.671, 333839, 0.739649, -0.695533] ---- -Label : 1 -Position : [877.806, 1198.4] -Measurements : [711.088, 104285, 1.4406, 1.44004] ---- -Label : 1 -Position : [10.216, 1198.46] -Measurements : [1827.32, 240774, 0.0304515, -0.774381] ---- -Label : 1 -Position : [818.237, 1198.82] -Measurements : [1047, 371466, 0.87564, -0.519433] ---- -Label : 1 -Position : [289.835, 1199.1] -Measurements : [718.394, 255371, 1.38507, 0.540872] ---- -Label : 1 -Position : [294.376, 1199.2] -Measurements : [1001.89, 306094, 0.757925, -0.666724] ---- -Label : 1 -Position : [795.476, 1199.22] -Measurements : [1185.12, 365745, 0.0183278, -1.53179] ---- -Label : 1 -Position : [757.378, 1199.59] -Measurements : [1315.24, 408113, 0.0787407, -1.49655] ---- -Label : 1 -Position : [80.1549, 1199.7] -Measurements : [1244.74, 405225, 0.41905, -1.17794] ---- -Label : 0 -Position : [132.888, 1200.69] -Measurements : [1081.44, 27934, 0.356593, 4.06093] ---- -Label : 1 -Position : [856.943, 1200.87] -Measurements : [1099.61, 348047, 0.500254, -1.09179] ---- -Label : 1 -Position : [798.717, 1200.99] -Measurements : [1171.85, 313919, 0.174347, -1.44847] ---- -Label : 1 -Position : [8.26564, 1201.04] -Measurements : [1593.37, 238480, -0.0750373, -0.905243] ---- -Label : 1 -Position : [14.6304, 1201.25] -Measurements : [1989.93, 375142, -0.568585, -0.623087] ---- -Label : 1 -Position : [11.872, 1201.47] -Measurements : [1878.07, 283262, -0.108716, -0.884632] ---- -Label : 1 -Position : [757.383, 1201.67] -Measurements : [1203.89, 346874, 0.377234, -1.15645] ---- -Label : 1 -Position : [753.746, 1202.28] -Measurements : [1018.77, 206945, 0.724485, -0.404962] ---- -Label : 1 -Position : [874.79, 1202.42] -Measurements : [823.945, 180336, 1.15259, 0.370505] ---- -Label : 1 -Position : [816.775, 1202.49] -Measurements : [1277.91, 407298, 0.225137, -1.16466] ---- -Label : 1 -Position : [12.264, 1202.55] -Measurements : [1975.23, 295764, -0.320646, -0.838866] ---- -Label : 0 -Position : [186.377, 1202.61] -Measurements : [1372.58, 147226, -0.363546, -1.33675] ---- -Label : 1 -Position : [270.087, 1202.61] -Measurements : [731.651, 228259, 1.58597, 1.25361] ---- -Label : 1 -Position : [878.836, 1203.11] -Measurements : [848.244, 242834, 1.07867, -0.18974] ---- -Label : 1 -Position : [265.192, 1203.3] -Measurements : [1165.77, 273250, 0.505811, -0.885315] ---- -Label : 0 -Position : [162.979, 1204.42] -Measurements : [812.26, 45876.6, 0.0554185, -1.4658] ---- -Label : 1 -Position : [855.278, 1204.54] -Measurements : [922.078, 166029, 0.900278, -0.257132] ---- -Label : 0 -Position : [160.943, 1204.57] -Measurements : [808.898, 44084.3, 0.00983514, -1.36082] ---- -Label : 1 -Position : [811.336, 1204.86] -Measurements : [1218.67, 233231, 0.778767, -0.254009] ---- -Label : 1 -Position : [872.931, 1205.06] -Measurements : [880.312, 221325, 0.954574, -0.190436] ---- -Label : 1 -Position : [8.02011, 1205.07] -Measurements : [1608.5, 230530, -0.220706, -0.820422] ---- -Label : 1 -Position : [818.772, 1205.09] -Measurements : [1470.3, 357246, -0.0182837, -1.11492] ---- -Label : 1 -Position : [813.839, 1205.21] -Measurements : [1405.77, 289029, 0.283281, -0.859455] ---- -Label : 1 -Position : [859.546, 1205.65] -Measurements : [890.991, 108297, 1.24734, 1.57051] ---- -Label : 1 -Position : [11.1202, 1205.67] -Measurements : [1982.09, 188002, 0.0591524, -0.617607] ---- -Label : 0 -Position : [172.906, 1205.7] -Measurements : [701.565, 6990.93, 2.07489, 5.58847] ---- -Label : 1 -Position : [1146.87, 1206.73] -Measurements : [916.242, 277081, 0.410514, -1.41405] ---- -Label : 1 -Position : [79.1713, 1206.84] -Measurements : [911.106, 310157, 1.20421, 0.573365] ---- -Label : 1 -Position : [757.383, 1207] -Measurements : [1287.94, 379562, 0.422226, -0.753552] ---- -Label : 1 -Position : [874.529, 1207.41] -Measurements : [883.549, 250160, 0.901673, -0.566962] ---- -Label : 1 -Position : [266.636, 1207.49] -Measurements : [973.078, 346547, 0.909499, -0.593301] ---- -Label : 1 -Position : [814.727, 1207.82] -Measurements : [1486.97, 307317, 0.101435, -0.940271] ---- -Label : 1 -Position : [1151.88, 1207.93] -Measurements : [856.073, 274754, 0.639899, -1.25517] ---- -Label : 1 -Position : [854.621, 1208.13] -Measurements : [1060.52, 172373, 0.739862, -0.671865] ---- -Label : 1 -Position : [14.824, 1208.7] -Measurements : [2171.92, 155829, 0.227236, -0.919945] ---- -Label : 1 -Position : [758.404, 1208.73] -Measurements : [1359.35, 521184, 0.589396, -0.784245] ---- -Label : 1 -Position : [1146.5, 1208.96] -Measurements : [1080.61, 235520, -0.0865575, -1.38126] ---- -Label : 1 -Position : [1147.94, 1209] -Measurements : [1084.39, 240852, -0.113844, -1.41867] ---- -Label : 1 -Position : [848.343, 1209.1] -Measurements : [825.078, 217935, 0.86336, -0.354854] ---- -Label : 1 -Position : [1147.54, 1209.41] -Measurements : [1165.1, 205559, -0.350789, -1.13496] ---- -Label : 1 -Position : [1146.95, 1209.71] -Measurements : [1166.03, 199265, -0.338016, -1.08855] ---- -Label : 1 -Position : [82.408, 1209.72] -Measurements : [1303.49, 380234, 0.222019, -0.862375] ---- -Label : 1 -Position : [791.848, 1210.35] -Measurements : [1033.7, 405911, 0.534803, -1.01415] ---- -Label : 1 -Position : [759.246, 1210.7] -Measurements : [1427.21, 542382, 0.482749, -1.06428] ---- -Label : 1 -Position : [871.913, 1211.07] -Measurements : [1151.41, 386125, 0.459999, -1.05337] ---- -Label : 1 -Position : [869.578, 1211.09] -Measurements : [1068.34, 302377, 0.751652, -0.373732] ---- -Label : 1 -Position : [847.912, 1211.42] -Measurements : [742.205, 183218, 1.13478, 0.276318] ---- -Label : 1 -Position : [15.8737, 1211.89] -Measurements : [2343.75, 165428, 0.0743857, -1.45722] ---- -Label : 1 -Position : [755.745, 1211.91] -Measurements : [1817.41, 357409, -0.036646, -0.721701] ---- -Label : 1 -Position : [751.627, 1211.99] -Measurements : [1516.84, 466227, 0.366788, -0.83318] ---- -Label : 1 -Position : [871.766, 1212.2] -Measurements : [1215.53, 441193, 0.350756, -1.28659] ---- -Label : 1 -Position : [814.318, 1212.73] -Measurements : [1191.83, 406019, 0.391043, -1.12124] ---- -Label : 1 -Position : [852.001, 1212.73] -Measurements : [958.28, 155298, 0.944017, 0.0482365] ---- -Label : 1 -Position : [909.531, 1212.96] -Measurements : [884.748, 342927, 0.886771, -0.582627] ---- -Label : 1 -Position : [260.584, 1213.02] -Measurements : [1077.25, 312499, 0.623861, -0.982408] ---- -Label : 1 -Position : [284.136, 1213.02] -Measurements : [1371.41, 329253, -0.091794, -1.14797] ---- -Label : 1 -Position : [86.8254, 1213.03] -Measurements : [1458.97, 325044, 0.0850041, -1.01114] ---- -Label : 1 -Position : [9.87187, 1213.4] -Measurements : [1711.85, 417815, 0.0331565, -0.88982] ---- -Label : 1 -Position : [792.199, 1213.55] -Measurements : [1462.62, 450200, 0.148354, -0.833265] ---- -Label : 1 -Position : [871.662, 1213.55] -Measurements : [1271.39, 476000, 0.308982, -1.25782] ---- -Label : 1 -Position : [82.5704, 1213.6] -Measurements : [1698.48, 184574, 0.0132581, -0.401171] ---- -Label : 1 -Position : [282.796, 1213.68] -Measurements : [1230.26, 412366, 0.164402, -1.39135] ---- -Label : 1 -Position : [793.948, 1213.96] -Measurements : [1421.52, 469665, 0.21813, -0.831042] ---- -Label : 1 -Position : [1143.74, 1214.11] -Measurements : [1133.24, 213930, -0.226796, -1.28842] ---- -Label : 1 -Position : [905.413, 1214.14] -Measurements : [1207.88, 461935, 0.0915895, -1.5239] ---- -Label : 0 -Position : [178.36, 1214.28] -Measurements : [766.149, 4079.33, 1.56613, 1.86491] ---- -Label : 1 -Position : [15.336, 1214.33] -Measurements : [2423.45, 183125, 0.0486293, -1.10514] ---- -Label : 0 -Position : [131.742, 1214.34] -Measurements : [936.518, 20172.8, -0.304679, 1.13836] ---- -Label : 1 -Position : [756.203, 1214.35] -Measurements : [1799.29, 481028, -0.197371, -0.988624] ---- -Label : 1 -Position : [1142.67, 1214.61] -Measurements : [1034.69, 228523, 0.0839063, -1.38911] ---- -Label : 1 -Position : [909.78, 1214.87] -Measurements : [1117.69, 418789, 0.380851, -1.31459] ---- -Label : 1 -Position : [258.906, 1214.98] -Measurements : [1078.44, 277833, 0.53751, -0.890986] ---- -Label : 1 -Position : [280.156, 1215.14] -Measurements : [1027.23, 379387, 0.612957, -1.09361] ---- -Label : 0 -Position : [119.654, 1215.16] -Measurements : [973.622, 44681.7, 0.4596, 0.253037] ---- -Label : 0 -Position : [128.804, 1215.37] -Measurements : [926.183, 28247.1, 0.260325, 2.06074] ---- -Label : 1 -Position : [755.335, 1215.6] -Measurements : [1837.2, 445531, -0.274624, -0.802054] ---- -Label : 1 -Position : [759.726, 1215.7] -Measurements : [1359.43, 705840, 0.650318, -1.11076] ---- -Label : 1 -Position : [746.562, 1216.14] -Measurements : [1225.45, 224906, 0.503518, -0.982275] ---- -Label : 1 -Position : [811.113, 1216.19] -Measurements : [730.386, 246836, 1.74971, 1.85232] ---- -Label : 1 -Position : [756.649, 1216.32] -Measurements : [1703.19, 588354, -0.048937, -1.34199] ---- -Label : 0 -Position : [131.871, 1216.33] -Measurements : [909.844, 13797, -0.984392, 1.27645] ---- -Label : 1 -Position : [253.915, 1216.33] -Measurements : [1080.04, 179154, 0.369279, -0.0178993] ---- -Label : 1 -Position : [1146.31, 1216.37] -Measurements : [1190.47, 158488, -0.554648, -1.05723] ---- -Label : 1 -Position : [791.38, 1216.42] -Measurements : [1755.74, 313424, -0.00816374, -0.518683] ---- -Label : 1 -Position : [851.948, 1216.73] -Measurements : [1177.64, 293207, 0.408663, -1.03527] ---- -Label : 1 -Position : [914.089, 1216.85] -Measurements : [972.153, 207751, 0.844733, 0.167141] ---- -Label : 1 -Position : [285.672, 1217.12] -Measurements : [1415.82, 249102, -0.0727781, -0.674173] ---- -Label : 1 -Position : [288.55, 1217.19] -Measurements : [1322.11, 280795, 0.148007, -0.88388] ---- -Label : 1 -Position : [788.228, 1217.69] -Measurements : [1601.6, 462082, -0.261452, -0.710461] ---- -Label : 1 -Position : [812.188, 1217.72] -Measurements : [701.541, 237729, 1.99031, 2.78772] ---- -Label : 1 -Position : [907.322, 1217.74] -Measurements : [1682.85, 390793, -0.0135373, -0.575758] ---- -Label : 1 -Position : [909.516, 1217.75] -Measurements : [1541, 482589, 0.239899, -0.923021] ---- -Label : 1 -Position : [80.36, 1217.91] -Measurements : [1679.26, 171675, -0.130206, -0.141252] ---- -Label : 1 -Position : [259.674, 1217.92] -Measurements : [758.745, 248822, 1.68135, 1.685] ---- -Label : 1 -Position : [17.5562, 1218.03] -Measurements : [2678.93, 191799, -1.42829, 3.37401] ---- -Label : 1 -Position : [793.29, 1218.25] -Measurements : [1656.77, 333908, 0.463085, -0.929399] ---- -Label : 1 -Position : [747.371, 1218.3] -Measurements : [1298.58, 254042, 0.325729, -1.26416] ---- -Label : 1 -Position : [249.182, 1218.5] -Measurements : [1069.04, 101005, -0.607746, -0.712342] ---- -Label : 1 -Position : [1162.5, 1218.76] -Measurements : [1505.7, 491152, 0.805507, -0.674457] ---- -Label : 1 -Position : [871.252, 1218.88] -Measurements : [1798.52, 387780, -0.338564, -0.862378] ---- -Label : 1 -Position : [904.748, 1218.97] -Measurements : [1768.93, 440880, -0.231233, -0.696289] ---- -Label : 1 -Position : [843.182, 1219.1] -Measurements : [1122.98, 588369, 0.693368, -0.763251] ---- -Label : 1 -Position : [11.4749, 1219.13] -Measurements : [2197.52, 364364, -0.729895, -0.229045] ---- -Label : 1 -Position : [287.453, 1219.31] -Measurements : [1207.18, 282762, 0.341719, -0.770938] ---- -Label : 1 -Position : [794.615, 1219.42] -Measurements : [1572.63, 372173, 0.618228, -0.934499] ---- -Label : 1 -Position : [234.885, 1219.54] -Measurements : [1162.35, 104704, 0.371147, 1.63789] ---- -Label : 1 -Position : [846.17, 1219.78] -Measurements : [1373.06, 541971, 0.217375, -1.04107] ---- -Label : 1 -Position : [868.473, 1219.85] -Measurements : [1724.47, 490118, -0.230996, -1.06146] ---- -Label : 1 -Position : [750.83, 1220.11] -Measurements : [1540.65, 326390, 0.246965, -0.853089] ---- -Label : 1 -Position : [290.28, 1220.19] -Measurements : [967.021, 301911, 0.893497, -0.0993775] ---- -Label : 1 -Position : [287.753, 1220.38] -Measurements : [1118.73, 295328, 0.530871, -0.626394] ---- -Label : 1 -Position : [847.905, 1220.52] -Measurements : [1516.89, 553376, 0.133567, -1.15221] ---- -Label : 1 -Position : [866.581, 1220.55] -Measurements : [1526.49, 467194, 0.12961, -1.24029] ---- -Label : 1 -Position : [249.832, 1220.7] -Measurements : [952.769, 145228, -0.0548567, -1.53415] ---- -Label : 1 -Position : [754.386, 1220.73] -Measurements : [1505.02, 452253, 0.229136, -0.981314] ---- -Label : 1 -Position : [790.151, 1220.93] -Measurements : [1785.59, 310558, -0.0502628, -0.763834] ---- -Label : 1 -Position : [807.622, 1221.32] -Measurements : [878.987, 168161, 0.666003, -0.491093] ---- -Label : 1 -Position : [786.966, 1221.57] -Measurements : [1433.63, 479609, -0.15224, -1.17562] ---- -Label : 1 -Position : [78.3397, 1221.58] -Measurements : [1571.64, 202256, -0.481934, -0.0621826] ---- -Label : 1 -Position : [930.767, 1221.62] -Measurements : [1282.96, 459300, 0.00763679, -1.48934] ---- -Label : 1 -Position : [864.789, 1221.62] -Measurements : [1328.81, 360256, 0.487199, -1.06278] ---- -Label : 1 -Position : [867.829, 1221.71] -Measurements : [1688.18, 461851, -0.229008, -1.0514] ---- -Label : 1 -Position : [926.704, 1221.78] -Measurements : [1113.68, 341650, 0.448803, -1.0555] ---- -Label : 1 -Position : [906.094, 1221.84] -Measurements : [1920.02, 277201, -0.0198953, -0.571137] ---- -Label : 1 -Position : [15.336, 1222.01] -Measurements : [2516.24, 202144, -0.148118, -0.0875051] ---- -Label : 1 -Position : [1172.23, 1222.03] -Measurements : [1599.01, 391892, 0.691466, 0.345097] ---- -Label : 1 -Position : [809.838, 1222.25] -Measurements : [938.059, 224223, 0.483807, -0.898122] ---- -Label : 1 -Position : [804.888, 1222.39] -Measurements : [970.848, 133092, 0.634874, 0.195407] ---- -Label : 1 -Position : [238.52, 1222.49] -Measurements : [1310.99, 195029, 0.0953162, -0.732769] ---- -Label : 0 -Position : [140.699, 1222.6] -Measurements : [967.235, 2961.46, 0.860597, 0.738803] ---- -Label : 1 -Position : [931.316, 1222.81] -Measurements : [1369.78, 434520, -0.191234, -1.43647] ---- -Label : 1 -Position : [901.789, 1222.87] -Measurements : [1458.44, 600982, -0.0139851, -1.27951] ---- -Label : 1 -Position : [928.444, 1222.91] -Measurements : [1346.44, 365050, -0.0697131, -1.29736] ---- -Label : 1 -Position : [875.049, 1223] -Measurements : [1197.35, 653274, 0.837206, -0.80181] ---- -Label : 1 -Position : [82.9643, 1223.24] -Measurements : [1803.34, 134873, 0.1435, -0.49312] ---- -Label : 1 -Position : [1164.74, 1223.74] -Measurements : [2229.77, 575814, -0.292431, -1.11282] ---- -Label : 1 -Position : [1170.06, 1223.74] -Measurements : [1868.77, 549650, 0.385324, -0.908998] ---- -Label : 1 -Position : [239.592, 1223.78] -Measurements : [1251.76, 245777, 0.0664219, -1.06259] ---- -Label : 1 -Position : [846.676, 1223.79] -Measurements : [1905.05, 360387, -0.429257, -0.684733] ---- -Label : 1 -Position : [80.872, 1224.06] -Measurements : [1744.35, 155098, -0.0915156, -0.578833] ---- -Label : 1 -Position : [1162.13, 1224.16] -Measurements : [2096.91, 692154, -0.115876, -1.49859] ---- -Label : 1 -Position : [870.023, 1224.2] -Measurements : [1763.44, 413281, -0.237713, -0.871015] ---- -Label : 1 -Position : [863.664, 1224.27] -Measurements : [1290.95, 276000, 0.48197, -1.03283] ---- -Label : 1 -Position : [906.844, 1224.58] -Measurements : [1845.35, 340240, -0.0395007, -0.766385] ---- -Label : 1 -Position : [751.674, 1224.7] -Measurements : [1371.12, 288650, 0.0519448, -1.0595] ---- -Label : 1 -Position : [785.941, 1224.92] -Measurements : [1133.53, 464075, 0.493464, -1.10058] ---- -Label : 1 -Position : [294.499, 1225.02] -Measurements : [650.489, 96289.7, 1.36371, 1.16223] ---- -Label : 1 -Position : [787.284, 1225.02] -Measurements : [1233.36, 422995, 0.487997, -0.952479] ---- -Label : 1 -Position : [843.835, 1225.13] -Measurements : [1869.01, 452044, -0.751668, -0.379219] ---- -Label : 1 -Position : [17.3172, 1225.28] -Measurements : [2492.97, 143042, 0.321103, -0.0593158] ---- -Label : 1 -Position : [844.595, 1225.63] -Measurements : [1959.6, 360340, -0.785183, 0.0399021] ---- -Label : 1 -Position : [296.669, 1225.88] -Measurements : [742.942, 130932, 0.859113, -0.313118] ---- -Label : 1 -Position : [745.869, 1225.97] -Measurements : [1151.33, 226392, 0.580858, -0.701615] ---- -Label : 1 -Position : [1177.05, 1225.98] -Measurements : [1585.6, 189304, 0.0633345, -0.444408] ---- -Label : 1 -Position : [1176.21, 1226.2] -Measurements : [1633.13, 178764, 0.153143, -0.785366] ---- -Label : 1 -Position : [865.927, 1226.25] -Measurements : [1501.94, 324477, 0.166657, -0.889444] ---- -Label : 0 -Position : [150.771, 1226.62] -Measurements : [945.835, 2810.44, -1.40093, 3.20244] ---- -Label : 1 -Position : [904.865, 1226.75] -Measurements : [1784.36, 410944, -0.0403627, -0.759294] ---- -Label : 1 -Position : [748.782, 1226.83] -Measurements : [1227.29, 257607, 0.375343, -0.911056] ---- -Label : 1 -Position : [844.218, 1227.48] -Measurements : [1991.9, 331418, -0.790508, 0.0393777] ---- -Label : 1 -Position : [808.609, 1227.57] -Measurements : [1098.06, 209074, 0.144377, -1.00202] ---- -Label : 1 -Position : [928.31, 1227.76] -Measurements : [1639.48, 235764, -0.482709, -0.606112] ---- -Label : 1 -Position : [747.578, 1227.98] -Measurements : [1102.9, 237964, 0.540202, -0.77443] ---- -Label : 1 -Position : [83.1913, 1228.3] -Measurements : [1725.95, 168715, -0.143545, -0.522532] ---- -Label : 1 -Position : [926.96, 1228.37] -Measurements : [1537.55, 226853, -0.255072, -0.693078] ---- -Label : 1 -Position : [302.761, 1228.43] -Measurements : [1143.77, 133976, 0.450963, 1.17834] ---- -Label : 0 -Position : [156.879, 1228.46] -Measurements : [946.406, 18109.5, -0.191883, 0.487] ---- -Label : 1 -Position : [743.704, 1228.51] -Measurements : [960.514, 213048, 0.993258, 0.113225] ---- -Label : 1 -Position : [1172.41, 1228.64] -Measurements : [1880.01, 537214, 0.460628, -0.437212] ---- -Label : 1 -Position : [905.202, 1228.65] -Measurements : [1658.58, 325013, 0.0669244, -0.69995] ---- -Label : 1 -Position : [845.157, 1228.7] -Measurements : [1973.87, 354655, -0.675772, -0.538657] ---- -Label : 1 -Position : [902.611, 1228.71] -Measurements : [1599.41, 362335, -0.285628, -0.409707] ---- -Label : 1 -Position : [1183.99, 1229.07] -Measurements : [1416.03, 104399, 0.989837, 1.2258] ---- -Label : 1 -Position : [300.52, 1229.41] -Measurements : [1179.08, 265119, 0.927807, 0.811799] ---- -Label : 1 -Position : [1184.65, 1229.41] -Measurements : [1411.18, 125542, 0.739785, 1.45012] ---- -Label : 1 -Position : [904.496, 1229.55] -Measurements : [1655.59, 291582, -0.126127, -0.620944] ---- -Label : 1 -Position : [928.939, 1229.76] -Measurements : [1552, 222588, -0.27606, -0.609991] ---- -Label : 1 -Position : [813.407, 1229.8] -Measurements : [845.924, 211077, 1.00438, -0.36928] ---- -Label : 1 -Position : [805.472, 1229.82] -Measurements : [874.327, 213249, 0.71872, -0.841291] ---- -Label : 1 -Position : [785.645, 1229.82] -Measurements : [998.748, 287450, 0.755282, -0.432779] ---- -Label : 1 -Position : [1172.12, 1230] -Measurements : [1829.53, 606080, 0.376467, -0.610032] ---- -Label : 1 -Position : [1179.78, 1230.02] -Measurements : [1552.48, 144827, 0.708302, -0.33234] ---- -Label : 1 -Position : [294.209, 1230.04] -Measurements : [1231.29, 558679, 0.475679, -1.1597] ---- -Label : 0 -Position : [135.652, 1230.22] -Measurements : [1132.88, 24218.5, 1.04485, 0.947635] ---- -Label : 1 -Position : [871.499, 1230.59] -Measurements : [1271.54, 387666, 0.228329, -1.38369] ---- -Label : 1 -Position : [897.3, 1230.81] -Measurements : [1107.45, 483480, 0.443123, -1.11515] ---- -Label : 1 -Position : [788.412, 1230.85] -Measurements : [1006.32, 225117, 0.956939, 0.236453] ---- -Label : 0 -Position : [172.006, 1231.09] -Measurements : [764.245, 6700.82, 1.10045, 2.44211] ---- -Label : 1 -Position : [925.442, 1231.45] -Measurements : [1457.06, 201568, -0.0827904, -0.449099] ---- -Label : 1 -Position : [901.588, 1231.67] -Measurements : [1649.82, 432288, -0.393316, -0.599881] ---- -Label : 1 -Position : [837.017, 1231.98] -Measurements : [1234.63, 569450, 0.154681, -1.56023] ---- -Label : 1 -Position : [784.852, 1232.08] -Measurements : [1106.64, 287540, 0.669004, -0.199733] ---- -Label : 1 -Position : [840.967, 1232.08] -Measurements : [1762.09, 384542, -0.961169, -0.191973] ---- -Label : 1 -Position : [867.182, 1232.49] -Measurements : [1359.8, 289117, 0.286787, -0.967843] ---- -Label : 1 -Position : [927.035, 1232.5] -Measurements : [1456.32, 265473, -0.20073, -0.921721] ---- -Label : 1 -Position : [215.016, 1232.61] -Measurements : [1668.05, 361488, -0.212671, -0.527731] ---- -Label : 1 -Position : [786.979, 1233.6] -Measurements : [1154.52, 278076, 0.705189, -0.117734] ---- -Label : 1 -Position : [215.742, 1234.14] -Measurements : [1805.04, 245802, -0.257069, 0.147681] ---- -Label : 1 -Position : [863.242, 1234.26] -Measurements : [1038.03, 202727, 0.760403, -0.245087] ---- -Label : 1 -Position : [214.635, 1234.37] -Measurements : [1854.5, 185586, 0.0271868, 0.552599] ---- -Label : 1 -Position : [786.343, 1234.37] -Measurements : [1197.42, 250329, 0.709552, 0.0957804] ---- -Label : 1 -Position : [923.953, 1234.44] -Measurements : [1447.6, 208263, -0.041822, -0.701972] ---- -Label : 1 -Position : [17.896, 1234.66] -Measurements : [2239.97, 878718, -0.500571, -1.11511] ---- -Label : 1 -Position : [16.6519, 1234.82] -Measurements : [2245.42, 844234, -0.440372, -1.03476] ---- -Label : 1 -Position : [900.359, 1234.94] -Measurements : [1416.86, 551278, 0.11982, -1.18663] ---- -Label : 1 -Position : [297.448, 1235.04] -Measurements : [1814.39, 448896, -0.119873, -1.35972] ---- -Label : 1 -Position : [800.13, 1235.18] -Measurements : [915.996, 184923, 0.49921, -0.877147] ---- -Label : 1 -Position : [1184.07, 1235.45] -Measurements : [1703.55, 224413, 1.11423, 0.171697] ---- -Label : 1 -Position : [840.304, 1235.55] -Measurements : [1828.01, 310526, -1.04268, 0.33815] ---- -Label : 1 -Position : [839.32, 1235.63] -Measurements : [1739.61, 394281, -0.905096, -0.232115] ---- -Label : 1 -Position : [863.561, 1235.71] -Measurements : [1011.11, 195394, 0.886399, 0.0760186] ---- -Label : 1 -Position : [898.668, 1235.95] -Measurements : [1169.53, 518051, 0.545714, -1.00207] ---- -Label : 1 -Position : [922.985, 1235.95] -Measurements : [1329.86, 269506, 0.0793324, -0.969957] ---- -Label : 1 -Position : [79.3361, 1236.06] -Measurements : [1297.88, 329390, 0.257138, -0.939452] ---- -Label : 1 -Position : [16.3183, 1236.08] -Measurements : [1942.73, 1.2736e+06, -0.0682841, -1.64411] ---- -Label : 1 -Position : [865.543, 1236.17] -Measurements : [1090.45, 243359, 0.778857, -0.384085] ---- -Label : 1 -Position : [83.944, 1236.19] -Measurements : [1426.26, 322624, 0.0424581, -1.08061] ---- -Label : 1 -Position : [780.375, 1236.46] -Measurements : [879.165, 325633, 1.00037, 0.109566] ---- -Label : 1 -Position : [872.181, 1236.47] -Measurements : [822.466, 279109, 1.52797, 0.988733] ---- -Label : 1 -Position : [79.1963, 1236.51] -Measurements : [1297.88, 329390, 0.257138, -0.939452] ---- -Label : 1 -Position : [746.35, 1236.58] -Measurements : [1067.85, 313847, 0.780247, -0.470879] ---- -Label : 1 -Position : [784.442, 1236.58] -Measurements : [1171.59, 285270, 0.586534, -0.316596] ---- -Label : 1 -Position : [1187.42, 1236.63] -Measurements : [2030.98, 282792, 0.0142445, -1.23582] ---- -Label : 1 -Position : [1188.89, 1236.87] -Measurements : [2093.61, 240983, -0.0320629, -1.21898] ---- -Label : 1 -Position : [213.48, 1237.22] -Measurements : [1859.73, 217907, -0.13619, 0.0246956] ---- -Label : 1 -Position : [212.732, 1237.23] -Measurements : [1814.92, 211519, -0.129132, -0.14362] ---- -Label : 0 -Position : [171.098, 1237.92] -Measurements : [881.646, 10935, 0.0708465, -1.03185] ---- -Label : 1 -Position : [294.482, 1238.02] -Measurements : [1698.97, 609698, -0.128204, -1.50719] ---- -Label : 1 -Position : [841.377, 1238.22] -Measurements : [1880.89, 254191, -0.636922, -0.557618] ---- -Label : 1 -Position : [211.392, 1238.84] -Measurements : [1747.73, 190447, -0.0580938, -0.171229] ---- -Label : 1 -Position : [919.333, 1238.92] -Measurements : [923.99, 208645, 0.773501, -0.68262] ---- -Label : 1 -Position : [802.465, 1239.04] -Measurements : [1185.7, 306360, 0.16626, -1.08458] ---- -Label : 1 -Position : [781.429, 1239.41] -Measurements : [1023.85, 345005, 0.6991, -0.393158] ---- -Label : 1 -Position : [746.759, 1239.49] -Measurements : [1163.49, 299606, 0.599099, -0.744458] ---- -Label : 1 -Position : [213.229, 1239.83] -Measurements : [1824.79, 233312, -0.0712011, -0.0846081] ---- -Label : 1 -Position : [742.467, 1239.94] -Measurements : [1096.43, 288625, 0.714364, -0.380117] ---- -Label : 1 -Position : [901.974, 1240.12] -Measurements : [1125, 397928, 0.914923, -0.0284579] ---- -Label : 1 -Position : [292.84, 1240.67] -Measurements : [1346.63, 724605, 0.476662, -1.43048] ---- -Label : 1 -Position : [743.892, 1240.68] -Measurements : [1170.87, 291753, 0.547246, -0.677062] ---- -Label : 1 -Position : [747.71, 1240.9] -Measurements : [1118.82, 303959, 0.741731, -0.599327] ---- -Label : 1 -Position : [1198.72, 1240.97] -Measurements : [2259.05, 347432, -0.0445919, -1.06256] ---- -Label : 1 -Position : [1196.13, 1241.16] -Measurements : [2348.43, 326410, -0.205738, -0.877876] ---- -Label : 1 -Position : [742.604, 1241.47] -Measurements : [1123.63, 294928, 0.580539, -0.597594] ---- -Label : 1 -Position : [896.742, 1241.99] -Measurements : [1150.34, 484377, 0.670076, -0.664179] ---- -Label : 1 -Position : [806.138, 1242.01] -Measurements : [1069.13, 337481, 0.676933, -0.867978] ---- -Label : 1 -Position : [783.194, 1242.19] -Measurements : [1060.78, 232843, 0.78743, 0.361256] ---- -Label : 1 -Position : [296.008, 1242.3] -Measurements : [1188.2, 516637, 1.09348, -0.0784587] ---- -Label : 1 -Position : [863.905, 1242.32] -Measurements : [1017.85, 226619, 0.604561, -0.764185] ---- -Label : 1 -Position : [216.04, 1242.34] -Measurements : [1737.25, 425200, -0.407536, -1.10453] ---- -Label : 1 -Position : [969.394, 1242.5] -Measurements : [1244.53, 475935, 0.0207841, -1.55861] ---- -Label : 0 -Position : [131.564, 1242.59] -Measurements : [931.007, 23518.6, -0.398983, -0.302945] ---- -Label : 1 -Position : [1223, 1242.7] -Measurements : [1580.05, 303862, 0.235173, -0.588387] ---- -Label : 1 -Position : [801.236, 1242.73] -Measurements : [1436.53, 186326, -0.0495089, -0.33619] ---- -Label : 1 -Position : [898.721, 1242.73] -Measurements : [1297.07, 548093, 0.576645, -0.684907] ---- -Label : 1 -Position : [841.892, 1242.88] -Measurements : [1765.02, 276807, -0.16917, -1.11542] ---- -Label : 1 -Position : [860.555, 1243.01] -Measurements : [1137.74, 320185, 0.46322, -1.00322] ---- -Label : 1 -Position : [1204.87, 1243.02] -Measurements : [2382.69, 269984, -0.332389, -1.1192] ---- -Label : 1 -Position : [861.824, 1243.37] -Measurements : [1119, 293150, 0.472796, -0.918419] ---- -Label : 1 -Position : [1199.67, 1243.59] -Measurements : [2396.51, 406919, -0.646015, -0.766349] ---- -Label : 1 -Position : [915.992, 1243.62] -Measurements : [908.361, 145896, 0.969562, 0.714171] ---- -Label : 1 -Position : [969.679, 1243.74] -Measurements : [1263.38, 450661, 0.0245447, -1.52338] ---- -Label : 0 -Position : [134.449, 1243.89] -Measurements : [936.617, 24021.8, -0.364755, -0.597952] ---- -Label : 1 -Position : [779.527, 1243.95] -Measurements : [1065.56, 249369, 0.131148, -1.2332] ---- -Label : 1 -Position : [1222.44, 1243.99] -Measurements : [1644.93, 282358, 0.00611915, -0.867025] ---- -Label : 1 -Position : [915.266, 1244.21] -Measurements : [974.785, 182502, 0.897241, 0.38456] ---- -Label : 1 -Position : [1214.09, 1244.56] -Measurements : [2159.01, 165035, 0.208915, -0.211125] ---- -Label : 1 -Position : [1207.06, 1244.65] -Measurements : [2438.12, 240250, -0.469927, -0.684881] ---- -Label : 1 -Position : [898.311, 1244.77] -Measurements : [1520.01, 497180, 0.256235, -0.887349] ---- -Label : 1 -Position : [19.432, 1244.9] -Measurements : [1152.88, 435171, 0.743054, -0.855253] ---- -Label : 1 -Position : [863.482, 1244.97] -Measurements : [1060.45, 262489, 0.596244, -0.994629] ---- -Label : 1 -Position : [1211.42, 1245.06] -Measurements : [2318.13, 238176, -0.118575, -0.564816] ---- -Label : 1 -Position : [863.467, 1245.12] -Measurements : [1110.82, 289337, 0.466025, -1.14926] ---- -Label : 1 -Position : [212.377, 1245.14] -Measurements : [1902.8, 241339, -0.620028, -0.379369] ---- -Label : 1 -Position : [898.864, 1245.17] -Measurements : [1618.2, 435098, 0.190588, -0.806567] ---- -Label : 0 -Position : [168.186, 1245.19] -Measurements : [1064.65, 7322.56, 0.328272, 0.563073] ---- -Label : 1 -Position : [291.038, 1245.22] -Measurements : [984.714, 324931, 1.08294, -0.143452] ---- -Label : 1 -Position : [20.5982, 1245.26] -Measurements : [1322.32, 579161, 0.409905, -1.32241] ---- -Label : 1 -Position : [1221.66, 1245.47] -Measurements : [1699, 251977, -0.222801, -0.634156] ---- -Label : 1 -Position : [18.0231, 1245.57] -Measurements : [1285.78, 541081, 0.506737, -1.17024] ---- -Label : 1 -Position : [838.919, 1245.59] -Measurements : [1833.08, 177023, -0.208719, -0.387439] ---- -Label : 1 -Position : [210.799, 1245.61] -Measurements : [1781, 231927, -0.446551, -0.568587] ---- -Label : 1 -Position : [896.627, 1245.69] -Measurements : [1667.21, 434272, -0.0512293, -0.715904] ---- -Label : 1 -Position : [891.224, 1246.27] -Measurements : [1233.78, 592214, 0.220704, -1.53333] ---- -Label : 1 -Position : [776.355, 1246.29] -Measurements : [1303.16, 248183, -0.365057, -0.864135] ---- -Label : 1 -Position : [799.913, 1246.43] -Measurements : [1366.77, 296133, 0.16384, -0.815227] ---- -Label : 0 -Position : [122.155, 1246.45] -Measurements : [1202.03, 43292.8, -0.825552, 0.087116] ---- -Label : 1 -Position : [896.16, 1246.54] -Measurements : [1767.4, 382927, -0.165061, -0.543131] ---- -Label : 1 -Position : [282.127, 1246.67] -Measurements : [957.635, 257902, 0.414426, -1.20054] ---- -Label : 1 -Position : [1209.15, 1246.75] -Measurements : [2401.75, 303733, -0.453457, -0.588507] ---- -Label : 1 -Position : [967.486, 1246.95] -Measurements : [1160.41, 438712, 0.388608, -1.42383] ---- -Label : 1 -Position : [220.081, 1247.15] -Measurements : [1118.06, 571152, 0.868769, -0.823116] ---- -Label : 1 -Position : [288.463, 1247.23] -Measurements : [1111.55, 288619, 0.522288, -0.920139] ---- -Label : 1 -Position : [805.873, 1247.38] -Measurements : [1109.86, 402200, 0.783666, -0.839501] ---- -Label : 1 -Position : [285.672, 1247.46] -Measurements : [1176.35, 287250, 0.246708, -1.05309] ---- -Label : 1 -Position : [834.215, 1247.54] -Measurements : [1731.9, 256776, -0.627676, 0.146996] ---- -Label : 1 -Position : [859.809, 1247.64] -Measurements : [1383.61, 328618, -0.187224, -1.30354] ---- -Label : 1 -Position : [842.102, 1247.76] -Measurements : [1409.2, 183754, 0.568346, -0.607575] ---- -Label : 1 -Position : [742.35, 1248.15] -Measurements : [1287.64, 318864, -0.0125858, -1.46992] ---- -Label : 1 -Position : [919.708, 1248.24] -Measurements : [1483.8, 322515, -0.102679, -0.438587] ---- -Label : 1 -Position : [1228.82, 1248.27] -Measurements : [2091.18, 397670, -0.606103, -0.961399] ---- -Label : 1 -Position : [741.025, 1248.46] -Measurements : [1323.79, 311335, -0.153769, -1.37594] ---- -Label : 1 -Position : [778.298, 1248.46] -Measurements : [1579.87, 161782, 0.090404, -0.214226] ---- -Label : 1 -Position : [998.672, 1248.46] -Measurements : [684.731, 360047, 2.21223, 3.46351] ---- -Label : 1 -Position : [1215.93, 1248.51] -Measurements : [2010.97, 450985, 0.0196436, -0.435956] ---- -Label : 1 -Position : [836.871, 1248.87] -Measurements : [1821.98, 192820, -0.44287, -0.172729] ---- -Label : 1 -Position : [24.9721, 1248.94] -Measurements : [1711.89, 944472, -0.00861559, -1.56485] ---- -Label : 1 -Position : [771.471, 1248.98] -Measurements : [940.486, 461815, 0.614761, -1.26091] ---- -Label : 1 -Position : [213.992, 1248.99] -Measurements : [1884.12, 234227, -0.706126, 0.348482] ---- -Label : 1 -Position : [836.845, 1249.27] -Measurements : [1823.32, 175264, -0.429781, -0.116832] ---- -Label : 1 -Position : [798.778, 1249.28] -Measurements : [1161.2, 313868, 0.622282, -0.629611] ---- -Label : 1 -Position : [964.289, 1249.31] -Measurements : [1014.56, 301887, 0.484466, -1.17381] ---- -Label : 0 -Position : [126.196, 1249.45] -Measurements : [1154.42, 43557.8, -0.491892, -0.90433] ---- -Label : 1 -Position : [1231.46, 1249.66] -Measurements : [2185.08, 300673, -0.760805, -0.561286] ---- -Label : 1 -Position : [774.339, 1249.8] -Measurements : [1341.07, 479289, -0.206209, -1.28169] ---- -Label : 1 -Position : [835.149, 1249.82] -Measurements : [1842.2, 146143, -0.229768, -0.0816093] ---- -Label : 1 -Position : [895.854, 1250.1] -Measurements : [2043.17, 327401, -0.760018, 0.243777] ---- -Label : 1 -Position : [1227.8, 1250.39] -Measurements : [2035.41, 455928, -0.464992, -1.28888] ---- -Label : 1 -Position : [284.829, 1250.43] -Measurements : [1338.11, 234083, -0.189229, -0.730715] ---- -Label : 1 -Position : [795.306, 1250.79] -Measurements : [1001.59, 182792, 0.542941, -0.786473] ---- -Label : 1 -Position : [280.41, 1251.08] -Measurements : [1279.93, 289634, -0.283567, -1.04502] ---- -Label : 1 -Position : [889.134, 1251.5] -Measurements : [1403.17, 689504, 0.0846717, -1.49233] ---- -Label : 1 -Position : [213.231, 1251.51] -Measurements : [1898.26, 227479, -0.818888, 0.673467] ---- -Label : 0 -Position : [131.08, 1251.59] -Measurements : [1068.91, 54518.2, -0.125231, -1.21105] ---- -Label : 1 -Position : [1255.21, 1251.62] -Measurements : [809.48, 216319, 1.37975, 0.787938] ---- -Label : 1 -Position : [741.171, 1251.74] -Measurements : [1498.39, 164459, -0.205465, -0.77866] ---- -Label : 1 -Position : [994.255, 1251.93] -Measurements : [1353.6, 769906, 0.203548, -1.54386] ---- -Label : 1 -Position : [1247.06, 1252.03] -Measurements : [1352.12, 470873, 0.42204, -1.19798] ---- -Label : 1 -Position : [858.17, 1252.15] -Measurements : [1239.63, 361798, 0.137347, -1.48773] ---- -Label : 1 -Position : [739.716, 1252.19] -Measurements : [1419.02, 171493, 0.0461638, -0.749297] ---- -Label : 1 -Position : [20.968, 1252.58] -Measurements : [2323.47, 397117, -0.570539, -0.34185] ---- -Label : 1 -Position : [282.088, 1252.58] -Measurements : [1425.74, 250745, 0.0803986, -0.622793] ---- -Label : 1 -Position : [1245.1, 1252.62] -Measurements : [1564.4, 393715, -0.0302333, -1.18573] ---- -Label : 1 -Position : [776.25, 1252.97] -Measurements : [1415.54, 343092, 0.00101286, -1.12996] ---- -Label : 1 -Position : [796.754, 1253.13] -Measurements : [1099.52, 346600, 0.669797, -0.738685] ---- -Label : 1 -Position : [919.298, 1253.16] -Measurements : [1740.04, 272901, -0.244013, -0.188017] ---- -Label : 1 -Position : [964.764, 1253.16] -Measurements : [1164.82, 196364, -0.221582, -1.12304] ---- -Label : 1 -Position : [800.747, 1253.32] -Measurements : [1167.87, 386391, 0.685791, -0.814127] ---- -Label : 1 -Position : [834.004, 1253.38] -Measurements : [1808.95, 254158, -0.475557, -0.350112] ---- -Label : 1 -Position : [284.78, 1253.45] -Measurements : [1418.34, 297475, 0.377753, -0.491705] ---- -Label : 1 -Position : [212.456, 1253.6] -Measurements : [1871.4, 149892, -0.658298, 0.660001] ---- -Label : 1 -Position : [993.956, 1253.99] -Measurements : [1546.86, 560871, -0.0527651, -1.22589] ---- -Label : 1 -Position : [893.396, 1254.19] -Measurements : [1960.99, 295063, -0.904191, 0.359902] ---- -Label : 1 -Position : [967.939, 1254.24] -Measurements : [1039.92, 203228, 0.276857, -1.13304] ---- -Label : 1 -Position : [855.455, 1254.29] -Measurements : [1065.32, 284217, 0.395776, -1.15303] ---- -Label : 1 -Position : [17.6999, 1254.29] -Measurements : [2124.75, 311027, -0.0198567, -0.888139] ---- -Label : 1 -Position : [963.952, 1254.34] -Measurements : [1306.4, 168288, -0.21038, -0.309538] ---- -Label : 1 -Position : [1397.09, 1254.5] -Measurements : [1978.58, 475627, 0.527454, -0.552366] ---- -Label : 1 -Position : [1253.25, 1254.53] -Measurements : [873.655, 271370, 1.1682, 0.100972] ---- -Label : 1 -Position : [741.025, 1254.6] -Measurements : [1370.28, 136539, 0.535164, -0.577723] ---- -Label : 1 -Position : [894.181, 1254.72] -Measurements : [1959.17, 293305, -0.815807, -0.0205787] ---- -Label : 1 -Position : [994.717, 1254.97] -Measurements : [1589.52, 539948, -0.0692888, -1.27923] ---- -Label : 1 -Position : [280.04, 1255.14] -Measurements : [1682.6, 238647, -0.393966, 0.256378] ---- -Label : 1 -Position : [210.648, 1255.19] -Measurements : [1632.35, 236906, -0.626587, -0.657645] ---- -Label : 1 -Position : [1258.11, 1255.3] -Measurements : [1033.28, 283631, 0.526914, -0.785717] ---- -Label : 1 -Position : [796.73, 1255.42] -Measurements : [1028.65, 347205, 0.882684, -0.458077] ---- -Label : 1 -Position : [215.983, 1255.56] -Measurements : [1635.83, 315763, -0.599883, -0.900548] ---- -Label : 1 -Position : [889.5, 1255.63] -Measurements : [1567.75, 597446, -0.241598, -1.30015] ---- -Label : 1 -Position : [285.139, 1255.73] -Measurements : [1351.31, 301722, 0.529562, -0.337382] ---- -Label : 1 -Position : [861.634, 1255.74] -Measurements : [865.982, 264823, 1.15112, -0.097197] ---- -Label : 1 -Position : [832.775, 1255.83] -Measurements : [1465.58, 523468, -0.11953, -1.45124] ---- -Label : 1 -Position : [1248.58, 1255.88] -Measurements : [1093.55, 523795, 1.05032, -0.464598] ---- -Label : 1 -Position : [834.79, 1255.9] -Measurements : [1568.81, 441889, -0.295195, -1.21334] ---- -Label : 1 -Position : [914.679, 1256.1] -Measurements : [1550.43, 256988, 0.0884644, -0.328219] ---- -Label : 1 -Position : [836.937, 1256.11] -Measurements : [1464.72, 485482, 0.0467023, -1.49397] ---- -Label : 1 -Position : [920.038, 1256.6] -Measurements : [1415.53, 358529, 0.116888, -0.869241] ---- -Label : 1 -Position : [859.898, 1256.64] -Measurements : [950.642, 273064, 0.700891, -1.03008] ---- -Label : 1 -Position : [83.844, 1256.91] -Measurements : [1098.37, 678677, 0.587056, -1.24661] ---- -Label : 1 -Position : [834.932, 1257.2] -Measurements : [1358.13, 509395, 0.241541, -1.41618] ---- -Label : 1 -Position : [916.022, 1257.25] -Measurements : [1577.41, 261326, -0.104453, -0.318685] ---- -Label : 1 -Position : [909.325, 1257.4] -Measurements : [1132.17, 169953, 0.697982, -0.296762] ---- -Label : 1 -Position : [801.6, 1257.46] -Measurements : [901.677, 294916, 1.53917, 1.18786] ---- -Label : 1 -Position : [28.304, 1257.56] -Measurements : [1911.88, 1.06338e+06, -0.0284124, -1.69962] ---- -Label : 1 -Position : [920.38, 1257.56] -Measurements : [1400.48, 395022, 0.0962397, -1.07264] ---- -Label : 1 -Position : [211.47, 1257.56] -Measurements : [1739.01, 246583, -0.455685, -0.510702] ---- -Label : 1 -Position : [778.193, 1257.82] -Measurements : [1205.55, 300699, 0.847396, -0.256126] ---- -Label : 1 -Position : [910.534, 1257.97] -Measurements : [1227.3, 220119, 0.523979, -0.567578] ---- -Label : 1 -Position : [963.535, 1258.07] -Measurements : [1405.6, 195275, 0.400352, -0.38213] ---- -Label : 1 -Position : [1236.49, 1258.13] -Measurements : [2336.81, 692175, -0.529384, -0.758764] ---- -Label : 1 -Position : [85.2091, 1258.16] -Measurements : [1513.75, 682946, -0.195229, -1.50802] ---- -Label : 1 -Position : [916.107, 1258.22] -Measurements : [1581.97, 261065, -0.121111, -0.336849] ---- -Label : 1 -Position : [1272.41, 1258.46] -Measurements : [1451.77, 342337, 0.413854, -0.932567] ---- -Label : 1 -Position : [737.402, 1258.5] -Measurements : [1069.23, 25067.2, 2.09175, 5.49735] ---- -Label : 1 -Position : [831.051, 1258.51] -Measurements : [1173.1, 472178, 0.526862, -1.06173] ---- -Label : 1 -Position : [1392.5, 1258.63] -Measurements : [2228.93, 326304, -0.0816162, -1.40713] ---- -Label : 1 -Position : [890.529, 1258.7] -Measurements : [1567.02, 604066, -0.162801, -1.3794] ---- -Label : 1 -Position : [990.159, 1258.89] -Measurements : [1689.43, 227558, 0.210985, -0.182801] ---- -Label : 1 -Position : [87.528, 1259.23] -Measurements : [1741.37, 558693, -0.657493, -0.935365] ---- -Label : 1 -Position : [212.968, 1259.23] -Measurements : [1827.59, 242623, -0.094315, -0.435854] ---- -Label : 1 -Position : [774.202, 1259.52] -Measurements : [1064.08, 182308, 0.759521, 0.732401] ---- -Label : 1 -Position : [831.235, 1259.84] -Measurements : [1144.36, 430027, 0.581452, -0.885287] ---- -Label : 1 -Position : [770.459, 1259.88] -Measurements : [948.922, 177271, 0.150379, -0.978193] ---- -Label : 1 -Position : [855.713, 1259.93] -Measurements : [1089.67, 243019, 0.050132, -1.38737] ---- -Label : 1 -Position : [961.46, 1259.93] -Measurements : [1488.74, 245611, 0.335207, -0.882394] ---- -Label : 1 -Position : [1277.75, 1259.95] -Measurements : [1462.48, 212929, 0.561237, -0.302647] ---- -Label : 1 -Position : [777.782, 1259.98] -Measurements : [1052.17, 173258, 1.03168, 1.08609] ---- -Label : 0 -Position : [141.864, 1260.11] -Measurements : [1161.23, 14197.5, -0.856282, 0.146767] ---- -Label : 1 -Position : [891.858, 1260.53] -Measurements : [1371.03, 571419, 0.068168, -1.55675] ---- -Label : 1 -Position : [988.008, 1260.63] -Measurements : [1698.91, 161983, 0.0458537, -0.200945] ---- -Label : 1 -Position : [968.25, 1260.74] -Measurements : [1026.67, 104432, 0.823349, 0.608202] ---- -Label : 1 -Position : [24.552, 1260.77] -Measurements : [1878.79, 902667, -0.0910636, -1.56025] ---- -Label : 1 -Position : [1389.15, 1260.93] -Measurements : [2280.33, 312004, -0.255748, -1.20516] ---- -Label : 1 -Position : [776.543, 1260.97] -Measurements : [1019.25, 122517, 0.488638, -0.334487] ---- -Label : 1 -Position : [1262.19, 1261.26] -Measurements : [1470.99, 306118, 0.474048, -0.398873] ---- -Label : 1 -Position : [1233.54, 1261.45] -Measurements : [2478.92, 755106, -0.435004, -0.86253] ---- -Label : 0 -Position : [162.204, 1261.46] -Measurements : [1024.62, 8851.47, -0.999245, 1.00363] ---- -Label : 1 -Position : [962.306, 1261.76] -Measurements : [1402.54, 251502, 0.618139, -0.659768] ---- -Label : 1 -Position : [913.154, 1262.17] -Measurements : [1471.81, 204942, 0.467327, 0.333337] ---- -Label : 1 -Position : [277.992, 1262.3] -Measurements : [1786.09, 274001, -0.495025, -0.336688] ---- -Label : 1 -Position : [276.954, 1262.42] -Measurements : [1723.27, 321413, -0.710078, -0.23199] ---- -Label : 1 -Position : [858.017, 1262.64] -Measurements : [966.708, 250361, 0.555003, -1.2046] ---- -Label : 1 -Position : [1380.62, 1262.73] -Measurements : [2367.41, 208529, -0.250931, -0.146135] ---- -Label : 1 -Position : [279.011, 1262.75] -Measurements : [1799.52, 301108, -0.466854, -0.633814] ---- -Label : 1 -Position : [855.162, 1262.77] -Measurements : [1215.53, 195811, -0.28758, -1.0922] ---- -Label : 1 -Position : [851.069, 1262.93] -Measurements : [1289.93, 135313, -0.328325, -0.593033] ---- -Label : 1 -Position : [961.328, 1263.05] -Measurements : [1442.31, 229359, 0.425861, -0.617068] ---- -Label : 1 -Position : [1261.39, 1263.09] -Measurements : [1538.63, 348359, 0.114679, -0.898842] ---- -Label : 1 -Position : [1276.14, 1263.09] -Measurements : [1463.62, 225533, 0.491045, -0.586498] ---- -Label : 1 -Position : [853.255, 1263.21] -Measurements : [1320.13, 154674, -0.552602, -0.596894] ---- -Label : 1 -Position : [990.159, 1263.4] -Measurements : [1870.1, 236787, -0.295546, -0.301379] ---- -Label : 1 -Position : [22.5714, 1263.57] -Measurements : [1545.46, 740838, 0.522742, -1.02236] ---- -Label : 1 -Position : [1355.8, 1263.8] -Measurements : [797.289, 65883.1, 0.258388, -1.07459] ---- -Label : 1 -Position : [1232.42, 1263.89] -Measurements : [2440.02, 718967, -0.320991, -0.893494] ---- -Label : 1 -Position : [19.8285, 1264.15] -Measurements : [1283.39, 460026, 0.786823, -0.271953] ---- -Label : 1 -Position : [1263.39, 1264.22] -Measurements : [1746.48, 399371, -0.0778575, -0.905062] ---- -Label : 1 -Position : [957.556, 1264.33] -Measurements : [1537.36, 233231, -0.280746, -0.0402842] ---- -Label : 1 -Position : [831.956, 1264.43] -Measurements : [1095.41, 217123, 0.113882, -1.11371] ---- -Label : 1 -Position : [794.669, 1264.59] -Measurements : [852.248, 248790, 1.14469, -0.174633] ---- -Label : 1 -Position : [1358.51, 1264.77] -Measurements : [927.305, 51318.3, -0.117746, -0.782376] ---- -Label : 1 -Position : [770.926, 1264.84] -Measurements : [1140.39, 125648, -0.177019, 0.274811] ---- -Label : 1 -Position : [215.528, 1264.86] -Measurements : [1940.97, 284119, -0.253913, -0.144384] ---- -Label : 1 -Position : [836.597, 1265.02] -Measurements : [981.066, 140089, 0.629907, -0.361248] ---- -Label : 1 -Position : [1372.02, 1265.18] -Measurements : [1255.18, 275730, 0.221153, -1.24464] ---- -Label : 1 -Position : [1374.9, 1265.41] -Measurements : [1407.62, 410678, 0.292982, -1.04976] ---- -Label : 1 -Position : [1267.13, 1265.54] -Measurements : [1797.68, 347339, -0.0682253, -0.648295] ---- -Label : 1 -Position : [909.892, 1265.66] -Measurements : [1262.16, 190904, -0.236929, -0.991898] ---- -Label : 1 -Position : [1356.12, 1265.76] -Measurements : [828.752, 64321.5, 0.126462, -1.15868] ---- -Label : 1 -Position : [848.874, 1265.89] -Measurements : [1281.12, 148392, -0.17597, -0.815121] ---- -Label : 1 -Position : [87.2103, 1266.14] -Measurements : [1816.03, 371552, -0.583664, -0.689621] ---- -Label : 1 -Position : [211.147, 1266.16] -Measurements : [1463.62, 447437, 0.0565107, -1.24945] ---- -Label : 1 -Position : [1371, 1266.57] -Measurements : [1125.29, 237328, 0.411838, -1.31055] ---- -Label : 1 -Position : [911.516, 1266.67] -Measurements : [1438.42, 170534, -0.275625, -0.264899] ---- -Label : 1 -Position : [1384.73, 1266.8] -Measurements : [2255.6, 452318, -0.187656, -1.04375] ---- -Label : 1 -Position : [1326.89, 1266.96] -Measurements : [1422.6, 356425, 0.90661, 0.245215] ---- -Label : 1 -Position : [988.032, 1267.02] -Measurements : [1720.89, 294120, -0.213187, -0.818371] ---- -Label : 0 -Position : [143.171, 1267.03] -Measurements : [1126.34, 5577.71, 0.00119126, 0.066821] ---- -Label : 1 -Position : [276.633, 1267.24] -Measurements : [1697.35, 293153, -0.316405, -0.794437] ---- -Label : 1 -Position : [989.911, 1267.25] -Measurements : [1739.56, 333620, -0.227823, -0.951713] ---- -Label : 1 -Position : [792.634, 1267.3] -Measurements : [993.373, 277716, 0.672034, -1.04451] ---- -Label : 1 -Position : [956.782, 1267.39] -Measurements : [1493.11, 185979, -0.553917, 0.497812] ---- -Label : 1 -Position : [88.04, 1267.42] -Measurements : [1767.38, 342539, -0.683385, -0.662016] ---- -Label : 1 -Position : [276.968, 1267.42] -Measurements : [1697.35, 293153, -0.316405, -0.794437] ---- -Label : 1 -Position : [218.741, 1267.62] -Measurements : [1396.54, 642949, 0.314594, -1.38164] ---- -Label : 1 -Position : [852.026, 1267.71] -Measurements : [1427.76, 232056, -0.322138, -0.29812] ---- -Label : 1 -Position : [1375.94, 1267.72] -Measurements : [1520.37, 421227, 0.245601, -0.843611] ---- -Label : 1 -Position : [851.033, 1267.74] -Measurements : [1478.78, 203214, -0.30586, -0.020615] ---- -Label : 1 -Position : [1264.87, 1267.85] -Measurements : [1902.4, 311784, -0.272121, -0.387927] ---- -Label : 1 -Position : [1337.96, 1267.87] -Measurements : [1371.52, 495454, 0.828779, -0.641853] ---- -Label : 1 -Position : [959.439, 1267.9] -Measurements : [1518.89, 144257, -0.116293, 0.122405] ---- -Label : 1 -Position : [20.968, 1267.94] -Measurements : [1305.88, 421491, 0.425273, -1.34135] ---- -Label : 1 -Position : [770.269, 1268.25] -Measurements : [1154.15, 61894.7, 0.79354, 3.19206] ---- -Label : 1 -Position : [87.3082, 1268.27] -Measurements : [1643.83, 371150, -0.583751, -0.957718] ---- -Label : 1 -Position : [985.029, 1268.52] -Measurements : [1510.67, 231324, -0.040573, -0.65032] ---- -Label : 1 -Position : [831.137, 1268.53] -Measurements : [1289.83, 128331, -0.0455321, -0.354233] ---- -Label : 1 -Position : [829.7, 1268.6] -Measurements : [1309.19, 144735, -0.394333, -0.229632] ---- -Label : 1 -Position : [1318.33, 1268.66] -Measurements : [1489.87, 430070, 0.558454, -0.690285] ---- -Label : 1 -Position : [215.349, 1269.55] -Measurements : [1348.37, 436328, 0.158105, -1.3495] ---- -Label : 1 -Position : [276.067, 1269.73] -Measurements : [1634.96, 259204, -0.250051, -1.31033] ---- -Label : 1 -Position : [913.98, 1269.74] -Measurements : [1590.94, 303890, 0.268524, -0.436501] ---- -Label : 1 -Position : [916.012, 1269.89] -Measurements : [1322.41, 455273, 0.481862, -0.874612] ---- -Label : 1 -Position : [830.664, 1269.9] -Measurements : [1300.54, 128599, -0.0110866, -0.485615] ---- -Label : 1 -Position : [984.425, 1269.95] -Measurements : [1354.8, 267468, 0.051039, -0.875478] ---- -Label : 1 -Position : [274.408, 1269.98] -Measurements : [1710.64, 220996, -0.607287, -0.680576] ---- -Label : 1 -Position : [790.909, 1270.03] -Measurements : [1009.64, 228475, 0.790661, -0.702848] ---- -Label : 1 -Position : [829.089, 1270.17] -Measurements : [1260.05, 157168, -0.221084, -0.576477] ---- -Label : 1 -Position : [1266.47, 1270.31] -Measurements : [1528.04, 463861, 0.0818214, -0.944515] ---- -Label : 1 -Position : [216.552, 1270.5] -Measurements : [1292.89, 435018, 0.341703, -1.29119] ---- -Label : 1 -Position : [980.25, 1270.53] -Measurements : [971.972, 183987, 0.463825, -0.904142] ---- -Label : 1 -Position : [850.388, 1270.58] -Measurements : [1791.48, 305852, 0.236115, -0.435699] ---- -Label : 1 -Position : [272.602, 1270.59] -Measurements : [1709.99, 221587, -0.83505, 0.0882693] ---- -Label : 1 -Position : [1341.51, 1270.61] -Measurements : [1636.54, 876339, 0.406497, -1.34153] ---- -Label : 1 -Position : [1339.22, 1270.87] -Measurements : [1672.11, 821933, 0.411704, -1.28192] ---- -Label : 1 -Position : [882.049, 1270.97] -Measurements : [730.39, 291352, 1.49659, 0.77032] ---- -Label : 1 -Position : [915.274, 1271.38] -Measurements : [1415.48, 483783, 0.322776, -1.11401] ---- -Label : 1 -Position : [1330.2, 1271.69] -Measurements : [1883.21, 734004, 0.20238, -1.38058] ---- -Label : 1 -Position : [87.8088, 1271.74] -Measurements : [1409.39, 485721, -0.0731958, -1.42397] ---- -Label : 1 -Position : [849.929, 1271.89] -Measurements : [1864.68, 346751, 0.145787, -0.555148] ---- -Label : 1 -Position : [843.19, 1271.93] -Measurements : [1304.97, 427993, 1.18084, 0.251304] ---- -Label : 1 -Position : [912.335, 1272] -Measurements : [1676.71, 318031, 0.0110329, -0.679424] ---- -Label : 1 -Position : [833.846, 1272.01] -Measurements : [1154.08, 111580, 0.451155, 0.0667646] ---- -Label : 1 -Position : [217.268, 1272.16] -Measurements : [1273.29, 497893, 0.610457, -1.01856] ---- -Label : 1 -Position : [20.1124, 1272.48] -Measurements : [1518.92, 434892, -0.0169752, -1.60539] ---- -Label : 1 -Position : [824.266, 1272.59] -Measurements : [843.047, 220276, 0.856368, -0.413498] ---- -Label : 0 -Position : [155.044, 1272.63] -Measurements : [998.884, 9513.87, -0.615159, -1.08871] ---- -Label : 1 -Position : [87.7067, 1272.71] -Measurements : [1258.22, 481950, 0.229136, -1.36867] ---- -Label : 1 -Position : [1321.6, 1272.92] -Measurements : [1535.69, 372124, 0.323465, -0.853967] ---- -Label : 1 -Position : [271.795, 1272.92] -Measurements : [1717.79, 191248, -0.775414, -0.0244705] ---- -Label : 1 -Position : [1319.38, 1273.82] -Measurements : [1733.55, 579491, 0.254928, -1.03958] ---- -Label : 1 -Position : [272.18, 1273.97] -Measurements : [1688.14, 207070, -0.614185, -0.601518] ---- -Label : 1 -Position : [956.982, 1274.05] -Measurements : [1401.2, 322769, -0.458076, -1.20576] ---- -Label : 1 -Position : [888.481, 1274.08] -Measurements : [938.682, 279865, 0.983311, -0.0747808] ---- -Label : 1 -Position : [1031.94, 1274.46] -Measurements : [1513.22, 286206, -0.609127, -0.540951] ---- -Label : 1 -Position : [1334.49, 1274.66] -Measurements : [1957.52, 880910, -0.112217, -1.50568] ---- -Label : 1 -Position : [847.111, 1275.08] -Measurements : [1983.82, 444925, -0.334283, -0.835614] ---- -Label : 1 -Position : [884.385, 1275.08] -Measurements : [1246.37, 323448, 0.0199728, -1.2167] ---- -Label : 1 -Position : [91.112, 1275.1] -Measurements : [1171.22, 397123, 0.631661, -0.986173] ---- -Label : 1 -Position : [855.084, 1275.5] -Measurements : [1314.45, 718846, 0.560956, -1.25662] ---- -Label : 1 -Position : [958.968, 1276.2] -Measurements : [1262.02, 393797, -0.0187911, -1.60684] ---- -Label : 1 -Position : [846.588, 1276.28] -Measurements : [1896.2, 528793, -0.199987, -1.21472] ---- -Label : 1 -Position : [1030.64, 1276.46] -Measurements : [1598.17, 156800, -0.109607, -0.760337] ---- -Label : 0 -Position : [128.04, 1276.49] -Measurements : [991.299, 7790.14, 0.064431, -0.870962] ---- -Label : 1 -Position : [270.312, 1276.64] -Measurements : [1593.83, 167078, -0.457771, -0.818316] ---- -Label : 1 -Position : [908.649, 1276.91] -Measurements : [1711.3, 353313, -0.0488718, -0.944461] ---- -Label : 1 -Position : [887.404, 1277.37] -Measurements : [1249.65, 262145, 0.185639, -0.900697] ---- -Label : 0 -Position : [129.743, 1277.84] -Measurements : [1003.63, 7396.67, -0.209893, -1.03153] ---- -Label : 1 -Position : [1030.17, 1277.91] -Measurements : [1580.75, 146128, 0.0477945, -0.799761] ---- -Label : 1 -Position : [274.75, 1277.93] -Measurements : [1297.25, 250047, 0.484192, -1.08746] ---- -Label : 1 -Position : [957.019, 1278.06] -Measurements : [1040.58, 459401, 0.576061, -1.43294] ---- -Label : 1 -Position : [1035.07, 1278.09] -Measurements : [1308.67, 237155, 0.492969, -0.964064] ---- -Label : 1 -Position : [216.04, 1278.18] -Measurements : [1466.14, 301373, 0.242406, -0.86261] ---- -Label : 1 -Position : [845.997, 1278.49] -Measurements : [1694.7, 656378, 0.0389483, -1.39865] ---- -Label : 0 -Position : [147.283, 1278.52] -Measurements : [1004.62, 10409.4, -0.395005, -0.081651] ---- -Label : 1 -Position : [1028.66, 1278.55] -Measurements : [1501.99, 134401, -0.113138, 0.0213176] ---- -Label : 1 -Position : [1312.18, 1278.65] -Measurements : [2170.1, 460425, 0.00151945, -1.37389] ---- -Label : 1 -Position : [220.876, 1279.07] -Measurements : [1343.88, 464903, 0.384356, -1.15198] ---- -Label : 1 -Position : [887.442, 1279.07] -Measurements : [1373.82, 278442, 0.461498, -0.587649] ---- -Label : 1 -Position : [885.585, 1279.15] -Measurements : [1500.34, 254637, 0.156553, -0.71584] ---- -Label : 1 -Position : [268.394, 1279.16] -Measurements : [1546.53, 177055, -0.0186647, -0.696369] ---- -Label : 1 -Position : [211.056, 1279.61] -Measurements : [1261.95, 131954, 0.423172, -0.969613] ---- -Label : 1 -Position : [903.99, 1279.7] -Measurements : [1184.96, 251650, 0.422302, -0.378776] ---- -Label : 1 -Position : [1028.73, 1279.84] -Measurements : [1498.25, 107090, 0.112483, -0.219468] ---- -Label : 1 -Position : [821.212, 1279.97] -Measurements : [584.705, 75054.7, 2.47731, 5.77632] ---- -Label : 1 -Position : [884.794, 1280] -Measurements : [1551.68, 227235, 0.0728988, -0.574533] ---- -Label : 1 -Position : [1027.8, 1280.05] -Measurements : [1496.35, 79258, -0.183097, 0.0157085] ---- -Label : 1 -Position : [1052.41, 1280.26] -Measurements : [692.831, 123755, 0.87654, -0.506265] ---- -Label : 1 -Position : [847.111, 1280.41] -Measurements : [1675.81, 718393, 0.0118482, -1.38391] ---- -Label : 1 -Position : [31.5608, 1280.81] -Measurements : [1074.84, 519498, 1.13997, -0.281376] ---- -Label : 1 -Position : [30.86, 1280.87] -Measurements : [1158.96, 534948, 0.9088, -0.781694] ---- -Label : 1 -Position : [1311.38, 1280.97] -Measurements : [2190.12, 534243, -0.0713197, -1.45898] ---- -Label : 1 -Position : [904.631, 1281.38] -Measurements : [1110.87, 311620, 0.560807, -0.429911] ---- -Label : 1 -Position : [265.704, 1281.76] -Measurements : [1605.43, 290249, -0.197736, -0.743859] ---- -Label : 1 -Position : [980.738, 1281.83] -Measurements : [1217.45, 301303, -0.0627685, -1.23875] ---- -Label : 1 -Position : [263.58, 1281.92] -Measurements : [1562.99, 354345, -0.324655, -0.787033] ---- -Label : 1 -Position : [905.633, 1281.98] -Measurements : [1198.26, 347487, 0.538262, -0.35413] ---- -Label : 0 -Position : [138.748, 1282] -Measurements : [1078.39, 4122.25, -1.31527, 2.95209] ---- -Label : 1 -Position : [845.776, 1282.08] -Measurements : [1226.5, 593189, 0.744271, -0.893227] ---- -Label : 1 -Position : [1053.11, 1282.15] -Measurements : [883.654, 208383, 0.55272, -0.935005] ---- -Label : 1 -Position : [983.482, 1282.32] -Measurements : [1189.96, 385567, 0.354785, -1.20446] ---- -Label : 1 -Position : [905.782, 1282.65] -Measurements : [1088.53, 308535, 0.641278, -0.167966] ---- -Label : 1 -Position : [267.892, 1282.85] -Measurements : [1587.21, 295656, 0.321701, -0.924107] ---- -Label : 1 -Position : [882.746, 1282.87] -Measurements : [1620.12, 270193, -0.00614568, -0.732935] ---- -Label : 1 -Position : [880.472, 1283.03] -Measurements : [1629.69, 382163, -0.283007, -0.797636] ---- -Label : 1 -Position : [979.726, 1283.3] -Measurements : [1552.01, 289379, -0.0322378, -0.50485] ---- -Label : 1 -Position : [1316.15, 1283.34] -Measurements : [2019.45, 652099, -0.119188, -1.3273] ---- -Label : 1 -Position : [1027.43, 1283.88] -Measurements : [1588.91, 142617, 0.0784781, 0.0895234] ---- -Label : 1 -Position : [1052.3, 1284.23] -Measurements : [1116.56, 250040, 0.359402, -0.953017] ---- -Label : 1 -Position : [28.648, 1284.32] -Measurements : [1369.61, 504197, 0.496128, -1.29258] ---- -Label : 1 -Position : [975.996, 1284.45] -Measurements : [1456.06, 226183, 0.106559, -0.349473] ---- -Label : 1 -Position : [824.993, 1284.5] -Measurements : [777.24, 101012, 0.645523, -0.0665529] ---- -Label : 1 -Position : [1051.27, 1284.83] -Measurements : [1097.76, 250196, 0.450734, -0.915886] ---- -Label : 1 -Position : [263.144, 1284.83] -Measurements : [1797.54, 346579, 0.00165704, -0.597132] ---- -Label : 1 -Position : [821.972, 1285.1] -Measurements : [803.352, 86063, 0.527319, 0.176368] ---- -Label : 1 -Position : [849.633, 1285.16] -Measurements : [969.021, 412674, 1.30352, 0.523496] ---- -Label : 0 -Position : [149.084, 1285.89] -Measurements : [937.225, 14747.5, 0.690499, -0.914493] ---- -Label : 1 -Position : [902.142, 1286.4] -Measurements : [764.617, 134051, 0.805115, -0.849881] ---- -Label : 1 -Position : [979.775, 1286.55] -Measurements : [1692.08, 202153, -0.222333, 0.223186] ---- -Label : 1 -Position : [1051.77, 1286.75] -Measurements : [1197.8, 211037, 0.23475, -0.806127] ---- -Label : 1 -Position : [842.606, 1286.96] -Measurements : [763.475, 108156, 1.50014, 2.19371] ---- -Label : 1 -Position : [258.976, 1287.05] -Measurements : [1336.58, 616761, 0.448759, -1.17947] ---- -Label : 1 -Position : [881.824, 1287.12] -Measurements : [1554.23, 492880, -0.103141, -1.32353] ---- -Label : 1 -Position : [1055.29, 1287.86] -Measurements : [1206.71, 259315, 0.257619, -0.948606] ---- -Label : 1 -Position : [979.22, 1288.14] -Measurements : [1734.56, 221384, -0.481802, 0.104913] ---- -Label : 1 -Position : [1052.3, 1288.29] -Measurements : [1371.44, 218768, 0.402421, -0.376686] ---- -Label : 1 -Position : [1029.72, 1288.3] -Measurements : [1321.65, 313501, 0.272091, -0.930014] ---- -Label : 1 -Position : [879.47, 1288.6] -Measurements : [1362.79, 616098, 0.193422, -1.50539] ---- -Label : 1 -Position : [1030.22, 1288.62] -Measurements : [1263.72, 288958, 0.481594, -0.715563] ---- -Label : 1 -Position : [245.326, 1288.87] -Measurements : [919.186, 242214, 0.262161, -1.57769] ---- -Label : 1 -Position : [847.105, 1289.01] -Measurements : [618.814, 67529.9, 2.39973, 5.69829] ---- -Label : 1 -Position : [1026.2, 1289.2] -Measurements : [1307.15, 419216, 0.134594, -1.27735] ---- -Label : 1 -Position : [257.613, 1289.41] -Measurements : [1213.13, 514020, 0.530758, -1.20613] ---- -Label : 1 -Position : [262.12, 1289.44] -Measurements : [1504.81, 631578, 0.177676, -1.35678] ---- -Label : 1 -Position : [1029.37, 1289.65] -Measurements : [1239.88, 342466, 0.452851, -0.882981] ---- -Label : 1 -Position : [883.894, 1291.42] -Measurements : [1113.42, 481308, 0.955155, -0.43973] ---- -Label : 1 -Position : [1050.66, 1291.57] -Measurements : [1452.92, 269077, -0.0365557, -0.611046] ---- -Label : 1 -Position : [1048, 1291.74] -Measurements : [1332.31, 239550, 0.0927713, -0.789175] ---- -Label : 1 -Position : [947.826, 1291.87] -Measurements : [1284.8, 442684, -0.045098, -1.29949] ---- -Label : 1 -Position : [247.784, 1292.51] -Measurements : [1189.18, 147835, -0.331024, -0.800488] ---- -Label : 1 -Position : [234.432, 1292.69] -Measurements : [784.546, 174269, 0.863796, -0.492083] ---- -Label : 1 -Position : [976.908, 1292.69] -Measurements : [1814.38, 105590, -0.0835875, 0.619116] ---- -Label : 1 -Position : [972.332, 1292.73] -Measurements : [1521.5, 219603, -0.555199, -0.674268] ---- -Label : 0 -Position : [129.859, 1292.76] -Measurements : [1101.52, 4788.56, -0.57896, 2.62287] ---- -Label : 1 -Position : [243.619, 1293.22] -Measurements : [1205.13, 114724, -0.496095, -0.772061] ---- -Label : 1 -Position : [952.219, 1293.29] -Measurements : [1203.54, 372327, 0.325149, -1.04675] ---- -Label : 1 -Position : [266.455, 1293.42] -Measurements : [1091.52, 342609, 1.79936, 3.39022] ---- -Label : 1 -Position : [899.823, 1293.5] -Measurements : [1230.89, 273047, 0.189006, -0.938034] ---- -Label : 1 -Position : [981.806, 1293.51] -Measurements : [1493.08, 358657, -0.161643, -1.11082] ---- -Label : 1 -Position : [241.128, 1293.54] -Measurements : [1189.55, 127694, -0.330533, -0.951602] ---- -Label : 1 -Position : [251.88, 1293.54] -Measurements : [1161.08, 224081, 0.321028, -1.06579] ---- -Label : 1 -Position : [904.409, 1293.92] -Measurements : [1270.29, 332790, 0.0623967, -1.29094] ---- -Label : 1 -Position : [1046.2, 1294.07] -Measurements : [1401.63, 352376, 0.289789, -0.802118] ---- -Label : 1 -Position : [231.646, 1294.63] -Measurements : [625.734, 84893.5, 1.40675, 0.786302] ---- -Label : 1 -Position : [242.785, 1295.22] -Measurements : [1201.73, 114580, -0.222575, -1.07302] ---- -Label : 1 -Position : [944.165, 1295.72] -Measurements : [1274.46, 297008, 0.135623, -0.748177] ---- -Label : 1 -Position : [235.496, 1296.1] -Measurements : [914.635, 160515, 0.579154, -0.723332] ---- -Label : 1 -Position : [1052.76, 1296.35] -Measurements : [1481.06, 484212, 0.189049, -1.26211] ---- -Label : 1 -Position : [1020.76, 1296.49] -Measurements : [1123.55, 275943, 0.0951406, -1.25244] ---- -Label : 1 -Position : [1017.42, 1296.52] -Measurements : [1112.06, 306191, 0.105569, -1.32919] ---- -Label : 1 -Position : [1278.33, 1296.57] -Measurements : [1080.19, 323320, 0.213425, -1.06319] ---- -Label : 1 -Position : [943.056, 1296.81] -Measurements : [1169.21, 294729, 0.372983, -0.743316] ---- -Label : 1 -Position : [903.626, 1296.95] -Measurements : [1500.36, 247677, -0.23278, -0.886629] ---- -Label : 1 -Position : [900.722, 1297.2] -Measurements : [1605.72, 253697, -0.164983, -0.436129] ---- -Label : 1 -Position : [1109.2, 1297.33] -Measurements : [664.282, 220213, 1.26221, 0.033141] ---- -Label : 1 -Position : [948.646, 1297.61] -Measurements : [1424.45, 228712, 0.262428, -0.431817] ---- -Label : 1 -Position : [1048.2, 1297.71] -Measurements : [1635.77, 363263, 0.00734187, -1.0482] ---- -Label : 1 -Position : [1024.04, 1297.85] -Measurements : [942.811, 231741, 0.602363, -1.05447] ---- -Label : 1 -Position : [902.728, 1297.86] -Measurements : [1574.79, 288975, -0.16999, -0.733606] ---- -Label : 1 -Position : [980.837, 1298.09] -Measurements : [1512.38, 290944, -0.262152, -1.09098] ---- -Label : 1 -Position : [254.458, 1298.11] -Measurements : [1016.3, 150699, 1.47541, 1.93021] ---- -Label : 1 -Position : [241.451, 1298.22] -Measurements : [1106.94, 92663.9, 0.389068, -0.54831] ---- -Label : 1 -Position : [943.898, 1298.38] -Measurements : [1312.01, 404374, 0.671227, -0.272285] ---- -Label : 1 -Position : [249.409, 1298.41] -Measurements : [1055.93, 119827, 1.20531, 1.66093] ---- -Label : 1 -Position : [876.193, 1298.43] -Measurements : [1111.02, 375501, 0.251819, -1.26465] ---- -Label : 1 -Position : [1095.77, 1298.56] -Measurements : [868.841, 522024, 1.18092, -0.100358] ---- -Label : 1 -Position : [977.318, 1299.25] -Measurements : [1659.96, 167972, -0.402616, 0.00383845] ---- -Label : 1 -Position : [1279, 1299.54] -Measurements : [1197.4, 312665, 0.201561, -1.01274] ---- -Label : 1 -Position : [1016.34, 1299.64] -Measurements : [1289.29, 259736, -0.126745, -0.912542] ---- -Label : 1 -Position : [1107.46, 1299.67] -Measurements : [973.579, 389147, 0.366617, -1.37815] ---- -Label : 1 -Position : [1017.76, 1299.76] -Measurements : [1340.19, 226188, -0.159394, -0.784173] ---- -Label : 1 -Position : [975.329, 1299.96] -Measurements : [1644.75, 117759, -0.0282118, -0.109477] ---- -Label : 1 -Position : [899.731, 1300.02] -Measurements : [1759.81, 252505, 0.264865, -0.246757] ---- -Label : 1 -Position : [876.954, 1300.08] -Measurements : [1400.31, 402736, -0.0257444, -0.864611] ---- -Label : 1 -Position : [1278.17, 1300.19] -Measurements : [1151.09, 352506, 0.229328, -1.16205] ---- -Label : 1 -Position : [1303.35, 1300.31] -Measurements : [1247.42, 364716, 0.749556, -0.406762] ---- -Label : 1 -Position : [1303.03, 1300.68] -Measurements : [1247.42, 364716, 0.749556, -0.406762] ---- -Label : 1 -Position : [873.989, 1300.86] -Measurements : [1393.78, 402490, -0.0772356, -0.855223] ---- -Label : 1 -Position : [872.429, 1301.3] -Measurements : [1463.42, 392224, -0.185586, -0.916678] ---- -Label : 1 -Position : [1106.36, 1301.81] -Measurements : [1176.02, 329423, -0.0908292, -1.18279] ---- -Label : 1 -Position : [1090.74, 1302.65] -Measurements : [1602.41, 383050, -0.500256, -0.769327] ---- -Label : 1 -Position : [978.946, 1302.68] -Measurements : [1461.16, 276998, -0.0681581, -0.901551] ---- -Label : 1 -Position : [1092.44, 1303.04] -Measurements : [1698.65, 358681, -0.764296, -0.361357] ---- -Label : 1 -Position : [901.658, 1303.49] -Measurements : [1625.82, 458929, -0.151398, -1.01566] ---- -Label : 1 -Position : [1287.62, 1303.63] -Measurements : [1594.12, 405681, -0.0167183, -1.14954] ---- -Label : 1 -Position : [1021.17, 1303.73] -Measurements : [1293.88, 184891, 0.35287, -0.836941] ---- -Label : 1 -Position : [1020.76, 1303.86] -Measurements : [1359.71, 214893, 0.371214, -0.818615] ---- -Label : 1 -Position : [64.5144, 1303.97] -Measurements : [1963.91, 250748, -0.758677, 0.0597732] ---- -Label : 1 -Position : [897.036, 1304.16] -Measurements : [1770.24, 215962, 0.413377, 0.0899878] ---- -Label : 1 -Position : [1296.11, 1304.27] -Measurements : [1932.16, 281025, -0.504242, -0.651714] ---- -Label : 1 -Position : [975.679, 1304.57] -Measurements : [1385.1, 153055, -0.225421, -0.351467] ---- -Label : 1 -Position : [1016.08, 1304.8] -Measurements : [1387.8, 255431, 0.100429, -0.956067] ---- -Label : 1 -Position : [876.146, 1304.98] -Measurements : [1843.93, 315213, 0.0379573, -0.771951] ---- -Label : 1 -Position : [69.173, 1305.07] -Measurements : [2000.06, 395692, -0.428954, -0.505336] ---- -Label : 1 -Position : [222.84, 1305.14] -Measurements : [1075.16, 146844, 0.0414129, -0.744638] ---- -Label : 1 -Position : [1307.68, 1305.28] -Measurements : [938.427, 121598, 0.816699, -0.150508] ---- -Label : 1 -Position : [1089.63, 1305.57] -Measurements : [1678.54, 410824, -0.545004, -0.940127] ---- -Label : 1 -Position : [1048.54, 1305.7] -Measurements : [1792.35, 686658, -0.0542441, -1.33292] ---- -Label : 1 -Position : [203.531, 1305.81] -Measurements : [1279.7, 191392, 0.829117, 0.359532] ---- -Label : 1 -Position : [1046.56, 1305.91] -Measurements : [1773.79, 639600, 0.0380616, -1.24927] ---- -Label : 1 -Position : [1287.42, 1306.03] -Measurements : [1612.31, 414251, 0.00757947, -1.15186] ---- -Label : 1 -Position : [898.521, 1306.13] -Measurements : [1711.11, 311933, -0.0518588, -0.231079] ---- -Label : 1 -Position : [1046.17, 1306.74] -Measurements : [1753.3, 651650, 0.0661669, -1.23661] ---- -Label : 1 -Position : [1045.45, 1307.01] -Measurements : [1700.51, 625055, 0.0962782, -1.19543] ---- -Label : 1 -Position : [942.911, 1307.03] -Measurements : [1821.26, 457168, -0.167818, -1.26576] ---- -Label : 1 -Position : [891.46, 1307.07] -Measurements : [1356.31, 180761, 0.0181037, -1.12644] ---- -Label : 1 -Position : [1115.72, 1307.13] -Measurements : [877.471, 221693, 0.31113, -1.49547] ---- -Label : 1 -Position : [1287.2, 1307.32] -Measurements : [1616.54, 417166, 0.00516001, -1.16522] ---- -Label : 1 -Position : [1297.44, 1307.32] -Measurements : [1844.23, 459064, -0.448991, -1.13823] ---- -Label : 1 -Position : [1119.08, 1307.41] -Measurements : [572.121, 122755, 1.76644, 1.57128] ---- -Label : 1 -Position : [968.716, 1307.44] -Measurements : [1122.78, 243379, -0.082707, -1.55788] ---- -Label : 1 -Position : [71.144, 1307.87] -Measurements : [1874.11, 478684, -0.0578206, -1.00147] ---- -Label : 1 -Position : [1019.94, 1307.95] -Measurements : [1437.86, 287350, 0.344329, -1.03668] ---- -Label : 1 -Position : [893.499, 1308.17] -Measurements : [1601.11, 224758, -0.0473255, -0.164566] ---- -Label : 1 -Position : [874.918, 1308.26] -Measurements : [2001.01, 269378, -0.462906, -0.385251] ---- -Label : 1 -Position : [895.398, 1308.26] -Measurements : [1702.74, 217549, -0.0173452, -0.193424] ---- -Label : 1 -Position : [63.464, 1308.38] -Measurements : [2091.74, 177450, -0.605216, -0.167407] ---- -Label : 1 -Position : [52.9436, 1308.58] -Measurements : [2396.48, 243525, -0.655844, -0.187843] ---- -Label : 1 -Position : [977.276, 1308.87] -Measurements : [947.372, 199620, 0.656709, -1.18114] ---- -Label : 1 -Position : [204.776, 1308.9] -Measurements : [1268.92, 287573, 0.5939, -0.569668] ---- -Label : 1 -Position : [205.458, 1309.39] -Measurements : [1178.51, 355079, 0.601239, -0.811588] ---- -Label : 1 -Position : [1300.06, 1309.61] -Measurements : [1547.19, 606793, 0.180677, -1.66337] ---- -Label : 1 -Position : [880.849, 1309.69] -Measurements : [1446.04, 301160, 1.12097, 0.0218886] ---- -Label : 1 -Position : [899.513, 1309.78] -Measurements : [1554.62, 436688, -0.0295516, -1.01249] ---- -Label : 1 -Position : [971.311, 1309.91] -Measurements : [1020.75, 258859, 0.25137, -1.58033] ---- -Label : 1 -Position : [52.712, 1309.92] -Measurements : [2489.45, 219399, -0.697646, -0.117475] ---- -Label : 1 -Position : [221.16, 1309.92] -Measurements : [1231.95, 319143, 0.184855, -0.929334] ---- -Label : 1 -Position : [1092.03, 1310] -Measurements : [1830.11, 182334, -0.727102, 0.373403] ---- -Label : 1 -Position : [944.084, 1310.26] -Measurements : [1611.3, 361606, 0.112868, -0.98271] ---- -Label : 1 -Position : [37.1531, 1310.74] -Measurements : [1818.07, 347091, -0.0132461, -1.35249] ---- -Label : 1 -Position : [944.37, 1311.09] -Measurements : [1468.89, 326165, 0.26123, -0.97454] ---- -Label : 1 -Position : [871.231, 1311.12] -Measurements : [1917.48, 296230, -0.537008, 0.0507425] ---- -Label : 1 -Position : [876.025, 1311.28] -Measurements : [1741.13, 411771, 0.108182, -1.38274] ---- -Label : 1 -Position : [71.9168, 1311.3] -Measurements : [1754.99, 444855, 0.343359, -0.740937] ---- -Label : 1 -Position : [970.319, 1311.52] -Measurements : [834.653, 246444, 0.989766, -0.631592] ---- -Label : 1 -Position : [38.7906, 1311.54] -Measurements : [1930.26, 331406, -0.187449, -1.26945] ---- -Label : 1 -Position : [939.61, 1311.54] -Measurements : [1132.66, 349886, 0.744953, -0.275352] ---- -Label : 1 -Position : [1041.65, 1311.64] -Measurements : [1359.79, 309708, 0.199126, -0.684238] ---- -Label : 1 -Position : [1013.51, 1311.84] -Measurements : [1400.59, 554639, 0.06974, -1.41732] ---- -Label : 1 -Position : [1016.46, 1311.9] -Measurements : [1577.26, 407891, -0.0390692, -1.13643] ---- -Label : 1 -Position : [1116.6, 1312.05] -Measurements : [1258.37, 364290, 0.0737243, -0.960195] ---- -Label : 1 -Position : [1091.4, 1312.26] -Measurements : [1807.8, 192872, -0.583877, -0.0512258] ---- -Label : 1 -Position : [219.056, 1312.27] -Measurements : [1432.78, 404600, -0.143565, -1.06002] ---- -Label : 1 -Position : [870.611, 1312.33] -Measurements : [1814.56, 390739, -0.452088, -0.499928] ---- -Label : 1 -Position : [893.759, 1312.35] -Measurements : [1780.37, 197400, -0.0722917, 0.448701] ---- -Label : 1 -Position : [877.092, 1312.56] -Measurements : [1562.26, 413992, 0.588014, -1.01357] ---- -Label : 1 -Position : [224.568, 1312.62] -Measurements : [1348.31, 227152, 0.51743, -0.564394] ---- -Label : 1 -Position : [60.9692, 1312.65] -Measurements : [2092.48, 268651, -0.18664, -0.315039] ---- -Label : 1 -Position : [1015.43, 1312.87] -Measurements : [1481.93, 489326, 0.0581409, -1.31392] ---- -Label : 1 -Position : [47.6352, 1313.1] -Measurements : [2422.46, 310526, -1.00005, 0.241473] ---- -Label : 1 -Position : [220.108, 1313.97] -Measurements : [1521.66, 352754, -0.0880711, -0.960449] ---- -Label : 1 -Position : [52.4728, 1314.26] -Measurements : [2257.54, 555768, -0.656299, -0.82843] ---- -Label : 1 -Position : [873.182, 1314.51] -Measurements : [1635.64, 347752, -0.0966372, -1.25582] ---- -Label : 1 -Position : [1090.8, 1314.51] -Measurements : [1759.43, 230099, -0.601054, -0.174954] ---- -Label : 1 -Position : [44.52, 1314.53] -Measurements : [2294.61, 290795, -0.731813, -0.0650435] ---- -Label : 1 -Position : [875.18, 1314.79] -Measurements : [1564.48, 364534, 0.178236, -1.3786] ---- -Label : 1 -Position : [941.682, 1314.81] -Measurements : [981.848, 178299, 0.344346, -1.13886] ---- -Label : 1 -Position : [1089.79, 1314.94] -Measurements : [1709.32, 233326, -0.579034, -0.312489] ---- -Label : 1 -Position : [37.352, 1315.04] -Measurements : [1717.94, 356852, 0.294923, -1.27952] ---- -Label : 1 -Position : [220.136, 1315.04] -Measurements : [1596.44, 320048, -0.0372491, -1.14698] ---- -Label : 1 -Position : [892.448, 1315.17] -Measurements : [1693.19, 281184, -0.209503, -0.33508] ---- -Label : 1 -Position : [44.5377, 1315.27] -Measurements : [2193.27, 419334, -0.689739, -0.504618] ---- -Label : 1 -Position : [890.586, 1315.32] -Measurements : [1556, 302679, -0.00125402, -0.758852] ---- -Label : 1 -Position : [1036.08, 1315.38] -Measurements : [1274.77, 330210, 0.294655, -1.02092] ---- -Label : 1 -Position : [870.822, 1315.63] -Measurements : [1511.51, 445933, -0.225569, -1.3706] ---- -Label : 1 -Position : [946.35, 1316] -Measurements : [914.94, 139810, 0.637199, -0.743085] ---- -Label : 1 -Position : [1090.58, 1316.25] -Measurements : [1717.1, 188884, -0.713842, 0.0164106] ---- -Label : 1 -Position : [1042.99, 1316.36] -Measurements : [1589.96, 257704, -0.350439, -0.670034] ---- -Label : 1 -Position : [215.102, 1317.07] -Measurements : [1697.26, 456729, -0.453818, -0.429782] ---- -Label : 1 -Position : [1110.03, 1317.51] -Measurements : [1078.43, 231753, 0.526966, -0.899589] ---- -Label : 1 -Position : [214.016, 1317.56] -Measurements : [1622, 506725, -0.301859, -0.772521] ---- -Label : 1 -Position : [891.302, 1317.68] -Measurements : [1559.72, 365709, 0.0457323, -0.988123] ---- -Label : 1 -Position : [1086.98, 1317.8] -Measurements : [1552.81, 266504, -0.531659, -0.428131] ---- -Label : 1 -Position : [887.466, 1318.56] -Measurements : [1208.13, 216550, 0.710414, -0.443342] ---- -Label : 1 -Position : [1039.6, 1318.6] -Measurements : [1651.32, 248948, -0.404652, -0.645923] ---- -Label : 1 -Position : [941.802, 1318.71] -Measurements : [913.476, 193404, 0.511469, -1.267] ---- -Label : 1 -Position : [941.932, 1319.08] -Measurements : [924.102, 220751, 0.724954, -0.684596] ---- -Label : 1 -Position : [217.576, 1319.65] -Measurements : [1823.71, 417133, 0.127804, -0.86612] ---- -Label : 1 -Position : [869.549, 1319.83] -Measurements : [1080.1, 369406, 0.874968, -0.571578] ---- -Label : 1 -Position : [1087.52, 1320.24] -Measurements : [1698.86, 201962, -0.15985, -0.337135] ---- -Label : 1 -Position : [1043.74, 1320.38] -Measurements : [1497.44, 401010, -0.21268, -1.3805] ---- -Label : 1 -Position : [1114.14, 1321.06] -Measurements : [1350.95, 181017, -0.14243, -1.10173] ---- -Label : 1 -Position : [212.968, 1321.7] -Measurements : [1776.1, 616859, -0.309671, -0.945149] ---- -Label : 1 -Position : [1085.11, 1322.19] -Measurements : [1645.56, 314442, -0.450896, -0.564527] ---- -Label : 1 -Position : [937.586, 1322.59] -Measurements : [1119.32, 256289, 0.264803, -1.19099] ---- -Label : 1 -Position : [220.624, 1322.68] -Measurements : [1333.74, 331630, 1.023, -0.422394] ---- -Label : 1 -Position : [1113.23, 1322.78] -Measurements : [1356.74, 187156, -0.277567, -1.1924] ---- -Label : 1 -Position : [1084.08, 1323.55] -Measurements : [1543.34, 396985, -0.24635, -1.02168] ---- -Label : 1 -Position : [1034.64, 1323.62] -Measurements : [1247.68, 232300, 0.158599, -0.886861] ---- -Label : 1 -Position : [1040.78, 1324.01] -Measurements : [1646.53, 275005, -0.254766, -0.755246] ---- -Label : 1 -Position : [962.501, 1324.12] -Measurements : [1188.32, 418831, 0.295935, -0.90213] ---- -Label : 1 -Position : [885.503, 1324.22] -Measurements : [1339.04, 335668, 0.646289, -1.07745] ---- -Label : 1 -Position : [1036.66, 1324.26] -Measurements : [1521.52, 249289, 0.155506, -0.6279] ---- -Label : 1 -Position : [1038.78, 1324.34] -Measurements : [1648.71, 228938, 0.0062626, -0.786374] ---- -Label : 1 -Position : [1085.06, 1324.34] -Measurements : [1577.87, 336021, -0.145536, -0.915619] ---- -Label : 1 -Position : [1108.77, 1324.37] -Measurements : [1188.77, 195140, 0.0129395, -1.20501] ---- -Label : 1 -Position : [212.055, 1324.41] -Measurements : [1869.87, 502797, -0.228788, -0.763631] ---- -Label : 1 -Position : [1109.74, 1324.93] -Measurements : [1241.67, 204417, -0.089655, -1.11295] ---- -Label : 1 -Position : [959.621, 1325.05] -Measurements : [1160.3, 227966, -0.113435, -1.1584] ---- -Label : 1 -Position : [1109.23, 1325.16] -Measurements : [1253, 197803, -0.122267, -1.04868] ---- -Label : 1 -Position : [212.572, 1325.19] -Measurements : [1867.71, 479306, -0.119474, -0.837442] ---- -Label : 1 -Position : [1082.65, 1325.2] -Measurements : [1355.99, 379338, 0.252832, -0.797388] ---- -Label : 1 -Position : [962.572, 1325.46] -Measurements : [1301.02, 382402, 0.0394973, -0.819866] ---- -Label : 1 -Position : [888.025, 1326.28] -Measurements : [1691.27, 420564, 0.235849, -0.969007] ---- -Label : 1 -Position : [1041.87, 1326.64] -Measurements : [1583.87, 375788, -0.235487, -1.00124] ---- -Label : 1 -Position : [1005.87, 1326.64] -Measurements : [767.13, 196445, 0.773894, -0.989564] ---- -Label : 1 -Position : [890.448, 1327.09] -Measurements : [1776.79, 420014, 0.15671, -1.06311] ---- -Label : 1 -Position : [1010.11, 1328.02] -Measurements : [1034.87, 208061, -0.161357, -1.38112] ---- -Label : 1 -Position : [962.021, 1328.41] -Measurements : [1687.99, 234360, 0.0141727, -0.411767] ---- -Label : 1 -Position : [1036.73, 1328.43] -Measurements : [1750.04, 259453, 0.0946967, -0.883668] ---- -Label : 1 -Position : [203.632, 1328.66] -Measurements : [1066.95, 434547, 0.302328, -1.57838] ---- -Label : 1 -Position : [1005.66, 1328.82] -Measurements : [927.061, 251058, 0.274468, -1.52142] ---- -Label : 1 -Position : [1083.83, 1328.84] -Measurements : [1453.46, 235202, 0.428073, -0.185369] ---- -Label : 1 -Position : [1083.83, 1329.25] -Measurements : [1472.37, 186843, 0.336424, -0.325738] ---- -Label : 1 -Position : [202.951, 1329.32] -Measurements : [1031.45, 417980, 0.38989, -1.47656] ---- -Label : 1 -Position : [210.92, 1329.38] -Measurements : [1682.02, 403155, 0.0554528, -0.913074] ---- -Label : 1 -Position : [205.732, 1329.62] -Measurements : [1392.06, 421998, -0.342022, -1.27645] ---- -Label : 1 -Position : [936.019, 1329.95] -Measurements : [1037.7, 216098, 0.598226, -0.73039] ---- -Label : 1 -Position : [200.546, 1330.55] -Measurements : [916.041, 389195, 0.73859, -1.00794] ---- -Label : 1 -Position : [930.207, 1331.09] -Measurements : [833.478, 137570, 0.680452, -0.65201] ---- -Label : 1 -Position : [961.343, 1331.6] -Measurements : [1615.36, 216538, 0.267333, -0.630965] ---- -Label : 1 -Position : [208.36, 1331.94] -Measurements : [1533.87, 383342, 0.0817045, -0.981815] ---- -Label : 1 -Position : [211.104, 1332] -Measurements : [1434.25, 382381, 0.528883, -0.908814] ---- -Label : 1 -Position : [1107.18, 1332.12] -Measurements : [1488.82, 182643, -0.128261, -0.592243] ---- -Label : 1 -Position : [1082.76, 1332.38] -Measurements : [1311.58, 166648, -0.0332113, 0.0124142] ---- -Label : 1 -Position : [1086.17, 1332.4] -Measurements : [1306.43, 134188, 0.327458, -0.299825] ---- -Label : 1 -Position : [935.129, 1332.42] -Measurements : [963.229, 116310, 0.44043, -0.954927] ---- -Label : 1 -Position : [1088.2, 1332.79] -Measurements : [1232.9, 107412, 0.599771, 0.0705997] ---- -Label : 1 -Position : [1031.61, 1332.82] -Measurements : [1411.46, 394940, 0.349675, -0.597819] ---- -Label : 1 -Position : [204.776, 1332.96] -Measurements : [1415.48, 312966, -0.393476, -1.11989] ---- -Label : 1 -Position : [1081.38, 1333.35] -Measurements : [1218.72, 202133, -0.297212, -0.809967] ---- -Label : 1 -Position : [1086.57, 1333.55] -Measurements : [1252.11, 148525, 0.174646, -0.431307] ---- -Label : 1 -Position : [1010.11, 1333.76] -Measurements : [1338.37, 142730, -0.37403, -0.740992] ---- -Label : 1 -Position : [1035.91, 1333.76] -Measurements : [1895.88, 379316, 0.0541412, -0.369077] ---- -Label : 1 -Position : [1011.92, 1333.77] -Measurements : [1294.03, 144761, -0.183736, -0.896126] ---- -Label : 1 -Position : [1007.17, 1334.09] -Measurements : [1414.44, 174034, -0.602613, -0.24203] ---- -Label : 1 -Position : [1014.34, 1334.09] -Measurements : [1101.03, 96307.8, 0.189611, -0.766939] ---- -Label : 1 -Position : [1082.31, 1334.24] -Measurements : [1155.18, 199033, -0.324596, -1.3479] ---- -Label : 1 -Position : [198.004, 1335.02] -Measurements : [1176.41, 398729, 0.00739016, -1.51755] ---- -Label : 1 -Position : [205.008, 1335.25] -Measurements : [1347.55, 267229, 0.160481, -1.42401] ---- -Label : 1 -Position : [964.443, 1335.33] -Measurements : [1415.62, 326990, 0.053222, -0.967151] ---- -Label : 1 -Position : [954.461, 1335.52] -Measurements : [1050.63, 98191.3, 0.288471, -0.468764] ---- -Label : 1 -Position : [200.68, 1335.52] -Measurements : [1305.33, 339941, -0.236251, -1.28093] ---- -Label : 1 -Position : [1080.43, 1335.71] -Measurements : [1075.66, 243875, -0.121086, -1.62054] ---- -Label : 1 -Position : [202.606, 1335.85] -Measurements : [1387.93, 284884, -0.262247, -1.21935] ---- -Label : 1 -Position : [1010.68, 1336.06] -Measurements : [1327.47, 167515, -0.237885, -0.913615] ---- -Label : 1 -Position : [1104.71, 1336.29] -Measurements : [1392.99, 213359, -0.331121, -0.548384] ---- -Label : 1 -Position : [1037.82, 1336.4] -Measurements : [1842.17, 531701, -0.167324, -0.914085] ---- -Label : 1 -Position : [1111.1, 1336.5] -Measurements : [1260.47, 387608, 0.214244, -1.4822] ---- -Label : 1 -Position : [934.956, 1336.65] -Measurements : [1130.51, 135065, 0.379975, -0.239017] ---- -Label : 1 -Position : [201.317, 1337.28] -Measurements : [1403.75, 285657, -0.101102, -1.19929] ---- -Label : 1 -Position : [1106.36, 1338.26] -Measurements : [1493.63, 187347, -0.197667, -0.594758] ---- -Label : 1 -Position : [198.12, 1338.59] -Measurements : [1371.62, 364326, -0.196164, -1.18324] ---- -Label : 1 -Position : [1007.24, 1338.67] -Measurements : [1467.74, 159950, -0.324834, -0.785349] ---- -Label : 1 -Position : [958.066, 1338.98] -Measurements : [1468.65, 156102, 0.261484, -0.727416] ---- -Label : 1 -Position : [1005.61, 1339.2] -Measurements : [1522.85, 165111, -0.490292, -0.491183] ---- -Label : 1 -Position : [934.31, 1339.39] -Measurements : [1134.29, 167900, 0.335453, -0.820453] ---- -Label : 1 -Position : [1027.08, 1339.54] -Measurements : [1254.46, 204678, 0.49336, -0.469979] ---- -Label : 1 -Position : [961.115, 1339.65] -Measurements : [1454.56, 179069, -0.115474, -0.587089] ---- -Label : 1 -Position : [1030.59, 1339.9] -Measurements : [1500.28, 282772, 0.373387, -0.581496] ---- -Label : 1 -Position : [1076.42, 1340.93] -Measurements : [1086.82, 424972, 0.495136, -1.06757] ---- -Label : 1 -Position : [1101.75, 1341.08] -Measurements : [1186.92, 234980, 0.0104893, -1.29114] ---- -Label : 1 -Position : [1006.9, 1341.49] -Measurements : [1531.96, 184549, -0.439923, -0.819245] ---- -Label : 1 -Position : [1105.19, 1341.53] -Measurements : [1417.8, 206917, -0.333818, -0.868903] ---- -Label : 1 -Position : [196.908, 1341.56] -Measurements : [1391.56, 379297, -0.315684, -1.1364] ---- -Label : 1 -Position : [928.389, 1341.71] -Measurements : [966.719, 160637, 0.114591, -1.08712] ---- -Label : 1 -Position : [931.876, 1341.75] -Measurements : [1082.87, 152359, 0.0190296, -0.952794] ---- -Label : 1 -Position : [956.528, 1341.84] -Measurements : [1475.74, 214437, -0.0808765, -0.790369] ---- -Label : 1 -Position : [958.066, 1341.84] -Measurements : [1554.55, 200191, -0.203989, -0.838431] ---- -Label : 1 -Position : [1104.72, 1342.77] -Measurements : [1312.89, 258570, -0.215759, -1.22044] ---- -Label : 1 -Position : [1003.96, 1343.18] -Measurements : [1711.76, 219450, -0.653427, 0.101185] ---- -Label : 1 -Position : [195.56, 1343.2] -Measurements : [1430.41, 420351, -0.175269, -1.10667] ---- -Label : 1 -Position : [199.066, 1343.26] -Measurements : [1308.5, 307133, 0.410709, -1.15532] ---- -Label : 1 -Position : [1077.28, 1343.59] -Measurements : [1413.36, 410465, -0.18025, -1.10319] ---- -Label : 1 -Position : [1027.78, 1343.75] -Measurements : [1474.19, 381456, 0.320688, -0.865835] ---- -Label : 1 -Position : [931.852, 1344.3] -Measurements : [1180.13, 86288, 0.300817, -0.455208] ---- -Label : 1 -Position : [1029.77, 1344.41] -Measurements : [1672.23, 368575, 0.10691, -0.97739] ---- -Label : 1 -Position : [187.798, 1344.84] -Measurements : [766.17, 380279, 1.33126, 0.25942] ---- -Label : 1 -Position : [1005.35, 1346.01] -Measurements : [1753.23, 319899, -0.373227, -0.853522] ---- -Label : 1 -Position : [1103.55, 1346.15] -Measurements : [927.715, 322546, 0.700054, -1.08091] ---- -Label : 1 -Position : [1030.78, 1346.28] -Measurements : [1642.54, 377454, 0.153002, -0.963774] ---- -Label : 1 -Position : [955.199, 1346.35] -Measurements : [1677.91, 209809, -0.144251, -0.655183] ---- -Label : 1 -Position : [193.757, 1346.38] -Measurements : [1524.22, 433222, -0.289101, -1.08446] ---- -Label : 1 -Position : [194.45, 1346.41] -Measurements : [1513.46, 423640, -0.172241, -1.20138] ---- -Label : 1 -Position : [1079.75, 1346.63] -Measurements : [1599, 250273, -0.337679, -0.25206] ---- -Label : 1 -Position : [962.652, 1346.66] -Measurements : [1301.35, 487098, 0.25086, -1.44225] ---- -Label : 1 -Position : [1026.74, 1346.72] -Measurements : [1430.11, 284626, 0.481911, -0.219725] ---- -Label : 1 -Position : [191.903, 1346.89] -Measurements : [1414.96, 511919, -0.193563, -1.28437] ---- -Label : 1 -Position : [1103.97, 1347.07] -Measurements : [837.351, 314036, 1.04937, -0.48434] ---- -Label : 1 -Position : [953.134, 1347.5] -Measurements : [1562.99, 234177, -0.184157, -0.84746] ---- -Label : 1 -Position : [951.017, 1347.61] -Measurements : [1334.72, 270887, 0.12313, -1.07814] ---- -Label : 1 -Position : [930.032, 1347.76] -Measurements : [1179.15, 62709, 0.787222, 0.379866] ---- -Label : 1 -Position : [1075.06, 1347.83] -Measurements : [1500.15, 178217, -0.185162, -0.0376738] ---- -Label : 1 -Position : [1076.46, 1348.91] -Measurements : [1552.56, 190178, 0.0781478, -0.0661939] ---- -Label : 1 -Position : [998.434, 1349.05] -Measurements : [1597.79, 478159, -0.318914, -1.16057] ---- -Label : 1 -Position : [190.764, 1349.28] -Measurements : [1468.86, 358433, -0.13488, -0.7986] ---- -Label : 1 -Position : [1002.32, 1349.32] -Measurements : [1964.24, 214191, -0.630874, -0.318155] ---- -Label : 1 -Position : [195.151, 1349.72] -Measurements : [1386.04, 372566, 0.406746, -1.24631] ---- -Label : 1 -Position : [1007.11, 1350.31] -Measurements : [1655.7, 426894, 0.0381281, -1.40369] ---- -Label : 1 -Position : [954.79, 1351.26] -Measurements : [1398.96, 381571, -0.0266855, -1.26696] ---- -Label : 1 -Position : [1026.9, 1352.19] -Measurements : [1502.91, 233766, 0.246975, -0.0219934] ---- -Label : 1 -Position : [1022.5, 1352.22] -Measurements : [1294.98, 184964, 0.0286022, -0.521713] ---- -Label : 1 -Position : [1003.58, 1352.48] -Measurements : [1881.56, 318137, -0.2688, -1.22873] ---- -Label : 1 -Position : [188.39, 1352.6] -Measurements : [1393.1, 310796, 0.168832, -0.630014] ---- -Label : 1 -Position : [1000.69, 1352.6] -Measurements : [1815.09, 350378, -0.300662, -0.902512] ---- -Label : 1 -Position : [959.379, 1353] -Measurements : [1067.63, 408215, 0.761021, -0.893085] ---- -Label : 1 -Position : [1072.81, 1353.02] -Measurements : [1366.2, 189996, -0.764581, -0.391958] ---- -Label : 1 -Position : [956.435, 1353.16] -Measurements : [1196.01, 397855, 0.382504, -1.24667] ---- -Label : 1 -Position : [1185.12, 1353.31] -Measurements : [753.949, 186336, 0.593775, -1.14592] ---- -Label : 1 -Position : [1073.18, 1353.42] -Measurements : [1411.63, 158037, -0.850258, -0.0751179] ---- -Label : 1 -Position : [1024.81, 1353.75] -Measurements : [1455.4, 176964, -0.0422201, -0.470655] ---- -Label : 1 -Position : [1149.31, 1354.14] -Measurements : [821.773, 187973, 0.612616, -0.710248] ---- -Label : 1 -Position : [1184.19, 1355.01] -Measurements : [953.618, 234215, 0.290703, -0.954065] ---- -Label : 1 -Position : [182.124, 1355.23] -Measurements : [842.557, 225318, 0.535452, -1.19607] ---- -Label : 1 -Position : [1184.71, 1355.23] -Measurements : [953.618, 234215, 0.290703, -0.954065] ---- -Label : 1 -Position : [1024.92, 1355.93] -Measurements : [1467.53, 167820, 0.0242755, -0.542963] ---- -Label : 1 -Position : [1150.25, 1356.21] -Measurements : [977.626, 172943, 0.101855, -0.931218] ---- -Label : 1 -Position : [184.21, 1356.24] -Measurements : [968.651, 188089, 0.249335, -0.922126] ---- -Label : 1 -Position : [1151.83, 1356.29] -Measurements : [973.282, 180168, 0.0667811, -0.998109] ---- -Label : 1 -Position : [1024.03, 1357.11] -Measurements : [1484.26, 172589, 0.155084, -0.827578] ---- -Label : 1 -Position : [1100.34, 1357.4] -Measurements : [1106.35, 299674, -0.0810147, -1.52512] ---- -Label : 1 -Position : [1097.35, 1357.93] -Measurements : [1131.1, 260119, -0.198241, -1.29917] ---- -Label : 1 -Position : [1075.61, 1357.95] -Measurements : [1394.87, 236344, -0.254585, -1.133] ---- -Label : 1 -Position : [1076.57, 1358.09] -Measurements : [1297.11, 289487, 0.013206, -1.44407] ---- -Label : 1 -Position : [1025.8, 1358.2] -Measurements : [1494.99, 181646, 0.10445, -0.839606] ---- -Label : 1 -Position : [1075.55, 1358.32] -Measurements : [1331.63, 282864, -0.132641, -1.38113] ---- -Label : 1 -Position : [1100.97, 1358.59] -Measurements : [1208.42, 279292, -0.244758, -1.35779] ---- -Label : 1 -Position : [1001.79, 1358.93] -Measurements : [1690.19, 297700, 0.117575, -0.952567] ---- -Label : 1 -Position : [1022.94, 1358.99] -Measurements : [1385.21, 178032, 0.304549, -0.562026] ---- -Label : 1 -Position : [993.733, 1359.47] -Measurements : [971.489, 414647, 0.842298, -0.664308] ---- -Label : 1 -Position : [999.866, 1359.56] -Measurements : [1631.14, 380547, -0.196531, -0.879983] ---- -Label : 1 -Position : [1070.94, 1359.89] -Measurements : [1100.93, 380884, 0.278185, -1.50769] ---- -Label : 1 -Position : [1153.2, 1360.6] -Measurements : [1205.67, 164683, -0.0187007, -0.817942] ---- -Label : 1 -Position : [998.862, 1360.93] -Measurements : [1607.86, 416249, -0.247642, -0.935206] ---- -Label : 1 -Position : [1153.37, 1361.04] -Measurements : [1277.85, 165326, -0.117376, -0.889717] ---- -Label : 1 -Position : [1072.78, 1361.2] -Measurements : [1088.75, 337198, 0.428055, -1.32598] ---- -Label : 1 -Position : [1184.46, 1361.65] -Measurements : [1803.66, 424299, 0.249264, -0.85302] ---- -Label : 1 -Position : [1099.1, 1361.77] -Measurements : [1505.52, 176025, -0.338427, -0.529592] ---- -Label : 1 -Position : [1025.24, 1362.2] -Measurements : [1418.88, 222432, 0.268715, -0.958194] ---- -Label : 1 -Position : [1095.71, 1362.43] -Measurements : [1481.55, 200900, -0.406638, -0.424187] ---- -Label : 1 -Position : [1021.98, 1362.8] -Measurements : [1327.14, 210877, 0.462766, -0.537684] ---- -Label : 1 -Position : [1181.32, 1364.02] -Measurements : [1878.69, 345188, 0.0477768, -0.566984] ---- -Label : 1 -Position : [996.59, 1364.07] -Measurements : [1720.79, 341476, -0.68393, -0.265323] ---- -Label : 1 -Position : [1016.23, 1364.75] -Measurements : [1096.47, 176590, 0.787439, 0.0655558] ---- -Label : 1 -Position : [1302.98, 1364.84] -Measurements : [867.585, 284755, 1.08671, 0.299825] ---- -Label : 1 -Position : [184.644, 1365.19] -Measurements : [936.212, 120838, 1.53389, 1.92177] ---- -Label : 1 -Position : [180.114, 1365.25] -Measurements : [1142.42, 296578, 0.766775, -0.0976057] ---- -Label : 1 -Position : [1149.78, 1365.25] -Measurements : [1571.08, 192387, -0.0894727, -0.575235] ---- -Label : 1 -Position : [177.998, 1365.36] -Measurements : [1160.89, 370657, 0.354042, -0.803761] ---- -Label : 1 -Position : [1017.56, 1365.38] -Measurements : [1225.36, 226767, 0.314942, -0.853632] ---- -Label : 1 -Position : [1307.82, 1365.39] -Measurements : [822.402, 232789, 1.56415, 1.74868] ---- -Label : 1 -Position : [1073.67, 1365.49] -Measurements : [946.061, 260971, 0.993882, -0.29622] ---- -Label : 1 -Position : [1092.71, 1365.8] -Measurements : [1536.53, 293731, 0.0273829, -0.65317] ---- -Label : 1 -Position : [1088.52, 1365.93] -Measurements : [1219.66, 266961, 0.722213, -0.0842241] ---- -Label : 1 -Position : [1020.76, 1366.48] -Measurements : [1430.08, 214155, -0.117515, -0.672] ---- -Label : 1 -Position : [1174, 1366.72] -Measurements : [1375.9, 345637, 0.113011, -1.06138] ---- -Label : 1 -Position : [1067.24, 1366.73] -Measurements : [965.522, 260123, 0.343479, -1.47959] ---- -Label : 1 -Position : [1183.54, 1366.8] -Measurements : [1910.46, 492821, -0.409365, -0.855105] ---- -Label : 1 -Position : [1088.67, 1367.19] -Measurements : [1173.67, 298480, 0.720606, -0.295204] ---- -Label : 1 -Position : [1153.35, 1367.19] -Measurements : [1595.63, 419111, -0.0411243, -1.09396] ---- -Label : 1 -Position : [1092.03, 1367.3] -Measurements : [1477.61, 355314, 0.013439, -0.95761] ---- -Label : 1 -Position : [1176.72, 1367.76] -Measurements : [1700, 335349, -0.390805, -0.730935] ---- -Label : 1 -Position : [1298.04, 1368.25] -Measurements : [682.765, 268536, 1.87527, 2.5242] ---- -Label : 1 -Position : [998.743, 1368.45] -Measurements : [1856.1, 239627, -0.54793, -0.789999] ---- -Label : 1 -Position : [177.657, 1368.53] -Measurements : [1355.55, 278715, 0.19252, -0.600856] ---- -Label : 1 -Position : [995.77, 1368.53] -Measurements : [1867.98, 236956, -1.04351, 0.794239] ---- -Label : 1 -Position : [1069.5, 1368.53] -Measurements : [1059.71, 255647, 0.160926, -1.54322] ---- -Label : 1 -Position : [992.358, 1368.77] -Measurements : [1571.75, 418141, -0.5873, -0.947838] ---- -Label : 1 -Position : [177.235, 1369.09] -Measurements : [1375.14, 251553, 0.306837, -0.487] ---- -Label : 1 -Position : [179.391, 1369.16] -Measurements : [1292.91, 245143, 0.803953, -0.316779] ---- -Label : 1 -Position : [179.593, 1369.62] -Measurements : [1292.91, 245143, 0.803953, -0.316779] ---- -Label : 1 -Position : [1069.21, 1369.67] -Measurements : [1150.15, 265769, 0.109308, -1.24753] ---- -Label : 1 -Position : [1178.87, 1369.76] -Measurements : [1935.54, 314627, -0.416534, -0.717754] ---- -Label : 1 -Position : [155.11, 1370.43] -Measurements : [898.497, 83665.5, 0.809224, 1.13075] ---- -Label : 1 -Position : [173.97, 1370.58] -Measurements : [1146.17, 388341, 0.421906, -0.915549] ---- -Label : 1 -Position : [1148.96, 1370.58] -Measurements : [1864.5, 251316, -0.37612, 0.161728] ---- -Label : 1 -Position : [1062.24, 1371.33] -Measurements : [1182.58, 326935, -0.0871565, -1.26764] ---- -Label : 1 -Position : [1018.3, 1371.4] -Measurements : [1652.24, 124859, -0.716329, 0.307692] ---- -Label : 1 -Position : [1022.01, 1371.63] -Measurements : [1560.68, 225751, -0.707548, -0.415069] ---- -Label : 1 -Position : [993.255, 1371.68] -Measurements : [1887.18, 233264, -0.873702, 0.621119] ---- -Label : 1 -Position : [1092.45, 1372.39] -Measurements : [1397.61, 433966, 0.199129, -1.22151] ---- -Label : 1 -Position : [998.701, 1372.75] -Measurements : [1694.68, 326766, -0.139148, -1.31076] ---- -Label : 1 -Position : [178.51, 1372.92] -Measurements : [1251.96, 241711, 1.0048, 0.00686376] ---- -Label : 1 -Position : [1066.63, 1373.04] -Measurements : [1534.44, 199772, -0.348793, 0.0111119] ---- -Label : 1 -Position : [995.662, 1373.35] -Measurements : [1861.08, 269298, -0.733931, -0.33968] ---- -Label : 1 -Position : [1147.15, 1373.51] -Measurements : [1943.46, 207606, -0.554311, 0.345599] ---- -Label : 1 -Position : [1016.76, 1373.71] -Measurements : [1636.35, 174565, -0.847295, 0.210384] ---- -Label : 1 -Position : [154.31, 1374.26] -Measurements : [851.446, 102360, 0.760562, 0.493657] ---- -Label : 1 -Position : [993.722, 1374.26] -Measurements : [1884.84, 266969, -0.844671, 0.18332] ---- -Label : 1 -Position : [1017.94, 1374.4] -Measurements : [1738.95, 127092, -0.490263, 0.0571056] ---- -Label : 1 -Position : [1088.77, 1374.71] -Measurements : [1251.6, 331486, 0.559561, -0.490234] ---- -Label : 1 -Position : [991.037, 1374.89] -Measurements : [1820.27, 310665, -0.883694, 0.196792] ---- -Label : 1 -Position : [1176, 1375.49] -Measurements : [2045.03, 230201, -0.497997, 0.0569878] ---- -Label : 1 -Position : [1147.73, 1375.9] -Measurements : [1950.53, 206992, -0.553765, 0.299728] ---- -Label : 1 -Position : [161.571, 1375.94] -Measurements : [766.396, 324712, 1.67905, 2.02554] ---- -Label : 1 -Position : [1151.55, 1376.26] -Measurements : [1900.42, 361863, -0.530857, -0.904881] ---- -Label : 1 -Position : [1089.98, 1376.31] -Measurements : [1311.23, 275586, 0.425736, -0.400587] ---- -Label : 1 -Position : [1144.68, 1376.63] -Measurements : [1704.26, 264833, -0.418202, -0.472335] ---- -Label : 1 -Position : [1015.84, 1376.72] -Measurements : [1532.33, 208836, -0.348124, -0.61448] ---- -Label : 1 -Position : [1013.24, 1377.12] -Measurements : [1358.12, 195154, -0.199751, -0.913695] ---- -Label : 1 -Position : [1178.47, 1377.19] -Measurements : [1959.73, 449950, -0.621468, -0.687523] ---- -Label : 1 -Position : [1141.49, 1377.97] -Measurements : [1333.61, 328045, -0.20812, -1.1193] ---- -Label : 1 -Position : [153.198, 1378.61] -Measurements : [656.227, 64945.2, 0.759967, -0.903768] ---- -Label : 1 -Position : [991.265, 1378.77] -Measurements : [1794.4, 276768, -0.338358, -0.845714] ---- -Label : 1 -Position : [1062.94, 1378.77] -Measurements : [1398.69, 432334, 0.0389976, -1.26124] ---- -Label : 1 -Position : [991.969, 1379.05] -Measurements : [1705.55, 317140, -0.145849, -1.05466] ---- -Label : 1 -Position : [1179.28, 1379.54] -Measurements : [1734.93, 608911, -0.139491, -1.38664] ---- -Label : 1 -Position : [989.916, 1379.6] -Measurements : [1698, 305147, -0.386229, -0.827094] ---- -Label : 1 -Position : [1173.95, 1380] -Measurements : [1726.45, 375725, -0.438284, -0.500703] ---- -Label : 1 -Position : [1090.42, 1380.25] -Measurements : [1371.35, 265996, 0.378799, -0.57978] ---- -Label : 1 -Position : [162.092, 1380.41] -Measurements : [1132.17, 434529, 0.627327, -0.659126] ---- -Label : 1 -Position : [166.188, 1380.82] -Measurements : [1172.68, 358293, 0.883996, -0.207957] ---- -Label : 1 -Position : [170.85, 1380.84] -Measurements : [964.773, 282651, 1.98103, 2.99222] ---- -Label : 1 -Position : [1170.51, 1381.17] -Measurements : [1235.98, 464100, 0.0746034, -1.71099] ---- -Label : 1 -Position : [1087.11, 1381.23] -Measurements : [1236.34, 215612, 0.658555, 0.216557] ---- -Label : 1 -Position : [159.308, 1381.58] -Measurements : [877.895, 292959, 0.844727, -0.480249] ---- -Label : 1 -Position : [1063.62, 1381.62] -Measurements : [1205.71, 492456, 0.448215, -1.263] ---- -Label : 1 -Position : [1144.86, 1381.64] -Measurements : [1889.67, 218673, -1.00638, 0.631386] ---- -Label : 1 -Position : [1063.67, 1381.69] -Measurements : [1205.71, 492456, 0.448215, -1.263] ---- -Label : 1 -Position : [1173.72, 1382.07] -Measurements : [1350.14, 457072, -0.0540226, -1.6479] ---- -Label : 1 -Position : [993.497, 1382.12] -Measurements : [1363.32, 271723, 0.570036, -0.815521] ---- -Label : 1 -Position : [164.967, 1382.53] -Measurements : [1255.64, 327034, 0.712949, -0.294942] ---- -Label : 1 -Position : [1013.38, 1383.28] -Measurements : [1136.54, 306071, 0.279356, -1.30131] ---- -Label : 1 -Position : [988.807, 1384.1] -Measurements : [1391.93, 242040, 0.735717, -0.738857] ---- -Label : 1 -Position : [158.379, 1384.11] -Measurements : [809.824, 244179, 0.914108, -0.243215] ---- -Label : 1 -Position : [1138.24, 1384.59] -Measurements : [1401.05, 546060, -0.0265815, -1.46583] ---- -Label : 1 -Position : [159.225, 1384.91] -Measurements : [878.321, 267152, 0.787482, -0.430444] ---- -Label : 1 -Position : [1010, 1384.95] -Measurements : [909.582, 225923, 0.749187, -0.903175] ---- -Label : 1 -Position : [169.118, 1385.32] -Measurements : [936.153, 208541, 2.61297, 6.13453] ---- -Label : 1 -Position : [1011.11, 1385.77] -Measurements : [871.412, 247884, 0.929244, -0.632586] ---- -Label : 1 -Position : [1147.86, 1385.85] -Measurements : [1804.06, 369755, -0.634474, -0.839687] ---- -Label : 1 -Position : [1083.74, 1385.86] -Measurements : [1039.81, 114759, -0.16334, -1.03408] ---- -Label : 1 -Position : [1089.75, 1386.58] -Measurements : [1153.2, 123729, -0.131298, -0.974438] ---- -Label : 1 -Position : [1137.8, 1387.08] -Measurements : [1129, 528683, 0.620096, -1.1659] ---- -Label : 1 -Position : [1088.97, 1387.48] -Measurements : [1192.95, 126224, -0.0182112, -0.73282] ---- -Label : 1 -Position : [1173.41, 1387.8] -Measurements : [1093.9, 308364, 0.441249, -1.20178] ---- -Label : 1 -Position : [1086.7, 1388.19] -Measurements : [1255.24, 130257, 0.343242, -0.020842] ---- -Label : 1 -Position : [1142, 1388.19] -Measurements : [1561.03, 613464, -0.202352, -1.61665] ---- -Label : 1 -Position : [1169.04, 1390.65] -Measurements : [1192.66, 242162, 0.122252, -0.982615] ---- -Label : 1 -Position : [1088.41, 1390.81] -Measurements : [1258.22, 162981, 0.174248, -0.3389] ---- -Label : 1 -Position : [137.839, 1390.99] -Measurements : [1023.5, 190082, 0.947116, 0.347867] ---- -Label : 1 -Position : [1058.01, 1391.07] -Measurements : [1080.69, 368579, 0.101656, -1.49106] ---- -Label : 1 -Position : [135.893, 1391.39] -Measurements : [1064.06, 166593, 1.02346, 0.679916] ---- -Label : 1 -Position : [1089.22, 1391.41] -Measurements : [1201.15, 206593, 0.199094, -0.71187] ---- -Label : 1 -Position : [1085.06, 1391.47] -Measurements : [1411.72, 149262, -0.205306, -0.163591] ---- -Label : 1 -Position : [1173.37, 1391.51] -Measurements : [1094.93, 221983, 0.31752, -1.22651] ---- -Label : 1 -Position : [136.697, 1391.88] -Measurements : [1031.84, 182707, 1.0036, 0.463269] ---- -Label : 1 -Position : [1059.67, 1391.88] -Measurements : [1063.22, 371497, 0.161157, -1.50979] ---- -Label : 1 -Position : [155.129, 1392.29] -Measurements : [941.025, 259222, 0.453849, -1.27346] ---- -Label : 1 -Position : [148.844, 1392.64] -Measurements : [873.434, 304059, 0.582619, -1.26325] ---- -Label : 1 -Position : [157.979, 1394.63] -Measurements : [893.001, 169323, 0.741747, -0.732229] ---- -Label : 1 -Position : [1167.46, 1394.77] -Measurements : [1595.33, 204390, -0.260359, -0.802122] ---- -Label : 1 -Position : [153.867, 1395.69] -Measurements : [1155.01, 220069, 0.0415576, -1.0836] ---- -Label : 1 -Position : [151.852, 1395.97] -Measurements : [1233.48, 261589, -0.161204, -0.906199] ---- -Label : 1 -Position : [1056.69, 1396.66] -Measurements : [1538.99, 186069, -0.567154, -0.290382] ---- -Label : 1 -Position : [1164.94, 1397.2] -Measurements : [1549.25, 162773, 0.153652, -0.686134] ---- -Label : 1 -Position : [153.418, 1397.74] -Measurements : [1189.11, 169365, 0.221753, -0.832834] ---- -Label : 1 -Position : [1160.03, 1399.1] -Measurements : [1212.64, 210005, 0.552384, -0.419835] ---- -Label : 1 -Position : [1056.39, 1399.25] -Measurements : [1558.89, 218940, -0.683988, -0.441213] diff --git a/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm b/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm deleted file mode 100644 index b557bcfbe569174f8d48c93d4d7926275540d020..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvDescriptorsSVMModelCreation.svm +++ /dev/null @@ -1,232 +0,0 @@ -svm_type c_svc -kernel_type linear -nr_class 2 -total_sv 224 -rho -0.898435 -label 1 0 -nr_sv 111 113 -SV -1 1:0.69109237 2:-0.20162838 3:-0.65376578 4:-0.43547766 -1 1:0.46324437 2:-0.079541522 3:-0.72899212 4:-0.45271813 -1 1:0.75094097 2:-0.19616619 3:-0.33190814 4:-0.30877904 -1 1:0.70365619 2:0.01759753 3:-0.6909989 4:-0.41240323 -1 1:-0.97853178 2:-0.42895003 3:0.48181126 4:-0.26463967 -1 1:0.372286 2:0.014274367 3:-1.1031219 4:-0.43038233 -1 1:-0.49667527 2:-0.14551467 3:0.02117055 4:-0.4017121 -1 1:-0.88133649 2:-0.035018372 3:1.7800309 4:0.74981121 -1 1:-0.84875076 2:-0.33219283 3:0.13992409 4:-0.41925118 -1 1:0.55389122 2:-0.022533338 3:-0.40316594 4:-0.45013169 -1 1:0.49940573 2:-0.23194414 3:-1.4055887 4:-0.323277 -1 1:-0.11959717 2:-0.071099793 3:-0.68969274 4:-0.53344103 -1 1:-0.78710927 2:-0.21299915 3:0.62594993 4:-0.22865958 -1 1:0.17328549 2:-0.026583638 3:-0.95232954 4:-0.48307589 -1 1:-0.60848895 2:-0.07361427 3:1.1913011 4:0.17146374 -1 1:-0.82937399 2:-0.11821296 3:1.6883694 4:0.6160756 -1 1:-0.22614497 2:-0.035118228 3:0.095960618 4:-0.39662361 -1 1:0.35976138 2:-0.26508256 3:-0.79837598 4:-0.44047181 -1 1:1.4136505 2:-0.22623662 3:-0.80293519 4:-0.37971557 -1 1:-0.057883661 2:-0.074718622 3:-0.22316161 4:-0.45417397 -1 1:0.34142508 2:-0.16644706 3:-0.89833509 4:-0.43656116 -1 1:0.20811258 2:-0.17127593 3:-0.80754391 4:-0.43693097 -1 1:0.56352464 2:-0.078147148 3:-0.73359259 4:-0.43729587 -1 1:-0.068562106 2:-0.068225633 3:-0.28849653 4:-0.38850409 -1 1:-0.86171966 2:-0.10027429 3:1.219222 4:0.19381764 -1 1:-0.77921774 2:-0.10009336 3:1.1271584 4:0.20730184 -1 1:0.33212738 2:0.009098241 3:0.98020011 4:0.13148285 -1 1:1.512446 2:-0.18200812 3:-0.88196447 4:-0.38624303 -1 1:0.48918021 2:-0.0012251123 3:-0.97430606 4:-0.46020262 -1 1:2.0860009 2:-0.0063752669 3:-0.68361571 4:-0.42379254 -1 1:-0.87208013 2:-0.4150814 3:0.50629156 4:-0.1761484 -1 1:1.7266081 2:-0.03750803 3:-0.85200042 4:-0.40133951 -1 1:1.9339253 2:0.016708231 3:-0.75966763 4:-0.41751742 -1 1:0.56523315 2:-0.1044057 3:0.65940812 4:0.20014864 -1 1:-0.92273872 2:-0.39317803 3:0.50638368 4:-0.20743168 -1 1:-0.92370021 2:-0.44687694 3:0.86164992 4:0.029039189 -1 1:1.5727291 2:0.092365881 3:-0.97327116 4:-0.36244619 -1 1:0.13733606 2:-0.073301928 3:-0.44568539 4:-0.42804072 -1 1:-0.032415082 2:-0.37652828 3:-0.52366102 4:-0.42556547 -1 1:1.1851067 2:-0.047089841 3:-0.92608619 4:-0.45080471 -1 1:2.2866981 2:-0.34545889 3:-0.12254126 4:-0.15527653 -1 1:1.8973903 2:-0.280334 3:-1.3076557 4:-0.28408126 -1 1:0.16879578 2:-0.06757977 3:-0.48014022 4:-0.44416969 -1 1:-0.2215064 2:-0.24241052 3:-0.58856 4:-0.45861151 -1 1:-0.032415082 2:-0.37652828 3:-0.52366102 4:-0.42556547 -1 1:1.5295631 2:0.062467254 3:-1.2455611 4:-0.31239908 -1 1:1.3467356 2:-0.075583702 3:-0.57949293 4:-0.29200399 -1 1:-0.77288794 2:-0.10532933 3:0.43846003 4:-0.2389637 -1 1:0.056304597 2:-0.094894655 3:0.23959198 4:-0.28954645 -1 1:1.7621595 2:0.097137499 3:-0.7358019 4:-0.35727314 -1 1:1.9913826 2:-0.21983291 3:-0.87068772 4:-0.27983657 -1 1:2.101546 2:-0.21067344 3:-0.93514116 4:-0.14310347 -1 1:1.3565879 2:-0.28580341 3:-0.77616578 4:-0.39223145 -1 1:1.4539944 2:-0.17492955 3:-1.0562497 4:-0.3780657 -1 1:1.0409292 2:-0.10301682 3:0.04371679 4:-0.38037114 -1 1:1.286188 2:-0.15582611 3:-0.79700877 4:-0.48019886 -1 1:0.90751355 2:-0.2106515 3:-0.84041874 4:-0.45697936 -1 1:2.668085 2:0.094488919 3:-0.48645964 4:-0.41309118 -1 1:-0.021307331 2:-0.056257295 3:-0.16943256 4:-0.40388938 -1 1:0.74359 2:-0.27485327 3:0.13326728 4:-0.11390012 -1 1:1.4549764 2:-0.32147401 3:-0.85853111 4:-0.38362505 -1 1:1.2986204 2:-0.2546904 3:-0.76302084 4:-0.43112508 -1 1:1.0353747 2:-0.10637342 3:-0.71608318 4:-0.43852742 -1 1:1.2953587 2:-0.093156666 3:-0.41319252 4:-0.43514228 -1 1:1.3127638 2:-0.024176066 3:-0.4492193 4:-0.45765616 -1 1:0.86088155 2:-0.13058913 3:0.39216167 4:-0.2669108 -1 1:1.1979613 2:0.067102152 3:-0.55743443 4:-0.45871979 -1 1:1.4008246 2:-0.21219721 3:-0.7547644 4:-0.46573774 -1 1:1.5851317 2:0.095144665 3:0.16600064 4:-0.16255216 -1 1:0.38117004 2:-0.063339724 3:0.31259805 4:-0.22152706 -1 1:0.53653398 2:-0.042885446 3:0.10098396 4:-0.068918142 -1 1:1.5732366 2:-0.01661684 3:-0.99798455 4:-0.36599303 -1 1:0.82059321 2:-0.23681127 3:-0.75534324 4:-0.45190902 -1 1:1.0234628 2:-0.2309679 3:-0.82208803 4:-0.45548031 -1 1:1.5116328 2:-0.031742743 3:0.055790594 4:-0.17368776 -1 1:1.6078525 2:-0.079505937 3:0.13048795 4:-0.17886508 -1 1:2.1981257 2:-0.053697485 3:0.12310795 4:-0.15823516 -1 1:2.4741225 2:-0.062043755 3:0.30332224 4:-0.28796509 -1 1:-0.8317382 2:-0.25498416 3:1.4472377 4:0.43160469 -1 1:-0.87909265 2:-0.095235953 3:1.1700185 4:0.12621143 -1 1:0.46456664 2:-0.092642951 3:-0.97513248 4:-0.41183384 -1 1:3.4447302 2:0.10728527 3:-1.0337478 4:-0.27979557 -1 1:3.376198 2:0.28636335 3:-1.514457 4:-0.19848459 -1 1:-0.61527688 2:-0.23027023 3:0.73808236 4:-0.078835402 -1 1:0.91841614 2:-0.42982468 3:-1.4218277 4:-0.10252584 -1 1:0.77797033 2:-0.33225323 3:-0.79382982 4:-0.24158934 -1 1:1.418123 2:-0.052881491 3:-0.3952341 4:-0.28615214 -1 1:0.36637428 2:-0.025712765 3:0.11964145 4:-0.35096155 -1 1:-0.24582847 2:-0.14703666 3:-0.19214692 4:-0.40034545 -1 1:0.39742377 2:-0.15935885 3:-0.51431281 4:-0.32850083 -1 1:1.6873039 2:0.087223584 3:-0.19831611 4:-0.38294477 -1 1:-0.77759166 2:-0.24478352 3:1.1078669 4:0.26451484 -1 1:-0.37974709 2:-0.1697171 3:-0.48055168 4:-0.46475615 -1 1:-0.8369749 2:-0.28360645 3:0.77113861 4:-0.12923923 -1 1:-0.67565832 2:-0.17790374 3:0.30715305 4:-0.25359594 -0.8863690227343468 1:2.319659 2:0.1835753 3:-0.81275531 4:-0.33161499 -1 1:0.57472058 2:-0.351176 3:-0.97077936 4:-0.17494202 -1 1:0.66835373 2:-0.26328208 3:0.74398001 4:0.19273866 -1 1:2.7039442 2:0.1760433 3:-0.68652624 4:-0.30001531 -1 1:0.28447999 2:-0.22341078 3:-0.7124288 4:-0.45325616 -1 1:0.67158288 2:-0.41662505 3:0.96301587 4:0.23337737 -1 1:0.90320409 2:-0.14556563 3:-0.021405682 4:-0.018686568 -1 1:-0.64995648 2:-0.048705093 3:1.255384 4:0.26387963 -1 1:-0.55692325 2:-0.10408914 3:1.1965585 4:0.2553477 -1 1:1.8365334 2:-0.017767553 3:-0.76198391 4:-0.36599264 -1 1:0.015677252 2:-0.12770387 3:-0.52724684 4:-0.49440128 -1 1:-0.070136805 2:-0.11621001 3:-0.42720804 4:-0.48520764 -1 1:0.97404423 2:0.03397514 3:-0.39503505 4:-0.4174832 -1 1:-0.45488195 2:-0.12311357 3:-0.046863915 4:-0.46652937 -1 1:0.20590504 2:0.014672613 3:-0.0095125754 4:-0.24407214 -1 1:0.97137365 2:-0.13957271 3:-0.026196808 4:-0.3261752 --1 1:0.67905954 2:-0.32198607 3:-0.10361163 4:-0.26307534 --1 1:0.40977245 2:-0.24329323 3:-1.1700738 4:-0.45960816 --1 1:0.20237853 2:-0.30559202 3:-0.54458161 4:-0.56373692 --1 1:0.063805304 2:-0.48046644 3:-0.26975819 4:-0.4274501 --1 1:0.84341609 2:-0.26485617 3:-1.1488738 4:-0.16304561 --1 1:1.0009787 2:-0.28952698 3:-0.060632821 4:-0.38263647 --1 1:0.38612517 2:-0.41797433 3:-0.43981481 4:-0.53603847 --1 1:0.22236172 2:-0.36681128 3:-0.74264232 4:-0.54649243 --1 1:0.40591592 2:-0.13843111 3:-1.0256277 4:-0.48199669 --1 1:-0.028194286 2:-0.45655737 3:-0.67568004 4:-0.45637164 --1 1:0.086757566 2:-0.44096704 3:-1.4310455 4:-0.35315115 --1 1:0.96341375 2:-0.24809227 3:0.72880266 4:0.045645918 --1 1:0.5246276 2:-0.089883916 3:0.070256213 4:-0.30750328 --1 1:0.36915589 2:-0.22653022 3:-0.62629283 4:-0.44174838 --1 1:0.40565836 2:-0.3815908 3:-1.2144396 4:-0.32684519 --1 1:0.57637087 2:-0.34075732 3:1.0465222 4:0.38072802 --1 1:0.62383165 2:-0.022326182 3:-0.17094881 4:-0.26699698 --1 1:0.49647867 2:-0.34652513 3:-1.5867846 4:-0.29243194 --1 1:0.6412277 2:-0.090061224 3:0.27456083 4:0.047593754 --1 1:0.85440682 2:-0.35026828 3:1.4090375 4:0.81042355 --1 1:0.15985446 2:-0.35801858 3:-0.47844024 4:-0.4587022 --1 1:0.75002174 2:-0.43089801 3:0.59142388 4:-0.14180762 --1 1:-0.053832104 2:-0.35684063 3:-0.56691524 4:-0.48508529 --1 1:1.107728 2:-0.35826441 3:-0.24832036 4:-0.4491882 --1 1:0.53064122 2:0.089574585 3:1.79279 4:0.76032869 --1 1:0.32847691 2:-0.20085814 3:1.1787359 4:0.34540129 --1 1:0.77755258 2:0.30043325 3:0.75576467 4:-0.0019102279 --1 1:1.2735135 2:-0.030869051 3:-0.22330967 4:-0.44458663 --1 1:0.13599429 2:0.36237528 3:-0.10859952 4:-0.42109448 --1 1:0.74681935 2:0.26293238 3:0.76392239 4:-0.087439117 --1 1:0.59492399 2:-0.2158359 3:0.86146666 4:0.12649503 --1 1:-0.089461801 2:-0.45549616 3:-0.72593266 4:-0.30518351 --1 1:0.8184493 2:0.23290742 3:0.84804676 4:0.062307258 --1 1:0.92511845 2:0.14706418 3:1.0348556 4:0.39331142 --1 1:0.7281503 2:-0.41664704 3:-0.024347992 4:-0.37974868 --1 1:1.6609121 2:0.17963063 3:1.2427246 4:0.303052 --1 1:-0.076010771 2:-0.31201704 3:0.76220674 4:0.45782572 --1 1:0.69879267 2:0.62585375 3:0.70186956 4:-0.072852815 --0.127906883094633 1:0.17675613 2:-0.45930231 3:0.1313935 4:-0.075258066 --1 1:1.0989463 2:-0.39513995 3:-0.61316319 4:-0.49446711 --1 1:-0.10816998 2:-0.47443976 3:-0.79639366 4:-0.51077326 --1 1:0.79214127 2:0.17098995 3:1.2664871 4:0.48574072 --1 1:0.14827523 2:-0.094726896 3:0.47203635 4:0.0013064268 --1 1:1.2431048 2:-0.043847913 3:-0.24449396 4:-0.42600401 --1 1:0.22462991 2:-0.39176543 3:1.7181466 4:0.67122043 --1 1:0.43074908 2:-0.29091281 3:0.23671211 4:-0.024399796 --1 1:0.16798276 2:-0.37313523 3:0.1820774 4:0.034538256 --1 1:0.94235843 2:-0.29938736 3:-0.71633522 4:-0.45122958 --1 1:-0.12051732 2:-0.32739602 3:-0.64349613 4:-0.38607614 --1 1:0.36424492 2:-0.19876865 3:2.0557255 4:1.0987078 --1 1:0.12511024 2:-0.2850475 3:-0.81436075 4:-0.4777417 --1 1:0.5102292 2:-0.20064496 3:0.21188252 4:-0.11019956 --1 1:-0.40001266 2:-0.44883638 3:0.25831088 4:-0.16642447 --1 1:0.56333716 2:-0.23080413 3:0.18054123 4:-0.06591376 --1 1:0.61769663 2:-0.43835494 3:-0.25921368 4:-0.36702427 --1 1:0.27469223 2:-0.18248259 3:0.90116534 4:0.17224712 --1 1:0.25631333 2:-0.19409265 3:1.7638615 4:0.86122914 --0.3451287109572377 1:-0.21107832 2:-0.49353693 3:-1.0471541 4:-0.40473992 --1 1:0.96032043 2:-0.34357237 3:-0.29004457 4:-0.42554627 --1 1:0.58743595 2:-0.24557672 3:0.10999064 4:-0.33849341 --1 1:-0.03708779 2:-0.14113016 3:-0.70068839 4:-0.53246066 --1 1:0.50197341 2:-0.35708826 3:0.14271648 4:-0.3238136 --1 1:0.32478169 2:-0.40850575 3:-1.7684244 4:-0.1281177 --1 1:0.055769624 2:-0.28429312 3:-0.6738572 4:-0.49463315 --1 1:2.6557568 2:-0.19778546 3:-1.1322828 4:-0.40811028 --1 1:1.8314785 2:0.18826773 3:-0.22258378 4:-0.4976845 --1 1:0.28778834 2:-0.24565165 3:-0.53932509 4:-0.37536204 --1 1:0.56630351 2:-0.27310961 3:-1.5259696 4:-0.2810355 --1 1:1.7688056 2:-0.15710732 3:-0.2632662 4:-0.48774699 --1 1:1.0465847 2:-0.38005255 3:-1.2094317 4:-0.451302 --1 1:-0.18938881 2:-0.096969262 3:-0.41679385 4:-0.52956321 --1 1:1.3109916 2:0.56040034 3:-0.60909088 4:-0.50444415 --1 1:1.2183418 2:0.22683989 3:0.26285983 4:-0.27844331 --1 1:1.2839872 2:-0.077736632 3:-0.16254052 4:-0.45129981 --1 1:1.1161328 2:-0.25623105 3:-0.34168012 4:-0.51619477 --1 1:0.59750888 2:0.35904153 3:0.10987952 4:-0.3967108 --1 1:0.068990155 2:-0.33918935 3:-0.51638461 4:-0.4230581 --1 1:1.2612796 2:0.20760424 3:0.22700797 4:-0.28788431 --1 1:0.19645885 2:-0.10587959 3:-0.95303352 4:-0.48941085 --1 1:1.6708124 2:-0.16621109 3:-0.50956753 4:-0.52117133 --1 1:1.2560159 2:0.58984576 3:-0.11065066 4:-0.42997574 --1 1:0.6365864 2:-0.3159853 3:-0.43575745 4:-0.24918789 --1 1:-0.27554846 2:-0.38153805 3:-0.65796797 4:-0.51900905 --1 1:-0.19232176 2:-0.27815867 3:-0.60753037 4:-0.52076717 --1 1:0.015804563 2:-0.19853049 3:-0.79780762 4:-0.55885602 --1 1:1.3231804 2:-0.16938208 3:-0.22403075 4:-0.4627119 --1 1:0.0026969903 2:-0.41855948 3:-0.87497128 4:-0.40635496 --1 1:0.43957179 2:-0.16440573 3:-0.38929989 4:-0.49034286 --1 1:-0.2690738 2:-0.27153781 3:-0.66845649 4:-0.52137948 --1 1:0.28141871 2:-0.3932208 3:-0.42573926 4:-0.14238624 --1 1:1.6493723 2:-0.25029374 3:-1.1010529 4:-0.31200023 --1 1:2.138692 2:-0.27719065 3:-0.52919492 4:-0.52248088 --1 1:-0.02930289 2:-0.26346287 3:-0.58111883 4:-0.5279823 --1 1:0.41080693 2:-0.27225805 3:-0.2746303 4:-0.3400428 --1 1:1.0547766 2:-0.20354031 3:-0.35549573 4:-0.52403621 --1 1:-0.038473041 2:-0.27665462 3:-0.61568444 4:-0.51650441 --1 1:1.4659046 2:1.113788 3:0.086161524 4:-0.3867731 --1 1:1.0877119 2:1.0018544 3:-0.50406188 4:-0.5144821 --1 1:1.0313572 2:-0.39820351 3:0.14001203 4:-0.14989309 --1 1:1.3298706 2:1.1804648 3:-0.71850716 4:-0.52034533 --1 1:1.5906871 2:-0.26492985 3:-1.2958511 4:-0.43931484 --1 1:0.99994562 2:-0.39915208 3:-0.61018 4:-0.4574368 --1 1:1.0432105 2:-0.27877234 3:-0.65607653 4:-0.38990796 --1 1:0.84517848 2:-0.42287191 3:0.16916266 4:-0.26409466 --1 1:0.3423789 2:-0.45147406 3:-1.020062 4:-0.40505505 --1 1:1.4989444 2:0.48249017 3:-0.89881716 4:-0.51387248 --0.4133334286824741 1:0.70487226 2:-0.39552501 3:-0.35274026 4:0.076316467 --1 1:1.4518186 2:-0.24860617 3:-1.3214617 4:-0.27026562 --1 1:0.90394036 2:-0.28053002 3:-0.99614087 4:-0.46659073 --1 1:1.0337892 2:-0.28248027 3:-1.2491535 4:-0.35818484 --1 1:0.29457572 2:-0.42802317 3:-0.92568876 4:-0.40083456 --1 1:0.30987783 2:-0.4243198 3:-0.89973376 4:-0.433091 --1 1:0.67069754 2:-0.19985884 3:-0.71810461 4:-0.50012774 diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf deleted file mode 100644 index c2df5113bb5e7daca9989707ac56662bf674c99d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0998367ed4a1fea79be1a27a82f0d76d5dcba84214aa63678b660f1bc6245120 -size 365538 diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp deleted file mode 100644 index faedfa80a00e469dc0335ebf155879adb2577d5d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ead83092b50a373b6a026a6553bfdd1d5f3c5f3fde4e7a88b6a8f76c696e707 -size 126436 diff --git a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx b/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx deleted file mode 100644 index 3f9ded68080230718f13932438adbb2909f07d44..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvLabeledSampleLocalizationGeneratorOutput.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fe4b9505e67c0b6c3e673e27fe9ff518641795a00339addc53de6af47aefb2dc -size 36196 diff --git a/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt b/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt deleted file mode 100644 index ebbdaef1e82f329c4a9bfcdeff19f822b2cdd682..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/TvObjectDetectionClassifierOutput.txt +++ /dev/null @@ -1,790 +0,0 @@ -[16.5, 0.5] -[18.5, 0.5] -[20.5, 0.5] -[22.5, 0.5] -[16.5, 2.5] -[18.5, 2.5] -[20.5, 2.5] -[22.5, 2.5] -[24.5, 2.5] -[28.5, 2.5] -[22.5, 4.5] -[24.5, 4.5] -[26.5, 4.5] -[28.5, 4.5] -[30.5, 4.5] -[26.5, 6.5] -[28.5, 6.5] -[30.5, 6.5] -[86.5, 6.5] -[26.5, 8.5] -[28.5, 8.5] -[30.5, 8.5] -[84.5, 8.5] -[86.5, 8.5] -[22.5, 10.5] -[24.5, 10.5] -[26.5, 10.5] -[28.5, 10.5] -[30.5, 10.5] -[50.5, 10.5] -[14.5, 12.5] -[16.5, 12.5] -[18.5, 12.5] -[20.5, 12.5] -[22.5, 12.5] -[24.5, 12.5] -[26.5, 12.5] -[28.5, 12.5] -[30.5, 12.5] -[42.5, 12.5] -[44.5, 12.5] -[48.5, 12.5] -[50.5, 12.5] -[10.5, 14.5] -[12.5, 14.5] -[14.5, 14.5] -[16.5, 14.5] -[18.5, 14.5] -[20.5, 14.5] -[22.5, 14.5] -[24.5, 14.5] -[26.5, 14.5] -[28.5, 14.5] -[30.5, 14.5] -[32.5, 14.5] -[42.5, 14.5] -[44.5, 14.5] -[46.5, 14.5] -[48.5, 14.5] -[50.5, 14.5] -[60.5, 14.5] -[10.5, 16.5] -[12.5, 16.5] -[14.5, 16.5] -[16.5, 16.5] -[18.5, 16.5] -[20.5, 16.5] -[22.5, 16.5] -[24.5, 16.5] -[26.5, 16.5] -[28.5, 16.5] -[30.5, 16.5] -[42.5, 16.5] -[44.5, 16.5] -[48.5, 16.5] -[60.5, 16.5] -[88.5, 16.5] -[90.5, 16.5] -[10.5, 18.5] -[12.5, 18.5] -[14.5, 18.5] -[16.5, 18.5] -[18.5, 18.5] -[20.5, 18.5] -[22.5, 18.5] -[24.5, 18.5] -[26.5, 18.5] -[28.5, 18.5] -[30.5, 18.5] -[32.5, 18.5] -[34.5, 18.5] -[88.5, 18.5] -[90.5, 18.5] -[10.5, 20.5] -[12.5, 20.5] -[14.5, 20.5] -[16.5, 20.5] -[18.5, 20.5] -[20.5, 20.5] -[22.5, 20.5] -[24.5, 20.5] -[26.5, 20.5] -[28.5, 20.5] -[30.5, 20.5] -[32.5, 20.5] -[34.5, 20.5] -[88.5, 20.5] -[110.5, 20.5] -[112.5, 20.5] -[10.5, 22.5] -[12.5, 22.5] -[14.5, 22.5] -[16.5, 22.5] -[18.5, 22.5] -[20.5, 22.5] -[22.5, 22.5] -[24.5, 22.5] -[26.5, 22.5] -[28.5, 22.5] -[30.5, 22.5] -[32.5, 22.5] -[34.5, 22.5] -[110.5, 22.5] -[112.5, 22.5] -[10.5, 24.5] -[12.5, 24.5] -[14.5, 24.5] -[16.5, 24.5] -[18.5, 24.5] -[20.5, 24.5] -[22.5, 24.5] -[24.5, 24.5] -[26.5, 24.5] -[28.5, 24.5] -[30.5, 24.5] -[32.5, 24.5] -[34.5, 24.5] -[10.5, 26.5] -[12.5, 26.5] -[14.5, 26.5] -[16.5, 26.5] -[18.5, 26.5] -[20.5, 26.5] -[22.5, 26.5] -[24.5, 26.5] -[26.5, 26.5] -[28.5, 26.5] -[30.5, 26.5] -[32.5, 26.5] -[34.5, 26.5] -[36.5, 26.5] -[18.5, 28.5] -[20.5, 28.5] -[22.5, 28.5] -[24.5, 28.5] -[26.5, 28.5] -[28.5, 28.5] -[30.5, 28.5] -[32.5, 28.5] -[34.5, 28.5] -[36.5, 28.5] -[20.5, 30.5] -[22.5, 30.5] -[24.5, 30.5] -[26.5, 30.5] -[28.5, 30.5] -[30.5, 30.5] -[32.5, 30.5] -[34.5, 30.5] -[36.5, 30.5] -[38.5, 30.5] -[20.5, 32.5] -[22.5, 32.5] -[24.5, 32.5] -[26.5, 32.5] -[28.5, 32.5] -[30.5, 32.5] -[32.5, 32.5] -[34.5, 32.5] -[36.5, 32.5] -[38.5, 32.5] -[40.5, 32.5] -[34.5, 34.5] -[36.5, 34.5] -[38.5, 34.5] -[40.5, 34.5] -[34.5, 36.5] -[36.5, 36.5] -[38.5, 36.5] -[28.5, 38.5] -[30.5, 38.5] -[32.5, 38.5] -[34.5, 38.5] -[36.5, 38.5] -[38.5, 38.5] -[40.5, 38.5] -[120.5, 38.5] -[20.5, 40.5] -[22.5, 40.5] -[24.5, 40.5] -[26.5, 40.5] -[28.5, 40.5] -[30.5, 40.5] -[32.5, 40.5] -[34.5, 40.5] -[36.5, 40.5] -[38.5, 40.5] -[40.5, 40.5] -[18.5, 42.5] -[20.5, 42.5] -[22.5, 42.5] -[24.5, 42.5] -[26.5, 42.5] -[28.5, 42.5] -[30.5, 42.5] -[32.5, 42.5] -[34.5, 42.5] -[36.5, 42.5] -[38.5, 42.5] -[40.5, 42.5] -[16.5, 44.5] -[18.5, 44.5] -[20.5, 44.5] -[22.5, 44.5] -[24.5, 44.5] -[26.5, 44.5] -[28.5, 44.5] -[30.5, 44.5] -[32.5, 44.5] -[34.5, 44.5] -[36.5, 44.5] -[38.5, 44.5] -[40.5, 44.5] -[16.5, 46.5] -[18.5, 46.5] -[20.5, 46.5] -[22.5, 46.5] -[24.5, 46.5] -[26.5, 46.5] -[28.5, 46.5] -[30.5, 46.5] -[32.5, 46.5] -[34.5, 46.5] -[36.5, 46.5] -[38.5, 46.5] -[40.5, 46.5] -[48.5, 46.5] -[50.5, 46.5] -[16.5, 48.5] -[18.5, 48.5] -[20.5, 48.5] -[22.5, 48.5] -[24.5, 48.5] -[26.5, 48.5] -[28.5, 48.5] -[30.5, 48.5] -[32.5, 48.5] -[34.5, 48.5] -[36.5, 48.5] -[38.5, 48.5] -[40.5, 48.5] -[48.5, 48.5] -[50.5, 48.5] -[52.5, 48.5] -[16.5, 50.5] -[18.5, 50.5] -[20.5, 50.5] -[22.5, 50.5] -[24.5, 50.5] -[26.5, 50.5] -[28.5, 50.5] -[30.5, 50.5] -[32.5, 50.5] -[34.5, 50.5] -[36.5, 50.5] -[38.5, 50.5] -[40.5, 50.5] -[42.5, 50.5] -[48.5, 50.5] -[50.5, 50.5] -[52.5, 50.5] -[18.5, 52.5] -[20.5, 52.5] -[22.5, 52.5] -[24.5, 52.5] -[26.5, 52.5] -[28.5, 52.5] -[30.5, 52.5] -[32.5, 52.5] -[34.5, 52.5] -[36.5, 52.5] -[38.5, 52.5] -[40.5, 52.5] -[42.5, 52.5] -[44.5, 52.5] -[48.5, 52.5] -[60.5, 52.5] -[62.5, 52.5] -[20.5, 54.5] -[22.5, 54.5] -[24.5, 54.5] -[26.5, 54.5] -[28.5, 54.5] -[30.5, 54.5] -[32.5, 54.5] -[34.5, 54.5] -[36.5, 54.5] -[38.5, 54.5] -[40.5, 54.5] -[42.5, 54.5] -[60.5, 54.5] -[62.5, 54.5] -[122.5, 54.5] -[38.5, 56.5] -[40.5, 56.5] -[42.5, 56.5] -[60.5, 56.5] -[62.5, 56.5] -[122.5, 56.5] -[38.5, 58.5] -[40.5, 58.5] -[42.5, 58.5] -[60.5, 58.5] -[62.5, 58.5] -[122.5, 58.5] -[36.5, 60.5] -[38.5, 60.5] -[40.5, 60.5] -[42.5, 60.5] -[60.5, 60.5] -[62.5, 60.5] -[120.5, 60.5] -[122.5, 60.5] -[0.5, 62.5] -[2.5, 62.5] -[4.5, 62.5] -[6.5, 62.5] -[36.5, 62.5] -[38.5, 62.5] -[40.5, 62.5] -[42.5, 62.5] -[62.5, 62.5] -[120.5, 62.5] -[122.5, 62.5] -[0.5, 64.5] -[2.5, 64.5] -[4.5, 64.5] -[6.5, 64.5] -[8.5, 64.5] -[36.5, 64.5] -[38.5, 64.5] -[40.5, 64.5] -[42.5, 64.5] -[62.5, 64.5] -[64.5, 64.5] -[0.5, 66.5] -[2.5, 66.5] -[4.5, 66.5] -[6.5, 66.5] -[8.5, 66.5] -[26.5, 66.5] -[28.5, 66.5] -[30.5, 66.5] -[32.5, 66.5] -[34.5, 66.5] -[36.5, 66.5] -[38.5, 66.5] -[40.5, 66.5] -[42.5, 66.5] -[0.5, 68.5] -[2.5, 68.5] -[4.5, 68.5] -[6.5, 68.5] -[8.5, 68.5] -[22.5, 68.5] -[24.5, 68.5] -[26.5, 68.5] -[28.5, 68.5] -[30.5, 68.5] -[32.5, 68.5] -[34.5, 68.5] -[36.5, 68.5] -[38.5, 68.5] -[40.5, 68.5] -[42.5, 68.5] -[44.5, 68.5] -[0.5, 70.5] -[2.5, 70.5] -[4.5, 70.5] -[6.5, 70.5] -[8.5, 70.5] -[22.5, 70.5] -[24.5, 70.5] -[26.5, 70.5] -[28.5, 70.5] -[30.5, 70.5] -[32.5, 70.5] -[34.5, 70.5] -[36.5, 70.5] -[38.5, 70.5] -[40.5, 70.5] -[42.5, 70.5] -[44.5, 70.5] -[0.5, 72.5] -[2.5, 72.5] -[4.5, 72.5] -[6.5, 72.5] -[8.5, 72.5] -[22.5, 72.5] -[24.5, 72.5] -[26.5, 72.5] -[28.5, 72.5] -[30.5, 72.5] -[32.5, 72.5] -[34.5, 72.5] -[36.5, 72.5] -[38.5, 72.5] -[40.5, 72.5] -[42.5, 72.5] -[44.5, 72.5] -[0.5, 74.5] -[2.5, 74.5] -[4.5, 74.5] -[6.5, 74.5] -[8.5, 74.5] -[22.5, 74.5] -[24.5, 74.5] -[26.5, 74.5] -[28.5, 74.5] -[30.5, 74.5] -[32.5, 74.5] -[34.5, 74.5] -[36.5, 74.5] -[38.5, 74.5] -[40.5, 74.5] -[42.5, 74.5] -[44.5, 74.5] -[46.5, 74.5] -[0.5, 76.5] -[2.5, 76.5] -[4.5, 76.5] -[6.5, 76.5] -[22.5, 76.5] -[24.5, 76.5] -[26.5, 76.5] -[28.5, 76.5] -[30.5, 76.5] -[32.5, 76.5] -[34.5, 76.5] -[36.5, 76.5] -[38.5, 76.5] -[40.5, 76.5] -[42.5, 76.5] -[44.5, 76.5] -[46.5, 76.5] -[22.5, 78.5] -[24.5, 78.5] -[26.5, 78.5] -[28.5, 78.5] -[30.5, 78.5] -[32.5, 78.5] -[34.5, 78.5] -[36.5, 78.5] -[38.5, 78.5] -[40.5, 78.5] -[42.5, 78.5] -[44.5, 78.5] -[46.5, 78.5] -[48.5, 78.5] -[24.5, 80.5] -[26.5, 80.5] -[28.5, 80.5] -[30.5, 80.5] -[32.5, 80.5] -[34.5, 80.5] -[36.5, 80.5] -[38.5, 80.5] -[40.5, 80.5] -[42.5, 80.5] -[44.5, 80.5] -[46.5, 80.5] -[48.5, 80.5] -[50.5, 80.5] -[106.5, 80.5] -[42.5, 82.5] -[44.5, 82.5] -[46.5, 82.5] -[48.5, 82.5] -[50.5, 82.5] -[106.5, 82.5] -[46.5, 84.5] -[48.5, 84.5] -[50.5, 84.5] -[106.5, 84.5] -[46.5, 86.5] -[48.5, 86.5] -[50.5, 86.5] -[98.5, 86.5] -[48.5, 88.5] -[88.5, 88.5] -[98.5, 88.5] -[100.5, 88.5] -[86.5, 90.5] -[88.5, 90.5] -[98.5, 90.5] -[86.5, 92.5] -[88.5, 92.5] -[98.5, 92.5] -[100.5, 92.5] -[124.5, 92.5] -[126.5, 92.5] -[56.5, 94.5] -[58.5, 94.5] -[60.5, 94.5] -[62.5, 94.5] -[64.5, 94.5] -[88.5, 94.5] -[98.5, 94.5] -[100.5, 94.5] -[118.5, 94.5] -[120.5, 94.5] -[122.5, 94.5] -[124.5, 94.5] -[126.5, 94.5] -[56.5, 96.5] -[58.5, 96.5] -[60.5, 96.5] -[62.5, 96.5] -[64.5, 96.5] -[100.5, 96.5] -[118.5, 96.5] -[120.5, 96.5] -[122.5, 96.5] -[124.5, 96.5] -[126.5, 96.5] -[48.5, 98.5] -[50.5, 98.5] -[56.5, 98.5] -[58.5, 98.5] -[60.5, 98.5] -[62.5, 98.5] -[64.5, 98.5] -[100.5, 98.5] -[102.5, 98.5] -[118.5, 98.5] -[120.5, 98.5] -[122.5, 98.5] -[124.5, 98.5] -[126.5, 98.5] -[48.5, 100.5] -[50.5, 100.5] -[54.5, 100.5] -[56.5, 100.5] -[58.5, 100.5] -[60.5, 100.5] -[62.5, 100.5] -[64.5, 100.5] -[102.5, 100.5] -[118.5, 100.5] -[120.5, 100.5] -[122.5, 100.5] -[124.5, 100.5] -[126.5, 100.5] -[0.5, 102.5] -[2.5, 102.5] -[4.5, 102.5] -[48.5, 102.5] -[50.5, 102.5] -[54.5, 102.5] -[56.5, 102.5] -[58.5, 102.5] -[60.5, 102.5] -[62.5, 102.5] -[64.5, 102.5] -[92.5, 102.5] -[102.5, 102.5] -[120.5, 102.5] -[122.5, 102.5] -[0.5, 104.5] -[2.5, 104.5] -[4.5, 104.5] -[6.5, 104.5] -[48.5, 104.5] -[50.5, 104.5] -[54.5, 104.5] -[56.5, 104.5] -[58.5, 104.5] -[60.5, 104.5] -[62.5, 104.5] -[64.5, 104.5] -[90.5, 104.5] -[92.5, 104.5] -[0.5, 106.5] -[2.5, 106.5] -[4.5, 106.5] -[6.5, 106.5] -[48.5, 106.5] -[50.5, 106.5] -[52.5, 106.5] -[58.5, 106.5] -[60.5, 106.5] -[62.5, 106.5] -[64.5, 106.5] -[90.5, 106.5] -[92.5, 106.5] -[94.5, 106.5] -[104.5, 106.5] -[0.5, 108.5] -[2.5, 108.5] -[4.5, 108.5] -[6.5, 108.5] -[48.5, 108.5] -[50.5, 108.5] -[52.5, 108.5] -[54.5, 108.5] -[56.5, 108.5] -[58.5, 108.5] -[60.5, 108.5] -[62.5, 108.5] -[64.5, 108.5] -[66.5, 108.5] -[92.5, 108.5] -[94.5, 108.5] -[102.5, 108.5] -[104.5, 108.5] -[118.5, 108.5] -[120.5, 108.5] -[122.5, 108.5] -[124.5, 108.5] -[0.5, 110.5] -[2.5, 110.5] -[4.5, 110.5] -[6.5, 110.5] -[48.5, 110.5] -[50.5, 110.5] -[52.5, 110.5] -[54.5, 110.5] -[56.5, 110.5] -[58.5, 110.5] -[60.5, 110.5] -[62.5, 110.5] -[64.5, 110.5] -[66.5, 110.5] -[92.5, 110.5] -[94.5, 110.5] -[102.5, 110.5] -[104.5, 110.5] -[114.5, 110.5] -[116.5, 110.5] -[118.5, 110.5] -[120.5, 110.5] -[122.5, 110.5] -[124.5, 110.5] -[126.5, 110.5] -[0.5, 112.5] -[2.5, 112.5] -[4.5, 112.5] -[6.5, 112.5] -[48.5, 112.5] -[50.5, 112.5] -[52.5, 112.5] -[54.5, 112.5] -[58.5, 112.5] -[60.5, 112.5] -[62.5, 112.5] -[64.5, 112.5] -[66.5, 112.5] -[94.5, 112.5] -[102.5, 112.5] -[104.5, 112.5] -[106.5, 112.5] -[112.5, 112.5] -[114.5, 112.5] -[116.5, 112.5] -[118.5, 112.5] -[120.5, 112.5] -[122.5, 112.5] -[124.5, 112.5] -[126.5, 112.5] -[48.5, 114.5] -[50.5, 114.5] -[52.5, 114.5] -[54.5, 114.5] -[58.5, 114.5] -[60.5, 114.5] -[62.5, 114.5] -[64.5, 114.5] -[66.5, 114.5] -[94.5, 114.5] -[102.5, 114.5] -[104.5, 114.5] -[106.5, 114.5] -[112.5, 114.5] -[114.5, 114.5] -[116.5, 114.5] -[118.5, 114.5] -[42.5, 116.5] -[44.5, 116.5] -[46.5, 116.5] -[48.5, 116.5] -[50.5, 116.5] -[52.5, 116.5] -[54.5, 116.5] -[58.5, 116.5] -[60.5, 116.5] -[62.5, 116.5] -[64.5, 116.5] -[66.5, 116.5] -[102.5, 116.5] -[104.5, 116.5] -[106.5, 116.5] -[112.5, 116.5] -[114.5, 116.5] -[116.5, 116.5] -[38.5, 118.5] -[40.5, 118.5] -[42.5, 118.5] -[44.5, 118.5] -[46.5, 118.5] -[48.5, 118.5] -[50.5, 118.5] -[52.5, 118.5] -[54.5, 118.5] -[104.5, 118.5] -[106.5, 118.5] -[112.5, 118.5] -[114.5, 118.5] -[116.5, 118.5] -[36.5, 120.5] -[38.5, 120.5] -[40.5, 120.5] -[42.5, 120.5] -[44.5, 120.5] -[46.5, 120.5] -[48.5, 120.5] -[50.5, 120.5] -[52.5, 120.5] -[54.5, 120.5] -[104.5, 120.5] -[106.5, 120.5] -[112.5, 120.5] -[114.5, 120.5] -[116.5, 120.5] -[0.5, 122.5] -[2.5, 122.5] -[4.5, 122.5] -[36.5, 122.5] -[38.5, 122.5] -[40.5, 122.5] -[42.5, 122.5] -[44.5, 122.5] -[46.5, 122.5] -[48.5, 122.5] -[50.5, 122.5] -[52.5, 122.5] -[54.5, 122.5] -[56.5, 122.5] -[106.5, 122.5] -[114.5, 122.5] -[0.5, 124.5] -[2.5, 124.5] -[4.5, 124.5] -[36.5, 124.5] -[38.5, 124.5] -[40.5, 124.5] -[42.5, 124.5] -[44.5, 124.5] -[46.5, 124.5] -[48.5, 124.5] -[50.5, 124.5] -[52.5, 124.5] -[54.5, 124.5] -[56.5, 124.5] -[106.5, 124.5] -[108.5, 124.5] -[0.5, 126.5] -[2.5, 126.5] -[4.5, 126.5] -[6.5, 126.5] -[36.5, 126.5] -[38.5, 126.5] -[40.5, 126.5] -[42.5, 126.5] -[44.5, 126.5] -[46.5, 126.5] -[48.5, 126.5] -[50.5, 126.5] -[52.5, 126.5] -[54.5, 126.5] -[56.5, 126.5] diff --git a/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt b/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt deleted file mode 100644 index 607b28d732cbd88ed00155282488e63c212b0ace..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfBoundingRegionCalculatorOutput.txt +++ /dev/null @@ -1,12 +0,0 @@ -Test results from otbBinaryImageBoundingRegionCalculator test. -[8, 48] [81, 39] -[7, 7] [83, 41] -[7, 9] [45, 36] -[25, 11] [47, 30] - -Testing the pad option - -[7, 47] [83, 41] -[6, 6] [85, 43] -[6, 8] [47, 38] -[24, 10] [49, 32] diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf deleted file mode 100644 index e514113af135119bc8425acf01f592628df9b0ee..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9a91a7b2a449168136030deb765d660dc0851638543eced30eb006db94bc2123 -size 6583 diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp deleted file mode 100644 index 0e5a1e7088d245322c2dea9711dc61f0d147bbc4..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ca53f866c1773b1ea1329e910073eb8c2c25513dca65b8e5ab21a047d31e333 -size 12860 diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx deleted file mode 100644 index e4f82fd5c32949defffebc072ec21aab04dd54d3..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cd9270880008ed009e4e0e08ea105d91f40eb911f7c27e773348dfc74857bec2 -size 668 diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf deleted file mode 100644 index 5c2e63d063ed9d1cb3951b1af6ae1f47ad6bdf14..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:539f3f381fe619efbf813b1f6a407f236ca577cd2f62f0d35cf8a717c30f3210 -size 6583 diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp deleted file mode 100644 index d5ff96b9922859ed04a1f8c4479c89507f6c4daa..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0b6e77ff1d3acae9432b63b929050ed0089e9aace8a831c817b07ac02b04063 -size 18388 diff --git a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx b/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx deleted file mode 100644 index 72bda750b8f93dbb743c133f9cdcb57e5d489314..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvDBOverlapDataNodeFeatureFunctionOutput.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e3f91df5a62beb63ba9b17a952d2673a732aa428b20861dce0c6dd986e588db -size 668 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf deleted file mode 100644 index 7c908dfa514d47a20b9e25bfb6e6d9b379d01ef6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5e03911f8e9f9eecd908084083cbed86b2084a1a8ec469a0bf58296ba9ca93f4 -size 6583 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp deleted file mode 100644 index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30 -size 12860 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx deleted file mode 100644 index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664 -size 668 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf deleted file mode 100644 index 6cf192268251981989263ef6d65b1d2c3490290f..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2a314fb6c853dd6ed9864eb50da057c96bad6802b1d35e1c27e63f7c54ac5e6c -size 1517 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp deleted file mode 100644 index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840 -size 3228 diff --git a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx deleted file mode 100644 index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d -size 252 diff --git a/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt b/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt index be8d26528fdb6e53c48a6a5b67c58eb5dd40d5cb..9f0a2569d3082b2e1322feed4a06fdfc469748bd 100644 --- a/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt +++ b/Data/Baseline/OTB/Files/bfTvPersistentVectorizationImageFilterOutput.txt @@ -1,4 +1,3 @@ -[ 55.5, 123.5] [ 57, 123.5] [ 58, 123.5] [ 59, 123.5] [ 60, 123.5] [ 61, 123.5] [ 62, 123.5] [ 63, 123.5] [ 64, 123.5] [ 65, 123.5] [ 66, 123.5] [ 67.5, 123.5] [ 68, 124.5] [ 69, 124.5] [ 70, 124.5] [ 71.5, 124.5] [ 72, 125.5] [ 73.5, 125.5] [ 74, 126.5] [ 75, 126.5] [ 76.5, 126.5] [ 77, 127.5] [ 78.5, 127.5] [ 79.5, 128.5] [ 80, 129.5] [ 81.5, 129.5] [ 82.5, 130.5] [ 83.5, 131.5] [ 84.5, 132.5] [ 85.5, 133.5] [ 86.5, 134.5] [ 87.5, 135.5] [ 88.5, 136.5] [ 89.5, 137.5] [ 90.5, 138.5] [ 91.5, 139.5] [ 91.5, 141] [ 92.5, 141.5] [ 93.5, 142.5] [ 93.5, 144] [ 94.5, 144.5] [ 94.5, 146] [ 95.5, 146.5] [ 95.5, 148] [ 96.5, 148.5] [ 96.5, 150] [ 96.5, 151] [ 97.5, 151.5] [ 97.5, 153] [ 97.5, 154] [ 98.5, 154.5] [ 98.5, 156] [ 98.5, 157] [ 99.5, 157.5] [ 99.5, 159] [ 99.5, 160] [ 99.5, 161] [ 99.5, 162] [ 99.5, 163] [ 100.5, 163.5] [ 100.5, 165] [ 100.5, 166] [ 100.5, 167] [ 100.5, 168] [ 100.5, 169] [ 100.5, 170] [ 100.5, 171] [ 100.5, 172] [ 100.5, 173] [ 100.5, 174] [ 100.5, 175] [ 100.5, 176] [ 100.5, 177] [ 100.5, 178.5] [ 99.5, 179] [ 99.5, 180] [ 99.5, 181] [ 99.5, 182] [ 99.5, 183] [ 99.5, 184.5] [ 98.5, 185] [ 98.5, 186] [ 98.5, 187.5] [ 97.5, 188] [ 97.5, 189] [ 97.5, 190.5] [ 96.5, 191] [ 96.5, 192] [ 96.5, 193.5] [ 95.5, 194] [ 95.5, 195.5] [ 94.5, 196] [ 94.5, 197.5] [ 93.5, 198] [ 93.5, 199.5] [ 92.5, 200.5] [ 91.5, 201] [ 91.5, 202.5] [ 90.5, 203.5] [ 89.5, 204.5] [ 88.5, 205.5] [ 87.5, 206.5] [ 86.5, 207.5] [ 85.5, 208.5] [ 84.5, 209.5] [ 83.5, 210.5] [ 82.5, 211.5] [ 81.5, 212.5] [ 80, 212.5] [ 79.5, 213.5] [ 78.5, 214.5] [ 77, 214.5] [ 76.5, 215.5] [ 75, 215.5] [ 74, 215.5] [ 73.5, 216.5] [ 72, 216.5] [ 71.5, 217.5] [ 70, 217.5] [ 69, 217.5] [ 68, 217.5] [ 67.5, 218.5] [ 66, 218.5] [ 65, 218.5] [ 64, 218.5] [ 63, 218.5] [ 62, 218.5] [ 61, 218.5] [ 60, 218.5] [ 59, 218.5] [ 58, 218.5] [ 57, 218.5] [ 55.5, 218.5] [ 55, 217.5] [ 54, 217.5] [ 53, 217.5] [ 51.5, 217.5] [ 51, 216.5] [ 49.5, 216.5] [ 49, 215.5] [ 48, 215.5] [ 46.5, 215.5] [ 46, 214.5] [ 44.5, 214.5] [ 43.5, 213.5] [ 43, 212.5] [ 41.5, 212.5] [ 40.5, 211.5] [ 39.5, 210.5] [ 38.5, 209.5] [ 37.5, 208.5] [ 36.5, 207.5] [ 35.5, 206.5] [ 34.5, 205.5] [ 33.5, 204.5] [ 32.5, 203.5] [ 31.5, 202.5] [ 31.5, 201] [ 30.5, 200.5] [ 29.5, 199.5] [ 29.5, 198] [ 28.5, 197.5] [ 28.5, 196] [ 27.5, 195.5] [ 27.5, 194] [ 26.5, 193.5] [ 26.5, 192] [ 26.5, 191] [ 25.5, 190.5] [ 25.5, 189] [ 25.5, 188] [ 24.5, 187.5] [ 24.5, 186] [ 24.5, 185] [ 23.5, 184.5] [ 23.5, 183] [ 23.5, 182] [ 23.5, 181] [ 23.5, 180] [ 23.5, 179] [ 22.5, 178.5] [ 22.5, 177] [ 22.5, 176] [ 22.5, 175] [ 22.5, 174] [ 22.5, 173] [ 22.5, 172] [ 22.5, 171] [ 22.5, 170] [ 22.5, 169] [ 22.5, 168] [ 22.5, 167] [ 22.5, 166] [ 22.5, 165] [ 22.5, 163.5] [ 23.5, 163] [ 23.5, 162] [ 23.5, 161] [ 23.5, 160] [ 23.5, 159] [ 23.5, 157.5] [ 24.5, 157] [ 24.5, 156] [ 24.5, 154.5] [ 25.5, 154] [ 25.5, 153] [ 25.5, 151.5] [ 26.5, 151] [ 26.5, 150] [ 26.5, 148.5] [ 27.5, 148] [ 27.5, 146.5] [ 28.5, 146] [ 28.5, 144.5] [ 29.5, 144] [ 29.5, 142.5] [ 30.5, 141.5] [ 31.5, 141] [ 31.5, 139.5] [ 32.5, 138.5] [ 33.5, 137.5] [ 34.5, 136.5] [ 35.5, 135.5] [ 36.5, 134.5] [ 37.5, 133.5] [ 38.5, 132.5] [ 39.5, 131.5] [ 40.5, 130.5] [ 41.5, 129.5] [ 43, 129.5] [ 43.5, 128.5] [ 44.5, 127.5] [ 46, 127.5] [ 46.5, 126.5] [ 48, 126.5] [ 49, 126.5] [ 49.5, 125.5] [ 51, 125.5] [ 51.5, 124.5] [ 53, 124.5] [ 54, 124.5] [ 55, 124.5] -[ 187.5, 31.5] [ 189, 31.5] [ 190, 31.5] [ 191, 31.5] [ 192, 31.5] [ 193, 31.5] [ 194, 31.5] [ 195, 31.5] [ 196, 31.5] [ 197, 31.5] [ 198, 31.5] [ 199, 31.5] [ 200, 31.5] [ 201, 31.5] [ 202, 31.5] [ 203, 31.5] [ 204, 31.5] [ 205, 31.5] [ 206, 31.5] [ 207, 31.5] [ 208, 31.5] [ 209, 31.5] [ 210, 31.5] [ 211, 31.5] [ 212, 31.5] [ 213, 31.5] [ 214, 31.5] [ 215, 31.5] [ 216, 31.5] [ 217, 31.5] [ 218, 31.5] [ 219, 31.5] [ 220, 31.5] [ 221.5, 31.5] [ 221.5, 33] [ 221.5, 34] [ 221.5, 35] [ 221.5, 36] [ 221.5, 37] [ 221.5, 38] [ 221.5, 39] [ 221.5, 40] [ 221.5, 41] [ 221.5, 42] [ 221.5, 43] [ 221.5, 44] [ 221.5, 45] [ 221.5, 46] [ 221.5, 47] [ 221.5, 48] [ 221.5, 49] [ 221.5, 50] [ 221.5, 51] [ 221.5, 52] [ 221.5, 53] [ 221.5, 54] [ 221.5, 55] [ 221.5, 56] [ 221.5, 57] [ 221.5, 58] [ 221.5, 59] [ 221.5, 60] [ 221.5, 61] [ 221.5, 62] [ 221.5, 63] [ 221.5, 64] [ 221.5, 65] [ 221.5, 66] [ 221.5, 67] [ 221.5, 68] [ 221.5, 69] [ 221.5, 70] [ 221.5, 71] [ 221.5, 72] [ 221.5, 73] [ 221.5, 74] [ 221.5, 75] [ 221.5, 76] [ 221.5, 77] [ 221.5, 78] [ 221.5, 79] [ 221.5, 80] [ 221.5, 81] [ 221.5, 82] [ 221.5, 83] [ 221.5, 84] [ 221.5, 85] [ 221.5, 86] [ 221.5, 87] [ 221.5, 88] [ 221.5, 89] [ 221.5, 90] [ 221.5, 91] [ 221.5, 92] [ 221.5, 93] [ 221.5, 94] [ 221.5, 95] [ 221.5, 96] [ 221.5, 97] [ 221.5, 98] [ 221.5, 99] [ 221.5, 100] [ 221.5, 101] [ 221.5, 102] [ 221.5, 103] [ 221.5, 104] [ 221.5, 105] [ 221.5, 106] [ 221.5, 107] [ 221.5, 108] [ 221.5, 109] [ 221.5, 110] [ 221.5, 111] [ 221.5, 112] [ 221.5, 113] [ 221.5, 114] [ 221.5, 115] [ 221.5, 116] [ 221.5, 117] [ 221.5, 118] [ 221.5, 119] [ 221.5, 120] [ 221.5, 121] [ 221.5, 122] [ 221.5, 123] [ 221.5, 124] [ 221.5, 125] [ 221.5, 126] [ 221.5, 127] [ 221.5, 128] [ 221.5, 129] [ 221.5, 130] [ 221.5, 131] [ 221.5, 132] [ 221.5, 133] [ 221.5, 134] [ 221.5, 135] [ 221.5, 136] [ 221.5, 137] [ 221.5, 138] [ 221.5, 139] [ 221.5, 140] [ 221.5, 141] [ 221.5, 142] [ 221.5, 143] [ 221.5, 144] [ 221.5, 145] [ 221.5, 146] [ 221.5, 147] [ 221.5, 148] [ 221.5, 149] [ 221.5, 150] [ 221.5, 151] [ 221.5, 152] [ 221.5, 153] [ 221.5, 154] [ 221.5, 155] [ 221.5, 156] [ 221.5, 157] [ 221.5, 158] [ 221.5, 159] [ 221.5, 160] [ 221.5, 161] [ 221.5, 162] [ 221.5, 163] [ 221.5, 164] [ 221.5, 165] [ 221.5, 166] [ 221.5, 167] [ 221.5, 168] [ 221.5, 169] [ 221.5, 170] [ 221.5, 171] [ 221.5, 172] [ 221.5, 173] [ 221.5, 174] [ 221.5, 175] [ 221.5, 176] [ 221.5, 177] [ 221.5, 178] [ 221.5, 179] [ 221.5, 180] [ 221.5, 181] [ 221.5, 182] [ 221.5, 183] [ 221.5, 184] [ 221.5, 185] [ 221.5, 186] [ 221.5, 187] [ 221.5, 188] [ 221.5, 189] [ 221.5, 190] [ 221.5, 191] [ 221.5, 192] [ 221.5, 193] [ 221.5, 194] [ 221.5, 195] [ 221.5, 196] [ 221.5, 197] [ 221.5, 198] [ 221.5, 199] [ 221.5, 200] [ 221.5, 201] [ 221.5, 202.5] [ 220, 202.5] [ 219, 202.5] [ 218, 202.5] [ 217, 202.5] [ 216, 202.5] [ 215, 202.5] [ 214, 202.5] [ 213, 202.5] [ 212, 202.5] [ 211, 202.5] [ 210, 202.5] [ 209, 202.5] [ 208, 202.5] [ 207, 202.5] [ 206, 202.5] [ 205, 202.5] [ 204, 202.5] [ 203, 202.5] [ 202, 202.5] [ 201, 202.5] [ 200, 202.5] [ 199, 202.5] [ 198, 202.5] [ 197, 202.5] [ 196, 202.5] [ 195, 202.5] [ 194, 202.5] [ 193, 202.5] [ 192, 202.5] [ 191, 202.5] [ 190, 202.5] [ 189, 202.5] [ 187.5, 202.5] [ 187.5, 201] [ 187.5, 200] [ 187.5, 199] [ 187.5, 198] [ 187.5, 197] [ 187.5, 196] [ 187.5, 195] [ 187.5, 194] [ 187.5, 193] [ 187.5, 192] [ 187.5, 191] [ 187.5, 190] [ 187.5, 189] [ 187.5, 188] [ 187.5, 187] [ 187.5, 186] [ 187.5, 185] [ 187.5, 184] [ 187.5, 183] [ 187.5, 182] [ 187.5, 181] [ 187.5, 180] [ 187.5, 179] [ 187.5, 178] [ 187.5, 177] [ 187.5, 176] [ 187.5, 175] [ 187.5, 174] [ 187.5, 173] [ 187.5, 172] [ 187.5, 171] [ 187.5, 170] [ 187.5, 169] [ 187.5, 168] [ 187.5, 167] [ 187.5, 166] [ 187.5, 165] [ 187.5, 164] [ 187.5, 163] [ 187.5, 162] [ 187.5, 161] [ 187.5, 160] [ 187.5, 159] [ 187.5, 158] [ 187.5, 157] [ 187.5, 156] [ 187.5, 155] [ 187.5, 154] [ 187.5, 153] [ 187.5, 152] [ 187.5, 151] [ 187.5, 150] [ 187.5, 149] [ 187.5, 148] [ 187.5, 147] [ 187.5, 146] [ 187.5, 145] [ 187.5, 144] [ 187.5, 143] [ 187.5, 142] [ 187.5, 141] [ 187.5, 140] [ 187.5, 139] [ 187.5, 138] [ 187.5, 137] [ 187.5, 136] [ 187.5, 135] [ 187.5, 134] [ 187.5, 133] [ 187.5, 132] [ 187.5, 131] [ 187.5, 130] [ 187.5, 129] [ 187.5, 128] [ 187.5, 127] [ 187.5, 126] [ 187.5, 125] [ 187.5, 124] [ 187.5, 123] [ 187.5, 122] [ 187.5, 121] [ 187.5, 120] [ 187.5, 119] [ 187.5, 118] [ 187.5, 117] [ 187.5, 116] [ 187.5, 115] [ 187.5, 114] [ 187.5, 113] [ 187.5, 112] [ 187.5, 111] [ 187.5, 110] [ 187.5, 109] [ 187.5, 108] [ 187.5, 107] [ 187.5, 106] [ 187.5, 105] [ 187.5, 104] [ 187.5, 103] [ 187.5, 102] [ 187.5, 101] [ 187.5, 100] [ 187.5, 99] [ 187.5, 98] [ 187.5, 97] [ 187.5, 96] [ 187.5, 95] [ 187.5, 94] [ 187.5, 93] [ 187.5, 92] [ 187.5, 91] [ 187.5, 90] [ 187.5, 89] [ 187.5, 88] [ 187.5, 87] [ 187.5, 86] [ 187.5, 85] [ 187.5, 84] [ 187.5, 83] [ 187.5, 82] [ 187.5, 81] [ 187.5, 80] [ 187.5, 79] [ 187.5, 78] [ 187.5, 77] [ 187.5, 76] [ 187.5, 75] [ 187.5, 74] [ 187.5, 73] [ 187.5, 72] [ 187.5, 71] [ 187.5, 70] [ 187.5, 69] [ 187.5, 68] [ 187.5, 67] [ 187.5, 66] [ 187.5, 65] [ 187.5, 64] [ 187.5, 63] [ 187.5, 62] [ 187.5, 61] [ 187.5, 60] [ 187.5, 59] [ 187.5, 58] [ 187.5, 57] [ 187.5, 56] [ 187.5, 55] [ 187.5, 54] [ 187.5, 53] [ 187.5, 52] [ 187.5, 51] [ 187.5, 50] [ 187.5, 49] [ 187.5, 48] [ 187.5, 47] [ 187.5, 46] [ 187.5, 45] [ 187.5, 44] [ 187.5, 43] [ 187.5, 42] [ 187.5, 41] [ 187.5, 40] [ 187.5, 39] [ 187.5, 38] [ 187.5, 37] [ 187.5, 36] [ 187.5, 35] [ 187.5, 34] [ 187.5, 33] -[ 134.5, 38.5] [ 136, 38.5] [ 137.5, 38.5] [ 138, 39.5] [ 139.5, 39.5] [ 140.5, 40.5] [ 141.5, 41.5] [ 141.5, 43] [ 142.5, 43.5] [ 142.5, 45] [ 143.5, 45.5] [ 143.5, 47] [ 144.5, 47.5] [ 144.5, 49] [ 145.5, 49.5] [ 145.5, 51] [ 145.5, 52] [ 146.5, 52.5] [ 146.5, 54] [ 146.5, 55] [ 146.5, 56] [ 147.5, 56.5] [ 147.5, 58] [ 147.5, 59] [ 147.5, 60] [ 148.5, 60.5] [ 148.5, 62] [ 148.5, 63] [ 148.5, 64] [ 149.5, 64.5] [ 149.5, 66] [ 149.5, 67] [ 149.5, 68] [ 149.5, 69] [ 150.5, 69.5] [ 150.5, 71] [ 150.5, 72] [ 150.5, 73] [ 150.5, 74] [ 150.5, 75] [ 151.5, 75.5] [ 151.5, 77] [ 151.5, 78] [ 151.5, 79] [ 151.5, 80] [ 151.5, 81] [ 151.5, 82] [ 151.5, 83] [ 152.5, 83.5] [ 152.5, 85] [ 152.5, 86] [ 152.5, 87] [ 152.5, 88] [ 152.5, 89] [ 152.5, 90] [ 152.5, 91] [ 152.5, 92] [ 153.5, 92.5] [ 153.5, 94] [ 153.5, 95] [ 153.5, 96] [ 153.5, 97] [ 153.5, 98] [ 153.5, 99] [ 153.5, 100] [ 153.5, 101] [ 153.5, 102] [ 153.5, 103] [ 153.5, 104] [ 153.5, 105] [ 153.5, 106] [ 153.5, 107] [ 154.5, 107.5] [ 154.5, 109] [ 154.5, 110] [ 154.5, 111] [ 154.5, 112] [ 154.5, 113] [ 154.5, 114] [ 154.5, 115] [ 154.5, 116] [ 154.5, 117] [ 154.5, 118] [ 154.5, 119] [ 154.5, 120] [ 154.5, 121] [ 154.5, 122] [ 154.5, 123] [ 154.5, 124] [ 154.5, 125] [ 154.5, 126] [ 154.5, 127] [ 154.5, 128] [ 154.5, 129] [ 154.5, 130] [ 154.5, 131] [ 154.5, 132] [ 154.5, 133] [ 154.5, 134] [ 154.5, 135] [ 154.5, 136] [ 154.5, 137] [ 154.5, 138] [ 154.5, 139] [ 154.5, 140] [ 154.5, 141] [ 154.5, 142] [ 154.5, 143] [ 154.5, 144] [ 154.5, 145] [ 154.5, 146] [ 154.5, 147] [ 154.5, 148] [ 154.5, 149.5] [ 153.5, 150] [ 153.5, 151] [ 153.5, 152] [ 153.5, 153] [ 153.5, 154] [ 153.5, 155] [ 153.5, 156] [ 153.5, 157] [ 153.5, 158] [ 153.5, 159] [ 153.5, 160] [ 153.5, 161] [ 153.5, 162] [ 153.5, 163] [ 153.5, 164.5] [ 152.5, 165] [ 152.5, 166] [ 152.5, 167] [ 152.5, 168] [ 152.5, 169] [ 152.5, 170] [ 152.5, 171] [ 152.5, 172] [ 152.5, 173.5] [ 151.5, 174] [ 151.5, 175] [ 151.5, 176] [ 151.5, 177] [ 151.5, 178] [ 151.5, 179] [ 151.5, 180] [ 151.5, 181.5] [ 150.5, 182] [ 150.5, 183] [ 150.5, 184] [ 150.5, 185] [ 150.5, 186] [ 150.5, 187.5] [ 149.5, 188] [ 149.5, 189] [ 149.5, 190] [ 149.5, 191] [ 149.5, 192.5] [ 148.5, 193] [ 148.5, 194] [ 148.5, 195] [ 148.5, 196.5] [ 147.5, 197] [ 147.5, 198] [ 147.5, 199] [ 147.5, 200.5] [ 146.5, 201] [ 146.5, 202] [ 146.5, 203] [ 146.5, 204.5] [ 145.5, 205] [ 145.5, 206] [ 145.5, 207.5] [ 144.5, 208] [ 144.5, 209.5] [ 143.5, 210] [ 143.5, 211.5] [ 142.5, 212] [ 142.5, 213.5] [ 141.5, 214] [ 141.5, 215.5] [ 140.5, 216.5] [ 139.5, 217.5] [ 138, 217.5] [ 137.5, 218.5] [ 136, 218.5] [ 134.5, 218.5] [ 134, 217.5] [ 132.5, 217.5] [ 131.5, 216.5] [ 130.5, 215.5] [ 130.5, 214] [ 129.5, 213.5] [ 129.5, 212] [ 128.5, 211.5] [ 128.5, 210] [ 127.5, 209.5] [ 127.5, 208] [ 126.5, 207.5] [ 126.5, 206] [ 126.5, 205] [ 125.5, 204.5] [ 125.5, 203] [ 125.5, 202] [ 125.5, 201] [ 124.5, 200.5] [ 124.5, 199] [ 124.5, 198] [ 124.5, 197] [ 123.5, 196.5] [ 123.5, 195] [ 123.5, 194] [ 123.5, 193] [ 122.5, 192.5] [ 122.5, 191] [ 122.5, 190] [ 122.5, 189] [ 122.5, 188] [ 121.5, 187.5] [ 121.5, 186] [ 121.5, 185] [ 121.5, 184] [ 121.5, 183] [ 121.5, 182] [ 120.5, 181.5] [ 120.5, 180] [ 120.5, 179] [ 120.5, 178] [ 120.5, 177] [ 120.5, 176] [ 120.5, 175] [ 120.5, 174] [ 119.5, 173.5] [ 119.5, 172] [ 119.5, 171] [ 119.5, 170] [ 119.5, 169] [ 119.5, 168] [ 119.5, 167] [ 119.5, 166] [ 119.5, 165] [ 118.5, 164.5] [ 118.5, 163] [ 118.5, 162] [ 118.5, 161] [ 118.5, 160] [ 118.5, 159] [ 118.5, 158] [ 118.5, 157] [ 118.5, 156] [ 118.5, 155] [ 118.5, 154] [ 118.5, 153] [ 118.5, 152] [ 118.5, 151] [ 118.5, 150] [ 117.5, 149.5] [ 117.5, 148] [ 117.5, 147] [ 117.5, 146] [ 117.5, 145] [ 117.5, 144] [ 117.5, 143] [ 117.5, 142] [ 117.5, 141] [ 117.5, 140] [ 117.5, 139] [ 117.5, 138] [ 117.5, 137] [ 117.5, 136] [ 117.5, 135] [ 117.5, 134] [ 117.5, 133] [ 117.5, 132] [ 117.5, 131] [ 117.5, 130] [ 117.5, 129] [ 117.5, 128] [ 117.5, 127] [ 117.5, 126] [ 117.5, 125] [ 117.5, 124] [ 117.5, 123] [ 117.5, 122] [ 117.5, 121] [ 117.5, 120] [ 117.5, 119] [ 117.5, 118] [ 117.5, 117] [ 117.5, 116] [ 117.5, 115] [ 117.5, 114] [ 117.5, 113] [ 117.5, 112] [ 117.5, 111] [ 117.5, 110] [ 117.5, 109] [ 117.5, 107.5] [ 118.5, 107] [ 118.5, 106] [ 118.5, 105] [ 118.5, 104] [ 118.5, 103] [ 118.5, 102] [ 118.5, 101] [ 118.5, 100] [ 118.5, 99] [ 118.5, 98] [ 118.5, 97] [ 118.5, 96] [ 118.5, 95] [ 118.5, 94] [ 118.5, 92.5] [ 119.5, 92] [ 119.5, 91] [ 119.5, 90] [ 119.5, 89] [ 119.5, 88] [ 119.5, 87] [ 119.5, 86] [ 119.5, 85] [ 119.5, 83.5] [ 120.5, 83] [ 120.5, 82] [ 120.5, 81] [ 120.5, 80] [ 120.5, 79] [ 120.5, 78] [ 120.5, 77] [ 120.5, 75.5] [ 121.5, 75] [ 121.5, 74] [ 121.5, 73] [ 121.5, 72] [ 121.5, 71] [ 121.5, 69.5] [ 122.5, 69] [ 122.5, 68] [ 122.5, 67] [ 122.5, 66] [ 122.5, 64.5] [ 123.5, 64] [ 123.5, 63] [ 123.5, 62] [ 123.5, 60.5] [ 124.5, 60] [ 124.5, 59] [ 124.5, 58] [ 124.5, 56.5] [ 125.5, 56] [ 125.5, 55] [ 125.5, 54] [ 125.5, 52.5] [ 126.5, 52] [ 126.5, 51] [ 126.5, 49.5] [ 127.5, 49] [ 127.5, 47.5] [ 128.5, 47] [ 128.5, 45.5] [ 129.5, 45] [ 129.5, 43.5] [ 130.5, 43] [ 130.5, 41.5] [ 131.5, 40.5] [ 132.5, 39.5] [ 134, 39.5] -[ 19.5, 30.5] [ 21, 30.5] [ 22, 30.5] [ 23, 30.5] [ 24, 30.5] [ 25, 30.5] [ 26, 30.5] [ 27, 30.5] [ 28, 30.5] [ 29, 30.5] [ 30, 30.5] [ 31, 30.5] [ 32, 30.5] [ 33, 30.5] [ 34, 30.5] [ 35, 30.5] [ 36, 30.5] [ 37, 30.5] [ 38, 30.5] [ 39, 30.5] [ 40, 30.5] [ 41, 30.5] [ 42, 30.5] [ 43, 30.5] [ 44, 30.5] [ 45, 30.5] [ 46, 30.5] [ 47, 30.5] [ 48, 30.5] [ 49, 30.5] [ 50, 30.5] [ 51, 30.5] [ 52, 30.5] [ 53, 30.5] [ 54, 30.5] [ 55, 30.5] [ 56, 30.5] [ 57, 30.5] [ 58, 30.5] [ 59, 30.5] [ 60, 30.5] [ 61, 30.5] [ 62, 30.5] [ 63, 30.5] [ 64, 30.5] [ 65, 30.5] [ 66, 30.5] [ 67, 30.5] [ 68, 30.5] [ 69, 30.5] [ 70, 30.5] [ 71, 30.5] [ 72, 30.5] [ 73, 30.5] [ 74, 30.5] [ 75, 30.5] [ 76, 30.5] [ 77, 30.5] [ 78, 30.5] [ 79, 30.5] [ 80, 30.5] [ 81, 30.5] [ 82, 30.5] [ 83, 30.5] [ 84.5, 30.5] [ 84.5, 32] [ 84.5, 33] [ 84.5, 34] [ 84.5, 35] [ 84.5, 36] [ 84.5, 37] [ 84.5, 38] [ 84.5, 39] [ 84.5, 40] [ 84.5, 41] [ 84.5, 42] [ 84.5, 43] [ 84.5, 44] [ 84.5, 45] [ 84.5, 46] [ 84.5, 47] [ 84.5, 48] [ 84.5, 49] [ 84.5, 50] [ 84.5, 51] [ 84.5, 52] [ 84.5, 53] [ 84.5, 54] [ 84.5, 55] [ 84.5, 56] [ 84.5, 57] [ 84.5, 58] [ 84.5, 59] [ 84.5, 60] [ 84.5, 61] [ 84.5, 62] [ 84.5, 63] [ 84.5, 64] [ 84.5, 65] [ 84.5, 66] [ 84.5, 67] [ 84.5, 68] [ 84.5, 69] [ 84.5, 70] [ 84.5, 71] [ 84.5, 72] [ 84.5, 73] [ 84.5, 74] [ 84.5, 75] [ 84.5, 76] [ 84.5, 77] [ 84.5, 78] [ 84.5, 79] [ 84.5, 80] [ 84.5, 81] [ 84.5, 82] [ 84.5, 83] [ 84.5, 84] [ 84.5, 85] [ 84.5, 86] [ 84.5, 87] [ 84.5, 88] [ 84.5, 89] [ 84.5, 90] [ 84.5, 91] [ 84.5, 92] [ 84.5, 93] [ 84.5, 94.5] [ 83, 94.5] [ 82, 94.5] [ 81, 94.5] [ 80, 94.5] [ 79, 94.5] [ 78, 94.5] [ 77, 94.5] [ 76, 94.5] [ 75, 94.5] [ 74, 94.5] [ 73, 94.5] [ 72, 94.5] [ 71, 94.5] [ 70, 94.5] [ 69, 94.5] [ 68, 94.5] [ 67, 94.5] [ 66, 94.5] [ 65, 94.5] [ 64, 94.5] [ 63, 94.5] [ 62, 94.5] [ 61, 94.5] [ 60, 94.5] [ 59, 94.5] [ 58, 94.5] [ 57, 94.5] [ 56, 94.5] [ 55, 94.5] [ 54, 94.5] [ 53, 94.5] [ 52, 94.5] [ 51, 94.5] [ 50, 94.5] [ 49, 94.5] [ 48, 94.5] [ 47, 94.5] [ 46, 94.5] [ 45, 94.5] [ 44, 94.5] [ 43, 94.5] [ 42, 94.5] [ 41, 94.5] [ 40, 94.5] [ 39, 94.5] [ 38, 94.5] [ 37, 94.5] [ 36, 94.5] [ 35, 94.5] [ 34, 94.5] [ 33, 94.5] [ 32, 94.5] [ 31, 94.5] [ 30, 94.5] [ 29, 94.5] [ 28, 94.5] [ 27, 94.5] [ 26, 94.5] [ 25, 94.5] [ 24, 94.5] [ 23, 94.5] [ 22, 94.5] [ 21, 94.5] [ 19.5, 94.5] [ 19.5, 93] [ 19.5, 92] [ 19.5, 91] [ 19.5, 90] [ 19.5, 89] [ 19.5, 88] [ 19.5, 87] [ 19.5, 86] [ 19.5, 85] [ 19.5, 84] [ 19.5, 83] [ 19.5, 82] [ 19.5, 81] [ 19.5, 80] [ 19.5, 79] [ 19.5, 78] [ 19.5, 77] [ 19.5, 76] [ 19.5, 75] [ 19.5, 74] [ 19.5, 73] [ 19.5, 72] [ 19.5, 71] [ 19.5, 70] [ 19.5, 69] [ 19.5, 68] [ 19.5, 67] [ 19.5, 66] [ 19.5, 65] [ 19.5, 64] [ 19.5, 63] [ 19.5, 62] [ 19.5, 61] [ 19.5, 60] [ 19.5, 59] [ 19.5, 58] [ 19.5, 57] [ 19.5, 56] [ 19.5, 55] [ 19.5, 54] [ 19.5, 53] [ 19.5, 52] [ 19.5, 51] [ 19.5, 50] [ 19.5, 49] [ 19.5, 48] [ 19.5, 47] [ 19.5, 46] [ 19.5, 45] [ 19.5, 44] [ 19.5, 43] [ 19.5, 42] [ 19.5, 41] [ 19.5, 40] [ 19.5, 39] [ 19.5, 38] [ 19.5, 37] [ 19.5, 36] [ 19.5, 35] [ 19.5, 34] [ 19.5, 33] [ 19.5, 32] +[ 2.5, -0.5] [ 4, -0.5] [ 5, -0.5] [ 6, -0.5] [ 7, -0.5] [ 8, -0.5] [ 9, -0.5] [ 10, -0.5] [ 11, -0.5] [ 12, -0.5] [ 13, -0.5] [ 14, -0.5] [ 15, -0.5] [ 16, -0.5] [ 17.5, -0.5] [ 17.5, 1] [ 17.5, 2.5] [ 16, 2.5] [ 15, 2.5] [ 14, 2.5] [ 13.5, 3] [ 13.5, 4] [ 13.5, 5.5] [ 12, 5.5] [ 11, 5.5] [ 10, 5.5] [ 9, 5.5] [ 8, 5.5] [ 6.5, 5.5] [ 6.5, 4] [ 6.5, 3] [ 6, 2.5] [ 5, 2.5] [ 4, 2.5] [ 2.5, 2.5] [ 2.5, 1] +[ 17.5, -0.5] [ 19.5, -0.5] [ 19.5, 1] [ 19.5, 2] [ 19.5, 3] [ 19.5, 4] [ 19.5, 5] [ 19.5, 6] [ 19.5, 7] [ 19.5, 8] [ 19.5, 9] [ 19.5, 10] [ 19.5, 11] [ 19.5, 12.5] [ 18, 12.5] [ 17, 12.5] [ 16, 12.5] [ 15, 12.5] [ 13.5, 12.5] [ 13.5, 11] [ 13.5, 10] [ 13.5, 9] [ 13.5, 8] [ 13.5, 7] [ 13.5, 6] [ 13.5, 5] [ 13.5, 4] [ 13.5, 2.5] [ 15, 2.5] [ 16, 2.5] [ 17, 2.5] [ 17.5, 2] [ 17.5, 1] +[ 6.5, 5.5] [ 8, 5.5] [ 9, 5.5] [ 10, 5.5] [ 11, 5.5] [ 12, 5.5] [ 13.5, 5.5] [ 13.5, 7] [ 13.5, 8] [ 13.5, 9] [ 13.5, 10] [ 13.5, 11] [ 13.5, 12.5] [ 12, 12.5] [ 11, 12.5] [ 10, 12.5] [ 9, 12.5] [ 8, 12.5] [ 7, 12.5] [ 6, 12.5] [ 5, 12.5] [ 4, 12.5] [ 3, 12.5] [ 2, 12.5] [ 1, 12.5] [ -0.5, 12.5] [ -0.5, 11] [ -0.5, 10] [ -0.5, 8.5] [ 1, 8.5] [ 2, 8.5] [ 3, 8.5] [ 4, 8.5] [ 5, 8.5] [ 6, 8.5] [ 6.5, 8] [ 6.5, 7] diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf deleted file mode 100644 index 0a2e444943b3e3b835f318120bccbb4c58d4a4fb..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:881459241d920b7b0b0f04690ca4b64da9b40043e9761e8089867688fd8c868c -size 6583 diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp deleted file mode 100644 index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30 -size 12860 diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx deleted file mode 100644 index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664 -size 668 diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf deleted file mode 100644 index 7f7a14e7e93b6ae0e262ae25f9c8735b61407051..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0f0a24f1a9e719f6b7f9cea9e8dbb89d90436b8837178c1f7e2155f555cd274c -size 1517 diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp deleted file mode 100644 index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840 -size 3228 diff --git a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx deleted file mode 100644 index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d -size 252 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf deleted file mode 100644 index 1fd9789d1f9e5997ac7ecf8151b5501981153bdd..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:abe817af5f07dd14805d6a14fe5a75fb988340ca1ffcc8e81d8e7adee531a42b -size 6583 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp deleted file mode 100644 index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30 -size 12860 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx deleted file mode 100644 index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664 -size 668 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf deleted file mode 100644 index a84548112ba0945d770a527ac2d727f420a5e731..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b5fc99954f197ed6d0bcfc9ecf4178eb77f5893ba17b32a0906555a5c16fb63 -size 1517 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp deleted file mode 100644 index 4df7fd5f11a76ae2d527a9be87e52e380efe6edd..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a02afbec1aac0b3b812282d4877310d5ce035b9fce9aa4d2427244a0c4404840 -size 3228 diff --git a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx b/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx deleted file mode 100644 index e8977f2d43cf2cc9b3b6dc1bd080b67d024f7573..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ce4dc76a26a8fafad2f5e083c3aea4f5494319c7a46cfa7a339a0fd48161aa1d -size 252 diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf deleted file mode 100644 index a2d1962a67cfe76b01ba616264e3b432995b312b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e675961d8adb260fa0e564558e79e158c2511d7a1cbd464667b2cf7927f702fd -size 785 diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp deleted file mode 100644 index 8ac2142c3235efbf2e8cf2803f9aeff3bba4649d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4e720cbe159c9438355353a79261f74beba401408778cd8669afc74ec9301b26 -size 15684 diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx deleted file mode 100644 index ecb34a6fd196a31064ce103077a3e80a450e6181..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7af082714c0e2d805f31e4f713599b7dda549f6ff99d81fb33efe41e160ff384 -size 580 diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf index a2d1962a67cfe76b01ba616264e3b432995b312b..9ed672feb1457ec0eef8027c7e3b062082623cd7 100644 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf +++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.dbf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e675961d8adb260fa0e564558e79e158c2511d7a1cbd464667b2cf7927f702fd -size 785 +oid sha256:039b117e408a00a939a7eb4268f1ef488e08a793645a9df2617a999008aab0b2 +size 2466 diff --git a/Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.prj b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.prj similarity index 100% rename from Data/Baseline/OTB-Applications/Files/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.1.prj rename to Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.prj diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp index 199475acddb250a1349fbf18a06fd729b5283ba0..5521bb667bc0b70f5523f27a3ddd12a988143272 100644 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp +++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d51f57a1463023f790db62d41cfea1ea1364d0703fde4b0a179a409536fd4990 -size 22756 +oid sha256:ac714bc9b3d7f861e18549af2ee9df1264cfdb3595a27d43fd621ee3ee854263 +size 50020 diff --git a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx index 21af605da762cae678e5f94bbbb443f172c2984c..375bc0d40fca7103f87b18f4c088c0d474b294d1 100644 --- a/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx +++ b/Data/Baseline/OTB/Files/bfTvVectorDataToRandomLineGeneratorOutput.shx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a3cced39b706cd73f652e67d5a3e752aadff2a4ba95ce4a24714c0bd73b350e4 -size 580 +oid sha256:db653974b1e2e7b5c5c878f0cef7871fb75a8d7d48739723e26f281e04d32555 +size 1700 diff --git a/Data/Baseline/OTB/Files/feAlign.txt b/Data/Baseline/OTB/Files/feAlign.txt deleted file mode 100644 index 9803d3b15840ab23977df19847fd69b6f705bdc2..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feAlign.txt +++ /dev/null @@ -1,759 +0,0 @@ -Nb Segment: 758 - 260.335 4.536 - 262.335 4.536 - 270.335 4.536 - 281.331 4.667 - 281.333 4.601 - 282.331 4.667 - 281.335 4.536 - 283.333 4.601 - 282.335 4.536 - 283.335 4.536 - 285.333 4.601 - 285.335 4.536 - 287.333 4.601 - 286.335 4.536 - 287.335 4.536 - 288.335 4.536 - 290.333 4.601 - 289.335 4.536 - 290.335 4.536 - 294.329 4.732 - 291.335 4.536 - 294.331 4.667 - 294.333 4.601 - 294.335 4.536 - 304.344 4.274 - 304.348 4.144 - 350.389 51.394 - 350.408 51.199 - 346.504 50.223 - 346.523 50.028 - 344.581 49.443 - 339.677 48.468 - 340.677 48.468 - 339.716 48.077 - 336.792 47.297 - 328.119 43.981 - 341.888 46.322 - 337.985 45.346 - 338.004 45.151 - 338.023 44.956 - 338.042 44.761 - 337.081 44.371 - 338.061 44.566 - 343.965 45.541 - 337.100 44.176 - 343.985 45.346 - 316.542 39.689 - 324.673 43.758 - 326.639 44.017 - 334.401 45.829 - 332.503 45.052 - 370.378 53.593 - 324.048 40.911 - 328.878 42.205 - 324.082 40.652 - 327.980 41.429 - 328.946 41.688 - 328.014 41.170 - 335.776 42.982 - 337.776 42.982 - 333.495 41.930 - 351.805 46.109 - 390.104 20.072 - 367.315 131.143 - 368.315 131.143 - 367.391 130.760 - 347.105 168.454 - 347.209 168.012 - 366.974 130.417 - 371.562 132.187 - 365.284 129.091 - 365.387 128.648 - 296.949 169.500 - 297.949 169.500 - 297.083 169.000 - 323.805 177.500 - 323.939 177.000 - 294.772 166.727 - 54.788 141.714 - 51.789 101.502 - 49.692 80.905 - 48.742 71.097 - 43.817 16.173 - 43.841 11.269 - 42.500 -0.500 - 72.923 344.523 - 55.601 152.183 - 56.515 159.123 - 56.687 145.242 - 51.683 99.636 - 48.506 67.910 - 46.504 45.106 - 44.372 21.312 - 42.500 -0.500 - 43.500 -0.500 - 43.631 0.491 - 294.713 418.881 - 329.666 388.146 - 333.713 418.881 - 339.277 407.975 - 499.546 30.235 - 43.500 -0.500 - 44.565 0.498 - 46.416 13.470 - 47.135 24.446 - 52.190 86.314 - 55.218 117.247 - 57.918 143.192 - 60.095 161.153 - 143.670 444.545 - 159.787 141.196 - 159.853 142.194 - 255.904 417.603 - 275.969 418.601 - 252.639 47.397 - 261.574 46.399 - 268.546 15.466 - 293.923 402.635 - 295.446 410.618 - 271.855 35.423 - 333.969 418.601 - 333.904 417.603 - 444.808 19.457 - 449.209 71.346 - 469.023 7.483 - 498.500 -0.500 - 21.500 320.500 - 22.500 419.500 - 44.500 -0.500 - 45.500 13.500 - 46.500 20.500 - 47.500 27.500 - 48.500 15.500 - 56.500 133.500 - 57.500 142.500 - 58.500 153.500 - 59.500 161.500 - 143.500 444.500 - 144.500 461.500 - 160.500 143.500 - 160.500 142.500 - 196.500 417.500 - 216.500 421.500 - 236.500 421.500 - 236.500 418.500 - 253.500 9.500 - 253.500 22.500 - 255.500 412.500 - 256.500 419.500 - 265.500 12.500 - 269.500 72.500 - 273.500 11.500 - 295.500 412.500 - 296.500 20.500 - 441.500 4.500 - 442.500 48.500 - 445.500 15.500 - 445.500 2.500 - 453.500 8.500 - 468.500 72.500 - 472.500 44.500 - 499.500 9.500 - 499.500 10.500 - 22.442 427.581 - 22.330 444.545 - 60.185 172.130 - 143.976 480.468 - 144.303 475.479 - 197.161 416.605 - 197.227 415.607 - 216.704 423.590 - 254.603 28.438 - 268.584 13.470 - 268.519 14.468 - 273.323 17.461 - 274.781 10.476 - 262.309 322.806 - 287.584 13.470 - 291.072 82.322 - 296.781 10.476 - 297.715 11.474 - 283.069 448.537 - 418.352 93.299 - 145.847 475.394 - 197.418 417.890 - 197.287 418.881 - 295.365 46.098 - 296.887 42.132 - 301.058 78.816 - 304.407 60.970 - 313.064 10.406 - 297.696 38.731 - 397.832 465.373 - 404.100 438.892 - 412.513 401.622 - 417.610 381.025 - 423.682 355.525 - 419.513 401.622 - 428.512 361.410 - 344.607 234.220 - 346.901 229.390 - 352.642 230.356 - 357.007 217.799 - 232.533 240.967 - 252.926 192.674 - 231.747 258.012 - 347.712 228.657 - 348.033 227.710 - 355.033 227.710 - 201.301 309.000 - 211.485 286.827 - 213.634 284.055 - 240.656 221.231 - 239.508 224.003 - 253.519 192.591 - 254.136 193.515 - 182.809 368.128 - 192.994 345.955 - 209.684 308.076 - 217.955 290.522 - 234.645 252.643 - 232.731 257.262 - 347.064 232.318 - 255.293 190.534 - 255.850 191.431 - 250.985 201.296 - 248.004 209.368 - 244.139 219.234 - 233.197 243.449 - 232.755 244.346 - 224.025 264.077 - 213.968 286.499 - 206.122 304.437 - 188.988 341.209 - 196.103 343.002 - 181.181 375.290 - 85.500 292.217 - 229.000 253.245 - 308.500 117.279 - 214.000 286.154 - 165.337 394.590 - 229.122 359.682 - 314.598 112.276 - 444.645 1.719 - 446.637 1.588 - 482.500 -0.500 - 482.502 -0.435 - 482.504 -0.369 - 484.502 -0.435 - 484.504 -0.369 - 486.502 -0.435 - 488.500 -0.500 - 488.502 -0.435 - 488.504 -0.369 - 425.866 350.358 - 425.349 353.290 - 423.278 362.017 - 423.019 363.983 - 421.466 370.778 - 423.278 364.017 - 421.466 371.778 - 418.102 384.336 - 419.396 380.506 - 417.066 390.199 - 416.031 395.063 - 414.478 401.858 - 414.478 402.858 - 411.113 416.416 - 407.490 430.938 - 425.349 364.290 - 403.867 445.461 - 419.396 388.506 - 401.020 458.087 - 399.984 462.950 - 399.467 465.882 - 399.984 464.950 - 408.266 435.041 - 403.461 455.828 - 470.252 292.115 - 470.499 294.366 - 230.937 358.280 - 234.021 356.979 - 224.122 367.878 - 213.786 256.177 - 216.160 256.172 - 212.002 259.950 - 210.855 260.500 - 206.460 264.436 - 122.154 335.011 - 202.848 266.934 - 196.119 270.218 - 115.630 338.540 - 188.802 273.490 - 184.879 288.270 - 118.186 419.536 - 392.518 211.033 - 181.340 275.835 - 176.383 290.487 - 108.965 341.363 - 117.888 420.188 - 116.896 420.319 - 305.271 458.519 - 102.376 227.250 - 171.228 277.737 - 167.237 292.999 - 170.230 292.802 - 127.322 419.615 - 143.288 419.568 - 189.189 442.560 - 193.181 443.298 - 194.179 443.233 - 279.995 443.608 - 293.965 443.692 - 306.937 443.842 - 305.939 443.908 - 325.896 443.600 - 331.883 444.207 - 311.926 460.515 - 326.894 460.534 - 491.500 -0.500 - 327.500 3.500 - 376.500 189.500 - 377.500 189.500 - 437.500 213.500 - 163.500 266.500 - 164.500 278.500 - 165.500 278.500 - 161.500 293.500 - 158.500 295.500 - 72.500 326.500 - 73.500 326.500 - 253.500 417.500 - 138.500 419.500 - 137.500 419.500 - 139.500 420.500 - 137.500 421.500 - 193.500 442.500 - 332.500 443.500 - 333.500 443.500 - 334.500 444.500 - 333.500 444.500 - 344.500 460.500 - 343.500 460.500 - 340.500 461.500 - 340.500 462.500 - 346.500 471.500 - 165.500 476.500 - 288.500 499.500 - 378.783 185.867 - 406.723 192.698 - 165.241 266.871 - 159.254 278.478 - 100.380 328.619 - 233.095 417.318 - 332.881 443.858 - 333.879 443.924 - 326.894 444.466 - 325.896 444.400 - 310.928 444.419 - 309.930 444.354 - 294.962 444.373 - 295.960 444.438 - 273.010 443.934 - 205.155 443.487 - 204.157 443.421 - 189.189 443.440 - 340.864 461.381 - 340.864 462.381 - 320.907 462.073 - 275.005 462.065 - 228.106 471.991 - 166.239 476.936 - 387.561 129.315 - 375.663 186.748 - 361.783 189.921 - 360.792 189.791 - 166.469 262.207 - 150.606 279.119 - 333.031 462.136 - 369.267 186.407 - 358.478 190.261 - 420.268 222.552 - 372.209 212.992 - 390.844 217.699 - 335.920 254.774 - 147.609 279.317 - 136.821 278.171 - 490.884 356.598 - 505.596 359.525 - 367.543 179.195 - 378.168 216.042 - 297.996 198.560 - 363.679 263.160 - 136.687 278.337 - 126.062 276.490 - 101.913 383.020 - 364.673 178.998 - 365.620 179.320 - 121.312 275.388 - 379.557 137.926 - 337.554 186.941 - 335.169 198.964 - 462.382 215.302 - 432.309 266.928 - 453.360 287.390 - 465.245 220.245 - 454.639 209.639 - 210.687 195.687 - 211.394 196.394 - 351.051 144.868 - 351.500 147.104 - 351.000 147.238 - 349.507 148.038 - 509.214 489.712 - 508.893 489.765 - 509.465 491.636 - 509.206 491.670 - 508.688 490.739 - 423.490 41.070 - 420.173 26.396 - 420.173 30.396 - 384.885 492.383 - 368.078 499.443 - 367.284 498.558 - 448.100 482.194 - 449.203 481.751 - 150.096 311.096 - 159.323 323.292 - 158.345 321.036 - 158.441 324.062 - 158.832 323.269 - 158.006 320.889 - 157.386 321.756 - 51.673 496.620 - 84.498 487.697 - 315.363 441.099 - 80.688 467.592 - 166.559 358.825 - 166.886 363.815 - 269.650 497.528 - 253.478 159.254 - 253.432 143.288 - 252.470 113.352 - 252.404 112.354 - 274.922 440.650 - 251.377 81.421 - 251.442 82.419 - 251.461 67.451 - 250.480 52.483 - 250.434 36.517 - 260.451 128.320 - 332.922 440.650 - 441.254 125.326 - 449.862 119.339 - 464.704 86.410 - 473.872 58.470 - 79.500 454.500 - 80.500 478.500 - 141.500 491.500 - 142.500 485.500 - 215.500 454.500 - 215.500 453.500 - 228.500 498.500 - 235.500 441.500 - 248.500 498.500 - 249.500 28.500 - 250.500 83.500 - 251.500 112.500 - 252.500 145.500 - 253.500 162.500 - 253.500 161.500 - 254.500 436.500 - 254.500 437.500 - 257.500 145.500 - 260.500 132.500 - 266.500 125.500 - 268.500 106.500 - 269.500 498.500 - 274.500 436.500 - 290.500 138.500 - 433.500 102.500 - 438.500 79.500 - 452.500 47.500 - 464.500 115.500 - 471.500 87.500 - 474.500 92.500 - 156.078 440.650 - 250.558 82.419 - 228.612 493.536 - 257.558 82.419 - 253.522 159.254 - 255.830 139.296 - 266.511 98.384 - 268.689 80.423 - 271.372 146.281 - 294.923 107.365 - 297.054 105.369 - 491.128 58.470 - 155.506 442.090 - 252.578 137.717 - 274.273 147.631 - 289.927 119.871 - 292.494 107.973 - 412.205 406.398 - 405.504 464.894 - 393.377 485.980 - 398.474 465.384 - 399.059 462.442 - 407.083 427.133 - 410.424 415.364 - 417.472 384.959 - 405.279 466.365 - 437.665 343.767 - 437.470 344.747 - 344.793 259.359 - 412.523 398.453 - 406.017 426.464 - 395.888 467.999 - 392.523 480.556 - 390.935 490.216 - 396.123 496.977 - 390.572 489.668 - 180.137 373.766 - 186.495 360.832 - 165.902 400.185 - 153.000 376.266 - 151.391 377.465 - 252.205 501.474 - 256.205 501.474 - 260.198 501.278 - 260.200 501.344 - 260.202 501.409 - 260.205 501.474 - 264.198 501.278 - 391.162 500.166 - 391.164 500.232 - 391.166 500.297 - 391.168 500.363 - 391.170 500.428 - 391.172 500.493 - 393.170 500.428 - 393.172 500.493 - 395.170 500.428 - 395.172 500.493 - 397.170 500.428 - 397.172 500.493 - 399.170 500.428 - 422.170 500.428 - 422.172 500.493 - 424.170 500.428 - 424.172 500.493 - 170.864 228.008 - 110.917 338.054 - 168.375 219.000 - 106.887 339.500 - 369.256 123.951 - 352.454 112.033 - 148.217 281.921 - 106.576 385.403 - 111.533 384.751 - 167.054 446.441 - 251.958 4.953 - 304.845 5.487 - 305.843 5.421 - 321.808 113.375 - 353.740 188.282 - 363.719 201.628 - 129.222 262.998 - 103.277 384.698 - 176.121 415.924 - 243.975 416.476 - 258.943 416.495 - 117.247 448.782 - 117.247 449.782 - 184.104 446.400 - 214.040 445.438 - 299.856 445.814 - 310.832 446.094 - 307.838 446.290 - 197.076 477.550 - 217.033 477.242 - 269.920 476.776 - 274.909 477.449 - 275.907 477.383 - 289.877 477.468 - 251.500 4.500 - 255.500 5.500 - 347.500 187.500 - 352.500 188.500 - 353.500 201.500 - 137.500 262.500 - 140.500 281.500 - 141.500 294.500 - 140.500 294.500 - 136.500 296.500 - 96.500 384.500 - 99.500 397.500 - 154.500 415.500 - 174.500 416.500 - 197.500 442.500 - 198.500 442.500 - 157.500 445.500 - 286.500 446.500 - 130.500 459.500 - 171.500 464.500 - 155.500 469.500 - 147.500 470.500 - 199.500 476.500 - 170.500 476.500 - 169.500 477.500 - 420.500 498.500 - 25.500 500.500 - 359.727 184.111 - 342.763 186.999 - 132.215 262.199 - 99.286 398.040 - 257.945 415.439 - 243.975 415.524 - 239.984 416.262 - 218.031 415.823 - 170.134 415.684 - 113.256 412.956 - 304.845 445.513 - 289.877 445.532 - 219.029 442.889 - 199.072 442.581 - 200.070 442.646 - 312.828 470.037 - 241.980 469.393 - 156.164 464.768 - 305.843 476.579 - 184.104 469.600 - 274.909 476.551 - 270.918 477.290 - 229.008 476.543 - 214.040 476.562 - 418.601 497.969 - 325.685 45.443 - 352.454 181.967 - 355.429 183.359 - 345.514 185.054 - 339.566 185.270 - 343.531 186.793 - 323.702 222.182 - 126.405 234.207 - 118.473 278.163 - 181.926 415.517 - 238.438 467.957 - 432.761 498.540 - 434.969 132.120 - 333.948 169.026 - 353.563 173.928 - 346.698 179.562 - 348.660 180.952 - 351.602 181.537 - 345.717 185.367 - 335.909 184.416 - 324.140 221.075 - 120.137 231.496 - 122.098 232.886 - 86.790 337.863 - 349.640 482.147 - 359.448 485.098 - 436.098 129.486 - 340.472 168.863 - 334.676 168.310 - 339.506 175.604 - 347.233 179.675 - 262.232 374.899 - 84.501 381.276 - 351.097 481.710 - 353.029 483.228 - 351.097 485.710 - 352.705 171.397 - 342.289 168.861 - 340.395 169.218 - 301.571 172.039 - 114.079 228.394 - 365.015 484.576 - 353.652 481.718 - 356.493 482.683 - 346.879 168.389 - 345.955 170.006 - 341.335 169.093 - 71.006 253.279 - 21.018 395.796 - 21.999 411.763 - 21.933 411.766 - 21.868 411.768 - 21.802 411.770 - 21.737 411.772 - 21.672 411.774 - 21.606 411.776 - 21.541 411.778 - 21.606 413.776 - 21.541 413.778 - 21.606 415.776 - 21.541 415.778 - 21.606 417.776 - 21.606 418.776 - 21.541 417.778 - 21.541 418.778 - 21.606 420.776 - 21.541 419.778 - 21.541 420.778 - 21.737 424.772 - 21.672 423.774 - 21.606 423.776 - 21.672 424.774 - 21.606 424.776 - 21.541 423.778 - 21.541 424.778 - 21.606 426.776 - 21.541 425.778 - 21.541 426.778 - 21.606 428.776 - 21.541 427.778 - 21.541 428.778 - 21.606 430.776 - 21.541 430.778 - 21.606 432.776 - 21.541 432.778 - 21.606 434.776 - 21.541 434.778 - 21.606 436.776 - 21.541 441.778 - 21.606 443.776 - 21.541 443.778 - 22.129 454.759 - 22.129 455.759 - 22.064 454.761 - 21.999 454.763 - 21.868 454.768 - 21.868 455.768 - 21.802 454.770 - 21.737 454.772 - 21.737 455.772 - 21.672 454.774 - 21.606 454.776 - 21.606 455.776 - 21.541 454.778 - 21.737 458.772 - 21.541 455.778 - 21.672 458.774 - 21.606 458.776 - 21.541 457.778 - 21.541 458.778 - 21.606 460.776 - 21.541 459.778 - 21.541 460.778 - 21.737 464.772 - 21.672 464.774 - 21.606 464.776 - 21.541 463.778 - 21.541 464.778 - 21.606 466.776 - 21.541 466.778 - 21.606 468.776 diff --git a/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt b/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt deleted file mode 100644 index 0f5ea993520cabcf3ff996765f2e7c2173b782cb..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feBreakAngularPathListOutput.txt +++ /dev/null @@ -1,171 +0,0 @@ --------------------------------------------------------------------------- -MAX ANGULAR :0.174533(10 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1] -Path 3: [11, 1], [21, 11] -Path 4: [21, 11], [31, 11] -Path 5: [1, 1], [5, 1], [7, 1], [11, 1] -Path 6: [11, 1], [21, 11] -Path 7: [21, 11], [31, 11], [41, 11] -Path 8: [1, 1], [5, 1], [7, 1], [11, 1] -Path 9: [11, 1], [21, 11] -Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 11: [1, 11], [5, 11], [7, 11], [11, 11] -Path 12: [11, 11], [21, 1] -Path 13: [21, 1], [31, 1], [41, 1] -Path 14: [1, 1], [5, 1], [7, 1], [11, 1] -Path 15: [11, 1], [21, 11], [31, 21], [41, 31] -Path 16: [1, 1], [5, 1] -Path 17: [5, 1], [5, 11], [5, 21] -Path 18: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :0.349066(20 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1] -Path 3: [11, 1], [21, 11] -Path 4: [21, 11], [31, 11] -Path 5: [1, 1], [5, 1], [7, 1], [11, 1] -Path 6: [11, 1], [21, 11] -Path 7: [21, 11], [31, 11], [41, 11] -Path 8: [1, 1], [5, 1], [7, 1], [11, 1] -Path 9: [11, 1], [21, 11] -Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 11: [1, 11], [5, 11], [7, 11], [11, 11] -Path 12: [11, 11], [21, 1] -Path 13: [21, 1], [31, 1], [41, 1] -Path 14: [1, 1], [5, 1], [7, 1], [11, 1] -Path 15: [11, 1], [21, 11], [31, 21], [41, 31] -Path 16: [1, 1], [5, 1] -Path 17: [5, 1], [5, 11], [5, 21] -Path 18: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :0.523599(30 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1] -Path 3: [11, 1], [21, 11] -Path 4: [21, 11], [31, 11] -Path 5: [1, 1], [5, 1], [7, 1], [11, 1] -Path 6: [11, 1], [21, 11] -Path 7: [21, 11], [31, 11], [41, 11] -Path 8: [1, 1], [5, 1], [7, 1], [11, 1] -Path 9: [11, 1], [21, 11] -Path 10: [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 11: [1, 11], [5, 11], [7, 11], [11, 11] -Path 12: [11, 11], [21, 1] -Path 13: [21, 1], [31, 1], [41, 1] -Path 14: [1, 1], [5, 1], [7, 1], [11, 1] -Path 15: [11, 1], [21, 11], [31, 21], [41, 31] -Path 16: [1, 1], [5, 1] -Path 17: [5, 1], [5, 11], [5, 21] -Path 18: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :0.872665(50 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1] -Path 8: [5, 1], [5, 11], [5, 21] -Path 9: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :1.5708(90 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :2.44346(140 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] --------------------------------------------------------------------------- -MAX ANGULAR :3.14159(180 deg.) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] -OUTPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -Path 5: [1, 11], [5, 11], [7, 11], [11, 11], [21, 1], [31, 1], [41, 1] -Path 6: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 21], [41, 31] -Path 7: [1, 1], [5, 1], [5, 11], [5, 21] -Path 8: [1, 1], [31, 1], [41, 1] diff --git a/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt b/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt deleted file mode 100644 index 7e18b94533e5f25319caa19feb2f28bd5c96573a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feTvLikelihoodPathOutput.txt +++ /dev/null @@ -1,8 +0,0 @@ -INPUT list of Path : -Path 1: [157, 335], [204, 376] -Path 2: [21, 305], [35, 308], [77, 354], [85, 358] -Path 3: [73, 160], [126, 173] -OUTPUT list of Path : -Path 1: [157, 335], [204, 376] Value: 4.68584e-07 -Path 2: [21, 305], [35, 308], [77, 354], [85, 358] Value: 1.87363e-07 -Path 3: [73, 160], [126, 173] Value: 9.76259e-08 diff --git a/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt b/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt deleted file mode 100644 index 708fabe135918d33f8ab62d9af7bba6f1b48bf2d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feTvLinkPathOutput.txt +++ /dev/null @@ -1,23 +0,0 @@ -Maximum distance threshold: 30 (30) -Maximum angle threshold: 0.698132 (40) -INPUT list of Path : -Path 1: [1, 1], [51, 1] -Path 2: [61, 1], [91, 1] -Path 3: [111, 11], [211, 11] -Path 4: [1, 51], [51, 51] -Path 5: [71, 71], [71, 91] -Path 6: [71, 131], [71, 201] -Path 7: [141, 111], [101, 111] -Path 8: [151, 111], [191, 111] -Path 9: [111, 71], [141, 71] -Path 10: [181, 71], [151, 71] -Path 11: [11, 131], [11, 101] -Path 12: [11, 171], [11, 141] -OUTPUT list of Path : -Path 1: [1, 51], [51, 51] -Path 2: [71, 71], [71, 91] -Path 3: [71, 131], [71, 201] -Path 4: [211, 11], [111, 11], [91, 1], [61, 1], [51, 1], [1, 1] -Path 5: [101, 111], [141, 111], [151, 111], [191, 111] -Path 6: [111, 71], [141, 71], [151, 71], [181, 71] -Path 7: [11, 101], [11, 131], [11, 141], [11, 171] diff --git a/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt b/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt deleted file mode 100644 index fffefd4d766972197ca2a3b918db2f8e303d2fc5..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feTvRemoveTortuousPathOutput.txt +++ /dev/null @@ -1,8 +0,0 @@ -Minimum Mean Distance: 10 (10) -INPUT list of Path : -Path 1: [1, 1], [1, 11] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1] -Path 3: [1, 1], [7, 7], [21, 21], [31, 31], [41, 41] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -OUTPUT list of Path : -Path 1: [1, 1], [7, 7], [21, 21], [31, 31], [41, 41] diff --git a/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt b/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt deleted file mode 100644 index 1da7ddfb7e7e9e2d787dcd41ac9d007c39a44af7..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feTvSimplifyPathOutput.txt +++ /dev/null @@ -1,11 +0,0 @@ -TOLERANCE: 1(1) -INPUT list of Path : -Path 1: [1, 1], [5, 1], [7, 1], [11, 1], [21, 1], [31, 1] -Path 2: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [5, 5], [7, 7], [11, 11], [21, 21], [31, 31], [41, 41] -Path 4: [1, 1], [5, 1], [7, 1], [11, 1], [21, 11], [31, 11], [41, 11], [58, 11], [70, 11] -OUTPUT list of Path : -Path 1: [1, 1], [31, 1] -Path 2: [1, 1], [11, 1], [21, 11], [31, 11] -Path 3: [1, 1], [41, 41] -Path 4: [1, 1], [11, 1], [21, 11], [70, 11] diff --git a/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt b/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt deleted file mode 100644 index 348001835a5c6b8f4c03b9562ef9b47f41688704..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/feTvVectorizationPathListOutput.txt +++ /dev/null @@ -1,385 +0,0 @@ -Path 0: [523, 4], [522, 4], [521.519, 5], [521, 5.47291], [520.558, 6], [520, 6.41957], [519.517, 7], [519, 7.20893], [519, 8] -Path 1: [666, 0], [666, 0.755514], [666.534, 1], [667, 1.54937], [668, 2], [669, 2], [670, 3], [671, 4], [671, 5], [672, 5.56069], [673, 6.5845], [673, 8], [673.481, 9], [674, 9.47953], [674.36, 10], [675, 10.6091], [675.621, 12], [676.458, 13], [677, 13.577], [677, 15], [677, 16], [677.422, 17], [678, 17.4808], [678, 18], [678.364, 19], [679, 19], [680, 19.9039] -Path 2: [595, 4.40433], [594, 5], [593, 6.39503], [592.184, 7], [592, 7.50127], [591, 8.36608], [590, 9.17569], [589, 10], [588, 11], [587, 11], [586.346, 12], [585, 12.5495], [584.553, 14], [584, 14.5519], [583.543, 16], [583, 16.5361], [582.445, 18], [581.502, 19], [581, 19.513], [580, 20.6132], [579.468, 22], [578.542, 23], [578, 23.4978], [577.545, 24], [577, 24.5768], [576.326, 26], [575.445, 27], [574.581, 28], [574, 28.6009], [573.411, 30], [572.445, 31], [571.434, 32], [570.481, 33], [570, 34], [569.454, 35], [568.566, 36], [568, 36.5643], [567.429, 38], [566.521, 39], [566, 39.6024], [565.476, 41], [565, 42], [564.421, 43], [563.547, 44], [563, 44.543], [562, 45.6124], [561.433, 47], [561, 48], [560.393, 49], [559.581, 50], [559, 50.5958], [558.48, 52], [557.499, 53], [556.523, 54], [556, 54.5515], [555.42, 56], [555, 57], [554.467, 58], [554, 59], [553.446, 60], [552.531, 61], [552, 61.5413], [551.499, 63], [551, 64], [550.571, 65], [550, 65.5952], [549.552, 67], [549, 67.5817], [548.426, 69], [547.443, 70], [546.491, 71], [545.546, 72], [545, 72.5362], [544.436, 74], [543.477, 75], [542.467, 76], [541.449, 77], [540.513, 78], [540, 78.5659], [539.511, 80], [539, 80.5386], [538.448, 82], [537.487, 83], [536.504, 84], [536, 84.5229], [535, 85.5753], [534.473, 87], [534, 88], [533.428, 89], [532.493, 90], [531.545, 91], [531, 91.5473], [530.471, 93], [530, 94], [529.487, 95], [529, 96], [528.47, 97], [527.53, 98], [527, 98.5852], [526, 99.6065], [525.437, 101], [525, 102], [524.431, 103], [523.519, 104], [523, 104.522], [522, 105.524], [521, 106.55], [520.409, 108], [519.539, 109], [519, 109.546], [518.488, 111], [517.542, 112], [517, 112.57], [516, 113.611], [515.494, 115], [515, 116], [514.478, 117], [513.597, 118], [513, 118.568], [512.418, 120], [511.505, 121], [511, 121.593], [510.533, 123], [510, 123.522], [509.532, 125], [509, 125.535], [508.383, 127], [507.457, 128], [507, 129], [506.463, 130], [506, 131], [505.428, 132], [504.472, 133], [503.459, 134], [502.495, 135], [502, 136], [501.424, 137], [500.563, 138], [500, 138.53], [499.495, 140], [498.496, 141], [497.439, 142], [496.45, 143], [495.552, 144], [495, 144.55], [494.521, 146], [494, 146.501], [493, 147.526], [492, 148.568], [491.361, 150], [490.486, 151], [490, 152], [489.467, 153], [488.591, 154], [488, 154.596], [487.456, 156], [486.519, 157], [486, 157.591], [485.464, 159], [485, 160], [484.43, 161], [483.513, 162], [483, 162.518], [482, 163.551], [481.416, 165], [480.575, 166], [480, 166.58], [479.525, 168], [479, 168.519], [478, 169.568], [477.474, 171], [476.517, 172], [476, 172.565], [475.521, 174], [475, 174.584], [474.497, 176], [473.556, 177], [473, 177.588], [472.442, 179], [471.477, 180], [471, 181], [470.439, 182], [469.575, 183], [469, 183.578], [468.403, 185], [467.437, 186], [466.523, 187], [466, 187.574], [465.462, 189], [464.603, 190], [464, 190.593], [463.477, 192], [462.486, 193], [461.511, 194], [461, 194.557], [460.416, 196], [459.538, 197], [459, 197.547], [458.44, 199], [457.462, 200], [456.52, 201], [456, 201.543], [455.547, 203], [455, 203.535], [454.528, 205], [454, 205.47], [453.565, 206], [453, 206.526], [452, 207.595], [451.469, 209], [451, 210], [451, 211], [450.469, 212], [450, 213], [449.523, 214], [449, 214.559], [448.479, 216], [447.504, 217], [447, 217.563], [446, 218.567], [445.393, 220], [444.451, 221], [443.514, 222], [443, 222.543], [442, 223.567], [441.486, 225], [441, 226], [441, 227], [440.418, 228], [439.526, 229], [439, 229.43], [438.533, 230], [438, 230.467], [437.442, 231], [437, 232], [436.371, 233], [435.447, 234], [434.549, 235], [434, 235.55], [433, 236.579], [432, 237.609], [431.519, 239], [431, 239.544], [431, 241], [430.444, 242], [429.476, 243], [428.475, 244], [427.544, 245], [427, 245.597], [426.566, 247], [426, 247.584], [425.563, 249], [425, 249.555], [424.444, 251], [423.481, 252], [422.539, 253], [422, 253.552], [421.45, 255], [420.594, 256], [420, 256.601], [419.427, 258], [418.42, 259], [417.461, 260], [417, 261], [416.444, 262], [416, 263], [415.454, 264], [414.528, 265], [414, 265.546], [413.399, 267], [412.495, 268], [412, 269], [411.465, 270], [410.462, 271], [409.469, 272], [409, 273], [408.304, 274], [407.434, 275], [407, 276], [406.494, 277], [405.591, 278], [405, 278.578], [404.425, 280], [403.43, 281], [402.406, 282], [401.475, 283], [401, 284], [400.479, 285], [400, 286], [399.457, 287], [399, 288], [398.428, 289], [398, 290], [397.497, 291], [397, 292], [396.462, 293], [396, 294], [395.466, 295], [394.555, 296], [394, 296.644], [393, 297.65], [392.38, 299], [391.44, 300], [390.475, 301], [389.473, 302], [388.48, 303], [387.489, 304], [386.566, 305], [386, 305.582], [385.494, 307], [384.592, 308], [384, 308.591], [383.529, 310], [383, 310.566], [382.427, 312], [381.467, 313], [380.554, 314], [380, 314.589], [379.458, 316], [378.554, 317], [378, 317.506], [377, 318.589], [376, 319.614], [375.478, 321], [375, 322], [374.534, 323], [374, 323.561], [373.463, 325], [372.553, 326], [372, 326.537], [371.373, 328], [370.462, 329], [370, 330], [369.412, 331], [369, 332], [368.457, 333], [367.533, 334], [367, 334.558], [366, 335.554], [365.494, 337], [364.544, 338], [364, 338.567], [363.391, 340], [362.452, 341], [361.563, 342], [361, 342.549], [360.517, 344], [360, 344.503], [359, 345.583], [358, 346.599], [357, 347.605], [356.373, 349], [355.508, 350], [355, 350.572], [354.501, 352], [354, 352.542], [353.458, 354], [352.436, 355], [351.452, 356], [351, 357], [350.524, 358], [350, 358.496], [350, 359], [349.571, 360], [349, 360.549], [348.421, 362], [347.536, 363], [347, 363.619], [346.47, 365], [345.614, 366], [345, 366.55], [344.512, 368], [344, 368.529], [343, 369.573], [342.391, 371], [341.481, 372], [341, 373], [340.48, 374], [339.607, 375], [339, 375.466], [339, 376], [338.458, 377], [337, 377.581], [337, 379], [336.5, 380], [336, 381], [336, 382], [335.493, 383], [334.49, 384], [333.407, 385], [333, 386], [332.134, 387], [331, 387.535], [330.501, 389], [330, 389.586], [329.436, 391], [328.529, 392], [328, 392.45], [327.54, 393], [327, 393.503], [326, 394.572], [326, 396], [325.479, 397], [324.556, 398], [324, 398.589], [323.392, 400], [322.481, 401], [322, 402], [321.554, 403], [321, 403.575], [320.463, 405], [319.458, 406], [318.473, 407], [317.524, 408], [317, 408.554], [316.469, 410], [316, 411], [315.436, 412], [314.472, 413], [313.462, 414], [312.48, 415], [312, 416], [311.431, 417], [311, 418], [310.453, 419], [309.523, 420], [309, 420.48], [308.528, 421], [308, 421.51], [307, 422.548], [306.423, 424], [306, 425], [305.497, 426], [305, 427], [304.43, 428], [303.449, 429], [302.441, 430], [301.467, 431], [301, 432], [300.465, 433], [300, 434], [299.455, 435], [298.516, 436], [298, 436.49], [297.529, 437], [297, 437.48], [296.553, 438], [296, 438.55], [295.396, 440], [294.494, 441], [294, 442], [293.419, 443], [292.443, 444], [291.41, 445], [290.513, 446], [290, 446.581], [289.587, 448], [289, 448.568], [288.524, 450], [288, 450.526], [287, 451.555], [286.407, 453], [285.593, 454], [285, 454.589], [285, 456], [284.404, 457], [283.516, 458], [283, 458.556], [282.393, 460], [281.446, 461], [280.553, 462], [280, 462.554], [279.474, 464], [278.545, 465], [278, 465.531], [277, 466.552], [276, 467.568], [275, 468.603], [274.559, 470], [274, 470.531], [273.55, 472], [273, 472.543], [272.454, 474], [271.475, 475], [270.514, 476], [270, 476.597], [269.438, 478], [268.567, 479], [268, 479.532], [267.463, 481], [266.514, 482], [266, 482.493], [265.461, 483], [264.554, 484], [264, 484.59], [263.485, 486], [262.545, 487], [262, 487.511], [261, 488.558], [260.422, 490], [259.551, 491], [259, 491.58], [258.548, 493], [258, 493.545], [257.503, 495], [257, 495.531], [256, 496.569], [255.387, 498], [254.484, 499], [254, 500], [253.459, 501], [252.538, 502], [252, 502.517], [251, 503.562], [250.414, 505], [249.492, 506], [249, 507], [248.47, 508], [248, 509], [247.463, 510], [246.551, 511], [246, 511.572], [245.403, 513], [244.533, 514], [244, 514.57], [244, 516], [243.423, 517], [242.605, 518], [242, 518.531], [241.505, 520], [241, 520.46], [240.531, 521], [240, 521.522], [239, 522.615], [239, 524], [238.422, 525], [238, 526], [237.507, 527], [237, 527.554], [236.404, 529], [235.501, 530], [235, 530.581], [234.443, 532], [234, 533], [233.533, 534], [233, 534.53], [232.516, 536], [232, 536.509], [231, 537.504], [230, 538.505], [229, 539.539], [228.501, 541], [228, 541.497], [228, 542], [228, 543], [227.53, 544], [227, 544.516], [226.494, 546], [226, 547], [225.482, 548], [225, 549], [225, 550], [225, 551], [224.515, 552], [224, 552.51], [224, 554], [223.497, 555], [223, 556], [222.403, 557], [222, 558], [221.393, 559], [221, 560], [221, 561], [220.486, 562], [220, 563], [219.529, 564], [219, 564.561], [218.415, 566], [217.494, 567], [217, 568], [217, 569], [216.436, 570], [216, 571], [216, 572], [215.508, 573], [215, 573.534], [214.446, 575], [213.51, 576], [213, 576.54], [212, 577.579], [212, 579], [212, 580], [211.465, 581], [211, 582], [210.588, 583], [210, 583.55], [209.525, 585], [209, 585.53], [208, 586.596], [207.517, 588], [207, 588.591], [207, 590], [207, 591], [206.529, 592], [206, 592.505], [206, 594], [205.529, 595], [205, 595.532], [204.459, 597], [203.562, 598], [203, 598.607], [203, 600], [202.435, 601], [202, 602], [202, 603], [202, 604], [201.468, 605], [201, 606], [200.487, 607], [199.574, 608], [199, 608.581], [198.535, 610], [198, 610.571], [198, 612], [197.572, 613], [197, 613.487], [197, 614], [197, 615], [197, 616], [196.481, 617], [196, 618], [195.47, 619], [195, 620], [194.416, 621], [194, 622], [193.433, 623], [193, 624], [193, 625], [192.462, 626], [192, 627], [192, 628], [191.488, 629], [191, 630], [190.421, 631], [190, 632], [189.449, 633], [189, 634], [188.409, 635], [188, 636], [188, 637], [188, 638], [187.532, 639], [187, 639.531], [187, 641], [186.451, 642], [185.494, 643], [184.545, 644], [184, 644.566], [183.51, 646], [183, 646.54], [183, 648], [183, 649], [182.451, 650], [182, 651], [182, 652], [181.528, 653], [181, 653.542], [180.47, 655], [179.537, 656], [179, 656.539], [178.536, 658], [178, 658.538], [178, 660], [178, 661], [178, 662], [178, 663], [178, 664], [177.539, 665], [177, 665.459], [177, 666], [176.523, 667], [176, 667.545], [175.479, 669], [175, 670], [175, 671], [175, 672], [174.442, 673], [174, 674], [173.462, 675], [173, 676], [173, 677], [172.565, 678], [172, 678.505], [171, 679.533], [170.305, 681], [170, 682], [169.403, 683], [169, 684], [168.544, 685], [168, 685.535], [168, 687], [168, 688], [168, 689] -Path 3: [510, 10], [509, 11], [508, 11], [507.425, 11], [506.563, 12], [506, 13], [506, 14], [505.388, 15], [504.551, 16], [504, 16.5955], [504, 18], [503.431, 19], [503, 20], [503, 21], [502.437, 22], [502, 23], [502, 24], [502, 25], [502.553, 26], [503.494, 27], [504, 27.4621], [504.389, 28], [505, 28.501] -Path 4: [642, 14], [641, 15], [640, 15.2508], [639, 16], [638, 16.4707], [637, 17.3218], [635.536, 18], [634.546, 19], [634, 19.53], [633, 20.442], [632, 21.2918], [631, 22.1775], [630, 23], [629, 23.4577], [628, 24.3779], [627, 25.2208], [626, 26], [625, 26], [624.439, 27], [623.425, 28], [622.424, 29], [621.435, 30], [620.43, 31], [619.411, 32], [618.39, 33], [617.41, 34], [616.434, 35], [615.42, 36], [614.338, 37], [613, 38] -Path 5: [505, 34], [504, 34], [504, 35], [503.679, 36], [503, 36] -Path 6: [503, 38], [503, 38.5973], [504, 39], [504.441, 40], [505, 40.3571], [505.446, 41], [506, 41.363], [506.175, 42], [507, 42] -Path 7: [611, 39], [610, 40], [609, 40], [608, 40.3808], [607, 41.3086], [606, 42], [605, 42.4634], [604, 43], [603.373, 44], [602.219, 45], [601, 45.376], [600.395, 46], [599.282, 47], [598.196, 48], [597, 48.5944], [596, 49.6023], [595, 50.5688], [594, 51.4515], [593.484, 52], [592.412, 53] -Path 8: [990, 45], [989, 46], [988, 46], [987, 46.4471], [986.513, 47], [986, 47.4302], [985.459, 48], [984.427, 49], [983.423, 50], [982.291, 51], [981.047, 52], [980, 53], [979, 53] -Path 9: [489, 47], [490, 47.4408], [490.551, 48], [491.611, 49], [493, 49.6206], [494, 50.555], [495, 51.5412], [495.606, 53], [496.612, 54], [498, 54.4771], [498.539, 55], [500, 55.5574], [501, 56.4921], [501.44, 57], [502, 57.4964], [502.423, 58], [503, 58.4437], [503.516, 59], [505, 59] -Path 10: [485, 49], [484, 49], [483.552, 50], [483, 50.5266], [483, 52], [483, 53], [483, 54], [483, 55], [483, 56], [483, 57], [483, 58], [483, 59], [483, 60] -Path 11: [507, 49], [507, 50], [508, 50], [509, 50], [510, 50], [511, 50], [512, 50], [513, 50.5154], [514, 51.3798], [514.522, 52], [515.124, 53], [516, 53] -Path 12: [971, 56], [970, 57], [969, 57], [968, 57.3194], [967.37, 58], [966.245, 59], [965, 60], [964, 60.1443], [963.192, 61], [962, 61.2191], [961.287, 62], [960, 63], [959, 63.3283], [958.336, 64], [957.294, 65], [956.276, 66], [955, 66.4461], [954.493, 67], [954, 68], [954, 69], [953.319, 70], [954, 70] -Path 13: [591, 55], [591.973, 55], [592, 56], [592.486, 57], [593, 58], [593, 59.4884], [593.541, 60], [594, 60.5082], [595, 61], [595.504, 62], [596.449, 63], [597, 63.5539], [597.563, 65], [598.464, 66], [599, 66.5251], [600, 67.4701], [600.483, 68], [601, 68.4728], [601.406, 69], [602, 69.4996], [602, 70], [602, 71], [602.605, 72], [603.435, 73], [604, 73.567], [604.542, 75], [605.486, 76], [606, 76.5382], [606.574, 78], [607.479, 79], [608, 79.5383], [608.583, 81], [609.575, 82], [610.502, 83], [611, 84], [611.506, 85], [612.457, 86], [613, 86.5307], [614, 87.5216], [615, 88.5089], [616, 89.507], [617, 90.4573], [617, 91] -Path 14: [484, 64], [483, 64], [482, 64], [482, 65], [482, 66], [482, 67], [482, 68], [482, 69], [482.527, 70], [483, 71], [483.541, 72], [484.516, 73], [485.507, 74], [486.533, 75], [488, 75.5525], [489, 76.4689], [489.521, 77], [490.59, 78], [491.613, 79], [492.547, 80], [493.536, 81], [494.53, 82], [495.385, 83], [496, 83] -Path 15: [707, 64], [707, 65], [708, 65.4538], [708.63, 66], [709.52, 67], [710.404, 68], [711, 68.5743], [712, 69.5566], [713, 70.528], [713.449, 72], [714, 72.5332], [714, 74], [714, 75], [714.485, 76], [715, 76.5332], [715, 78], [715.576, 79], [716.481, 80], [717, 80.5386], [718, 81.489], [718.457, 82], [719, 82.4006], [719.455, 83], [720, 83.3214], [720.522, 84], [722, 84.6336], [723, 85.5792], [724, 86.5779], [724.535, 88], [725.46, 89], [726, 89.5325], [727, 90.6372], [727.604, 92], [728.528, 93], [729, 94], [729.483, 95], [730, 95.4749], [730, 96], [730.484, 97], [731, 97.4849], [731.498, 98], [732, 98.5137], [733, 99.5066], [734, 100.518], [734.407, 102], [735, 102.556], [735.435, 104], [736, 104.453], [736.498, 105], [737, 105.577], [738, 106.589], [739, 107.52], [740, 108.522], [740.438, 110], [741, 110.511], [741.57, 112], [742.587, 113], [743.583, 114], [744.496, 115], [745, 115.528], [745.467, 117], [746, 117.496], [746, 118], [746.441, 119], [747, 119.532], [747.652, 121], [748.625, 122], [749.519, 123], [750, 124], [750.408, 125], [751, 125.511], [751, 127], [751.467, 128], [752, 128.55], [752.644, 130], [753.575, 131], [754, 132], [754.581, 133], [755, 134], [755.436, 135], [756, 135.525], [756, 137], [756.512, 138], [757.381, 139], [758, 139.574], [759, 140], [760, 140.646], [760.638, 142], [761, 143], [761, 144], [761, 145], [761.488, 146], [762, 146.525], [762, 148], [762.465, 149], [763, 149.348], [763, 150], [763, 151] -Path 16: [672, 46], [671, 46], [670.443, 46], [670, 47], [670, 48], [670, 48.5163], [669.361, 49], [668.504, 50], [667.518, 51], [667, 51.5256], [666.5, 52], [666, 53.2553], [665, 54.305], [664, 55.3581], [663, 56.3897], [662, 57.422], [661, 58.4103], [660, 59.3781], [659, 60.3729], [658, 61.3878], [657, 62.3898], [656, 63.3312], [655, 64.3194], [654, 65.2902], [653, 66], [652, 66.4119], [651, 67.39], [650, 68.3058], [649, 69.2107], [648, 70.1546], [647, 71], [646, 71.3576], [645, 72.3707], [644, 73.269], [643, 74.1505], [642, 75], [641, 75.2232], [640, 76], [639, 77], [638, 77.1274], [637, 78.0313], [636, 79], [635, 79], [634.364, 80], [633.338, 81], [632.279, 82], [631.214, 83] -Path 17: [930, 80], [929, 80], [928.063, 81], [927, 81.119], [926.169, 82], [925, 83], [924, 83.1902], [923.234, 84], [922.116, 85], [921, 85.226], [920.294, 86], [919.179, 87], [918, 87.3218], [917.372, 88], [916.319, 89], [915, 90], [914, 90], [913, 91] -Path 18: [629, 84], [628, 85], [627, 85.3951], [626, 86], [625.345, 87], [624.279, 88], [623.199, 89], [622, 89.395], [621.445, 90], [620.422, 91], [620, 92] -Path 19: [495, 87], [496, 87], [496, 88], [496, 89], [496, 90], [496.395, 91], [497, 91.6102], [497.59, 93], [499, 93.5676], [500, 94.5229], [501, 95.4706], [501.464, 96], [502, 96.4806], [502, 97], [502.345, 98], [503, 98], [504, 99], [505, 100], [506, 100] -Path 20: [515, 92], [514, 92.4075], [513, 93], [512.551, 94], [512, 94.5286], [512, 96], [511.522, 97], [511, 97.5398], [510, 98.509], [509, 99.3715], [509, 100] -Path 21: [908, 93], [907, 94], [906, 94], [905, 95], [904, 95], [903, 96], [902, 96], [901, 97], [900, 97.182], [899.275, 98], [898, 98.259], [897.304, 99], [896, 100], [895, 101], [894, 101], [893, 102], [892, 102.095], [891.158, 103], [890, 103.1], [889.155, 104], [888, 105] -Path 22: [501, 103], [500, 103], [500, 104], [500, 105], [499.516, 106], [499, 106] -Path 23: [881, 108], [880, 108], [879, 109], [878, 110], [877, 110], [876, 110.124], [875.18, 111] -Path 24: [870, 113], [869, 114], [868, 114], [867.166, 115], [866, 115.255], [865.318, 116], [864, 117] -Path 25: [862, 118], [861, 119], [860, 119], [859, 119.386], [858.375, 120], [857.34, 121], [856.205, 122], [855, 122.31], [854.376, 123], [853.077, 124], [852, 125], [851, 125], [850, 126], [849, 126.026], [848.025, 127], [847, 127.198], [846.254, 128], [845, 129], [844, 129], [843, 130], [842, 130], [841, 131], [840, 131.148], [839.149, 132], [838, 133], [837, 133], [836, 134], [835, 134.129], [834.206, 135], [833, 135.452], [832.362, 136], [831.039, 137], [830, 137], [829, 138], [828, 138], [827, 139], [826, 139], [825, 140], [824, 141], [823, 141], [822, 141.324], [821.306, 142], [820, 143], [819, 143] -Path 26: [493, 123], [492, 123], [492, 124], [492, 125], [491.451, 126], [490.622, 127], [490, 127] -Path 27: [485, 131], [484, 131], [484, 132], [484, 133.354], [484.592, 134], [485, 135], [486, 135] -Path 28: [484, 140], [483, 140], [482, 140], [482, 141], [481.633, 142], [481, 142.468], [481, 143], [481, 144], [480.416, 145], [479.413, 146], [478.418, 147], [477.43, 148], [476.417, 149], [475.415, 150], [474.409, 151], [473.313, 152], [472.096, 153], [471, 153.199], [470.254, 154], [469.136, 155], [468.389, 156], [468, 157], [467.447, 158], [466.29, 159], [465.367, 160], [465, 161], [464.515, 162], [464, 162.439], [464, 163] -Path 29: [431, 141], [431, 142], [432, 142.364], [432.329, 143], [433, 143.417], [433, 144] -Path 30: [815, 145], [814, 145], [813, 145], [812.496, 146], [811.509, 147], [811, 147.506], [810, 148.401], [809.403, 149], [808.313, 150], [807.226, 151], [806, 151.43], [805.417, 152], [804.295, 153], [803, 154], [802, 154], [801, 155], [800, 155], [799, 156], [798, 156.03], [797.05, 157], [796, 157.262], [795.398, 158], [794.207, 159] -Path 31: [763, 164], [763.678, 164], [764, 165.394], [765, 166], [766.49, 166], [767, 166.51], [768, 167], [768.599, 168] -Path 32: [463, 170], [461.567, 170], [461, 171], [461, 172], [461, 172.536], [460, 173], [459.575, 174], [459, 174.572], [458.589, 176], [458, 176.501], [457.601, 178], [457, 178.488], [456.55, 179], [456, 179.343], [456, 180] -Path 33: [768, 174], [767, 174], [766, 174], [766, 175], [765.575, 176], [765, 176.545], [764.442, 178], [764, 179], [764, 180], [763.524, 181], [763, 181.458], [763, 182], [763, 183], [763, 184], [763, 185], [763, 186], [762.543, 187], [762, 187.434], [762, 188], [762, 189], [762, 190], [762, 191], [762, 192], [762, 193] -Path 34: [452, 183], [451, 183], [450, 183], [449.408, 184], [449, 185], [448.201, 186], [447, 186] -Path 35: [805, 171], [805, 171.509], [805.642, 172], [806, 173.407], [806.727, 174], [807, 175], [807, 175.538], [807.552, 176], [808, 177.412], [809, 178.473], [809.502, 179], [810.414, 180], [811, 181], [811.477, 182], [812, 183], [812.501, 184], [813, 185], [813.528, 186], [814, 187], [814.585, 188], [815.443, 189], [816, 189.567], [816.515, 191], [817, 192], [817.583, 193], [818.447, 194], [819, 194.574], [820, 195.609], [820.594, 197], [821.463, 198], [822, 198.576], [822.444, 200], [823, 200.592], [823.477, 202], [824, 202.494], [824.4, 203], [825, 203.53], [826, 204.566], [826.566, 206], [827.574, 207], [828.537, 208], [829.443, 209], [830, 209.566], [830.572, 211], [831.443, 212], [832, 212.572], [832.447, 214], [833, 214.562], [833.55, 216], [834, 217], [834.56, 218], [835.406, 219], [836, 219.6], [836.513, 221], [837, 222], [837.548, 223], [838.373, 224], [839, 224.577], [839.604, 226], [840.498, 227], [841, 227.597], [841.483, 229], [842, 229.539], [842.532, 231], [843.371, 232], [844, 232.615], [844.503, 234], [845, 235], [845.634, 236], [846.416, 237], [847, 237.604], [847.47, 239], [848, 239.529], [848.577, 241], [849.485, 242], [850, 242.558], [850.54, 244], [851, 245], [851.528, 246], [852.371, 247], [853, 247.604], [853.518, 249], [854.427, 250], [855, 250.555], [855.463, 252], [856, 252.56], [856.41, 254], [857, 254.658], [857.564, 256], [858.486, 257], [859, 257.553], [859.506, 259], [860, 260], [860.588, 261], [861.45, 262], [862, 262.538], [863, 263.627], [863.555, 265], [864.478, 266], [865, 266.543], [865.574, 268], [866.464, 269], [867, 269.56], [868, 270.61], [868.506, 272], [869, 273], [869.575, 274], [870.417, 275], [871, 275.566], [871.586, 277], [872.478, 278], [873, 278.533], [874, 279.593], [874.525, 281], [875.398, 282], [876, 282.596], [876.494, 284], [877, 284.513], [878, 285.573], [878.525, 287], [879.393, 288], [880, 288.587], [880.476, 290], [881, 290.575], [882, 291.606], [882.563, 293], [883.469, 294], [884, 294.56], [884.498, 296], [885, 296.524], [885.584, 298], [886.47, 299], [887, 299.543], [888, 300.578], [888.575, 302], [889, 303], [889.56, 304], [890, 305], [890.515, 306], [891.37, 307], [892, 307.532], [892.547, 309], [893.515, 310], [894, 311], [894.582, 312], [895.484, 313], [896, 313.544], [897, 314.587], [897.56, 316], [898.394, 317], [899, 317.596], [899.4, 319], [900, 319.592], [900.475, 321], [901, 321.531], [902, 322.57], [902.607, 324], [903.512, 325], [904.378, 326], [905, 326.586], [905.466, 328], [906, 328.548], [907, 329.588], [907.587, 331], [908.506, 332], [909.393, 333], [910, 333.623], [910.529, 335], [911.458, 336], [912, 336.552], [913, 337.621], [913.629, 339], [914.552, 340], [915, 341], [915.586, 342], [916.42, 343], [917, 343.559], [917.585, 345], [918.553, 346], [919.459, 347], [920, 347.557], [920.474, 349], [921, 349.565], [921.518, 351], [922.485, 352], [923, 352.472], [923.495, 353], [924, 353.51], [925, 354.546], [926, 355.578], [926.421, 357], [927, 357.582], [927.402, 359], [928, 359.61], [928.423, 361], [929, 361.572], [929.45, 363], [930, 363.543], [930.481, 365], [931, 365.522], [932, 366.566], [932.553, 368], [933.357, 369], [934, 369.6], [934.514, 371], [935.354, 372], [936, 372.592], [936.451, 374], [937, 374.593], [937.46, 376], [938, 376.587], [938.464, 378], [939, 378.564], [939.375, 380], [940, 380.563], [940.324, 382], [941, 382.489], [941, 383] -Path 36: [445, 189], [445.505, 190], [446, 191], [446, 192], [446, 193], [446, 194], [446, 195], [446, 196] -Path 37: [762, 198.366], [761, 199.436], [760.488, 200], [760, 201], [760, 202], [760, 203], [760, 203.549], [759.419, 204], [759, 205], [759, 206], [759, 207], [759, 208], [759, 209], [759, 210], [759, 211] -Path 38: [422, 207], [422.631, 207], [423, 208], [424, 208.534], [424, 210], [424.03, 211], [425, 211] -Path 39: [433, 218], [432, 218], [431, 218], [430.445, 219], [429.578, 220], [429, 220.279], [429, 221] -Path 40: [759, 218], [759, 219], [759, 220], [759, 221], [759, 222], [759, 223], [758.518, 224], [758, 224.473], [758, 225], [757.523, 226], [757, 226.61], [756.528, 228], [756, 228.521], [756, 230], [755.437, 231], [755, 232], [755, 233], [755, 234], [754.48, 235], [754, 236], [754, 237], [754, 238], [754, 239], [754, 240], [754, 241], [754, 242], [753.537, 243], [753, 243.526], [753, 245], [753, 246], [753, 247], [753, 248], [753, 249], [753, 250], [752.51, 251], [752, 251.517], [752, 253], [751.561, 254], [751, 254.547], [751, 256], [751, 257], [750.55, 258], [750, 258.48], [750, 259], [750, 260], [749.339, 261], [749, 262], [749, 263], [749, 264], [749, 265], [748.446, 266], [748, 267], [748, 268], [748, 269], [748, 270], [748, 271], [748, 272], [748, 273], [748, 274], [748, 275], [747.515, 276], [747, 276.499], [747, 277], [747, 278], [746.456, 279], [746, 280], [746, 281], [746, 282], [746, 283], [746, 284], [746, 285], [745.44, 286], [744.374, 287] -Path 41: [422, 230], [421, 230], [420, 230], [420, 231], [420, 232] -Path 42: [413, 239], [412, 239], [411, 239], [410, 239], [410, 240] -Path 43: [407, 246], [407.314, 247], [408, 247.209], [408.441, 248], [409, 248] -Path 44: [404, 260], [403, 260], [402, 260], [401.447, 261], [400.519, 262], [400, 262.54], [399, 263.56], [398.5, 265], [398, 266], [398, 267], [397.47, 268], [397, 269], [396.504, 270], [396, 270.357], [395.631, 271], [395, 271] -Path 45: [378, 290], [377, 290], [376.42, 291], [376, 292], [376, 293], [376, 294], [375.654, 295], [375, 295] -Path 46: [745, 289], [744.016, 289], [744, 289.55], [743, 290], [743, 291], [743, 292], [743, 293], [743, 294], [743, 295], [743, 296], [743, 297], [743, 298], [743, 299], [743, 300], [743, 301], [743, 302] -Path 47: [743, 308], [742, 308], [741.49, 309], [741, 310], [741, 311], [741, 312], [741, 313], [741, 314], [740.314, 315], [740, 316], [739.336, 317], [739, 318], [739, 319], [739, 320], [739, 321], [738.488, 322], [738, 323], [738, 324], [738, 325], [738, 326], [738, 327], [738, 328], [738, 329], [738, 330], [738, 331], [738, 332] -Path 48: [358, 317], [358.472, 318], [359, 318.322], [359, 319] -Path 49: [351, 334], [350, 334], [350, 335], [350, 336], [350.524, 337], [351, 338], [351, 339] -Path 50: [738, 340], [738, 341], [737.457, 342], [737, 343], [737, 344], [736.58, 345], [736, 345.429], [736, 346], [736, 347], [735.491, 348], [735, 349], [734.454, 350], [734, 351], [734, 352], [734, 353], [734, 354], [734, 355], [734, 356], [734, 357], [734, 358], [734, 359], [734, 360], [734, 361], [734, 362], [734, 363], [734, 364], [734, 365], [734, 366] -Path 51: [336, 352], [336.451, 352.764], [337, 353.078], [337, 354] -Path 52: [997, 362], [996, 362], [995, 362], [994.324, 363], [993.131, 364], [992, 365], [991, 365.221], [990.217, 366], [989, 366.382], [988.373, 367], [987.25, 368], [986, 369], [985, 369], [984, 370], [983, 370.013], [982.023, 371], [981, 372], [980, 372], [979, 373], [978, 373], [977, 374], [976, 374.024], [975.039, 375], [974, 375.029], [973.052, 376], [972, 377], [971, 377], [970, 378], [969, 378.056], [968.064, 379], [967, 379.225], [966.276, 380], [965, 381], [964, 381], [963, 382], [962, 382.151], [961.183, 383], [960, 384], [959, 384], [958, 385], [957, 385.157], [956.214, 386], [955, 387], [954, 387], [953, 388], [952, 388], [951, 389], [950, 389.023], [949.032, 390], [948, 390.025], [947.059, 391] -Path 53: [337, 362], [336, 362.058], [335, 363], [334, 363], [333.219, 364], [332.131, 365], [332, 366], [332, 367], [332, 368], [332.497, 369], [333, 369.346], [333, 370] -Path 54: [734, 372], [734, 373], [733.51, 374], [733, 374.494], [733, 375], [733, 376], [733, 377], [732.499, 378], [732, 379], [732, 380], [732, 381], [732, 382], [732, 383], [732, 384], [731.481, 385], [731, 386], [731, 387], [731, 388], [731, 389], [730.539, 390], [730, 390.528], [730, 392], [730, 393], [730, 394], [730, 395], [729.524, 396], [729, 396.507], [729, 398], [729, 399], [729, 400], [729, 401], [729, 402], [729, 403], [728.47, 404], [728, 405], [728, 406], [728, 407] -Path 55: [321, 381], [320, 381], [320, 382], [320, 383], [320.475, 384], [321, 384.516], [321, 386], [321, 387] -Path 56: [945, 392], [944, 393], [943, 394.196], [942, 395], [941, 395.398], [940, 396.215], [939.244, 397], [939, 398], [938, 399], [937, 399], [936, 400], [935, 400.227], [934, 401], [933, 402], [932, 402], [931, 403], [930, 403.275], [929, 404.204], [928, 405], [927, 405], [926.371, 406], [925.109, 407], [924, 408], [923, 408.079], [922.104, 409], [921, 409.379], [920.374, 410], [919.299, 411], [918, 412] -Path 57: [727, 409], [728, 409], [728, 410], [728, 411], [728, 412], [728, 413], [728.336, 414], [729, 414] -Path 58: [297, 415], [297.468, 416], [298, 416.466], [298, 417], [298.467, 418], [299, 418.341], [299, 419], [299, 420], [299, 421] -Path 59: [728, 419], [728, 420], [728, 421], [728, 422], [728, 423] -Path 60: [916, 413], [915, 414], [914, 414.101], [913, 415], [912, 416], [911, 416.242], [910, 417], [909, 417.294], [908, 418.145], [907, 419], [906, 419.374], [905, 420.266], [904, 421], [903, 421], [902.379, 422], [901.239, 423], [900, 424], [899, 424.239], [898.265, 425], [897.177, 426], [896, 426.314], [895.351, 427], [894.105, 428], [893, 428.205], [892.261, 429], [891.015, 430], [890, 430.331], [889.331, 431], [888.284, 432], [887, 432.405], [886.399, 433], [885.299, 434], [884.133, 435], [883, 435.399], [882.383, 436], [881.336, 437], [880, 437.427], [879.392, 438], [878.308, 439], [877.219, 440], [876, 440.42], [875.446, 441], [874.411, 442], [873.326, 443], [872, 444], [871, 444], [870, 445], [869, 445.202], [868.22, 446], [867, 446.448], [866.376, 447], [865.288, 448], [864, 449], [863, 449.346], [862.338, 450], [861.332, 451], [860.266, 452], [859, 453], [858, 453.292], [857.327, 454], [856.173, 455], [855, 455.372], [854.359, 456], [853.256, 457], [852, 457.3], [851.339, 458], [850, 459], [849, 459.192], [848.227, 460], [847, 460.41], [846.416, 461], [845.328, 462], [844.105, 463], [843, 463.103], [842.183, 464], [841, 465], [840, 466], [839, 466.385], [838.321, 467], [837, 467.476], [836.455, 468], [835.378, 469], [834.288, 470], [833, 470.496], [832.431, 471], [831.369, 472], [830.239, 473], [829, 474], [828, 474.051], [827.069, 475], [826, 476], [825, 476], [824, 477], [823, 477], [822, 478] -Path 61: [728, 429], [727, 429], [727, 430], [727, 431], [727, 432], [727, 433], [727, 434], [727, 435], [727, 436], [727, 437], [727, 438], [727, 439] -Path 62: [997, 444], [996, 444], [995, 444], [994.422, 445], [993.411, 446], [992.38, 447], [991.3, 448], [990, 448.498], [989.491, 449], [988.457, 450], [987.425, 451], [986.415, 452], [985.444, 453], [984.535, 454], [984, 454.549], [983, 455.6], [982.455, 457], [981.499, 458], [980.512, 459], [980, 459.466], [979.587, 460], [979, 460.538], [978.521, 462], [978, 462.48], [977.491, 463], [976.436, 464], [976, 465], [975.24, 466], [974, 466.311], [973.335, 467], [972.266, 468], [971.232, 469], [970, 469.438], [969.436, 470], [968.465, 471], [967.427, 472], [966.387, 473], [965.449, 474], [964.433, 475], [963.302, 476], [962.072, 477], [961, 478], [960, 478], [959, 479], [958, 479.172], [957.206, 480], [956, 480.387], [955.363, 481], [954.342, 482], [953.295, 483], [952.278, 484], [951, 484.412], [950.455, 485], [949.403, 486], [948.38, 487], [947.341, 488], [946.256, 489], [945.182, 490], [944, 490.381], [943.336, 491], [942.31, 492], [941.251, 493], [940, 493.371], [939.41, 494], [938.409, 495], [937.393, 496], [936.36, 497], [935.291, 498], [934.246, 499], [933.183, 500], [932, 501], [931, 502], [930, 502.269], [929.229, 503], [928.176, 504], [927, 504.409], [926.43, 505], [925.399, 506], [924.36, 507], [923.338, 508], [922.354, 509], [921, 509.383], [920.374, 510], [920, 511], [919, 512], [918, 512.115], [917.119, 513], [916.117, 514], [915, 514.311], [914.351, 515], [913.29, 516], [912.303, 517], [911, 517.435], [910.461, 518], [909.437, 519], [908.322, 520], [907.239, 521], [906.204, 522], [905, 522.391], [904.427, 523], [903.338, 524], [902.286, 525], [901.064, 526], [900, 526.371], [899.311, 527], [898.317, 528], [897, 528.457], [897, 529], [896.228, 530], [895, 530.334], [894.406, 531], [893.277, 532], [892.17, 533], [891, 534], [890, 535], [889, 535.394], [888.365, 536], [887.325, 537], [886.318, 538], [885.107, 539], [884, 540], [883, 541], [882, 541], [881, 541.4], [880.418, 542], [879.368, 543], [878.332, 544], [877, 544.569], [876, 545.575], [875, 546.505], [874.248, 548], [873, 548.442], [872.481, 549], [871.416, 550], [870.375, 551], [869.406, 552], [868.423, 553], [867.416, 554], [866.399, 555], [865.362, 556], [864.31, 557], [863.295, 558], [862.151, 559], [861, 559.332], [860.337, 560], [859.314, 561], [858.31, 562], [857, 562.384], [856.385, 563], [855.381, 564], [854.397, 565], [853.343, 566], [852.307, 567], [851.29, 568], [850, 568.48], [849.467, 569], [848.44, 570], [847.394, 571], [846.383, 572], [845.32, 573], [844.277, 574], [843.253, 575], [842, 575.435], [841.421, 576], [840.415, 577], [839.404, 578], [838.374, 579], [837.356, 580], [836.345, 581], [835.273, 582], [834.204, 583], [833, 583.382], [832.35, 584], [831.328, 585], [830.296, 586], [829.215, 587], [828, 587.331], [827.327, 588], [826.253, 589], [825.121, 590], [824, 590.323], [823.338, 591], [822.272, 592], [821, 592.496], [820.52, 593], [820, 593.514], [819, 594.484], [818.437, 595], [817.336, 596], [816.282, 597], [815.21, 598], [814, 598.317], [813.397, 599], [812.264, 600], [811, 601], [810, 602], [809, 602] -Path 63: [275, 455], [275, 456], [275, 457], [275, 458] -Path 64: [728, 469], [728, 469.715], [729, 470], [729, 471], [729.565, 472], [730.454, 473], [731, 473.472], [731.429, 474], [732, 474.431], [732.438, 475], [733, 475.536], [734, 476.628], [734.507, 478], [735.313, 479], [736, 479.066], [736, 480] -Path 65: [721, 473.455], [720.483, 474], [720, 475], [720, 476.399], [719.428, 477], [719, 478], [718, 478] -Path 66: [729, 487], [729, 488], [730, 488], [731, 488], [732, 488] -Path 67: [715, 497], [714, 497], [714, 498], [713.476, 499], [712.491, 500], [711, 500.568], [710, 502], [709.022, 503], [708, 503.506], [707.501, 505], [707, 505.488], [707, 506], [707, 507], [706.459, 508], [705.556, 509], [705, 509.449], [704.523, 510], [704, 510.605], [703.46, 512], [703, 513], [703, 514], [703, 515], [702.473, 516], [702, 517], [701.597, 518], [701, 518.401], [700.562, 519], [700, 519.532], [699.412, 521], [699, 522], [698.445, 523], [698, 524] -Path 68: [241, 503], [240, 503.405], [239, 504], [239, 505], [239, 506], [239, 507], [239.124, 508], [240, 508] -Path 69: [228, 509], [229, 509.504], [230, 510], [231, 510] -Path 70: [613, 516], [613.679, 517], [614.353, 518], [615, 518.682], [615.448, 520], [616, 520.439], [616.364, 521], [617, 521.464], [617, 522] -Path 71: [233, 516], [232, 516.213], [231, 517], [230, 517], [230, 518], [230, 519] -Path 72: [635, 519], [636, 519.308], [636.157, 520], [637, 520], [638, 520] -Path 73: [225, 528], [225, 529], [225.353, 530], [226, 530.391], [226, 531] -Path 74: [214, 543], [214.456, 544], [215, 544.527], [216, 545.439], [216, 546], [216.497, 547], [217, 547.52], [217.224, 549], [218, 549.177], [218, 550] -Path 75: [695, 539], [694, 539], [693.456, 539], [693, 540], [693, 541], [693, 542], [692.515, 543], [692, 544], [692, 545], [692, 546], [692, 547], [691.555, 548], [691, 548.506], [691, 550], [691, 551], [691, 552], [691, 553], [691.527, 554] -Path 76: [559, 557], [559, 558], [559.487, 559], [560, 559.546], [560.113, 561], [561, 561] -Path 77: [208, 565], [208.47, 566], [209, 566.389], [209, 567], [209, 568] -Path 78: [784, 583], [785, 583], [786, 583], [787, 583.415], [788, 584.483], [789, 585.448], [790, 586], [791.477, 586], [792, 586.534], [793, 587], [794, 587], [795, 587], [796, 587], [797.469, 587], [798.475, 588], [799, 589], [799.567, 590], [800, 591], [800.572, 592], [801.448, 593], [802, 593.611], [802.541, 595], [803.463, 596], [804, 596.54], [805, 597.532], [806, 598.538] -Path 79: [780, 585], [779.489, 585], [779, 586], [779, 587], [779, 588], [779, 589], [778.507, 590], [778, 591], [777.58, 592], [777, 592.634], [776.418, 594], [775.491, 595], [774.519, 596], [774, 596.562], [773, 597.566], [772, 598.514], [771, 599.482], [771, 600], [770.462, 601], [769.484, 602], [768.471, 603], [767.447, 604], [766.46, 605], [765.492, 606], [764.507, 607], [764, 607.562], [763, 608.59], [762, 609.569], [761, 610.527], [760.342, 612], [759, 612.42], [758.429, 613], [757.356, 614], [756.075, 615] -Path 80: [542, 598], [541, 598], [540, 598], [539.421, 599], [538.344, 600], [537.223, 601], [537, 602] -Path 81: [546, 593], [546.431, 594], [547, 595.301], [548, 596.374], [548.614, 597], [549, 597.526], [549.502, 598], [550.386, 599], [551, 600.419], [552, 601], [552.498, 602], [553, 602.476], [553.377, 603], [554, 603.599], [554, 605], [554.48, 606], [555, 606.475], [555, 607], [555.651, 608], [556.542, 609], [557.464, 610], [558, 610.537], [559, 611.568], [559.608, 613], [560, 614], [560.584, 615], [561.548, 616], [562.521, 617], [563.515, 618], [564.398, 619], [565, 619.653], [565.543, 621], [566.464, 622], [567, 622.555], [568, 623.593], [568.652, 625], [569.591, 626], [570.501, 627], [571.369, 628], [572, 628.53], [572.662, 630], [574, 630.673], [575, 631.644], [575.205, 633], [576, 633] -Path 82: [797, 599], [797, 600], [797, 601], [797.485, 602], [798, 602.57], [798.402, 604], [799, 604.616], [799.431, 606], [800, 606.637], [800.417, 608], [801, 608.635], [801, 610], [801.597, 611], [802, 612], [802.501, 613], [803, 614], [803.428, 615], [804, 615.618], [804, 617], [804.648, 618], [805, 619] -Path 83: [713, 598], [713.515, 598], [714, 598.573], [714.596, 599], [715.454, 600], [716.287, 601], [717, 602], [717, 602.628], [718, 603], [718.454, 604], [719, 604.489], [719, 605], [719.418, 606], [720, 606], [721, 606], [722, 607], [722.571, 608], [724, 608.455], [724.468, 609], [725, 609.437], [725.588, 610], [727, 610.601], [728, 611], [729, 611.545], [730, 612], [731, 612], [732, 612.477], [732.471, 613], [733, 613.435], [733.497, 614], [734, 614.458], [734, 615] -Path 84: [809, 604], [809, 605], [809.609, 606], [810, 607], [810.512, 608], [811, 609], [811.482, 610], [812, 610.546], [812.457, 612], [813, 612.562], [813.432, 614], [814, 614.584], [814, 616], [814.526, 617], [815, 618], [815.506, 619], [816, 620], [816.488, 621], [817, 621.571], [817.46, 623], [818, 623.606], [818, 625], [818.574, 626], [819, 627], [819.553, 628], [820, 629], [820.521, 630], [821, 631], [821.491, 632], [822, 632.571], [822.461, 634], [823, 634.562], [823.459, 636], [824, 636.566], [824.433, 638], [825, 638.552], [825.446, 640], [826, 640.568], [826.422, 642], [827, 642.592], [827.397, 644], [828, 644.586], [828, 646], [828.538, 647], [829, 648], [829.523, 649], [830, 650], [830.554, 651], [831, 652], [831.531, 653], [832.402, 654], [833, 654.583], [833.451, 656], [834, 656.598], [834.415, 658], [835, 658.543], [835.495, 660], [836, 660.558], [836.477, 662], [837, 662.571], [837.442, 664], [838, 664.521], [838.487, 666], [839, 666.514], [840, 667.561], [840.484, 669], [841, 669.493], [841, 670], [841, 671] -Path 85: [789, 604], [788, 604], [787, 605], [786, 605], [785, 606], [784, 606], [783, 607], [782, 607], [781, 608], [780, 608], [779, 609], [778, 609] -Path 86: [775, 609], [774, 609], [773, 610], [773, 611], [774, 612] -Path 87: [535, 603], [534.268, 603], [534, 604.011], [533, 605], [532, 605.013], [531, 606.147], [530, 607.244], [529, 608], [528, 608.374], [527, 609.348], [526, 610.33], [525, 611.279], [524, 612.219], [523, 613.134], [522, 614], [521, 614], [520.305, 615], [519.28, 616], [518.285, 617], [517.249, 618], [516.241, 619], [515, 619.267], [514.312, 620], [513.253, 621], [513, 622], [512, 623], [511, 623.142], [510.15, 624], [509, 624.329], [508.341, 625], [507.313, 626], [506.348, 627], [505.314, 628], [504.316, 629], [503.244, 630], [502, 630.239], [501.265, 631], [500.196, 632], [499.238, 633], [498.222, 634], [497, 634.32], [496.331, 635], [495.302, 636], [494.239, 637], [493.159, 638], [492.142, 639], [491, 639.296], [490.277, 640], [489.248, 641], [488.147, 642], [487, 642.245], [486.324, 643], [485.263, 644], [484.218, 645], [483.167, 646], [482, 646.24], [481.409, 647], [480.32, 648], [479.275, 649], [478.295, 650], [477.194, 651], [476.098, 652], [475, 652.251], [474.262, 653], [473.193, 654], [472.158, 655], [471, 655.302], [470.32, 656], [469.331, 657], [468.338, 658], [467.253, 659], [466.195, 660], [465.108, 661], [464, 661.266], [463.248, 662], [462.248, 663], [461.222, 664], [460.159, 665], [459.159, 666], [458, 666.16], [457.235, 667], [456.18, 668], [455, 668.32], [454.304, 669], [453.274, 670], [452.211, 671], [451.227, 672], [450.17, 673], [449, 673.272], [448.385, 674], [447.34, 675], [446.347, 676], [445.151, 677], [444.127, 678], [443.067, 679], [442, 680], [441, 680.104], [440.153, 681], [439.088, 682], [438.037, 683], [437, 683.269], [436.267, 684], [435.232, 685], [434.088, 686], [433, 686.277], [432.335, 687], [431.268, 688], [430.199, 689], [429.154, 690], [428, 690.2], [427.217, 691], [426.14, 692], [425, 692.307], [424.532, 693], [424, 693.253], [423.485, 694], [423, 695], [422, 696], [421.104, 697], [420, 697], [419, 698] -Path 88: [775, 616], [776, 617], [776.409, 618], [777, 618.57], [777.258, 620], [778, 620.605], [778, 622], [778.479, 623], [779, 623.608], [779.436, 625], [780, 625.622], [780, 627], [780.551, 628], [781, 629], [781.491, 630], [782, 630.459], [782, 631] -Path 89: [750, 617], [750, 617.915], [751, 618], [751.544, 619], [752.545, 620], [754, 620.586], [755, 621.459], [755.54, 622], [757, 622.494], [757.475, 623], [758, 623], [759, 623.518], [760, 624], [761, 624] -Path 90: [767, 619], [767, 619.815], [767.662, 620], [768, 620.539], [769, 621], [769.475, 622], [770, 622], [771, 622], [772, 622.755], [772.643, 624], [773.364, 625], [774, 625.623] -Path 91: [806.094, 622], [807, 623], [807, 624], [807.645, 625], [808, 626], [808.611, 627], [809, 628], [809.533, 629], [810, 630], [810.409, 631], [811, 631.609], [811, 633], [811.658, 634], [812, 635], [812.621, 636], [813, 637] -Path 92: [542, 621], [542, 621.502], [542.586, 622], [543, 623], [543, 623.551], [543.598, 624], [544, 625], [545, 625.42], [545.543, 626], [546, 627], [547, 628], [547.417, 629], [548, 629.582], [548.53, 631], [549, 632], [549.635, 633] -Path 93: [540, 623], [539, 623], [538, 623.294], [537, 624.256], [536, 625.15], [535, 626], [534, 627], [533, 628], [532, 628], [531, 628], [530.31, 629], [530, 630], [529, 631], [528, 631.189], [527.223, 632], [526.167, 633], [525.152, 634], [524, 634.287], [523.289, 635], [522.252, 636], [521.223, 637], [520, 637.351], [519.406, 638], [518.372, 639], [518, 640], [517.152, 641], [516, 641.233], [515.319, 642], [514.286, 643], [513.104, 644], [512.132, 645], [511, 645.198], [511, 646] -Path 94: [773, 629], [773, 630], [773.582, 631], [774, 632], [774.508, 633], [775, 634], [775.458, 635], [776, 635.569], [776, 637], [776, 638], [776.51, 639], [777, 640], [777.463, 641], [778, 641.436], [778.545, 642], [779.535, 643], [780, 644], [780, 645], [780.581, 646], [781, 647], [781.541, 648], [782, 649], [782.496, 650], [783, 650.575], [783.465, 652], [784, 652.578], [784, 654], [784.487, 655], [785, 655.478], [785, 656], [785.335, 657], [786, 657.494], [786, 658], [786, 659], [786.513, 660], [787, 661], [788, 662], [788, 663] -Path 95: [535, 614], [533.579, 615], [532.582, 616], [531.513, 617], [531, 617.582], [530, 618.433], [529, 619.233], [527.621, 620], [526.583, 621], [525.552, 622], [525, 622.564], [524, 623.45], [523, 624.331], [521.683, 625], [520.578, 626], [519.592, 627], [519, 628], [518, 629], [517, 629.405], [515.65, 630], [514.593, 631], [513.614, 632], [513, 633], [512, 633.555], [511, 634.201], [511, 635] -Path 96: [581, 634], [580, 634], [579.3, 635], [578, 635.216], [577.488, 636], [576, 637] -Path 97: [784, 635], [784, 636], [784.545, 637], [785, 638], [785.475, 639], [786, 639.538], [786.498, 641], [787, 641.542], [787.481, 643], [788, 643.594], [788, 645], [788.583, 646], [789, 647], [789.508, 648], [790, 649] -Path 98: [168, 638], [169, 638.61], [169.393, 640], [170, 640.502], [170.203, 642], [171, 642] -Path 99: [814, 639], [814.261, 640], [815, 640.42], [815, 641], [815, 642], [815.538, 643], [816, 644], [816.598, 645], [817, 646], [817.575, 647], [818, 648], [818.463, 649], [819, 649.574], [819.471, 651], [820, 651.573], [820.458, 653], [821, 653.613], [821.502, 655], [822, 656], [823, 657], [823, 658], [824, 659], [824, 660], [824.396, 661], [825, 661.622], [825.391, 663], [826, 663.659], [826.496, 665], [827, 665.57], [827.468, 667], [828, 667.575], [828.43, 669], [829, 669.594], [829.488, 671], [830, 671.569], [830.507, 673], [831, 674], [831.56, 675], [832, 676], [832.505, 677], [833, 678], [833, 679], [833.814, 680] -Path 100: [573, 640], [572, 640], [571.504, 641], [571, 641.323], [570.498, 642], [569.466, 643], [568.475, 644], [567.432, 645], [567, 646], [566.26, 647], [565.174, 648], [564, 648.349], [563.322, 649], [562.208, 650], [561, 650.318], [560.332, 651], [559.208, 652], [558, 652.501], [557, 653.464], [556.5, 654], [556, 654.408], [555.445, 655], [554.407, 656], [553.353, 657], [552.174, 658], [551, 658.281], [550.287, 659], [549, 660], [548, 660.292], [547.292, 661], [546, 661.509], [545, 662.506], [544, 663.502], [543, 664.514], [542, 665.533], [541, 666.552], [540, 667.586], [539.478, 669], [539, 670], [538.462, 671], [538, 672], [537.428, 673], [536.577, 674], [536, 674] -Path 101: [171, 651], [170, 651], [169, 651.415], [169, 652], [169, 653], [168.07, 654], [168.049, 654.951], [168, 656], [168, 657], [168, 658] -Path 102: [546, 661], [545.49, 662], [544.494, 663], [543.497, 664], [542.5, 665] -Path 103: [167, 662], [166, 662], [165.356, 662], [165, 663], [164.423, 663.423] -Path 104: [785, 666], [784, 666], [783.51, 667], [783, 667.547], [782.519, 669], [782, 669.534], [781.504, 671], [781, 671.506], [780.521, 673], [780, 673.517], [780, 675] -Path 105: [416, 668], [416, 668.59], [416.722, 669], [417, 670], [418, 670.624], [419, 671.537], [419.575, 673], [420.513, 674], [421.475, 675], [422, 675.606], [422.519, 677], [423, 678], [423.508, 679], [424, 680], [424, 681], [424, 682] -Path 106: [842, 679], [842, 680], [842.544, 681], [843.103, 682], [844, 682.846] -Path 107: [537, 681], [536, 681], [535.5, 682], [535, 682.511], [534.446, 684], [533, 684.541], [532, 685.423], [531.608, 686], [531, 686], [530, 687] -Path 108: [780, 677], [780.427, 678], [781, 679], [781.49, 680], [782, 681], [782, 681.51], [783, 682], [783.492, 683], [784, 683.556], [785, 684.565], [786, 685.591], [786.504, 687], [787.402, 688], [788, 688.516], [788.455, 690], [789, 690.168], [789, 691] -Path 109: [481, 681], [480, 681.353], [479, 682.245], [478, 683.144], [477, 684.082], [476, 685], [475, 685.397], [474, 686], [473.291, 687], [472.184, 688], [471.049, 689], [470, 689.278], [469.259, 690], [468.249, 691], [467.195, 692], [466.158, 693], [465, 693.372], [464.375, 694], [463, 694.642], [462.188, 696], [461.106, 697], [460.136, 698], [459, 698.265], [458.298, 699], [457.197, 700], [456.158, 701], [455.147, 702], [454, 702.335], [453.362, 703], [452.337, 704], [451.289, 705], [450.171, 706], [449.082, 707], [448, 707.266], [447.259, 708], [446.263, 709], [445.211, 710], [444, 710.232], [444, 711] -Path 110: [407, 687], [407, 688], [408, 688.468], [408, 689], [408, 690], [408.246, 691], [409, 691] -Path 111: [394, 692], [394, 693], [394.626, 694], [395, 695], [395.46, 696], [396, 696.299], [396, 697] -Path 112: [848, 693], [847, 693.453], [846, 694.448], [845, 695], [844.387, 696], [843.366, 697], [842.307, 698], [841.203, 699], [840, 699.381], [839.397, 700], [838.368, 701], [837.345, 702], [836.28, 703], [835.336, 704], [834, 704.587], [833.081, 706], [832, 707], [831, 707.161], [830.19, 708], [829, 708.4], [828.402, 709], [827.418, 710], [826.469, 711], [825.345, 712], [824.134, 713], [823, 714], [822, 714.349], [821.456, 715], [821, 716] -Path 113: [490, 688], [489, 689], [488, 689], [487, 689.481], [486, 690.444], [485, 691.361], [483.578, 692], [483, 693.297], [482, 694], [481.492, 694], [481, 694.553], [480.429, 695], [480, 695.502], [479, 696], [478.459, 697], [477.406, 698], [476.351, 699], [475.316, 700], [474, 700.466], [473.45, 701], [472.398, 702], [471.36, 703] -Path 114: [520, 694.175], [519, 695], [518, 695], [517, 695.377], [516, 696], [515.275, 697] -Path 115: [416, 700], [417, 700.621], [418, 701.587], [418.401, 703], [419, 703.518], [419.601, 705], [420.447, 706], [421, 706.609], [421.582, 708], [422.462, 709], [423, 709.538], [423.559, 711], [424.516, 712], [425.51, 713], [426.467, 714], [427, 714.544], [427.548, 716], [428, 717], [428.498, 718], [429, 718.482], [429, 719], [429, 720] -Path 116: [801, 692], [801, 693], [802, 694], [803, 695], [803, 696], [804, 697], [804.418, 698], [805, 699.469], [805.514, 700], [806, 701], [806, 702], [806.58, 703], [807, 704], [807, 705], [807.466, 706], [808, 706.575], [808.558, 708], [809.555, 709], [810.489, 710], [811, 710.57], [811.533, 712], [812, 713], [812.474, 714], [813, 714.46], [813, 715], [813.486, 716], [814, 716.473], [814, 717], [814.574, 718], [815.502, 719], [816, 720], [816.62, 721], [817.5, 722], [818, 723], [818.549, 724], [819.434, 725], [820, 725.556], [820.531, 727], [821.487, 728], [822, 728.589], [822.564, 730], [823.502, 731], [824.482, 732], [825, 732.43], [825.556, 733], [827, 733.537], [828, 734.475], [828.447, 735], [829, 735.575], [829, 737], [829.582, 738], [830, 739], [830, 740], [830, 741], [830.587, 742], [831.437, 743], [832, 743.588], [833, 744.611], [833, 746], [833.482, 747], [834, 747.501], [834, 749], [834, 750], [834, 751], [834.598, 752], [835.562, 753], [836.554, 754], [837.533, 755], [838.452, 756], [839, 756.564], [839.451, 758], [840, 758.575], [840.486, 760], [841, 760.503], [842, 761.518], [843, 762.55], [843, 764], [843, 765], [843, 766], [843, 767], [843.578, 768], [844.413, 769], [845, 769.567], [845.444, 771], [846, 771.535], [846, 773], [846.498, 774], [847, 774.55], [847.525, 776], [848, 777], [848.587, 778], [849.463, 779], [850, 779.496], [850, 780], [850.556, 781], [851.528, 782], [852, 783], [852.577, 784], [853.418, 785], [854, 785.522], [854.493, 787], [855, 787.446], [855.395, 788], [856, 788.52], [856.44, 790], [857, 790.544], [857.472, 792], [858, 792.584], [858, 794], [858.586, 795], [859.546, 796], [860.386, 797], [861, 797.551], [862, 798.584], [863, 799.643], [863, 801], [863.448, 802], [864, 802], [865, 802] -Path 117: [142, 710], [142.371, 711], [143, 711.598], [144, 712.525], [145, 713.373], [145, 714], [145.377, 715], [146, 715] -Path 118: [347, 714], [348, 714], [348, 715], [348, 716], [348, 717] -Path 119: [997, 714], [996, 714], [995, 714], [994.443, 715], [993.363, 716], [992, 716.605], [991, 717.583], [990, 718.514], [989, 719.453], [988.464, 720], [987.418, 721], [986.398, 722], [985.388, 723], [984, 723.58], [983, 724.544], [982, 725.525], [981, 726.51], [980, 727.458], [979.432, 728], [978.321, 729], [977, 729.486], [976.479, 730], [975.412, 731], [974.379, 732], [973, 732.644], [972, 733.614], [971, 734.559], [970, 735.523], [969, 736.503], [968, 737.487], [967.489, 738], [966.449, 739], [965, 739.631], [964, 740.587], [963, 741.554], [962, 742.546], [961, 743.515], [960, 744.473], [959.438, 745], [958.416, 746], [957.397, 747], [956.409, 748], [955.432, 749], [954.443, 750], [953.458, 751], [952.464, 752], [951.464, 753], [950.439, 754], [949.417, 755], [948.4, 756], [947, 756.622], [946, 757.576], [945, 758.537], [944, 759.493], [943.481, 760], [942.419, 761], [941, 761.616], [940, 762.639], [939, 763.628], [938, 764.595], [937, 765.558], [936, 766.534], [935, 767.536], [934, 768.516], [933, 769.471], [932.454, 770], [931.439, 771], [930.455, 772], [929.456, 773], [928.44, 774], [927.424, 775], [926.418, 776], [925.432, 777], [924.43, 778], [923.385, 779], [922, 779.598], [921, 780.578], [920, 781.549], [919, 782.485], [918.462, 783], [917.419, 784], [916.315, 785], [915, 785.536], [914, 786.5], [913, 787.488], [912.447, 788], [911.425, 789], [910, 789.577], [909, 790.524], [908, 791.461], [907.435, 792], [906.335, 793], [905.123, 794], [904, 794.418], [903.401, 795], [902.339, 796], [901, 796.507], [900, 797.417], [899.416, 798], [898.3, 799], [897.093, 800], [896, 800.239], [895.274, 801], [894, 802], [893, 802.329], [892.333, 803], [891.144, 804], [890, 804.251], [889.311, 805], [888, 806], [887, 806.057], [886.062, 807], [885, 808], [884, 808.17], [883.192, 809], [882, 809.294], [881.305, 810], [880, 811], [879, 811], [878, 812], [877, 812.053], [876.089, 813], [875, 813.012], [874.018, 814], [873, 815] -Path 120: [146, 719], [145, 719], [144, 719], [143, 719], [142.512, 720], [142, 720.51], [142, 722], [141.451, 723], [140.619, 724], [140, 724.456], [139.606, 725], [139, 725.151], [139, 726] -Path 121: [137, 726], [137, 727], [137.509, 728], [138, 729], [138.108, 730], [139, 730] -Path 122: [483, 731], [483, 732], [483.513, 733], [484, 734], [484, 735], [484.448, 736], [485, 736.266], [485, 737] -Path 123: [971, 727], [970, 728], [969, 729], [968, 730], [967, 731], [966, 732], [965, 732], [964.238, 733], [963.239, 734], [962.239, 735], [961.157, 736], [960.089, 737], [959, 738], [958, 739] -Path 124: [423, 733], [422, 733.261], [421, 734.1], [420, 735], [419, 735.175], [418, 736.215], [417, 737], [416.206, 738], [415, 738.416], [414.4, 739], [413.301, 740], [412.055, 741], [411, 741.165], [410.212, 742], [409, 743], [408, 743.29], [407.312, 744], [406, 744.501], [405.426, 746], [404.458, 747], [403.499, 748], [402.454, 749], [401.404, 750], [400.357, 751], [399.303, 752], [398, 752.395], [397.425, 753], [396.444, 754], [395.448, 755], [394.455, 756], [394, 757], [394, 758] -Path 125: [137, 739], [136.456, 739], [135.552, 740], [135, 740.72], [134.384, 741], [134, 742], [133.467, 743], [133, 744], [133, 745], [133, 746], [133.357, 747], [134, 747] -Path 126: [993, 740], [992, 740.478], [991, 741.472], [989.519, 742], [989, 743], [988.363, 744], [987, 744.538], [986, 745.507], [985, 746.452], [984.439, 747], [983.361, 748], [982.218, 749], [981.08, 750], [980, 750.342], [979.368, 751], [978.295, 752], [977, 752.474], [976.455, 753], [975.455, 754], [974.436, 755], [973.394, 756], [972.181, 757], [971.086, 758], [970, 758.435], [969.448, 759], [968.49, 760], [967.517, 761], [967, 761.558], [966, 762.56], [965, 763.557], [964, 764.557], [963, 765.553], [962, 766.546], [961, 767.53], [960, 768.473], [959.506, 769], [959, 769.418], [958.446, 770], [957.411, 771], [956.395, 772], [955.411, 773], [954.477, 774], [953.479, 775], [952.458, 776], [951.406, 777], [950.376, 778], [949.367, 779], [948.349, 780], [947, 780.457], [946.482, 781], [945.439, 782], [944.432, 783], [943.392, 784], [942.374, 785], [941.358, 786], [940, 786.46], [939.437, 787], [938.43, 788], [937.424, 789], [936.43, 790], [935.396, 791], [934.312, 792], [933.29, 793], [932, 793.504], [931, 794.422], [930.433, 795], [929.393, 796], [928.322, 797], [927.283, 798], [926, 798.431], [925.41, 799], [924.359, 800], [923.334, 801], [922.304, 802], [921, 802.422], [920.396, 803], [919.226, 804], [918, 805], [917.095, 806], [916, 806.4], [915.387, 807], [914.332, 808], [913.327, 809], [912.342, 810], [911, 810.494], [910.404, 811], [909.436, 812], [908.468, 813], [907.435, 814], [906.419, 815], [905.41, 816], [904.403, 817], [903.41, 818], [902.393, 819], [901.363, 820], [900.33, 821], [899, 821.494], [898.475, 822], [897.434, 823], [896.431, 824], [895.417, 825], [894.398, 826], [893.372, 827], [892.334, 828], [891.275, 829], [890.231, 830], [889, 830.347], [888.366, 831], [887.293, 832], [886.173, 833], [885, 833.299], [884.304, 834], [883.216, 835], [882, 835.221], [881.29, 836], [880, 837], [879, 837.259], [878.263, 838], [877.241, 839], [876, 839.4], [875.373, 840], [874.264, 841], [873.214, 842], [872.235, 843], [871, 843.456], [870.459, 844], [869.459, 845], [868.467, 846], [867.424, 847], [866.355, 848], [865.32, 849], [864, 849.397], [863.443, 850], [862.305, 851], [861.116, 852], [860, 852.324], [859.324, 853], [858.21, 854], [857, 854.362], [856.367, 855], [855.331, 856], [854, 856.482], [853.491, 857], [852.462, 858], [851.419, 859], [850.338, 860], [849.128, 861], [848, 861.329], [847.363, 862], [846.16, 863], [845, 863.376], [844.386, 864], [843.363, 865], [842, 865.12], [842, 866] -Path 127: [406, 746], [405, 746.57], [404, 747.552], [403, 748.474] -Path 128: [464, 741], [463, 741.377], [461.558, 742], [461, 742.59], [460.458, 743], [460, 744], [459, 745], [458, 745.204], [457, 746.179], [456, 747], [455, 747] -Path 129: [148, 745], [147.484, 745], [147, 746], [146.517, 747], [146, 748], [145.537, 749], [145, 749.559], [144.531, 751], [144, 751.406], [144, 752], [144, 753], [143.382, 754], [143, 755], [142.501, 756], [142, 756.594], [142, 758], [141.545, 759], [141, 759.542], [141, 761], [140.594, 762], [140, 762.506], [140, 764], [139.495, 765], [139, 766], [138.492, 767], [138, 768], [137.539, 769], [137, 769.563], [137, 771], [137, 772], [137, 773], [137, 774], [137, 775], [137, 776], [136.415, 777], [136, 778], [136, 779], [135.508, 780], [135, 780.497], [135, 781], [135, 782], [134.407, 783], [134, 784], [133.481, 785], [133, 786], [132.353, 787], [132, 788], [132, 789], [131.488, 790], [130.761, 791], [130, 791], [129, 792] -Path 130: [292.713, 742], [292, 743], [292, 743.776], [291, 744.497], [290, 745], [289, 746], [288, 746.439], [287, 747.473], [286, 748.431], [285, 749.368], [284.424, 750], [283.63, 751], [283, 752], [283, 753], [282, 754], [282, 754.716], [281, 755] -Path 131: [996, 752], [995, 752.085], [994, 753], [993, 754], [992, 754.278], [991, 755], [990, 755], [989.4, 756], [988, 756.61], [987.289, 758], [986.242, 759], [985, 759.378], [984.414, 760], [983.327, 761], [982.242, 762], [981, 762.377], [980.372, 763], [979.296, 764], [978.236, 765], [977.147, 766], [976, 766.35], [975.343, 767], [974.333, 768], [973, 768.516], [972, 769.455], [971.478, 770], [970.413, 771], [969.358, 772], [968.32, 773], [967.295, 774], [966, 774.517], [965, 775.542], [964, 776.513], [963, 777.461], [962.536, 778], [962, 778.351], [961.411, 779], [960, 779.584], [959, 781], [958, 782], [957.186, 783], [956, 783.659], [955.249, 785], [954.338, 786], [953.406, 787], [952.239, 788], [951.4, 789], [950.561, 790], [950, 790.399], [949.535, 791], [949, 791.342], [949, 792], [948, 793], [948, 794] -Path 132: [950, 747], [949, 747.06], [948, 748], [947, 748.335], [946, 749.373], [945, 750.345], [944, 751.308], [943, 752.275], [942, 753.306], [941, 754.257], [940, 755.142], [939, 756.038], [938, 757], [937, 757], [936.271, 758], [935.236, 759], [934.26, 760], [933.25, 761], [932, 761.427], [931.533, 762], [931, 762.444], [931, 763], [930.199, 764], [929.191, 765], [928.114, 766], [927.076, 767], [926.024, 768], [925, 768.243], [924.338, 769] -Path 133: [821, 752], [822, 752.345], [822.794, 753], [823, 753.711], [824, 754], [824.575, 754], [825, 754.601], [826, 755.465], [827, 756.41], [828.378, 757], [829, 757.663], [830, 758], [830.412, 759], [831, 759.076], [831, 760] -Path 134: [270, 760], [270.512, 761], [271, 762], [271.333, 763], [272, 763.32], [272, 764], [272, 765] -Path 135: [396, 759.432], [396.547, 760], [397, 761], [397, 762], [397, 763.483], [397.581, 764], [398, 765], [398, 765.505], [399, 766], [400, 766.589], [401, 767.491], [401.456, 768], [402, 768.482], [402.522, 769], [404, 769.578], [405, 770], [406, 770.503], [407, 771.469], [407.491, 772], [408, 772.485], [408.483, 773], [409, 773.511], [410, 774.519], [411, 775.496], [411.363, 776], [412, 776.419], [412, 777] -Path 136: [527, 759], [526, 759.397], [525, 760.388], [524, 761.304], [522.513, 762], [522, 762.517], [521, 763.392], [520, 764.242], [518.515, 765], [518, 765.515], [517, 766], [516.395, 767], [515.304, 768], [514, 768.536], [513, 769.524], [512, 770.526], [511, 771.502], [510, 772.46], [509.453, 773], [508, 773.607], [507, 774.543], [506, 775.502], [505, 776.422], [504.416, 777], [503.327, 778], [502, 778] -Path 137: [997, 766], [996, 766], [995, 766], [994.394, 767], [993.357, 768], [992.298, 769], [991, 769.42], [990.414, 770], [989.357, 771], [988.301, 772], [987, 772.418], [986.456, 773], [985.421, 774], [984.394, 775], [983.362, 776], [982.308, 777], [981, 777.419], [980.424, 778], [979.386, 779], [978.339, 780], [977.226, 781], [976, 781.38], [975.394, 782], [974.321, 783], [973.248, 784], [972, 784.418], [971.41, 785], [970.348, 786], [969.287, 787], [968, 787.432], [967.42, 788], [966.388, 789], [965.377, 790], [964.353, 791], [963, 791.432], [962.49, 792], [961.578, 793], [961, 793.623], [960, 794.442], [960, 795] -Path 138: [448.464, 758], [449, 758.572], [449.646, 759], [450, 759.607], [450.586, 760], [451.412, 761], [452, 762.367], [453, 763], [454, 763], [455.073, 764], [456, 765.275], [456.849, 766], [457, 767], [457.489, 768], [458, 768.576], [459, 769.559], [460, 770.541], [461, 771.633], [461, 773] -Path 139: [443, 775], [442, 775.469], [441.423, 776], [440, 776.653], [439, 777.579], [438, 778.496], [437.44, 779], [436.429, 780], [435, 780.638], [434, 781.654], [433, 782.553], [432, 784] -Path 140: [761, 773], [761, 773.915], [761.542, 774], [762, 774.52], [763, 775], [764, 775.485], [764.54, 776], [765.538, 777], [766.487, 778], [767, 778.495], [767.502, 779], [769, 779.549], [770, 780.171], [770, 781] -Path 141: [689, 772], [688, 772.174], [687, 773], [686, 773.317], [685, 774.289], [684, 775.311], [683, 776], [682.285, 777], [681.309, 778], [680, 778.568], [679.445, 780], [678.42, 781], [677.368, 782], [676.358, 783], [675.357, 784], [674.343, 785], [673.328, 786], [672, 786.277], [671.364, 787], [670.022, 788], [669, 789], [668, 789], [667, 790], [666, 791], [665, 792], [664, 792], [663, 792.275], [662.273, 793], [661.298, 794], [660, 794.489], [659.491, 795], [658.513, 796], [658, 796.54], [657, 797.497], [656.566, 798], [656, 798.45], [655.516, 799], [655, 799.342], [655, 800], [654, 801] -Path 142: [831, 762], [831, 763], [831, 764.363], [831.568, 765], [832, 765.516], [833, 766], [833.699, 766], [834.444, 767], [835, 768], [835, 769], [835, 770.417], [835.539, 771], [836, 772.432], [837, 773.435], [838.312, 774], [839, 774.898], [839.669, 775], [840, 776], [840.359, 777], [841, 777] -Path 143: [550, 778], [549, 778], [548.537, 779], [548, 779.554], [547, 780.541], [546, 781.578], [545, 782.644], [544, 783.573], [543, 784.572], [542, 785.524], [541, 786.51], [540, 787.479], [539.406, 788], [539, 789] -Path 144: [523, 774], [522, 774], [521.36, 774], [521, 775], [520, 776], [519, 777], [518, 778], [517, 778], [516, 778.3], [515, 779], [514.268, 780], [513.272, 781], [512.292, 782], [511, 782.362], [511, 783], [510.175, 784], [509.15, 785], [508, 785.072], [507.381, 786], [506, 786] -Path 145: [464, 781], [463, 781], [462, 781], [462, 782], [461.426, 783], [461, 784], [461, 785], [461, 786], [461, 787], [461, 788], [461, 789], [461.557, 790], [462.496, 791], [463, 791], [464, 791], [465, 791.545], [466, 792], [467, 792.598], [468, 793], [469, 793] -Path 146: [116, 782], [116.564, 783], [117.382, 784], [118, 784.55], [119, 785], [120, 785.528], [121, 786.492], [121.19, 787], [122, 787] -Path 147: [497, 778], [497.642, 778], [498, 778.62], [498.546, 779], [499.406, 780], [500, 781.498], [501, 782], [501.611, 783], [502.602, 784], [503.503, 785], [505, 785.249], [505.331, 786], [506, 786] -Path 148: [752, 778], [751, 778.348], [750, 779.139], [749, 780], [748, 780.392], [747, 781.365], [746, 782], [745, 782], [744.472, 783], [743.421, 784], [742.343, 785], [741.278, 786], [740, 786.495], [739.505, 787], [739, 787.49], [738.475, 788], [737.43, 789], [736.35, 790], [735.286, 791], [734.22, 792], [733, 792.481], [732.468, 793], [731.457, 794], [730.424, 795], [729.349, 796], [728, 797], [727, 797], [726, 798], [725, 799], [724, 799.157], [723.064, 800], [722, 800.689], [721, 801.646], [720, 802.607], [719, 803.585], [718, 804.517], [717, 805.403], [716.399, 806], [715.307, 807], [714.263, 808], [713, 808.427], [712.414, 809], [711.36, 810], [710.24, 811], [709, 811.387], [708.369, 812], [707.317, 813], [706, 813.549], [705, 814.521], [704, 815.491], [703.604, 816], [703, 816.504], [702, 817.614], [701, 818.527], [700, 819.001], [699.001, 820], [698, 821], [697, 822], [696, 822.45], [695.404, 823], [694.338, 824], [693.147, 825] -Path 149: [410, 782], [409, 782], [408.497, 782], [408, 782.627], [407, 783], [406.507, 784], [406, 784.528], [405, 785.405], [404.421, 786], [403.315, 787], [402.166, 788], [401.1, 789], [400, 789.42], [399.476, 790], [398.426, 791], [397.355, 792], [396.255, 793], [395.22, 794], [394, 794.481], [393.463, 795], [392.411, 796], [391.426, 797], [390.491, 798], [389.498, 799], [388.485, 800], [387.328, 801], [386, 802], [385, 803], [384, 804], [383, 805], [382, 805.355], [381.363, 806], [380.35, 807], [379.239, 808], [378.168, 809], [377, 810], [376, 810.037], [375.055, 811], [374, 812], [373, 812.25], [372.227, 813], [371, 813.526], [370, 814.491], [369.479, 815], [368.439, 816], [367.418, 817], [366.359, 818], [365.317, 819], [364, 819.38], [363.469, 820], [362.231, 821] -Path 150: [911, 781], [910, 782], [909, 782], [908, 783], [907, 784], [906, 784], [905.126, 785], [904.046, 786], [903, 786.135], [902.187, 787], [901.044, 788], [900, 788.094], [899.152, 789], [898, 790], [897, 790.037], [896.067, 791], [895, 791.121], [894.186, 792], [893, 793], [892, 793], [891, 794], [890, 794], [889, 795], [888, 795], [887, 796], [886, 796], [885, 797], [884, 797], [883, 798], [882, 798], [881, 799] -Path 151: [430, 785], [429, 786], [428, 786.476], [427, 787], [426.363, 788], [425, 788.583], [424, 789.499], [423.493, 790], [422.453, 791], [421.575, 792], [421, 792] -Path 152: [494, 783], [493, 783.477], [492.47, 784], [492, 785.436], [491.445, 786], [491, 787], [491, 788], [490.531, 789], [490, 790], [489.514, 791], [489, 791.604], [488, 792.591], [487, 793.499], [487, 794], [486.167, 795], [485, 796], [484, 796], [483, 797], [482, 797] -Path 153: [532, 796], [531, 796], [530, 796], [529.408, 797], [528.094, 798], [527, 799], [526, 799], [525, 799.643], [524, 800.568], [523, 801.397], [522.459, 802], [521, 803], [520, 804], [519, 805], [518, 805.511], [517, 806] -Path 154: [957, 797], [956, 797], [955, 797], [954.453, 798], [953.482, 799], [952.492, 800], [951.529, 801], [951, 801.523], [950, 802.552], [949.461, 804], [948, 804.424], [948, 805], [947, 806], [946, 807], [945, 808] -Path 155: [502, 798], [503, 798], [504, 798.607], [504.6, 800], [505.557, 801], [506.456, 802], [507, 802.451], [507, 803], [507.514, 804], [509, 804.334], [509, 805] -Path 156: [748, 797], [748, 798], [748, 799], [748, 800], [748.549, 801], [749, 802], [749.333, 803], [750, 803] -Path 157: [107, 801], [107, 802], [107.534, 803], [109, 803.378], [109.436, 804], [110, 804] -Path 158: [550, 800], [549, 800.243], [548, 801.131], [547, 802], [546, 803], [545, 803], [544, 804], [543, 804], [542, 805], [541, 806], [540, 806.278], [539, 807], [538, 807], [537.46, 808], [536.47, 809], [535.473, 810], [534.44, 811], [533.425, 812], [532.405, 813], [531.413, 814], [530.447, 815], [529.511, 816], [529, 816.465], [528.541, 817], [528, 817.51], [527, 818.485], [527, 819], [526.296, 820], [525, 820.438], [524.442, 821], [523.377, 822], [522, 823] -Path 159: [652, 802], [651, 802.258], [650, 803], [649, 803.44], [648, 804.393], [647, 805.405], [646, 806.426], [645, 807], [644, 807.57], [643.37, 809], [642.308, 810], [641, 810.377], [640.451, 811], [639.396, 812], [638.403, 813], [637.512, 814], [637, 814.538], [636, 815.566], [635.439, 817], [634.5, 818], [633.477, 819], [632.406, 820], [631, 821] -Path 160: [866, 806], [866, 806.681], [867, 807], [867, 808], [867.5, 809], [868, 809], [869, 809.597], [870, 810] -Path 161: [226, 805], [225, 805], [224.473, 805], [224, 806], [223.558, 807], [223, 808], [223, 809], [223, 810], [223, 811], [223, 812], [223, 813], [223, 814] -Path 162: [110, 810], [110, 811], [110.522, 812], [112, 812.323], [112.282, 813], [113, 813] -Path 163: [416, 811], [415, 811], [414, 811], [413.444, 812], [412.398, 813], [411.401, 814], [411, 815] -Path 164: [482, 810], [482, 811], [482, 812], [483, 812.636], [483.529, 814], [484.425, 815], [485, 815.538], [486, 816.536], [487, 817.522], [488, 818.579], [489, 819.714], [490, 820.699], [490.409, 822], [491, 822.617], [491.603, 824], [492.489, 825], [493, 825.567], [493.617, 827], [494.463, 828], [495, 828.52], [495, 830] -Path 165: [716, 813], [716, 814], [716, 815], [716.534, 816], [717, 817], [717.486, 818], [718, 818.363], [718.478, 819], [719, 819], [720, 819], [721, 820], [721.361, 821], [722, 821] -Path 166: [918, 813], [917.599, 814], [917, 814.472], [916.522, 815], [916, 815.635], [915, 816.484], [914.404, 817], [913.404, 818], [912.325, 819], [911.291, 820], [910, 820.568], [909, 821.538], [908, 822.523], [907, 823.468], [906.451, 824], [905.411, 825], [904.389, 826], [903, 826.583], [902, 827.551], [901, 828.559], [900, 829.487], [899.454, 830], [898.406, 831], [897, 831.626], [896.294, 833], [895, 833.506], [894, 834.5], [893, 835.424], [892.478, 836], [891.305, 837], [890, 838], [889.014, 839], [888, 839.421], [887.449, 840], [887, 841] -Path 167: [338, 815], [339, 815.481], [339, 816], [339, 817] -Path 168: [939, 811], [937.527, 811], [936.559, 812], [936, 813.424], [935, 814.453], [934, 815], [933.365, 816], [932.332, 817], [931.298, 818], [930, 818.432], [929.425, 819], [928.451, 820], [927.434, 821], [926.352, 822], [925.295, 823], [924.118, 824], [923, 824.324], [922.308, 825], [921.251, 826], [920, 826.364], [919.359, 827], [918.314, 828], [917.266, 829], [916, 829.443], [915.438, 830], [914.394, 831], [913.375, 832], [912.348, 833], [911.295, 834], [910, 834.439], [909.506, 835], [909, 835.43], [908.428, 836], [907.378, 837], [906.336, 838], [905.253, 839], [904, 839.436], [903.43, 840], [902.409, 841], [901.389, 842], [900.334, 843], [899.206, 844], [898, 844.288], [897.307, 845], [896.199, 846], [895, 846.324], [894.41, 847], [893.354, 848], [892.193, 849], [891.183, 850], [890, 850.428], [889.425, 851], [888.414, 852], [887.392, 853], [886.337, 854], [885.265, 855], [884, 855.41], [883.413, 856], [882.403, 857], [881.374, 858], [880.324, 859], [879.268, 860], [878, 860.43], [877.432, 861], [876.41, 862], [875.376, 863], [874.334, 864], [873.288, 865], [872, 865.412], [871.423, 866], [870.397, 867], [869.425, 868], [869, 869] -Path 169: [345, 816], [345.578, 817], [346.49, 818], [347, 818] -Path 170: [354, 818], [353, 818], [352, 818], [351.706, 819], [351, 819.629], [350.316, 821], [349.233, 822], [348.225, 823], [347, 824], [346.382, 825], [346, 826], [346, 827], [345.717, 828], [347, 828] -Path 171: [313, 820], [312, 820], [311, 820], [310.181, 821], [309, 822], [308, 822.177], [307.164, 823], [306, 823.474], [305.396, 824], [304.131, 825], [303, 826], [302, 826] -Path 172: [321, 817], [321.471, 818], [322.493, 819], [323.489, 820], [324.455, 821], [325, 822], [325.611, 823], [326.5, 824], [327, 824.504], [328, 825.568] -Path 173: [442, 821], [441, 821.051], [440, 822], [439, 822], [438.277, 823], [437.242, 824], [436.156, 825], [435.045, 826], [434, 826.245], [433.239, 827], [432.232, 828], [431, 828.339], [430.352, 829], [429.333, 830], [428.289, 831], [427.255, 832], [426.252, 833], [425, 833.374], [424.357, 834], [423.322, 835], [422.289, 836], [421.27, 837], [420.257, 838], [419.215, 839], [418, 839.309], [417.331, 840], [416.301, 841], [415.273, 842], [414.211, 843], [413.181, 844], [412, 844.325], [411.319, 845], [410.312, 846], [409.267, 847], [408.225, 848], [407.175, 849], [406, 849.331], [405.326, 850], [404.313, 851], [403.28, 852], [402.212, 853], [401.133, 854], [400, 854.25], [399.318, 855], [398.263, 856], [397.245, 857], [396.233, 858], [395, 858.323], [394.324, 859], [393.303, 860], [392.264, 861], [391.235, 862], [390.195, 863], [389.142, 864], [388, 864.1], [387.237, 865], [386, 866] -Path 174: [445, 818.382], [445.614, 819], [446.486, 820], [447, 821.392], [448, 822], [448, 823] -Path 175: [380, 820], [380, 821], [380, 821.533], [381, 822.463], [382, 823], [382, 824], [382.624, 825], [383, 826], [383, 827], [383, 828], [383, 829], [383, 830] -Path 176: [626, 823], [625, 823], [624, 823], [623.383, 824], [622.412, 825], [621, 825.537], [620, 826.564], [619.423, 828], [618.399, 829], [617.346, 830], [616.136, 831], [615, 831], [614, 832], [613, 833], [612, 833], [611, 833.326], [610.351, 834], [609.283, 835], [608, 835.437], [607.505, 836], [607, 836.435], [606.483, 837], [605.488, 838], [604.513, 839], [604, 839.456], [603.505, 840], [603, 840.444], [602.475, 841], [601.448, 842], [600.422, 843], [599.429, 844], [598.589, 845], [598, 845.504], [597.547, 847], [597, 847.55], [597, 849], [596.675, 850], [596, 850] -Path 177: [104, 825], [105, 825.434], [105.304, 826], [106, 826.404], [106, 827], [106, 828], [106.368, 829], [107, 829], [108, 829.387], [108.488, 830], [109, 830], [110, 830] -Path 178: [456, 829], [456.401, 830], [457, 830], [458, 830], [459, 830] -Path 179: [182, 826], [182, 826.528], [182.53, 827], [183, 828], [183, 829], [183, 829.531], [183.723, 830], [184, 831], [185, 831.498], [185.514, 832], [186.087, 833], [187, 833] -Path 180: [269, 832], [269, 832.563], [270, 833], [270.619, 834], [271.448, 835], [272, 835.225], [272.329, 836], [273, 836.223], [273.55, 837] -Path 181: [99, 835], [98, 835], [97, 835], [97, 836], [97, 837], [96.5831, 838], [96, 838.602], [96, 840], [96, 841], [96.4016, 842], [97, 842.592], [97.4843, 844], [98, 844.52], [98, 846] -Path 182: [372, 833], [372, 834], [372, 835], [373, 835.565], [374, 836], [375, 837], [375, 838], [375.545, 839], [376, 840], [376.544, 841], [377.422, 842], [378, 842.453], [378.375, 843], [379, 843.559], [379, 845] -Path 183: [508, 835], [508, 836], [508.509, 837], [509, 838], [509.422, 839], [510, 839.609], [510.471, 841], [511, 841.556], [512, 842.581], [513, 843.538], [514, 844.476], [514.551, 845], [516, 845.519], [517, 846], [518, 846], [519, 846.551], [520, 847], [521, 847], [522, 847.091], [522, 848] -Path 184: [318, 836], [317, 836], [316.16, 837], [315, 837.297], [314.32, 838], [313.264, 839], [312.203, 840], [311, 840.354], [310.342, 841], [309.305, 842], [308.277, 843], [307.238, 844], [306, 844.399], [305.416, 845], [304.369, 846], [303.342, 847], [302.29, 848], [301.195, 849], [300.169, 850], [299, 850.264], [298.592, 851], [298, 851] -Path 185: [704, 836], [703, 836], [702, 836], [701.361, 837], [700.295, 838], [699.176, 839], [698, 839.512], [697, 840.44], [696.418, 841], [695.375, 842], [694.312, 843], [693, 843.51], [692, 844.488], [691.473, 845], [690.461, 846], [689.429, 847], [688.395, 848], [687.355, 849], [686.267, 850], [685, 850.426], [684.423, 851], [683.373, 852], [682.289, 853], [681.165, 854], [680, 854.358], [679.355, 855], [678.307, 856], [677, 856.485], [676.478, 857], [675.445, 858], [674.395, 859], [673.344, 860], [672.299, 861], [671, 861.485], [670.479, 862], [669.435, 863], [668.359, 864], [667.273, 865], [666, 865.502], [665, 866.47], [664.454, 867], [663.426, 868], [662.385, 869], [661.347, 870], [660, 870.534], [659, 871.498], [658.475, 872], [657.431, 873], [656.391, 874], [655.347, 875], [654.291, 876], [653, 876.463], [652.441, 877], [651.416, 878], [650.379, 879], [649.3, 880], [648, 880.471], [647.441, 881], [646.41, 882], [645.329, 883], [644.201, 884], [643, 884.385], [642.385, 885], [641.332, 886], [640, 886.513], [639, 887.466], [638.452, 888], [637.442, 889], [636.414, 890], [635.368, 891], [634.347, 892], [633, 892.543], [632, 893.532], [631, 894.512], [630, 895.496], [629.48, 896], [628.462, 897], [627.44, 898], [626.412, 899], [625.391, 900], [624.354, 901], [623.282, 902], [622, 902.424], [621.422, 903], [620.334, 904], [619.213, 905], [618, 905.343], [617.349, 906], [616.293, 907], [615, 907.46], [614.451, 908], [613.391, 909], [612.34, 910], [611.302, 911], [610, 911.511], [609, 912.398], [608.395, 913], [607, 914] -Path 186: [265.437, 836], [266, 837], [267, 838], [267.492, 839], [268, 839.542], [268, 841] -Path 187: [384, 837], [383, 837], [382, 837.484], [381.618, 838], [381, 838.422], [381, 839], [381, 840] -Path 188: [290, 838], [291, 838], [292, 838], [293, 838], [294, 838] -Path 189: [334, 838], [333, 838], [332, 838], [331.432, 839], [330.433, 840], [329.395, 841], [328.23, 842], [327, 842.412], [326.418, 843], [325.38, 844], [324.386, 845], [323.443, 846], [322.444, 847], [321.404, 848], [320.349, 849], [319.283, 850], [318, 851], [317, 851.188], [316.243, 852], [315, 852.164], [314.29, 853], [313, 854] -Path 190: [494, 840], [495, 841], [495.36, 842], [496, 842.568], [496.517, 844], [497, 845], [497, 846], [497.268, 847], [498, 847.643], [498, 849], [498, 850] -Path 191: [274, 841], [274.641, 841], [275, 841.66], [276, 842], [276.629, 843], [278, 843.557], [279, 844.453], [279.409, 845], [280, 845.46], [280.329, 846], [281, 846] -Path 192: [264, 842], [264, 843], [265, 843.688], [266, 844], [267, 845], [268, 846] -Path 193: [253, 845], [253.535, 846], [254.51, 847], [255.4, 848], [256, 848.619], [256.634, 850], [257.573, 851], [258.577, 852], [260, 852.886] -Path 194: [291, 845], [292, 845], [292, 846], [292.557, 847], [293, 848], [293.513, 849], [294, 850], [294, 851] -Path 195: [249, 846], [248, 846], [247, 847], [246, 848], [245, 849] -Path 196: [528, 846], [528, 847], [529, 847], [530, 847.527], [531, 848.524], [531.543, 850], [532, 851], [532.581, 852], [533.5, 853], [534, 853.527], [535, 854.553], [536, 855.546], [537, 856.523], [538, 857.49], [538.414, 858], [539, 858.497], [539, 859], [539.477, 860], [540, 860.522], [540, 862], [540.42, 863], [541, 863.584], [542, 864.645], [543, 865.589], [544, 866.55], [545, 867.468], [545.489, 868], [546, 868], [547, 868], [548, 868] -Path 197: [249, 848], [249, 849], [249.638, 850], [250.483, 851], [251, 851.567], [252, 852.56], [253, 853.581], [254, 854.592], [255, 855.404], [255.592, 856], [257, 857] -Path 198: [263, 848], [263, 849], [264, 850], [265, 850.356], [265.126, 851], [266, 851.226], [266, 852] -Path 199: [355, 844], [354, 844.393], [353, 845.059], [352, 846], [351, 847], [350.467, 847], [350, 848], [349, 849], [348, 850], [347, 850], [346, 850.626], [345, 851.325], [344.411, 852], [343, 852.5], [342, 853], [341, 853.592], [340, 854.504], [340, 856], [340, 857], [340, 858], [340, 859], [340, 860] -Path 200: [794, 846], [794, 847], [794, 848], [794.606, 849], [796, 849.426], [796, 850], [796, 851], [797, 852] -Path 201: [840, 843], [839.397, 843], [839, 844], [838.501, 845], [838, 846.415], [837.323, 847], [837, 847.593], [836, 848], [835.546, 849], [835, 849.336], [834.412, 850], [833.123, 851], [832.105, 852], [831.15, 853], [830, 853.408], [829.637, 854], [829, 854] -Path 202: [98, 849], [98, 850], [98.5541, 851], [99, 852], [99.4731, 853], [100, 853.388], [100.464, 854], [101, 854], [102, 854.49], [102.447, 855], [103, 855.508], [104, 856.521], [105, 857.529], [105.476, 859], [106, 859.443], [106, 860], [106, 861], [106, 862], [106, 863] -Path 203: [694, 834], [693, 834.449], [692, 835.395], [691, 836.272], [690, 837.144], [689, 838.123], [688, 839.161], [687, 840], [686, 841], [685, 841.222], [684, 842.142], [683, 843.07], [682, 844], [681, 844.325], [680, 845.166], [679, 846.129], [678, 847.056], [677, 848.02], [676, 849], [675, 849.302], [674, 850], [673, 850.564], [672.16, 852], [671, 852.35], [670.383, 853], [669, 853.523], [668.169, 855], [667.072, 856], [666, 856], [665, 856.579], [664.079, 858], [663, 859], [662, 859.328], [661.347, 860], [660.309, 861], [659.296, 862], [658.291, 863], [657, 863.588], [656, 864.513], [655, 865.438], [654.461, 866], [653.409, 867], [652.317, 868], [651.239, 869], [650.147, 870], [649, 870.293], [648.281, 871], [647.169, 872], [646.125, 873], [645, 873.335], [644.353, 874], [643.342, 875], [642.374, 876], [641.303, 877], [640, 877.662], [639, 878.497], [639, 879], [638.031, 880], [637, 881], [636, 881], [635, 882], [634, 883], [633, 884], [632, 884.196], [631.227, 885], [630, 885.47], [629.441, 886], [629, 887], [628, 888], [627, 888.144], [626.158, 889], [625, 890], [624, 891], [623, 891.39], [622.338, 892], [621.302, 893], [620, 893.508], [619, 894.438], [618.416, 895], [617.464, 896], [616.424, 897], [615.248, 898], [614, 899], [613, 900], [612, 900], [611, 900.133], [611, 901] -Path 204: [877, 849], [876, 850], [875, 850], [874, 850.431], [873, 851], [872, 851.619], [871, 852.537], [870, 853.41], [869.391, 854], [868, 854.573], [867.101, 856], [866, 857], [865, 857.06], [864.052, 858], [863.064, 859], [862, 859.409], [861.431, 860], [860.37, 861], [859.341, 862], [858, 862.512], [857, 863.495], [856.417, 864], [855.405, 865], [854.409, 866], [853.334, 867], [852.232, 868], [851.167, 869], [850, 869.427], [849.432, 870], [848.319, 871], [847.096, 872], [846.037, 873], [845, 873.398], [844.303, 874], [843.466, 875], [842.439, 876], [842, 877] -Path 205: [244, 852], [245, 852.522], [246, 853.638], [246.593, 855], [247.578, 856], [248.593, 857], [249.64, 858], [251, 858.46], [251, 859] -Path 206: [368, 850], [368.429, 851], [369, 852], [369.657, 853], [370.63, 854], [371.608, 855], [372.587, 856], [373.588, 857], [375, 857.543], [376, 858.464], [376.369, 859], [377, 859.531], [378, 860.591], [379, 861.689], [380, 862.481], [380, 863] -Path 207: [365, 853], [364, 853], [363.248, 854], [362.199, 855], [361.165, 856], [360, 856.281], [359.306, 857], [358.272, 858], [357.222, 859], [356.178, 860], [355, 860.299], [354.311, 861], [353.273, 862], [352.231, 863], [351.211, 864], [350, 864.31], [349.32, 865], [348.3, 866], [347.291, 867], [346.097, 868], [345, 868.098], [344.147, 869], [343, 870], [342.273, 870.677], [343, 871.517], [344, 872.57], [345, 873.532], [346, 874.501], [347, 875.503], [348, 876.581] -Path 208: [788, 853], [789, 853.318], [789, 854], [789, 855] -Path 209: [239, 854], [238, 854], [237, 854], [237, 855], [236.536, 856], [236, 856], [235, 857], [235, 858] -Path 210: [501, 855], [500, 855], [499.139, 856], [498.401, 857], [497.497, 858], [496, 858] -Path 211: [382, 857], [383, 858], [383, 859], [383.492, 860], [384, 861], [385, 862] -Path 212: [575, 857], [574, 857], [573, 857], [573, 858], [573, 859], [573, 860], [573.473, 861], [574, 861.541], [575, 862.519], [576, 863.568], [576.561, 865], [577.463, 866], [578, 866.521], [579, 867.517], [580, 868.593], [581, 869.639], [581.512, 871], [582.428, 872], [583, 872.578], [584, 873.615], [584.549, 875], [585.527, 876], [586.478, 877], [587, 877.511], [588, 878.527], [589, 879.543], [590, 880.547], [591, 881.04], [591, 882] -Path 213: [814, 855], [813, 855.126], [812, 856.028], [811, 857], [810, 857], [809.226, 858], [808.127, 859], [807, 859.342], [806.345, 860], [805.357, 861], [804.363, 862], [803.267, 863], [802.217, 864], [801.288, 865], [800.268, 866], [799.245, 867], [798.259, 868], [797.063, 869], [797, 870] -Path 214: [242, 858], [243, 858], [244, 859], [244.329, 860], [245, 860.543], [246, 861] -Path 215: [495, 860], [494, 861], [493, 861.396], [492.46, 862], [492, 863] -Path 216: [588, 860], [587.729, 861], [587, 861], [586, 861], [585, 861] -Path 217: [509, 862], [508, 862], [507, 863], [507, 864], [506.597, 865], [506, 865] -Path 218: [501, 866], [502, 866], [503, 866.37], [503, 867], [503, 868], [504, 869], [504, 870] -Path 219: [566, 866], [567, 866], [568, 866.377], [568.404, 867], [569, 867], [570, 867], [571, 868] -Path 220: [746, 865], [746.918, 865], [747, 865.652], [748, 866], [748.221, 867], [749, 867.471], [749, 868] -Path 221: [819, 865], [817.516, 865], [817, 865.502], [816, 866.444], [815, 867], [814.382, 868], [813.337, 869], [812, 869.453], [811.454, 870], [810.395, 871], [809.384, 872], [808, 872.547], [807, 873.449], [806.425, 874], [805.329, 875], [804.211, 876], [803, 876.521], [802, 877.512], [801, 878.44], [800.416, 879], [799.375, 880], [798.325, 881], [797, 881.491], [796.5, 882], [795.474, 883], [794.441, 884], [793.283, 885], [792, 886], [791, 886], [790, 886.56], [789, 888], [788, 888], [787, 888.585], [786, 889.47], [786, 890], [785, 891], [784, 891.534], [783, 892.55], [782, 893.529], [781, 894.528], [780, 895.531], [779, 896.513], [778, 897.483], [777.46, 898], [776.422, 899], [775.397, 900], [774, 900.578], [773, 901.534], [772, 902.486], [771.448, 903], [770.405, 904], [769.366, 905], [768.355, 906], [767, 906.606], [766, 907.573], [765, 908.521], [764, 909.49], [763.476, 910], [762.469, 911], [761.483, 912], [760.542, 913], [760, 913.446], [759.581, 914], [759, 914.354], [758.365, 915], [757.302, 916], [756.267, 917], [755.177, 918], [754, 918.317], [753.392, 919], [752.321, 920], [751.259, 921], [750.216, 922], [749, 922.437], [749, 923], [748.055, 924], [747, 924.174], [746.24, 925], [745, 926], [744, 927], [743, 928], [742, 929], [741, 929], [740, 930], [739, 930], [738, 931], [737, 932], [736, 933], [735.326, 934], [734.595, 935], [734, 935] -Path 222: [498, 868], [497.55, 869], [497, 869.575], [497, 871], [497, 872], [497, 873], [497, 874] -Path 223: [515, 862], [515.451, 863], [516, 864.492], [516.554, 865], [517.492, 866], [518, 866.522], [518.503, 867], [519, 868], [520, 868.54], [520.331, 870], [521, 870] -Path 224: [743, 868], [742, 868], [741.856, 869], [741, 869.692], [740, 871], [739.543, 872], [739, 872] -Path 225: [839, 869], [838, 870], [837, 870], [836, 870], [835.481, 871], [834.55, 872], [834, 872.491], [833.563, 873], [833, 873.503], [832, 874.534], [831, 875.472], [830.488, 876], [829.454, 877], [828.392, 878], [827.313, 879], [826.18, 880], [825, 880.308], [824.364, 881], [823.309, 882], [822, 882.372], [821.426, 883], [820.332, 884], [819.249, 885], [818.161, 886], [817, 886.366], [816.38, 887], [815.319, 888], [814.207, 889], [813, 889.166], [812.265, 890], [811, 891] -Path 226: [478, 871], [477, 871], [476, 871.55], [475, 872.559], [474, 873.548], [473, 874.491], [472.514, 875], [472, 875.469], [471.513, 876], [471, 876.474], [470.438, 877], [469.387, 878], [468.257, 879], [467, 879.515], [466, 880.537], [465, 881.418], [464.434, 882], [463.305, 883], [462.142, 884], [461, 884.494], [460.447, 885], [459.218, 886] -Path 227: [598, 867], [598.409, 868], [599, 869.428], [600, 870.496], [601, 871], [601.444, 872], [602, 872.551], [603, 873.458], [603.407, 874], [604, 874.374], [604.45, 875], [605, 875.378], [605.413, 876], [606, 876.681], [606.537, 878], [607.539, 879], [608.433, 880], [609, 880.433], [609, 881] -Path 228: [793, 871], [792, 871], [791.173, 872], [790, 872.338], [789.329, 873], [788.284, 874], [787.327, 875], [786, 875.501], [785, 876.578], [784.343, 878], [783.334, 879], [782.321, 880], [781, 881], [780.386, 882], [779.358, 883] -Path 229: [566, 869], [566.371, 870], [567, 871.46], [568, 872], [568.513, 873], [569.409, 874], [570, 874.606], [571, 875.645], [571.646, 877], [572.549, 878], [573.498, 879], [574, 879.514], [575, 880.606], [576, 881.638], [577, 882.646], [577.645, 884], [578.596, 885], [579.569, 886], [580.446, 887], [581, 887.564], [582, 888.601], [583, 889.579], [583.64, 891], [584.557, 892], [585.445, 893], [586, 893.499], [586.362, 894], [587, 894.726], [587.667, 896], [588, 897] -Path 230: [862, 874], [861, 874], [860, 874], [859.465, 875], [858.429, 876], [857.377, 877], [856.311, 878], [855.226, 879], [854, 879.394], [853.376, 880], [852.375, 881], [851.392, 882], [850.519, 883], [850, 883.452], [850, 884], [849.7, 885], [849, 885] -Path 231: [737, 876], [738, 876], [739, 876], [740, 876.748] -Path 232: [750, 875], [749, 875], [748.477, 875], [748, 875.547], [747.419, 876], [747, 876.512], [746, 877], [745.488, 878], [744.458, 879], [743.476, 880], [743, 881] -Path 233: [204, 877], [204, 878], [205, 878], [206, 878.46], [206.523, 879] -Path 234: [558, 876.173], [557, 877], [556, 878], [555, 878], [554.044, 879], [553.239, 880], [552.255, 881], [551.324, 882], [551, 883] -Path 235: [643, 868], [642, 868], [641, 868], [640, 868], [639.483, 868], [639, 868.578], [638, 869], [637.479, 869], [637, 869.674], [636.483, 870], [636, 871], [635, 872], [634.495, 872], [633.506, 873], [632.525, 874], [631.582, 875], [631, 875.552], [630, 876.473], [629.396, 877], [629, 878], [628, 879], [627, 879], [626, 879], [625.413, 880], [624.434, 881], [623.449, 882], [622.388, 883], [621.137, 884] -Path 236: [504, 875], [504, 875.517], [504.802, 876], [505, 877], [505, 878], [505, 879], [505, 880], [506, 880.395], [506, 881], [506, 882], [507, 883], [506.103, 884] -Path 237: [271, 881], [270, 882], [269, 882], [268, 882] -Path 238: [367, 881], [366, 881], [365.108, 882], [364.003, 883], [363, 883.31], [362.342, 884], [361.303, 885] -Path 239: [199, 881], [198, 881.265], [197, 882.397], [196, 883], [195.334, 884], [194, 884.56], [193, 885.55], [192.435, 887], [191.542, 888], [191, 888.611], [190, 889.576], [189, 890.541], [188.455, 892], [187.039, 893], [186.25, 894], [186, 895], [185, 896], [184, 896], [183, 896], [182, 897] -Path 240: [287, 883], [286, 883], [285.366, 884], [284, 884.413], [284, 885], [283, 886], [282, 887], [282, 888], [281.094, 889] -Path 241: [524, 879], [524.286, 880], [525, 881], [525, 881.511], [525.581, 882], [526, 883], [527, 883.536], [528, 884.567], [529, 885.676], [529.464, 887], [530, 887.552], [531, 888.538], [532, 889.522], [533, 890.501], [534, 891.536], [534.54, 893], [535.374, 894], [536, 894.478], [536.401, 895], [537, 895.485], [537, 896], [537, 897], [537.29, 898], [538, 898.708], [538, 900] -Path 242: [836, 882], [835, 882], [833.585, 882], [833, 883], [832.175, 884], [831, 885], [830, 885.316], [829.317, 886], [828, 886.55], [827, 887.492], [826.47, 888], [825.427, 889], [824.378, 890], [823.314, 891], [822, 891.435], [821.43, 892], [820.387, 893], [819.237, 894], [818, 894.386], [817.45, 895], [816.417, 896], [815.401, 897], [814, 897.339], [813.427, 898], [812.293, 899], [811.448, 900], [810.529, 901], [810, 901.549], [809, 902.48], [808.517, 903], [808, 903.433], [807.511, 904], [807, 904.407], [806.467, 905], [805.339, 906], [804.329, 907], [803, 907.539], [802, 908.49], [801.507, 909], [801, 909.471], [800.493, 910], [799.483, 911], [798.523, 912], [798, 912.383], [797.64, 913], [797, 913.46], [796.523, 914], [796, 914.522], [795, 915], [794, 915], [793, 915] -Path 243: [228, 884], [227.055, 885], [226, 885.471], [226, 886], [225.49, 887] -Path 244: [483, 884], [482, 884], [481.378, 885], [480.403, 886], [479, 886.368], [479, 887] -Path 245: [907, 885], [908, 885], [909, 885], [910, 885], [911, 885], [912, 885.875], [913, 886], [914, 886], [915, 886], [916, 886.54], [917, 887], [918, 887], [919, 887.043], [919, 888] -Path 246: [323, 886], [322, 886], [321.462, 887], [321, 888], [320.428, 889], [319.487, 890], [318.446, 891], [317.357, 892], [316.302, 893], [315, 893.457], [314.478, 894], [313.433, 895], [312.458, 896], [311.419, 897], [310.321, 898], [309.293, 899], [308.278, 900], [307, 900.479], [306.477, 901], [305.463, 902], [304.365, 903], [303.145, 904], [302, 905], [301, 905.355], [300.439, 906], [299.438, 907], [298.379, 908], [297, 908.456], [297, 909], [296.35, 910], [295, 910.358], [294.467, 911], [293.264, 912], [292.029, 913], [291.068, 914], [290, 914.061], [289.096, 915], [288, 916], [287, 917], [286, 918] -Path 247: [231, 888], [230.502, 889], [230, 889], [229, 890], [229, 891], [228.624, 892], [228, 892] -Path 248: [735, 882], [733.604, 882], [733, 883], [733, 883.782], [732.45, 884], [731.554, 885], [731, 886.416], [730, 887.446], [729, 888], [728, 889], [727, 890], [726, 891], [725, 892], [724, 892] -Path 249: [928, 889], [927, 889], [926, 889], [925, 889.665], [924, 890], [923, 890], [922, 890] -Path 250: [83, 890], [83.5498, 891], [85, 891.402], [85, 892] -Path 251: [498, 890], [498, 890.635], [499, 891], [499, 892], [499.528, 893] -Path 252: [731.486, 890], [732, 891], [733, 891.481], [733.206, 892], [734, 892] -Path 253: [891, 886], [892, 886], [893, 886.498], [894, 887], [895, 887], [896, 887], [897, 887], [898, 887], [899.346, 887], [900, 888], [901, 889], [902, 889], [902.529, 889], [903, 889.508], [904, 890], [905.443, 890], [906, 891], [907, 891], [908, 891.535], [909, 892], [910, 892.455], [910.434, 893], [911, 893.319], [911, 894], [911.556, 895], [912, 896], [912.462, 897], [913, 897.572], [913.408, 899], [914, 899.525], [914, 901], [914.439, 902], [915, 902] -Path 254: [520, 881], [518.719, 881], [518, 882], [517.509, 883], [517, 884.396], [516.305, 885], [515.503, 886], [514.565, 887], [514, 887.597], [513, 888.425], [512, 889], [511, 889], [510, 889.473], [509, 890], [508, 890], [507.485, 890], [507, 891.054], [506, 892], [505, 892], [504, 892], [503.442, 893] -Path 255: [808, 892], [807, 892], [806.131, 893], [805.034, 894], [804, 894.243], [803.279, 895], [802.134, 896], [801, 896.325], [800.413, 897], [800, 898] -Path 256: [495, 893], [494, 893], [493.166, 894], [492, 895], [491, 895] -Path 257: [853, 895], [852, 895], [851.333, 896], [850.226, 897], [849, 897.667], [848.343, 899], [848, 900] -Path 258: [238, 897], [237, 897], [236, 897], [235.304, 898], [235, 899], [234.707, 900], [234, 900.275], [233.336, 901], [232, 901.649], [232, 903] -Path 259: [83, 898], [84, 898.441], [84, 899], [84.4691, 900], [85, 900.371], [85, 901] -Path 260: [333, 898], [334, 898.503], [335, 899.521], [336, 900.572], [336.519, 902], [337.17, 903], [338, 903] -Path 261: [610, 894], [609, 894], [608.464, 894], [608, 895], [607, 896.022], [606, 897], [605.37, 897], [605, 897.517], [604, 898.453], [603, 899], [602.533, 900], [602, 900] -Path 262: [765, 895], [764, 896], [763, 896.01], [762, 897], [761, 897.256], [760, 898.288], [759, 899], [758.312, 900], [757.336, 901], [756.283, 902], [755.243, 903], [754.203, 904], [753.158, 905], [752.118, 906], [751, 907], [750, 907.193], [749.216, 908], [748, 909], [747, 910], [746, 910.054], [745.094, 911], [744, 912], [743, 913], [742, 913.096], [741.105, 914], [740.048, 915], [739, 915.348], [738.384, 916], [737.294, 917], [736.204, 918], [735.157, 919], [734.164, 920], [733, 920.416], [732.44, 921], [731.393, 922], [730.33, 923], [729.214, 924], [728.108, 925], [727.118, 926], [726.128, 927] -Path 263: [843, 902], [842, 902], [841.426, 902], [841, 902.588], [840, 903], [840, 904], [839, 905], [838, 905.209], [837.232, 906], [836, 906.473], [835.47, 907], [834.44, 908], [833.398, 909], [832, 909.419], [831.509, 910], [831, 910.288], [830.554, 911], [830, 911.333], [829.292, 912], [828.433, 913], [827.434, 914], [826, 914.351], [825.55, 915], [825, 915.185], [825, 916] -Path 264: [459, 904], [458, 904], [457, 904], [456.473, 905], [455.465, 906], [454.499, 907], [453.471, 908], [452.423, 909], [451.46, 910], [450.477, 911], [449.455, 912], [448, 912.601], [447, 913] -Path 265: [487, 905], [486, 905], [485, 905], [484.547, 906], [484, 906.516], [483, 907.456], [482.461, 908], [481.393, 909], [480, 909.608], [479, 910.499], [478.46, 911], [477.385, 912], [476, 912.572], [475, 913.623], [474, 914.498], [473.484, 915], [472.395, 916], [471.283, 917], [470, 917.521], [469, 918.223], [468.23, 919], [467, 920], [466, 921], [465, 921], [464, 921], [463, 921.609], [462.185, 923], [461.087, 924], [460.006, 925], [459, 925.274], [458.266, 926], [457.164, 927], [456, 927.378], [455.44, 928], [454.41, 929] -Path 266: [172, 904], [171, 904], [170.463, 904], [169.503, 905], [169, 905.599], [168, 906], [167.505, 907], [167, 907.38], [167, 908], [166, 909] -Path 267: [513, 907], [512, 907], [511.097, 908], [510, 908.245], [509.452, 909] -Path 268: [509, 911], [509.699, 912], [510.621, 913], [511.631, 914], [512.611, 915], [513.589, 916], [514.576, 917], [515.533, 918], [516.5, 919], [517, 919.532], [518, 920.165], [518, 921] -Path 269: [707, 912], [708, 912], [708, 913], [708, 914], [708.568, 915], [709.312, 916], [710, 916], [711, 917], [711.464, 918], [712, 918.414], [712.407, 919], [713, 919] -Path 270: [266, 913], [265, 913], [264.213, 914], [263.03, 915], [262, 915], [261, 915.478], [261, 916], [260.87, 917], [260, 917] -Path 271: [465, 913], [464, 913], [463, 913], [462.572, 914], [462, 914.511], [461, 915.547], [460, 916.601], [459.275, 918], [458, 918.281], [457.284, 919], [456, 920], [455, 921], [454, 921.321], [453.343, 922], [452, 922.606], [451, 923.521], [450, 924.443], [450, 925] -Path 272: [605, 915], [604, 916], [603, 916], [602, 916.584], [601, 917.57], [600, 918.483], [599.512, 919], [599, 919.418], [598.437, 920], [597.396, 921], [596.406, 922], [595.393, 923], [594.368, 924], [593.323, 925], [592, 925.507], [591.532, 927], [591, 927.488], [591, 928], [591, 929] -Path 273: [533, 915], [534, 916], [534.823, 916], [535, 917], [536, 917] -Path 274: [71, 917], [71, 918], [71.4585, 919], [72, 919], [73, 919], [74, 919.036], [74, 920] -Path 275: [820, 918], [819, 918], [818.47, 918], [818, 919.078], [817, 920], [816, 920], [815.407, 921], [814.353, 922], [813.351, 923], [812, 923.571], [811, 924.501], [810, 926], [809, 926.664], [809, 928], [808.263, 929], [807, 929.286], [806.397, 930], [806, 931], [805.273, 932], [804, 932.594], [803, 933.204], [802.375, 934] -Path 276: [175, 921], [175.563, 921], [176, 922], [176.493, 923], [177, 923.529] -Path 277: [257, 923], [256, 923], [255, 923], [254.554, 924], [254, 924.601], [253, 925.513], [252, 926.438], [251.403, 927], [250.338, 928], [249, 928.534], [248, 929.467], [247.427, 930], [246.369, 931], [245.366, 932], [244.277, 933] -Path 278: [239, 926], [238, 926], [237.219, 927], [236.047, 928], [235, 928.293], [234.28, 929], [234, 930] -Path 279: [66, 926], [66, 927], [66, 928], [66.5362, 929], [68, 929], [69, 929] -Path 280: [403, 913], [402, 913], [401, 913.346], [400.392, 914], [399.525, 915], [398.646, 916], [398, 916.525], [397.483, 917], [396.54, 918], [397, 919], [397, 920], [397, 921], [397, 922], [397, 923], [397, 924.459], [397.605, 925], [398.433, 926], [399, 927], [399.457, 928], [400, 928.571], [400.421, 930], [401, 930.588], [401, 932], [401.512, 933], [402, 934], [402, 935], [402.606, 936], [403.408, 937], [404, 937.584], [404.544, 939], [405.448, 940], [406, 940.539], [407, 941.593], [408, 942.357], [408, 943] -Path 281: [684, 929], [684.664, 930], [685.441, 931], [686, 931.55], [686.461, 933], [687, 933.479], [687, 934], [687, 935] -Path 282: [905, 928], [905, 929], [906, 929.451], [906, 930], [906, 931] -Path 283: [345, 928], [345, 928.614], [345.581, 929], [346, 930], [347, 930.598], [347.492, 932], [348, 932.418], [348, 933], [348, 934] -Path 284: [448, 931], [447, 931], [446, 931], [445.464, 932], [444.217, 933], [443.245, 934], [442.396, 935], [441.43, 936], [440, 936] -Path 285: [591, 931], [591.461, 932], [592, 932.524], [592.566, 934], [593.487, 935], [594, 935.534], [594.566, 937], [595.469, 938], [596, 938.51], [597, 939.609], [597.575, 941], [598.471, 942], [599, 942.541], [600, 943.556], [601, 944.549], [602, 945.504], [603, 946], [604, 946.556], [605, 947], [606, 947.495], [606.546, 948], [608, 948.171], [608, 949] -Path 286: [724, 928.064], [723, 929.022], [722, 930.032], [721, 931], [720, 931], [719.342, 932], [718.202, 933], [717.072, 934], [716, 935], [715, 935.278], [714.257, 936], [713.227, 937], [712.194, 938], [711.229, 939], [710, 939.396], [709.461, 940], [708.519, 941], [708, 941.357], [708, 942], [708, 943], [708, 944], [707.359, 945], [706.44, 946], [705.483, 947], [704.546, 948], [704, 948.599], [703.402, 950], [702.382, 951], [701.356, 952], [700.303, 953], [699, 953.378], [698.419, 954], [697.373, 955], [696.264, 956], [695.245, 957], [694.229, 958], [693, 958.253], [692.442, 959], [692, 960] -Path 287: [543, 926], [543, 926.531], [543.553, 927], [544, 928], [544.474, 929], [545, 930], [545, 931], [545, 932], [545, 933], [545.407, 934], [546, 934.605], [546, 936], [546.501, 937], [547, 938], [547.485, 939], [548, 939.426], [548.323, 940], [549, 940.399], [549, 941] -Path 288: [242, 934], [241, 935], [240, 935.06], [239.11, 936], [238, 936] -Path 289: [426, 928], [425.376, 928], [424.528, 929], [424, 930], [424, 931.409], [423.404, 932], [423, 932.516], [422.473, 933], [422, 934], [421.409, 935], [420.508, 936], [420, 936.551], [419, 937.575], [418, 938.572], [417, 939.538], [416.264, 941], [415, 941.262], [414.38, 942] -Path 290: [633, 934], [632, 934], [631, 934], [630, 934.649], [630, 936] -Path 291: [843, 928], [843, 928.676], [843.512, 929], [844.449, 930], [845.457, 931], [846, 932], [846.486, 933], [847, 934], [847, 935], [847.553, 936], [848.508, 937], [850, 937.475], [850.496, 938], [851, 938], [852, 938.571], [853, 939.43], [853.339, 940], [854, 940] -Path 292: [906, 935], [905, 935], [904.488, 936], [903.514, 937], [903, 937.527], [902, 938.46], [901.508, 939], [901, 939.348], [900.453, 940], [899.401, 941], [898.297, 942], [897, 943], [896, 943] -Path 293: [227, 936], [226, 936], [225, 936], [224.393, 937], [223.408, 938] -Path 294: [571, 935], [571, 936], [572, 936.597], [573, 937.598], [574, 938.566], [574, 940], [574, 941], [574, 942], [574.445, 943], [575, 943.594], [575.547, 945], [576, 946], [576, 947] -Path 295: [67, 937], [67.404, 938], [68, 938.521], [68, 940], [68, 941], [68, 942], [68.4064, 943], [69, 943.083], [69, 944] -Path 296: [167.487, 935], [168, 936], [168, 936.523], [169, 937], [169.432, 938], [170, 938.555], [170.461, 940], [171, 940.391], [171, 941] -Path 297: [559, 935], [558, 935.485], [557.484, 936], [557, 937], [556, 937.59], [555, 938.559], [554, 939.468], [553.534, 940], [553, 940.314], [552.455, 941] -Path 298: [798, 936], [797, 937], [796, 937], [795.346, 938], [794, 938.483], [793.503, 939], [793, 939.395], [792.423, 940], [791.343, 941], [790.348, 942], [789.315, 943], [788.186, 944], [787, 944.401], [786.488, 945], [785.511, 946], [785, 946.568], [784, 947.58], [783.407, 949], [782.41, 950], [781, 950.46], [781, 951], [780.565, 952], [780, 952.496], [779.495, 953], [778.121, 954] -Path 299: [631, 938], [630, 938], [630, 939], [629.249, 940], [628, 940.403], [627.387, 941], [626.373, 942], [625.342, 943], [624.297, 944], [623.18, 945], [622, 946], [621, 946] -Path 300: [672, 936], [673.245, 936], [674, 937], [675, 938], [675.497, 939], [676, 939.525], [677, 940.475], [677.467, 941], [678, 941.508], [678, 943] -Path 301: [838, 930], [837, 930], [836, 931], [835, 931.105], [834, 932], [833, 932.31], [832, 933], [831, 934], [830, 934], [829, 935], [828, 936], [827, 936], [826, 937], [825, 937.319], [824, 938], [823, 938.543], [822, 939.381], [821.591, 940], [821, 940] -Path 302: [234, 939], [234, 940], [233, 941], [232, 941] -Path 303: [735, 937], [734, 937], [733.417, 937], [733, 937.529], [732, 938.486], [731, 939], [730.327, 940], [729.331, 941], [728.423, 942], [727.466, 943] -Path 304: [300, 936], [300, 936.691], [300.593, 937], [301.396, 938], [302.28, 939], [303, 940], [303, 941], [303.585, 942], [304.472, 943], [305, 943.43], [305.483, 944], [306, 944.516], [307, 945.596], [308, 946] -Path 305: [840, 942], [841, 942.369], [841.586, 943], [842.563, 944], [843.464, 945], [844, 945.538], [845, 946.612], [845.652, 948], [846.582, 949], [847.469, 950], [848, 950.549], [849, 951.63], [849.583, 953], [850, 954], [851, 955], [852, 956], [852.823, 957], [853.674, 958], [854.511, 959], [855, 960], [856, 961] -Path 306: [768, 937], [767, 937.498], [766.419, 938], [765.514, 939], [764.551, 940], [763.507, 941], [763, 941.506], [762, 942.411], [761, 943], [760.333, 944], [759.243, 945], [758, 945.438], [757.425, 946], [756.379, 947], [755.295, 948], [754, 948.476], [753.463, 949], [752.442, 950], [751.383, 951], [750.31, 952], [749.231, 953], [748, 953.453], [747.439, 954], [746.417, 955], [745.394, 956], [744.327, 957], [743, 957.486], [742.493, 958], [741.483, 959], [740.448, 960], [739.369, 961], [738.137, 962], [737, 962.304], [736.305, 963], [735.13, 964], [734, 964.403], [733.421, 965], [732.377, 966], [731, 966.528], [730, 967.484], [729.467, 968], [728.366, 969], [727.285, 970], [726.262, 971], [725, 971.546], [724, 972.521], [723, 973.475], [722.48, 974], [721.395, 975], [720.337, 976], [719, 976.565], [718, 977.518], [717, 978.495], [716.508, 979], [716, 979.492], [715.496, 980], [714.431, 981], [713.417, 982], [712.395, 983], [711, 983.563], [710, 984.517], [709, 985.492], [708.484, 986], [707.492, 987], [706.501, 988], [706, 988.415], [705.448, 989], [704.355, 990], [703.268, 991], [702, 991.519], [701, 992.494], [700.442, 993], [699.399, 994], [698, 994.583], [697, 995.544], [696, 996.486], [695.41, 997], [694.387, 998], [694, 999] -Path 307: [232, 944], [231, 944], [230, 944], [229.359, 945], [228.179, 946], [227, 947], [226, 947.248], [225.263, 948], [224, 948.446], [223.385, 949], [222.394, 950], [221.535, 951], [221, 951.427], [220.578, 952], [220, 952.437], [219.275, 953], [218.398, 954], [217.443, 955], [216.378, 956], [215, 957] -Path 308: [665, 940], [665, 941], [665, 942.435], [665.773, 943], [666, 944], [666.552, 945], [667, 946], [667.562, 947], [668.501, 948], [669.488, 949], [670, 949.442], [670.38, 950], [671, 950], [672, 950] -Path 309: [563, 944], [563, 945], [563.443, 946], [564, 946.583], [564, 948] -Path 310: [546, 946], [545, 946], [544, 947], [543, 947], [542, 948], [541, 948.274], [540.266, 949], [539, 949.527], [538, 950.524], [537, 951.459], [536.349, 952], [535.3, 953], [534.275, 954], [533, 954.318], [532.599, 955], [532, 955.347], [531.659, 956], [531, 956.467], [531, 957], [530.277, 958], [529.258, 959], [528, 959.57], [527, 960.068], [527, 961] -Path 311: [212, 947], [213, 947], [214, 947.425], [214.571, 948], [216, 949], [217, 949.523], [218, 950.423], [218, 951] -Path 312: [835, 947], [834, 947], [833, 947], [832.291, 948], [831.25, 949], [830.204, 950], [829.029, 951], [828, 951.263], [827.29, 952], [826.251, 953] -Path 313: [383, 947], [383, 948], [383.593, 949], [384.435, 950], [385, 950], [386, 950] -Path 314: [678, 948], [677, 948], [676, 948], [675.403, 949], [675, 950] -Path 315: [853, 947], [853, 948], [854, 948.537], [854.567, 950], [855, 951], [855.571, 952], [856.533, 953], [857.587, 954], [859, 954.527], [859.502, 956], [860, 957], [860.499, 958], [861, 958.421], [861.549, 959], [862.584, 960], [863.428, 961], [864, 961.569], [864.525, 963], [865.125, 964], [866, 964] -Path 316: [60, 949], [59, 949], [58, 949], [58, 950], [57.5466, 951], [57, 951.552], [56.3484, 953], [55.3158, 954], [54.4304, 955], [53.5353, 956], [53, 956.317], [53, 957] -Path 317: [509, 940], [509, 940.822], [510, 941], [511, 941.497], [512.442, 942], [513.379, 943], [514, 943.636], [515, 944.423], [516, 945.425], [517.445, 946], [518, 946.68], [519, 947.393], [520, 948], [520.516, 948], [521, 948.525], [522, 949], [522.599, 950], [524, 950.484], [524.451, 951], [525, 951.452], [525.435, 952], [526, 952.436], [526, 953], [526.431, 954], [527, 954.284], [527.555, 955] -Path 318: [671, 933], [670, 933.023], [669, 934], [668, 934.434], [666.545, 935], [666, 935.51], [665, 936.4], [664, 937.179], [663, 938.054], [662, 939], [661, 940], [660, 940.409], [659, 941.012], [658, 942], [657, 943], [656, 944], [655, 944], [654, 945], [653, 945.033], [652, 946], [651, 946.246], [650, 947.169], [649, 948], [648.479, 948], [648, 948.547], [647.498, 949], [647, 949.584], [646.442, 950], [646, 950.537], [645, 951], [644.353, 952], [643, 952.57], [642, 953.584], [641, 954.556], [640, 955.547], [639, 956] -Path 319: [728, 949], [726.502, 949], [725.512, 950], [725, 950.571], [724, 951], [723.457, 952], [722.319, 953], [721, 954], [720, 954], [719, 955], [718, 955.381], [717.314, 956], [716, 956.507], [715, 957.311], [714.383, 958], [713, 959], [712, 960], [711, 960], [710, 960.268], [709.302, 961], [708, 962], [707, 962], [706, 963], [705, 963], [704, 964], [703, 964], [702, 965], [701, 965.327], [700.336, 966], [699.303, 967], [698.163, 968], [697.239, 969], [696.49, 970], [695.621, 971], [695, 971.518], [694.458, 973] -Path 320: [819, 950], [819, 950.893], [818, 951], [817, 951], [816, 952] -Path 321: [207, 954], [207, 955], [207, 956], [208, 957], [208, 958] -Path 322: [824, 954], [823.302, 955], [822, 955.465], [821.521, 956], [821, 956.425], [820.51, 957], [820, 957.402], [819.454, 958], [818.341, 959], [818, 960], [817, 961], [816, 961.241], [815.253, 962], [814.195, 963], [813, 963.37], [812.474, 964], [811.64, 965], [811, 965.616], [811, 967], [812, 967.773], [813, 968.827], [813.528, 970], [814.424, 971], [815, 971.581], [815.575, 973], [816.453, 974], [817, 974.578], [817.55, 976], [818.44, 977], [819, 977.545], [819.611, 979], [820.413, 980], [821, 980.544], [821.595, 982], [822.507, 983], [824, 983.912], [824.506, 985], [825.415, 986], [826, 986.572], [826.59, 988], [827.51, 989], [828.468, 990], [829, 990.551], [830, 991.61], [830.586, 993], [831.5, 994], [832, 994.492], [832.448, 995], [833, 995.535], [834, 996.553], [835, 997.538], [835, 999] -Path 323: [263, 955], [264, 955.631], [265, 956.551], [266, 957.414], [266.626, 958], [267, 959] -Path 324: [312, 955], [311, 955], [311, 956], [311, 957], [311.357, 958], [312, 958.314], [312.472, 959], [313, 959], [314, 959.467], [314.372, 960], [315, 960] -Path 325: [200, 953], [199.401, 953], [199, 953.598], [198.365, 954], [198, 954.529], [197.385, 955], [196.508, 956], [196, 957], [195.498, 958], [194.524, 959], [194, 959.403], [193.417, 960], [192.386, 961], [191.534, 962], [191, 962.393], [190.397, 963], [189, 963.35], [189, 964], [188, 965], [187, 965] -Path 326: [271, 957], [271, 958], [271.497, 959], [272, 959.561], [273, 960.548], [274, 961.473], [274.434, 962], [275, 962.349], [275.637, 963], [276.559, 964], [277, 965] -Path 327: [774, 956], [773, 957], [772, 957.391], [771, 958], [770.378, 959], [769, 959.452], [769, 960], [768, 961], [767, 962], [766.259, 963], [765.449, 964], [764.488, 965], [763.5, 966], [763, 966.411], [762.455, 967], [761.389, 968], [760.386, 969], [759, 969.465], [758.428, 970], [757.351, 971], [756.294, 972], [755, 972.482], [754.478, 973], [753.42, 974], [752.332, 975], [751, 975.434], [750.47, 976], [749.429, 977], [748.356, 978], [747.271, 979], [746, 979.454], [745.439, 980], [744.379, 981], [743.345, 982], [742, 982.516], [741, 983.524], [740, 984.492], [739.472, 985], [738.395, 986], [737.05, 987], [736, 987.305], [735.322, 988], [734.292, 989], [733, 989.039], [732.091, 990], [731, 991], [730, 991.374], [730, 992], [729.842, 993], [729, 993], [728, 993.704], [727.253, 995], [726.303, 996], [725, 996.271], [725, 997] -Path 328: [563, 953], [562, 953], [561, 953.391], [560.455, 954], [559.502, 955], [558.569, 956], [557.554, 957], [557, 957.522], [556, 958.399], [555, 959], [554.259, 960], [553, 960.455], [552.492, 961], [551.484, 962], [550.474, 963], [549.42, 964], [548, 964.517], [547, 965.299], [546.225, 966], [545, 966.467], [544.43, 967], [543.297, 968], [542.304, 969], [541, 969.51], [540.497, 971], [539.471, 972], [539, 973], [538, 974], [537, 975], [536, 976], [535, 976], [534, 976.54], [533, 977.562], [532, 978.539], [531, 979.483], [530.509, 980], [530, 980.438], [529.479, 981], [528.391, 982], [527.229, 983] -Path 329: [641, 958], [641, 959], [641, 960], [641.544, 961], [642.42, 962], [643, 962.406], [643, 963], [643.504, 964], [644, 965], [644.265, 966], [645, 966] -Path 330: [50, 960], [51, 960.497], [51, 961], [51, 962], [51, 963] -Path 331: [254.042, 960], [255, 961], [255.621, 962], [256.146, 963], [257, 963] -Path 332: [630, 961], [629, 962], [628, 963], [627, 963], [626, 964], [625, 965], [624, 966], [623, 966] -Path 333: [683, 962], [682, 962], [681.277, 963], [680, 963.249], [679.301, 964], [678.192, 965], [677.105, 966], [676, 966.31], [675.3, 967], [674.25, 968], [673.173, 969], [672.127, 970], [671, 970.261], [670.283, 971], [669.201, 972], [668.141, 973], [667, 973.315], [666.33, 974], [665.259, 975], [664.169, 976], [663.055, 977], [662, 977.068], [661.083, 978], [660, 979], [659, 979.13], [658.149, 980], [657, 981], [656, 981.001], [655.002, 982], [654, 982.207], [653.252, 983], [652.16, 984], [651, 984.432], [650.45, 985], [649.441, 986], [648.443, 987], [647.481, 988], [646.498, 989], [645.432, 990], [645, 991], [644.016, 992], [643, 992.326], [642.321, 993], [641.399, 994], [640.405, 995], [639.436, 996], [638.537, 997], [638, 997.547], [638, 999] -Path 334: [397, 957], [395.591, 957], [394.509, 958], [394, 958.51], [393, 959.441], [392, 960.392], [391, 961.479], [390, 962.496], [389, 963], [388.415, 964], [387.32, 965], [386.248, 966], [385, 966.476], [384.5, 967], [384, 967.441], [383.479, 968], [382.429, 969], [381.334, 970], [380, 971], [379, 971], [378, 972], [377, 973], [376, 973.601], [375, 974.562], [374, 975.487], [373.424, 976], [372, 976.619], [371, 977.6], [370, 978.587], [369, 979.546], [368, 980.479], [367.456, 981], [366.406, 982], [365.377, 983], [364, 983.519], [363, 984.478], [362.479, 985], [361.441, 986], [360.423, 987], [359.473, 988], [358.559, 989], [358, 989.576], [357, 990] -Path 335: [316, 964], [315, 964], [314, 964], [313.583, 965], [313, 965] -Path 336: [205, 965], [204, 965], [203.417, 966], [202.138, 967], [201, 968], [200, 969], [199, 970], [198, 970], [197, 970.404], [196.41, 971], [195, 971.505], [194, 973], [193.303, 974], [193, 975], [193, 976] -Path 337: [272, 966], [272.712, 967], [273.396, 968], [274, 968.496], [274, 969], [274, 970] -Path 338: [51, 965], [51.4704, 966], [52, 967], [52, 968], [52, 969], [52, 970], [52.4132, 971], [53, 971.429], [53.5542, 972], [55, 972], [56, 972.519] -Path 339: [288, 966], [288, 966.596], [289, 967], [289.662, 968], [290.511, 969], [291.36, 970], [292, 970.299], [292.319, 971], [293, 971.445], [293, 972], [293.56, 973], [294.632, 974], [296, 974.543], [297, 975.556], [298, 976.537], [298.629, 978], [299.651, 979], [300.633, 980], [301, 981] -Path 340: [887, 967], [887, 968], [888, 968.436], [888.455, 969], [889, 969] -Path 341: [318, 970], [318.383, 971], [319, 971.546], [320, 972.54], [321, 973], [322, 973], [323, 973.268], [323.354, 974], [324, 974.249], [324, 975] -Path 342: [902, 968], [902.476, 969], [903.431, 970], [904, 971], [905, 971.594], [906, 972.564], [907, 973.531], [908, 974.487], [908.494, 975], [909, 975.476], [909.538, 976], [910.553, 977], [911.563, 978], [912.576, 979], [913.574, 980], [914.579, 981], [915.601, 982], [916.582, 983], [917.551, 984], [918.53, 985], [920, 985.871], [921, 987], [921, 988], [921.055, 989], [922, 990] -Path 343: [865, 969], [865.416, 970], [866.467, 971], [867.48, 972], [868, 973], [868, 973.505], [869, 974] -Path 344: [587, 972], [586.205, 972], [586, 973.037], [585, 974], [584, 975], [583, 975], [582.115, 976], [581, 976.366], [581, 977], [580.464, 978], [579.507, 979], [579, 979.51], [578, 980] -Path 345: [805, 970], [804, 970.457], [803.355, 971], [803, 972.317], [802, 973.296], [801.335, 974], [801, 975], [800, 976], [799, 976], [798, 976], [797.248, 977], [796.233, 978], [795.224, 979], [794, 979.328], [794, 980], [793.109, 981], [792, 981.221], [792, 982], [791, 983], [790, 983], [789, 984], [788, 984], [787, 985], [786.219, 986], [785.189, 987], [784.184, 988], [783, 988.292], [782.382, 989], [781.338, 990], [780.295, 991], [779.226, 992], [778.209, 993], [777, 994], [776, 995] -Path 346: [165, 977], [164, 977], [163.386, 978], [162.426, 979], [161.495, 980], [160.583, 981], [160, 981.608], [159, 982.587], [158, 983.579], [157.344, 985], [156.009, 986], [155, 986] -Path 347: [253, 977], [254, 977.54], [255, 978.611], [256, 979.525], [257, 980], [258, 980.581], [259, 981.396], [259.223, 982], [260, 982] -Path 348: [227, 978], [227, 979], [228, 979.62], [229, 980.633], [229.551, 982], [230.44, 983], [231, 983.337], [231, 984] -Path 349: [527, 977], [526, 978], [525, 979], [524, 979], [524, 980], [524, 981], [524, 982] -Path 350: [683, 979], [682, 979], [681.023, 980], [680, 980.166], [679.22, 981], [678, 982], [677, 982.199], [676.217, 983], [675, 983.397], [674.405, 984], [673.341, 985], [672.219, 986], [671, 986.267], [670.297, 987], [669.203, 988], [668, 988.352], [667.384, 989], [666.391, 990], [666, 991] -Path 351: [243, 976], [242, 976.064], [241, 977], [240, 977.474], [239, 978.415], [237.588, 979], [237, 980], [236, 980.54], [235, 981.478], [234.471, 982], [233.436, 983] -Path 352: [285, 981], [286, 981.432], [286.311, 982], [287, 982] -Path 353: [308, 981], [307, 981], [306, 982], [305, 982], [304, 983], [303, 983.513], [303, 985], [302.672, 986] -Path 354: [312, 980.428], [313, 981], [313.644, 982], [314.563, 983], [315.518, 984], [316.444, 985], [317, 985.563], [317.594, 987], [318.27, 988], [319, 988] -Path 355: [635, 979], [634, 979], [633, 980], [632, 980.143], [631, 981], [630, 981], [629.433, 982], [629, 983], [629, 984], [628.607, 985], [628, 985.185], [628, 986] -Path 356: [868, 981], [867, 982], [866, 982.366], [866, 983], [865, 984], [864, 985], [863, 985.154], [862.184, 986], [861, 986.346], [860.341, 987], [859, 987.56], [858, 988.48], [858, 989], [857.186, 990], [856, 990], [855, 990.617], [854, 991.499], [854, 992], [853.317, 993], [852, 993.32], [852, 994] -Path 357: [141, 982], [141, 983], [142, 983.531], [143, 984], [144, 984] -Path 358: [619, 981], [619, 981.627], [620, 982], [620.562, 982], [621.479, 983], [622, 984], [622.47, 985], [623, 985.464], [623.381, 986], [624, 986], [625, 987] -Path 359: [894, 968], [894, 968.635], [895.43, 969], [896.384, 970], [897, 971.359], [898, 972.479], [899, 973.474], [899.525, 974], [900.465, 975], [901.429, 976], [902, 977.423], [903, 978.476], [904, 979.431], [905, 980.392], [906, 981.401], [907.421, 982], [908.46, 983], [909, 984], [910, 984.421], [910.481, 985], [911, 985.39], [911.519, 986], [912.583, 987], [913.662, 988], [915, 988.619], [916, 989.565], [917, 990.545], [918, 991.609], [919, 992.7], [920, 993.549], [921, 994.482], [921.562, 995], [922.499, 996], [923, 996.383], [923.24, 997], [924, 997] -Path 360: [292, 985], [293, 985], [294, 985.479], [294, 986] -Path 361: [136, 986], [135, 986], [134.676, 987], [134, 987.378], [134, 988] -Path 362: [523, 986], [522, 986], [521, 987], [520, 987.159], [519.202, 988], [518, 988.342], [517.343, 989], [516.327, 990], [515.326, 991], [514.313, 992], [513.238, 993], [512, 993.36], [511.36, 994], [510.292, 995], [509.207, 996], [508, 996.369], [507.38, 997], [506.335, 998], [505.374, 999] -Path 363: [162, 987], [163, 987], [163.56, 988], [164.476, 989], [165, 989.585], [165.496, 991], [166, 991.401], [166.426, 992], [167, 992.358], [167, 993], [167.233, 994], [168, 994.778], [168, 996] -Path 364: [380, 987], [379, 987], [378, 987], [377.598, 988], [377, 988.526], [376, 989] -Path 365: [144, 987], [144, 988], [144, 989], [144, 990], [144.44, 991], [145, 991.301], [145, 992] -Path 366: [434, 988], [433, 988], [432.449, 989], [431.37, 990], [431, 991], [430, 992], [429, 992.006], [428.005, 993], [427, 993.367], [426.379, 994], [425.312, 995], [424.317, 996], [423.858, 997], [423, 997] -Path 367: [39, 989], [39.3222, 990], [40, 990], [41, 991], [42, 991.449], [42.5407, 992], [43.3585, 993], [44, 993.541], [45, 994], [46, 994.595], [47, 995] -Path 368: [273, 988], [273, 989], [273, 990], [273.516, 991], [274.272, 992], [275, 992.418], [275.225, 993], [276, 993.452], [276.241, 994], [277, 994.562], [277.329, 996], [278, 996] -Path 369: [874, 983], [874, 983.589], [875.433, 984], [876.395, 985], [877.474, 986], [878.458, 987], [879.485, 988], [880, 989], [881, 989.537], [882, 990.556], [883, 991.596], [883.592, 993], [884.603, 994], [885.602, 995], [886.592, 996], [887.55, 997], [888.427, 998], [889, 998.419], [889, 999] -Path 370: [121, 990], [120, 990], [119, 991], [118, 991], [117, 992], [116, 992] -Path 371: [615, 981], [614.055, 981], [614, 982.134], [612.614, 983], [611.645, 984], [610.666, 985], [610, 986], [609.6, 987], [609, 988], [609, 989], [609, 990] -Path 372: [324, 991], [323, 991], [322, 991], [321.306, 992], [320.349, 993], [319.499, 994], [319, 995], [319, 996], [319, 997], [319.581, 998], [320, 999] -Path 373: [774, 991], [774.328, 992], [775, 992.158], [775, 993] -Path 374: [267, 992], [266.228, 992], [266, 992.692], [265, 993], [265, 994], [265, 995] -Path 375: [353, 994], [352, 994], [351.338, 995], [350, 995.557], [349, 996.471], [348.604, 997], [348, 997.434], [347.709, 998], [347, 998.456], [347, 999] -Path 376: [447, 993], [447, 993.508], [448, 994], [448.585, 995], [449.631, 996], [451, 996.572], [452, 997.449], [452.484, 998], [453, 998.382], [453, 999] -Path 377: [360.445, 993], [361, 994], [361, 995], [362, 995.559], [363, 996.575], [363.493, 998], [364, 998.399], [364, 999] -Path 378: [849, 995], [848, 995], [847, 996], [846, 997], [846, 998], [846, 999] -Path 379: [36, 996], [37, 996.347], [37.5507, 997], [39, 997] -Path 380: [382, 995], [382, 995.842], [383, 996], [384, 996], [384.621, 997], [385.566, 998], [386, 999] -Path 381: [852, 994], [853, 995], [853, 996], [853.657, 997], [854.515, 998], [855, 999] -Path 382: [195, 991], [194.435, 991], [194, 992.435], [193, 993.387], [192, 994.494], [191.458, 995], [191, 996.312], [190, 997], [189.395, 998], [189, 999] -Path 383: [592, 995], [592, 996], [592, 996.547], [593, 997], [593.475, 998], [594, 998.378], [594, 999] -Path 384: [927, 994], [928, 994], [929, 995], [929, 995.511], [930, 996.432], [931, 997], [932, 997.492], [932.455, 998], [933, 998.466], [933, 999] diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf deleted file mode 100644 index dad747fadfc34595b27fc718e1f0a0833bd0fb0f..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4910095bcc63510b5d14ced32ec054d329fb1f106676869563424bccd6d998bc -size 12597 diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp deleted file mode 100644 index db9524f4ac8c78193c1af6e2767f3ae5901dfba6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a1e3ab5de6caec9d1e335eafe346c673f87ec06c02f0fb3a5ccafeb3919961c8 -size 12084 diff --git a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx b/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx deleted file mode 100644 index 33a059571d78911f9ed73052eb7c74ad7222ad7a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvDSValidatedRoadVectorDataOutput.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0ffb45fdd34b1bb0bbb8817b1de538b4609e806972cf5287d9ec3b7828c86cc2 -size 628 diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf deleted file mode 100644 index fdefcdf3425ca5e4912797aacabf50f7a36609cb..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:1acfd03f31de99605e10020ae2646b81143bd7f816559bc7d962ef2b49216af7 -size 10055 diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp deleted file mode 100644 index b3adb3d3bb2ccb2ae5bfefd4abb19bd64970103a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ff01566163097422211e31b35823cc6ede15efa3965bcc72f2e89f8b95fc2b30 -size 12860 diff --git a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx b/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx deleted file mode 100644 index 8eb95e8e60e8cf4597630573a9dcfa4c795487fc..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/fzTvVectorDataToRoadDescriptionFilterOutput.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b033aa81a9212511ecb13bf36bb9b92d26a2272e8fd2e7106fd938f623084664 -size 668 diff --git a/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt b/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt index 94d2133f6b9804fd92b3caedf977dda8f0e3fb3c..f26c0213ffe4decceafcc5ddef12cfb7804081a4 100644 --- a/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt +++ b/Data/Baseline/OTB/Files/obTvHooverMatrixFilter.txt @@ -1,4 +1,3 @@ -5826 0 0 0 0 -0 1221 0 0 0 -0 0 1560 0 76 -291 0 0 1476 72 +66 0 0 +0 66 0 +0 0 77 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf deleted file mode 100644 index 0f08f3fb2beb363362f44b8b9dd9ff44202c288d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7b569ccdf07c81702a2d9b9d2de6fb196f3ac8d3a28cac40b77b520b786cba61 -size 77 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp deleted file mode 100644 index 9b56f40fa4796185ee13dad6841807407a6d48d3..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2ea4e04a7d38ecc8754828204aab67cdf51fd69054da7c1ed8c3257ce1764ece -size 284 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx deleted file mode 100644 index 2a1f95e40a1cf6322eacb52ab4c796a7ffba7b35..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.1.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e4c1b4db2157ab84d77eaf714555cca7915b573fbe5e691e6ab2ce4f7e2defc -size 108 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf index 0f08f3fb2beb363362f44b8b9dd9ff44202c288d..631e7c82cb3ff2f983790645329a5d14cfe82596 100644 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf +++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.dbf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7b569ccdf07c81702a2d9b9d2de6fb196f3ac8d3a28cac40b77b520b786cba61 -size 77 +oid sha256:2dcf4153202960ac9e3d92293108c2ffa5ebb4c258695f366e3e49cf078f2808 +size 102 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp index c6b34a49304ff32b6d7bb2314522a7fece34d6b5..73c5eea2ce3b904768567f18fa0b0ce0672eafcb 100644 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp +++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shp @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:42c325b877fb5db5b15ee30e5c691a4500370bda6bf851ec33cb868f0b8f73fe -size 364 +oid sha256:a5b0b418ddcc3967ac3dc0c263799abcc2173f6755c984583bdae05e2f94e1c0 +size 828 diff --git a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx index ccd3962d47d6794f8b06ea86131e5853270d7df6..ed61a0c43a797502a4a2638de7b027a34f646c09 100644 --- a/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx +++ b/Data/Baseline/OTB/Files/obTvLabelMapToVectorDataFilter.shx @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7eb939ef1b4d627696c5ddb141d2364794e5fd7f85f56a31bacc97d161b4f692 -size 108 +oid sha256:5f275e86fab9c7dbd9aade5a425fb227d909b1b3ecc81b139f7ce01ffb5c2f91 +size 124 diff --git a/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt b/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt deleted file mode 100644 index 443a0f86e801040b656531a5d6964a27e7964204..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srRCC8CalculatorOutput.txt +++ /dev/null @@ -1,5 +0,0 @@ -Test results from otbImageToImageRCC8calculator test. -7 1 0 0 -1 7 4 6 -0 3 7 2 -0 5 2 7 diff --git a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot b/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot deleted file mode 100644 index 79ae6d70ff30eba499eaf025da67cc89073e07f1..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput.dot +++ /dev/null @@ -1,19 +0,0 @@ -digraph G { -0 [NumberOfPointsInPath="112",P0x="55.5",P0y="123.5",P100x="31.5",P100y="141",P101x="31.5",P101y="139.5",P102x="41.5",P102y="129.5",P103x="43",P103y="129.5",P104x="44.5",P104y="127.5",P105x="46",P105y="127.5",P106x="46.5",P106y="126.5",P107x="49",P107y="126.5",P108x="49.5",P108y="125.5",P109x="51",P109y="125.5",P10x="80",P10y="129.5",P110x="51.5",P110y="124.5",P111x="55",P111y="124.5",P11x="81.5",P11y="129.5",P12x="91.5",P12y="139.5",P13x="91.5",P13y="141",P14x="93.5",P14y="142.5",P15x="93.5",P15y="144",P16x="94.5",P16y="144.5",P17x="94.5",P17y="146",P18x="95.5",P18y="146.5",P19x="95.5",P19y="148",P1x="67.5",P1y="123.5",P20x="96.5",P20y="148.5",P21x="96.5",P21y="151",P22x="97.5",P22y="151.5",P23x="97.5",P23y="154",P24x="98.5",P24y="154.5",P25x="98.5",P25y="157",P26x="99.5",P26y="157.5",P27x="99.5",P27y="163",P28x="100.5",P28y="163.5",P29x="100.5",P29y="178.5",P2x="68",P2y="124.5",P30x="99.5",P30y="179",P31x="99.5",P31y="184.5",P32x="98.5",P32y="185",P33x="98.5",P33y="187.5",P34x="97.5",P34y="188",P35x="97.5",P35y="190.5",P36x="96.5",P36y="191",P37x="96.5",P37y="193.5",P38x="95.5",P38y="194",P39x="95.5",P39y="195.5",P3x="71.5",P3y="124.5",P40x="94.5",P40y="196",P41x="94.5",P41y="197.5",P42x="93.5",P42y="198",P43x="93.5",P43y="199.5",P44x="91.5",P44y="201",P45x="91.5",P45y="202.5",P46x="81.5",P46y="212.5",P47x="80",P47y="212.5",P48x="78.5",P48y="214.5",P49x="77",P49y="214.5",P4x="72",P4y="125.5",P50x="76.5",P50y="215.5",P51x="74",P51y="215.5",P52x="73.5",P52y="216.5",P53x="72",P53y="216.5",P54x="71.5",P54y="217.5",P55x="68",P55y="217.5",P56x="67.5",P56y="218.5",P57x="55.5",P57y="218.5",P58x="55",P58y="217.5",P59x="51.5",P59y="217.5",P5x="73.5",P5y="125.5",P60x="51",P60y="216.5",P61x="49.5",P61y="216.5",P62x="49",P62y="215.5",P63x="46.5",P63y="215.5",P64x="46",P64y="214.5",P65x="44.5",P65y="214.5",P66x="43",P66y="212.5",P67x="41.5",P67y="212.5",P68x="31.5",P68y="202.5",P69x="31.5",P69y="201",P6x="74",P6y="126.5",P70x="29.5",P70y="199.5",P71x="29.5",P71y="198",P72x="28.5",P72y="197.5",P73x="28.5",P73y="196",P74x="27.5",P74y="195.5",P75x="27.5",P75y="194",P76x="26.5",P76y="193.5",P77x="26.5",P77y="191",P78x="25.5",P78y="190.5",P79x="25.5",P79y="188",P7x="76.5",P7y="126.5",P80x="24.5",P80y="187.5",P81x="24.5",P81y="185",P82x="23.5",P82y="184.5",P83x="23.5",P83y="179",P84x="22.5",P84y="178.5",P85x="22.5",P85y="163.5",P86x="23.5",P86y="163",P87x="23.5",P87y="157.5",P88x="24.5",P88y="157",P89x="24.5",P89y="154.5",P8x="77",P8y="127.5",P90x="25.5",P90y="154",P91x="25.5",P91y="151.5",P92x="26.5",P92y="151",P93x="26.5",P93y="148.5",P94x="27.5",P94y="148",P95x="27.5",P95y="146.5",P96x="28.5",P96y="146",P97x="28.5",P97y="144.5",P98x="29.5",P98y="144",P99x="29.5",P99y="142.5",P9x="78.5",P9y="127.5",SegmentationLevel="0",SegmentationType="0"]; -1 [NumberOfPointsInPath="5",P0x="187.5",P0y="31.5",P1x="221.5",P1y="31.5",P2x="221.5",P2y="202.5",P3x="187.5",P3y="202.5",P4x="187.5",P4y="33",SegmentationLevel="0",SegmentationType="0"]; -2 [NumberOfPointsInPath="120",P0x="134.5",P0y="38.5",P100x="122.5",P100y="69",P101x="122.5",P101y="64.5",P102x="123.5",P102y="64",P103x="123.5",P103y="60.5",P104x="124.5",P104y="60",P105x="124.5",P105y="56.5",P106x="125.5",P106y="56",P107x="125.5",P107y="52.5",P108x="126.5",P108y="52",P109x="126.5",P109y="49.5",P10x="144.5",P10y="47.5",P110x="127.5",P110y="49",P111x="127.5",P111y="47.5",P112x="128.5",P112y="47",P113x="128.5",P113y="45.5",P114x="129.5",P114y="45",P115x="129.5",P115y="43.5",P116x="130.5",P116y="43",P117x="130.5",P117y="41.5",P118x="132.5",P118y="39.5",P119x="134",P119y="39.5",P11x="144.5",P11y="49",P12x="145.5",P12y="49.5",P13x="145.5",P13y="52",P14x="146.5",P14y="52.5",P15x="146.5",P15y="56",P16x="147.5",P16y="56.5",P17x="147.5",P17y="60",P18x="148.5",P18y="60.5",P19x="148.5",P19y="64",P1x="137.5",P1y="38.5",P20x="149.5",P20y="64.5",P21x="149.5",P21y="69",P22x="150.5",P22y="69.5",P23x="150.5",P23y="75",P24x="151.5",P24y="75.5",P25x="151.5",P25y="83",P26x="152.5",P26y="83.5",P27x="152.5",P27y="92",P28x="153.5",P28y="92.5",P29x="153.5",P29y="107",P2x="138",P2y="39.5",P30x="154.5",P30y="107.5",P31x="154.5",P31y="149.5",P32x="153.5",P32y="150",P33x="153.5",P33y="164.5",P34x="152.5",P34y="165",P35x="152.5",P35y="173.5",P36x="151.5",P36y="174",P37x="151.5",P37y="181.5",P38x="150.5",P38y="182",P39x="150.5",P39y="187.5",P3x="139.5",P3y="39.5",P40x="149.5",P40y="188",P41x="149.5",P41y="192.5",P42x="148.5",P42y="193",P43x="148.5",P43y="196.5",P44x="147.5",P44y="197",P45x="147.5",P45y="200.5",P46x="146.5",P46y="201",P47x="146.5",P47y="204.5",P48x="145.5",P48y="205",P49x="145.5",P49y="207.5",P4x="141.5",P4y="41.5",P50x="144.5",P50y="208",P51x="144.5",P51y="209.5",P52x="143.5",P52y="210",P53x="143.5",P53y="211.5",P54x="142.5",P54y="212",P55x="142.5",P55y="213.5",P56x="141.5",P56y="214",P57x="141.5",P57y="215.5",P58x="139.5",P58y="217.5",P59x="138",P59y="217.5",P5x="141.5",P5y="43",P60x="137.5",P60y="218.5",P61x="134.5",P61y="218.5",P62x="134",P62y="217.5",P63x="132.5",P63y="217.5",P64x="130.5",P64y="215.5",P65x="130.5",P65y="214",P66x="129.5",P66y="213.5",P67x="129.5",P67y="212",P68x="128.5",P68y="211.5",P69x="128.5",P69y="210",P6x="142.5",P6y="43.5",P70x="127.5",P70y="209.5",P71x="127.5",P71y="208",P72x="126.5",P72y="207.5",P73x="126.5",P73y="205",P74x="125.5",P74y="204.5",P75x="125.5",P75y="201",P76x="124.5",P76y="200.5",P77x="124.5",P77y="197",P78x="123.5",P78y="196.5",P79x="123.5",P79y="193",P7x="142.5",P7y="45",P80x="122.5",P80y="192.5",P81x="122.5",P81y="188",P82x="121.5",P82y="187.5",P83x="121.5",P83y="182",P84x="120.5",P84y="181.5",P85x="120.5",P85y="174",P86x="119.5",P86y="173.5",P87x="119.5",P87y="165",P88x="118.5",P88y="164.5",P89x="118.5",P89y="150",P8x="143.5",P8y="45.5",P90x="117.5",P90y="149.5",P91x="117.5",P91y="107.5",P92x="118.5",P92y="107",P93x="118.5",P93y="92.5",P94x="119.5",P94y="92",P95x="119.5",P95y="83.5",P96x="120.5",P96y="83",P97x="120.5",P97y="75.5",P98x="121.5",P98y="75",P99x="121.5",P99y="69.5",P9x="143.5",P9y="47",SegmentationLevel="0",SegmentationType="0"]; -3 [NumberOfPointsInPath="5",P0x="19.5",P0y="30.5",P1x="84.5",P1y="30.5",P2x="84.5",P2y="94.5",P3x="19.5",P3y="94.5",P4x="19.5",P4y="32",SegmentationLevel="0",SegmentationType="0"]; -4 [NumberOfPointsInPath="164",P0x="53.5",P0y="85.5",P100x="25.5",P100y="202.5",P101x="25.5",P101y="201",P102x="24.5",P102y="200.5",P103x="24.5",P103y="199",P104x="23.5",P104y="198.5",P105x="23.5",P105y="197",P106x="22.5",P106y="196.5",P107x="22.5",P107y="195",P108x="21.5",P108y="194.5",P109x="21.5",P109y="192",P10x="85",P10y="96.5",P110x="21",P110y="191.5",P111x="19.5",P111y="191.5",P112x="19.5",P112y="189",P113x="18.5",P113y="188.5",P114x="18.5",P114y="186",P115x="17.5",P115y="185.5",P116x="17.5",P116y="183",P117x="16.5",P117y="182.5",P118x="16.5",P118y="179",P119x="15.5",P119y="178.5",P11x="86.5",P11y="96.5",P120x="15.5",P120y="173",P121x="14.5",P121y="172.5",P122x="14.5",P122y="166",P123x="13.5",P123y="165.5",P124x="13.5",P124y="142.5",P125x="14.5",P125y="142",P126x="14.5",P126y="135.5",P127x="15.5",P127y="135",P128x="15.5",P128y="129.5",P129x="16.5",P129y="129",P12x="89.5",P12y="99.5",P130x="16.5",P130y="125.5",P131x="17.5",P131y="125",P132x="17.5",P132y="122.5",P133x="18.5",P133y="122",P134x="18.5",P134y="119.5",P135x="19.5",P135y="119",P136x="19.5",P136y="116.5",P137x="21",P137y="116.5",P138x="21.5",P138y="115",P139x="21.5",P139y="113.5",P13x="89.5",P13y="101",P140x="22.5",P140y="113",P141x="22.5",P141y="111.5",P142x="23.5",P142y="111",P143x="23.5",P143y="109.5",P144x="24.5",P144y="109",P145x="24.5",P145y="107.5",P146x="25.5",P146y="107",P147x="25.5",P147y="105.5",P148x="26.5",P148y="104.5",P149x="28",P149y="104.5",P14x="91.5",P14y="102.5",P150x="28.5",P150y="104",P151x="28.5",P151y="102.5",P152x="30.5",P152y="101",P153x="30.5",P153y="99.5",P154x="33.5",P154y="96.5",P155x="35",P155y="96.5",P156x="40.5",P156y="90.5",P157x="43",P157y="90.5",P158x="44.5",P158y="88.5",P159x="46",P159y="88.5",P15x="91.5",P15y="104",P160x="46.5",P160y="87.5",P161x="50",P161y="87.5",P162x="50.5",P162y="86.5",P163x="53",P163y="86.5",P16x="92",P16y="104.5",P17x="93.5",P17y="104.5",P18x="94.5",P18y="105.5",P19x="94.5",P19y="107",P1x="66.5",P1y="85.5",P20x="95.5",P20y="107.5",P21x="95.5",P21y="109",P22x="96.5",P22y="109.5",P23x="96.5",P23y="111",P24x="97.5",P24y="111.5",P25x="97.5",P25y="113",P26x="98.5",P26y="113.5",P27x="98.5",P27y="116",P28x="99",P28y="116.5",P29x="100.5",P29y="116.5",P2x="67",P2y="86.5",P30x="100.5",P30y="119",P31x="101.5",P31y="119.5",P32x="101.5",P32y="122",P33x="102.5",P33y="122.5",P34x="102.5",P34y="125",P35x="103.5",P35y="125.5",P36x="103.5",P36y="129",P37x="104.5",P37y="129.5",P38x="104.5",P38y="135",P39x="105.5",P39y="135.5",P3x="69.5",P3y="86.5",P40x="105.5",P40y="142",P41x="106.5",P41y="142.5",P42x="106.5",P42y="165.5",P43x="105.5",P43y="166",P44x="105.5",P44y="172.5",P45x="104.5",P45y="173",P46x="104.5",P46y="178.5",P47x="103.5",P47y="179",P48x="103.5",P48y="182.5",P49x="102.5",P49y="183",P4x="70",P4y="87.5",P50x="102.5",P50y="185.5",P51x="101.5",P51y="186",P52x="101.5",P52y="188.5",P53x="100.5",P53y="189",P54x="100.5",P54y="191.5",P55x="99",P55y="191.5",P56x="98.5",P56y="193",P57x="98.5",P57y="194.5",P58x="97.5",P58y="195",P59x="97.5",P59y="196.5",P5x="73.5",P5y="87.5",P60x="96.5",P60y="197",P61x="96.5",P61y="198.5",P62x="95.5",P62y="199",P63x="95.5",P63y="200.5",P64x="94.5",P64y="201",P65x="94.5",P65y="202.5",P66x="93.5",P66y="203.5",P67x="92",P67y="203.5",P68x="91.5",P68y="204",P69x="91.5",P69y="205.5",P6x="74",P6y="88.5",P70x="89.5",P70y="207",P71x="89.5",P71y="208.5",P72x="86.5",P72y="211.5",P73x="85",P73y="211.5",P74x="79.5",P74y="217.5",P75x="77",P75y="217.5",P76x="75.5",P76y="219.5",P77x="74",P77y="219.5",P78x="73.5",P78y="220.5",P79x="70",P79y="220.5",P7x="75.5",P7y="88.5",P80x="69.5",P80y="221.5",P81x="67",P81y="221.5",P82x="66.5",P82y="222.5",P83x="53.5",P83y="222.5",P84x="53",P84y="221.5",P85x="50.5",P85y="221.5",P86x="50",P86y="220.5",P87x="46.5",P87y="220.5",P88x="46",P88y="219.5",P89x="44.5",P89y="219.5",P8x="77",P8y="90.5",P90x="43",P90y="217.5",P91x="40.5",P91y="217.5",P92x="35",P92y="211.5",P93x="33.5",P93y="211.5",P94x="30.5",P94y="208.5",P95x="30.5",P95y="207",P96x="28.5",P96y="205.5",P97x="28.5",P97y="204",P98x="28",P98y="203.5",P99x="26.5",P99y="203.5",P9x="79.5",P9y="90.5",SegmentationLevel="0",SegmentationType="1"]; -5 [NumberOfPointsInPath="5",P0x="154.5",P0y="106.5",P1x="220.5",P1y="106.5",P2x="220.5",P2y="143.5",P3x="154.5",P3y="143.5",P4x="154.5",P4y="108",SegmentationLevel="0",SegmentationType="1"]; -6 [NumberOfPointsInPath="46",P0x="138",P0y="55.5",P10x="143.5",P10y="102",P11x="144.5",P11y="102.5",P12x="144.5",P12y="160.5",P13x="143.5",P13y="161",P14x="143.5",P14y="180.5",P15x="142.5",P15y="181",P16x="142.5",P16y="191.5",P17x="141.5",P17y="192",P18x="141.5",P18y="198.5",P19x="140.5",P19y="199",P1x="139.5",P1y="56.5",P20x="140.5",P20y="203.5",P21x="139.5",P21y="204",P22x="139.5",P22y="206.5",P23x="138",P23y="207.5",P24x="136.5",P24y="206.5",P25x="136.5",P25y="204",P26x="135.5",P26y="203.5",P27x="135.5",P27y="199",P28x="134.5",P28y="198.5",P29x="134.5",P29y="192",P2x="139.5",P2y="59",P30x="133.5",P30y="191.5",P31x="133.5",P31y="181",P32x="132.5",P32y="180.5",P33x="132.5",P33y="161",P34x="131.5",P34y="160.5",P35x="131.5",P35y="102.5",P36x="132.5",P36y="102",P37x="132.5",P37y="82.5",P38x="133.5",P38y="82",P39x="133.5",P39y="71.5",P3x="140.5",P3y="59.5",P40x="134.5",P40y="71",P41x="134.5",P41y="64.5",P42x="135.5",P42y="64",P43x="135.5",P43y="59.5",P44x="136.5",P44y="59",P45x="136.5",P45y="56.5",P4x="140.5",P4y="64",P5x="141.5",P5y="64.5",P6x="141.5",P6y="71",P7x="142.5",P7y="71.5",P8x="142.5",P8y="82",P9x="143.5",P9y="82.5",SegmentationLevel="0",SegmentationType="1"]; -7 [NumberOfPointsInPath="5",P0x="19.5",P0y="31.5",P1x="55.5",P1y="31.5",P2x="55.5",P2y="72.5",P3x="19.5",P3y="72.5",P4x="19.5",P4y="33",SegmentationLevel="0",SegmentationType="1"]; -8 [NumberOfPointsInPath="5",P0x="75.5",P0y="41.5",P1x="138.5",P1y="41.5",P2x="138.5",P2y="49.5",P3x="75.5",P3y="49.5",P4x="75.5",P4y="43",SegmentationLevel="0",SegmentationType="1"]; -0 -> 4 [Value="5"]; -1 -> 5 [Value="2"]; -2 -> 5 [Value="2"]; -2 -> 6 [Value="6"]; -2 -> 8 [Value="2"]; -3 -> 4 [Value="2"]; -3 -> 7 [Value="4"]; -3 -> 8 [Value="2"]; -} diff --git a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot b/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot deleted file mode 100644 index 468c69f20b4ca03e3aefe782287282e9d48fddb6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srRCC8GraphFilterOutput2.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph G { -0 [NumberOfPointsInPath="5",P0x="82.5",P0y="76.5",P1x="175.5",P1y="76.5",P2x="175.5",P2y="168.5",P3x="82.5",P3y="168.5",P4x="82.5",P4y="78",SegmentationLevel="0",SegmentationType="0"]; -1 [NumberOfPointsInPath="5",P0x="82.5",P0y="102.5",P1x="175.5",P1y="102.5",P2x="175.5",P2y="149.5",P3x="82.5",P3y="149.5",P4x="82.5",P4y="104",SegmentationLevel="0",SegmentationType="1"]; -2 [NumberOfPointsInPath="5",P0x="49.5",P0y="41.5",P1x="117.5",P1y="41.5",P2x="117.5",P2y="119.5",P3x="49.5",P3y="119.5",P4x="49.5",P4y="43",SegmentationLevel="1",SegmentationType="0"]; -3 [NumberOfPointsInPath="5",P0x="27.5",P0y="141.5",P1x="59.5",P1y="141.5",P2x="59.5",P2y="214.5",P3x="27.5",P3y="214.5",P4x="27.5",P4y="143",SegmentationLevel="1",SegmentationType="0"]; -4 [NumberOfPointsInPath="5",P0x="138.5",P0y="13.5",P1x="167.5",P1y="13.5",P2x="167.5",P2y="76.5",P3x="138.5",P3y="76.5",P4x="138.5",P4y="15",SegmentationLevel="1",SegmentationType="0"]; -0 -> 1 [Value="4"]; -0 -> 2 [Value="2"]; -0 -> 4 [Value="1"]; -1 -> 2 [Value="2"]; -} diff --git a/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot b/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot deleted file mode 100644 index bc065f3b862aa01c09a55a3a9e1d735e17855cbb..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srRCC8GraphWriterOutput1.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph G { -0 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="0",SegmentationType="0"]; -1 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="1",SegmentationType="1"]; -2 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="2",SegmentationType="0"]; -3 [NumberOfPointsInPath="3",P0x="0",P0y="0",P1x="10",P1y="10",P2x="-5",P2y="2",SegmentationLevel="3",SegmentationType="0"]; -0 -> 1 [Value="1"]; -1 -> 2 [Value="2"]; -2 -> 3 [Value="3"]; -0 -> 2 [Value="4"]; -1 -> 3 [Value="5"]; -0 -> 3 [Value="6"]; -} diff --git a/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt b/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt deleted file mode 100644 index 0e6c0a5a795100d17da92b4cf77dda3573b80968..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srRCC8PolygonToPolygonCalculatorOutput.txt +++ /dev/null @@ -1,5 +0,0 @@ -Test results from otbPolygonToPolygonRCC8calculator test. -7 1 0 0 -1 7 4 6 -0 3 7 2 -0 5 2 7 diff --git a/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot b/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot deleted file mode 100644 index b0ea91f66e5ded3e702027f8870e10d13d8a6224..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Files/srTvPolygonListToRCC8GraphFilterOutput.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph G { -0 [NumberOfPointsInPath="4",P0x="0",P0y="0",P1x="2",P1y="0",P2x="2",P2y="6",P3x="0",P3y="6",SegmentationLevel="0",SegmentationType="1"]; -1 [NumberOfPointsInPath="4",P0x="1",P0y="1",P1x="4",P1y="1",P2x="4",P2y="5",P3x="1",P3y="5",SegmentationLevel="0",SegmentationType="1"]; -2 [NumberOfPointsInPath="4",P0x="3",P0y="1",P1x="4",P1y="1",P2x="4",P2y="2",P3x="3",P3y="2",SegmentationLevel="1",SegmentationType="1"]; -3 [NumberOfPointsInPath="4",P0x="5",P0y="1",P1x="8",P1y="1",P2x="8",P2y="5",P3x="5",P3y="5",SegmentationLevel="1",SegmentationType="1"]; -4 [NumberOfPointsInPath="4",P0x="6",P0y="2",P1x="7",P1y="2",P2x="7",P2y="3",P3x="6",P3y="3",SegmentationLevel="2",SegmentationType="1"]; -5 [NumberOfPointsInPath="4",P0x="8",P0y="1",P1x="9",P1y="1",P2x="9",P2y="5",P3x="8",P3y="5",SegmentationLevel="2",SegmentationType="1"]; -0 -> 1 [Value="2"]; -2 -> 1 [Value="3"]; -3 -> 5 [Value="2"]; -4 -> 3 [Value="5"]; -} diff --git a/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif deleted file mode 100644 index 69c0b928afa3361c7e154c1a820e3715580af9e6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/dmTvBSplinesInterpolateDeformationField.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:9447965707e53fa16f1eaa4d8e198c79c67f58992fb0f3417e45e09197629b93 -size 193942 diff --git a/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif deleted file mode 100644 index a823334750cd9f6c86d683f100662864eaee9994..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/dmTvNNearestPointsLinearInterpolateDeformationField.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7e3e1fb0f6625e1a63a93cf472797f5793af362e6ac5a455d202c607725ecfec -size 198042 diff --git a/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif deleted file mode 100644 index b59a569283720ffabb00256a5eebf9111a0a9993..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/dmTvNNearestTransformsLinearInterpolateDeformationField.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3e86de8b62d0d9b3bf0098efca75a7cbb6dd30f61bd6bb331bbe21189b54ab35 -size 199687 diff --git a/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif deleted file mode 100644 index d098656a6f6e6605f71c8b21aa182c8d8f1b194a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/dmTvNearestPointDeformationField.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:35adef700d011fb7793a3751c5565eea206a03b7c73265cf693763cf3a02c198 -size 14780 diff --git a/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif b/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif deleted file mode 100644 index 7cb2622d35b0188d4c2c458bf20005c41088871b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/dmTvNearestTransformDeformationField.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f7f8af0c00a846d0027df0688fc82c10dd6832b08d16aa86068d66d11f4a2485 -size 192056 diff --git a/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png b/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png deleted file mode 100644 index fa2ce49bc9aee59ff1db19390cfaa907b9e5f51d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feDrawPathAlignDeuxTraits.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:2c57a5038aa07298c3b42be3d1d47dd84136a4d7f210a08dbe5b223b266814f0 -size 568 diff --git a/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif b/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif new file mode 100644 index 0000000000000000000000000000000000000000..fb2de39373f31b7c8967de82fd695a972d0c84dc --- /dev/null +++ b/Data/Baseline/OTB/Images/feImageToEdgePathFilterOutput.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c006246fea917e0870d9fcbac03c8ee7f80e65d3faffd1e76b731192dbef5978 +size 546 diff --git a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif deleted file mode 100644 index a5401aba3a1c7561fd18356e9c8d813acc6606ff..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductDirectionOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4b67d658cebed1a8dcfb9fa45be201a00cdfe874321dc4c63cbcca540ec6c6f3 -size 741552 diff --git a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif b/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif deleted file mode 100644 index f3d6fec2decdd35ffc57ee088b85dd2a209c5c1a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvNeighborhoodScalarProductModulusOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ca321fd53b489787e40bc9bf9dd49140d95d43fff73ae3501b25ceb75e529a23 -size 3023067 diff --git a/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif deleted file mode 100644 index a0a6e6047bac5bfada96ec5afc74e21dacb99468..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvNonMaxRemovalByDirectionOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57aae675e46c74467b7d34cc2fe660e4944e096db81115663960627e7e775ed4 -size 1018004 diff --git a/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif b/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif deleted file mode 100644 index 7fe52fc0aeb9a86db404f1cefae1145da8292072..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvOutputRoadDetection.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0495a68b9e656915b10d5ff2c41c9f15fc46f1069a1e9dc429a153139b2607d -size 196662 diff --git a/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif deleted file mode 100644 index a7d309ac66e53468919f03954933fa9f93a23301..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvRemoveIsolatedByDirectionOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e56e9cadb996fea0621e258155d2414f12899652c33dbc04a69c884923981f72 -size 2166447 diff --git a/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif b/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif deleted file mode 100644 index 15afc03958f1d221c020052230ffe5cea2e202a3..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvRemoveWrongDirectionOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6cda584546d11c80f5c32dbe32f843d178a182c47062de7d7e3dcb6931bf5304 -size 1360300 diff --git a/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png b/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png deleted file mode 100644 index 542e264b833a1f712018a454168f529f40eae386..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/feTvVectorizationPathListOutput.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:5c1fabb13b4184517fc6929de7f5ec9f41a7c59d6bd9f07208587dd19cb9855b -size 23840 diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png deleted file mode 100644 index f42b4baef16bcda041abf7b6d93eae69bbd0a817..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_an_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c689b2d88a728f26e8464920bd0b8858621dcfec203a612e4cd8763b62d7c83c -size 164 diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png deleted file mode 100644 index 02e9380066f73621e2908c406d1a32e78646d83b..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_id_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eb8b759bff6ee7b8972ee09f87094106334dbb84f4b41434ec6cf18ec1821129 -size 296 diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png deleted file mode 100644 index 3c40551414a347fbe12e6fac0b7da1164fbd1b1e..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_if_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b985a05924d453325761a1d99e3bb0c64ac61a6359533035d6368f4d0c2e0ef6 -size 110 diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png deleted file mode 100644 index 06af199a6bbee53c445ff1a24903f356ee1f6530..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sd_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:94647a3bd9b8617e0686c2ad9d7541b6a23d00f3c38cd162eb9c96ec7c077f03 -size 280 diff --git a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png b/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png deleted file mode 100644 index 7d6ab132cb03f3a2b3fa5690b856000cfde1cc38..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrAn_mire_log_sf_2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:b5273aadaeb17d41f4fa8a3b6c006879f36d1a913aa84146a2004122757feec7 -size 133 diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif deleted file mode 100644 index df49966b316319dac9e2c6cb94f2d3c2199c427d..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_an_full.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4acd9feb652abe765b4f93b6b08a59bde3111d1eae18e298848b04983d24e112 -size 2433975 diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif deleted file mode 100644 index d373dfb668ec13cc83aa631849fd78a2fcdc4bf6..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_if_full.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0bfbe517069a01fcd757ede835ffe3df3602f95921e8793acb49947f86e022fe -size 2084698 diff --git a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif b/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif deleted file mode 100644 index 791be26fb902300057b5f5a85da06922d58cfd96..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:7086793fa9d0d553e115fd3e92cb5455b2dbca6f01352aabbf7312e02e33ffa2 -size 1409779 diff --git a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif b/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif deleted file mode 100644 index 070eb61973a513c4b68733c4c68de91ab9be3d28..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_256_2.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:eeaf4e2e3a704677c6fbc00550aa21a79f7b40126f677247abd652e39c967ff4 -size 162988 diff --git a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif b/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif deleted file mode 100644 index 876e6de02b97af902286a224e141d34db2b9203a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrResampler_IKO_LesHalles_full.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3fad9049c90e30e939018725efe1bdf8d0e35302d50ae891812acbb3fdea013a -size 829512 diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif deleted file mode 100644 index 457056589f50a72e5d6341ee2f06751493459701..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_2.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:24efbd3ab2d54b9066d15145402583db895d8c6747795c83db07b965669748bd -size 30896 diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif deleted file mode 100644 index 12bb4bd12f5a53be3e9416d09e8bd241f8c50450..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_4.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:fc44580b13963e8db80966f7251b8ef77b1fcb967c0a192354959ca7b18df2b3 -size 22111 diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif deleted file mode 100644 index a65b7a1e6d77aaed7b5f014b3a53ee35438feee4..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_5.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e1b31996ceec7f89920c029f0ccdb5adca0172d9850e4b0f37fc3ca48b471bd8 -size 21878 diff --git a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif b/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif deleted file mode 100644 index e12083be6785bcd46158ab0550b2172654b94de2..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmentation_IKO_Halles_7.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:47d986a0f28e59fa8586db478791df92c6d93816d392bfbf331054e771b25930 -size 24465 diff --git a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif b/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif deleted file mode 100644 index d6121605a13f36f9874bdfc6d067078ebb4d598a..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_if.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:6abc1377ee09e3181c6600bece9ed11374f3c50dff1d98460e3f2adc273ecaca -size 20179 diff --git a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif b/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif deleted file mode 100644 index e9f7589afcc41153e338f2885f8e6e05b49b1001..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/msPyrSegmenter_IKO_Halles_4_2_sf.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ba1c0155d39d3272d956c839f8f4e179dbef23ebee5499c0886a0cdb2bdeb05b -size 22191 diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif index 9662d6048e1b5bc4eef3ad7c00b24ecfb24db433..3b1b11efef094cc93a80d22849d312da21c7c4f9 100644 --- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif +++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMGTIFF.tif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:604ab2a554cb7f8b8bd2f793da761b944ea1585b267b19063d64fbdd8fe9bd75 -size 2471604 +oid sha256:39a2dd6ff12fd1ad13ce5c3014dac39b546aceb5e5d1fbb8a4bb7e58d06fcbeb +size 2002472 diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif index 0c871089a6f291752cdfe701b38f59c8b8eb9db3..419e04824bcdb961f1fcc0e54fc1c5ecca21d05f 100644 --- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif +++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_DEMSRTM.tif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d0bf90e6e04a89d3876af4272815b3a47dd3cd2805ed3bdb6900a68ec3fb83a3 -size 2470925 +oid sha256:d684f0d16382f9a7402373b4e17dbc74c8d38b2e2a5ef0c95560374f4ae23a3f +size 2002472 diff --git a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif index 22b97cb747f2ea635594d2d3fe1d3c99a82ad5b6..6a12b74e395f7e78dc669c19ea3463408fb01ebd 100644 --- a/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif +++ b/Data/Baseline/OTB/Images/prTvOrthoRectification_sentinel1_noDEM.tif @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bfcce43b020c8838f1b710dd62cff8781dff095e88e056edf2df8863dc0ae3af -size 2471252 +oid sha256:1b8c6e80b58829d09ec7ad2b7cca3104c0fd1676a203361bda5493f0060d8fee +size 2002472 diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif deleted file mode 100644 index 1582d4104bd26e22608c9c337ae659b4992a60c3..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutput.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e6946443c79f0ee5e07b3c653958ce13e5d97e87cc9958cb13051c9d3d07e416 -size 9378087 diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif deleted file mode 100644 index 5b30246782bd321aeab3a79046db7e63a7a187b1..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_GEOEYE.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8fb50d087c6620f8836274927849326dc2fb77a592ca64a2a3f116236248fd03 -size 59434 diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif deleted file mode 100644 index ca2897289d6507bcd3adf32e79d1fe62e0dddd5f..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_QUICKBIRD.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:89fb4f4c776f753b71e48c74b4c46231a03ae57451ccfc87903b0b0cb4b7ad7c -size 41907 diff --git a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif b/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif deleted file mode 100644 index 68f813382bae7b22465d7e4850f2a47bd7796caa..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/prTvotbGenericRSResampleImageFilterOutputFromMap_WORLDVIEW2.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cad5f798ddae790efa1d14ff57f7d0c25d5fd89f125961c0ba68c3923568ba05 -size 2656332 diff --git a/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png b/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png deleted file mode 100644 index b4535ce33f3c4a19b9b297fe4c76acb870fdd5da..0000000000000000000000000000000000000000 --- a/Data/Baseline/OTB/Images/raTvUrbanAreaDetection.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d34b5be5393bbb04b1fa634fa175f2bf0eb7e5928abe4768fd08dfa7d72323f9 -size 2057 diff --git a/Data/Input/Classification/KMeansInputCentroids.txt b/Data/Input/Classification/KMeansInputCentroids.txt new file mode 100644 index 0000000000000000000000000000000000000000..d7302a51166ea6468ac049ad970582370605c10a --- /dev/null +++ b/Data/Input/Classification/KMeansInputCentroids.txt @@ -0,0 +1,5 @@ +148.1360412249 176.9065574064 79.2367424483 275.6865470422 +180.3646315623 255.4157568188 138.2565634726 656.5357728603 +187.5074713392 256.7055784897 121.8671939978 115.8660938389 +220.0887858502 326.8933399989 229.672560688 434.3589597278 +515.191687488 834.8626368509 642.6102022528 814.8945435557 diff --git a/Data/Input/Dempster-Shafer/DSFuzzyModel.xml b/Data/Input/Dempster-Shafer/DSFuzzyModel.xml deleted file mode 100644 index 034442d66e8ad214fadb3037553ab092b9be323b..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/DSFuzzyModel.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" ?> -<FuzzydDescriptorsModel> - <Descriptor name="NONDVI"> - <Parameter value="0.0328422" /> - <Parameter value="0.0966684" /> - <Parameter value="0.128072" /> - <Parameter value="0.892172" /> - </Descriptor> - <Descriptor name="ROADSA"> - <Parameter value="0.0528834" /> - <Parameter value="0.125395" /> - <Parameter value="0.216374" /> - <Parameter value="1" /> - </Descriptor> - <Descriptor name="NOBUIL"> - <Parameter value="0.0198015" /> - <Parameter value="0.0944664" /> - <Parameter value="0.17092" /> - <Parameter value="0.87146" /> - </Descriptor> -</FuzzydDescriptorsModel> diff --git a/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml b/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml deleted file mode 100644 index 83f733dc4c117e0ae898afa499e45ae6db65aa7a..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/DSFuzzyModel_Init.xml +++ /dev/null @@ -1,21 +0,0 @@ -<?xml version="1.0" ?> -<FuzzydDescriptorsModel> - <Descriptor name="NONDVI"> - <Parameter value="0.05" /> - <Parameter value="0.15" /> - <Parameter value="0.20" /> - <Parameter value="0.95" /> - </Descriptor> - <Descriptor name="ROADSA"> - <Parameter value="0.15" /> - <Parameter value="0.30" /> - <Parameter value="0.50" /> - <Parameter value="0.95" /> - </Descriptor> - <Descriptor name="NOBUIL"> - <Parameter value="0.05" /> - <Parameter value="0.07" /> - <Parameter value="0.10" /> - <Parameter value="0.95" /> - </Descriptor> -</FuzzydDescriptorsModel> diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF deleted file mode 100644 index c35e58f7734d48008a909fe36028bb11872914b8..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.TIF +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d4c708f6360cadd64d7c530b6412397ddc60929b8c3bcea79d4b45e392dde59c -size 1149268 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom deleted file mode 100644 index 68452848273e55170a47fdfad7c8175c0b3763dd..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE.geom +++ /dev/null @@ -1,165 +0,0 @@ -adjustment_0.adj_param_0.center: 0 -adjustment_0.adj_param_0.description: intrack_offset -adjustment_0.adj_param_0.lock_flag: 0 -adjustment_0.adj_param_0.parameter: 0 -adjustment_0.adj_param_0.sigma: 50 -adjustment_0.adj_param_0.units: pixel -adjustment_0.adj_param_1.center: 0 -adjustment_0.adj_param_1.description: crtrack_offset -adjustment_0.adj_param_1.lock_flag: 0 -adjustment_0.adj_param_1.parameter: 0 -adjustment_0.adj_param_1.sigma: 50 -adjustment_0.adj_param_1.units: pixel -adjustment_0.adj_param_2.center: 0 -adjustment_0.adj_param_2.description: intrack_scale -adjustment_0.adj_param_2.lock_flag: 0 -adjustment_0.adj_param_2.parameter: 0 -adjustment_0.adj_param_2.sigma: 50 -adjustment_0.adj_param_2.units: unknown -adjustment_0.adj_param_3.center: 0 -adjustment_0.adj_param_3.description: crtrack_scale -adjustment_0.adj_param_3.lock_flag: 0 -adjustment_0.adj_param_3.parameter: 0 -adjustment_0.adj_param_3.sigma: 50 -adjustment_0.adj_param_3.units: unknown -adjustment_0.adj_param_4.center: 0 -adjustment_0.adj_param_4.description: map_rotation -adjustment_0.adj_param_4.lock_flag: 0 -adjustment_0.adj_param_4.parameter: 0 -adjustment_0.adj_param_4.sigma: 0.1 -adjustment_0.adj_param_4.units: degrees -adjustment_0.description: Initial adjustment -adjustment_0.dirty_flag: 0 -adjustment_0.number_of_params: 5 -bias_error: 0 -current_adjustment: 0 -height_off: 241 -height_scale: 500 -image_id: 02APR01105228-M1BS-000000128955_01_P001 -lat_off: 43.5757 -lat_scale: 0.0881 -line_den_coeff_00: 1 -line_den_coeff_01: 3.073151e-05 -line_den_coeff_02: 0.0006767593 -line_den_coeff_03: 0.0002759762 -line_den_coeff_04: 1.707011e-05 -line_den_coeff_05: -4.215218e-07 -line_den_coeff_06: -2.031982e-06 -line_den_coeff_07: 6.281466e-06 -line_den_coeff_08: -2.098686e-05 -line_den_coeff_09: 1.091061e-05 -line_den_coeff_10: 3.716818e-08 -line_den_coeff_11: 5.435656e-08 -line_den_coeff_12: -4.35619e-06 -line_den_coeff_13: 1.09022e-08 -line_den_coeff_14: 1.78519e-08 -line_den_coeff_15: 0.0004342067 -line_den_coeff_16: 6.371344e-08 -line_den_coeff_17: 0 -line_den_coeff_18: -1.416592e-05 -line_den_coeff_19: 1.653665e-08 -line_num_coeff_00: -0.001183432 -line_num_coeff_01: 0.001540212 -line_num_coeff_02: -0.9858373 -line_num_coeff_03: 0.01594806 -line_num_coeff_04: 2.730892e-05 -line_num_coeff_05: -9.785795e-07 -line_num_coeff_06: 0.0002528461 -line_num_coeff_07: -0.0007762763 -line_num_coeff_08: 0.001998298 -line_num_coeff_09: -5.855501e-06 -line_num_coeff_10: -8.293341e-07 -line_num_coeff_11: 4.496584e-08 -line_num_coeff_12: 2.925877e-05 -line_num_coeff_13: 0 -line_num_coeff_14: -8.818227e-06 -line_num_coeff_15: -4.465644e-05 -line_num_coeff_16: -1.06142e-05 -line_num_coeff_17: 4.172296e-07 -line_num_coeff_18: -4.632173e-06 -line_num_coeff_19: 1.915274e-07 -line_off: 3630 -line_scale: 3691 -ll_lat: 43.4876885949517 -ll_lon: 1.35617248105186 -long_off: 1.4635 -long_scale: 0.1091 -lr_lat: 43.487956450501 -lr_lon: 1.57224225725364 -meters_per_pixel_x: 2.55166863064346 -meters_per_pixel_y: 2.68906571490787 -number_lines: 7265 -number_of_adjustments: 1 -number_samples: 6876 -polynomial_format: B -rand_error: 0 -rect: 0 0 6875 7264 -ref_point_hgt: 241 -ref_point_lat: 43.5755460927759 -ref_point_line: 3632 -ref_point_lon: 1.46371767649799 -ref_point_samp: 3437.5 -samp_den_coeff_00: 1 -samp_den_coeff_01: 0.001117681 -samp_den_coeff_02: 0.002334335 -samp_den_coeff_03: -0.0006207135 -samp_den_coeff_04: -5.962135e-05 -samp_den_coeff_05: 1.552717e-06 -samp_den_coeff_06: -1.84009e-06 -samp_den_coeff_07: -4.876876e-06 -samp_den_coeff_08: 3.158963e-05 -samp_den_coeff_09: -1.201072e-05 -samp_den_coeff_10: -1.579758e-07 -samp_den_coeff_11: -9.944747e-08 -samp_den_coeff_12: 1.942372e-06 -samp_den_coeff_13: 0 -samp_den_coeff_14: -8.945496e-08 -samp_den_coeff_15: -1.480163e-06 -samp_den_coeff_16: -6.008504e-08 -samp_den_coeff_17: 3.055564e-08 -samp_den_coeff_18: 1.11032e-07 -samp_den_coeff_19: 1.314046e-08 -samp_num_coeff_00: -0.0021422 -samp_num_coeff_01: 1.003674 -samp_num_coeff_02: 0.00317708 -samp_num_coeff_03: 0.0002667587 -samp_num_coeff_04: -0.002315384 -samp_num_coeff_05: 0.0006203277 -samp_num_coeff_06: -0.0004161892 -samp_num_coeff_07: 0.001035653 -samp_num_coeff_08: -0.001198854 -samp_num_coeff_09: 7.437719e-06 -samp_num_coeff_10: 2.503507e-06 -samp_num_coeff_11: -2.185972e-05 -samp_num_coeff_12: -4.893912e-05 -samp_num_coeff_13: -1.149441e-05 -samp_num_coeff_14: 8.351017e-05 -samp_num_coeff_15: -7.642065e-05 -samp_num_coeff_16: -2.684169e-07 -samp_num_coeff_17: 2.340974e-08 -samp_num_coeff_18: 7.001246e-06 -samp_num_coeff_19: -3.846245e-08 -samp_off: 3438 -samp_scale: 3443 -sensor: QB02 -support_data.B_band_absCalFactor: 0.0160412 -support_data.G_band_absCalFactor: 0.0143847 -support_data.N_band_absCalFactor: 0.0154242 -support_data.R_band_absCalFactor: 0.0126735 -support_data.TDI_level: 13 -support_data.azimuth_angle: 154.8 -support_data.band_id: Multi -support_data.band_name_list: B G R N -support_data.bits_per_pixel: 16 -support_data.elevation_angle: 48.6 -support_data.generation_date: 2004-05-25T19:49:03.000000Z -support_data.sat_azimuth_angle: 359 -support_data.sat_elevation_angle: 72.4 -support_data.sat_id: QB02 -support_data.tlc_date: 2002-04-01T10:52:28.415362Z; -support_data.type: ossimQuickbirdMetaData -type: ossimQuickbirdRpcModel -ul_lat: 43.663535886024 -ul_lon: 1.35446328287058 -ur_lat: 43.6638304625161 -ur_lon: 1.57254618315919 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf deleted file mode 100644 index 17a9903a40c7d097242b4f5367a8a1c3a0b30687..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:63f211d703d89d3abd9c7b0c2729f11b94fc9918108e77ab707c3a5b087c8da7 -size 1028 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj deleted file mode 100644 index a30c00a55de19be195abf9e942f6cff93bf0a825..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp deleted file mode 100644 index f901be7cd3a3eb8e328388cb03d4db257cd46987..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a8d2eee9ba80d3bb867aada7db654ef86d17cad4f1d526b0385a943f29d82a6b -size 4564 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx deleted file mode 100644 index 6f0fa666c0082c9bb48b431e0df4b44b357d6276..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f3bdf591bf2d6a7e3025629649f3e3effa4511f9f1af793193365b3ef53d8eb3 -size 252 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf deleted file mode 100644 index ed4287655d16eccbc86bc1926bc7b00c177ce96b..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d680b1d17582dc86c451bbe0446f9af84ae611b6afe06a5db38adecf191ba971 -size 4847 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj deleted file mode 100644 index a30c00a55de19be195abf9e942f6cff93bf0a825..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.prj +++ /dev/null @@ -1 +0,0 @@ -GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp deleted file mode 100644 index d5ff96b9922859ed04a1f8c4479c89507f6c4daa..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:d0b6e77ff1d3acae9432b63b929050ed0089e9aace8a831c817b07ac02b04063 -size 18388 diff --git a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx b/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx deleted file mode 100644 index 72bda750b8f93dbb743c133f9cdcb57e5d489314..0000000000000000000000000000000000000000 --- a/Data/Input/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8e3f91df5a62beb63ba9b17a952d2673a732aa428b20861dce0c6dd986e588db -size 668 diff --git a/Data/Input/InputForRoadDetectionScalarProductDir.raw b/Data/Input/InputForRoadDetectionScalarProductDir.raw deleted file mode 100644 index 95baee1dbe12bd62a063c59131b10dc4e8bde71c..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetectionScalarProductDir.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:983ff7d0fd3f483320cd5739d48a65d89b39085be7689c9ccf2c1909646abe37 -size 8000000 diff --git a/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr b/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr deleted file mode 100644 index 542943fbb79a3e0a855c28857c843cfc6fa64f18..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetectionScalarProductDir.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNeigborhoodScalarProductDirectionOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/InputForRoadDetectionScalarProductMod.raw b/Data/Input/InputForRoadDetectionScalarProductMod.raw deleted file mode 100644 index 1965bed30248a82446ddaf14b1080f9a1e1a755a..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetectionScalarProductMod.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:4381a7c3cb500cf48069d96e6cfd22d93c314d9b72ed13db4b63d71595cf4d0d -size 8000000 diff --git a/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr b/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr deleted file mode 100644 index 4718fbd683e934c6b1228b843fbf722e17ca6b2c..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetectionScalarProductMod.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNeigborhoodScalarProductModulusOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/InputForRoadDetection_IsolatedRem.raw b/Data/Input/InputForRoadDetection_IsolatedRem.raw deleted file mode 100644 index 47f0f275c53646931b0dd5c8b3734a3d2db3447b..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_IsolatedRem.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:708c193109abedbfbf512198f0ddfb3d395877892535ac24ebd69debed6d252a -size 8000000 diff --git a/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr b/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr deleted file mode 100644 index c3059e85c1b67b6662f1fc540bb7b52f52f871a8..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_IsolatedRem.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvRemoveIsolatedByDirectionOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/InputForRoadDetection_NonMaxRem.raw b/Data/Input/InputForRoadDetection_NonMaxRem.raw deleted file mode 100644 index 5798a2e6cff1445685a8633fd0ccaa7951982471..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_NonMaxRem.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:38e0a731bd1b6032cfa78f0bf04953af80d47503d7a309c0a151c24d8a7d4c92 -size 8000000 diff --git a/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr b/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr deleted file mode 100644 index f127f633be1cf99c10cd5abf9c5abf5707b9e9c7..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_NonMaxRem.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvNonMaxRemovalByDirectionOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/InputForRoadDetection_SpectralAngle.raw b/Data/Input/InputForRoadDetection_SpectralAngle.raw deleted file mode 100644 index fcfe442dca79ccfc12b2f1b2fb7abfee4cf74a9a..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_SpectralAngle.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:650d138fc001f6e44fe4c937736c0fee5a0421f8924116c104e52c5ac60e6845 -size 8000000 diff --git a/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr b/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr deleted file mode 100644 index e8d1181b91312aa95409ed3257c39f57c40f43b2..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_SpectralAngle.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/bfTvSpectralAngleDistanceOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/InputForRoadDetection_WrongRem.raw b/Data/Input/InputForRoadDetection_WrongRem.raw deleted file mode 100644 index b77cb617091761f57ab8a441e59a5a0d72ecb26f..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_WrongRem.raw +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:cfce41cafcedca2eec656277cda36f4c5dceaef30abfb367858a0a274d41b2aa -size 8000000 diff --git a/Data/Input/InputForRoadDetection_WrongRem.raw.hdr b/Data/Input/InputForRoadDetection_WrongRem.raw.hdr deleted file mode 100644 index a8093309243fe19444a67cace922dfebf88bea04..0000000000000000000000000000000000000000 --- a/Data/Input/InputForRoadDetection_WrongRem.raw.hdr +++ /dev/null @@ -1,14 +0,0 @@ -ENVI -description = { -/home2/julien/ORFEO-TOOLBOX/otb-build/debug/OTB/Testing/Temporary/feTvRemoveWrongDirectionOutput} -samples = 1000 -lines = 1000 -bands = 1 -header offset = 0 -file type = ENVI Standard -data type = 5 -interleave = bsq -byte order = 0 -map info = {UTM, 1, 1, 439136.400000, 5273706.600000, 0.600000, 0.600000, 32, North} -band names = { -Band 1} diff --git a/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml b/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml deleted file mode 100644 index 36bf8590e956116f6e4a111960f27111f41faa0f..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" ?> -<FeatureStatistics> - <Statistic name="mean"> - <StatisticVector value="823.004" /> - <StatisticVector value="81672" /> - <StatisticVector value="0.821769" /> - <StatisticVector value="3.36296" /> - </Statistic> - <Statistic name="stddev"> - <StatisticVector value="366.639" /> - <StatisticVector value="135865" /> - <StatisticVector value="1.31875" /> - <StatisticVector value="9.14568" /> - </Statistic> -</FeatureStatistics> diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01.tif deleted file mode 100644 index e3b946f57282e32006c7930175f75a6c23a9ad20..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:76240f31ab0ebe2c8e83b38d8a02a2840f98b34aa470e92395763014c8b9cc05 -size 13234829 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf deleted file mode 100644 index a0aa2d0d932106f2394124898383c7cac084c7d9..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:01de58ce3c495b414e3f919d615130b06be4bbf1003b6b0de4f5253f2f75be54 -size 128437 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp deleted file mode 100644 index cfa8f3d8dbcf234345c82d3b9153ba3120dd0635..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0d1c844b374bafb64de032505d8289c60df1a902468126eddd39a88223e1c4de -size 39160 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx deleted file mode 100644 index 4a2c3af97936c8dcb47fa4403afe509a53710708..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01LabeledPoints.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:be403f366f2b77b0d0e003483d14e3a791132d8553071062e7291d54a85f8e3e -size 11260 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf deleted file mode 100644 index 202ee4ebf826690e08e4824b170606210b443de7..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:397c38ef052e1be71c0417e8755149f56e29a89db317020b118683950807072f -size 580 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp deleted file mode 100644 index 6c61252e5cde1badc59f9dcab1deb7ef9aaf8661..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:3de1390f4caeb34c796e97b5fd734118267dab9b7de9edd731013ebfb938772a -size 2236 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx deleted file mode 100644 index eedcb9a4a63e2e0e2f855ed1a9a8a4840f778aa2..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Polygons.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:bc1895c35aa8f5da834af41323f450b6bad52514d7965ceb8a1e18dbaeddc7b1 -size 124 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf deleted file mode 100644 index 3522a6c3014f619bed4fbbc4950e5928f903e858..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.dbf +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:53d0f24062de7d7d09a7daa461a58a7e86e432d599655b89578f72f137f905d8 -size 365699 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp deleted file mode 100644 index 24cb707432de271be01f81c9c3e2ca6c0b9a6e87..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shp +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0cf2710d95e4c820526a25bc6690ef7a3b976f18cf17f3f2ed1ffbe035515747 -size 126492 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx b/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx deleted file mode 100644 index aa895b96ac97a0ee0052261977e5ce92bac4ebcb..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01Samples.shx +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:78090fcacc5e730c68b21172cd3879d44817317527c415e713a872129d3fc6bc -size 36212 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif deleted file mode 100644 index 1476026469d7d1da3ac47455c8fc6ac6cbc3028f..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01_amplitude.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:0a9b97df1f6ae5a5356cbb4710e1cb0b95c7b8b82211dde09ba236164ecd965d -size 8584511 diff --git a/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif b/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif deleted file mode 100644 index 0aebc9c9a6236adfda6f6f6ae4f48a121064951a..0000000000000000000000000000000000000000 --- a/Data/Input/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32dd7458e8c64d1779b1513e7a22e28249939d49e6e9023888c12c89eeade1c8 -size 71853 diff --git a/Data/Input/Seg1InputForRCC8Graph.tif b/Data/Input/Seg1InputForRCC8Graph.tif deleted file mode 100644 index e677622f9e4c0d4d464a97c7868746d837030406..0000000000000000000000000000000000000000 --- a/Data/Input/Seg1InputForRCC8Graph.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:75bfc4c053eeb623f1c3c072989a39835f7c6632b40902604bab4c8c7567c3d9 -size 5564 diff --git a/Data/Input/Seg2InputForRCC8Graph.tif b/Data/Input/Seg2InputForRCC8Graph.tif deleted file mode 100644 index 6acc661a46c63f05ebc2b1114eba866af69151cd..0000000000000000000000000000000000000000 --- a/Data/Input/Seg2InputForRCC8Graph.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:ebfa2c070d97c3f7a524766a02360ad9b8c21c98e49d5e7dd7eea9ff23224900 -size 4691 diff --git a/Data/Input/Seg3InputForRCC8Graph.tif b/Data/Input/Seg3InputForRCC8Graph.tif deleted file mode 100644 index 2e27e0ee07e6a96ee3080888d565476f87127f8f..0000000000000000000000000000000000000000 --- a/Data/Input/Seg3InputForRCC8Graph.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e2b58aefe1fa20b19ea16c34bbc047fd8a4b06ccb302b39d900cbead96c62ca6 -size 3340 diff --git a/Data/Input/Seg4InputForRCC8Graph.tif b/Data/Input/Seg4InputForRCC8Graph.tif deleted file mode 100644 index c2886b585ce56f98b79be4f016cdd69180bac30f..0000000000000000000000000000000000000000 --- a/Data/Input/Seg4InputForRCC8Graph.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8da097d6896b059cda7de7ff1225ce04be314844ecf8ef62c43d2db2335b8f53 -size 3024 diff --git a/Data/Input/Seg5InputForRCC8Graph.tif b/Data/Input/Seg5InputForRCC8Graph.tif deleted file mode 100644 index 6b8329bcff20dd012dd54dfdbe1f1e60e968591c..0000000000000000000000000000000000000000 --- a/Data/Input/Seg5InputForRCC8Graph.tif +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c84224aa400ed08bc16edb53596dd9f205996e1dc0fdf377220beebf54119c09 -size 3931 diff --git a/Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png b/Data/Input/qb_ExtractRoad_pretty.png similarity index 100% rename from Data/Baseline/Examples/FeatureExtraction/qb_ExtractRoad_pretty.png rename to Data/Input/qb_ExtractRoad_pretty.png diff --git a/Data/Input/rcc8_mire1.png b/Data/Input/rcc8_mire1.png deleted file mode 100644 index 84d80b5e476e3cda75dea149e44b344d157c7437..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:12f42927804f6acac12efbe0822696999f081d3b1c2d2e0660227a63635f2fba -size 10261 diff --git a/Data/Input/rcc8_mire2.png b/Data/Input/rcc8_mire2.png deleted file mode 100644 index fe51b7d93dca6819628b8aeccd1786b05ef28f12..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:41dc58713412957c17566c85387bf1b8b260ccf1f8fd8196fe649643887f2d03 -size 10261 diff --git a/Data/Input/rcc8_mire3.png b/Data/Input/rcc8_mire3.png deleted file mode 100644 index 6ca1fb1ed79527ade0d0d39d517d2b27590fec86..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire3.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:a2cde01113be3caeb86230817cd34355becc8aa74536929d3b22a8fe82f58659 -size 294 diff --git a/Data/Input/rcc8_mire4.png b/Data/Input/rcc8_mire4.png deleted file mode 100644 index 10cd0bd99ff3ade23944d2d64bdba05104de70ea..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire4.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:57d4c7a833e915885ee3702f7990864e0583838d395f7e4fccb38502607d7189 -size 10261 diff --git a/Data/Input/rcc8_mire5.png b/Data/Input/rcc8_mire5.png deleted file mode 100644 index 25031a9c185cce67878d7f32db1d587524d22bb5..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire5.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:32d1a7049dcdf8cf0488452d6347467740c97536baa73e21751d499ef41f306b -size 112 diff --git a/Data/Input/rcc8_mire5.png.aux.xml b/Data/Input/rcc8_mire5.png.aux.xml deleted file mode 100644 index 098625bf84b4ca0de04765727ac8e21380994743..0000000000000000000000000000000000000000 --- a/Data/Input/rcc8_mire5.png.aux.xml +++ /dev/null @@ -1,6 +0,0 @@ -<PAMDataset> - <GeoTransform> 5.0000000000000000e+00, 1.0000000000000000e+00, 0.0000000000000000e+00, 1.5000000000000000e+01, 0.0000000000000000e+00, 1.0000000000000000e+00</GeoTransform> - <Metadata> - <MDI key="Comment">Created with The GIMP</MDI> - </Metadata> -</PAMDataset> diff --git a/Data/Output/DEMToHotImageGenerator.png b/Data/Output/DEMToHotImageGenerator.png new file mode 100644 index 0000000000000000000000000000000000000000..12224d6f0908d6c273cf87b787de7cfdd0ac7620 --- /dev/null +++ b/Data/Output/DEMToHotImageGenerator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d36b4f16b0f0be1d4d2247de214510349da67d37ae928945940898904e5a0a85 +size 234062 diff --git a/Data/Output/DEMToRainbowImageGenerator.png b/Data/Output/DEMToRainbowImageGenerator.png new file mode 100644 index 0000000000000000000000000000000000000000..935878f01c767e1f0aebc632201d9e2ba89bcfac --- /dev/null +++ b/Data/Output/DEMToRainbowImageGenerator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fd8b080e078549cdcfa949a31a286b30b7d6f1c96c923a977083a02855994256 +size 239121 diff --git a/Data/Output/DEMToReliefImageGenerator.png b/Data/Output/DEMToReliefImageGenerator.png new file mode 100644 index 0000000000000000000000000000000000000000..97820270f0a32bc9d4c104a05045287c8f631e88 --- /dev/null +++ b/Data/Output/DEMToReliefImageGenerator.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a9ed1706ab135a72068d49d0671e4c64c038d738928485b3721d29851c56ff1 +size 333514 diff --git a/Data/Output/GomaSmallFrostFiltered.png b/Data/Output/GomaSmallFrostFiltered.png new file mode 100644 index 0000000000000000000000000000000000000000..4bb8d0aff26b48ac98cf4449cd8f7134ece2952f --- /dev/null +++ b/Data/Output/GomaSmallFrostFiltered.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8469a05c42dbe0468daa7f9355fa6af0d79fa81793c93d001eb6310bf5c0ade6 +size 26542 diff --git a/Data/Output/HillShadingColorExample.png b/Data/Output/HillShadingColorExample.png new file mode 100644 index 0000000000000000000000000000000000000000..ef71ef616873d212669e28f78d1ce307fed60284 --- /dev/null +++ b/Data/Output/HillShadingColorExample.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba2f71579dafa1317e7f036223d1d849f3dfd8eb3a3e699c6fa91d5226372ab2 +size 484983 diff --git a/Data/Output/HillShadingExample.png b/Data/Output/HillShadingExample.png new file mode 100644 index 0000000000000000000000000000000000000000..d86e845d681b010064d24657bfc5cb93bf2f23e1 --- /dev/null +++ b/Data/Output/HillShadingExample.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:11d6eb5b30a7a0507a0c2b15275a69d583ae89c49da1ecb1fd29eb7e4aabbb5b +size 183418 diff --git a/Data/Output/MSClusteredOutput-pretty.png b/Data/Output/MSClusteredOutput-pretty.png new file mode 100644 index 0000000000000000000000000000000000000000..caa286e69843f35949a09bc8bc42019420bb4892 --- /dev/null +++ b/Data/Output/MSClusteredOutput-pretty.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf676b3188f175f21ea758ccfb7f551eb9468398d67f926ef677a89ca68dc622 +size 105266 diff --git a/Data/Output/MSLabeledOutput-pretty.png b/Data/Output/MSLabeledOutput-pretty.png new file mode 100644 index 0000000000000000000000000000000000000000..ec6a18fbe4105fb582189df496e3beb846c083c2 --- /dev/null +++ b/Data/Output/MSLabeledOutput-pretty.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2abea57f9bd5d62e708f6971178d2a3dd94997db37ab0846a66d6d99d37152a +size 105590 diff --git a/Data/Output/PrintableExampleOutput1.jpg b/Data/Output/PrintableExampleOutput1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab0a5d601db100171d2b4eebccaa087276ebee1a --- /dev/null +++ b/Data/Output/PrintableExampleOutput1.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:895c3c368f3daf3049ec2be7164e94f1e0fd3cdd52259bf99fb3b187fece5b3b +size 108726 diff --git a/Data/Output/PrintableExampleOutput2.jpg b/Data/Output/PrintableExampleOutput2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5254ab0bb4c6736dd2930eba0070ddaf28164488 --- /dev/null +++ b/Data/Output/PrintableExampleOutput2.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:57a2949eb07c569b5d0b474d2b9cf8e3f8de62260850dfc1a9b3614c57cdf5bb +size 116071 diff --git a/Data/Output/QB_Toulouse_Ortho_PAN_casted.png b/Data/Output/QB_Toulouse_Ortho_PAN_casted.png new file mode 100644 index 0000000000000000000000000000000000000000..23aee06b351d171c95dd0bf521b046c8ebb3fd63 --- /dev/null +++ b/Data/Output/QB_Toulouse_Ortho_PAN_casted.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca5363df6bf1a9fd48d17b033cd507ece65605bce33a8f3da8e3ba4af5f5e705 +size 182862 diff --git a/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png b/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png new file mode 100644 index 0000000000000000000000000000000000000000..6a70131af5f2a3b3e2d3eef3b5fcf88c7fcacec6 --- /dev/null +++ b/Data/Output/QB_Toulouse_Ortho_PAN_rescaled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e333f7abd77db1ab2158975e767ed1ea94ff547747584be07f54a01eae0bb3fa +size 108051 diff --git a/Data/Output/buildingExtractionIndexed_scaled.png b/Data/Output/buildingExtractionIndexed_scaled.png new file mode 100644 index 0000000000000000000000000000000000000000..f5c8ecd3189513614019da20e01580e77f2eddc5 --- /dev/null +++ b/Data/Output/buildingExtractionIndexed_scaled.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90304742fc7c5d8d88cff5abc627954337856160799856adb5dcb352db484ddd +size 17406 diff --git a/Data/Output/buildingExtractionRGB.png b/Data/Output/buildingExtractionRGB.png new file mode 100644 index 0000000000000000000000000000000000000000..0dbdd3d556a7aabcd2c736d68e3fbedc8b53301e --- /dev/null +++ b/Data/Output/buildingExtractionRGB.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a91156558f5de2353efe3d8e3b17ef2284e74200a0bd1fed5d36bffcf720fc7a +size 26026 diff --git a/Data/Output/qb_BandMath-pretty.jpg b/Data/Output/qb_BandMath-pretty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd7702f79d46340d9a6cf011270092ab6b1f22af --- /dev/null +++ b/Data/Output/qb_BandMath-pretty.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:280cbf6de4cfc271371df94f79bdef1b6fb5089225e0d5105a6ad494ae7be89e +size 67381 diff --git a/Documentation/Cookbook/Scripts/RunExamples.py b/Documentation/Cookbook/Scripts/RunExamples.py index e04ea62e62a0d781018c498504ebdfc72f25c100..41cb849897d494cf71cfc858e9dc2258bd673ff2 100755 --- a/Documentation/Cookbook/Scripts/RunExamples.py +++ b/Documentation/Cookbook/Scripts/RunExamples.py @@ -33,7 +33,7 @@ blacklist = [ "LAIAndPROSAILToSensorResponse" # does not run, wrong arguments ] -def run_example(otb_root, otb_data, name, dry_run): +def run_example(otb_root, name, dry_run): """ Run an example by name Assumes the current working directory is an OTB build @@ -71,6 +71,7 @@ def run_example(otb_root, otb_data, name, dry_run): print("$ " + binary + " " + " ".join(example_args)) if not dry_run: + otb_data = join(otb_root, "Data") # Make sure Output dir exists os.makedirs(join(otb_data, "Output"), exist_ok=True) @@ -81,19 +82,18 @@ def run_example(otb_root, otb_data, name, dry_run): def main(): parser = argparse.ArgumentParser(usage="Run one or all OTB cxx examples") parser.add_argument("otb_root", help="Path to otb repository") - parser.add_argument("otb_data", help="Path to otb-data repository") parser.add_argument("--name", type=str, help="Run only one example with then given name") parser.add_argument("-n", "--dry-run", action='store_true', help="Dry run, only print commands") parser.add_argument("-k", "--keep-going", action='store_true', help="Keep going after failing examples") args = parser.parse_args() if args.name: - run_example(args.otb_root, args.otb_data, args.name, dry_run=args.dry_run) + run_example(args.otb_root, args.name, dry_run=args.dry_run) else: list_of_examples =[os.path.splitext(os.path.basename(f))[0] for f in glob.glob(join(args.otb_root, "Examples/*/*.cxx"))] for name in list_of_examples: try: - run_example(args.otb_root, args.otb_data, name, dry_run=args.dry_run) + run_example(args.otb_root, name, dry_run=args.dry_run) except Exception as e: if args.keep_going: print("Warning:", e) diff --git a/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py index 95463f1191d2f8a44e23f2397445fae2a7028247..f534a97dcb0578ab7928a44c0ba1aa262acb244e 100644 --- a/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py +++ b/Documentation/Cookbook/Scripts/otbGenerateExamplesRstDoc.py @@ -44,7 +44,7 @@ def generate_examples_index(rst_dir, list_of_examples): index_f = open(join(rst_dir, "Examples.rst"), "w") index_f.write(RstPageHeading("C++ Examples", 3, ref="cpp-examples")) - for tag, examples_filenames in tag_files.items(): + for tag, examples_filenames in sorted(tag_files.items()): tag_filename = join("Examples", tag + ".rst") index_f.write("\t" + tag_filename + "\n") diff --git a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py index 8cd9ab8ed70e204d915e32c25ebb4944f52b4a9b..5cb3224bc01e41a3a1df7511dd28f1c5b050f722 100755 --- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py +++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py @@ -25,7 +25,7 @@ import argparse import re import otbApplication -from otbApplication import ParameterType_Bool, ParameterType_Int, ParameterType_Radius, ParameterType_RAM, ParameterType_Float, ParameterType_String, ParameterType_StringList, ParameterType_InputFilename, ParameterType_OutputFilename, ParameterType_InputImage, ParameterType_OutputImage, ParameterType_InputVectorData, ParameterType_OutputVectorData, ParameterType_Directory, ParameterType_Choice, ParameterType_InputImageList, ParameterType_InputVectorDataList, ParameterType_InputFilenameList, ParameterType_InputProcessXML, ParameterType_OutputProcessXML, ParameterType_ListView, ParameterType_Group +from otbApplication import ParameterType_Bool, ParameterType_Int, ParameterType_Radius, ParameterType_RAM, ParameterType_Float, ParameterType_String, ParameterType_StringList, ParameterType_InputFilename, ParameterType_OutputFilename, ParameterType_InputImage, ParameterType_OutputImage, ParameterType_InputVectorData, ParameterType_OutputVectorData, ParameterType_Directory, ParameterType_Choice, ParameterType_InputImageList, ParameterType_InputVectorDataList, ParameterType_InputFilenameList, ParameterType_ListView, ParameterType_Group from otb_warnings import application_documentation_warnings @@ -202,7 +202,6 @@ def rst_parameter_value(app, key): values.update({ParameterType_InputImageList: "image1 image2..."}) values.update({ParameterType_InputVectorDataList: "vectorfile1 vectorfile2..."}) values.update({ParameterType_InputFilenameList: "filename1 filename2..."}) - values.update(dict.fromkeys([ParameterType_InputProcessXML, ParameterType_OutputProcessXML], "filename.xml")) if type in values: return values[type] @@ -356,10 +355,17 @@ def make_links(text, allapps): rep = {appname: ":ref:`{}`".format(appname) for appname in allapps} return multireplace(text, rep) +def render_deprecation_string(app): + if app.IsDeprecated(): + return "This application is deprecated and will be removed in a future release." + else: + return "" + def render_application(appname, allapps): "Render app to rst" - app = otbApplication.Registry.CreateApplication(appname) + # Create the application without logger to avoid the deprecation warning log + app = otbApplication.Registry.CreateApplicationWithoutLogger(appname) # TODO: remove this when bug 440 is fixed app.Init() @@ -368,6 +374,7 @@ def render_application(appname, allapps): output = template_application.format( label=appname, + deprecation_string=render_deprecation_string(app), heading=rst_section(app.GetName(), '='), description=app.GetDescription(), longdescription=make_links(app.GetDocLongDescription(), allapps), @@ -381,8 +388,9 @@ def render_application(appname, allapps): return output def GetApplicationTags(appname): - app = otbApplication.Registry.CreateApplication(appname) - return app.GetDocTags() + # Create the application without logger to avoid the deprecation warning log + app = otbApplication.Registry.CreateApplicationWithoutLogger(appname) + return app.GetDocTags() def GenerateRstForApplications(rst_dir): "Generate .rst files for all applications" @@ -404,9 +412,12 @@ def GenerateRstForApplications(rst_dir): for appName in appNames: # Get application first tag - tags = GetApplicationTags(appName) + tags = list(GetApplicationTags(appName)) + if "Deprecated" in tags: + tags.remove("Deprecated") if not tags or len(tags) == 0: raise RuntimeError("No tags for application: " + appName) + tag = tags[0] tag_ = tag.replace(" ", "_") diff --git a/Documentation/Cookbook/rst/C++/DeveloperGuide.rst b/Documentation/Cookbook/rst/C++/DeveloperGuide.rst index 2808c4479c704bf71bd2ced9c010af2c65e57228..e34e034a08d94a074443ec8d26215f953c5ae8ca 100644 --- a/Documentation/Cookbook/rst/C++/DeveloperGuide.rst +++ b/Documentation/Cookbook/rst/C++/DeveloperGuide.rst @@ -7,6 +7,7 @@ Developer Guide Iterators Filters StreamingAndThreading + FunctorImageFilter PersistentFilters WriteAnApplication AddingNewModules diff --git a/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst b/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst new file mode 100644 index 0000000000000000000000000000000000000000..95fd6124f8c02481e07b7313481c677bbabd01ec --- /dev/null +++ b/Documentation/Cookbook/rst/C++/FunctorImageFilter.rst @@ -0,0 +1,253 @@ +.. _FunctorImageFilter: + +FunctorImageFilter +================== + +In image processing and remote sensing, it is very common to write custom +pixel-based or neighborhood-based operations between one or several +co-registered images. Starting OTB 7.0, there is now a unique filter +:doxygen:`FunctorImageFilter` that will handle most cases: + +* Any number of input images, being either ``Image``, ``VectorImage`` or a mix of both, +* An ``Image`` or ``VectorImage`` output +* Operation based on pixels, neighborhoods or a mix of both, +* Functor classes, function, lambdas. + +With :doxygen:`FunctorImageFilter` you only need to write the operation you want to perform, and the filter will take care of everything (including multi-threading and streaming). + +Quickstart +---------- + +Defining the operation to perform +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The operation to perform can be defined as a free function: + +.. code-block:: cpp + + double myFreeFunction(const double& int in) {...} + +It can also be defined as a functor (i.e. a class defining ``operator()``: + +.. code-block:: cpp + + class MyFunctor + { + public: + double operator()(const double& int in) {...} + }; + +It can also be defined as a lambda: + +.. code-block:: cpp + + auto myLambda = [](const double & int in) -> double {...} + + +Creating a ``FunctorImageFilter`` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Once the operation to perform has been implemented, it is very easy to get an instance of ``FunctorImageFilter`` from it: + +.. code-block:: cpp + + auto filterFromFreeFunction = NewFunctorFilter(myFreeFunction); + auto filterFromFunctor = NewFunctorFilter(MyFunctor); + auto filterFromLambda = NewFunctorFilter(myLambda); + +And you can use it just like any other filter: + +.. code-block:: cpp + + filterFromLambda->SetInput(upStreamFilter->GetOutput()); + downstreamFilter->SetInput(filterFromLambda->GetOutput()); + +You can also directly define instances of ``FunctorImageFilter`` with built-in math functions: + +.. code-block:: cpp + + using CosType = double(double); + auto filterCos = NewFunctorFilter(static_cast<CosType*>(std::cos)); + +Note, the ``static_cast`` trick, which allows to disambguiate between different prototypes of the ``cos`` function. + +Automatic types deduction +------------------------- + +You probably notice that, contrary to other filters in ITK and OTB, there is no +need to specify input and output image types. This is because +``FunctorImageFilter`` uses C++ metaprogramming to automatically derive the +input and output image types from the free function, functor or lambda, with +the following rules. + +Let ``R (T1 t1, T2 t2 ..., TN tn)`` be the signature of the free function, ``operator()`` or lambda. Note that the filter conversely supports passing by value ``TN tn`` or by const reference ``const TN & tn``. + +First lets define basic types: + +- Scalar type (double, float, unsigned int, short ...) +- ``std::complex<T>`` with T a scalar type +- ``itk::FixedArray<T,N>``, ``itk::RGBPixel<T>``, ``itk::RGBAPixel<T>`` with T a scalar type + + +Automatic input type deduction +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +From the basic types, the following deduction rules apply: + +- If ``TN`` is a basic type as defined above, the Nth input will be of type ``otb::Image<TN>`` +- If ``TN`` is of type ``itk::VariableLengthVector<T>`` with T a basic type as defined above, the Nth input will be of type ``otb::VectorImage<T>`` +- If ``TN`` is of type ``const itk::ConstNeighborhoodIterator<otb::Image<T>> &`` with T a basic type as defined above, the Nth input will be of type ``otb::Image<TN>`` +- If ``TN`` is of type ``const itk::ConstNeighborhoodIterator<otb::VectorImage<T>> &`` with T a basic type as defined above, the Nth input will be of type ``otb::VectorImage<TN>`` + +Note that this will work for any number of inputs. + +Automatic output type deduction +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Rules for output type deduction are simpler: +- If ``R`` is a basic type, output of the filter will be of type ``otb::Image<R>`` +- If ``R`` is of type ``itk::VariableLengthVector<T>`` with T a basic type as defined above, the output of the filter will be of type ``otb::VectorImage<R>`` + +Note that if ``R`` is of type ``itk::VariableLengthVector<T>``, you need extra steps so that the filter can allocate the correct number of output bands, as explained in NumberOfOutputBands_ section. + +Alternative prototype for performance +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Automatic type deduction will also work with the following signature: +``void (const R&, T1 t1, T2 t2 ..., TN tn)`` + +This will be more efficient when ``R`` is of type ``itk::VariableLengthVector<T>`` and should be prefered in this case. + +Automatic type deduction examples +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Consider the following free function: + +.. code-block:: cpp + + itk::VariableLenghtVector<double> myFreeFunction(unsigned char a, + const std::complex<float>& b, + const itk::VariableLengthVector<short>& c, + const itk::ConstNeighborhoodIterator<otb::Image<double>>& d) {...} + +When a ``FunctorImageFilter`` is built from this function, the following types will be deduced: + +- First input (corresponding to a) will be of type ``otb::Image<unsigned char>`` +- Second input (corresponding to b) will be of type ``otb::Image<std::complex<float>>`` +- Third input (corresponding to c) will be of type ``otb::VectorImage<short>`` +- Fourth input (corresponding to d) will be of type ``otb::Image<double>`` +- Output type will be of type ``otb::VectorImage<double>`` + +This is strictly equivalent to: + +.. code-block:: cpp + + void myFreeFunction(const itk::VariableLengthVector<double> & out , + unsigned char a, + const std::complex<float> & b, + const itk::VariableLengthVector<short> &c, + const itk::ConstNeighborhoodIterator<otb::Image<double>> & d) {...} + +Since the output type is of type ``itk::VariableLengthVector<T>``, the latter should be preferred. + + +Using the filter +---------------- + +Setting inputs +~~~~~~~~~~~~~~ + +The Nth parameter can be set with the template ``SetInput()`` method: + +.. code-block:: cpp + + myFilter->SetInput<N>(imageN); + +You can also set all inputs at once with the ``SetInputs()`` method: + +.. code-block:: cpp + + myFilter->SetInputs(image0,...,imageN); + +If you only have one input, you can simply call: + +.. code-block:: cpp + + myFilter->SetInput(image); + +Of course, input types must match the types deducted from the operator(), free function or lambda! + +Accessing the function +~~~~~~~~~~~~~~~~~~~~~~ + +If ``FunctorImageFilter`` was built from a functor class, this class may have parameters that you wish to change or read. + +You can call ``GetFunctor()`` to access a const reference to the functor in order to read a parameter value: + +.. code-block:: cpp + + auto a = myFilter->GetFunctor().GetParameterA(); + +If you wish to modify a parameter of the functor, you will have to call ``GetModifiableFunctor()``, which will return a non-const reference to the functor and ensure that the filter will be re-run when updated. + +Setting the neighborhood radius +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +If you have ``itk::ConstNeighborhoodIterator<otb::Image<T>>`` or ``itk::ConstNeighborhoodIterator<otb::VectorImage<T>>`` as input type, you can set the neighborhood radius when building the filter instance, with: + +.. code-block:: cpp + + auto filterFromFunctor = NewFunctorFilter(MyFunctor,{{3,3}}); + +Advanced use +------------ + +Number of output bands +~~~~~~~~~~~~~~~~~~~~~~ + +.. _NumberOfOutputBands: + +If is of type ``itk::VariableLengthVector<T>``, then the functor class should provide an ``OutputSize()`` method as follows. + +If the number of output bands is fixed: + +.. code-block:: cpp + + class MyFunctor { + public: + ... + constexpr size_t OutputSize(...) const + { + // Return the number of output bands + return 3; + } + }; + +If the number of output bands depends on the number of bands in one or more input images: + +.. code-block:: cpp + + class MyFunctor { + public: + ... + size_t OutputSize(const std::array<size_t,N> & nbBands) const + { + // N Is the number of inputs + // nbBands is an array containing the number of bands for each input + ... + return outputNumberOfBands; + } + }; + +In this case you can use the information provided by the ``nbBands`` parameter +which contain the number of bands for each input, to derive and return the +output number of bands. + +If you are using a lambda, a free function or an existing functor which does not +offer the ``OutputSize()`` method, you can still use ``FunctorImageFilter`` but +you need to provide the number of bands when constructing the filter instance: + +.. code-block:: cpp + + // Specify that the lambda output has 3 bands + auto filterFromLambda = NewFunctorFilter(myLambda,3); + diff --git a/Documentation/Cookbook/rst/C++/UserGuide.rst b/Documentation/Cookbook/rst/C++/UserGuide.rst index 10304efb75adc6ae0782a52ed781e162e07c37e3..956d36e3ca03d27e8638f2cf1a376b9763e3de3e 100644 --- a/Documentation/Cookbook/rst/C++/UserGuide.rst +++ b/Documentation/Cookbook/rst/C++/UserGuide.rst @@ -618,8 +618,6 @@ vegetation had been demonstrated, users tended to also use the NDVI to quantify the photosynthetic capacity of plant canopies. This, however, can be a rather more complex undertaking if not done properly. -* NDVI. See example :ref:`NDVIRAndNIRVegetationIndexImageFilter.cxx`. - * ARVI. See example :ref:`ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx`. * AVI. See example :ref:`AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx`. @@ -707,7 +705,6 @@ Interest Points See example :ref:`RatioLineDetectorExample.cxx`. See example :ref:`CorrelationLineDetectorExample.cxx`. See example :ref:`AsymmetricFusionOfLineDetectorExample.cxx`. - See example :ref:`ParallelLineDetectionExample.cxx`. * Segment Extraction. See example :ref:`LineSegmentDetectorExample.cxx`. @@ -787,26 +784,9 @@ following expressions: * Flusser Moments for Images. See example :ref:`FlusserMomentsImageFunctionExample.cxx`. -Road and cloud extraction +Cloud extraction ~~~~~~~~~~~~~~~~~~~~~~~~~ -Road extraction is a critical feature for an efficient use of high -resolution satellite images. There are many applications of road -extraction: update of GIS database, reference for image registration, -help for identification algorithms and rapid mapping for example. Road -network can be used to register an optical image with a map or an -optical image with a radar image for example. Road network extraction -can help for other algorithms: isolated building detection, bridge -detection. In these cases, a rough extraction can be sufficient. In the -context of response to crisis, a fast mapping is necessary: within -6 hours, infrastructures for the designated area are required. Within -this timeframe, a manual extraction is inconceivable and an automatic -help is necessary. - -* Road extraction filter. See example :ref:`ExtractRoadExample.cxx`. - -* Step by step road extraction. See example :ref:`ExtractRoadByStepsExample.cxx`. - * Cloud Detection. See example :ref:`CloudDetectionExample.cxx`. Image Simulation diff --git a/Documentation/Cookbook/rst/C++/WriteAnApplication.rst b/Documentation/Cookbook/rst/C++/WriteAnApplication.rst index 412a789d70bf9190b51272653ff0458ae1b4e7c4..a1497c8d6e7af1b39a43c28081fb62ab9240ab7c 100644 --- a/Documentation/Cookbook/rst/C++/WriteAnApplication.rst +++ b/Documentation/Cookbook/rst/C++/WriteAnApplication.rst @@ -158,9 +158,6 @@ parameters: - ``ParameterType_InputVectorDataList`` : parameter storing a list of input vector data. -- ``ParameterType_InputProcessXML`` : parameter storing an input XML - file name. - - ``ParameterType_OutputFilename`` : parameter storing an output file name. @@ -169,9 +166,6 @@ parameters: - ``ParameterType_OutputVectorData`` : parameter storing an output vector data. -- ``ParameterType_OutputProcessXML`` : parameter storing an output XML - file name. - - ``ParameterType_RAM`` : parameter storing the maximum amount of RAM to be used. diff --git a/Documentation/Cookbook/rst/CliInterface.rst b/Documentation/Cookbook/rst/CliInterface.rst index eebd130fe3f08995be54e36ddf4c822fc247b3de..6717fd10ee5c21f79ec48996d5d2ef3ef0ddd940 100644 --- a/Documentation/Cookbook/rst/CliInterface.rst +++ b/Documentation/Cookbook/rst/CliInterface.rst @@ -123,7 +123,6 @@ example based on the OrthoRectification application: -opt.rpc <int32> RPC modeling (points per axis) (optional, off by default, default value is 10) -opt.ram <int32> Available RAM (MB) (optional, off by default, default value is 128) -opt.gridspacing <float> Resampling grid spacing (optional, off by default, default value is 4) - -inxml <string> Load parameters from XML (optional, off by default) -progress <boolean> Report progress -help <string list> Display long help (empty list), or help for given parameters keys @@ -145,11 +144,10 @@ Command-line examples are provided in the chapter :ref:`apprefdoc`. Load and save parameters to XML ------------------------------- -Since OTB 3.20, OTB applications parameters can be export/import to/from -an XML file using inxml/outxml parameters. Those parameters are -available in all applications. - -An example is worth a thousand words +OTB application parameters can be saved and loaded to +an XML file using the special ``-inxml`` and ``-outxml`` parameters. +Those parameters are available in all applications. +For example: :: @@ -177,17 +175,6 @@ time In this case it will use as mathematical expression “(im1b1 - im2b1)†instead of “abs(im1b1 - im2b1)â€. -Finally, you can also launch applications directly from the command-line -launcher executable using the inxml parameter without having to declare -the application name. Use in this case: - -:: - - otbApplicationLauncherCommandLine -inxml saved_applications_parameters.xml - -It will retrieve the application name and related parameters from the -input XML file and launch in this case the BandMath applications. - Parallel execution with MPI --------------------------- diff --git a/Documentation/Cookbook/rst/Installation.rst b/Documentation/Cookbook/rst/Installation.rst index 928ba0bcb044a62487cf2f6edf6cebc9f87857d6..899c95310a97cbe6e97765bac8f15030cb17463b 100644 --- a/Documentation/Cookbook/rst/Installation.rst +++ b/Documentation/Cookbook/rst/Installation.rst @@ -152,3 +152,15 @@ following repositories with these command-lines: http://download.opensuse.org/repositories/home:/tzotsos/openSUSE_Tumbleweed/ tzotsos and then add the OTB packages as shown above. + + +Archlinux +~~~~~~~~~~ + +Package is in AUR (Arch User Repository). +You will then need to run (if you use yaourt, you could use trizen instead): + +:: + + yaourt -S orfeo-toolbox + diff --git a/Documentation/Cookbook/rst/PythonAPI.rst b/Documentation/Cookbook/rst/PythonAPI.rst index 4fa3ca24b0ed1317373a4abe6354ecec25d9e091..6f61f1b4084faebb6cc1f94b459c82c34567b148 100644 --- a/Documentation/Cookbook/rst/PythonAPI.rst +++ b/Documentation/Cookbook/rst/PythonAPI.rst @@ -218,11 +218,34 @@ implementation does not break it, for instance by using an internal writer to write intermediate data. In this case, execution should still be correct, but some intermediate data will be read or written. +Load and save parameters to XML +------------------------------- + +As with a the `command line interface` you can save application parameters +to an xml file: + +.. code-block:: python + + # Save application parameters to XML + app = otb.Registry.CreateApplication('BandMath') + app.SetParameterStringList("il", ["image1.tif", "image2.tif"], True) + app.SetParameterString("out", out, True) + app.SetParameterString("exp", "cos(im1b1)+im2b1*im1b1", True) + app.SaveParametersToXML("parameters.xml") + +And load them later for execution: + +.. code-block:: python + + # Load application parameters from XML + app = otb.Registry.CreateApplication("BandMath") + app.LoadParametersFromXML("parameters.xml") + app.ExecuteAndWriteOutput() + + Interactions with OTB pipeline ------------------------------ -[Since OTB 6.6] - The application framework has been extended in order to provide ways to interact with the pipelines inside each application. It applies only to applications that use input or output images. Let's check which diff --git a/Documentation/Cookbook/rst/recipes/featextract.rst b/Documentation/Cookbook/rst/recipes/featextract.rst index 64afc6814ead8eed8f69d63f7b41af1aaab1f47e..23267e65276dc6d011b2a4967ff2dc73bf335792 100644 --- a/Documentation/Cookbook/rst/recipes/featextract.rst +++ b/Documentation/Cookbook/rst/recipes/featextract.rst @@ -111,37 +111,62 @@ The *RadiometricIndices* application has the following input parameters: (default value is 1) -``-list`` the list of available radiometric indices (default value is - Vegetation:NDVI) + ``Vegetation:NDVI``) -The available radiometric indices to be listed into -list with their -relevant channels in brackets are: +Note that band numbering starts at 1. -:: +The available radiometric indices to be listed into ``-list`` with their +relevant channels in brackets are: - Vegetation:NDVI - Normalized difference vegetation index (Red, NIR) - Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR) - Vegetation:RVI - Ratio vegetation index (Red, NIR) - Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR) - Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR) - Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR) - Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR) - Vegetation:GEMI - Global environment monitoring index (Red, NIR) - Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR) - - Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR) - Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR) - Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR) - Water:NDPI - Normalized difference pond index (Lacaux et al.) (MIR, Green) - Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green) - - Soil:RI - Redness index (Red, Green) - Soil:CI - Color index (Red, Green) - Soil:BI - Brightness index (Red, Green) - Soil:BI2 - Brightness index 2 (NIR, Red, Green) ++------------------------------+----------------------------------------------------------+---------------+ +|Index |Description |Required bands | ++==============================+==========================================================+===============+ +|Vegetation:NDVI |Normalized difference vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:TNDVI |Transformed normalized difference vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:RVI |Ratio vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:SAVI |Soil adjusted vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:TSAVI |Transformed soil adjusted vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:MSAVI |Modified soil adjusted vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:MSAVI2 |Modified soil adjusted vegetation index 2 |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:GEMI |Global environment monitoring index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:IPVI |Infrared percentage vegetation index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation:LAIFromNDVILog |Leaf Area Index from log NDVI |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation::LAIFromReflLinear |Leaf Area Index from reflectances with linear combination |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Vegetation::LAIFromNDVIFormo |Leaf Area Index from Formosat 2 TOC |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Water:NDWI |Normalized difference water index (Gao 1996) |NIR, MIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Water:NDWI2 |Normalized difference water index (Mc Feeters 1996) |Green, NIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Water:MNDWI |Modified normalized difference water index (Xu 2006) |Green, MIR | ++------------------------------+----------------------------------------------------------+---------------+ +|Water:NDTI |Normalized difference turbidity index (Lacaux et al.) |Green, Red | ++------------------------------+----------------------------------------------------------+---------------+ +|Soil:RI |Redness index |Green, Red | ++------------------------------+----------------------------------------------------------+---------------+ +|Soil:CI |Color index |Green, Red | ++------------------------------+----------------------------------------------------------+---------------+ +|Soil:BI |Brightness index |Green, Red | ++------------------------------+----------------------------------------------------------+---------------+ +|Soil:BI2 |Brightness index 2 |Green, Red, NIR| ++------------------------------+----------------------------------------------------------+---------------+ +|BuiltUp:ISU |Built Surfaces Index |Red, NIR | ++------------------------------+----------------------------------------------------------+---------------+ The application can be used as follows, which would produce an output image -containing 3 bands, respectively with the Vegetation:NDVI, Vegetation:RVI and -Vegetation:IPVI radiometric indices in this exact order: +containing 3 bands, respectively with the ``Vegetation:NDVI``, ``Vegetation:RVI`` and +``Vegetation:IPVI`` radiometric indices in this exact order: :: @@ -154,7 +179,7 @@ Vegetation:IPVI radiometric indices in this exact order: Vegetation:IPVI or as follows, which would produce a single band output image with the -Water:NDWI2 radiometric index: +``Water:NDWI2`` radiometric index: :: diff --git a/Documentation/Cookbook/rst/recipes/improc.rst b/Documentation/Cookbook/rst/recipes/improc.rst index 4216062f7ebafc55de4e5ab342b03cb90ffee1a6..72f24b429994e2f58729ff50b2773bb58bdf25b1 100644 --- a/Documentation/Cookbook/rst/recipes/improc.rst +++ b/Documentation/Cookbook/rst/recipes/improc.rst @@ -289,128 +289,3 @@ skipped. There is a cleanup option that can be disabled in order to check intermediate outputs of this composite application. - -Dempster Shafer based Classifier Fusion ---------------------------------------- - -This framework is dedicated to perform cartographic validation starting -from the result of a detection (for example a road extraction), enhance -the results viability by using a classifier fusion algorithm. Using a -set of descriptors, the processing chain validates or invalidates the -input geometrical features. - -Fuzzy Model (requisite) -~~~~~~~~~~~~~~~~~~~~~~~ - -The *DSFuzzyModelEstimation* application performs the fuzzy model -estimation (once by use case: descriptor set / Belief support / -Plausibility support). It has the following input parameters: - -- ``-psin`` a vector data of positive samples enriched according to the - “Compute Descriptors†part - -- ``-nsin`` a vector data of negative samples enriched according to the - “Compute Descriptors†part - -- ``-belsup`` a support for the Belief computation - -- ``-plasup`` a support for the Plausibility computation - -- ``-desclist`` an initialization model (xml file) or a descriptor name - list (listing the descriptors to be included in the model) - -The application can be used like this: - -:: - - otbcli_DSFuzzyModelEstimation -psin PosSamples.shp - -nsin NegSamples.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -desclist "NONDVI" "ROADSA" "NOBUIL" - -out FuzzyModel.xml - -The output file ``FuzzyModel.xml`` contains the optimal model to perform -information fusion. - -First Step: Compute Descriptors -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The first step in the classifier fusion based validation is to compute, -for each studied polyline, the chosen descriptors. In this context, the -*ComputePolylineFeatureFromImage* application can be used for a large -range of descriptors. It has the following inputs: - -- ``-in`` an image (of the studied scene) corresponding to the chosen - descriptor (NDVI, building Mask…) - -- ``-vd`` a vector data containing polyline of interest - -- ``-expr`` a formula (“b1 >0.4â€, “b1 == 0â€) where b1 is the standard - name of input image first band - -- ``-field`` a field name corresponding to the descriptor codename - (NONDVI, ROADSA...) - -The output is a vector data containing polylines with a new field -containing the descriptor value. In order to add the “NONDVI†descriptor -to an input vector data (“inVD.shpâ€) corresponding to the percentage of -pixels along a polyline that verifies the formula “NDVI >0.4â€: - -:: - - otbcli_ComputePolylineFeatureFromImage -in NDVI.TIF - -vd inVD.shp - -expr "b1 > 0.4" - -field "NONDVI" - -out VD_NONDVI.shp - -``NDVI.TIF`` is the NDVI mono band image of the studied scene. This step -must be repeated for each chosen descriptor: - -:: - - otbcli_ComputePolylineFeatureFromImage -in roadSpectralAngle.TIF - -vd VD_NONDVI.shp - -expr "b1 > 0.24" - -field "ROADSA" - -out VD_NONDVI_ROADSA.shp - -:: - - otbcli_ComputePolylineFeatureFromImage -in Buildings.TIF - -vd VD_NONDVI_ROADSA.shp - -expr "b1 == 0" - -field "NOBUILDING" - -out VD_NONDVI_ROADSA_NOBUIL.shp - -Both ``NDVI.TIF`` and ``roadSpectralAngle.TIF`` can be produced using -**Monteverdi** feature extraction capabilities, and ``Buildings.TIF`` -can be generated using **Monteverdi** rasterization module. From now on, -``VD_NONDVI_ROADSA_NOBUIL.shp`` contains three descriptor fields. It -will be used in the following part. - -Second Step: Feature Validation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The final application (*VectorDataDSValidation* ) will validate or -invalidate the studied samples using `the Dempster-Shafer -theory <http://en.wikipedia.org/wiki/Dempster%E2%80%93Shafer_theory>`_ -. Its inputs are: - -- ``-in`` an enriched vector data “VD\_NONDVI\_ROADSA\_NOBUIL.shp†- -- ``-belsup`` a support for the Belief computation - -- ``-plasup`` a support for the Plausibility computation - -- ``-descmod`` a fuzzy model FuzzyModel.xml - -The output is a vector data containing only the validated samples. - -:: - - otbcli_VectorDataDSValidation -in extractedRoads_enriched.shp - -descmod FuzzyModel.xml - -out validatedSamples.shp - diff --git a/Documentation/Cookbook/rst/templates/application.rst b/Documentation/Cookbook/rst/templates/application.rst index 68db4a8b3cc9c224fcdc107d8c4e3f9f21f97329..bbe15bceff737e5f165a2bdea7d4ea17771fcaab 100644 --- a/Documentation/Cookbook/rst/templates/application.rst +++ b/Documentation/Cookbook/rst/templates/application.rst @@ -1,6 +1,9 @@ .. _{label}: {heading} + +{deprecation_string} + {description} Description diff --git a/Examples/Application/ApplicationExample.cxx b/Examples/Application/ApplicationExample.cxx index 5baa6562e6c04b2d6fe6fdd2f1773413093c771d..b6ba4c772886fb887ee5ff0c0f85b831b1ac8f45 100644 --- a/Examples/Application/ApplicationExample.cxx +++ b/Examples/Application/ApplicationExample.cxx @@ -68,7 +68,6 @@ private: // \begin{description} // \item[\code{SetName()}] Name of the application. // \item[\code{SetDescription()}] Set the short description of the class. - // \item[\code{SetDocName()}] Set long name of the application (that can be displayed \dots). // \item[\code{SetDocLongDescription()}] This methods is used to describe the class. // \item[\code{SetDocLimitations()}] Set known limitations (threading, invalid pixel type \dots) or bugs. // \item[\code{SetDocAuthors()}] Set the application Authors. Author List. Format : "John Doe, Winnie the Pooh" \dots @@ -81,7 +80,6 @@ private: "Pay attention, it includes Latex snippets in order to generate " "software guide documentation"); - SetDocName("Example"); SetDocLongDescription( "The purpose of this application is " "to present parameters types," diff --git a/Examples/BasicFilters/BandMathFilterExample.cxx b/Examples/BasicFilters/BandMathFilterExample.cxx index 7404742ba2b75dd6eee7323870c5d7be7cdfd112..98d13618c6bac6176ee144408c22d09c60876769 100644 --- a/Examples/BasicFilters/BandMathFilterExample.cxx +++ b/Examples/BasicFilters/BandMathFilterExample.cxx @@ -22,22 +22,6 @@ ./BandMathFilterExample Input/qb_RoadExtract.tif Output/RoadExtractBandMath.tif Output/qb_BandMath-pretty.jpg */ - -// This filter is based on the mathematical parser library muParser. -// The built in functions and operators list is available at: -// http://muparser.sourceforge.net/mup_features.html. -// -// In order to use this filter, at least one input image should be -// set. An associated variable name can be specified or not by using -// the corresponding SetNthInput method. For the nth input image, if -// no associated variable name has been specified, a default variable -// name is given by concatenating the letter "b" (for band) and the -// corresponding input index. -// -// The next step is to set the expression according to the variable -// names. For example, in the default case with three input images the -// following expression is valid: ``(b1+b2)*b3``. - #include "itkMacro.h" #include <iostream> @@ -65,11 +49,10 @@ int main(int argc, char* argv[]) return EXIT_FAILURE; } - // We start by the typedef needed for reading and + // We start by the typedefs needed for reading and // writing the images. The BandMathImageFilter class // works with Image as input, so we need to define additional // filters to extract each layer of the multispectral image. - typedef double PixelType; typedef otb::VectorImage<PixelType, 2> InputImageType; typedef otb::Image<PixelType, 2> OutputImageType; @@ -78,13 +61,12 @@ int main(int argc, char* argv[]) typedef otb::ImageFileReader<InputImageType> ReaderType; typedef otb::ImageFileWriter<OutputImageType> WriterType; - // We can now define the type for the filter: + // We can now define the type for the filter typedef otb::BandMathImageFilter<OutputImageType> FilterType; - // We instantiate the filter, the reader, and the writer: + // We instantiate the filter, the reader, and the writer ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer = WriterType::New(); - FilterType::Pointer filter = FilterType::New(); writer->SetInput(filter->GetOutput()); @@ -93,9 +75,9 @@ int main(int argc, char* argv[]) reader->UpdateOutputInformation(); - // We now need to extract each band from the input \doxygen{otb}{VectorImage}, - // it illustrates the use of the \doxygen{otb}{VectorImageToImageList}. - // Each extracted layer is an input to the \doxygen{otb}{BandMathImageFilter}: + // We now need to extract each band from the input VectorImage, + // it illustrates the use of the VectorImageToImageList. + // Each extracted layer is an input to the BandMathImageFilter VectorImageToImageListType::Pointer imageList = VectorImageToImageListType::New(); imageList->SetInput(reader->GetOutput()); @@ -111,8 +93,8 @@ int main(int argc, char* argv[]) // Now we can define the mathematical expression to perform on the layers (b1, b2, b3, b4). // The filter takes advantage of the parsing capabilities of the muParser library and // allows setting the expression as on a digital calculator. - // - // The expression below returns 255 if the ratio $(NIR-RED)/(NIR+RED)$ is greater than 0.4 and 0 if not. + + // The expression below returns 255 if the ratio (NIR-RED)/(NIR+RED) is greater than 0.4 and 0 if not. filter->SetExpression("if((b4-b3)/(b4+b3) > 0.4, 255, 0)"); #ifdef OTB_MUPARSER_HAS_CXX_LOGICAL_OPERATORS @@ -125,19 +107,7 @@ int main(int argc, char* argv[]) writer->Update(); // The muParser library also provides the possibility to extend existing built-in functions. For example, - // you can use the OTB expression "ndvi(b3, b4)" with the filter. In this instance, the mathematical expression would be - // \textit{if($ndvi(b3, b4)>0.4$, 255, 0)}, which would return the same result. - - // Figure~\ref{fig:BandMathImageFilter} shows the result of the threshold applied to the NDVI index - // of a Quickbird image. - // \begin{figure} - // \center - // \includegraphics[width=0.45\textwidth]{qb_ExtractRoad_pretty.eps} - // \includegraphics[width=0.45\textwidth]{qb_BandMath-pretty.eps} - // \itkcaption[Band Math]{From left to right: - // Original image, thresholded NDVI index.} - // \label{fig:BandMathImageFilter} - // \end{figure} + // you can use the OTB expression "ndvi(b3, b4)" with the filter. In this instance, the mathematical expression would be "if(ndvi(b3, b4)>0.4, 255, 0)", which would return the same result. typedef otb::Image<unsigned char, 2> OutputPrettyImageType; typedef otb::ImageFileWriter<OutputPrettyImageType> PrettyImageFileWriterType; @@ -151,6 +121,4 @@ int main(int argc, char* argv[]) prettyWriter->SetFileName(argv[3]); prettyWriter->Update(); - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/BandMathFilterExample.rst b/Examples/BasicFilters/BandMathFilterExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..47da3da8989b1e399f5a20222c1529de6e44d757 --- /dev/null +++ b/Examples/BasicFilters/BandMathFilterExample.rst @@ -0,0 +1,27 @@ +The :doxygen:`BandMathImageFilter` is based on the mathematical parser library muParser. +The built in functions and operators list is available at: +http://muparser.sourceforge.net/mup_features.html. + +In order to use this filter, at least one input image should be +set. An associated variable name can be specified or not by using +the corresponding ``SetNthInput`` method. For the nth input image, if +no associated variable name has been specified, a default variable +name is given by concatenating the letter "b" (for band) and the +corresponding input index. + +The next step is to set the expression according to the variable +names. For example, in the default case with three input images the +following expression is valid: ``(b1+b2)*b3``. + +.. |image1| image:: /Input/qb_ExtractRoad_pretty.png + +.. |image2| image:: /Output/qb_BandMath-pretty.jpg + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + + NDVI of a Quickbird image computed with BandMathImageFilter + diff --git a/Examples/BasicFilters/DEMToRainbowExample.cxx b/Examples/BasicFilters/DEMToRainbowExample.cxx index f1cf3e83a3ca04a550f95b21bff3dbcbb325a763..fcceeae63cc27416400a727f6397176b82708a1c 100644 --- a/Examples/BasicFilters/DEMToRainbowExample.cxx +++ b/Examples/BasicFilters/DEMToRainbowExample.cxx @@ -33,19 +33,6 @@ ./DEMToRainbowExample Output/DEMToReliefImageGenerator.png 6.5 45.5 500 500 0.002 -0.002 Input/DEM_srtm relief */ - -// In some situation, it is desirable to represent a gray scale image in color for easier -// interpretation. This is particularly the case if pixel values in the image are used -// to represent some data such as elevation, deformation map, -// interferogram. In this case, it is important to ensure that similar -// values will get similar colors. You can notice how this requirement -// differs from the previous case. -// -// The following example illustrates the use of the \doxygen{otb}{DEMToImageGenerator} class -// combined with the \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}. You can refer to the -// source code or to section \ref{sec:ReadDEM} for the DEM conversion to image, -// we will focus on the color conversion part here. - #include "otbImageFileReader.h" #include "otbImageFileWriter.h" @@ -103,9 +90,9 @@ int main(int argc, char* argv[]) demToImage->SetOutputSpacing(spacing); - // As in the previous example, the \doxygen{itk}{ScalarToRGBColormapImageFilter} is + // The ScalarToRGBColormapImageFilter is // the filter in charge of calling the functor we specify to do the work for - // each pixel. Here it is the \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}. + // each pixel. Here it is the ScalarToRainbowRGBPixelFunctor. typedef itk::ScalarToRGBColormapImageFilter<ImageType, RGBImageType> ColorMapFilterType; ColorMapFilterType::Pointer colormapper = ColorMapFilterType::New(); @@ -146,34 +133,5 @@ int main(int argc, char* argv[]) writer->SetInput(colormapper->GetOutput()); - try - { - writer->Update(); - } - catch (itk::ExceptionObject& excep) - { - std::cerr << "Exception caught !" << std::endl; - std::cerr << excep << std::endl; - } - catch (...) - { - std::cout << "Unknown exception !" << std::endl; - return EXIT_FAILURE; - } - - // Figure~\ref{fig:RAINBOW_FILTER} shows the effect of applying the filter to - // a gray scale image. - // - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{pretty_DEMToImageGenerator.eps} - // \includegraphics[width=0.44\textwidth]{DEMToRainbowImageGenerator.eps} - // \includegraphics[width=0.44\textwidth]{DEMToHotImageGenerator.eps} - // \includegraphics[width=0.44\textwidth]{DEMToReliefImageGenerator.eps} - // \itkcaption[Grayscale to color]{The gray level DEM extracted from SRTM - // data (top-left) and the same area represented in color.} - // \label{fig:RAINBOW_FILTER} - // \end{figure} - - return EXIT_SUCCESS; + writer->Update(); } diff --git a/Examples/BasicFilters/DEMToRainbowExample.rst b/Examples/BasicFilters/DEMToRainbowExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..a1164c7cdf091ba8106c4c6161ce60a1c94d9a28 --- /dev/null +++ b/Examples/BasicFilters/DEMToRainbowExample.rst @@ -0,0 +1,23 @@ +In some situation, it is desirable to represent a gray scale image in color for easier +interpretation. This is particularly the case if pixel values in the image are used +to represent some data such as elevation, deformation map, +interferogram. In this case, it is important to ensure that similar +values will get similar colors. You can notice how this requirement +differs from the previous case. + +The following example illustrates the use of the :doxygen:`DEMToImageGenerator` +class combined with the `ScalarToRainbowRGBPixelFunctor`. You can refer to the +source code for the DEM conversion to image, we will focus on the color +conversion part here. + +.. |image1| image:: /Output/DEMToRainbowImageGenerator.png + +.. |image2| image:: /Output/DEMToHotImageGenerator.png + +.. |image3| image:: /Output/DEMToReliefImageGenerator.png + +.. _Figure1: + ++--------------------------+-------------------------+-------------------------+ +| |image1| | |image2| | |image3| | ++--------------------------+-------------------------+-------------------------+ diff --git a/Examples/BasicFilters/FrostImageFilter.cxx b/Examples/BasicFilters/FrostImageFilter.cxx index 13d12674854981e964a32c70fe8d60756cbb9681..913ac71a271f1fc1abb1b45243aacf1999da22e3 100644 --- a/Examples/BasicFilters/FrostImageFilter.cxx +++ b/Examples/BasicFilters/FrostImageFilter.cxx @@ -23,34 +23,6 @@ ./FrostImageFilter Input/GomaSmall.png Output/GomaSmallFrostFiltered.png 5 0.1 */ - -// This example illustrates the use of the \doxygen{otb}{FrostImageFilter}. -// This filter belongs to the family of the edge-preserving smoothing -// filters which are usually used for speckle reduction in radar -// images. -// -// This filter uses a negative exponential convolution kernel. -// The output of the filter for pixel p is: -// $ \hat I_{s}=\sum_{p\in\eta_{p}} m_{p}I_{p} $ -// -// where : $ m_{p}=\frac{KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})}{\sum_{p\in\eta_{p}} KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})} $ -// and $ d_{s, p}=\sqrt{(i-i_{p})^2+(j-j_{p})^2} $ -// -// \begin{itemize} -// \item $ K $ : the decrease coefficient -// \item $ (i, j)$ : the coordinates of the pixel inside the region -// defined by $ \eta_{s} $ -// \item $ (i_{p}, j_{p})$ : the coordinates of the pixels belonging to $ \eta_{p} \subset \eta_{s} $ -// \item $ C_{s}$ : the variation coefficient computed over $ \eta_{p}$ -// \end{itemize} -// -// -// -// Most of this example is similar to the previous one and only the differences -// will be highlighted. -// -// First, we need to include the header: - #include "otbFrostImageFilter.h" #include "otbImage.h" @@ -68,16 +40,12 @@ int main(int argc, char* argv[]) } typedef unsigned char PixelType; - typedef otb::Image<PixelType, 2> InputImageType; typedef otb::Image<PixelType, 2> OutputImageType; - // The filter can be instantiated using the image types defined previously. - + // The filter can be instantiated using the image types defined previously. typedef otb::FrostImageFilter<InputImageType, OutputImageType> FilterType; - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; ReaderType::Pointer reader = ReaderType::New(); @@ -87,22 +55,12 @@ int main(int argc, char* argv[]) writer->SetInput(filter->GetOutput()); reader->SetFileName(argv[1]); - // The image obtained with the reader is passed as input to the - // \doxygen{otb}{FrostImageFilter}. - // - // \index{otb::FrostImageFilter!SetInput()} - // \index{otb::FileImageReader!GetOutput()} - + // The image obtained with the reader is passed as input to the FrostImageFilter filter->SetInput(reader->GetOutput()); - // The method \code{SetRadius()} defines the size of the window to - // be used for the computation of the local statistics. The method - // \code{SetDeramp()} sets the $K$ coefficient. - // - // \index{otb::FrostImageFilter!SetRadius()} - // \index{otb::FrostImageFilter!SetDeramp()} - // \index{SetDeramp()!otb::FrostImageFilter} - + // The method SetRadius() defines the size of the window to + // be used for the computation of the local statistics. The method + // SetDeramp() sets the K coefficient. FilterType::SizeType Radius; Radius[0] = atoi(argv[3]); Radius[1] = atoi(argv[3]); @@ -112,22 +70,4 @@ int main(int argc, char* argv[]) writer->SetFileName(argv[2]); writer->Update(); - - // Figure~\ref{fig:FROST_FILTER} shows the result of applying the Frost - // filter to a SAR image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{GomaSmall.eps} - // \includegraphics[width=0.44\textwidth]{GomaSmallFrostFiltered.eps} - // \itkcaption[Frost Filter Application]{Result of applying the - // \doxygen{otb}{FrostImageFilter} to a SAR image.} - // \label{fig:FROST_FILTER} - // \end{figure} - // - // \relatedClasses - // \begin{itemize} - // \item \doxygen{otb}{LeeImageFilter} - // \end{itemize} - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/FrostImageFilter.rst b/Examples/BasicFilters/FrostImageFilter.rst new file mode 100644 index 0000000000000000000000000000000000000000..2951e334e7a6c3c7d087e6ae37ad8c05d8c880bc --- /dev/null +++ b/Examples/BasicFilters/FrostImageFilter.rst @@ -0,0 +1,34 @@ +This example illustrates the use of the :doxygen:`FrostImageFilter`. +This filter belongs to the family of the edge-preserving smoothing +filters which are usually used for speckle reduction in radar +images. + +This filter uses a negative exponential convolution kernel. +The output of the filter for pixel p is: + +.. math:: + + \hat I_{s}=\sum_{p\in\eta_{p}} m_{p}I_{p} + + m_{p}=\frac{KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})}{\sum_{p\in\eta_{p}} KC_{s}^{2}\exp(-KC_{s}^{2}d_{s, p})} + + d_{s, p}=\sqrt{(i-i_{p})^2+(j-j_{p})^2} + +where: + +* :math:`K`: the decrease coefficient +* :math:`(i, j)`: the coordinates of the pixel inside the region defined by :math:`\eta_{s}` +* :math:`(i_{p}, j_{p})`: the coordinates of the pixels belonging to :math:`\eta_{p} \subset \eta_{s}` +* :math:`C_{s}`: the variation coefficient computed over :math:`\eta_{p}` + +.. |image1| image:: /Input/GomaSmall.png + +.. |image2| image:: /Output/GomaSmallFrostFiltered.png + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + + Result of applying the FrostImageFilter to a SAR image. diff --git a/Examples/BasicFilters/HillShadingExample.cxx b/Examples/BasicFilters/HillShadingExample.cxx index 1d58ca2f68482dc62bdfe16e8fca5e4a9ce76668..a281e9aef85d86116d5ca7c35b719cbd832e9e19 100644 --- a/Examples/BasicFilters/HillShadingExample.cxx +++ b/Examples/BasicFilters/HillShadingExample.cxx @@ -24,18 +24,6 @@ */ -// Visualization of digital elevation models (DEM) is often more intuitive by simulating a -// lighting source and generating the corresponding shadows. This principle is called -// hill shading. -// -// Using a simple functor \doxygen{otb}{HillShadingFunctor} and the DEM image generated -// using the \doxygen{otb}{DEMToImageGenerator} (refer to \ref{sec:ReadDEM}), you can easily -// obtain a representation of the DEM. Better yet, using the -// \doxygen{otb}{ScalarToRainbowRGBPixelFunctor}, combined with the -// \doxygen{otb}{ReliefColormapFunctor} you can easily generate the classic elevation maps. -// -// This example will focus on the shading itself. - #include "otbImageFileReader.h" #include "otbImageFileWriter.h" @@ -50,7 +38,6 @@ int main(int argc, char* argv[]) { - if (argc < 10) { std::cout << argv[0] << " <output_filename> <output_color_filename> " @@ -162,21 +149,8 @@ int main(int argc, char* argv[]) writer2->SetInput(multiply->GetOutput()); - try - { - writer->Update(); - writer2->Update(); - } - catch (itk::ExceptionObject& excep) - { - std::cerr << "Exception caught !" << std::endl; - std::cerr << excep << std::endl; - } - catch (...) - { - std::cout << "Unknown exception !" << std::endl; - return EXIT_FAILURE; - } + writer->Update(); + writer2->Update(); otb::WorldFile::Pointer worldFile = otb::WorldFile::New(); worldFile->SetLonOrigin(origin[0]); @@ -188,17 +162,4 @@ int main(int argc, char* argv[]) worldFile->Update(); worldFile->SetImageFilename(argv[2]); worldFile->Update(); - - // Figure~\ref{fig:HILL_SHADING} shows the hill shading result from SRTM data. - // - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{HillShadingExample.eps} - // \includegraphics[width=0.44\textwidth]{HillShadingColorExample.eps} - // \itkcaption[Hill shading]{Hill shading obtained from SRTM data (left) and combined with - // the color representation (right)} - // \label{fig:HILL_SHADING} - // \end{figure} - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/HillShadingExample.rst b/Examples/BasicFilters/HillShadingExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..98e95d368c9306e06501e696483d743a41c01700 --- /dev/null +++ b/Examples/BasicFilters/HillShadingExample.rst @@ -0,0 +1,23 @@ +Visualization of digital elevation models (DEM) is often more intuitive by +simulating a lighting source and generating the corresponding shadows. This +principle is called hill shading. + +Using :doxygen:`HillShadingFilter` and the DEM image generated +using the :doxygen:`DEMToImageGenerator`, you can easily obtain a representation +of the DEM. Better yet, using the :doxygen-itk:`ScalarToRGBColormapImageFilter` +combined with the ``ReliefColormapFunctor`` you can easily generate the +classic elevation maps. + +This example will focus on the shading itself. + +.. |image1| image:: /Output/HillShadingExample.png + +.. |image2| image:: /Output/HillShadingColorExample.png + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + + Hill shading obtained from SRTM data (left) and combined with the color representation (right) diff --git a/Examples/BasicFilters/IndexedToRGBExample.cxx b/Examples/BasicFilters/IndexedToRGBExample.cxx index adba63456d9ca821727c58f18b15b81477c563f0..d7a8226949d33aa41c6e1a43f8c0ed00dc8f453b 100644 --- a/Examples/BasicFilters/IndexedToRGBExample.cxx +++ b/Examples/BasicFilters/IndexedToRGBExample.cxx @@ -24,25 +24,11 @@ */ -// Some algorithms produce an indexed image as output. In such images, -// each pixel is given a value according to the region number it belongs to. -// This value starting at 0 or 1 is usually an integer value. -// Often, such images are produced by segmentation or classification algorithms. -// -// If such regions are easy to manipulate -- it is easier and faster to compare two integers -// than a RGB value -- it is different when it comes to displaying the results. -// -// Here we present a convient way to convert such indexed image to a color image. In -// such conversion, it is important to ensure that neighborhood region, which are -// likely to have consecutive number have easily dicernable colors. This is done -// randomly using a hash function by the \doxygen{itk}{ScalarToRGBPixelFunctor}. - #include "otbImage.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" #include "itkUnaryFunctorImageFilter.h" #include "itkScalarToRGBPixelFunctor.h" - #include "itkRescaleIntensityImageFilter.h" int main(int argc, char* argv[]) @@ -65,10 +51,8 @@ int main(int argc, char* argv[]) reader->SetFileName(inputFilename); - // The \doxygen{itk}{UnaryFunctorImageFilter} is the filter in charge of - // calling the functor we specify to do the work for each pixel. Here it is the - // \doxygen{itk}{ScalarToRGBPixelFunctor}. - + // The UnaryFunctorImageFilter is the filter in charge of calling the functor + // we specify to do the work for each pixel. Here it is the ScalarToRGBPixelFunctor typedef itk::Functor::ScalarToRGBPixelFunctor<unsigned long> ColorMapFunctorType; typedef itk::UnaryFunctorImageFilter<ImageType, RGBImageType, ColorMapFunctorType> ColorMapFilterType; ColorMapFilterType::Pointer colormapper = ColorMapFilterType::New(); @@ -93,17 +77,4 @@ int main(int argc, char* argv[]) writer2->SetFileName(outputScaledFilename); writer2->SetInput(rescaler->GetOutput()); writer2->Update(); - - // Figure~\ref{fig:INDEXTORGB_FILTER} shows the result of the conversion - // from an indexed image to a color image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{buildingExtractionIndexed_scaled.eps} - // \includegraphics[width=0.44\textwidth]{buildingExtractionRGB.eps} - // \itkcaption[Scaling images]{The original indexed image (left) and the - // conversion to color image.} - // \label{fig:INDEXTORGB_FILTER} - // \end{figure} - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/IndexedToRGBExample.rst b/Examples/BasicFilters/IndexedToRGBExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..b9c02e70cc8661bed202df3aecf4e2bb90196459 --- /dev/null +++ b/Examples/BasicFilters/IndexedToRGBExample.rst @@ -0,0 +1,24 @@ +Some algorithms produce an indexed image as output. In such images, +each pixel is given a value according to the region number it belongs to. +This value starting at 0 or 1 is usually an integer value. +Often, such images are produced by segmentation or classification algorithms. + +If such regions are easy to manipulate -- it is easier and faster to compare two integers +than a RGB value -- it is different when it comes to displaying the results. + +Here we present a convient way to convert such indexed image to a color image. In +such conversion, it is important to ensure that neighboring regions, which are +likely to have consecutive number have easily dicernable colors. This is done +randomly using a hash function by ``ScalarToRGBPixelFunctor``. + +.. |image1| image:: /Output/buildingExtractionIndexed_scaled.png + +.. |image2| image:: /Output/buildingExtractionRGB.png + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + + The original indexed image (left) and the conversion to color image. diff --git a/Examples/BasicFilters/LeeImageFilter.cxx b/Examples/BasicFilters/LeeImageFilter.cxx index fee4c62c8772beb4c285aa855faaca4dcbc88579..d8c7aa947db0bbde16790f0024a444c1deb3c40c 100644 --- a/Examples/BasicFilters/LeeImageFilter.cxx +++ b/Examples/BasicFilters/LeeImageFilter.cxx @@ -47,16 +47,16 @@ int main(int argc, char* argv[]) // The filter can be instantiated using the image types defined above. typedef otb::LeeImageFilter<InputImageType, OutputImageType> FilterType; - // An ImageFileReader class is also instantiated in order to read - // image data from a file. + // An ImageFileReader class is also instantiated in order to read + // image data from a file. typedef otb::ImageFileReader<InputImageType> ReaderType; - // An \doxygen{otb}{ImageFileWriter} is instantiated in order to write the + // An ImageFileWriter is instantiated in order to write the // output image to a file. typedef otb::ImageFileWriter<OutputImageType> WriterType; - // Both the filter and the reader are created by invoking their \code{New()} - // methods and assigning the result to SmartPointers. + // Both the filter and the reader are created by invoking their New() + // methods and assigning the result to SmartPointers. ReaderType::Pointer reader = ReaderType::New(); FilterType::Pointer filter = FilterType::New(); @@ -64,8 +64,8 @@ int main(int argc, char* argv[]) writer->SetInput(filter->GetOutput()); reader->SetFileName(argv[1]); - // The image obtained with the reader is passed as input to the - // LeeImageFilter. + // The image obtained with the reader is passed as input to the + // LeeImageFilter. filter->SetInput(reader->GetOutput()); // The method SetRadius() defines the size of the window to diff --git a/Examples/BasicFilters/LeeImageFilter.rst b/Examples/BasicFilters/LeeImageFilter.rst index bb34942a9ec560a722e01b71309dc570862d30b1..612bd8eb9ea84d5ced38c4dc92151aa77815c598 100644 --- a/Examples/BasicFilters/LeeImageFilter.rst +++ b/Examples/BasicFilters/LeeImageFilter.rst @@ -1,12 +1,19 @@ -This example illustrates the use of the LeeImageFilter. +This example illustrates the use of the :doxygen:`LeeImageFilter`. This filter belongs to the family of the edge-preserving smoothing filters which are usually used for speckle reduction in radar images. The LeeFilter aplies a linear regression which minimizes the mean-square error in the frame of a multiplicative speckle model. -.. figure:: /Input/GomaSmall.png +.. |image1| image:: /Input/GomaSmall.png -.. figure:: /Output/GomaSmallLeeFiltered.png +.. |image2| image:: /Output/GomaSmallLeeFiltered.png + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ Result of applying the Lee filter to a SAR image. + diff --git a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx index f3992ead4089875bee8132029e4278585e214d66..9e665a35f21b216bc11ea6f433a1534233ee0f5e 100644 --- a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx +++ b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.cxx @@ -32,29 +32,15 @@ 0.1 */ - -// This example demonstrates the use of the -// \doxygen{otb}{MeanShiftSegmentationFilter} class which implements -// filtering and clustering using the mean shift algorithm -// \cite{Comaniciu2002}. For a given pixel, the mean shift will -// build a set of neighboring pixels within a given spatial radius -// and a color range. The spatial and color center of this set is -// then computed and the algorithm iterates with this new spatial and -// color center. The Mean Shift can be used for edge-preserving -// smoothing, or for clustering. - #include "otbVectorImage.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" #include "otbImageFileWriter.h" #include "otbPrintableImageFilter.h" - #include "itkScalarToRGBPixelFunctor.h" #include "itkUnaryFunctorImageFilter.h" - -// We start by including the needed header file. - #include "otbMeanShiftSegmentationFilter.h" + int main(int argc, char* argv[]) { if (argc != 11) @@ -75,9 +61,6 @@ int main(int argc, char* argv[]) const unsigned int maxiter = atoi(argv[9]); const double thres = atof(argv[10]); - // We start by the classical \code{typedef}s needed for reading and - // writing the images. - const unsigned int Dimension = 2; typedef float PixelType; @@ -94,36 +77,39 @@ int main(int argc, char* argv[]) typedef otb::MeanShiftSegmentationFilter<ImageType, LabelImageType, ImageType> FilterType; - // We instantiate the filter, the reader, and 2 writers (for the - // labeled and clustered images). + // We instantiate the filter, the reader, and 2 writers (for the + // labeled and clustered images). FilterType::Pointer filter = FilterType::New(); ReaderType::Pointer reader = ReaderType::New(); WriterType::Pointer writer1 = WriterType::New(); LabelWriterType::Pointer writer2 = LabelWriterType::New(); - // We set the file names for the reader and the writers: - + // We set the file names for the reader and the writers: reader->SetFileName(infname); writer1->SetFileName(clusteredfname); writer2->SetFileName(labeledfname); - // We can now set the parameters for the filter. There are 3 main - // parameters: the spatial radius used for defining the neighborhood, - // the range radius used for defining the interval in the color space - // and the minimum size for the regions to be kept after clustering. + // We can now set the parameters for the filter. There are 3 main + // parameters: the spatial radius used for defining the neighborhood, + // the range radius used for defining the interval in the color space + // and the minimum size for the regions to be kept after clustering. filter->SetSpatialBandwidth(spatialRadius); filter->SetRangeBandwidth(rangeRadius); filter->SetMinRegionSize(minRegionSize); - // Two another parameters can be set : the maximum iteration number, which defines maximum number of iteration until convergence. - // Algorithm iterative scheme will stop if convergence hasn't been reached after the maximum number of iterations. - // Threshold parameter defines mean-shift vector convergence value. Algorithm iterative scheme will stop if mean-shift vector is below this threshold or if - // iteration number reached maximum number of iterations. + + // Two another parameters can be set: the maximum iteration number, which + // defines maximum number of iteration until convergence. Algorithm + // iterative scheme will stop if convergence hasn't been reached after the + // maximum number of iterations. Threshold parameter defines mean-shift + // vector convergence value. Algorithm iterative scheme will stop if + // mean-shift vector is below this threshold or if iteration number reached + // maximum number of iterations. filter->SetMaxIterationNumber(maxiter); filter->SetThreshold(thres); - // We can now plug the pipeline and run it. + // We can now plug the pipeline and run it. filter->SetInput(reader->GetOutput()); writer1->SetInput(filter->GetClusteredOutput()); @@ -132,19 +118,6 @@ int main(int argc, char* argv[]) writer1->Update(); writer2->Update(); - // Figure~\ref{fig:MeanShiftSegmentationFilter} shows the result of applying the mean shift - // to a Quickbird image. - // \begin{figure} - // \center - // \includegraphics[width=0.40\textwidth]{ROI_QB_MUL_1.eps} - // \includegraphics[width=0.40\textwidth]{MSClusteredOutput-pretty.eps} - // \includegraphics[width=0.40\textwidth]{MSLabeledOutput-pretty.eps} - // \itkcaption[Mean Shift]{From top to bottom and left to right: - // Original image, image filtered by - // mean shift after clustering , and labeled image.} - // \label{fig:MeanShiftSegmentationFilter} - // \end{figure} - typedef otb::PrintableImageFilter<ImageType> PrintableFilterType; PrintableFilterType::Pointer printableImageFilter = PrintableFilterType::New(); @@ -176,6 +149,4 @@ int main(int argc, char* argv[]) labelRGBWriter->SetFileName(labeledpretty); labelRGBWriter->SetInput(labelToRGB->GetOutput()); labelRGBWriter->Update(); - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..48e8fc09402b1907bc67ae3c8099dbbb2170cc9c --- /dev/null +++ b/Examples/BasicFilters/MeanShiftSegmentationFilterExample.rst @@ -0,0 +1,21 @@ +This example demonstrates the use of the :doxygen:`MeanShiftSegmentationFilter` +class which implements filtering and clustering using the mean shift algorithm. +For a given pixel, the mean shift will build a set of neighboring pixels within +a given spatial radius and a color range. The spatial and color center of this +set is then computed and the algorithm iterates with this new spatial and color +center. The Mean Shift can be used for edge-preserving smoothing, or for +clustering. + +.. |image1| image:: /Input/ROI_QB_MUL_1.png + +.. |image2| image:: /Output/MSClusteredOutput-pretty.png + +.. |image3| image:: /Output/MSLabeledOutput-pretty.png + +.. _Figure1: + ++--------------------------+-------------------------+-------------------------+ +| |image1| | |image2| | |image3| | ++--------------------------+-------------------------+-------------------------+ + + Original image, image filtered by mean shift after clustering, and labeled image. diff --git a/Examples/BasicFilters/PrintableImageFilterExample.cxx b/Examples/BasicFilters/PrintableImageFilterExample.cxx index abe40efdbbb6d00a6e6009e7296ddb5882feb802..f632da523ccbc7faa000df846524fe12d88f3f65 100644 --- a/Examples/BasicFilters/PrintableImageFilterExample.cxx +++ b/Examples/BasicFilters/PrintableImageFilterExample.cxx @@ -29,30 +29,6 @@ */ -// Most of the time, satellite images have more than three spectral bands. As we -// are only able to see three colors (red, green and blue), we have to find a way to -// represent these images using only three bands. This is called creating a color -// composition. -// -// Of course, any color composition will not be able to render all the information -// available in the original image. As a consequence, sometimes, creating more than -// one color composition will be necessary. -// -// If you want to obtain an image with natural colors, you have to match the wavelength -// captured by the satellite with those captured by your eye: thus matching the red band -// with the red color, etc. -// -// Some satellites (SPOT 5 is an example) do not acquire all the {\em human} spectral bands: -// the blue can be missing and replaced by some other wavelength of interest for a specific application. -// In these situations, another mapping has to be created. That's why, the vegetation often appears in -// red in satellite images (see on left of figure~\ref{fig:PRINTABLE_FILTER}). -// -// The band order in the image products can be also quite tricky. It could be in the wavelength order, -// as it is the case for Quickbird (1: Blue, 2: Green, 3: Red, 4: NIR), in this case, you -// have to be careful to reverse the order if you want a natural display. It could also be reverse -// to facilitate direct viewing, as for SPOT5 (1: NIR, 2: Red, 3: Green, 4: SWIR) but in this situations -// you have to be careful when you process the image. - #include "otbVectorImage.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" @@ -84,9 +60,8 @@ int main(int argc, char* argv[]) ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(inputFilename); - // To easily convert the image to a {\em printable} format, i.e. 3 bands - // \code{unsigned char} value, you can use the \doxygen{otb}{PrintableImageFilter}. - + // To easily convert the image to a printable format, i.e. 3 bands + // unsigned char value, you can use the PrintableImageFilter. typedef otb::PrintableImageFilter<InputImageType> PrintableFilterType; PrintableFilterType::Pointer printableImageFilter = PrintableFilterType::New(); @@ -95,9 +70,8 @@ int main(int argc, char* argv[]) printableImageFilter->SetChannel(greenChannelNumber); printableImageFilter->SetChannel(blueChannelNumber); - // When you create the writer to plug at the output of the \code{printableImageFilter} + // When you create the writer to plug at the output of the printableImageFilter // you may want to use the direct type definition as it is a good way to avoid mismatch: - typedef PrintableFilterType::OutputImageType OutputImageType; typedef otb::ImageFileWriter<OutputImageType> WriterType; @@ -106,17 +80,4 @@ int main(int argc, char* argv[]) writer->SetInput(printableImageFilter->GetOutput()); writer->Update(); - - // Figure~\ref{fig:PRINTABLE_FILTER} illustrates different color compositions for a SPOT 5 image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{PrintableExampleOutput1.eps} - // \includegraphics[width=0.44\textwidth]{PrintableExampleOutput2.eps} - // \itkcaption[Scaling images]{On the left, a classic SPOT5 - // combination: XS3 in red, XS2 in green and XS1 in blue. On the - // right another composition: XS3 in red, XS4 in green and XS2 in blue.} - // \label{fig:PRINTABLE_FILTER} - // \end{figure} - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/PrintableImageFilterExample.rst b/Examples/BasicFilters/PrintableImageFilterExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..9c503fa73bb81e54857e01cdac3e3fce27c071bf --- /dev/null +++ b/Examples/BasicFilters/PrintableImageFilterExample.rst @@ -0,0 +1,37 @@ +Most of the time, satellite images have more than three spectral bands. As we +are only able to see three colors (red, green and blue), we have to find a way +to represent these images using only three bands. This is called creating a +color composition. + +Of course, any color composition will not be able to render all the information +available in the original image. As a consequence, sometimes, creating more than +one color composition will be necessary. + +If you want to obtain an image with natural colors, you have to match the +wavelength captured by the satellite with those captured by your eye: thus +matching the red band with the red color, etc. + +Some satellites (SPOT 5 is an example) do not acquire all the visible +spectral bands: the blue can be missing and replaced by some other wavelength of +interest for a specific application. In these situations, another mapping has +to be created. That's why the vegetation often appears in red in satellite +images. + +The band order in the image products can be also quite tricky. It could be in +the wavelength order, as it is the case for Quickbird (1: Blue, 2: Green, 3: +Red, 4: NIR), in this case, you have to be careful to reverse the order if you +want a natural display. It could also be reverse to facilitate direct viewing, +as for SPOT5 (1: NIR, 2: Red, 3: Green, 4: SWIR) but in this situations you have +to be careful when you process the image. + +.. |image1| image:: /Output/PrintableExampleOutput1.jpg + +.. |image2| image:: /Output/PrintableExampleOutput2.jpg + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + +On the left, a classic SPOT5 combination: XS3 in red, XS2 in green and XS1 in blue. On the right another composition: XS3 in red, XS4 in green and XS2 in blue. diff --git a/Examples/BasicFilters/ScalingFilterExample.cxx b/Examples/BasicFilters/ScalingFilterExample.cxx index 174fa6699ca6a13dfd88f1d28c79e03ca960d1b5..feef4ec7231e8f0e1a456196a52b04e59daa7f1e 100644 --- a/Examples/BasicFilters/ScalingFilterExample.cxx +++ b/Examples/BasicFilters/ScalingFilterExample.cxx @@ -23,13 +23,6 @@ ./ScalingFilterExample Input/QB_Toulouse_Ortho_PAN.tif Output/QB_Toulouse_Ortho_PAN_rescaled.png Output/QB_Toulouse_Ortho_PAN_casted.png */ - -// On one hand, satellite images are commonly coded on more than 8 bits to provide -// the dynamic range required from shadows to clouds. On the other hand, image formats -// in use for printing and display are usually limited to 8 bits. We need to convert the value -// to enable a proper display. This is usually done using linear scaling. Of course, you have -// to be aware that some information is lost in the process. - #include "otbImage.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" @@ -56,8 +49,7 @@ int main(int argc, char* argv[]) ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(argv[1]); - // The \doxygen{itk}{RescaleIntensityImageFilter} is used to rescale the value: - + // The RescaleIntensityImageFilter is used to rescale the value typedef itk::RescaleIntensityImageFilter<InputImageType, OutputImageType> RescalerType; RescalerType::Pointer rescaler = RescalerType::New(); rescaler->SetInput(reader->GetOutput()); @@ -75,20 +67,4 @@ int main(int argc, char* argv[]) writer->SetFileName(argv[3]); writer->SetInput(caster->GetOutput()); writer->Update(); - - // Figure~\ref{fig:SCALING_FILTER} illustrates the difference between a proper scaling and - // a simple truncation of the value and demonstrates why it is - // important to keep this in mind. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{QB_Toulouse_Ortho_PAN_casted.eps} - // \includegraphics[width=0.44\textwidth]{QB_Toulouse_Ortho_PAN_rescaled.eps} - // \itkcaption[Scaling images]{On the left, the image obtained by truncated pixel values - // at the dynamic acceptable for a png file (between 0 and 255). On the right, - // the same image with - // a proper rescaling} - // \label{fig:SCALING_FILTER} - // \end{figure} - - return EXIT_SUCCESS; } diff --git a/Examples/BasicFilters/ScalingFilterExample.rst b/Examples/BasicFilters/ScalingFilterExample.rst new file mode 100644 index 0000000000000000000000000000000000000000..a284ff97abf3eef2c906d4040e28990aa48acad1 --- /dev/null +++ b/Examples/BasicFilters/ScalingFilterExample.rst @@ -0,0 +1,17 @@ +On one hand, satellite images are commonly coded on more than 8 bits to provide +the dynamic range required from shadows to clouds. On the other hand, image formats +in use for printing and display are usually limited to 8 bits. We need to convert the value +to enable a proper display. This is usually done using linear scaling. Of course, you have +to be aware that some information is lost in the process. + +.. |image1| image:: /Output/QB_Toulouse_Ortho_PAN_casted.png + +.. |image2| image:: /Output/QB_Toulouse_Ortho_PAN_rescaled.png + +.. _Figure1: + ++--------------------------+-------------------------+ +| |image1| | |image2| | ++--------------------------+-------------------------+ + + On the left, the image obtained by truncated pixel values at the dynamic acceptable for a png file (between 0 and 255). On the right, the same image with a proper rescaling. diff --git a/Examples/FeatureExtraction/CMakeLists.txt b/Examples/FeatureExtraction/CMakeLists.txt index 19c504f658d111d89bbd3a107d495d0989e3d003..5d48aead0da95f1391506976bcfeb80c37083e36 100644 --- a/Examples/FeatureExtraction/CMakeLists.txt +++ b/Examples/FeatureExtraction/CMakeLists.txt @@ -38,18 +38,6 @@ target_link_libraries(CorrelationLineDetectorExample ${OTB_LIBRARIES}) add_executable(EdgeDensityExample EdgeDensityExample.cxx) target_link_libraries(EdgeDensityExample ${OTB_LIBRARIES}) -#OTBRoadExtraction depends OTBMathParser. But OTB_USE_MUPARSER is OFF -if(OTBMathParser_LOADED) -add_executable(ExtractRoadByStepsExample ExtractRoadByStepsExample.cxx) -target_link_libraries(ExtractRoadByStepsExample ${OTB_LIBRARIES}) - -add_executable(ExtractRoadExample ExtractRoadExample.cxx) -target_link_libraries(ExtractRoadExample ${OTB_LIBRARIES}) - -add_executable(ParallelLineDetectionExample ParallelLineDetectionExample.cxx) -target_link_libraries(ParallelLineDetectionExample ${OTB_LIBRARIES}) -endif() - add_executable(FlusserMomentsImageFunctionExample FlusserMomentsImageFunctionExample.cxx) target_link_libraries(FlusserMomentsImageFunctionExample ${OTB_LIBRARIES}) @@ -71,12 +59,6 @@ target_link_libraries(PanTexExample ${OTB_LIBRARIES}) add_executable(RatioLineDetectorExample RatioLineDetectorExample.cxx) target_link_libraries(RatioLineDetectorExample ${OTB_LIBRARIES}) -add_executable(SeamCarvingExample SeamCarvingExample.cxx) -target_link_libraries(SeamCarvingExample ${OTB_LIBRARIES}) - -add_executable(SeamCarvingOtherExample SeamCarvingOtherExample.cxx) -target_link_libraries(SeamCarvingOtherExample ${OTB_LIBRARIES}) - add_executable(SFSExample SFSExample.cxx) target_link_libraries(SFSExample ${OTB_LIBRARIES}) diff --git a/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx b/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx deleted file mode 100644 index 54891d83c85169c20f0e82311a78b2d4aba5f986..0000000000000000000000000000000000000000 --- a/Examples/FeatureExtraction/ExtractRoadByStepsExample.cxx +++ /dev/null @@ -1,414 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// This example illustrates the details of the \doxygen{otb}{RoadExtractionFilter}. -// This filter, described in the previous section, is a composite filter that includes -// all the steps below. Individual filters can be replaced to design a road detector -// targeted at SAR images for example. - -#include "otbPolyLineParametricPathWithValue.h" -#include "otbSpectralAngleDistanceImageFilter.h" -#include "itkGradientRecursiveGaussianImageFilter.h" -#include "otbNeighborhoodScalarProductFilter.h" -#include "otbRemoveIsolatedByDirectionFilter.h" -#include "otbRemoveWrongDirectionFilter.h" -#include "otbNonMaxRemovalByDirectionFilter.h" -#include "otbVectorizationPathListFilter.h" -#include "otbSimplifyPathListFilter.h" -#include "otbBreakAngularPathListFilter.h" -#include "otbRemoveTortuousPathListFilter.h" -#include "otbLinkPathListFilter.h" -#include "otbLikelihoodPathListFilter.h" -#include "otbDrawPathListFilter.h" -#include "otbLikelihoodPathListFilter.h" -#include "otbMultiToMonoChannelExtractROI.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkRescaleIntensityImageFilter.h" -#include "itkSqrtImageFilter.h" - -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbMultiChannelExtractROI.h" -#include "otbVectorRescaleIntensityImageFilter.h" -#include "itkAddImageFilter.h" -#include "itkSubtractImageFilter.h" -#include "itkRGBPixel.h" -#include "itkComposeImageFilter.h" -#include "itkThresholdImageFilter.h" -#include "itkSigmoidImageFilter.h" -#include "itkThresholdImageFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "itkGrayscaleDilateImageFilter.h" - -/* Example usage: -./ExtractRoadByStepsExample Input/qb_RoadExtract.tif Output/ExtractRoadByStepsExampleOutput.jpg Output/qb_ExtractRoad_pretty.jpg 337 557 432 859 0.00005 1.0 -*/ - -/* Example usage: -./ExtractRoadByStepsExample Input/qb_RoadExtract2.tif Output/ExtractRoadByStepsExampleOutput2.jpg Output/qb_ExtractRoad_pretty2.jpg 228 316 207 282 0.00005 1.0 -*/ - - -int main(int itkNotUsed(argc), char* argv[]) -{ - - const unsigned int Dimension = 2; - typedef double PixelType; - typedef unsigned char OutputPixelType; - typedef itk::CovariantVector<PixelType, Dimension> VectorPixelType; - typedef otb::Image<PixelType, Dimension> InternalImageType; - typedef otb::VectorImage<PixelType, Dimension> MultiSpectralImageType; - typedef otb::Image<VectorPixelType, Dimension> VectorImageType; - - typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType; - - typedef otb::ImageFileReader<MultiSpectralImageType> MultispectralReaderType; - - MultispectralReaderType::Pointer multispectralReader = MultispectralReaderType::New(); - multispectralReader->SetFileName(argv[1]); - - // Create an 3 band image for the software guide - typedef otb::VectorImage<OutputPixelType, Dimension> OutputVectorImageType; - typedef otb::ImageFileWriter<OutputVectorImageType> VectorWriterType; - typedef otb::VectorRescaleIntensityImageFilter<MultiSpectralImageType, OutputVectorImageType> VectorRescalerType; - typedef otb::MultiChannelExtractROI<unsigned char, unsigned char> ChannelExtractorType; - - // The GenerateOutputInformation() information is required here so - // that the number of component per pixel is update and known to set - // up the maximum and minimum values for the rescaling filter - multispectralReader->GenerateOutputInformation(); - - OutputVectorImageType::PixelType minimum, maximum; - minimum.SetSize(multispectralReader->GetOutput()->GetNumberOfComponentsPerPixel()); - maximum.SetSize(multispectralReader->GetOutput()->GetNumberOfComponentsPerPixel()); - minimum.Fill(0); - maximum.Fill(255); - - VectorRescalerType::Pointer vr = VectorRescalerType::New(); - vr->SetInput(multispectralReader->GetOutput()); - vr->SetOutputMinimum(minimum); - vr->SetOutputMaximum(maximum); - vr->SetClampThreshold(0.01); - - ChannelExtractorType::Pointer selecter = ChannelExtractorType::New(); - selecter->SetInput(vr->GetOutput()); - selecter->SetExtractionRegion(multispectralReader->GetOutput()->GetLargestPossibleRegion()); - selecter->SetChannel(3); - selecter->SetChannel(2); - selecter->SetChannel(1); - - VectorWriterType::Pointer vectWriter = VectorWriterType::New(); - vectWriter->SetFileName(argv[3]); - vectWriter->SetInput(selecter->GetOutput()); - vectWriter->Update(); - - MultiSpectralImageType::PixelType pixelRef; - pixelRef.SetSize(4); - pixelRef[0] = atoi(argv[4]); - pixelRef[1] = atoi(argv[5]); - pixelRef[2] = atoi(argv[6]); - pixelRef[3] = atoi(argv[7]); - - double resolution = 0.6; // to get directly from metadata - double alpha = atof(argv[9]); - - // The spectral angle is used to compute a grayscale image from the - // multispectral original image using - // \doxygen{otb}{SpectralAngleDistanceImageFilter}. The spectral - // angle is illustrated on - // Figure~\ref{fig:RoadExtractionSpectralAngleDiagram}. Pixels - // corresponding to roads are in darker color. - // - // \begin{figure} - // \center - // \includegraphics[width=0.40\textwidth]{RoadExtractionSpectralAngleDiagram.eps} - // \itkcaption[Spectral Angle]{Illustration of the spectral angle - // for one pixel of a three-band image. One of the vector is the - // reference pixel and the other is the current pixel.} - // \label{fig:RoadExtractionSpectralAngleDiagram} - // \end{figure} - // - // - - typedef otb::SpectralAngleDistanceImageFilter<MultiSpectralImageType, InternalImageType> SAFilterType; - SAFilterType::Pointer saFilter = SAFilterType::New(); - saFilter->SetReferencePixel(pixelRef); - saFilter->SetInput(multispectralReader->GetOutput()); - - // A square root is applied to the spectral angle image in order to enhance contrast between - // darker pixels (which are pixels of interest) with \doxygen{itk}{SqrtImageFilter}. - - typedef itk::SqrtImageFilter<InternalImageType, InternalImageType> SqrtFilterType; - SqrtFilterType::Pointer sqrtFilter = SqrtFilterType::New(); - sqrtFilter->SetInput(saFilter->GetOutput()); - - // Use the Gaussian gradient filter compute the gradient in x and y direction - // respectively - // (\doxygen{itk}{GradientRecursiveGaussianImageFilter}). - - double sigma = alpha * (1.2 / resolution + 1); - typedef itk::GradientRecursiveGaussianImageFilter<InternalImageType, VectorImageType> GradientFilterType; - GradientFilterType::Pointer gradientFilter = GradientFilterType::New(); - gradientFilter->SetSigma(sigma); - gradientFilter->SetInput(sqrtFilter->GetOutput()); - - // Compute the scalar product of the neighboring pixels and keep the - // minimum value and the direction with \doxygen{otb}{NeighborhoodScalarProductFilter}. - // This is the line detector described - // in \cite{Lacroix1998}. - - typedef otb::NeighborhoodScalarProductFilter<VectorImageType, InternalImageType, InternalImageType> NeighborhoodScalarProductType; - NeighborhoodScalarProductType::Pointer scalarFilter = NeighborhoodScalarProductType::New(); - scalarFilter->SetInput(gradientFilter->GetOutput()); - - // The resulting image is passed to the \doxygen{otb}{RemoveIsolatedByDirectionFilter} - // filter to remove pixels - // with no neighbor having the same direction. - - typedef otb::RemoveIsolatedByDirectionFilter<InternalImageType, InternalImageType, InternalImageType> RemoveIsolatedByDirectionType; - RemoveIsolatedByDirectionType::Pointer removeIsolatedByDirectionFilter = RemoveIsolatedByDirectionType::New(); - removeIsolatedByDirectionFilter->SetInput(scalarFilter->GetOutput()); - removeIsolatedByDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection()); - - // We remove pixels having a direction corresponding to bright lines - // as we know that after the spectral angle, roads are in darker color - // with the \doxygen{otb}{RemoveWrongDirectionFilter} filter. - - typedef otb::RemoveWrongDirectionFilter<InternalImageType, InternalImageType, InternalImageType> RemoveWrongDirectionType; - RemoveWrongDirectionType::Pointer removeWrongDirectionFilter = RemoveWrongDirectionType::New(); - removeWrongDirectionFilter->SetInput(removeIsolatedByDirectionFilter->GetOutput()); - removeWrongDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection()); - - // We remove pixels which are not maximum on the direction - // perpendicular to the road direction with the \doxygen{otb}{NonMaxRemovalByDirectionFilter}. - - typedef otb::NonMaxRemovalByDirectionFilter<InternalImageType, InternalImageType, InternalImageType> NonMaxRemovalByDirectionType; - NonMaxRemovalByDirectionType::Pointer nonMaxRemovalByDirectionFilter = NonMaxRemovalByDirectionType::New(); - nonMaxRemovalByDirectionFilter->SetInput(removeWrongDirectionFilter->GetOutput()); - nonMaxRemovalByDirectionFilter->SetInputDirection(scalarFilter->GetOutputDirection()); - - // Extracted road are vectorized into polylines with \doxygen{otb}{VectorizationPathListFilter}. - - typedef otb::VectorizationPathListFilter<InternalImageType, InternalImageType, PathType> VectorizationFilterType; - VectorizationFilterType::Pointer vectorizationFilter = VectorizationFilterType::New(); - vectorizationFilter->SetInput(nonMaxRemovalByDirectionFilter->GetOutput()); - vectorizationFilter->SetInputDirection(scalarFilter->GetOutputDirection()); - vectorizationFilter->SetAmplitudeThreshold(atof(argv[8])); - - // However, this vectorization is too simple and need to be refined - // to be usable. First, we remove all aligned points to make one segment with - // \doxygen{otb}{SimplifyPathListFilter}. - // Then we break the polylines which have sharp angles as they are probably - // not road with \doxygen{otb}{BreakAngularPathListFilter}. - // Finally we remove path which are too short with \doxygen{otb}{RemoveTortuousPathListFilter}. - - typedef otb::SimplifyPathListFilter<PathType> SimplifyPathType; - SimplifyPathType::Pointer simplifyPathListFilter = SimplifyPathType::New(); - simplifyPathListFilter->GetFunctor().SetTolerance(1.0); - simplifyPathListFilter->SetInput(vectorizationFilter->GetOutput()); - - typedef otb::BreakAngularPathListFilter<PathType> BreakAngularPathType; - BreakAngularPathType::Pointer breakAngularPathListFilter = BreakAngularPathType::New(); - breakAngularPathListFilter->SetMaxAngle(otb::CONST_PI / 8.); - breakAngularPathListFilter->SetInput(simplifyPathListFilter->GetOutput()); - - typedef otb::RemoveTortuousPathListFilter<PathType> RemoveTortuousPathType; - RemoveTortuousPathType::Pointer removeTortuousPathListFilter = RemoveTortuousPathType::New(); - removeTortuousPathListFilter->GetFunctor().SetThreshold(1.0); - removeTortuousPathListFilter->SetInput(breakAngularPathListFilter->GetOutput()); - - // Polylines within a certain range are linked (\doxygen{otb}{LinkPathListFilter}) to - // try to fill gaps due to occultations by vehicules, trees, etc. before simplifying - // polylines (\doxygen{otb}{SimplifyPathListFilter}) and - // removing the shortest ones with \doxygen{otb}{RemoveTortuousPathListFilter}. - - typedef otb::LinkPathListFilter<PathType> LinkPathType; - LinkPathType::Pointer linkPathListFilter = LinkPathType::New(); - linkPathListFilter->SetDistanceThreshold(25.0 / resolution); - linkPathListFilter->SetAngularThreshold(otb::CONST_PI / 8); - linkPathListFilter->SetInput(removeTortuousPathListFilter->GetOutput()); - - SimplifyPathType::Pointer simplifyPathListFilter2 = SimplifyPathType::New(); - simplifyPathListFilter2->GetFunctor().SetTolerance(1.0); - simplifyPathListFilter2->SetInput(linkPathListFilter->GetOutput()); - - RemoveTortuousPathType::Pointer removeTortuousPathListFilter2 = RemoveTortuousPathType::New(); - removeTortuousPathListFilter2->GetFunctor().SetThreshold(10.0); - removeTortuousPathListFilter2->SetInput(simplifyPathListFilter2->GetOutput()); - - // A value can be associated with each polyline according to pixel values - // under the polyline with \doxygen{otb}{LikelihoodPathListFilter}. A higher value - // will mean a higher Likelihood to be a road. - - typedef otb::LikelihoodPathListFilter<PathType, InternalImageType> PathListToPathListWithValueType; - PathListToPathListWithValueType::Pointer pathListConverter = PathListToPathListWithValueType::New(); - pathListConverter->SetInput(removeTortuousPathListFilter2->GetOutput()); - pathListConverter->SetInputImage(nonMaxRemovalByDirectionFilter->GetOutput()); - - // A black background image is built to draw the path on. - - InternalImageType::Pointer output = InternalImageType::New(); - output->CopyInformation(multispectralReader->GetOutput()); - output->SetRegions(output->GetLargestPossibleRegion()); - output->Allocate(); - output->FillBuffer(0.0); - - // Polylines are drawn on a black background image with \doxygen{otb}{DrawPathListFilter}. - // The \code{SetUseIternalValues()} tell the drawing filter to draw the path with its Likelihood - // value. - - typedef otb::DrawPathListFilter<InternalImageType, PathType, InternalImageType> DrawPathType; - DrawPathType::Pointer drawPathListFilter = DrawPathType::New(); - drawPathListFilter->SetInput(output); - drawPathListFilter->SetInputPath(pathListConverter->GetOutput()); - drawPathListFilter->SetUseInternalPathValue(true); - - // The output from the drawing filter contains very small values (Likelihood values). Therefore - // the image has to be rescaled to be viewed. The whole pipeline is executed by invoking - // the \code{Update()} method on this last filter. - - typedef itk::RescaleIntensityImageFilter<InternalImageType, InternalImageType> RescalerType; - RescalerType::Pointer rescaler = RescalerType::New(); - rescaler->SetOutputMaximum(255); - rescaler->SetOutputMinimum(0); - rescaler->SetInput(drawPathListFilter->GetOutput()); - rescaler->Update(); - - // this small piece of code aims at producing a pretty RGB png result image. - typedef otb::MultiToMonoChannelExtractROI<OutputPixelType, PixelType> ChannelExtractionFilterType; - typedef itk::AddImageFilter<InternalImageType, InternalImageType, InternalImageType> AddFilterType; - typedef itk::SubtractImageFilter<InternalImageType, InternalImageType, InternalImageType> SubtractFilterType; - typedef itk::ThresholdImageFilter<InternalImageType> ThresholdFilterType; - typedef itk::RGBPixel<OutputPixelType> RGBPixelType; - typedef otb::Image<RGBPixelType, Dimension> RGBImageType; - typedef itk::ComposeImageFilter<InternalImageType, RGBImageType> ComposeFilterType; - typedef otb::ImageFileWriter<RGBImageType> RGBWriterType; - typedef itk::BinaryBallStructuringElement<PixelType, Dimension> StructuringElementType; - typedef itk::GrayscaleDilateImageFilter<InternalImageType, InternalImageType, StructuringElementType> DilateFilterType; - - StructuringElementType se; - se.SetRadius(1); - se.CreateStructuringElement(); - - // Filters definitions - ChannelExtractionFilterType::Pointer channelExtractor1 = ChannelExtractionFilterType::New(); - ChannelExtractionFilterType::Pointer channelExtractor2 = ChannelExtractionFilterType::New(); - ChannelExtractionFilterType::Pointer channelExtractor3 = ChannelExtractionFilterType::New(); - - AddFilterType::Pointer addFilter = AddFilterType::New(); - SubtractFilterType::Pointer subtract2 = SubtractFilterType::New(); - SubtractFilterType::Pointer subtract3 = SubtractFilterType::New(); - ThresholdFilterType::Pointer threshold11 = ThresholdFilterType::New(); - ThresholdFilterType::Pointer threshold21 = ThresholdFilterType::New(); - ThresholdFilterType::Pointer threshold31 = ThresholdFilterType::New(); - ThresholdFilterType::Pointer threshold12 = ThresholdFilterType::New(); - ThresholdFilterType::Pointer threshold22 = ThresholdFilterType::New(); - ThresholdFilterType::Pointer threshold32 = ThresholdFilterType::New(); - - ComposeFilterType::Pointer composer = ComposeFilterType::New(); - RGBWriterType::Pointer writer = RGBWriterType::New(); - - DilateFilterType::Pointer dilater = DilateFilterType::New(); - - dilater->SetInput(rescaler->GetOutput()); - dilater->SetKernel(se); - - // Extract each channel - channelExtractor1->SetInput(vr->GetOutput()); - channelExtractor2->SetInput(vr->GetOutput()); - channelExtractor3->SetInput(vr->GetOutput()); - - channelExtractor1->SetChannel(3); - channelExtractor2->SetChannel(2); - channelExtractor3->SetChannel(1); - - // Add the path to the red component - addFilter->SetInput1(channelExtractor1->GetOutput()); - addFilter->SetInput2(dilater->GetOutput()); - - subtract2->SetInput1(channelExtractor2->GetOutput()); - subtract2->SetInput2(dilater->GetOutput()); - subtract3->SetInput1(channelExtractor3->GetOutput()); - subtract3->SetInput2(dilater->GetOutput()); - - // Threshold outside the [0, 255] range - - threshold11->SetInput(addFilter->GetOutput()); - threshold11->ThresholdBelow(0); - threshold11->SetOutsideValue(0); - threshold12->SetInput(threshold11->GetOutput()); - threshold12->ThresholdAbove(255); - threshold12->SetOutsideValue(255); - - threshold21->SetInput(subtract2->GetOutput()); - threshold21->ThresholdBelow(0); - threshold21->SetOutsideValue(0); - threshold22->SetInput(threshold21->GetOutput()); - threshold22->ThresholdAbove(255); - threshold22->SetOutsideValue(255); - - threshold31->SetInput(subtract3->GetOutput()); - threshold31->ThresholdBelow(0); - threshold31->SetOutsideValue(0); - threshold32->SetInput(threshold31->GetOutput()); - threshold32->ThresholdAbove(255); - threshold32->SetOutsideValue(255); - - // Compose the output image - composer->SetInput(0, threshold12->GetOutput()); - composer->SetInput(1, threshold22->GetOutput()); - composer->SetInput(2, threshold32->GetOutput()); - - // Write the new rgb image - writer->SetInput(composer->GetOutput()); - writer->SetFileName(argv[2]); - writer->Update(); - - // Figures~\ref{fig:ROADEXTRACTIONBYSTEPS} and \ref{fig:ROADEXTRACTIONBYSTEPS2} - // show the result of applying - // the road extraction by steps to a fusionned Quickbird image. The result image - // is a RGB composition showing the extracted path in red. Full processing took - // about 3 seconds for each image. - // - // \begin{figure}[htbp] - // \center - // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty.eps} - // \includegraphics[width=0.44\textwidth]{ExtractRoadByStepsExampleOutput.eps} - // \itkcaption[Road extraction filter application]{Result of applying - // the road extraction by steps pipeline to a fusionned Quickbird - // image. From left to right : original image, extracted road with their - // Likelihood values.} - // \label{fig:ROADEXTRACTIONBYSTEPS} - // \end{figure} - // - // \begin{figure}[htbp] - // \center - // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty2.eps} - // \includegraphics[width=0.44\textwidth]{ExtractRoadByStepsExampleOutput2.eps} - // \itkcaption[Road extraction filter application]{Result of applying - // the road extraction by steps pipeline to a fusionned Quickbird - // image. From left to right : original image, extracted road with their - // Likelihood values.} - // \label{fig:ROADEXTRACTIONBYSTEPS2} - // \end{figure} - - return EXIT_SUCCESS; -} diff --git a/Examples/FeatureExtraction/ExtractRoadExample.cxx b/Examples/FeatureExtraction/ExtractRoadExample.cxx deleted file mode 100644 index 94c4361e0d20c29ea24a6461e2248374e7047524..0000000000000000000000000000000000000000 --- a/Examples/FeatureExtraction/ExtractRoadExample.cxx +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* Example usage: -./ExtractRoadExample Input/qb_RoadExtract.tif Output/ExtractRoadOutput.png 337 557 432 859 1.0 0.00005 1.0 0.39269 1.0 10.0 25. -*/ - - -// The easiest way to use the road extraction filter provided by OTB is to use the composite -// filter. If a modification in the pipeline is required to adapt to a particular situation, -// the step by step example, described in the next section can be adapted. -// -// This example demonstrates the use of the \doxygen{otb}{RoadExtractionFilter}. -// This filter is a composite filter achieving road extraction according to the algorithm -// adapted by E. Christophe and J. Inglada \cite{Christophe2007} from an original method -// proposed in \cite{Lacroix1998}. -// -// The first step toward the use of this filter is the inclusion of the proper header files. - -#include "otbPolyLineParametricPathWithValue.h" -#include "otbRoadExtractionFilter.h" -#include "otbDrawPathListFilter.h" - -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "itkRescaleIntensityImageFilter.h" -#include "otbMath.h" - -#include "itkInvertIntensityImageFilter.h" -#include "itkGrayscaleDilateImageFilter.h" -#include "itkBinaryBallStructuringElement.h" - -int main(int argc, char* argv[]) -{ - - if (argc != 14) - { - std::cerr << "Usage: " << argv[0]; - std::cerr << " inputFileName outputFileName firstPixelComponent secondPixelComponent "; - std::cerr << "thirdPixelComponent fourthPixelComponent alpha amplitudeThrehsold tolerance "; - std::cerr << "angularThreshold-maxAngle firstMeanDistanceThreshold secondMeanDistanceThreshold "; - std::cerr << "distanceThreshold" << std::endl; - return EXIT_FAILURE; - } - - const unsigned int Dimension = 2; - // Then we must decide what pixel type to use for the image. We choose to do - // all the computation in floating point precision and rescale the results - // between 0 and 255 in order to export PNG images. - - typedef double InputPixelType; - typedef unsigned char OutputPixelType; - - // The images are defined using the pixel type and the dimension. Please note that - // the \doxygen{otb}{RoadExtractionFilter} needs an \doxygen{otb}{VectorImage} as input - // to handle multispectral images. - - typedef otb::VectorImage<InputPixelType, Dimension> InputVectorImageType; - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - // We define the type of the polyline that the filter produces. We use the - // \doxygen{otb}{PolyLineParametricPathWithValue}, which allows the filter to produce - // a likehood value along with each polyline. The filter is able to produce - // \doxygen{itk}{PolyLineParametricPath} as well. - - typedef otb::PolyLineParametricPathWithValue<InputPixelType, Dimension> PathType; - - // Now we can define the \doxygen{otb}{RoadExtractionFilter} that takes a multi-spectral - // image as input and produces a list of polylines. - - typedef otb::RoadExtractionFilter<InputVectorImageType, PathType> RoadExtractionFilterType; - - // We also define an \doxygen{otb}{DrawPathListFilter} to draw the output - // polylines on an image, taking their likehood values into account. - - typedef otb::DrawPathListFilter<InputImageType, PathType, InputImageType> DrawPathFilterType; - - // The intensity rescaling of the results will be carried out by the - // \doxygen{itk}{RescaleIntensityImageFilter} which is templated by the - // input and output image types. - - typedef itk::RescaleIntensityImageFilter<InputImageType, OutputImageType> RescalerType; - - // An \doxygen{otb}{ImageFileReader} class is also instantiated in order to read - // image data from a file. Then, an \doxygen{otb}{ImageFileWriter} - // is instantiated in order to write the output image to a file. - - typedef otb::ImageFileReader<InputVectorImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - // The different filters composing our pipeline are created by invoking their - // \code{New()} methods, assigning the results to smart pointers. - - ReaderType::Pointer reader = ReaderType::New(); - RoadExtractionFilterType::Pointer roadExtractionFilter = RoadExtractionFilterType::New(); - DrawPathFilterType::Pointer drawingFilter = DrawPathFilterType::New(); - RescalerType::Pointer rescaleFilter = RescalerType::New(); - WriterType::Pointer writer = WriterType::New(); - - reader->SetFileName(argv[1]); - - // The \doxygen{otb}{RoadExtractionFilter} needs to have a reference pixel - // corresponding to the spectral content likely to represent a road. This is done - // by passing a pixel to the filter. Here we suppose that the input image - // has four spectral bands. - - InputVectorImageType::PixelType ReferencePixel; - ReferencePixel.SetSize(4); - ReferencePixel.SetElement(0, ::atof(argv[3])); - ReferencePixel.SetElement(1, ::atof(argv[4])); - ReferencePixel.SetElement(2, ::atof(argv[5])); - ReferencePixel.SetElement(3, ::atof(argv[6])); - roadExtractionFilter->SetReferencePixel(ReferencePixel); - - // We must also set the alpha parameter of the filter which allows us to tune the width of the roads - // we want to extract. Typical value is $1.0$ and should be working in most situations. - - roadExtractionFilter->SetAlpha(atof(argv[7])); - - // All other parameter should not influence the results too much in most situation and can - // be kept at the default value. - // - // The amplitude threshold parameter tunes the sensitivity of the vectorization step. A typical - // value is $5 \cdot 10^{-5}$. - - roadExtractionFilter->SetAmplitudeThreshold(atof(argv[8])); - - // The tolerance threshold tunes the sensitivity of the path simplification step. - // Typical value is $1.0$. - - roadExtractionFilter->SetTolerance(atof(argv[9])); - - // Roads are not likely to have sharp turns. Therefore we set the max angle parameter, - // as well as the link angular threshold. The value is typically $\frac{\pi}{8}$. - - roadExtractionFilter->SetMaxAngle(atof(argv[10])); - roadExtractionFilter->SetAngularThreshold(atof(argv[10])); - - // The \doxygen{otb}{RoadExtractionFilter} performs two odd path removing operations at different stage of - // its execution. The first mean distance threshold and the second mean distance threshold set their criterion - // for removal. Path are removed if their mean distance between nodes is to small, since such path coming - // from previous filters are likely to be tortuous. The first removal operation as a typical mean distance - // threshold parameter of $1.0$, and the second of $10.0$. - - roadExtractionFilter->SetFirstMeanDistanceThreshold(atof(argv[11])); - roadExtractionFilter->SetSecondMeanDistanceThreshold(atof(argv[12])); - - // The \doxygen{otb}{RoadExtractionFilter} is able to link path whose ends are near - // according to an euclidean distance criterion. The threshold for this distance - // to link a path is the distance threshold parameter. A typical value is $25$. - - roadExtractionFilter->SetDistanceThreshold(atof(argv[13])); - - // We will now create a black background image to draw the resulting polyline on. - // To achieve this we need to know the size of our input image. Therefore we trigger the - // \code{GenerateOutputInformation()} of the reader. - - reader->GenerateOutputInformation(); - InputImageType::Pointer blackBackground = InputImageType::New(); - blackBackground->CopyInformation(reader->GetOutput()); - blackBackground->SetRegions(blackBackground->GetLargestPossibleRegion()); - blackBackground->Allocate(); - blackBackground->FillBuffer(0); - - // We tell the \doxygen{otb}{DrawPathListFilter} to try to use the likehood value - // embedded within the polyline as a value for drawing this polyline if possible. - - drawingFilter->UseInternalPathValueOn(); - - // The \code{itk::RescaleIntensityImageFilter} needs to know which - // is the minimum and maximum values of the output generated - // image. Those can be chosen in a generic way by using the - // \code{NumericTraits} functions, since they are templated over - // the pixel type. - - rescaleFilter->SetOutputMinimum(itk::NumericTraits<OutputPixelType>::min()); - rescaleFilter->SetOutputMaximum(itk::NumericTraits<OutputPixelType>::max()); - - // Now it is time for some pipeline wiring. - - roadExtractionFilter->SetInput(reader->GetOutput()); - drawingFilter->SetInput(blackBackground); - drawingFilter->SetInputPath(roadExtractionFilter->GetOutput()); - rescaleFilter->SetInput(drawingFilter->GetOutput()); - - // The update of the pipeline is triggered by the \code{Update()} method - // of the rescale intensity filter. - - rescaleFilter->Update(); - - // output image enhancement - typedef itk::BinaryBallStructuringElement<OutputPixelType, Dimension> StructuringElementType; - typedef itk::GrayscaleDilateImageFilter<OutputImageType, OutputImageType, StructuringElementType> DilateFilterType; - typedef itk::InvertIntensityImageFilter<OutputImageType, OutputImageType> InvertFilterType; - - StructuringElementType se; - se.SetRadius(1); - se.CreateStructuringElement(); - - DilateFilterType::Pointer dilater = DilateFilterType::New(); - - dilater->SetInput(rescaleFilter->GetOutput()); - dilater->SetKernel(se); - - InvertFilterType::Pointer invertFilter = InvertFilterType::New(); - invertFilter->SetInput(dilater->GetOutput()); - - writer->SetFileName(argv[2]); - writer->SetInput(invertFilter->GetOutput()); - writer->Update(); - - // Figure~\ref{fig:ROADEXTRACTION_FILTER} shows the result of applying - // the road extraction filter to a fusionned Quickbird image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{qb_ExtractRoad_pretty.eps} - // \includegraphics[width=0.44\textwidth]{ExtractRoadOutput.eps} - // \itkcaption[Road extraction filter application]{Result of applying - // the \doxygen{otb}{RoadExtractionFilter} to a fusionned Quickbird - // image. From left to right : original image, extracted road with their - // likehood values (color are inverted for display).} - // \label{fig:ROADEXTRACTION_FILTER} - // \end{figure} - - return EXIT_SUCCESS; -} diff --git a/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx b/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx deleted file mode 100644 index 305fd72b5ade098bd0ec217ee49a71b41c3211e6..0000000000000000000000000000000000000000 --- a/Examples/FeatureExtraction/ParallelLineDetectionExample.cxx +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* Example usage: -./ParallelLineDetectionExample Output/Lines.png Output/ParallelLines.png 20 2 10 -*/ - - -// This example illustrates the details of the \doxygen{otb}{ParallelLinePathListFilter}. -// - -#include "itkPolyLineParametricPath.h" -#include "otbDrawPathListFilter.h" - -#include "otbParallelLinePathListFilter.h" - -#include "otbImage.h" -#include "otbImageFileWriter.h" - -int main(int argc, char* argv[]) -{ - if (argc != 6) - { - std::cerr << "Usage: " << std::endl; - std::cerr << argv[0] << " outputImage "; - std::cerr << " outputParallelLineImage "; - std::cerr << " distThreshParallel angThreshParallel commonDistThreshParallel" << std::endl; - return EXIT_FAILURE; - } - - double distThreshParallel = atof(argv[3]); - double angThreshParallel = atof(argv[4]); - double commonDistThreshParallel = atof(argv[5]); - - // We start by creating an empty image - const unsigned int Dimension = 2; - typedef unsigned char PixelType; - - typedef otb::Image<PixelType, Dimension> ImageType; - - ImageType::Pointer image = ImageType::New(); - - ImageType::IndexType start; - - start[0] = 0; - start[1] = 0; - - ImageType::SizeType size; - size[0] = 600; - size[1] = 300; - - ImageType::RegionType region; - - region.SetSize(size); - region.SetIndex(start); - image->SetRegions(region); - image->Allocate(); - image->FillBuffer(itk::NumericTraits<PixelType>::Zero); - - // We create some lines - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::ObjectList<PathType> PathListType; - - PathListType::Pointer lineList = PathListType::New(); - - typedef PathType::ContinuousIndexType ContinuousIndexType; - ContinuousIndexType cindex; - - /*-----*/ - PathType::Pointer aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 1; - cindex[1] = 41; - aLine->AddVertex(cindex); - - cindex[0] = 175; - cindex[1] = 204; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 60; - cindex[1] = 18; - aLine->AddVertex(cindex); - - cindex[0] = 203; - cindex[1] = 164; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 174; - cindex[1] = 99; - aLine->AddVertex(cindex); - - cindex[0] = 281; - cindex[1] = 1; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 3; - cindex[1] = 233; - aLine->AddVertex(cindex); - - cindex[0] = 191; - cindex[1] = 227; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 254; - cindex[1] = 279; - aLine->AddVertex(cindex); - - cindex[0] = 351; - cindex[1] = 110; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 270; - cindex[1] = 287; - aLine->AddVertex(cindex); - - cindex[0] = 368; - cindex[1] = 120; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 355; - cindex[1] = 204; - aLine->AddVertex(cindex); - - cindex[0] = 528; - cindex[1] = 199; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 437; - cindex[1] = 243; - aLine->AddVertex(cindex); - - cindex[0] = 591; - cindex[1] = 237; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - // Polylines are drawn on a black - typedef otb::DrawPathListFilter<ImageType, PathType, ImageType> DrawPathType; - DrawPathType::Pointer drawPathListFilter = DrawPathType::New(); - drawPathListFilter->SetInput(image); - drawPathListFilter->SetInputPath(lineList); - drawPathListFilter->SetPathValue(itk::NumericTraits<PixelType>::max()); - - typedef otb::ImageFileWriter<ImageType> WriterType; - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(drawPathListFilter->GetOutput()); - writer->SetFileName(argv[1]); - writer->Update(); - - // Parallel lines are detected. A minimum common length, an angular - // threshold and a maximum distance threshold have to specified. - // The input is a pathList of the previously extracted line segments. - typedef otb::ParallelLinePathListFilter<PathType> ParallelLinePathType; - ParallelLinePathType::Pointer parallelLinePathListFilter = ParallelLinePathType::New(); - parallelLinePathListFilter->SetDistanceThreshold(distThreshParallel); - parallelLinePathListFilter->SetAngularThreshold(angThreshParallel); - parallelLinePathListFilter->SetCommonDistanceThreshold(commonDistThreshParallel); - parallelLinePathListFilter->SetInput(lineList); - parallelLinePathListFilter->Update(); - - // A black background image is built to draw the path on. - ImageType::Pointer outputParallel = ImageType::New(); - outputParallel->SetRegions(image->GetLargestPossibleRegion()); - outputParallel->Allocate(); - outputParallel->FillBuffer(itk::NumericTraits<PixelType>::Zero); - - // Parallel lines are drawn on a black background image with \doxygen{otb}{DrawPathListFilter}. - // The \code{SetUseIternalValues()} tells the drawing filter to draw the path with its likelihood - // value. - // typedef otb::DrawPathListFilter<ImageType, PathType, ImageType> DrawPathType; - DrawPathType::Pointer drawPathListFilterParallel = DrawPathType::New(); - drawPathListFilterParallel->SetInput(outputParallel); - drawPathListFilterParallel->SetInputPath(parallelLinePathListFilter->GetOutput()); - drawPathListFilter->SetPathValue(itk::NumericTraits<PixelType>::max()); - drawPathListFilterParallel->SetUseInternalPathValue(false); - - // Write the Line image - WriterType::Pointer writerParallel = WriterType::New(); - writerParallel->SetInput(drawPathListFilterParallel->GetOutput()); - writerParallel->SetFileName(argv[2]); - writerParallel->Update(); - - return EXIT_SUCCESS; -} diff --git a/Examples/FeatureExtraction/SeamCarvingExample.cxx b/Examples/FeatureExtraction/SeamCarvingExample.cxx deleted file mode 100644 index 854872a1b56ec802b03b13569154f4e1c2df596b..0000000000000000000000000000000000000000 --- a/Examples/FeatureExtraction/SeamCarvingExample.cxx +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// This example illustrates the details of the seam carving operation. -// References to this method can be found in \cite{Avidan07}. This example -// details the use of \doxygen{otb}{ImageToCarvingPathFilter} and -// \doxygen{otb}{RemoveCarvingPathFilter}. -// -// In this example, a loop is defined to remove a vertical or horizontal seam -// at each step of the algorithm. The seam with the minimum energy is chosen. - -/* Example usage: -./SeamCarvingExample Input/QB_Suburb.png Output/SeamCarvingExampleOutput.png 50 -*/ - - -#include "otbImage.h" -#include "itkPolyLineParametricPath.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkGradientMagnitudeImageFilter.h" -#include "itkRescaleIntensityImageFilter.h" - -#include "otbDrawPathFilter.h" -#include "otbImageToCarvingPathFilter.h" -#include "otbRemoveCarvingPathFilter.h" - -#include "itkImageDuplicator.h" - -int main(int itkNotUsed(argc), char* argv[]) -{ - - typedef float InputPixelType; - typedef unsigned char OutputPixelType; - const unsigned int Dimension = 2; - - typedef otb::Image<InputPixelType, Dimension> ImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - typedef itk::PolyLineParametricPath<Dimension> PathType; - - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - typedef itk::RescaleIntensityImageFilter<ImageType, OutputImageType> RescalerType; - - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - RescalerType::Pointer rescaler = RescalerType::New(); - - const char* filenamereader = argv[1]; - reader->SetFileName(filenamereader); - - const char* filenamewriter = argv[2]; - writer->SetFileName(filenamewriter); - - int iteration = atoi(argv[3]); - - // Energy is computed according to the gradient of the image, thus an - // \doxygen{itk}{GradientMagnitudeImageFilter} is instantiated - - typedef itk::GradientMagnitudeImageFilter<ImageType, ImageType> GradientType; - GradientType::Pointer gradient = GradientType::New(); - - // The \doxygen{otb}{ImageToCarvingPathFilter} compute the seam of minimum - // energy according to lines or columns of the image. Later, as we will - // choose the best option between the two, we need two of these filters. - - typedef otb::ImageToCarvingPathFilter<ImageType, PathType> CarvingFilterType; - CarvingFilterType::Pointer carvingFilterVert = CarvingFilterType::New(); - CarvingFilterType::Pointer carvingFilterHor = CarvingFilterType::New(); - - // The \doxygen{otb}{RemoveCarvingPathFilter} will really resize the image - // deleting the path. - - typedef otb::RemoveCarvingPathFilter<ImageType, PathType, ImageType> RemoveCarvingPathFilterType; - RemoveCarvingPathFilterType::Pointer removeCarvingPath = RemoveCarvingPathFilterType::New(); - - // As we are going to iterate through the filters, we need to disconnect the - // pipeline at one point and store the image somewhere. For that purpose, we - // use an \doxygen{itk}{ImageDuplicator} - - typedef itk::ImageDuplicator<ImageType> duplicatorType; - duplicatorType::Pointer duplicator = duplicatorType::New(); - - // Now that all elements have been instantiated, we start to plug the pipeline - // and to define the loop. - - reader->Update(); - duplicator->SetInputImage(reader->GetOutput()); - duplicator->Update(); - - double energyVert, energyHor; - - for (int i = 0; i < iteration; ++i) - { - - gradient->SetInput(duplicator->GetOutput()); - - // Two carving filters processed the gradient image to find the minimum - // vertical seam and the minimum horizontal seam. Note that the - // \code{UpdateLargestPossibleRegion()} need to be used as the size of the - // input image will be different in each loop. - - carvingFilterVert->SetInput(gradient->GetOutput()); - carvingFilterVert->SetDirection(0); - carvingFilterVert->UpdateLargestPossibleRegion(); - energyVert = carvingFilterVert->GetEnergyPerPix(); - - carvingFilterHor->SetInput(gradient->GetOutput()); - carvingFilterHor->SetDirection(1); - carvingFilterHor->UpdateLargestPossibleRegion(); - energyHor = carvingFilterHor->GetEnergyPerPix(); - - // The vertical or the horizontal seam with the minimal energy is chosen. - - if (energyVert < energyHor) - { - removeCarvingPath->SetInput(duplicator->GetOutput()); - removeCarvingPath->SetInputPath(carvingFilterVert->GetOutput()); - removeCarvingPath->SetDirection(0); - removeCarvingPath->UpdateLargestPossibleRegion(); - } - else - { - removeCarvingPath->SetInput(duplicator->GetOutput()); - removeCarvingPath->SetInputPath(carvingFilterHor->GetOutput()); - removeCarvingPath->SetDirection(1); - removeCarvingPath->UpdateLargestPossibleRegion(); - } - - // The duplicator filter keep the results for the next loop - - duplicator->SetInputImage(removeCarvingPath->GetOutput()); - duplicator->Update(); - } - - // Finally, the resulting image is saved on an image file as usual - - rescaler->SetInput(duplicator->GetOutput()); - writer->SetInput(rescaler->GetOutput()); - writer->Update(); - - // Figure~\ref{fig:SEAMCARVING_FILTER} shows the result of applying - // the seam carving filter to a satellite image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps} - // \includegraphics[width=0.38\textwidth]{SeamCarvingExampleOutput.eps} - // \itkcaption[Seam carving filter application]{Result of applying - // the \doxygen{otb}{ImageToCarvingPathFilter} followed by the - // \doxygen{otb}{RemoveCarvingPathFilter} to Quickbird - // image. From left to right : original image, reduced image removing the 50 - // seams with the lowest energy.} - // \label{fig:SEAMCARVING_FILTER} - // \end{figure} - - return EXIT_SUCCESS; -} diff --git a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx b/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx deleted file mode 100644 index f8ac6e4e1b794f09b246ba2105d9dff9333d823b..0000000000000000000000000000000000000000 --- a/Examples/FeatureExtraction/SeamCarvingOtherExample.cxx +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -// This example illustrates the use of the \doxygen{otb}{AddCarvingPathFilter}, -// the opposite of the \doxygen{otb}{RemoveCarvingPathFilter}. -// -// Here, we use this filter combined with the \doxygen{otb}{DrawPathFilter} to -// output the image with the removed seam in white. -// -// Most of the code is similar to the previous example. - -/* Example usage: -./SeamCarvingOtherExample Input/QB_Suburb.png Output/SeamCarvingOtherExampleOutput.png 50 -*/ - - -#include "otbImage.h" -#include "itkPolyLineParametricPath.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkRescaleIntensityImageFilter.h" -#include "itkGradientMagnitudeImageFilter.h" - -#include "otbDrawPathFilter.h" -#include "otbImageToCarvingPathFilter.h" -#include "otbRemoveCarvingPathFilter.h" -#include "otbAddCarvingPathFilter.h" - -#include "itkImageDuplicator.h" -#include "otbObjectList.h" - -int main(int itkNotUsed(argc), char* argv[]) -{ - - typedef float InputPixelType; - typedef unsigned char OutputPixelType; - const unsigned int Dimension = 2; - - typedef otb::Image<InputPixelType, Dimension> ImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - typedef itk::PolyLineParametricPath<Dimension> PathType; - - // We need to define a list to keep the path in memory until the end of - // the seam carving process. This is done using an \doxygen{otb}{ObjectList} - - typedef otb::ObjectList<PathType> PathListType; - PathListType::Pointer pathList = PathListType::New(); - - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - typedef itk::RescaleIntensityImageFilter<ImageType, OutputImageType> RescalerType; - - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - RescalerType::Pointer rescaler = RescalerType::New(); - - const char* filenamereader = argv[1]; - reader->SetFileName(filenamereader); - - const char* filenamewriter = argv[2]; - writer->SetFileName(filenamewriter); - - int iteration = atoi(argv[3]); - - // We instantiate the different filters of the pipeline as before. - - typedef itk::GradientMagnitudeImageFilter<ImageType, ImageType> GradientType; - GradientType::Pointer gradient = GradientType::New(); - - typedef otb::ImageToCarvingPathFilter<ImageType, PathType> CarvingFilterType; - CarvingFilterType::Pointer carvingFilter = CarvingFilterType::New(); - - typedef otb::DrawPathFilter<ImageType, PathType, ImageType> DrawPathFilterType; - DrawPathFilterType::Pointer drawPathFilter = DrawPathFilterType::New(); - - typedef otb::RemoveCarvingPathFilter<ImageType, PathType, ImageType> RemoveCarvingPathFilterType; - RemoveCarvingPathFilterType::Pointer removeCarvingPath = RemoveCarvingPathFilterType::New(); - - typedef otb::AddCarvingPathFilter<ImageType, PathType, ImageType> AddCarvingPathFilterType; - AddCarvingPathFilterType::Pointer addCarvingPath = AddCarvingPathFilterType::New(); - - typedef itk::ImageDuplicator<ImageType> duplicatorType; - duplicatorType::Pointer duplicator = duplicatorType::New(); - reader->Update(); - duplicator->SetInputImage(reader->GetOutput()); - duplicator->Update(); - - // The loop to shorten the image is similar to the previous one. Here we - // decide to remove alternatively one vertical and one horizontal seam. At - // each iteration, we save the seam on the list using the \code{PushBack()} - // method. - - for (int i = 0; i < iteration; ++i) - { - - gradient->SetInput(duplicator->GetOutput()); - - carvingFilter->SetInput(gradient->GetOutput()); - carvingFilter->SetDirection(i % 2); - - removeCarvingPath->SetInput(duplicator->GetOutput()); - removeCarvingPath->SetInputPath(carvingFilter->GetOutput()); - removeCarvingPath->SetDirection(i % 2); - removeCarvingPath->UpdateLargestPossibleRegion(); - - pathList->PushBack(carvingFilter->GetOutput()); - carvingFilter->GetOutput()->DisconnectPipeline(); - - duplicator->SetInputImage(removeCarvingPath->GetOutput()); - duplicator->Update(); - } - - // The next loop will put back the seam using the - // \doxygen{otb}{AddCarvingPathFilter} and drawing it with the - // \doxygen{otb}{DrawPathFilter}. - - for (int i = iteration - 1; i >= 0; i--) - { - - addCarvingPath->SetInput(duplicator->GetOutput()); - addCarvingPath->SetInputPath(pathList->GetNthElement(i)); - addCarvingPath->SetDirection(i % 2); - addCarvingPath->UpdateLargestPossibleRegion(); - - drawPathFilter->SetInput(addCarvingPath->GetOutput()); - drawPathFilter->SetInputPath(pathList->GetNthElement(i)); - drawPathFilter->UpdateLargestPossibleRegion(); - - duplicator->SetInputImage(drawPathFilter->GetOutput()); - duplicator->Update(); - } - - // Finally, the resulting image is saved on an image file as usual - - rescaler->SetInput(duplicator->GetOutput()); - writer->SetInput(rescaler->GetOutput()); - writer->Update(); - - // Figure~\ref{fig:SEAMCARVING2_FILTER} shows the result of applying - // the seam carving filter to a satellite image. - // \begin{figure} - // \center - // \includegraphics[width=0.44\textwidth]{QB_Suburb.eps} - // \includegraphics[width=0.44\textwidth]{SeamCarvingOtherExampleOutput.eps} - // \itkcaption[Seam carving filter application]{Illustration of the minimum - // seams alternatively vertical and horizontal on a Quickbird - // image. From left to right : original image, image with the 25 vertical - // seams and the 25 horizontal seams.} - // \label{fig:SEAMCARVING2_FILTER} - // \end{figure} - - return EXIT_SUCCESS; -} diff --git a/Examples/FeatureExtraction/test/CMakeLists.txt b/Examples/FeatureExtraction/test/CMakeLists.txt index 0f1e957d04e949f5bcf3d51906014e7fc2e0061e..bea835448e0a05ee71769a08dbca9cb19dbef7e4 100644 --- a/Examples/FeatureExtraction/test/CMakeLists.txt +++ b/Examples/FeatureExtraction/test/CMakeLists.txt @@ -90,54 +90,6 @@ otb_add_test(NAME feTeRatioLineDetectorExampleTest COMMAND ${OTB_TEST_DRIVER} 5 1 ) -# ------- RoadExtractionExamplesTest---------- - - -otb_add_test(NAME feTeExtractRoadByStepsExampleTest COMMAND ${OTB_TEST_DRIVER} - --compare-n-images ${NOTOL} 2 - ${BASELINE}/qb_ExtractRoad_pretty.png - ${TEMP}/qb_ExtractRoad_pretty.png - ${BASELINE}/ExtractRoadByStepsExampleOutput.png - ${TEMP}/ExtractRoadByStepsExampleOutput.png - Execute $<TARGET_FILE:ExtractRoadByStepsExample> - ${INPUTDATA}/qb_RoadExtract.tif - ${TEMP}/ExtractRoadByStepsExampleOutput.png - ${TEMP}/qb_ExtractRoad_pretty.png - 337 557 432 859 0.00005 1.0 -) - - -otb_add_test(NAME feTeExtractRoadExampleTest COMMAND ${OTB_TEST_DRIVER} - --compare-image ${NOTOL} - ${BASELINE}/ExtractRoadExampleOutput.png - ${TEMP}/ExtractRoadExampleOutput.png - Execute $<TARGET_FILE:ExtractRoadExample> - ${INPUTDATA}/qb_RoadExtract.tif - ${TEMP}/ExtractRoadExampleOutput.png - 337 557 432 859 1.0 0.00005 1.0 0.39269 1.0 10.0 25. -) - -# ------- SeamCarvingExamplesTest---------- - -otb_add_test(NAME feTeSeamCarvingExampleTest COMMAND ${OTB_TEST_DRIVER} - --compare-image ${NOTOL} - ${BASELINE}/SeamCarvingExampleOutput.png - ${TEMP}/SeamCarvingExampleOutput.png - Execute $<TARGET_FILE:SeamCarvingExample> - ${INPUTDATA}/QB_Suburb.png - ${TEMP}/SeamCarvingExampleOutput.png - 50 -) - -otb_add_test(NAME feTeSeamCarvingOtherExampleTest COMMAND ${OTB_TEST_DRIVER} - --compare-image ${NOTOL} - ${BASELINE}/SeamCarvingOtherExampleOutput.png - ${TEMP}/SeamCarvingOtherExampleOutput.png - Execute $<TARGET_FILE:SeamCarvingOtherExample> - ${INPUTDATA}/QB_Suburb.png - ${TEMP}/SeamCarvingOtherExampleOutput.png - 50 -) #otb_add_test(NAME feTeImageToSIFTKeyPointSetFilterTest COMMAND ${OTB_TEST_DRIVER} # --compare-image ${NOTOL} diff --git a/Examples/OBIA/LabelMapToVectorData.cxx b/Examples/OBIA/LabelMapToVectorData.cxx index 001d38ecf9d139292dbcf9ffda681be03a85e87c..2f2a1423404845c1fd60146b0e0ae5524472ee87 100644 --- a/Examples/OBIA/LabelMapToVectorData.cxx +++ b/Examples/OBIA/LabelMapToVectorData.cxx @@ -20,7 +20,7 @@ /* Example usage: -./LabelMapToVectorData Input/rcc8_mire1.png Output/rcc8_mire2_vectorizer.shp +./LabelMapToVectorData Input/labelImage_UnsignedChar.tif Output/LabelMapToVectorData.shp */ diff --git a/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx b/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx index 9991cf7db9e6627f3341c92a2908829044d33509..1ab6443c048376eafa4f9cbd31dabafba345711c 100644 --- a/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx +++ b/Examples/OBIA/RadiometricAttributesLabelMapFilterExample.cxx @@ -107,7 +107,7 @@ int main(int argc, char* argv[]) typedef otb::BandsStatisticsAttributesLabelMapFilter<LabelMapType, VectorImageType> RadiometricLabelMapFilterType; typedef otb::AttributesMapOpeningLabelMapFilter<LabelMapType> OpeningLabelMapFilterType; typedef itk::LabelMapToBinaryImageFilter<LabelMapType, MaskImageType> LabelMapToBinaryImageFilterType; - typedef itk::UnaryFunctorImageFilter<VectorImageType, ImageType,otb::Functor::NDVI<PixelType,PixelType,PixelType> > NDVIImageFilterType; + typedef itk::UnaryFunctorImageFilter<VectorImageType, ImageType, otb::Functor::NDVI<PixelType, PixelType>> NDVIImageFilterType; typedef otb::ImageToVectorImageCastFilter<ImageType, VectorImageType> ImageToVectorImageCastFilterType; ReaderType::Pointer reader = ReaderType::New(); @@ -166,8 +166,8 @@ int main(int argc, char* argv[]) // In our case, statistics are computed on the NDVI coefficient on each label object. NDVIImageFilterType::Pointer ndviImageFilter = NDVIImageFilterType::New(); - ndviImageFilter->GetFunctor().SetRedIndex(3); - ndviImageFilter->GetFunctor().SetNIRIndex(4); + ndviImageFilter->GetFunctor().SetBandIndex(CommonBandNames::RED, 3); + ndviImageFilter->GetFunctor().SetBandIndex(CommonBandNames::NIR, 4); ndviImageFilter->SetInput(vreader->GetOutput()); ImageToVectorImageCastFilterType::Pointer ndviVectorImageFilter = ImageToVectorImageCastFilterType::New(); diff --git a/Examples/OBIA/test/CMakeLists.txt b/Examples/OBIA/test/CMakeLists.txt index 49cb2f872e107f61111f8f8de573c974f6c1badb..563fdaf61883ef675fe38633608791d02554e5d8 100644 --- a/Examples/OBIA/test/CMakeLists.txt +++ b/Examples/OBIA/test/CMakeLists.txt @@ -42,6 +42,6 @@ set(INPUTDATA ${OTB_DATA_ROOT}/Input) otb_add_test(NAME trTeLabelMapToVectorData COMMAND ${OTB_TEST_DRIVER} Execute $<TARGET_FILE:LabelMapToVectorData> - ${INPUTDATA}/rcc8_mire1.png - ${TEMP}/rcc8_mire2_vectorizer.shp + ${INPUTDATA}/labelImage_UnsignedChar.tif + ${TEMP}/trTeLabelMapToVectorDataOutput.shp ) diff --git a/Examples/Projections/OrthoRectificationExample.cxx b/Examples/Projections/OrthoRectificationExample.cxx index 93bfecc1681ac8d3c5093c9f74664ca97c50c369..e3a2f4d1c5cdaf2a682c9b2bbc516f970134aba5 100644 --- a/Examples/Projections/OrthoRectificationExample.cxx +++ b/Examples/Projections/OrthoRectificationExample.cxx @@ -23,7 +23,7 @@ #include "otbImageFileWriter.h" // This example demonstrates the use of the -// \doxygen{otb}{OrthoRectificationFilter}. This filter is intended to +// \doxygen{otb}{GenericRSResampleImageFilter}. This filter is intended to // orthorectify images which are in a distributor format with the // appropriate meta-data describing the sensor model. In this example, // we will choose to use an UTM projection for the output image. @@ -32,7 +32,7 @@ // proper header files: the one for the ortho-rectification filter and // the one defining the different projections available in OTB. -#include "otbOrthoRectificationFilter.h" +#include "otbGenericRSResampleImageFilter.h" #include "otbSpatialReference.h" int main(int argc, char* argv[]) @@ -66,15 +66,12 @@ int main(int argc, char* argv[]) writer->SetFileName(argv[2]); // We can now proceed to declare the type for the ortho-rectification - // filter. The class \doxygen{otb}{OrthoRectificationFilter} is - // templated over the input and the output image types as well as over - // the cartographic projection. We define therefore the - // type of the projection we want, which is an UTM projection for this case. - -// Software Guide : BeginCodeSnippet - typedef otb::GenericMapProjection<otb::TransformDirection::FORWARD> MapProjectionType; - typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, - MapProjectionType> + // filter. The class \doxygen{otb}{GenericRSResampleImageFilter} is + // templated over the input and the output image types. + + // Software Guide : BeginCodeSnippet + + typedef otb::GenericRSResampleImageFilter<VectorImageType, VectorImageType> OrthoRectifFilterType; OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); @@ -83,10 +80,9 @@ int main(int argc, char* argv[]) // instantiate the map projection, set the {\em zone} and {\em hemisphere} // parameters and pass this projection to the orthorectification filter. - MapProjectionType::Pointer utmMapProjection = MapProjectionType::New(); - utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[3]),*argv[4]=='N'? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt()); - std::cout<<utmMapProjection->GetWkt()<<std::endl; - orthoRectifFilter->SetMapProjection(utmMapProjection); + std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[3]),*argv[4]=='N'? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt(); + std::cout<<wkt<<std::endl; + orthoRectifFilter->SetOutputProjectionRef(wkt); // We then wire the input image to the orthorectification filter. @@ -129,8 +125,6 @@ int main(int argc, char* argv[]) writer->SetInput(orthoRectifFilter->GetOutput()); - writer->SetAutomaticTiledStreaming(); - // Finally, we trigger the pipeline execution by calling the // \code{Update()} method on the writer. Please note that the // ortho-rectification filter is derived from the diff --git a/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx index 7f051c3e438c87c6dae83164058571601eccb65c..6845750ac2c420db14567e6aa6dc0c85b720072e 100644 --- a/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx +++ b/Examples/Radiometry/ARVIMultiChannelRAndBAndNIRVegetationIndexImageFilter.cxx @@ -26,8 +26,7 @@ Output/pretty_ARVIMultiChannelRAndBAndNIRVegetationIndex.png \ 1 \ 3 \ - 2 \ - 0.6 + 2 */ @@ -87,11 +86,11 @@ int main(int argc, char* argv[]) { - if (argc < 8) + if (argc < 7) { std::cerr << "Missing Parameters " << std::endl; std::cerr << "Usage: " << argv[0]; - std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , blueChannel , nirChannel , gama" << std::endl; + std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , blueChannel , nirChannel" << std::endl; return 1; } @@ -114,7 +113,7 @@ int main(int argc, char* argv[]) // Note that we also can use other functors which operate with the // Red, Blue and Nir channels such as EVI, ARVI and TSARVI. - typedef otb::Functor::ARVI<InputPixelType, InputPixelType, InputPixelType, OutputPixelType> FunctorType; + typedef otb::Functor::ARVI<InputPixelType, OutputPixelType> FunctorType; // The // \doxygen{itk}{UnaryFunctorImageFilter} @@ -134,17 +133,9 @@ int main(int argc, char* argv[]) writer->SetFileName(argv[2]); // The three used index bands (red, blue and NIR) are declared. - - filter->GetFunctor().SetRedIndex(::atoi(argv[5])); - filter->GetFunctor().SetBlueIndex(::atoi(argv[6])); - filter->GetFunctor().SetNIRIndex(::atoi(argv[7])); - - // The $\gamma$ parameter is set. The - // \doxygen{otb::Functor}{ARVI} - // class sets the default value of $\gamma$ to $0.5$. This parameter - // is used to reduce the atmospheric effect on a global scale. - - filter->GetFunctor().SetGamma(::atof(argv[8])); + filter->GetFunctor().SetBandIndex(CommonBandNames::RED, ::atoi(argv[5])); + filter->GetFunctor().SetBandIndex(CommonBandNames::BLUE, ::atoi(argv[6])); + filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, ::atoi(argv[7])); // The filter input is linked to the reader output and // the filter output is linked to the writer input. diff --git a/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx index 68653b4e0d5bb5a4a17e240bb6068bb8f94264e1..d42f8cd56e1227d88f1fe1b8bd956538a4bb80aa 100644 --- a/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx +++ b/Examples/Radiometry/AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx @@ -26,10 +26,7 @@ Output/pretty_AVIMultiChannelRAndGAndNIRVegetationIndex.png \ 3 \ 2 \ - 4 \ - 660 \ - 560 \ - 830 + 4 */ @@ -76,12 +73,11 @@ int main(int argc, char* argv[]) { - if (argc < 11) + if (argc < 8) { std::cerr << "Missing Parameters " << std::endl; std::cerr << "Usage: " << argv[0]; - std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , greenChannel , nirChannel ,"; - std::cerr << " lambdaR, lambdaG, lambdaNIR " << std::endl; + std::cerr << " inputImage , outputImage , prettyInput , prettyOutput , redChannel , greenChannel , nirChannel ," << std::endl; return 1; } @@ -102,7 +98,7 @@ int main(int argc, char* argv[]) // The AVI (Angular Vegetation Index) is // instantiated using the image pixel types as template parameters. - typedef otb::Functor::AVI<InputPixelType, InputPixelType, InputPixelType, OutputPixelType> FunctorType; + typedef otb::Functor::AVI<InputPixelType, OutputPixelType> FunctorType; // The // \doxygen{itk}{UnaryFunctorImageFilter} @@ -123,18 +119,9 @@ int main(int argc, char* argv[]) // The three used index bands (red, green and NIR) are declared. - filter->GetFunctor().SetRedIndex(::atoi(argv[5])); - filter->GetFunctor().SetGreenIndex(::atoi(argv[6])); - filter->GetFunctor().SetNIRIndex(::atoi(argv[7])); - - // The $\lambda$ R, G and NIR parameters are set. The - // \doxygen{otb::Functor}{AVI} - // class sets the default values of $\lambda$ to $660$, $560$ and - // $830$. - - filter->GetFunctor().SetLambdaR(::atof(argv[8])); - filter->GetFunctor().SetLambdaG(::atof(argv[9])); - filter->GetFunctor().SetLambdaNir(::atof(argv[10])); + filter->GetFunctor().SetBandIndex(CommonBandNames::RED, ::atoi(argv[5])); + filter->GetFunctor().SetBandIndex(CommonBandNames::GREEN, ::atoi(argv[6])); + filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, ::atoi(argv[7])); // The filter input is linked to the reader output and // the filter output is linked to the writer input. diff --git a/Examples/Radiometry/CMakeLists.txt b/Examples/Radiometry/CMakeLists.txt index c33eed313333af0b2a675d1ef787e596ebe4a3d0..48af7c1d8fb654efb198553c3b648b932073c558 100644 --- a/Examples/Radiometry/CMakeLists.txt +++ b/Examples/Radiometry/CMakeLists.txt @@ -32,10 +32,6 @@ endif() add_executable(AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter.cxx) target_link_libraries(AVIMultiChannelRAndGAndNIRVegetationIndexImageFilter ${OTB_LIBRARIES}) -add_executable(NDVIRAndNIRVegetationIndexImageFilter NDVIRAndNIRVegetationIndexImageFilter.cxx) -target_link_libraries(NDVIRAndNIRVegetationIndexImageFilter ${OTB_LIBRARIES}) - - if(BUILD_TESTING) add_subdirectory(test) endif() diff --git a/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx b/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx deleted file mode 100644 index d95aae28065d70a953109885e2f428fddc14f5a9..0000000000000000000000000000000000000000 --- a/Examples/Radiometry/NDVIRAndNIRVegetationIndexImageFilter.cxx +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -/* Example usage: -./NDVIRAndNIRVegetationIndexImageFilter Input/NDVI_2.hdr \ - Input/NDVI_3.hdr \ - Output/NDVIRAndNIRVegetationIndex.tif \ - Output/pretty_Red.png \ - Output/pretty_NIR.png \ - Output/pretty_NDVIRAndNIRVegetationIndex.png -*/ - - -// \index{otb::VegetationIndicesFunctor} -// \index{otb::VegetationIndicesFunctor!header} -// -// The following example illustrates the use of the -// \doxygen{itk}{BinaryFunctorImageFilter} with the use of the Normalized -// Difference Vegatation Index (NDVI). -// NDVI computes the difference between the NIR channel, noted $L_{NIR}$, and the red channel, -// noted $L_{r}$ radiances reflected from the surface and transmitted through the atmosphere: -// -// \begin{equation} -// \mathbf{NDVI} = \frac{L_{NIR}-L_{r}}{L_{NIR}+L_{r}} -// \end{equation} -// -// \relatedClasses -// \begin{itemize} -// \item \subdoxygen{otb}{Functor}{RVI} -// \item \subdoxygen{otb}{Functor}{PVI} -// \item \subdoxygen{otb}{Functor}{SAVI} -// \item \subdoxygen{otb}{Functor}{TSAVI} -// \item \subdoxygen{otb}{Functor}{MSAVI} -// \item \subdoxygen{otb}{Functor}{GEMI} -// \item \subdoxygen{otb}{Functor}{WDVI} -// \item \subdoxygen{otb}{Functor}{IPVI} -// \item \subdoxygen{otb}{Functor}{TNDVI} -// \end{itemize} -// -// Let's look at the minimal code required to use this algorithm. - -#include "itkMacro.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "itkBinaryFunctorImageFilter.h" -#include "otbVegetationIndicesFunctor.h" -#include "itkRescaleIntensityImageFilter.h" - -int main(int argc, char* argv[]) -{ - if (argc < 6) - { - std::cerr << "Missing Parameters " << std::endl; - std::cerr << "Usage: " << argv[0]; - std::cerr << " inputImage1 , inputImage2 , outputImage , prettyinputImage1 , prettyinputImage2 , prettyOutput" << std::endl; - return 1; - } - - // The image types are now defined using pixel types the - // dimension. Input and output images are defined as \doxygen{otb}{Image}. - - const unsigned int Dimension = 2; - typedef double InputPixelType; - typedef float OutputPixelType; - typedef otb::Image<InputPixelType, Dimension> InputRImageType; - typedef otb::Image<InputPixelType, Dimension> InputNIRImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - // We instantiate reader and writer types - typedef otb::ImageFileReader<InputRImageType> RReaderType; - typedef otb::ImageFileReader<InputNIRImageType> NIRReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - // The NDVI (Normalized Difference Vegetation Index) is instantiated using - // the images pixel type as template parameters. It is - // implemented as a functor class which will be passed as a - // parameter to an \doxygen{itk}{BinaryFunctorImageFilter}. - - typedef otb::Functor::NDVI<InputPixelType, InputPixelType, OutputPixelType> FunctorType; - - // The \doxygen{itk}{BinaryFunctorImageFilter} type is instantiated using the images - // types and the NDVI functor as template parameters. - - typedef itk::BinaryFunctorImageFilter<InputRImageType, InputNIRImageType, OutputImageType, FunctorType> NDVIImageFilterType; - - // Instantiating object - NDVIImageFilterType::Pointer filter = NDVIImageFilterType::New(); - RReaderType::Pointer readerR = RReaderType::New(); - NIRReaderType::Pointer readerNIR = NIRReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - // Now the input images are set and a name is given to the output image. - - readerR->SetFileName(argv[1]); - readerNIR->SetFileName(argv[2]); - writer->SetFileName(argv[3]); - - // We set the processing pipeline: filter inputs are linked to - // the reader output and the filter output is linked to the writer - // input. - - filter->SetInput1(readerR->GetOutput()); - filter->SetInput2(readerNIR->GetOutput()); - - writer->SetInput(filter->GetOutput()); - - // Invocation of the \code{Update()} method on the writer triggers the - // execution of the pipeline. It is recommended to place \code{update()} calls in a - // \code{try/catch} block in case errors occur and exceptions are thrown. - - try - { - writer->Update(); - } - catch (itk::ExceptionObject& excep) - { - std::cerr << "Exception caught !" << std::endl; - std::cerr << excep << std::endl; - } - catch (...) - { - std::cout << "Unknown exception !" << std::endl; - return EXIT_FAILURE; - } - - // Pretty image creation for the printing - typedef otb::Image<unsigned char, Dimension> OutputPrettyImageType; - typedef otb::ImageFileWriter<OutputPrettyImageType> WriterPrettyType; - typedef itk::RescaleIntensityImageFilter<OutputImageType, OutputPrettyImageType> RescalerType; - typedef itk::RescaleIntensityImageFilter<InputRImageType, OutputPrettyImageType> RescalerRType; - typedef itk::RescaleIntensityImageFilter<InputNIRImageType, OutputPrettyImageType> RescalerNIRType; - - RescalerType::Pointer rescaler = RescalerType::New(); - WriterPrettyType::Pointer prettyWriter = WriterPrettyType::New(); - rescaler->SetInput(filter->GetOutput()); - rescaler->SetOutputMinimum(0); - rescaler->SetOutputMaximum(255); - prettyWriter->SetFileName(argv[6]); - prettyWriter->SetInput(rescaler->GetOutput()); - - RescalerRType::Pointer rescalerR = RescalerRType::New(); - RescalerNIRType::Pointer rescalerNIR = RescalerNIRType::New(); - WriterPrettyType::Pointer prettyWriterR = WriterPrettyType::New(); - WriterPrettyType::Pointer prettyWriterNIR = WriterPrettyType::New(); - rescalerR->SetInput(readerR->GetOutput()); - rescalerR->SetOutputMinimum(0); - rescalerR->SetOutputMaximum(255); - prettyWriterR->SetFileName(argv[4]); - prettyWriterR->SetInput(rescalerR->GetOutput()); - - rescalerNIR->SetInput(readerNIR->GetOutput()); - rescalerNIR->SetOutputMinimum(0); - rescalerNIR->SetOutputMaximum(255); - prettyWriterNIR->SetFileName(argv[5]); - prettyWriterNIR->SetInput(rescalerNIR->GetOutput()); - - try - { - prettyWriter->Update(); - prettyWriterNIR->Update(); - prettyWriterR->Update(); - } - catch (itk::ExceptionObject& excep) - { - std::cerr << "Exception caught !" << std::endl; - std::cerr << excep << std::endl; - } - catch (...) - { - std::cout << "Unknown exception !" << std::endl; - return EXIT_FAILURE; - } - - // Let's now run this example using as input the images - // \code{NDVI\_3.hdr} and \code{NDVI\_4.hdr} (images kindly and free of charge given by SISA and CNES) - // provided in the directory \code{Examples/Data}. - // - // - // \begin{figure} \center - // \includegraphics[width=0.24\textwidth]{pretty_Red.eps} - // \includegraphics[width=0.24\textwidth]{pretty_NIR.eps} - // \includegraphics[width=0.24\textwidth]{pretty_NDVIRAndNIRVegetationIndex.eps} - // \itkcaption[ARVI Example]{NDVI input images on the left (Red channel and NIR channel), on the right the result of the algorithm.} - // \label{fig:NDVIRAndNIRIndex} - // \end{figure} - - return EXIT_SUCCESS; -} diff --git a/Examples/Radiometry/test/CMakeLists.txt b/Examples/Radiometry/test/CMakeLists.txt index b30d3aa7ce82dc01e623f5bbd7efb4d843133498..4bd6befaff4c0b1de63209fcbf8f48bd55990365 100644 --- a/Examples/Radiometry/test/CMakeLists.txt +++ b/Examples/Radiometry/test/CMakeLists.txt @@ -35,7 +35,6 @@ otb_add_test(NAME raTeARVIMultiChannelRAndBAndNIRVegetationIndexImageFilterTest 1 2 3 - 0.6 # Gamma parameter ) # ------- AVIMultiChannelRAndGAndNIRVegetationIndexImageFilterTest ------------------------------ @@ -52,24 +51,6 @@ otb_add_test(NAME raTeAVIMultiChannelRAndGAndNIRVegetationIndexImageFilterTest C 3 2 4 # indices of the channels - 660. - 560. - 830. # lambdaR, lambdaG, lambdaNir -) - -# ------- NDVIRAndNIRVegetationIndexImageFilter ------------------------------ - -otb_add_test(NAME raTeNDVIRAndNIRVegetationIndexImageFilterTest COMMAND ${OTB_TEST_DRIVER} - --compare-image ${NOTOL} - ${BASELINE}/NDVIRAndNIRVegetationIndex.tif - ${TEMP}/NDVIRAndNIRVegetationIndex.tif - Execute $<TARGET_FILE:NDVIRAndNIRVegetationIndexImageFilter> - ${INPUTDATA}/poupees_sub_c1.png - ${INPUTDATA}/poupees_sub_c2.png - ${TEMP}/NDVIRAndNIRVegetationIndex.tif - ${TEMP}/NDVIRAndNIRVegetationIndex2.tif - ${TEMP}/NDVIRAndNIRVegetationIndex3.tif - ${TEMP}/NDVIRAndNIRVegetationIndex4.tif ) if(OTBOpticalCalibration_LOADED) @@ -103,4 +84,4 @@ otb_add_test(NAME raTeAtmosphericCorrectionSequencementTest COMMAND ${OTB_TEST_D 2 # Radius; 0.020 # pixel spacing in kilometers ) -endif() \ No newline at end of file +endif() diff --git a/Examples/Simulation/LAIFromNDVIImageTransform.cxx b/Examples/Simulation/LAIFromNDVIImageTransform.cxx index ec6dce3b1ce40748987273f04334b077785945a1..133e5dd6444ddfd50625cc421e9642dc5558bd98 100644 --- a/Examples/Simulation/LAIFromNDVIImageTransform.cxx +++ b/Examples/Simulation/LAIFromNDVIImageTransform.cxx @@ -64,8 +64,7 @@ int main(int argc, char* argv[]) // Filter type is a generic \doxygen{itk}{UnaryFunctorImageFilter} using Formosat2 specific LAI // \doxygen{otb}{LAIFromNDVIFormosat2Functor}. - typedef otb::Functor::LAIFromNDVIFormosat2Functor<InputImageType::InternalPixelType, InputImageType::InternalPixelType, OutputImageType::PixelType> - FunctorType; + typedef otb::Functor::LAIFromNDVIFormosat2Functor<InputImageType::InternalPixelType, OutputImageType::PixelType> FunctorType; typedef itk::UnaryFunctorImageFilter<InputImageType, OutputImageType, FunctorType> LAIFRomNDVIImageFilterType; // Instantiating object @@ -96,8 +95,8 @@ int main(int argc, char* argv[]) // unsigned int redChannel = static_cast<unsigned int>(atoi(argv[5])); unsigned int nirChannel = static_cast<unsigned int>(atoi(argv[6])); - filter->GetFunctor().SetRedIndex(redChannel); - filter->GetFunctor().SetNIRIndex(nirChannel); + filter->GetFunctor().SetBandIndex(CommonBandNames::RED, redChannel); + filter->GetFunctor().SetBandIndex(CommonBandNames::NIR, nirChannel); // The invocation of the \code{Update()} method triggers the // execution of the pipeline. diff --git a/Examples/Tutorials/OrthoFusion.cxx b/Examples/Tutorials/OrthoFusion.cxx index a94f608086de60b7907003cecca3822fee7ce8e4..c0ead29574f94efba0267646cbeea59af4162b45 100644 --- a/Examples/Tutorials/OrthoFusion.cxx +++ b/Examples/Tutorials/OrthoFusion.cxx @@ -28,8 +28,7 @@ #include "otbImageFileReader.h" #include "otbImageFileWriter.h" -#include "otbOrthoRectificationFilter.h" -#include "otbGenericMapProjection.h" +#include "otbGenericRSResampleImageFilter.h" #include "otbSimpleRcsPanSharpeningFusionImageFilter.h" #include "otbStandardFilterWatcher.h" @@ -89,12 +88,9 @@ int main(int argc, char* argv[]) // \item the hemisphere // \end{itemize} - typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> InverseProjectionType; - InverseProjectionType::Pointer utmMapProjection = InverseProjectionType::New(); - utmMapProjection->SetWkt( - otb::SpatialReference::FromUTM(atoi(argv[4]),argv[5][0]=='N' ? + std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[4]),argv[5][0]=='N' ? otb::SpatialReference::hemisphere::north : - otb::SpatialReference::hemisphere::south).ToWkt()); + otb::SpatialReference::hemisphere::south).ToWkt(); // We will need to pass several parameters to the orthorectification // concerning the desired output region: @@ -118,10 +114,10 @@ int main(int argc, char* argv[]) // We declare the orthorectification filter. And provide the different // parameters: - typedef otb::OrthoRectificationFilter<ImageType, DoubleImageType, InverseProjectionType> OrthoRectifFilterType; + typedef otb::GenericRSResampleImageFilter<ImageType, DoubleImageType> OrthoRectifFilterType; OrthoRectifFilterType::Pointer orthoRectifPAN = OrthoRectifFilterType::New(); - orthoRectifPAN->SetMapProjection(utmMapProjection); + orthoRectifPAN->SetOutputProjectionRef(wkt); orthoRectifPAN->SetInput(readerPAN->GetOutput()); @@ -133,12 +129,12 @@ int main(int argc, char* argv[]) // Now we are able to have the orthorectified area from the PAN image. We just // have to follow a similar process for the XS image. - typedef otb::OrthoRectificationFilter<VectorImageType, DoubleVectorImageType, InverseProjectionType> VectorOrthoRectifFilterType; + typedef otb::GenericRSResampleImageFilter<VectorImageType, DoubleVectorImageType> VectorOrthoRectifFilterType; VectorOrthoRectifFilterType::Pointer orthoRectifXS = VectorOrthoRectifFilterType::New(); - orthoRectifXS->SetMapProjection(utmMapProjection); + orthoRectifXS->SetOutputProjectionRef(wkt); orthoRectifXS->SetInput(readerXS->GetOutput()); @@ -160,8 +156,6 @@ int main(int argc, char* argv[]) writer->SetInput(fusion->GetOutput()); - writer->SetAutomaticTiledStreaming(); - otb::StandardFilterWatcher watcher(writer, "OrthoFusion"); writer->Update(); diff --git a/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx b/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx index 012b04c2b6d78f9c1df7cebc4eee57bb7dd97682..19958c297110bb1920f4f547686e6dcfdb0daa14 100644 --- a/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx +++ b/Modules/Adapters/GdalAdapters/src/otbSpatialReference.cxx @@ -200,7 +200,9 @@ unsigned int SpatialReference::ToEPSG() const OGRSpatialReferencePtr tmpSRS(m_SR->Clone()); +#if GDAL_VERSION_NUM < 2050000 tmpSRS->Fixup(); +#endif tmpSRS->AutoIdentifyEPSG(); const char * epsg = nullptr; diff --git a/Modules/Applications/AppChangeDetection/app/otbMultivariateAlterationDetector.cxx b/Modules/Applications/AppChangeDetection/app/otbMultivariateAlterationDetector.cxx index ab2f1476d26fe4d7b079cbaa702294487a2378f9..e5e0c6977a1a184c74f742c57c4fb26330cbb3fd 100644 --- a/Modules/Applications/AppChangeDetection/app/otbMultivariateAlterationDetector.cxx +++ b/Modules/Applications/AppChangeDetection/app/otbMultivariateAlterationDetector.cxx @@ -49,7 +49,6 @@ private: SetDescription("Change detection by Multivariate Alteration Detector (MAD) algorithm"); // Documentation - SetDocName("Multivariate Alteration Detector"); SetDocLongDescription("This application performs change detection between two multispectral" " images using the Multivariate Alteration Detector (MAD) [1]" " algorithm.\n\n" diff --git a/Modules/Applications/AppClassification/app/CMakeLists.txt b/Modules/Applications/AppClassification/app/CMakeLists.txt index b646618959248fab615337a300a67a254f1337b5..6fc42a4ee2c73a284a379f9763b170fac9b50093 100644 --- a/Modules/Applications/AppClassification/app/CMakeLists.txt +++ b/Modules/Applications/AppClassification/app/CMakeLists.txt @@ -48,11 +48,6 @@ otb_create_application( SOURCES otbFusionOfClassifications.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) -otb_create_application( - NAME ComputePolylineFeatureFromImage - SOURCES otbComputePolylineFeatureFromImage.cxx - LINK_LIBRARIES ${${otb-module}_LIBRARIES}) - if(OTB_USE_SHARK) otb_create_application( NAME KMeansClassification @@ -71,13 +66,13 @@ otb_create_application( LINK_LIBRARIES ${${otb-module}_LIBRARIES}) otb_create_application( - NAME PredictRegression - SOURCES otbPredictRegression.cxx + NAME TrainVectorRegression + SOURCES otbTrainVectorRegression.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) otb_create_application( - NAME DSFuzzyModelEstimation - SOURCES otbDSFuzzyModelEstimation.cxx + NAME PredictRegression + SOURCES otbPredictRegression.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) otb_create_application( @@ -95,11 +90,6 @@ otb_create_application( SOURCES otbComputeImagesStatistics.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) -otb_create_application( - NAME VectorDataDSValidation - SOURCES otbVectorDataDSValidation.cxx - LINK_LIBRARIES ${${otb-module}_LIBRARIES}) - otb_create_application( NAME PolygonClassStatistics SOURCES otbPolygonClassStatistics.cxx diff --git a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx index 4738434b8d262648306d60099e7b0624a3bbb8af..516f3a47b0e2a1a6a5f0e1b72ea48dd4ea164a55 100644 --- a/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx +++ b/Modules/Applications/AppClassification/app/otbClassificationMapRegularization.cxx @@ -62,7 +62,6 @@ private: SetName("ClassificationMapRegularization"); SetDescription("Filters the input labeled image using Majority Voting in a ball shaped neighbordhood"); - SetDocName("Classification Map Regularization"); SetDocLongDescription( "This application filters the input labeled image (with a maximal class label = 65535) using Majority Voting in a ball shaped neighbordhood." diff --git a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx index 55cf789574a84708deee3ed5aec82331f048be6c..6b6e55539e049d637baa59a75a8ac51794b61cc6 100644 --- a/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx +++ b/Modules/Applications/AppClassification/app/otbComputeConfusionMatrix.cxx @@ -109,7 +109,6 @@ private: SetDescription("Computes the confusion matrix of a classification"); // Documentation - SetDocName("Confusion matrix Computation"); SetDocLongDescription("This application computes the confusion matrix of a classification map relative to a ground truth dataset. " "This ground truth can be given as a raster or a vector data. Only reference and produced pixels with values different " "from NoData are handled in the calculation of the confusion matrix. The confusion matrix is organized the following way: " diff --git a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx index dbce1c90c2b953c1af3a4db343acf0513c671550..965f4fb135859a26baa3b4474449a1acd5240214 100644 --- a/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbComputeImagesStatistics.cxx @@ -48,7 +48,6 @@ private: void DoInit() override { SetName("ComputeImagesStatistics"); - SetDocName("Compute Images second order statistics"); SetDescription("Computes global mean and standard deviation for each band " "from a set of images and optionally saves the results in an XML file."); SetDocLongDescription("This application computes a global mean and standard deviation " diff --git a/Modules/Applications/AppClassification/app/otbComputeOGRLayersFeaturesStatistics.cxx b/Modules/Applications/AppClassification/app/otbComputeOGRLayersFeaturesStatistics.cxx index d1542167271f7dce30240bef2b78809d1b67f2b1..c8b721a62b32d6cc73b19633b9f9b3adcc8830a7 100644 --- a/Modules/Applications/AppClassification/app/otbComputeOGRLayersFeaturesStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbComputeOGRLayersFeaturesStatistics.cxx @@ -51,7 +51,6 @@ private: SetName("ComputeOGRLayersFeaturesStatistics"); SetDescription("Compute statistics of the features in a set of OGR Layers"); - SetDocName("ComputeOGRLayersFeaturesStatistics"); SetDocLongDescription("Compute statistics (mean and standard deviation) of the features in a set of OGR Layers, and write them in an XML file. This XML file can then be used by the training application."); SetDocLimitations("Experimental. For now only shapefiles are supported."); SetDocAuthors("David Youssefi during internship at CNES"); diff --git a/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx b/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx deleted file mode 100644 index 919ad16354ffb3fbed8b08585e2d5c562c044955..0000000000000000000000000000000000000000 --- a/Modules/Applications/AppClassification/app/otbComputePolylineFeatureFromImage.cxx +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include <iostream> - -#include "otbVectorImage.h" - -#include "otbWrapperApplicationFactory.h" - - -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" -#include "itkPreOrderTreeIterator.h" - -#include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataTransformFilter.h" -#include "itkAffineTransform.h" - -#include "otbParserConditionDataNodeFeatureFunction.h" -#include "otbNDVIDataNodeFeatureFunction.h" - -// Elevation handler -#include "otbWrapperElevationParametersHandler.h" - -namespace otb -{ -namespace Wrapper -{ - -class ComputePolylineFeatureFromImage: public Application -{ -public: - /** Standard class typedefs. */ - typedef ComputePolylineFeatureFromImage Self; - typedef Application Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - // Images - typedef FloatVectorImageType::PixelType PixelType; - typedef FloatVectorImageType ImageType; - - // VectorData - typedef VectorData<> VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef DataNodeType::ValuePrecisionType PrecisionType; - typedef DataNodeType::PrecisionType CoordRepType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> TreeIteratorType; - typedef VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> VectorDataIntoImageProjType; - typedef VectorDataProjectionFilter<VectorDataType, VectorDataType> VectorDataProjectionFilterType; - - typedef ParserConditionDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType> - ParserConditionFeatureFunctionType; - - /** Standard macro */ - itkNewMacro(Self) -; - - itkTypeMacro(ComputePolylineFeatureFromImage, otb::Application) -; - -private: - void DoInit() override - { - SetName("ComputePolylineFeatureFromImage"); - SetDescription("This application computes the chosen descriptors for each studied polyline contained in the input VectorData."); - - SetDocName("Compute Polyline Feature From Image"); - SetDocLongDescription("The first step in the classifier fusion based validation is to compute the chosen descriptors for each studied polyline."); - SetDocLimitations("Since it does not rely on streaming process, take care of the size of input image before launching application."); - SetDocAuthors("OTB-Team"); - SetDocSeeAlso(" "); - AddDocTag(Tags::FeatureExtraction); - - AddParameter(ParameterType_InputImage, "in", "Input Image"); - SetParameterDescription("in", "An image to compute the descriptors on."); - - AddParameter(ParameterType_InputVectorData, "vd", "Vector Data"); - SetParameterDescription("vd", "Vector data containing the polylines where the features will be computed."); - - // Elevation - ElevationParametersHandler::AddElevationParameters(this, "elev"); - - AddParameter(ParameterType_String, "expr", "Feature expression"); - SetParameterDescription("expr", "The feature formula (b1 < 0.3) where b1 is the standard name of input image first band"); - - AddParameter(ParameterType_String, "field", "Feature name"); - SetParameterDescription("field", "The field name corresponding to the feature codename (NONDVI, ROADSA...)"); - - AddParameter(ParameterType_OutputVectorData, "out", "Output Vector Data"); - SetParameterDescription("out", "The output vector data containing polylines with a new field"); - - // Doc example parameter settings - SetDocExampleParameterValue("in", "NDVI.TIF"); - SetDocExampleParameterValue("vd", "roads_ground_truth.shp"); - SetDocExampleParameterValue("expr", "\"(b1 > 0.4)\""); - SetDocExampleParameterValue("field", "NONDVI"); - SetDocExampleParameterValue("out", "PolylineFeatureFromImage_LI_NONDVI_gt.shp"); - - SetOfficialDocLink(); - } - - void DoUpdateParameters() override - { - // Nothing to do here : all parameters are independent - } - - void DoExecute() override - { - // Vector Data into Image projection - FloatVectorImageType::Pointer inImage = GetParameterImage("in"); - - inImage->UpdateOutputInformation(); - try - { - inImage->Update(); - } - catch (...) - { - itkGenericExceptionMacro(<< "Error during image update, maybe your image is to big."); - } - - otbAppLogDEBUG( << "Starting PolylineFeature extraction process" ) - - // Vector Data into Image projection - //// Read the Vectordata - - VectorDataType* inVectorData = GetParameterVectorData("vd"); - inVectorData->Update(); - //// Projection - VectorDataIntoImageProjType::Pointer vprojIm = VectorDataIntoImageProjType::New(); - vprojIm->SetInputVectorData(inVectorData); - vprojIm->SetInputImage(inImage); - - // Setup the DEM Handler - otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev"); - - vprojIm->SetUseOutputSpacingAndOriginFromImage(true); // we want index as input; - vprojIm->Update(); - - // Add description - ParserConditionFeatureFunctionType::Pointer vdescriptor = ParserConditionFeatureFunctionType::New(); - vdescriptor->SetExpression(GetParameterString("expr")); - vdescriptor->SetInputImage(inImage); - - m_OutVectorData = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = m_OutVectorData->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - m_OutVectorData->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - m_OutVectorData->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vprojIm->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - - while (!itVector.IsAtEnd()) - { - vdescriptor->SetInputImage(inImage); - if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder()) - { - DataNodeType::Pointer currentGeometry = itVector.Get(); - currentGeometry->SetFieldAsDouble(GetParameterString("field"), - (double) (vdescriptor->Evaluate(*(currentGeometry.GetPointer()))[0])); - m_OutVectorData->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - /* - * Reprojection of the output VectorData - * - * The output of VectorDataToRoadDescription is in image index coordinates - * - * 3 cases : - * - input image has no geo-information : pass through - * - input image is in cartographic projection : apply image spacing and origin, and set the ProjectionRef - * - input image is in sensor model geometry : reproject in WGS84 - * - */ - - std::string projRef = inImage->GetProjectionRef(); - ImageKeywordlist kwl; - itk::ExposeMetaData<ImageKeywordlist>(inImage->GetMetaDataDictionary(), MetaDataKey::OSSIMKeywordlistKey, kwl); - - if (!projRef.empty()) - { - // image is in cartographic projection - // apply spacing and origin + set projection WKT - // The VectorData in output of the chain is in image index coordinate, - // and the projection information is lost - // Apply an affine transform to apply image origin and spacing, - // and arbitrarily set the ProjectionRef to the input image ProjectionRef - - typedef itk::AffineTransform<VectorDataType::PrecisionType, 2> TransformType; - typedef otb::VectorDataTransformFilter<VectorDataType, VectorDataType> VDTransformType; - - TransformType::ParametersType params; - params.SetSize(6); - params[0] = inImage->GetSignedSpacing()[0]; - params[1] = 0; - params[2] = 0; - params[3] = inImage->GetSignedSpacing()[1]; - params[4] = inImage->GetOrigin()[0]; - params[5] = inImage->GetOrigin()[1]; - - TransformType::Pointer transform = TransformType::New(); - transform->SetParameters(params); - - VDTransformType::Pointer vdTransform = VDTransformType::New(); - vdTransform->SetTransform(transform); - vdTransform->SetInput(m_OutVectorData); - vdTransform->Update(); - - m_ProjectedVectorData = vdTransform->GetOutput(); - - m_ProjectedVectorData->SetProjectionRef(inImage->GetProjectionRef()); - } - else - if (kwl.GetSize() > 0) - { - // image is in sensor model geometry - - // Reproject VectorData in image projection - VectorDataProjectionFilterType::Pointer vproj = VectorDataProjectionFilterType::New(); - vproj->SetInput(m_OutVectorData); - - vproj->SetOutputKeywordList(inImage->GetImageKeywordlist()); - vproj->SetOutputProjectionRef(inImage->GetProjectionRef()); - vproj->SetOutputOrigin(inImage->GetOrigin()); - vproj->SetOutputSpacing(inImage->GetSignedSpacing()); - - // Setup the DEM Handler - otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev"); - - vproj->Update(); - m_ProjectedVectorData = vproj->GetOutput(); - } - else - { - // no georeferencing information - m_ProjectedVectorData = m_OutVectorData; - } - - // Set the output vectorData - SetParameterOutputVectorData("out", m_ProjectedVectorData); - - }; - - VectorDataType::Pointer m_ProjectedVectorData; - VectorDataType::Pointer m_OutVectorData; - -}; - -} -} - -OTB_APPLICATION_EXPORT(otb::Wrapper::ComputePolylineFeatureFromImage) - - diff --git a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx b/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx deleted file mode 100644 index 2804718d78036f2a3c21a8c1661a948b2538b8a4..0000000000000000000000000000000000000000 --- a/Modules/Applications/AppClassification/app/otbDSFuzzyModelEstimation.cxx +++ /dev/null @@ -1,451 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <iostream> - -#include "otbWrapperApplication.h" -#include "otbWrapperApplicationFactory.h" -#include "otbWrapperStringListParameter.h" -#include "otbImageToEnvelopeVectorDataFilter.h" -#include "otbVectorDataToRandomLineGenerator.h" -#include "itkAmoebaOptimizer.h" -#include "otbStandardDSCostFunction.h" - - -namespace otb -{ - -namespace Wrapper -{ - -#include "itkCommand.h" -class CommandIterationUpdate : public itk::Command -{ -public: -typedef CommandIterationUpdate Self; -typedef itk::Command Superclass; -typedef itk::SmartPointer<Self> Pointer; -itkNewMacro( Self ); -protected: -CommandIterationUpdate() {}; -public: -typedef itk::AmoebaOptimizer OptimizerType; -typedef const OptimizerType * OptimizerPointer; - - -void Execute(itk::Object *caller, const itk::EventObject & event) override -{ - Execute( (const itk::Object *)caller, event); -} - -void Execute(const itk::Object * object, const itk::EventObject & event) override -{ - OptimizerPointer optimizer = - dynamic_cast< OptimizerPointer >( object ); - if( ! itk::IterationEvent().CheckEvent( &event ) ) - { - return; - } - std::ostringstream message; - message << optimizer->GetCachedValue() << " "; - message << optimizer->GetCachedCurrentPosition() << std::endl; - std::cout<<message.str()<<std::endl; -} - - -}; - - -class DSFuzzyModelEstimation: public Application -{ -public: - /** Standard class typedefs. */ - typedef DSFuzzyModelEstimation Self; - typedef Application Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - typedef VectorData<double> VectorDataType; - - typedef VectorDataType::DataTreeType DataTreeType; - typedef VectorDataType::DataNodeType DataNodeType; - - typedef VectorDataType::ValuePrecisionType PrecisionType; - typedef VectorDataType::PrecisionType CoordRepType; - - typedef otb::Wrapper::StringListParameter::StringListType StringListType; - - typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType> - ValidationFilterType; - typedef otb::StandardDSCostFunction<ValidationFilterType> CostFunctionType; - typedef CostFunctionType::LabelSetType LabelSetType; - - typedef itk::AmoebaOptimizer OptimizerType; - - typedef otb::FuzzyDescriptorsModelManager::DescriptorsModelType - DescriptorsModelType; - typedef otb::FuzzyDescriptorsModelManager::DescriptorListType - DescriptorListType; - - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> - TreeIteratorType; - - - /** Standard macro */ - itkNewMacro(Self); - - itkTypeMacro(DSFuzzyModelEstimation, otb::Application); - -private: - void DoInit() override - { - SetName("DSFuzzyModelEstimation"); - SetDescription("Estimate feature fuzzy model parameters using 2 vector data (ground truth samples and wrong samples)."); - - SetDocName("Fuzzy Model estimation"); - SetDocLongDescription("Estimate feature fuzzy model parameters using 2 vector data (ground truth samples and wrong samples)."); - SetDocLimitations("None."); - SetDocAuthors("OTB-Team"); - SetDocSeeAlso(" "); - - AddDocTag(Tags::FeatureExtraction); - - AddParameter(ParameterType_InputVectorData, "psin", "Input Positive Vector Data"); - SetParameterDescription("psin", "Ground truth vector data for positive samples"); - - AddParameter(ParameterType_InputVectorData, "nsin", "Input Negative Vector Data"); - SetParameterDescription("nsin", "Ground truth vector data for negative samples"); - - AddParameter(ParameterType_StringList, "belsup", "Belief Support"); - SetParameterDescription("belsup", "Dempster Shafer study hypothesis to compute belief"); - - AddParameter(ParameterType_StringList, "plasup", "Plausibility Support"); - SetParameterDescription("plasup", "Dempster Shafer study hypothesis to compute plausibility"); - - AddParameter(ParameterType_OutputFilename, "out", "Output filename"); - SetParameterDescription("out", "Output model file name (xml file) contains the optimal model to perform information fusion."); - - AddParameter(ParameterType_String, "cri", "Criterion"); - SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)"); - MandatoryOff("cri"); - SetParameterString("cri","((Belief + Plausibility)/2.)"); - - AddParameter(ParameterType_Float,"wgt","Weighting"); - SetParameterDescription("wgt","Coefficient between 0 and 1 to promote undetection or false detections (default 0.5)"); - MandatoryOff("wgt"); - SetParameterFloat("wgt",0.5); - - AddParameter(ParameterType_InputFilename,"initmod","initialization model"); - SetParameterDescription("initmod","Initialization model (xml file) to be used. If the xml initialization model is set, the descriptor list is not used (specified using the option -desclist)"); - MandatoryOff("initmod"); - - AddParameter(ParameterType_StringList, "desclist","Descriptor list"); - SetParameterDescription("desclist","List of the descriptors to be used in the model (must be specified to perform an automatic initialization)"); - MandatoryOff("desclist"); - - AddParameter(ParameterType_Int,"maxnbit","Maximum number of iterations"); - MandatoryOff("maxnbit"); - SetParameterDescription("maxnbit","Maximum number of optimizer iteration (default 200)"); - SetParameterInt("maxnbit",200); - - AddParameter(ParameterType_Bool,"optobs","Optimizer Observer"); - SetParameterDescription("optobs","Activate the optimizer observer"); - - // Doc example parameter settings - SetDocExampleParameterValue("psin", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp"); - SetDocExampleParameterValue("nsin", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp"); - SetDocExampleParameterValue("belsup", "\"ROADSA\""); - SetDocExampleParameterValue("plasup", "\"NONDVI\" \"ROADSA\" \"NOBUIL\""); - SetDocExampleParameterValue("initmod", "Dempster-Shafer/DSFuzzyModel_Init.xml"); - SetDocExampleParameterValue("maxnbit", "4"); - SetDocExampleParameterValue("optobs", "true"); - SetDocExampleParameterValue("out", "DSFuzzyModelEstimation.xml"); - - SetOfficialDocLink(); - } - - void DoUpdateParameters() override - { - // Nothing to do here : all parameters are independent - - - // .. // - - - } - - void DoExecute() override - { - - //Instantiate - m_CostFunction = CostFunctionType::New(); - m_Optimizer = OptimizerType::New(); - - //Read the vector datas - VectorDataType::Pointer psVectorData = GetParameterVectorData("psin"); - psVectorData->Update(); - VectorDataType::Pointer nsVectorData = GetParameterVectorData("nsin"); - nsVectorData->Update(); - - // Load the initial descriptor model - DescriptorListType descList; - DescriptorsModelType descMod; - if (IsParameterEnabled("initmod")) - { - std::string descModFile = GetParameterString("initmod"); - descMod = FuzzyDescriptorsModelManager::Read(descModFile); - descList = FuzzyDescriptorsModelManager::GetDescriptorList(descMod); - } - else - { - StringListType stringList = GetParameterStringList("desclist"); - int nbsdDesc = stringList.size(); - for (int i = 0; i < nbsdDesc; i++) - { - descList.push_back(stringList[i]); - } - } - - m_CostFunction->SetDescriptorList(descList); - - // Compute statistics of all the descriptors - - std::vector<double> accFirstOrderPS, accSecondOrderPS, minPS, maxPS; - accFirstOrderPS.resize(descList.size()); - accSecondOrderPS.resize(descList.size()); - std::fill(accFirstOrderPS.begin(), accFirstOrderPS.end(), 0); - std::fill(accSecondOrderPS.begin(), accSecondOrderPS.end(), 0); - minPS.resize(descList.size()); - maxPS.resize(descList.size()); - unsigned int accNbElemPS = 0; - - TreeIteratorType itVectorPS(psVectorData->GetDataTree()); - for (itVectorPS.GoToBegin(); !itVectorPS.IsAtEnd(); ++itVectorPS) - { - if (!itVectorPS.Get()->IsRoot() && !itVectorPS.Get()->IsDocument() && !itVectorPS.Get()->IsFolder()) - { - DataNodeType::Pointer currentGeometry = itVectorPS.Get(); - - for (unsigned int i = 0; i < descList.size(); ++i) - { - double desc = currentGeometry->GetFieldAsDouble(descList[i]); - - accFirstOrderPS[i] += desc; - accSecondOrderPS[i] += desc * desc; - - if (desc < minPS[i]) - { - minPS[i] = desc; - } - if (desc > maxPS[i]) - { - maxPS[i] = desc; - } - - } - accNbElemPS++; - } - } - if (accNbElemPS == 0) - { - otbAppLogFATAL(<< "Error : no element found in positive vector data!"); - } - - TreeIteratorType itVectorNS(nsVectorData->GetDataTree()); - std::vector<double> accFirstOrderNS, accSecondOrderNS, minNS, maxNS; - minNS.resize(descList.size()); - maxNS.resize(descList.size()); - accFirstOrderNS.resize(descList.size()); - accSecondOrderNS.resize(descList.size()); - std::fill(accFirstOrderNS.begin(), accFirstOrderNS.end(), 0); - std::fill(accSecondOrderNS.begin(), accSecondOrderNS.end(), 0); - std::fill(minNS.begin(), minNS.end(), 1); - std::fill(maxNS.begin(), maxNS.end(), 0); - unsigned int accNbElemNS = 0; - - for (itVectorNS.GoToBegin(); !itVectorNS.IsAtEnd(); ++itVectorNS) - { - if (!itVectorNS.Get()->IsRoot() && !itVectorNS.Get()->IsDocument() && !itVectorNS.Get()->IsFolder()) - { - DataNodeType::Pointer currentGeometry = itVectorNS.Get(); - - for (unsigned int i = 0; i < descList.size(); ++i) - { - double desc = currentGeometry->GetFieldAsDouble(descList[i]); - - accFirstOrderNS[i] += desc; - accSecondOrderNS[i] += desc * desc; - - if (desc < minNS[i]) - { - minNS[i] = desc; - } - if (desc > maxNS[i]) - { - maxNS[i] = desc; - } - - } - accNbElemNS++; - } - } - if (accNbElemNS == 0) - { - otbAppLogFATAL(<< "Error : no element found in negative vector data!"); - } - otbAppLogINFO( << "Descriptors Stats : "); - otbAppLogINFO( << "Positive Samples"); - for (unsigned int i = 0; i < descList.size(); ++i) - { - double mean = accFirstOrderPS[i] / accNbElemPS; - double stddev = std::sqrt(accSecondOrderPS[i] / accNbElemPS - mean * mean); - otbAppLogINFO( << descList[i] << " : " << mean << " +/- " << stddev << " (min: " << minPS[i] << " max: " << maxPS[i] << ")"<< std::endl); - } - - otbAppLogINFO( << "Negative Samples" << std::endl); - for (unsigned int i = 0; i < descList.size(); ++i) - { - double mean = accFirstOrderNS[i] / accNbElemNS; - double stddev = std::sqrt(accSecondOrderNS[i] / accNbElemNS - mean * mean); - otbAppLogINFO(<< descList[i] << " : " << mean << " +/- " << stddev << " (min: " << minNS[i] << " max: " << maxNS[i] << ")"<< std::endl); - } - - OptimizerType::ParametersType initialPosition(4 * descList.size()); - - if (IsParameterEnabled("initmod")) - { - - for (unsigned int i = 0; i < 4; i++) - { - for (unsigned int j = 0; j < descList.size(); j++) - { - initialPosition.SetElement( - i + 4 * j, - otb::FuzzyDescriptorsModelManager::GetDescriptor(descList[j].c_str(), descMod).second[i]); - } - } - } - else - { - for (unsigned int j = 0; j < descList.size(); j++) - { - initialPosition.SetElement((j * 4), std::min(minNS[j], maxPS[j])); - initialPosition.SetElement((j * 4) + 2, std::max(minNS[j], maxPS[j])); - initialPosition.SetElement( - (j * 4) + 1, - 0.5 - * (initialPosition.GetElement((j * 4)) + initialPosition.GetElement((j * 4) + 2))); - initialPosition.SetElement((j * 4) + 3, 0.95); - } - } - - otbAppLogINFO(<<"Initial model: "<<initialPosition); - - //Cost Function - //Format Hypothesis - LabelSetType Bhyp, Phyp; - int nbSet; - - StringListType stringList = GetParameterStringList("belsup"); - nbSet = stringList.size(); - - for (int i = 0; i < nbSet; i++) - { - std::string str = stringList[i]; - Bhyp.insert(str); - } - m_CostFunction->SetBeliefHypothesis(Bhyp); - stringList = GetParameterStringList("plasup"); - nbSet = stringList.size(); - for (int i = 0; i < nbSet; i++) - { - std::string str = stringList[i]; - Phyp.insert(str); - } - m_CostFunction->SetPlausibilityHypothesis(Phyp); - - m_CostFunction->SetWeight(GetParameterFloat("wgt")); - - m_CostFunction->SetCriterionFormula(GetParameterString("cri")); - - m_CostFunction->SetGTVectorData(psVectorData); - m_CostFunction->SetNSVectorData(nsVectorData); - //Optimizer - m_Optimizer->SetCostFunction(m_CostFunction); - - m_Optimizer->SetMaximumNumberOfIterations(GetParameterInt("maxnbit")); - - OptimizerType::ParametersType simplexDelta(m_CostFunction->GetNumberOfParameters()); - simplexDelta.Fill(0.1); - - m_Optimizer->AutomaticInitialSimplexOff(); - m_Optimizer->SetInitialSimplexDelta(simplexDelta); - - m_Optimizer->SetInitialPosition(initialPosition); - - // Create the Command observer and register it with the optimizer. - CommandIterationUpdate::Pointer observer = CommandIterationUpdate::New(); - if (GetParameterInt("optobs")) - { - m_Optimizer->AddObserver(itk::IterationEvent(), observer); - } - - try - { - // do the optimization - m_Optimizer->StartOptimization(); - } - catch (itk::ExceptionObject& err) - { - // An error has occurred in the optimization. - // Update the parameters - otbAppLogFATAL("ERROR: Exception Caught : "<< err.GetDescription() << std::endl - << "numberOfIterations : " << m_Optimizer->GetOptimizer()->get_num_evaluations() << std::endl - << "Results : " << m_Optimizer->GetCurrentPosition() << std::endl); - } - // get the results - const unsigned int numberOfIterations = m_Optimizer->GetOptimizer()->get_num_evaluations(); - otbAppLogINFO("numberOfIterations : " << numberOfIterations << std::endl); - otbAppLogINFO("Results : " << m_Optimizer->GetCurrentPosition() << std::endl); - - for (unsigned int i = 0; i < descList.size(); i++) - { - otb::FuzzyDescriptorsModelManager::ParameterType tmpParams; - for (unsigned int j = 0; j < 4; j++) - { - tmpParams.push_back(m_Optimizer->GetCurrentPosition()[(i * 4) + j]); - } - otb::FuzzyDescriptorsModelManager::AddDescriptor(descList[i], tmpParams, m_Model); - } - otb::FuzzyDescriptorsModelManager::Save(GetParameterString("out"), m_Model); - - }; - - CostFunctionType::Pointer m_CostFunction; - OptimizerType::Pointer m_Optimizer; - otb::FuzzyDescriptorsModelManager::DescriptorsModelType m_Model; -}; - -} -} - -OTB_APPLICATION_EXPORT(otb::Wrapper::DSFuzzyModelEstimation) - diff --git a/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx b/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx index 3c6513bf57efb5a8c09760233d0eb49ad98843cb..34ba9ebaaaa5ef0ac6aaaaee3c8d040d7f44a8d4 100644 --- a/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx +++ b/Modules/Applications/AppClassification/app/otbFusionOfClassifications.cxx @@ -97,7 +97,6 @@ private: { SetName("FusionOfClassifications"); SetDescription("Fuses several classifications maps of the same image on the basis of class labels."); - SetDocName("Fusion of Classifications"); SetDocLongDescription("This application allows you to fuse several classification maps and produces a single more robust classification map. " "Fusion is done either by mean of Majority Voting, or with the Dempster Shafer combination method on class labels.\n\n" " - MAJORITY VOTING: for each pixel, the class with the highest number of votes is selected.\n" diff --git a/Modules/Applications/AppClassification/app/otbImageClassifier.cxx b/Modules/Applications/AppClassification/app/otbImageClassifier.cxx index 941f7a936ed8031ae2d903ad06de13cdcc54e6aa..e7a45871aed3263db1c0530ef3b5507737317380 100644 --- a/Modules/Applications/AppClassification/app/otbImageClassifier.cxx +++ b/Modules/Applications/AppClassification/app/otbImageClassifier.cxx @@ -80,7 +80,6 @@ private: SetDescription("Performs a classification of the input image according to a model file."); // Documentation - SetDocName("Image Classification"); SetDocLongDescription("This application performs an image classification based on a model file produced by the TrainImagesClassifier application. Pixels of the output image will contain the class labels decided by the classifier (maximal class label = 65535). The input pixels can be optionally centered and reduced according to the statistics file produced by the ComputeImagesStatistics application. An optional input mask can be provided, in which case only input image pixels whose corresponding mask value is greater than 0 will be classified. By default, the remaining of pixels will be given the label 0 in the output image."); SetDocLimitations("The input image must have the same type, order and number of bands than the images used to produce the statistics file and the SVM model file. If a statistics file was used during training by the TrainImagesClassifier, it is mandatory to use the same statistics file for classification. If an input mask is used, its size must match the input image size."); diff --git a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx index bcb546e03d11118b8e5c98a29d1cc7dbd824873e..0ceba570e9bfe6706231ba91d8bf750f3c36fbcb 100644 --- a/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx +++ b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx @@ -77,13 +77,22 @@ protected: MandatoryOff("ts"); AddParameter(ParameterType_Int, "maxit", "Maximum number of iterations"); - SetParameterDescription("maxit", "Maximum number of iterations for the learning step."); + SetParameterDescription("maxit", + "Maximum number of iterations for the learning step." + " If this parameter is set to 0, the KMeans algorithm will not stop until convergence"); SetDefaultParameterInt("maxit", 1000); MandatoryOff("maxit"); - AddParameter(ParameterType_OutputFilename, "outmeans", "Centroid filename"); - SetParameterDescription("outmeans", "Output text file containing centroid positions"); - MandatoryOff("outmeans"); + AddParameter(ParameterType_Group, "centroids", "Centroids IO parameters"); + SetParameterDescription("centroids", "Group of parameters for centroids IO."); + + AddParameter(ParameterType_InputFilename, "centroids.in", "input centroids text file"); + SetParameterDescription("centroids.in", + "Input text file containing centroid positions used to initialize the algorithm. " + "Each centroid must be described by p parameters, p being the number of bands in " + "the input image, and the number of centroids must be equal to the number of classes " + "(one centroid per line with values separated by spaces)."); + MandatoryOff("centroids.in"); ShareKMSamplingParameters(); ConnectKMSamplingParams(); @@ -99,6 +108,7 @@ protected: { ShareParameter("ram", "polystats.ram"); ShareParameter("sampler", "select.sampler"); + ShareParameter("centroids.out", "training.classifier.sharkkm.centroids.out"); ShareParameter("vm", "polystats.mask", "Validity Mask", "Validity mask, only non-zero pixels will be used to estimate KMeans modes."); } @@ -248,6 +258,14 @@ protected: GetParameterInt("maxit")); GetInternalApplication("training")->SetParameterInt("classifier.sharkkm.k", GetParameterInt("nc")); + if (IsParameterEnabled("centroids.in") && HasValue("centroids.in")) + { + GetInternalApplication("training")->SetParameterString("classifier.sharkkm.centroids.in", GetParameterString("centroids.in")); + + GetInternalApplication("training") + ->SetParameterString("classifier.sharkkm.centroids.stats", GetInternalApplication("imgstats")->GetParameterString("out")); + } + if( IsParameterEnabled("rand")) GetInternalApplication("training")->SetParameterInt("rand", GetParameterInt("rand")); @@ -276,55 +294,6 @@ protected: ExecuteInternal( "classif" ); } - void CreateOutMeansFile(FloatVectorImageType *image, - const std::string &modelFileName, - unsigned int nbClasses) - { - if (IsParameterEnabled("outmeans")) - { - unsigned int nbBands = image->GetNumberOfComponentsPerPixel(); - unsigned int nbElements = nbClasses * nbBands; - // get the line in model file that contains the centroids positions - std::ifstream infile(modelFileName); - if(!infile) - { - itkExceptionMacro(<< "File: " << modelFileName << " couldn't be opened"); - } - - // get the line with the centroids (starts with "2 ") - std::string line, centroidLine; - while(std::getline(infile,line)) - { - if (line.size() > 2 && line[0] == '2' && line[1] == ' ') - { - centroidLine = line; - break; - } - } - - std::vector<std::string> centroidElm; - boost::split(centroidElm,centroidLine,boost::is_any_of(" ")); - - // remove the first elements, not the centroids positions - int nbWord = centroidElm.size(); - int beginCentroid = nbWord-nbElements; - centroidElm.erase(centroidElm.begin(), centroidElm.begin()+beginCentroid); - - // write in the output file - std::ofstream outfile; - outfile.open(GetParameterString("outmeans")); - - for (unsigned int i = 0; i < nbClasses; i++) - { - for (unsigned int j = 0; j < nbBands; j++) - { - outfile << std::setw(8) << centroidElm[i * nbBands + j] << " "; - } - outfile << std::endl; - } - } - } - class KMeansFileNamesHandler { public: @@ -402,7 +371,6 @@ private: SetName("KMeansClassification"); SetDescription("Unsupervised KMeans image classification"); - SetDocName("Unsupervised KMeans image classification"); SetDocLongDescription("Unsupervised KMeans image classification. " "This is a composite application, using existing training and classification applications. " "The SharkKMeans model is used.\n\n" @@ -495,9 +463,6 @@ private: // Compute a classification of the input image according to a model file Superclass::KMeansClassif(); - // Create the output text file containing centroids positions - Superclass::CreateOutMeansFile(GetParameterImage("in"), fileNames.modelFile, GetParameterInt("nc")); - // Remove all tempory files if( GetParameterInt( "cleanup" ) ) { diff --git a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx index 6f5f49091112ff62a981b730da393e35d60c8969..eecf74ed45b38c57bde61331f92f3d0eeebd11f5 100644 --- a/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx +++ b/Modules/Applications/AppClassification/app/otbMultiImageSamplingRate.cxx @@ -63,7 +63,6 @@ private: SetDescription("Compute sampling rate for an input set of images."); // Documentation - SetDocName("Multi-image sampling rate estimation"); SetDocLongDescription("The application computes sampling rates for a set of" " input images. Before calling this application, each pair of image and " "training vectors has to be analysed with the application " diff --git a/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx b/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx index ccc6e876ce781db5aeb764eef2052952849897a5..7667d25ec731ed18ca04e4832831baf4401bd684 100644 --- a/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx +++ b/Modules/Applications/AppClassification/app/otbOGRLayerClassifier.cxx @@ -60,7 +60,6 @@ private: SetName("OGRLayerClassifier"); SetDescription("Classify an OGR layer based on a machine learning model and a list of features to consider."); - SetDocName("OGRLayerClassifier"); SetDocLongDescription("This application will apply a trained machine learning model on the selected feature to get a classification of each geometry contained in an OGR layer. The list of feature must match the list used for training. The predicted label is written in the user defined field for each geometry."); SetDocLimitations("Experimental. Only shapefiles are supported for now."); SetDocAuthors("David Youssefi during internship at CNES"); diff --git a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx index bbfb99010e2df503fc561fad3ba528b8b3904151..c4ca1ab8346a9c96db6da1370840741934efcc85 100644 --- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx @@ -72,7 +72,6 @@ private: SetDescription("Computes statistics on a training polygon set."); // Documentation - SetDocName("Polygon Class Statistics"); SetDocLongDescription("Process a set of geometries intended for training (they should have a field giving the associated " "class). The geometries are analyzed against a support image to compute statistics:\n\n" "* Number of samples per class\n" diff --git a/Modules/Applications/AppClassification/app/otbPredictRegression.cxx b/Modules/Applications/AppClassification/app/otbPredictRegression.cxx index 95f5b8384e995e68286cc586ed88865fee36336b..886009b1fa1701fbc916194c01c468290f7dcdb0 100644 --- a/Modules/Applications/AppClassification/app/otbPredictRegression.cxx +++ b/Modules/Applications/AppClassification/app/otbPredictRegression.cxx @@ -119,7 +119,6 @@ private: SetDescription("Performs a prediction of the input image according to a regression model file."); // Documentation - SetDocName("Predict Regression"); SetDocLongDescription("This application predict output values from an input" " image, based on a regression model file produced by" " the TrainRegression application. Pixels of the " diff --git a/Modules/Applications/AppClassification/app/otbSOMClassification.cxx b/Modules/Applications/AppClassification/app/otbSOMClassification.cxx index bddaf9ebab29980a0dc268f3bd487272b07d39bc..f1ed068cd04d93f91e1730631079dfd42bcc37cb 100644 --- a/Modules/Applications/AppClassification/app/otbSOMClassification.cxx +++ b/Modules/Applications/AppClassification/app/otbSOMClassification.cxx @@ -82,7 +82,6 @@ private: SetDescription("SOM image classification."); // Documentation - SetDocName("SOM Classification"); SetDocLongDescription("Unsupervised Self Organizing Map image classification."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppClassification/app/otbSampleAugmentation.cxx b/Modules/Applications/AppClassification/app/otbSampleAugmentation.cxx index c16e0cca8ef023c56226ffcd8f95ab0fffd13c5c..5ba680a8e01fa73d077f810bcf11b26620aecc61 100644 --- a/Modules/Applications/AppClassification/app/otbSampleAugmentation.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleAugmentation.cxx @@ -57,7 +57,6 @@ private: SetDescription("Generates synthetic samples from a sample data file."); // Documentation - SetDocName("Sample Augmentation"); SetDocLongDescription("The application takes a sample data file as " "generated by the SampleExtraction application and " "generates synthetic samples to increase the number of " diff --git a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx index e8cb2aaabacdc10b4f0f1d4c21ab8e1f93d5dc7e..b94130d3f57a68067d035af1de464e55230d397d 100644 --- a/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleExtraction.cxx @@ -59,7 +59,6 @@ private: SetDescription("Extracts samples values from an image."); // Documentation - SetDocName("Sample Extraction"); SetDocLongDescription("The application extracts samples values from an" "image using positions contained in a vector data file. "); SetDocLimitations("None"); diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx index 959f3c129d0c32c3f77343f249c0b18e022232de..d789b556198a4c12f271e81daeeeec730b9ae894 100644 --- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx @@ -86,7 +86,6 @@ private: SetDescription("Selects samples from a training vector data set."); // Documentation - SetDocName("Sample Selection"); SetDocLongDescription( "The application selects a set of samples from geometries " "intended for training (they should have a field giving the associated " diff --git a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx index 151200884130b6769b8f39fd8b020f0afc242503..567dd28889ae03e3eda019b031e1344073bf12e0 100644 --- a/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx +++ b/Modules/Applications/AppClassification/app/otbTrainImagesClassifier.cxx @@ -41,7 +41,6 @@ public: SetDescription( "Train a classifier from multiple pairs of images and training vector data." ); // Documentation - SetDocName( "Train a classifier from multiple images" ); SetDocLongDescription( "Train a classifier from multiple pairs of images and training vector data. " "Samples are composed of pixel values in each band optionally centered and reduced using an XML statistics file produced by " diff --git a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx index fb5b636354cb4949812b2376046db138c50bf603..a93c8b5439d65e670fa92e52ee889933d45f3d61 100644 --- a/Modules/Applications/AppClassification/app/otbTrainRegression.cxx +++ b/Modules/Applications/AppClassification/app/otbTrainRegression.cxx @@ -105,7 +105,6 @@ void DoInit() override "Train a classifier from multiple images to perform regression."); // Documentation - SetDocName("Train a regression model"); SetDocLongDescription( "This application trains a classifier from multiple input images or a csv " "file, in order to perform regression. Predictors are composed of pixel " @@ -272,8 +271,7 @@ void ParseCSVPredictors(std::string path, ListSampleType* outputList) elem.Fill(0.0); for (unsigned int i=0 ; i<nbCols ; ++i) { - iss.str(words[i]); - iss >> elem[i]; + elem[i] = std::stod(words[i]); } outputList->PushBack(elem); } diff --git a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx index c71885ded4440670f0dc511e104629f14581c7f5..fbd04d4a4b5c0fa213d5266d3588b1f8de7202cb 100644 --- a/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx +++ b/Modules/Applications/AppClassification/app/otbTrainVectorClassifier.cxx @@ -29,11 +29,11 @@ namespace otb namespace Wrapper { -class TrainVectorClassifier : public TrainVectorBase +class TrainVectorClassifier : public TrainVectorBase<float, int> { public: typedef TrainVectorClassifier Self; - typedef TrainVectorBase Superclass; + typedef TrainVectorBase<float, int> Superclass; typedef itk::SmartPointer<Self> Pointer; typedef itk::SmartPointer<const Self> ConstPointer; itkNewMacro( Self ) @@ -60,20 +60,26 @@ protected: SetDescription( "Train a classifier based on labeled geometries and a " "list of features to consider." ); - SetDocName( "Train Vector Classifier" ); SetDocLongDescription( "This application trains a classifier based on " "labeled geometries and a list of features to consider for " "classification.\nThis application is based on LibSVM, OpenCV Machine " "Learning (2.3.1 and later), and Shark ML The output of this application " "is a text model file, whose format corresponds to the ML model type " "chosen. There is no image nor vector data output."); - SetDocLimitations(""); + SetDocLimitations("None"); SetDocAuthors( "OTB Team" ); SetDocSeeAlso( " " ); SetOfficialDocLink(); Superclass::DoInit(); + + // Add a new parameter to compute confusion matrix / contingency table + this->AddParameter(ParameterType_OutputFilename, "io.confmatout", "Output confusion matrix or contingency table"); + this->SetParameterDescription("io.confmatout", + "Output file containing the confusion matrix or contingency table (.csv format)." + "The contingency table is output when we unsupervised algorithms is used otherwise the confusion matrix is output."); + this->MandatoryOff("io.confmatout"); } void DoUpdateParameters() override diff --git a/Modules/Applications/AppClassification/app/otbTrainVectorRegression.cxx b/Modules/Applications/AppClassification/app/otbTrainVectorRegression.cxx new file mode 100644 index 0000000000000000000000000000000000000000..c98e69ee0c94b0b1882a4bd0ffab112e6020e53d --- /dev/null +++ b/Modules/Applications/AppClassification/app/otbTrainVectorRegression.cxx @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbTrainVectorBase.h" + +namespace otb +{ +namespace Wrapper +{ + +class TrainVectorRegression : public TrainVectorBase<float, float> +{ +public: + typedef TrainVectorRegression Self; + typedef TrainVectorBase<float, float> Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + itkNewMacro(Self) itkTypeMacro(Self, Superclass) + + typedef Superclass::SampleType SampleType; + typedef Superclass::ListSampleType ListSampleType; + typedef Superclass::TargetListSampleType TargetListSampleType; + +protected: + TrainVectorRegression() + { + this->m_RegressionFlag = true; + } + + void DoInit() override + { + SetName("TrainVectorRegression"); + SetDescription( + "Train a regression algorithm based on geometries with " + "list of features to consider and a predictor."); + + SetDocLongDescription( + "This application trains a regression algorithm based on " + "a predictor geometries and a list of features to consider for " + "regression.\nThis application is based on LibSVM, OpenCV Machine " + "Learning (2.3.1 and later), and Shark ML The output of this application " + "is a text model file, whose format corresponds to the ML model type " + "chosen. There is no image or vector data output."); + + SetDocLimitations("None"); + SetDocAuthors("OTB Team"); + SetDocSeeAlso("TrainVectorClassifier"); + + SetOfficialDocLink(); + + Superclass::DoInit(); + + AddParameter(ParameterType_Float, "io.mse", "Mean Square Error"); + SetParameterDescription("io.mse", "Mean square error computed with the validation predictors"); + SetParameterRole("io.mse", Role_Output); + this->MandatoryOff("io.mse"); + } + + void DoUpdateParameters() override + { + Superclass::DoUpdateParameters(); + } + + double ComputeMSE(const TargetListSampleType& list1, const TargetListSampleType& list2) + { + assert(list1.Size() == list2.Size()); + double mse = 0.; + for (TargetListSampleType::InstanceIdentifier i = 0; i < list1.Size(); ++i) + { + auto elem1 = list1.GetMeasurementVector(i); + auto elem2 = list2.GetMeasurementVector(i); + + mse += (elem1[0] - elem2[0]) * (elem1[0] - elem2[0]); + } + mse /= static_cast<double>(list1.Size()); + return mse; + } + + + void DoExecute() override + { + m_FeaturesInfo.SetClassFieldNames(GetChoiceNames("cfield"), GetSelectedItems("cfield")); + + if (m_FeaturesInfo.m_SelectedCFieldIdx.empty() && GetClassifierCategory() == Supervised) + { + otbAppLogFATAL(<< "No field has been selected for data labelling!"); + } + + Superclass::DoExecute(); + + otbAppLogINFO("Computing training performances"); + + auto mse = ComputeMSE(*m_ClassificationSamplesWithLabel.labeledListSample, *m_PredictedList); + + otbAppLogINFO("Mean Square Error = " << mse); + this->SetParameterFloat("io.mse", mse); + } + +private: +}; +} +} + +OTB_APPLICATION_EXPORT(otb::Wrapper::TrainVectorRegression) diff --git a/Modules/Applications/AppClassification/app/otbVectorClassifier.cxx b/Modules/Applications/AppClassification/app/otbVectorClassifier.cxx index 3e5f4b1d2d6f29bdaf703656cf9a33e18ba5023b..c15b65b53d8db58f7b1ba692d99ada789f12a3f7 100644 --- a/Modules/Applications/AppClassification/app/otbVectorClassifier.cxx +++ b/Modules/Applications/AppClassification/app/otbVectorClassifier.cxx @@ -91,7 +91,6 @@ private: SetName("VectorClassifier"); SetDescription("Performs a classification of the input vector data according to a model file."); - SetDocName("Vector Classification"); SetDocAuthors("OTB-Team"); SetDocLongDescription("This application performs a vector data classification " "based on a model file produced by the TrainVectorClassifier application." diff --git a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx b/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx deleted file mode 100644 index 64001c6a135e44b17e39ed920cef41a329b9d2bf..0000000000000000000000000000000000000000 --- a/Modules/Applications/AppClassification/app/otbVectorDataDSValidation.cxx +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "otbVectorDataToDSValidatedVectorDataFilter.h" -#include "otbWrapperApplication.h" -#include "otbWrapperApplicationFactory.h" -#include "otbWrapperStringListParameter.h" - - -namespace otb -{ -namespace Wrapper -{ - -class VectorDataDSValidation: public Application -{ - - -public: - /** Standard class typedefs. */ - typedef VectorDataDSValidation Self; - typedef Application Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - - typedef double PrecisionType; - typedef otb::VectorData<PrecisionType> VectorDataType; - typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType> - VectorDataValidationFilterType; - typedef VectorDataValidationFilterType::LabelSetType - LabelSetType; - typedef FuzzyDescriptorsModelManager::DescriptorsModelType DescriptorsModelType; - - typedef otb::Wrapper::StringListParameter::StringListType StringListType; - - /** Standard macro */ - itkNewMacro(Self); - - itkTypeMacro(VectorDataDSValidation, otb::Application); - -private: - void DoInit() override - { - SetName("VectorDataDSValidation"); - SetDescription("Vector data validation based on the fusion of features using Dempster-Shafer evidence theory framework."); - - SetDocName("Vector Data validation"); - SetDocLongDescription("This application validates or unvalidate the studied samples using the Dempster-Shafer theory."); - SetDocLimitations("None."); - SetDocAuthors("OTB-Team"); - SetDocSeeAlso("http://en.wikipedia.org/wiki/Dempster-Shafer_theory"); - - AddDocTag(Tags::FeatureExtraction); - - - AddParameter(ParameterType_InputVectorData, "in", "Input Vector Data"); - SetParameterDescription("in", "Input vector data to validate"); - - AddParameter(ParameterType_InputFilename, "descmod", "Descriptors model filename"); - SetParameterDescription("descmod", "Fuzzy descriptors model (xml file)"); - - AddParameter(ParameterType_StringList, "belsup", "Belief Support"); - SetParameterDescription("belsup", "Dempster Shafer study hypothesis to compute belief"); - - AddParameter(ParameterType_StringList, "plasup", "Plausibility Support"); - SetParameterDescription("plasup", "Dempster Shafer study hypothesis to compute plausibility"); - - AddParameter(ParameterType_OutputVectorData, "out", "Output Vector Data"); - SetParameterDescription("out", "Output VectorData containing only the validated samples"); - - AddParameter(ParameterType_String, "cri", "Criterion"); - SetParameterDescription("cri", "Dempster Shafer criterion (by default (belief+plausibility)/2)"); - MandatoryOff("cri"); - SetParameterString("cri", "((Belief + Plausibility)/2.)"); - - AddParameter(ParameterType_Float, "thd", "Criterion threshold"); - SetParameterDescription("thd", "Criterion threshold (default 0.5)"); - MandatoryOff("thd"); - SetParameterFloat("thd",0.5); - - // Doc example parameter settings - SetDocExampleParameterValue("in", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp"); - SetDocExampleParameterValue("belsup", "cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp"); - SetDocExampleParameterValue("descmod", "DSFuzzyModel.xml"); - SetDocExampleParameterValue("out", "VectorDataDSValidation.shp"); - - SetOfficialDocLink(); - } - - void DoUpdateParameters() override - { - // Nothing to do here : all parameters are independent - - - // .. // - - - } - - void DoExecute() override - { - - //Read the vector data - VectorDataType::Pointer inVectorData = GetParameterVectorData("in"); - inVectorData->Update(); - - // Load the descriptors model - std::string descModFile = GetParameterString("descmod"); - DescriptorsModelType descMod = FuzzyDescriptorsModelManager::Read(descModFile); - - LabelSetType Bhyp, Phyp; - int nbSet; - - StringListType stringList = GetParameterStringList("belsup"); - nbSet = stringList.size(); - - for (int i = 0; i < nbSet; i++) - { - std::string str = stringList[i]; - Bhyp.insert(str); - } - stringList = GetParameterStringList("plasup"); - nbSet = stringList.size(); - for (int i = 0; i < nbSet; i++) - { - std::string str = stringList[i]; - Phyp.insert(str); - } - - // Process - m_ValidationFilter = VectorDataValidationFilterType::New(); - m_ValidationFilter->SetInput(inVectorData); - m_ValidationFilter->SetDescriptorModels(descMod); - m_ValidationFilter->SetBeliefHypothesis(Bhyp); - m_ValidationFilter->SetPlausibilityHypothesis(Phyp); - - m_ValidationFilter->SetCriterionFormula(GetParameterString("cri")); - m_ValidationFilter->SetCriterionThreshold(GetParameterFloat("thd")); - - // Set the output image - SetParameterOutputVectorData("out", m_ValidationFilter->GetOutput()); - - }; - - VectorDataValidationFilterType::Pointer m_ValidationFilter; - - -}; -} -} - -OTB_APPLICATION_EXPORT(otb::Wrapper::VectorDataDSValidation); diff --git a/Modules/Applications/AppClassification/app/otbZonalStatistics.cxx b/Modules/Applications/AppClassification/app/otbZonalStatistics.cxx index 7d78276c47c3050368e09f2d04832780ebf09025..881e8dd97a983495e438b43cdf59da376c2f112e 100644 --- a/Modules/Applications/AppClassification/app/otbZonalStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbZonalStatistics.cxx @@ -148,7 +148,6 @@ public: SetDescription("This application computes zonal statistics"); // Documentation - SetDocName("ZonalStatistics"); SetDocLongDescription("This application computes zonal statistics from label image, or vector data. " "The application inputs one input multiband image, and another input for zones definition. " "Zones can be defined with a label image (inzone.labelimage.in) or a vector data layer " diff --git a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx index 8d76ee548aff28eb61f5febe1b7b248b96ec47da..0e56b0c6d14ea0c6665461d76ed24b5c2170dc83 100644 --- a/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx +++ b/Modules/Applications/AppClassification/include/otbLearningApplicationBase.hxx @@ -122,7 +122,10 @@ LearningApplicationBase<TInputValue,TOutputValue> ::InitUnsupervisedClassifierParams() { #ifdef OTB_USE_SHARK - InitSharkKMeansParams(); + if (!m_RegressionFlag) + { + InitSharkKMeansParams(); // Regression not supported + } #endif } diff --git a/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx b/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx index a3c43741c70ace5c453ae45212abedb313b30b32..87ff3a948edc75658b5223780aec8e60788e0afa 100644 --- a/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx +++ b/Modules/Applications/AppClassification/include/otbTrainSharkKMeans.hxx @@ -22,6 +22,7 @@ #include "otbLearningApplicationBase.h" #include "otbSharkKMeansMachineLearningModel.h" +#include "otbStatisticsXMLFileReader.h" namespace otb { @@ -44,6 +45,30 @@ void LearningApplicationBase<TInputValue, TOutputValue>::InitSharkKMeansParams() SetParameterInt("classifier.sharkkm.k", 2); SetParameterDescription("classifier.sharkkm.k", "The number of classes used for the kmeans algorithm. Default set to 2 class"); SetMinimumParameterIntValue("classifier.sharkkm.k", 2); + + // Centroid IO + AddParameter( ParameterType_Group, "classifier.sharkkm.centroids", "Centroids IO parameters" ); + SetParameterDescription( "classifier.sharkkm.centroids", "Group of parameters for centroids IO." ); + + // Input centroids + AddParameter(ParameterType_InputFilename, "classifier.sharkkm.centroids.in", "User definied input centroids"); + SetParameterDescription("classifier.sharkkm.centroids.in", "Input text file containing centroid posistions used to initialize the algorithm. " + "Each centroid must be described by p parameters, p being the number of features in " + "the input vector data, and the number of centroids must be equal to the number of classes " + "(one centroid per line with values separated by spaces)."); + MandatoryOff("classifier.sharkkm.centroids"); + + // Centroid statistics + AddParameter(ParameterType_InputFilename, "classifier.sharkkm.centroids.stats", "Statistics file"); + SetParameterDescription("classifier.sharkkm.centroids.stats", "A XML file containing mean and standard deviation to center" + "and reduce the centroids before the KMeans algorithm, produced by ComputeImagesStatistics application."); + MandatoryOff("classifier.sharkkm.centroids.stats"); + + // Output centroids + AddParameter(ParameterType_OutputFilename, "classifier.sharkkm.centroids.out", "Output centroids text file"); + SetParameterDescription("classifier.sharkkm.centroids.out", "Output text file containing centroids after the kmean algorithm."); + MandatoryOff("classifier.sharkkm.centroids.out"); + } template<class TInputValue, class TOutputValue> @@ -60,9 +85,48 @@ void LearningApplicationBase<TInputValue, TOutputValue>::TrainSharkKMeans( classifier->SetInputListSample( trainingListSample ); classifier->SetTargetListSample( trainingLabeledListSample ); classifier->SetK( k ); + + // Initialize centroids from file + if(IsParameterEnabled("classifier.sharkkm.centroids.in") && HasValue("classifier.sharkkm.centroids.in")) + { + shark::Data<shark::RealVector> centroidData; + shark::importCSV(centroidData, GetParameterString( "classifier.sharkkm.centroids.in"), ' '); + if( HasValue( "classifier.sharkkm.centroids.stats" ) ) + { + auto statisticsReader = otb::StatisticsXMLFileReader< itk::VariableLengthVector<float> >::New(); + statisticsReader->SetFileName(GetParameterString( "classifier.sharkkm.centroids.stats" )); + auto meanMeasurementVector = statisticsReader->GetStatisticVectorByName("mean"); + auto stddevMeasurementVector = statisticsReader->GetStatisticVectorByName("stddev"); + + // Convert itk Variable Length Vector to shark Real Vector + shark::RealVector offsetRV(meanMeasurementVector.Size()); + shark::RealVector scaleRV(stddevMeasurementVector.Size()); + + assert(meanMeasurementVector.Size()==stddevMeasurementVector.Size()); + for (unsigned int i = 0; i<meanMeasurementVector.Size(); ++i) + { + scaleRV[i] = 1/stddevMeasurementVector[i]; + // Substract the normalized mean + offsetRV[i] = - meanMeasurementVector[i]/stddevMeasurementVector[i]; + } + + shark::Normalizer<> normalizer(scaleRV, offsetRV); + centroidData = normalizer(centroidData); + } + + if (centroidData.numberOfElements() != k) + otbAppLogWARNING( "The input centroid file will not be used because it contains " << centroidData.numberOfElements() << + " points, which is different than from the requested number of class: " << k <<"."); + + classifier->SetCentroidsFromData( centroidData); + } + classifier->SetMaximumNumberOfIterations( nbMaxIter ); classifier->Train(); classifier->Save( modelPath ); + + if( HasValue( "classifier.sharkkm.centroids.out")) + classifier->ExportCentroids( GetParameterString( "classifier.sharkkm.centroids.out" )); } } //end namespace wrapper diff --git a/Modules/Applications/AppClassification/include/otbTrainVectorBase.h b/Modules/Applications/AppClassification/include/otbTrainVectorBase.h index 37869068157660e37b5063fd69303be97023df2f..bc5c716aef98324bcd14882b451fc2636dbfe9cc 100644 --- a/Modules/Applications/AppClassification/include/otbTrainVectorBase.h +++ b/Modules/Applications/AppClassification/include/otbTrainVectorBase.h @@ -49,21 +49,22 @@ bool IsNotAlphaNum(char c) return !std::isalnum( c ); } -class TrainVectorBase : public LearningApplicationBase<float, int> +template <class TInputValue, class TOutputValue> +class TrainVectorBase : public LearningApplicationBase<TInputValue, TOutputValue> { public: /** Standard class typedefs. */ typedef TrainVectorBase Self; - typedef LearningApplicationBase<float, int> Superclass; + typedef LearningApplicationBase<TInputValue, TOutputValue> Superclass; typedef itk::SmartPointer <Self> Pointer; typedef itk::SmartPointer<const Self> ConstPointer; /** Standard macro */ itkTypeMacro(Self, Superclass); - typedef Superclass::SampleType SampleType; - typedef Superclass::ListSampleType ListSampleType; - typedef Superclass::TargetListSampleType TargetListSampleType; + typedef typename Superclass::SampleType SampleType; + typedef typename Superclass::ListSampleType ListSampleType; + typedef typename Superclass::TargetListSampleType TargetListSampleType; typedef double ValueType; typedef itk::VariableLengthVector <ValueType> MeasurementType; @@ -86,8 +87,8 @@ protected: class SamplesWithLabel { public: - ListSampleType::Pointer listSample; - TargetListSampleType::Pointer labeledListSample; + typename ListSampleType::Pointer listSample; + typename TargetListSampleType::Pointer labeledListSample; SamplesWithLabel() { listSample = ListSampleType::New(); @@ -178,13 +179,18 @@ protected: SamplesWithLabel m_TrainingSamplesWithLabel; SamplesWithLabel m_ClassificationSamplesWithLabel; - TargetListSampleType::Pointer m_PredictedList; + typename TargetListSampleType::Pointer m_PredictedList; FeaturesInfo m_FeaturesInfo; void DoInit() override; void DoUpdateParameters() override; void DoExecute() override; +private: + /** + * Get the field of the input feature corresponding to the input field + */ + inline TOutputValue GetFeatureField(const ogr::Feature& feature, int field); }; } diff --git a/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx b/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx index fb5e582dae4dc6073b77a5a2f1f2659831e1b3e9..c1e4f88f1cf9f428a038da63d99161e26daa9f66 100644 --- a/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx +++ b/Modules/Applications/AppClassification/include/otbTrainVectorBase.hxx @@ -27,100 +27,98 @@ namespace otb namespace Wrapper { -void TrainVectorBase::DoInit() +template <class TInputValue, class TOutputValue> +void +TrainVectorBase<TInputValue, TOutputValue> +::DoInit() { // Common Parameters for all Learning Application - AddParameter( ParameterType_Group, "io", "Input and output data" ); - SetParameterDescription( "io", + this->AddParameter( ParameterType_Group, "io", "Input and output data" ); + this->SetParameterDescription( "io", "This group of parameters allows setting input and output data." ); - AddParameter( ParameterType_InputVectorDataList, "io.vd", "Input Vector Data" ); - SetParameterDescription( "io.vd", + this->AddParameter( ParameterType_InputVectorDataList, "io.vd", "Input Vector Data" ); + this->SetParameterDescription( "io.vd", "Input geometries used for training (note: all geometries from the layer will be used)" ); - AddParameter( ParameterType_InputFilename, "io.stats", "Input XML image statistics file" ); - MandatoryOff( "io.stats" ); - SetParameterDescription( "io.stats", + this->AddParameter( ParameterType_InputFilename, "io.stats", "Input XML image statistics file" ); + this->MandatoryOff( "io.stats" ); + this->SetParameterDescription( "io.stats", "XML file containing mean and variance of each feature." ); - AddParameter( ParameterType_OutputFilename, "io.out", "Output model" ); - SetParameterDescription( "io.out", + this->AddParameter( ParameterType_OutputFilename, "io.out", "Output model" ); + this->SetParameterDescription( "io.out", "Output file containing the model estimated (.txt format)." ); - AddParameter( ParameterType_Int, "layer", "Layer Index" ); - SetParameterDescription( "layer", + this->AddParameter( ParameterType_Int, "layer", "Layer Index" ); + this->SetParameterDescription( "layer", "Index of the layer to use in the input vector file." ); - MandatoryOff( "layer" ); - SetDefaultParameterInt( "layer", 0 ); + this->MandatoryOff( "layer" ); + this->SetDefaultParameterInt( "layer", 0 ); - AddParameter(ParameterType_ListView, "feat", "Field names for training features"); - SetParameterDescription("feat", + this->AddParameter(ParameterType_ListView, "feat", "Field names for training features"); + this->SetParameterDescription("feat", "List of field names in the input vector data to be used as features for training."); // Add validation data used to compute confusion matrix or contingency table - AddParameter( ParameterType_Group, "valid", "Validation data" ); - SetParameterDescription( "valid", + this->AddParameter( ParameterType_Group, "valid", "Validation data" ); + this->SetParameterDescription( "valid", "This group of parameters defines validation data." ); - AddParameter( ParameterType_InputVectorDataList, "valid.vd", + this->AddParameter( ParameterType_InputVectorDataList, "valid.vd", "Validation Vector Data" ); - SetParameterDescription( "valid.vd", "Geometries used for validation " + this->SetParameterDescription( "valid.vd", "Geometries used for validation " "(must contain the same fields used for training, all geometries from the layer will be used)" ); - MandatoryOff( "valid.vd" ); + this->MandatoryOff( "valid.vd" ); - AddParameter( ParameterType_Int, "valid.layer", "Layer Index" ); - SetParameterDescription( "valid.layer", + this->AddParameter( ParameterType_Int, "valid.layer", "Layer Index" ); + this->SetParameterDescription( "valid.layer", "Index of the layer to use in the validation vector file." ); - MandatoryOff( "valid.layer" ); - SetDefaultParameterInt( "valid.layer", 0 ); + this->MandatoryOff( "valid.layer" ); + this->SetDefaultParameterInt( "valid.layer", 0 ); // Add class field if we used validation - AddParameter( ParameterType_ListView, "cfield", + this->AddParameter( ParameterType_ListView, "cfield", "Field containing the class integer label for supervision" ); - SetParameterDescription( "cfield", + this->SetParameterDescription( "cfield", "Field containing the class id for supervision. " "The values in this field shall be cast into integers. " "Only geometries with this field available will be taken into account." ); - SetListViewSingleSelectionMode( "cfield", true ); + this->SetListViewSingleSelectionMode( "cfield", true ); - // Add a new parameter to compute confusion matrix / contingency table - AddParameter( ParameterType_OutputFilename, "io.confmatout", - "Output confusion matrix or contingency table" ); - SetParameterDescription( "io.confmatout", - "Output file containing the confusion matrix or contingency table (.csv format)." - "The contingency table is output when we unsupervised algorithms is used otherwise the confusion matrix is output." ); - MandatoryOff( "io.confmatout" ); - - AddParameter(ParameterType_Bool, "v", "Verbose mode"); - SetParameterDescription("v", "Verbose mode, display the contingency table result."); - SetParameterInt("v", 1); + this->AddParameter(ParameterType_Bool, "v", "Verbose mode"); + this->SetParameterDescription("v", "Verbose mode, display the contingency table result."); + this->SetParameterInt("v", 1); // Doc example parameter settings - SetDocExampleParameterValue( "io.vd", "vectorData.shp" ); - SetDocExampleParameterValue( "io.stats", "meanVar.xml" ); - SetDocExampleParameterValue( "io.out", "svmModel.svm" ); - SetDocExampleParameterValue( "feat", "perimeter area width" ); - SetDocExampleParameterValue( "cfield", "predicted" ); + this->SetDocExampleParameterValue( "io.vd", "vectorData.shp" ); + this->SetDocExampleParameterValue( "io.stats", "meanVar.xml" ); + this->SetDocExampleParameterValue( "io.out", "svmModel.svm" ); + this->SetDocExampleParameterValue( "feat", "perimeter area width" ); + this->SetDocExampleParameterValue( "cfield", "predicted" ); // Add parameters for the classifier choice Superclass::DoInit(); - AddRANDParameter(); + this->AddRANDParameter(); } -void TrainVectorBase::DoUpdateParameters() +template <class TInputValue, class TOutputValue> +void +TrainVectorBase<TInputValue, TOutputValue> +::DoUpdateParameters() { // if vector data is present and updated then reload fields - if( HasValue( "io.vd" ) ) + if( this->HasValue( "io.vd" ) ) { - std::vector<std::string> vectorFileList = GetParameterStringList( "io.vd" ); + std::vector<std::string> vectorFileList = this->GetParameterStringList( "io.vd" ); ogr::DataSource::Pointer ogrDS = ogr::DataSource::New( vectorFileList[0], ogr::DataSource::Modes::Read ); ogr::Layer layer = ogrDS->GetLayer( static_cast<size_t>( this->GetParameterInt( "layer" ) ) ); ogr::Feature feature = layer.ogr().GetNextFeature(); - ClearChoices( "feat" ); - ClearChoices( "cfield" ); + this->ClearChoices( "feat" ); + this->ClearChoices( "cfield" ); for( int iField = 0; iField < feature.ogr().GetFieldCount(); iField++ ) { @@ -134,20 +132,23 @@ void TrainVectorBase::DoUpdateParameters() if( fieldType == OFTInteger || fieldType == OFTInteger64 || fieldType == OFTReal ) { std::string tmpKey = "feat." + key.substr( 0, static_cast<unsigned long>( end - key.begin() ) ); - AddChoice( tmpKey, item ); + this->AddChoice( tmpKey, item ); } - if( fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64 ) + if( fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64 || fieldType == OFTReal ) { std::string tmpKey = "cfield." + key.substr( 0, static_cast<unsigned long>( end - key.begin() ) ); - AddChoice( tmpKey, item ); + this->AddChoice( tmpKey, item ); } } } } -void TrainVectorBase::DoExecute() +template <class TInputValue, class TOutputValue> +void +TrainVectorBase<TInputValue, TOutputValue> +::DoExecute() { - m_FeaturesInfo.SetFieldNames( GetChoiceNames( "feat" ), GetSelectedItems( "feat" )); + m_FeaturesInfo.SetFieldNames( this->GetChoiceNames( "feat" ), this->GetSelectedItems( "feat" )); // Check input parameters if( m_FeaturesInfo.m_SelectedIdx.empty() ) @@ -158,29 +159,35 @@ void TrainVectorBase::DoExecute() ShiftScaleParameters measurement = GetStatistics( m_FeaturesInfo.m_NbFeatures ); ExtractAllSamples( measurement ); - this->Train( m_TrainingSamplesWithLabel.listSample, m_TrainingSamplesWithLabel.labeledListSample, GetParameterString( "io.out" ) ); + this->Train( m_TrainingSamplesWithLabel.listSample, m_TrainingSamplesWithLabel.labeledListSample, this->GetParameterString( "io.out" ) ); m_PredictedList = - this->Classify( m_ClassificationSamplesWithLabel.listSample, GetParameterString( "io.out" ) ); + this->Classify( m_ClassificationSamplesWithLabel.listSample, this->GetParameterString( "io.out" ) ); } - -void TrainVectorBase::ExtractAllSamples(const ShiftScaleParameters &measurement) +template <class TInputValue, class TOutputValue> +void +TrainVectorBase<TInputValue, TOutputValue> +::ExtractAllSamples(const ShiftScaleParameters &measurement) { m_TrainingSamplesWithLabel = ExtractTrainingSamplesWithLabel(measurement); m_ClassificationSamplesWithLabel = ExtractClassificationSamplesWithLabel(measurement); } -TrainVectorBase::SamplesWithLabel -TrainVectorBase::ExtractTrainingSamplesWithLabel(const ShiftScaleParameters &measurement) +template <class TInputValue, class TOutputValue> +typename TrainVectorBase<TInputValue, TOutputValue>::SamplesWithLabel +TrainVectorBase<TInputValue, TOutputValue> +::ExtractTrainingSamplesWithLabel(const ShiftScaleParameters &measurement) { return ExtractSamplesWithLabel( "io.vd", "layer", measurement); } -TrainVectorBase::SamplesWithLabel -TrainVectorBase::ExtractClassificationSamplesWithLabel(const ShiftScaleParameters &measurement) +template <class TInputValue, class TOutputValue> +typename TrainVectorBase<TInputValue, TOutputValue>::SamplesWithLabel +TrainVectorBase<TInputValue, TOutputValue> +::ExtractClassificationSamplesWithLabel(const ShiftScaleParameters &measurement) { - if(GetClassifierCategory() == Supervised) + if(this->GetClassifierCategory() == Superclass::Supervised) { SamplesWithLabel tmpSamplesWithLabel; SamplesWithLabel validationSamplesWithLabel = ExtractSamplesWithLabel( "valid.vd", "valid.layer", measurement ); @@ -206,15 +213,16 @@ TrainVectorBase::ExtractClassificationSamplesWithLabel(const ShiftScaleParameter } } - -TrainVectorBase::ShiftScaleParameters -TrainVectorBase::GetStatistics(unsigned int nbFeatures) +template <class TInputValue, class TOutputValue> +typename TrainVectorBase<TInputValue, TOutputValue>::ShiftScaleParameters +TrainVectorBase<TInputValue, TOutputValue> +::GetStatistics(unsigned int nbFeatures) { ShiftScaleParameters measurement = ShiftScaleParameters(); - if( HasValue( "io.stats" ) && IsParameterEnabled( "io.stats" ) ) + if( this->HasValue( "io.stats" ) && this->IsParameterEnabled( "io.stats" ) ) { - StatisticsReader::Pointer statisticsReader = StatisticsReader::New(); - std::string XMLfile = GetParameterString( "io.stats" ); + typename StatisticsReader::Pointer statisticsReader = StatisticsReader::New(); + std::string XMLfile = this->GetParameterString( "io.stats" ); statisticsReader->SetFileName( XMLfile ); measurement.meanMeasurementVector = statisticsReader->GetStatisticVectorByName( "mean" ); measurement.stddevMeasurementVector = statisticsReader->GetStatisticVectorByName( "stddev" ); @@ -229,16 +237,34 @@ TrainVectorBase::GetStatistics(unsigned int nbFeatures) return measurement; } +// Template specialization for the integer case (i.e.classification), to avoid a cast from double to integer +template <> +inline int +TrainVectorBase<float, int> +::GetFeatureField(const ogr::Feature & feature, int fieldIndex) +{ + return(feature[fieldIndex].GetValue<int>()); +} + +template <class TInputValue, class TOutputValue> +inline TOutputValue +TrainVectorBase<TInputValue, TOutputValue> +::GetFeatureField(const ogr::Feature & feature, int fieldIndex) +{ + return(feature[fieldIndex].GetValue<double>()); +} -TrainVectorBase::SamplesWithLabel -TrainVectorBase::ExtractSamplesWithLabel(std::string parameterName, std::string parameterLayer, +template <class TInputValue, class TOutputValue> +typename TrainVectorBase<TInputValue, TOutputValue>::SamplesWithLabel +TrainVectorBase<TInputValue, TOutputValue> +::ExtractSamplesWithLabel(std::string parameterName, std::string parameterLayer, const ShiftScaleParameters &measurement) { SamplesWithLabel samplesWithLabel; - if( HasValue( parameterName ) && IsParameterEnabled( parameterName ) ) + if( this->HasValue( parameterName ) && this->IsParameterEnabled( parameterName ) ) { - ListSampleType::Pointer input = ListSampleType::New(); - TargetListSampleType::Pointer target = TargetListSampleType::New(); + typename ListSampleType::Pointer input = ListSampleType::New(); + typename TargetListSampleType::Pointer target = TargetListSampleType::New(); input->SetMeasurementVectorSize( m_FeaturesInfo.m_NbFeatures ); std::vector<std::string> fileList = this->GetParameterStringList( parameterName ); @@ -251,7 +277,7 @@ TrainVectorBase::ExtractSamplesWithLabel(std::string parameterName, std::string bool goesOn = feature.addr() != 0; if( !goesOn ) { - otbAppLogWARNING( "The layer " << GetParameterInt( parameterLayer ) << " of " << fileList[k] + otbAppLogWARNING( "The layer " << this->GetParameterInt( parameterLayer ) << " of " << fileList[k] << " is empty, input is skipped." ); continue; } @@ -284,14 +310,14 @@ TrainVectorBase::ExtractSamplesWithLabel(std::string parameterName, std::string MeasurementType mv; mv.SetSize( m_FeaturesInfo.m_NbFeatures ); for( unsigned int idx = 0; idx < m_FeaturesInfo.m_NbFeatures; ++idx ) - mv[idx] = feature.ogr().GetFieldAsDouble( featureFieldIndex[idx] ); + mv[idx] = feature[featureFieldIndex[idx]].GetValue<double>(); input->PushBack( mv ); if(cFieldIndex>=0 && ogr::Field(feature,cFieldIndex).HasBeenSet()) - target->PushBack( feature.ogr().GetFieldAsInteger( cFieldIndex ) ); + target->PushBack(GetFeatureField(feature,cFieldIndex)); else - target->PushBack( 0 ); + target->PushBack( 0. ); feature = layer.ogr().GetNextFeature(); goesOn = feature.addr() != 0; @@ -300,7 +326,7 @@ TrainVectorBase::ExtractSamplesWithLabel(std::string parameterName, std::string - ShiftScaleFilterType::Pointer shiftScaleFilter = ShiftScaleFilterType::New(); + typename ShiftScaleFilterType::Pointer shiftScaleFilter = ShiftScaleFilterType::New(); shiftScaleFilter->SetInput( input ); shiftScaleFilter->SetShifts( measurement.meanMeasurementVector ); shiftScaleFilter->SetScales( measurement.stddevMeasurementVector ); diff --git a/Modules/Applications/AppClassification/test/CMakeLists.txt b/Modules/Applications/AppClassification/test/CMakeLists.txt index 6a05178e64311574862ceaf555fcff1310111815..15286ce99c373666820979ebc1f73d7c848169f6 100644 --- a/Modules/Applications/AppClassification/test/CMakeLists.txt +++ b/Modules/Applications/AppClassification/test/CMakeLists.txt @@ -563,104 +563,6 @@ otb_test_application(NAME apTvFusionOfClassificationsMV2Inputs ${OTBAPP_BASELINE}/apTvFusionOfClassifications2InputsOutput.tif ${TEMP}/apTvFusionOfClassificationsMV2InputsOutput.tif) - -#----------- ComputePolylineFeatureFromImage TESTS ---------------- -otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF} - -vd LARGEINPUT{DEMPSTER-SHAFER/wrongroads.shp} - -expr "(b1 > 0.4)" - -field "NONDVI" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr.shp) - -# FIXME cascade dependencies to largeinput repository -if(OTB_DATA_USE_LARGEINPUT) - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication.shp - -expr "(b1 > 0.25)" - -field "ROADSA" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr.shp - -expr "(b1 > 0.25)" - -field "ROADSA" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_wr) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr.shp - -expr "(b1 == 0)" - -field "NOBUIL" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp - VALID --compare-ogr ${EPSILON_9} - ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp - ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_wr PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_wr) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF} - -vd LARGEINPUT{DEMPSTER-SHAFER/road_extraction.shp} - -expr "(b1 > 0.4)" - -field "NONDVI" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_RoadExtractionApplication.shp) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_gt - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/NDVI.TIF} - -vd LARGEINPUT{DEMPSTER-SHAFER/roads_ground_truth.shp} - -expr "(b1 > 0.4)" - -field NONDVI - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage.shp) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/SpectralAngleRoad.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage.shp - -expr "(b1 > 0.25)" - -field "ROADSA" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_NONDVI_gt) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt.shp - -expr "(b1 == 0)" - -field "NOBUIL" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp - VALID --compare-ogr ${EPSILON_9} - ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp - ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_gt PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_gt) - - otb_test_application(NAME apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication - APP ComputePolylineFeatureFromImage - OPTIONS -in LARGEINPUT{DEMPSTER-SHAFER/BUILDINGS.TIF} - -vd ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication.shp - -expr "(b1 == 0)" - -field "NOBUIL" - -out ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp - VALID --compare-ogr ${EPSILON_9} - ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp - ${TEMP}/apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp) - - set_tests_properties(apTvCdbComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication PROPERTIES DEPENDS apTvCdbComputePolylineFeatureFromImage_LI_ROADSA_RoadExtractionApplication) -endif() - #----------- KMeansClassification TESTS ---------------- if(OTB_USE_SHARK) otb_test_application(NAME apTvClKMeansImageClassification_composite @@ -673,7 +575,7 @@ if(OTB_USE_SHARK) -sampler periodic -rand 121212 -nodatalabel 255 - -outmeans ${TEMP}/apTvClKMeansImageClassificationFilterOutMeans.txt + -centroids.out ${TEMP}/apTvClKMeansImageClassificationFilterOutMeans.txt -out ${TEMP}/apTvClKMeansImageClassificationFilterOutput.tif uint8 -cleanup 0 VALID --compare-image ${NOTOL} @@ -681,6 +583,25 @@ if(OTB_USE_SHARK) ${TEMP}/apTvClKMeansImageClassificationFilterOutput.tif ) endif() +if(OTB_USE_SHARK) + otb_test_application(NAME apTvClKMeansImageClassification_inputCentroids + APP KMeansClassification + OPTIONS -in ${INPUTDATA}/qb_RoadExtract.img + -ts 30000 + -nc 5 + -maxit 10000 + -sampler periodic + -nodatalabel 255 + -rand 121212 + -centroids.in ${INPUTDATA}/Classification/KMeansInputCentroids.txt + -out ${TEMP}/apTvClKMeansImageClassificationInputCentroids.tif uint8 + -cleanup 0 + + VALID --compare-image ${NOTOL} + ${OTBAPP_BASELINE}/apTvClKMeansImageClassificationInputCentroids.tif + ${TEMP}/apTvClKMeansImageClassificationInputCentroids.tif ) +endif() + #----------- TrainImagesClassifier TESTS ---------------- if(OTB_USE_LIBSVM) otb_test_application(NAME apTvClTrainSVMImagesClassifierQB1_allOpt_InXML @@ -769,30 +690,6 @@ if(OTB_USE_LIBSVM) ${TEMP}/clsvmConfMatQB1_allOpt.svm) endif() -#----------- DSFuzzyModelEstimation TESTS ---------------- -otb_test_application(NAME apTvCdbDSFuzzyModelEstimation_LI_autoInit - APP DSFuzzyModelEstimation - OPTIONS -psin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp - -nsin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -desclist "NONDVI" "ROADSA" "NOBUIL" - -maxnbit 4 - -optobs true - -out ${TEMP}/apTvCdbDSFuzzyModelEstimatorOutput_LI_autoInit.xml) - -otb_test_application(NAME apTvCdbDSFuzzyModelEstimation_LI - APP DSFuzzyModelEstimation - OPTIONS -psin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp - -nsin ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -initmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel_Init.xml - -maxnbit 4 - -optobs true - -out ${TEMP}/apTvCdbDSFuzzyModelEstimatorOutput_LI.xml) - - #----------- ClassificationMapRegularization TESTS ---------------- otb_test_application(NAME apTvClassificationMapRegularization APP ClassificationMapRegularization @@ -853,38 +750,6 @@ otb_test_application(NAME apTvClComputeImagesStatisticsQB123 ${OTBAPP_BASELINE_FILES}/clImageStatisticsQB123.xml ${TEMP}/apTvClEstimateImageStatisticsQB123.xml) - -#----------- VectorDataDSValidation TESTS ---------------- -otb_test_application(NAME cdbTvVectorDataDSValidationGroundTruth_LI - APP VectorDataDSValidation - OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_gt.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml - -out ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp - VALID --compare-ogr 0.0 - ${OTBAPP_BASELINE_FILES}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp - ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_gt.shp) - -otb_test_application(NAME apTvCdbVectorDataDSValidationRoadExtractionApplication_LI - APP VectorDataDSValidation - OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_RoadExtractionApplication.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml - -out ${TEMP}/apTvCdbVectorDataDSValidationOutpout_LI_RoadExtractionApplication.shp) - -otb_test_application(NAME cdbTvVectorDataDSValidationWrongRoads_LI - APP VectorDataDSValidation - OPTIONS -in ${OTBAPP_BASELINE_FILES}/cdbTvComputePolylineFeatureFromImage_LI_NOBUIL_wr.shp - -belsup "ROADSA" - -plasup "NONDVI" "ROADSA" "NOBUIL" - -descmod ${OTB_DATA_ROOT}/Input/Dempster-Shafer/DSFuzzyModel.xml - -out ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp - VALID --compare-ogr 0.0 - ${OTBAPP_BASELINE_FILES}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp - ${TEMP}/cdbTvVectorDataDSValidationOutpout_LI_wr.shp) - if(OTB_USE_OPENCV) #----------- TrainRegression TESTS ---------------- # y = 0.01*x^2 + 1.5*x - 300 @@ -972,6 +837,22 @@ if(OTB_USE_OPENCV) ${TEMP}/apTvClTrainVectorClassifierModel.rf) endif() +#----------- TrainVectorRegression TESTS ---------------- +if(OTB_USE_OPENCV) + otb_test_application(NAME apTvClTrainVectorRegression + APP TrainVectorRegression + OPTIONS -io.vd ${INPUTDATA}/Classification/apTvClSampleExtractionOut.sqlite + -feat value_0 value_1 value_2 value_3 + -cfield class + -classifier rf + -io.out ${TEMP}/apTvClTrainVectorRegressionModel.rf + -io.mse ${TEMP}/apTvClTrainVectorRegressionModel.txt + TESTENVOPTIONS ${TEMP}/apTvClTrainVectorRegressionModel.txt + VALID ${ascii_comparison} + ${OTBAPP_BASELINE_FILES}/apTvClTrainVectorRegressionModel.txt + ${TEMP}/apTvClTrainVectorRegressionModel.txt) +endif() + #----------- TrainVectorClassifier unsupervised TESTS ---------------- if(OTB_USE_SHARK) otb_test_application(NAME apTvClTrainVectorUnsupervised diff --git a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx index 2ee837547c93137abfdc18b7d8fe38db8466cb07..44e961db2e5737455709b8a1cb6adfcca8a9fef5 100644 --- a/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx +++ b/Modules/Applications/AppDescriptors/app/otbHomologousPointsExtraction.cxx @@ -83,7 +83,6 @@ private: void DoInit() override { SetName("HomologousPointsExtraction"); - SetDocName("Homologous points extraction"); SetDescription("Compute homologous points between images using keypoints"); SetDocLongDescription("This application allows computing homologous points between images using keypoints. " " SIFT or SURF keypoints can be used and the band on which keypoints are computed can be set independently for both images." @@ -101,7 +100,6 @@ private: " The vector file is always reprojected to EPSG:4326 to allow display in a GIS." " This is done via reprojection or by applying the image sensor models."); // Documentation - SetDocName("Homologous Points Extraction"); SetDocLimitations("Full mode does not handle large images."); SetDocSeeAlso("RefineSensorModel"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx index 5c5554a2c969df80a3b9003984cddc7b74c4241d..690f5887bf6d418cce6f23cab8d423b26832f2e6 100644 --- a/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx +++ b/Modules/Applications/AppDimensionalityReduction/app/otbDimensionalityReduction.cxx @@ -89,7 +89,6 @@ private: { SetName("DimensionalityReduction"); SetDescription("Perform Dimension reduction of the input image."); - SetDocName("Dimensionality reduction"); SetDocLongDescription("Performs dimensionality reduction on input image. PCA,NA-PCA,MAF,ICA methods are available. It is also possible to compute the inverse transform to reconstruct the image. It is also possible to optionally export the transformation matrix to a text file."); SetDocLimitations("This application does not provide the inverse transform and the transformation matrix export for the MAF."); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbImageDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbImageDimensionalityReduction.cxx index 6d74cf3dff92bad04e794556809bef31484b37d9..3258373e4e5d2801208c0f52170089f92ff4d7f6 100644 --- a/Modules/Applications/AppDimensionalityReduction/app/otbImageDimensionalityReduction.cxx +++ b/Modules/Applications/AppDimensionalityReduction/app/otbImageDimensionalityReduction.cxx @@ -129,7 +129,6 @@ private: "according to a dimensionality reduction model file."); // Documentation - SetDocName("Image Dimensionality Reduction"); SetDocLongDescription("This application reduces the dimension of an input" " image, based on a machine learning model file produced by" " the TrainDimensionalityReduction application. Pixels of the " diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbTrainDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbTrainDimensionalityReduction.cxx index 8fdbd022f265bd5314300197cc76d3bb9708a466..d5ea4307e9ce7b46da59c1a4a9dcbe6f9de16519 100644 --- a/Modules/Applications/AppDimensionalityReduction/app/otbTrainDimensionalityReduction.cxx +++ b/Modules/Applications/AppDimensionalityReduction/app/otbTrainDimensionalityReduction.cxx @@ -73,7 +73,6 @@ private: SetName("TrainDimensionalityReduction"); SetDescription("Train a dimensionality reduction model"); - SetDocName("Train Dimensionality Reduction"); SetDocLongDescription("Trainer for dimensionality reduction algorithms " "(autoencoders, PCA, SOM). All input samples are used to compute the " "model, like other machine learning models.\n" diff --git a/Modules/Applications/AppDimensionalityReduction/app/otbVectorDimensionalityReduction.cxx b/Modules/Applications/AppDimensionalityReduction/app/otbVectorDimensionalityReduction.cxx index 61c73b48ec4c505cf082a7c7bb7940a5c3f996bf..ab279f88451e0ded18335a4ef47c977832ffc562 100644 --- a/Modules/Applications/AppDimensionalityReduction/app/otbVectorDimensionalityReduction.cxx +++ b/Modules/Applications/AppDimensionalityReduction/app/otbVectorDimensionalityReduction.cxx @@ -86,7 +86,6 @@ private: SetName("VectorDimensionalityReduction"); SetDescription("Performs dimensionality reduction of the input vector data " "according to a model file."); - SetDocName("Vector Dimensionality Reduction"); SetDocAuthors("OTB-Team"); SetDocLongDescription("This application performs a vector data " "dimensionality reduction based on a model file produced by the " diff --git a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx index 45e44f352d9a74d9260762d10dbd8c3e59d2e007..3996335d03290236e7ff2f1e93a1d94b35d11dda 100644 --- a/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx +++ b/Modules/Applications/AppDomainTransform/app/otbDomainTransform.cxx @@ -84,7 +84,6 @@ private: SetDescription("Domain Transform application for wavelet and fourier"); // Documentation - SetDocName("DomainTransform"); SetDocLongDescription("Domain Transform application for wavelet and fourier."); SetDocLimitations("This application is not streamed, check your system resources when processing large images"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx b/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx index 0d800da70fd92e4951712ff9f939aadbdfb2abd1..ca0706944733396ba64efee0f18151caf4872cf0 100644 --- a/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx +++ b/Modules/Applications/AppEdge/app/otbEdgeExtraction.cxx @@ -64,7 +64,6 @@ private: "selected channel"); // Documentation - SetDocName("Edge Feature Extraction"); SetDocLongDescription( "This application computes edge features on a selected channel of the input." "It uses different filter such as gradient, Sobel and Touzi"); diff --git a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx index f5588a2a50847b7a519ccfaf004066a080df68c6..b2445364281da5c1f458e17c0b4f3739ff644cfd 100644 --- a/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx +++ b/Modules/Applications/AppEdge/app/otbLineSegmentDetection.cxx @@ -59,7 +59,6 @@ private: SetDescription("Detect line segments in raster"); // Documentation - SetDocName("Line segment detection"); SetDocLongDescription( "This application detects locally straight contours in a image." " It is based on Burns, Hanson, and Riseman method and use an a contrario " diff --git a/Modules/Applications/AppFiltering/app/otbContrastEnhancement.cxx b/Modules/Applications/AppFiltering/app/otbContrastEnhancement.cxx index bbb8f2757b801c60d4254f6c6662c02e0ca82120..2463437174bffcaad5df5962eda5752cdf53fa99 100644 --- a/Modules/Applications/AppFiltering/app/otbContrastEnhancement.cxx +++ b/Modules/Applications/AppFiltering/app/otbContrastEnhancement.cxx @@ -153,7 +153,6 @@ private: "also a mode to equalize the luminance of the image."); // Documentation - SetDocName("Contrast Enhancement"); SetDocLongDescription("This application is the implementation of the " "histogram equalization algorithm. The idea of the algorithm is to use " "the whole available dynamic. In order to do so it computes a histogram " diff --git a/Modules/Applications/AppFiltering/app/otbSmoothing.cxx b/Modules/Applications/AppFiltering/app/otbSmoothing.cxx index 9134e8d22a49592695f0227532a273743b227447..443db5226b295b9463bcfc45a6ca85bbc829e1ca 100644 --- a/Modules/Applications/AppFiltering/app/otbSmoothing.cxx +++ b/Modules/Applications/AppFiltering/app/otbSmoothing.cxx @@ -60,7 +60,6 @@ private: SetName( "Smoothing" ); SetDescription( "Apply a smoothing filter to an image" ); - SetDocName( "Smoothing" ); SetDocLongDescription( "This application applies a smoothing filter to an " "image. Three methodes can be used: a gaussian filter , a mean filter " ", or an anisotropic diffusion using the Perona-Malik algorithm." ); diff --git a/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx b/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx index 3ca73ce8ad34e988027e619af9b3e3b9c8f1dcfb..08015f34efbcea38d89b6eba7f754ff86e23210f 100644 --- a/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx +++ b/Modules/Applications/AppFusion/app/otbBundleToPerfectSensor.cxx @@ -48,7 +48,6 @@ private: SetDescription("Perform P+XS pansharpening"); // Documentation - SetDocName("Bundle to perfect sensor"); SetDocLongDescription("This application performs P+XS pansharpening. The default mode use Pan and XS sensor models to estimate the transformation to superimpose XS over Pan before the fusion (\"default mode\"). The application provides also a PHR mode for Pleiades images which does not use sensor models as Pan and XS products are already coregistered but only estimate an affine transformation to superimpose XS over the Pan.Note that this option is automatically activated in case Pleiades images are detected as input."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppFusion/app/otbPansharpening.cxx b/Modules/Applications/AppFusion/app/otbPansharpening.cxx index e593a2d8edc2f050315fdae3d3970490d9cf213e..de01b8c5ce09c3789e702191051aa8ce29f956db 100644 --- a/Modules/Applications/AppFusion/app/otbPansharpening.cxx +++ b/Modules/Applications/AppFusion/app/otbPansharpening.cxx @@ -77,7 +77,6 @@ private: SetDescription("Perform P+XS pansharpening"); // Documentation - SetDocName("Pansharpening"); SetDocLongDescription("This application performs P+XS pansharpening. Pansharpening is a process of merging high-resolution panchromatic and lower resolution multispectral imagery to create a single high-resolution color image. Algorithms available in the applications are: RCS, bayesian fusion and Local Mean and Variance Matching(LMVM)."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx index 3534cd8513a3649c0a7ee5ddc3ef1d9ec8895cf5..b3417e3f8eedba1ecc9bc07bbf3ee71743f21afe 100644 --- a/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx +++ b/Modules/Applications/AppHyperspectral/app/otbEndmemberNumberEstimation.cxx @@ -55,7 +55,6 @@ private: SetDescription("Estimate the number of endmembers in a hyperspectral image"); // Documentation - SetDocName("Endmember Number Estimation"); SetDocLongDescription("Estimate the number of endmembers " "in a hyperspectral image. First, compute statistics on the image and then " "apply an endmember number estimation algorithm using these statistics. Two " diff --git a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx index 024834a13141c5c5c10e8b6967131b7e66dbe033..f4a0bd1e5f04dcac2d33eb6229c1c2805f4b9564 100644 --- a/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx +++ b/Modules/Applications/AppHyperspectral/app/otbHyperspectralUnmixing.cxx @@ -94,7 +94,6 @@ private: SetDescription("Estimate abundance maps from an hyperspectral image and a set of endmembers."); // Documentation - SetDocName("Hyperspectral data unmixing"); SetDocLongDescription("The application applies a linear unmixing algorithm " "to an hyperspectral data cube. This method supposes that the mixture between " "aterials in the scene is macroscopic and simulates a linear mixing model of " diff --git a/Modules/Applications/AppHyperspectral/app/otbLocalRxDetection.cxx b/Modules/Applications/AppHyperspectral/app/otbLocalRxDetection.cxx index 043e5f796b0506a67c9751ead3a76c8f36fba815..2332a1dac0615b6bc22c50efa6763781829dc4f3 100644 --- a/Modules/Applications/AppHyperspectral/app/otbLocalRxDetection.cxx +++ b/Modules/Applications/AppHyperspectral/app/otbLocalRxDetection.cxx @@ -54,7 +54,6 @@ private: SetDescription("Performs local Rx score computation on an hyperspectral image."); // Documentation - SetDocName("Local Rx Detection"); SetDocLongDescription("Performs local Rx score computation on an input " "hyperspectral image. For each hyperspectral pixel, the Rx score is " "computed using statistics computed on a dual neighborhood. The dual " diff --git a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx index 735b699d9c946580b462219f8a7d29f0d4fade80..484ce77d21f52c3cd8ea1f495a8b25ee8371f218 100644 --- a/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx +++ b/Modules/Applications/AppHyperspectral/app/otbVertexComponentAnalysis.cxx @@ -55,7 +55,6 @@ private: "Component Analysis algorithm."); // Documentation - SetDocName("Vertex Component Analysis"); SetDocLongDescription("Apply the Vertex Component Analysis [1] to " "an hyperspectral image to extract endmembers. Given a set of mixed " "spectral vectors (multispectral or hyperspectral), the application " diff --git a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx index e2078b324c452888e803dbb950ad7a3fe6f7dac6..64c84b75cb335a472e0ae2b6824d4629759c201a 100644 --- a/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx +++ b/Modules/Applications/AppImageUtils/app/otbColorMapping.cxx @@ -240,7 +240,6 @@ private: SetName("ColorMapping"); SetDescription("Map a label image to 8-bits RGB using look-up tables."); - SetDocName("Color Mapping"); SetDocLongDescription( "Map a label image to a 8-bits RGB image (both ways) using different methods:\n\n" diff --git a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx index a5f7b76e2eefd594ee80bd0ebb1205da4e0672fa..bbd81130c3366022d5ce871779d42b876a378a0d 100644 --- a/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx +++ b/Modules/Applications/AppImageUtils/app/otbCompareImages.cxx @@ -55,7 +55,6 @@ private: SetDescription("Estimator between 2 images."); // Documentation - SetDocName("Images comparison"); SetDocLongDescription( "Compute MSE (Mean Squared Error), MAE (Mean Absolute Error) and PSNR (Peak Signal to Noise Ratio) between two image bands (reference and measurement). " "The user has to set the used channel and can specify a ROI." diff --git a/Modules/Applications/AppImageUtils/app/otbConcatenateImages.cxx b/Modules/Applications/AppImageUtils/app/otbConcatenateImages.cxx index 1e790995c416c9ced025626aa83c3f5e550487fb..2b0757ef1a932411738fc5f855046831a509aae3 100644 --- a/Modules/Applications/AppImageUtils/app/otbConcatenateImages.cxx +++ b/Modules/Applications/AppImageUtils/app/otbConcatenateImages.cxx @@ -60,7 +60,6 @@ private: SetDescription("Concatenate a list of images of the same size into a single multi-channel image."); // Documentation - SetDocName("Images Concatenation"); SetDocLongDescription("Concatenate a list of images of the same size into a single multi-channel image. " "It reads the input image list (single or multi-channel) " "and generates a single multi-channel image. The channel order is the same as the list."); diff --git a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx index 364cc4dea7446f6d32b2e8ef1d2ca6727e6d5dbe..b051a2119edac2f4dd69eaedc286532a869ecc47 100644 --- a/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx +++ b/Modules/Applications/AppImageUtils/app/otbDownloadSRTMTiles.cxx @@ -196,7 +196,6 @@ private: SetDescription("Download or list SRTM tiles"); // Documentation - SetDocName("Download or list SRTM tiles related to a set of images"); SetDocLongDescription("This application allows selecting the appropriate SRTM tiles that covers a list of images. It builds a list of the required tiles. Two modes are available: the first one download those tiles from the USGS SRTM3 website (http://dds.cr.usgs.gov/srtm/version2_1/SRTM3/), the second one list those tiles in a local directory. In both cases, you need to indicate the directory in which directory tiles will be download or the location of local SRTM files."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx index e86791307367318fd585223e2bbfecacb826dc3d..d15863691672867aa93ba64d19162c228146e23c 100644 --- a/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx +++ b/Modules/Applications/AppImageUtils/app/otbDynamicConvert.cxx @@ -73,7 +73,6 @@ private: SetName("DynamicConvert"); SetDescription("Change the pixel type and rescale the image's dynamic"); - SetDocName("Dynamic Conversion"); SetDocLongDescription( "This application performs an image pixel type " "conversion (short, ushort, uchar, int, uint, float and double types are " diff --git a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx index b148be6bf800621c36ed22fca0bd7fa6e0c84d0a..20cfb9c00b22a35038ea49ea1ef3be0e8728627a 100644 --- a/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx +++ b/Modules/Applications/AppImageUtils/app/otbExtractROI.cxx @@ -75,7 +75,6 @@ private: SetDescription("Extract a ROI defined by the user."); // Documentation - SetDocName("Extract ROI"); SetDocLongDescription("This application extracts a Region Of Interest with " "user parameters. There are four mode of extraction. The standard mode " "allows the user to enter one point (upper left corner of the region to " diff --git a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx index 4cd2b5f917dfdf22963006931c5bcd91b583bee8..9158381ec66f5d389a6bde0c21cff74bff3c9468 100644 --- a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx +++ b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx @@ -63,7 +63,6 @@ private: SetName("ManageNoData"); SetDescription("Manage No-Data"); // Documentation - SetDocName("No Data management"); SetDocLongDescription("This application has two modes. The first allows building a mask of no-data pixels from the no-data flags read from the image file. The second allows updating the change the no-data value of an image (pixels value and metadata). This last mode also allows replacing NaN in images with a proper no-data value. To do so, one should activate the NaN is no-data option."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx b/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx index d99f5e7d9cdf0a8e707f8f326255e0497af5439a..833ebcb970627c9f7045df0eadbed7616ba99939 100644 --- a/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx +++ b/Modules/Applications/AppImageUtils/app/otbMultiResolutionPyramid.cxx @@ -64,7 +64,6 @@ private: SetDescription("Build a multi-resolution pyramid of the image."); // Documentation - SetDocName("Multi Resolution Pyramid"); SetDocLongDescription("This application builds a multi-resolution pyramid of the input image. User can specified the number of levels of the pyramid and the subsampling factor. To speed up the process, you can use the fast scheme option"); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx index 333e7ba397ca20d22e40fd0f3a6c17a1006e8d7d..7a972d420facc3b35a7b0fc4ea638266e0a2f05e 100644 --- a/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx +++ b/Modules/Applications/AppImageUtils/app/otbPixelValue.cxx @@ -54,7 +54,6 @@ private: SetDescription("Get the value of a pixel."); // Documentation - SetDocName("Pixel Value"); SetDocLongDescription("This application gives the value of a selected " "pixel. There are three ways to designate a pixel, with its index, " "its physical coordinate (in the physical space attached to the image), " diff --git a/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx b/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx index 1f70e6c542985c37998860ca40ffdd6607e3e313..48cc0d01da68995cc326d360fd4608dcc9acfc14 100644 --- a/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx +++ b/Modules/Applications/AppImageUtils/app/otbQuicklook.cxx @@ -57,7 +57,6 @@ private: { SetName("Quicklook"); SetDescription("Generates a subsampled version of an image extract"); - SetDocName("Quick Look"); SetDocLongDescription("Generates a subsampled version of an extract of an image defined by ROIStart and ROISize.\n" "This extract is subsampled using the ratio OR the output image Size."); SetDocLimitations("This application does not provide yet the optimal way to decode coarser level of resolution from JPEG2000 images (like in Monteverdi).\n" diff --git a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx index f114d1826b89415b61ea7b8abcd69c346cf8c086..de958dddfbc249cb4a219a16df4d309d37923798 100644 --- a/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx +++ b/Modules/Applications/AppImageUtils/app/otbReadImageInfo.cxx @@ -54,7 +54,6 @@ private: SetDescription("Get information about the image"); // Documentation - SetDocName("Read image information"); SetDocLongDescription("Display information about the input image like: image size, origin, spacing, metadata, projections..."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppImageUtils/app/otbRescale.cxx b/Modules/Applications/AppImageUtils/app/otbRescale.cxx index ddb95a9404170a485a5006b86229272a2341e90d..0a50d18e46ceffab913d0e97a0930c0d3a1ed6b4 100644 --- a/Modules/Applications/AppImageUtils/app/otbRescale.cxx +++ b/Modules/Applications/AppImageUtils/app/otbRescale.cxx @@ -54,13 +54,12 @@ private: SetName("Rescale"); SetDescription("Rescale the image between two given values."); - SetDocName("Rescale Image"); SetDocLongDescription("This application scales the given image pixel intensity between two given values.\n" "By default min (resp. max) value is set to 0 (resp. 255).\n" "Input minimum and maximum values is automatically computed for all image bands."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); - SetDocSeeAlso(" "); + SetDocSeeAlso("DynamicConvert"); AddDocTag(Tags::Deprecated); AddDocTag(Tags::Manip); diff --git a/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx b/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx index 0344029cd3e641532bbe01673fcca056bf26f9f9..3b1185ff604fed24668feb655e4f646ae24ff103 100644 --- a/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx +++ b/Modules/Applications/AppImageUtils/app/otbSplitImage.cxx @@ -54,7 +54,6 @@ private: SetName("SplitImage"); SetDescription("Split a N multiband image into N images."); - SetDocName("Split Image"); SetDocLongDescription("This application splits a N-bands image into N mono-band images. " "The output images filename will be generated from the output parameter. " "Thus, if the input image has 2 channels, and the user has set as output parameter, outimage.tif, " diff --git a/Modules/Applications/AppImageUtils/app/otbTileFusion.cxx b/Modules/Applications/AppImageUtils/app/otbTileFusion.cxx index 57c83dc13296442816b44311fd8c474b2b84e430..3db81c3cee417d6345694d12dc8c31264afae74d 100644 --- a/Modules/Applications/AppImageUtils/app/otbTileFusion.cxx +++ b/Modules/Applications/AppImageUtils/app/otbTileFusion.cxx @@ -51,7 +51,6 @@ private: SetDescription("Fusion of an image made of several tile files."); // Documentation - SetDocName("Image Tile Fusion"); SetDocLongDescription("Automatically mosaic a set of non overlapping tile files into a single image. Images must have a matching number of bands and they must be listed in lexicographic order."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx index 4d13ff7279378f64dcc20f7e5175b5e005900751..9ba700804e8acd5513db8bc5b216b25c05c9d93a 100644 --- a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx +++ b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx @@ -20,16 +20,14 @@ #include "otbWrapperApplication.h" #include "otbWrapperApplicationFactory.h" +#include "otbWrapperNumericalParameter.h" -#include "itkUnaryFunctorImageFilter.h" +#include "otbVegetationIndicesFunctor.h" #include "otbWaterIndicesFunctor.h" #include "otbBuiltUpIndicesFunctor.h" #include "otbSoilIndicesFunctor.h" - -#include "otbImageList.h" -#include "otbImageListToVectorImageFilter.h" - -#include "otbWrapperNumericalParameter.h" +#include "otbIndicesStackFunctor.h" +#include "otbFunctorImageFilter.h" namespace otb { @@ -50,78 +48,21 @@ public: itkTypeMacro(RadiometricIndices, otb::Wrapper::Application); - /** Output containers typedef */ - typedef ObjectList<itk::ProcessObject> FilterListType; - typedef ImageList<FloatImageType> ImageListType; - typedef ImageListToVectorImageFilter<ImageListType, FloatVectorImageType> ImageListToVectorImageFilterType; - - /** Radiometric water indices functors typedef */ - typedef Functor::SRWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> SRWIFunctorType; - typedef Functor::NDWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDWIFunctorType; - typedef Functor::NDWI2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDWI2FunctorType; - typedef Functor::MNDWI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MNDWIFunctorType; - typedef Functor::NDPI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDPIFunctorType; - typedef Functor::NDTI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDTIFunctorType; - //typedef Functor::WaterSqrtSpectralAngleFunctor<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> WaterSqrtSpectralAngleFunctor; - - /** Radiometric vegetation indices functors typedef */ - typedef Functor::NDVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDVIFunctor; - typedef Functor::TNDVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> TNDVIFunctor; - typedef Functor::RVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> RVIFunctor; - typedef Functor::SAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> SAVIFunctor; - typedef Functor::TSAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> TSAVIFunctor; - typedef Functor::MSAVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MSAVIFunctor; - typedef Functor::MSAVI2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> MSAVI2Functor; - typedef Functor::GEMI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> GEMIFunctor; - typedef Functor::IPVI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IPVIFunctor; - typedef Functor::LAIFromNDVILogarithmic<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromNDVILogFunctor; - typedef Functor::LAIFromReflectancesLinear<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromReflLinearFunctor; - typedef Functor::LAIFromNDVIFormosat2Functor<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> LAIFromNDVIFormoFunctor; - - /** Radiometric soil indices functors typedef */ - typedef Functor::IR<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IRFunctor; - typedef Functor::IC<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> ICFunctor; - typedef Functor::IB<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> IBFunctor; - typedef Functor::IB2<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType, FloatImageType::PixelType> IB2Functor; - - /** Radiometric built up indices functors typedef */ - typedef Functor::NDBI<FloatVectorImageType::InternalPixelType, FloatVectorImageType::InternalPixelType, FloatImageType::PixelType> NDBIFunctor; - - /** Radiometric indices filters typedef */ - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDWIFunctorType> NDWIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDWI2FunctorType> NDWI2FilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MNDWIFunctorType> MNDWIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDPIFunctorType> NDPIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDTIFunctorType> NDTIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, SRWIFunctorType> SRWIFilterType; - - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, NDVIFunctor> NDVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, TNDVIFunctor> TNDVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, RVIFunctor> RVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, SAVIFunctor> SAVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, TSAVIFunctor> TSAVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MSAVIFunctor> MSAVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, MSAVI2Functor> MSAVI2FilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, GEMIFunctor> GEMIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IPVIFunctor> IPVIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromNDVILogFunctor> LAIFromNDVILogFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromReflLinearFunctor> LAIFromReflLinearFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, LAIFromNDVIFormoFunctor> LAIFromNDVIFormoFilterType; - - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IRFunctor> RIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, ICFunctor> CIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IBFunctor> BIFilterType; - typedef itk::UnaryFunctorImageFilter<FloatVectorImageType, FloatImageType, IB2Functor> BI2FilterType; - - struct indiceSpec + using InputType = FloatVectorImageType::InternalPixelType; + using OutputType = FloatImageType::PixelType; + + using RadiometricIndexType = otb::Functor::RadiometricIndex<InputType, OutputType>; + using IndicesStackFunctorType = otb::Functor::IndicesStackFunctor<RadiometricIndexType>; + + class indiceSpec { + public: + indiceSpec(std::string k, std::string i, RadiometricIndexType* ind) : key(k), item(i), indice(ind) + { + } std::string key; std::string item; - std::string description; - std::string type; - std::string chan1; - std::string chan2; - std::string chan3; + std::unique_ptr<RadiometricIndexType> indice; }; @@ -132,7 +73,6 @@ private: SetDescription("Compute radiometric indices."); // Documentation - SetDocName("Radiometric Indices"); SetDocLongDescription("This application computes radiometric indices using the relevant channels of the input image. The output is a multi band image into which each channel is one of the selected indices."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); @@ -153,46 +93,52 @@ private: AddParameter(ParameterType_Int, "channels.blue", "Blue Channel"); SetParameterDescription("channels.blue", "Blue channel index"); SetDefaultParameterInt("channels.blue", 1); + SetMinimumParameterIntValue("channels.blue", 1); + AddParameter(ParameterType_Int, "channels.green", "Green Channel"); SetParameterDescription("channels.green", "Green channel index"); SetDefaultParameterInt("channels.green", 1); + SetMinimumParameterIntValue("channels.green", 1); + AddParameter(ParameterType_Int, "channels.red", "Red Channel"); SetParameterDescription("channels.red", "Red channel index"); SetDefaultParameterInt("channels.red", 1); + SetMinimumParameterIntValue("channels.red", 1); + AddParameter(ParameterType_Int, "channels.nir", "NIR Channel"); SetParameterDescription("channels.nir", "NIR channel index"); SetDefaultParameterInt("channels.nir", 1); + SetMinimumParameterIntValue("channels.nir", 1); + AddParameter(ParameterType_Int, "channels.mir", "Mir Channel"); SetParameterDescription("channels.mir", "Mir channel index"); SetDefaultParameterInt("channels.mir", 1); - //AddParameter(ParameterType_Int, "channels.rho860", "Rho860 Channel"); - //SetParameterDescription("channels.rho860", "860nm band channel index"); - //SetDefaultParameterInt("channels.rho860", 1); - //AddParameter(ParameterType_Int, "channels.rho1240", "Rho1240 Channel"); - //SetParameterDescription("channels.rho1240", "1240nm band channel index"); - //SetDefaultParameterInt("channels.rho1240", 1); + SetMinimumParameterIntValue("channels.mir", 1); AddParameter(ParameterType_ListView, "list", "Available Radiometric Indices"); SetParameterDescription("list", - "List of available radiometric indices with their relevant channels in brackets:\n\n" - "* Vegetation:NDVI - Normalized difference vegetation index (Red, NIR)\n" - "* Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR)\n" - "* Vegetation:RVI - Ratio vegetation index (Red, NIR)\n" - "* Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR)\n" - "* Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR)\n" - "* Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR)\n" - "* Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR)\n" - "* Vegetation:GEMI - Global environment monitoring index (Red, NIR)\n" - "* Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR)\n" - "* Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR)\n" - "* Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR)\n" - "* Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR)\n" - "* Water:NDPI - Normalized difference pond index (Lacaux et al.) (MIR, Green)\n" - "* Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green)\n" - "* Soil:RI - Redness index (Red, Green)\n" - "* Soil:CI - Color index (Red, Green)\n" - "* Soil:BI - Brightness index (Red, Green)\n" - "* Soil:BI2 - Brightness index 2 (NIR, Red, Green)"); + "List of available radiometric indices with their relevant channels in brackets:\n\n" + "* Vegetation:NDVI - Normalized difference vegetation index (Red, NIR)\n" + "* Vegetation:TNDVI - Transformed normalized difference vegetation index (Red, NIR)\n" + "* Vegetation:RVI - Ratio vegetation index (Red, NIR)\n" + "* Vegetation:SAVI - Soil adjusted vegetation index (Red, NIR)\n" + "* Vegetation:TSAVI - Transformed soil adjusted vegetation index (Red, NIR)\n" + "* Vegetation:MSAVI - Modified soil adjusted vegetation index (Red, NIR)\n" + "* Vegetation:MSAVI2 - Modified soil adjusted vegetation index 2 (Red, NIR)\n" + "* Vegetation:GEMI - Global environment monitoring index (Red, NIR)\n" + "* Vegetation:IPVI - Infrared percentage vegetation index (Red, NIR)\n" + "* Vegetation:LAIFromNDVILog - Leaf Area Index from log NDVI (Red, NIR)\n" + "* Vegetation::LAIFromReflLinear - Leaf Area Index from reflectances with linear combination (Red, NIR)\n" + "* Vegetation::LAIFromNDVIFormo - Leaf Area Index from Formosat 2 TOC (Red, NIR)\n" + "* Water:NDWI - Normalized difference water index (Gao 1996) (NIR, MIR)\n" + "* Water:NDWI2 - Normalized difference water index (Mc Feeters 1996) (Green, NIR)\n" + "* Water:MNDWI - Modified normalized difference water index (Xu 2006) (Green, MIR)\n" + "* Water:NDTI - Normalized difference turbidity index (Lacaux et al.) (Red, Green)\n" + "* Soil:RI - Redness index (Red, Green)\n" + "* Soil:CI - Color index (Red, Green)\n" + "* Soil:BI - Brightness index (Red, Green)\n" + "* Soil:BI2 - Brightness index 2 (NIR, Red, Green)\n" + "* BuiltUp:ISU - Built Surfaces Index (NIR,Red) "); AddRAMParameter(); @@ -205,392 +151,118 @@ private: m_Map.clear(); - // Add Available choices - indiceSpec s_NDVI; - s_NDVI.key = "list.ndvi"; - s_NDVI.item = "Vegetation:NDVI"; - s_NDVI.description = ""; - s_NDVI.type = "NDVI"; - s_NDVI.chan1 = "red"; - s_NDVI.chan2 = "nir"; - s_NDVI.chan3 = ""; - m_Map.push_back(s_NDVI); - - indiceSpec s_TNDVI; - s_TNDVI.key = "list.tndvi"; - s_TNDVI.item = "Vegetation:TNDVI"; - s_TNDVI.description = ""; - s_TNDVI.type = "TNDVI"; - s_TNDVI.chan1 = "red"; - s_TNDVI.chan2 = "nir"; - s_TNDVI.chan3 = ""; - m_Map.push_back(s_TNDVI); - - indiceSpec s_RVI; - s_RVI.key = "list.rvi"; - s_RVI.item = "Vegetation:RVI"; - s_RVI.description = ""; - s_RVI.type = "RVI"; - s_RVI.chan1 = "red"; - s_RVI.chan2 = "nir"; - s_RVI.chan3 = ""; - m_Map.push_back(s_RVI); - - indiceSpec s_SAVI; - s_SAVI.key = "list.savi"; - s_SAVI.item = "Vegetation:SAVI"; - s_SAVI.description = ""; - s_SAVI.type = "SAVI"; - s_SAVI.chan1 = "red"; - s_SAVI.chan2 = "nir"; - s_SAVI.chan3 = ""; - m_Map.push_back(s_SAVI); - - indiceSpec s_TSAVI; - s_TSAVI.key = "list.tsavi"; - s_TSAVI.item = "Vegetation:TSAVI"; - s_TSAVI.description = ""; - s_TSAVI.type = "TSAVI"; - s_TSAVI.chan1 = "red"; - s_TSAVI.chan2 = "nir"; - s_TSAVI.chan3 = ""; - m_Map.push_back(s_TSAVI); - - indiceSpec s_MSAVI; - s_MSAVI.key = "list.msavi"; - s_MSAVI.item = "Vegetation:MSAVI"; - s_MSAVI.description = ""; - s_MSAVI.type = "MSAVI"; - s_MSAVI.chan1 = "red"; - s_MSAVI.chan2 = "nir"; - s_MSAVI.chan3 = ""; - m_Map.push_back(s_MSAVI); - - indiceSpec s_MSAVI2; - s_MSAVI2.key = "list.msavi2"; - s_MSAVI2.item = "Vegetation:MSAVI2"; - s_MSAVI2.description = ""; - s_MSAVI2.type = "MSAVI2"; - s_MSAVI2.chan1 = "red"; - s_MSAVI2.chan2 = "nir"; - s_MSAVI2.chan3 = ""; - m_Map.push_back(s_MSAVI2); - - indiceSpec s_GEMI; - s_GEMI.key = "list.gemi"; - s_GEMI.item = "Vegetation:GEMI"; - s_GEMI.description = ""; - s_GEMI.type = "GEMI"; - s_GEMI.chan1 = "red"; - s_GEMI.chan2 = "nir"; - s_GEMI.chan3 = ""; - m_Map.push_back(s_GEMI); - - indiceSpec s_IPVI; - s_IPVI.key = "list.ipvi"; - s_IPVI.item = "Vegetation:IPVI"; - s_IPVI.description = ""; - s_IPVI.type = "IPVI"; - s_IPVI.chan1 = "red"; - s_IPVI.chan2 = "nir"; - s_IPVI.chan3 = ""; - m_Map.push_back(s_IPVI); - - indiceSpec s_LAIFromNDVILog; - s_LAIFromNDVILog.key = "list.laindvilog"; - s_LAIFromNDVILog.item = "Vegetation:LAIFromNDVILog"; - s_LAIFromNDVILog.description = ""; - s_LAIFromNDVILog.type = "LAIFromNDVILog"; - s_LAIFromNDVILog.chan1 = "red"; - s_LAIFromNDVILog.chan2 = "nir"; - s_LAIFromNDVILog.chan3 = ""; - m_Map.push_back(s_LAIFromNDVILog); - - indiceSpec s_LAIFromReflLinear; - s_LAIFromReflLinear.key = "list.lairefl"; - s_LAIFromReflLinear.item = "Vegetation:LAIFromReflLinear"; - s_LAIFromReflLinear.description = ""; - s_LAIFromReflLinear.type = "LAIFromReflLinear"; - s_LAIFromReflLinear.chan1 = "red"; - s_LAIFromReflLinear.chan2 = "nir"; - s_LAIFromReflLinear.chan3 = ""; - m_Map.push_back(s_LAIFromReflLinear); - - indiceSpec s_LAIFromNDVIFormo; - s_LAIFromNDVIFormo.key = "list.laindviformo"; - s_LAIFromNDVIFormo.item = "Vegetation:LAIFromNDVIFormo"; - s_LAIFromNDVIFormo.description = ""; - s_LAIFromNDVIFormo.type = "LAIFromNDVIFormo"; - s_LAIFromNDVIFormo.chan1 = "red"; - s_LAIFromNDVIFormo.chan2 = "nir"; - s_LAIFromNDVIFormo.chan3 = ""; - m_Map.push_back(s_LAIFromNDVIFormo); - - indiceSpec s_NDWI; - s_NDWI.key = "list.ndwi"; - s_NDWI.item = "Water:NDWI"; - s_NDWI.description = ""; - s_NDWI.type = "NDWI"; - s_NDWI.chan1 = "nir"; - s_NDWI.chan2 = "mir"; - s_NDWI.chan3 = ""; - m_Map.push_back(s_NDWI); - - indiceSpec s_NDWI2; - s_NDWI2.key = "list.ndwi2"; - s_NDWI2.item = "Water:NDWI2"; - s_NDWI2.description = ""; - s_NDWI2.type = "NDWI2"; - s_NDWI2.chan1 = "green"; - s_NDWI2.chan2 = "nir"; - s_NDWI2.chan3 = ""; - m_Map.push_back(s_NDWI2); - - indiceSpec s_MNDWI; - s_MNDWI.key = "list.mndwi"; - s_MNDWI.item = "Water:MNDWI"; - s_MNDWI.description = ""; - s_MNDWI.type = "MNDWI"; - s_MNDWI.chan1 = "green"; - s_MNDWI.chan2 = "mir"; - s_MNDWI.chan3 = ""; - m_Map.push_back(s_MNDWI); - - indiceSpec s_NDPI; - s_NDPI.key = "list.ndpi"; - s_NDPI.item = "Water:NDPI"; - s_NDPI.description = ""; - s_NDPI.type = "NDPI"; - s_NDPI.chan1 = "mir"; - s_NDPI.chan2 = "green"; - s_NDPI.chan3 = ""; - m_Map.push_back(s_NDPI); - - indiceSpec s_NDTI; - s_NDTI.key = "list.ndti"; - s_NDTI.item = "Water:NDTI"; - s_NDTI.description = ""; - s_NDTI.type = "NDTI"; - s_NDTI.chan1 = "red"; - s_NDTI.chan2 = "green"; - s_NDTI.chan3 = ""; - m_Map.push_back(s_NDTI); - - indiceSpec s_SRWI; - s_SRWI.key = "list.srwi"; - s_SRWI.item = "Water:SRWI"; - s_SRWI.description = ""; - s_SRWI.type = "SRWI"; - s_SRWI.chan1 = "rho860"; - s_SRWI.chan2 = "rho1240"; - s_SRWI.chan3 = ""; - //m_Map.push_back(s_SRWI); - - indiceSpec s_RI; - s_RI.key = "list.ri"; - s_RI.item = "Soil:RI"; - s_RI.description = ""; - s_RI.type = "RI"; - s_RI.chan1 = "red"; - s_RI.chan2 = "green"; - s_RI.chan3 = ""; - m_Map.push_back(s_RI); - - indiceSpec s_CI; - s_CI.key = "list.ci"; - s_CI.item = "Soil:CI"; - s_CI.description = ""; - s_CI.type = "CI"; - s_CI.chan1 = "red"; - s_CI.chan2 = "green"; - s_CI.chan3 = ""; - m_Map.push_back(s_CI); - - indiceSpec s_BI; - s_BI.key = "list.bi"; - s_BI.item = "Soil:BI"; - s_BI.description = ""; - s_BI.type = "BI"; - s_BI.chan1 = "red"; - s_BI.chan2 = "green"; - s_BI.chan3 = ""; - m_Map.push_back(s_BI); - - indiceSpec s_BI2; - s_BI2.key = "list.bi2"; - s_BI2.item = "Soil:BI2"; - s_BI2.description = ""; - s_BI2.type = "BI2"; - s_BI2.chan1 = "nir"; - s_BI2.chan2 = "red"; - s_BI2.chan3 = "green"; - m_Map.push_back(s_BI2); + m_Map.push_back({"list.ndvi", "Vegetation:NDVI", new otb::Functor::NDVI<InputType, OutputType>()}); + m_Map.push_back({"list.tndvi", "Vegetation:TNDVI", new otb::Functor::TNDVI<InputType, OutputType>()}); + m_Map.push_back({"list.rdvi", "Vegetation:RVI", new otb::Functor::RVI<InputType, OutputType>()}); + m_Map.push_back({"list.savi", "Vegetation:SAVI", new otb::Functor::SAVI<InputType, OutputType>()}); + m_Map.push_back({"list.tsavi", "Vegetation:TSAVI", new otb::Functor::TSAVI<InputType, OutputType>()}); + m_Map.push_back({"list.msavi", "Vegetation:MSAVI", new otb::Functor::MSAVI<InputType, OutputType>()}); + m_Map.push_back({"list.msavi2", "Vegetation:MSAVI2", new otb::Functor::MSAVI2<InputType, OutputType>()}); + m_Map.push_back({"list.gemi", "Vegetation:GEMI", new otb::Functor::GEMI<InputType, OutputType>()}); + m_Map.push_back({"list.ipvi", "Vegetation:IPVI", new otb::Functor::IPVI<InputType, OutputType>()}); + m_Map.push_back({"list.laindvilog", "Vegetation:LAIFromNDVILog", new otb::Functor::LAIFromNDVILogarithmic<InputType, OutputType>()}); + m_Map.push_back({"list.lairefl", "Vegetation:LAIFromReflLinear", new otb::Functor::LAIFromReflectancesLinear<InputType, OutputType>()}); + m_Map.push_back({"list.laindviformo", "Vegetation:LAIFromNDVIFormo", new otb::Functor::LAIFromNDVIFormosat2Functor<InputType, OutputType>()}); + m_Map.push_back({"list.ndwi", "Water:NDWI", new otb::Functor::NDWI<InputType, OutputType>()}); + m_Map.push_back({"list.ndwi2", "Water:NDWI2", new otb::Functor::NDWI2<InputType, OutputType>()}); + m_Map.push_back({"list.mndwi", "Water:MNDWI", new otb::Functor::MNDWI<InputType, OutputType>()}); + m_Map.push_back({"list.ndti", "Water:NDTI", new otb::Functor::NDTI<InputType, OutputType>()}); + m_Map.push_back({"list.ri", "Soil:RI", new otb::Functor::RI<InputType, OutputType>()}); + m_Map.push_back({"list.ci", "Soil:CI", new otb::Functor::CI<InputType, OutputType>()}); + m_Map.push_back({"list.bi", "Soil:BI", new otb::Functor::BI<InputType, OutputType>()}); + m_Map.push_back({"list.bi2", "Soil:BI2", new otb::Functor::BI2<InputType, OutputType>()}); + m_Map.push_back({"list.isu", "BuiltUp:ISU", new otb::Functor::ISU<InputType, OutputType>()}); ClearChoices("list"); + for ( unsigned int i=0; i<m_Map.size(); i++ ) { AddChoice(m_Map[i].key, m_Map[i].item); - //SetParameterDescription(m_Map[i].item, m_Map[i].description); } } - void DoUpdateParameters() override + // Compute required bands for selected indices + std::set<CommonBandNames> GetRequiredBands() { - //Nothing to do here - } + std::set<CommonBandNames> required; -#define otbRadiometricWaterIndicesMacro( type ) \ - { \ - type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \ - std::ostringstream oss; \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1; \ - l_##type##Filter->GetFunctor().SetIndex1(this->GetParameterInt(oss.str()));\ - oss.str(""); \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2; \ - l_##type##Filter->GetFunctor().SetIndex2(this->GetParameterInt(oss.str()));\ - l_##type##Filter->SetInput(inImage); \ - m_FilterList->PushBack( l_##type##Filter ); \ - m_ImageList->PushBack( l_##type##Filter->GetOutput() ); \ - otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added.");\ - } - -#define otbRadiometricVegetationIndicesMacro( type ) \ - { \ - type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \ - std::ostringstream oss; \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1; \ - l_##type##Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str())); \ - oss.str(""); \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2; \ - l_##type##Filter->GetFunctor().SetNIRIndex(this->GetParameterInt(oss.str())); \ - l_##type##Filter->SetInput(inImage); \ - m_FilterList->PushBack( l_##type##Filter ); \ - m_ImageList->PushBack( l_##type##Filter->GetOutput() ); \ - otbAppLogINFO(<<m_Map[GetSelectedItems("list")[idx]].item<<" added.");\ + for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx) + { + auto requiredForCurrentIndice = m_Map[GetSelectedItems("list")[idx]].indice->GetRequiredBands(); + required.insert(requiredForCurrentIndice.begin(), requiredForCurrentIndice.end()); } + return required; + } -#define otbRadiometricSoilIndicesMacro( type ) \ - { \ - type##FilterType::Pointer l_##type##Filter = type##FilterType::New(); \ - std::ostringstream oss; \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1; \ - l_##type##Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str()));\ - oss.str(""); \ - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2; \ - l_##type##Filter->GetFunctor().SetGreenIndex(this->GetParameterInt(oss.str()));\ - l_##type##Filter->SetInput(inImage); \ - m_FilterList->PushBack( l_##type##Filter ); \ - m_ImageList->PushBack( l_##type##Filter->GetOutput() ); \ - otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added.");\ - } + void DoUpdateParameters() override + { + //Nothing to do here + } void DoExecute() override { + // Retrieve number of bands of input image + unsigned int nbChan = GetParameterImage("in")->GetNumberOfComponentsPerPixel(); - int nbChan = GetParameterImage("in")->GetNumberOfComponentsPerPixel(); + // Derive required bands from selected indices + auto requiredBands = GetRequiredBands(); - if ( (this->GetParameterInt("channels.blue") <= nbChan) - && (this->GetParameterInt("channels.green") <= nbChan) - && (this->GetParameterInt("channels.red") <= nbChan) - && (this->GetParameterInt("channels.nir") <= nbChan) - && (this->GetParameterInt("channels.mir") <= nbChan)) - { + // Map to store association between bands and indices + std::map<CommonBandNames, size_t> bandIndicesMap; - m_FilterList = FilterListType::New(); - m_ImageList = ImageListType::New(); - m_Concatener = ImageListToVectorImageFilterType::New(); - - FloatVectorImageType* inImage = GetParameterImage("in"); + // Lambda that will: + // - Check if band is required, + // - Check band index range, + // - Populate the bandIndicesMap + auto bandChecker = [this, requiredBands, nbChan](std::map<CommonBandNames, size_t>& indicesMap, const CommonBandNames& band, const std::string& key) { + if (requiredBands.find(band) != requiredBands.end()) + { + unsigned int idx = this->GetParameterInt(key); - for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx) + if (idx > nbChan) { - - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:NDVI") - otbRadiometricVegetationIndicesMacro(NDVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:TNDVI") - otbRadiometricVegetationIndicesMacro(TNDVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:RVI") - otbRadiometricVegetationIndicesMacro(RVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:SAVI") - otbRadiometricVegetationIndicesMacro(SAVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:TSAVI") - otbRadiometricVegetationIndicesMacro(TSAVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:MSAVI") - otbRadiometricVegetationIndicesMacro(MSAVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:MSAVI2") - otbRadiometricVegetationIndicesMacro(MSAVI2); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:GEMI") - otbRadiometricVegetationIndicesMacro(GEMI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:IPVI") - otbRadiometricVegetationIndicesMacro(IPVI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromNDVILog") - otbRadiometricVegetationIndicesMacro(LAIFromNDVILog); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromReflLinear") - otbRadiometricVegetationIndicesMacro(LAIFromReflLinear); - if (m_Map[GetSelectedItems("list")[idx]].item == "Vegetation:LAIFromNDVIFormo") - otbRadiometricVegetationIndicesMacro(LAIFromNDVIFormo); - - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDWI") - otbRadiometricWaterIndicesMacro(NDWI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDWI2") - otbRadiometricWaterIndicesMacro(NDWI2); - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:MNDWI") - otbRadiometricWaterIndicesMacro(MNDWI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDPI") - otbRadiometricWaterIndicesMacro(NDPI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:NDTI") - otbRadiometricWaterIndicesMacro(NDTI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Water:SRWI") - otbRadiometricWaterIndicesMacro(SRWI); - - if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:RI") - otbRadiometricSoilIndicesMacro(RI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:CI") - otbRadiometricSoilIndicesMacro(CI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:BI") - otbRadiometricSoilIndicesMacro(BI); - if (m_Map[GetSelectedItems("list")[idx]].item == "Soil:BI2") - { - BI2FilterType::Pointer l_BI2Filter = BI2FilterType::New(); - std::ostringstream oss; - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan1; - l_BI2Filter->GetFunctor().SetNIRIndex(this->GetParameterInt(oss.str())); - oss.str(""); - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan2; - l_BI2Filter->GetFunctor().SetRedIndex(this->GetParameterInt(oss.str())); - oss.str(""); - oss<<"channels."<<m_Map[GetSelectedItems("list")[idx]].chan3; - l_BI2Filter->GetFunctor().SetGreenIndex(this->GetParameterInt(oss.str())); - l_BI2Filter->SetInput(inImage); - m_FilterList->PushBack( l_BI2Filter ); - m_ImageList->PushBack( l_BI2Filter->GetOutput() ); - otbAppLogINFO(<< m_Map[GetSelectedItems("list")[idx]].item << " added."); - } - + otbAppLogFATAL(<< "Index for band " << key << " exceeds the number of channels in image (" << nbChan << ")"); } - - if( m_ImageList->Size() == 0 ) + else { - itkExceptionMacro(<< "No indices selected..."); + indicesMap[band] = idx; } + } + }; - m_Concatener->SetInput( m_ImageList ); - m_Concatener->UpdateOutputInformation(); + // Call lambda for each possible band + bandChecker(bandIndicesMap, CommonBandNames::BLUE, "channels.blue"); + bandChecker(bandIndicesMap, CommonBandNames::GREEN, "channels.green"); + bandChecker(bandIndicesMap, CommonBandNames::RED, "channels.red"); + bandChecker(bandIndicesMap, CommonBandNames::NIR, "channels.nir"); + bandChecker(bandIndicesMap, CommonBandNames::MIR, "channels.mir"); - SetParameterOutputImage("out", m_Concatener->GetOutput()); - } - else - { - itkExceptionMacro(<< "At least one needed channel has an invalid index"); + std::vector<RadiometricIndexType*> indices; + + // Find selected indices + for (unsigned int idx = 0; idx < GetSelectedItems("list").size(); ++idx) + { + // Retrieve the indice instance + indices.push_back(m_Map[GetSelectedItems("list")[idx]].indice.get()); + + // And set bands using the band map + indices.back()->SetBandsIndices(bandIndicesMap); } - } + // Build a composite indices functor to compute all indices at + // once + auto compositeFunctor = IndicesStackFunctorType(indices); - FilterListType::Pointer m_FilterList; - ImageListType::Pointer m_ImageList; - ImageListToVectorImageFilterType::Pointer m_Concatener; - std::vector<indiceSpec> m_Map; + // Build and plug functor filter + auto filter = NewFunctorFilter(compositeFunctor); + filter->SetInputs(GetParameterImage("in")); + SetParameterOutputImage("out", filter->GetOutput()); + + // Call register pipeline to allow streaming and garbage collection + RegisterPipeline(); + } + std::vector<indiceSpec> m_Map; }; } diff --git a/Modules/Applications/AppIndices/otb-module.cmake b/Modules/Applications/AppIndices/otb-module.cmake index 6133056e60beb13dd6e2f8ed203274ab1ae3a751..3c100b67faa40cd069df1c1ae1064023ddcc74f4 100644 --- a/Modules/Applications/AppIndices/otb-module.cmake +++ b/Modules/Applications/AppIndices/otb-module.cmake @@ -24,7 +24,7 @@ otb_module(OTBAppIndices DEPENDS OTBIndices OTBApplicationEngine - OTBObjectList + OTBFunctor TEST_DEPENDS OTBTestKernel OTBCommandLine diff --git a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx index 63dd25d75123777b13b172c61939f8413a44ac72..62c9aada87a27808fd6096d33e0609475c7ba01b 100644 --- a/Modules/Applications/AppKMZ/app/otbKmzExport.cxx +++ b/Modules/Applications/AppKMZ/app/otbKmzExport.cxx @@ -50,7 +50,6 @@ private: SetName("KmzExport"); SetDescription("Export the input image in a KMZ product."); // Documentation - SetDocName("Image to KMZ Export"); SetDocLongDescription("This application exports the input image in a kmz product that can be display in the Google Earth software. The user can set the size of the product size, a logo and a legend to the product. Furthemore, to obtain a product that fits the relief, a DEM can be used."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppMathParser/app/otbBandMath.cxx b/Modules/Applications/AppMathParser/app/otbBandMath.cxx index 38edf77197af15a37c5638cc33d7de906616ba2a..6e741ba4e52d9b4ae15d7d29b253f4a725ee0526 100644 --- a/Modules/Applications/AppMathParser/app/otbBandMath.cxx +++ b/Modules/Applications/AppMathParser/app/otbBandMath.cxx @@ -62,7 +62,6 @@ private: "on several multi-band images." ); - SetDocName( "Band Math" ); SetDocLongDescription( "This application performs a mathematical operation on several multi-band " diff --git a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx index bc8e637b439c853caf65811905376ed8db56cdd7..14a1bd82103379fe3caa6be0bf2f238c363ca36b 100644 --- a/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx +++ b/Modules/Applications/AppMathParserX/app/otbBandMathX.cxx @@ -61,7 +61,6 @@ private: SetDescription("This application performs mathematical operations on several multiband images."); - SetDocName( "Band Math X" ); SetDocLongDescription( "This application performs a mathematical operation on several multi-band " diff --git a/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx b/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx index 72321beef4cfaecff619ea589e2e894d42d6463d..47a68fbdd17d2dd0eda919200f188fcf4007cf74 100644 --- a/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx +++ b/Modules/Applications/AppMoments/app/otbLocalStatisticExtraction.cxx @@ -59,7 +59,6 @@ SetName("LocalStatisticExtraction"); SetDescription("Computes local statistical moments on every pixel in the selected channel of the input image"); // Documentation -SetDocName("Local Statistic Extraction"); SetDocLongDescription("This application computes the 4 local statistical moments on every pixel in the selected channel of the input image, over a specified neighborhood. The output image is multi band with one statistical moment (feature) per band. Thus, the 4 output features are the Mean, the Variance, the Skewness and the Kurtosis. They are provided in this exact order in the output image."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx b/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx index 1394c94c5cb8d469c5a556a74f6eddc5e694fafe..91c7b8812a12692e42d87b1b8e3ec995a77a12cc 100644 --- a/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx +++ b/Modules/Applications/AppMorphology/app/otbBinaryMorphologicalOperation.cxx @@ -78,7 +78,6 @@ SetName( "BinaryMorphologicalOperation" ); SetDescription( "Performs morphological operations on an input image channel" ); // Documentation -SetDocName( "Binary Morphological Operation" ); SetDocLongDescription( "This application performs binary morphological " "operations on a mono band image or a channel of the input." ); SetDocLimitations( "None" ); diff --git a/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx b/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx index 315e94d3a2f47f655747e19b9f484fe16f182ede..4eab7d07270357beca147ed5359f11a48b89af08 100644 --- a/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx +++ b/Modules/Applications/AppMorphology/app/otbGrayScaleMorphologicalOperation.cxx @@ -77,7 +77,6 @@ SetName("GrayScaleMorphologicalOperation"); SetDescription("Performs morphological operations on a grayscale input image"); // Documentation -SetDocName("Grayscale Morphological Operation"); SetDocLongDescription("This application performs grayscale morphological operations on a mono band image"); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppMorphology/app/otbMorphologicalClassification.cxx b/Modules/Applications/AppMorphology/app/otbMorphologicalClassification.cxx index 2d594e24f68d9b0a5330a690e6f30be392201bb5..c3445b89a71de75166c0c613ed026b25464b06be 100644 --- a/Modules/Applications/AppMorphology/app/otbMorphologicalClassification.cxx +++ b/Modules/Applications/AppMorphology/app/otbMorphologicalClassification.cxx @@ -77,7 +77,6 @@ private: "classification on an input image channel" ); // Documentation - SetDocName( "Morphological Classification" ); SetDocLongDescription( "This algorithm is based on the following publication:\n" "Martino Pesaresi and Jon Alti Benediktsson, Member, IEEE: A new approach " diff --git a/Modules/Applications/AppMorphology/app/otbMorphologicalMultiScaleDecomposition.cxx b/Modules/Applications/AppMorphology/app/otbMorphologicalMultiScaleDecomposition.cxx index ab27887c6c79d0041ea9340b113c2068b577a41a..0cb3c61216990e5499c5d1911079e2701576302c 100644 --- a/Modules/Applications/AppMorphology/app/otbMorphologicalMultiScaleDecomposition.cxx +++ b/Modules/Applications/AppMorphology/app/otbMorphologicalMultiScaleDecomposition.cxx @@ -71,7 +71,6 @@ private: SetDescription( "Perform a geodesic morphology based image analysis on an input image channel" ); // Documentation - SetDocName( "Morphological Multi Scale Decomposition" ); SetDocLongDescription( "This application recursively apply geodesic decomposition. \n" "\n" diff --git a/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx b/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx index 09593c093fc49d11a332b5be6c5a08ecf382979e..75b4e6f3b71a83a1682783b018bf4ac238f3b91b 100644 --- a/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx +++ b/Modules/Applications/AppMorphology/app/otbMorphologicalProfilesAnalysis.cxx @@ -77,7 +77,6 @@ private: SetDescription( "Performs morphological profiles analysis on an input image channel." ); // Documentation - SetDocName( "Morphological Profiles Analysis" ); SetDocLongDescription( "This algorithm is derived from the following publication:\n\n" "Martino Pesaresi and Jon Alti Benediktsson, Member, IEEE: A new approach\n" diff --git a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx index c0402d091a4d64e9485065930b7596106429943f..d66576cd568b9dcc18438687129ae08d5fb86e7b 100644 --- a/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx +++ b/Modules/Applications/AppOpticalCalibration/app/otbOpticalCalibration.cxx @@ -130,7 +130,6 @@ private: SetName("OpticalCalibration"); SetDescription("Perform optical calibration TOA/TOC (Top Of Atmosphere/Top Of Canopy). Supported sensors: QuickBird, Ikonos, WorldView2, Formosat, Spot5, Pleiades, Spot6, Spot7. For other sensors the application also allows providing calibration parameters manually."); // Documentation - SetDocName("Optical calibration"); SetDocLongDescription("The application allows converting pixel values from DN (for Digital Numbers) to reflectance. Calibrated values are called surface reflectivity and its values lie in the range [0, 1].\nThe first level is called Top Of Atmosphere (TOA) reflectivity. It takes into account the sensor gain, sensor spectral response and the solar illuminations.\nThe second level is called Top Of Canopy (TOC) reflectivity. In addition to sensor gain and solar illuminations, it takes into account the optical thickness of the atmosphere, the atmospheric pressure, the water vapor amount, the ozone amount, as well as the composition and amount of aerosol gasses.\nIt is also possible to indicate an AERONET file which contains atmospheric parameters (version 1 and version 2 of Aeronet file are supported. Note that computing TOC reflectivity will internally compute first TOA and then TOC reflectance. \n" "\n--------------------------\n\n" "If the sensor is not supported by the metadata interface factory of OTB, users still have the possibility to give the needed parameters to the application.\n" diff --git a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx index db538aa77dbc7c360f0eb2a3c5ffbab8970a6389..0b0ca946653f9fd3d0f32f3eff4f9d1cb13818ef 100644 --- a/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx +++ b/Modules/Applications/AppProjection/app/otbConvertCartoToGeoPoint.cxx @@ -56,7 +56,6 @@ private: SetDescription("Convert cartographic coordinates to geographic ones."); // Documentation - SetDocName("Cartographic to geographic coordinates conversion"); SetDocLongDescription("This application computes the geographic coordinates from cartographic ones. User has to give the X and Y coordinate and the cartographic projection (see mapproj parameter for details)."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx index ea25a40717678ad2e1e41118f7dca88e47cfd066..c006fb7e65fc79dc404521c84cabe1f65f2a0d0c 100644 --- a/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx +++ b/Modules/Applications/AppProjection/app/otbConvertSensorToGeoPoint.cxx @@ -55,7 +55,6 @@ private: SetDescription("Sensor to geographic coordinates conversion."); // Documentation - SetDocName("Convert Sensor Point To Geographic Point"); SetDocLongDescription("This Application converts a sensor point of an input image to a geographic point using the Forward Sensor Model of the input image."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx index e604e8e4b656317f9c8eb2d2233aefe4b5e54e6b..c9236fcfe9afdb9cbfaeab72e9bf3f138ea63156 100644 --- a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx +++ b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx @@ -62,7 +62,6 @@ private: SetName("GenerateRPCSensorModel"); SetDescription("Generate a RPC sensor model from a list of Ground Control Points."); - SetDocName("Generate a RPC sensor model"); SetDocLongDescription( "This application generates a RPC sensor model from a list of Ground Control Points. " "At least 20 points are required for estimation without elevation support, " "and 40 points for estimation with elevation support. " diff --git a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx index c45174fc58cb43299d88698d213594fb60572465..3e2d3c361c11570cf22c45720e1f373247049b63 100644 --- a/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx +++ b/Modules/Applications/AppProjection/app/otbGridBasedImageResampling.cxx @@ -109,7 +109,6 @@ private: SetName("GridBasedImageResampling"); SetDescription("Resamples an image according to a resampling grid"); - SetDocName("Grid Based Image Resampling"); SetDocLongDescription("This application allows performing image resampling from an input resampling grid."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppProjection/app/otbImageEnvelope.cxx b/Modules/Applications/AppProjection/app/otbImageEnvelope.cxx index 25c4c3de7c7e69e3a267160bc4ff184957bb64f2..f2819ed660bf8cb0ad959ad4753888add3baf1a3 100644 --- a/Modules/Applications/AppProjection/app/otbImageEnvelope.cxx +++ b/Modules/Applications/AppProjection/app/otbImageEnvelope.cxx @@ -55,7 +55,6 @@ private: SetDescription("Extracts an image envelope."); // Documentation - SetDocName("Image Envelope"); SetDocLongDescription("Build a vector data containing the image envelope polygon. " "Useful for some projection, you can set the polygon with more points with the sr parameter. " "This filter supports user-specified output projection. " diff --git a/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx b/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx index ef6731f85ed389ad8716ee5754a0583b661f091e..a9fc3023c63aa9e05cfdb3b0706bf52ab6ef2df3 100644 --- a/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx +++ b/Modules/Applications/AppProjection/app/otbObtainUTMZoneFromGeoPoint.cxx @@ -57,7 +57,6 @@ private: SetDescription("UTM zone determination from a geographic point."); // Documentation - SetDocName("Obtain UTM Zone From Geo Point"); SetDocLongDescription("This application returns the UTM zone of an input geographic point."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx index 38dc2342c11f4c599119df33b9d6621270a94c2d..00ff808f757c435506d87da2de4395a109030085 100644 --- a/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx +++ b/Modules/Applications/AppProjection/app/otbOrthoRectification.cxx @@ -91,7 +91,6 @@ private: { SetName("OrthoRectification"); SetDescription("This application allows ortho-rectifying optical and radar images from supported sensors."); - SetDocName("Ortho-rectification"); std::ostringstream oss; oss<<"This application uses inverse sensor modelling combined with a choice of interpolation functions to resample a sensor geometry image into a ground geometry regular grid. "; oss<<"The ground geometry regular grid is defined with respect to a map projection (see map parameter). The application offers several modes to estimate the output grid parameters (origin and ground sampling distance), including automatic estimation of image size, ground sampling distance, or both, from image metadata, user-defined ROI corners, or another ortho-image."; diff --git a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx index 6c1346b288e1423a6bd5e2748c0bff2606c57195..f007315bfebd9bdc67fc1c7cced6dff972beb3bf 100644 --- a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx +++ b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx @@ -61,7 +61,6 @@ private: SetName("RefineSensorModel"); SetDescription("Perform least-square fit of a sensor model to a set of tie points"); - SetDocName("Refine Sensor Model"); SetDocLongDescription("This application reads a geom file containing a sensor model and a text file containing a list of ground control point, and performs a least-square fit of the sensor model adjustable parameters to these tie points. It produces an updated geom file as output, as well as an optional ground control points based statistics file and a vector file containing residues. The output geom file can then be used to ortho-rectify the data more accurately. Plaease note that for a proper use of the application, elevation must be correctly set (including DEM and geoid file). The map parameters allows one to choose a map projection in which the accuracy will be estimated in meters."); AddDocTag(Tags::Geometry); diff --git a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx index 5b623ad42bc2fa358730407d8f7c96860c7f08c2..675cd6e8d74f973e1760c11f226de6c92c446c77 100644 --- a/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx +++ b/Modules/Applications/AppProjection/app/otbRigidTransformResample.cxx @@ -85,7 +85,6 @@ private: SetName("RigidTransformResample"); SetDescription("Resample an image with a rigid transform"); // Documentation - SetDocName("Image resampling with a rigid transform"); SetDocLongDescription("This application performs a parametric transform on the input image. Scaling, translation and rotation with scaling factor are handled." " Parameters of the transform is expressed in physical units, thus particular attention must be paid on pixel size (value, and sign). Moreover transform is expressed from input space to output space (on the contrary ITK Transforms are expressed form output space to input space). "); SetDocLimitations("None"); diff --git a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx index d59f5334c1e40312a3e1e73bb36abe43f463c2f0..c954f36793b38508f1d18b0c3d8cdb4624c1b182 100644 --- a/Modules/Applications/AppProjection/app/otbSuperimpose.cxx +++ b/Modules/Applications/AppProjection/app/otbSuperimpose.cxx @@ -87,7 +87,6 @@ private: SetDescription("Using available image metadata, project one image onto another one"); // Documentation - SetDocName("Superimpose sensor"); SetDocLongDescription("This application performs the projection of an image into the geometry of another one."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx index 3c557a224ecb91d10a25fc09db45b6b1635721f1..e204055b2a4c1385b0ca5d02d039a8a7f190013a 100644 --- a/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx +++ b/Modules/Applications/AppProjection/app/otbVectorDataReprojection.cxx @@ -64,7 +64,6 @@ private: { SetName("VectorDataReprojection"); SetDescription("Reproject a vector data using support image projection reference, or a user specified map projection"); - SetDocName("Vector Data reprojection"); SetDocLongDescription( "Reproject vector data using a support image as projection reference or to a user given map projection. " diff --git a/Modules/Applications/AppSARCalibration/app/otbSARBurstExtraction.cxx b/Modules/Applications/AppSARCalibration/app/otbSARBurstExtraction.cxx index 0d92ecb931893ca466310b71dbf9ed19421a2df4..f5d70923252edc6b52d76eb8a4a6dd9084497912 100644 --- a/Modules/Applications/AppSARCalibration/app/otbSARBurstExtraction.cxx +++ b/Modules/Applications/AppSARCalibration/app/otbSARBurstExtraction.cxx @@ -50,7 +50,6 @@ private: SetDescription("This application performs a burst extraction by keeping only lines and samples of a required burst."); // Documentation - SetDocName("SAR Burst Extraction"); SetDocLongDescription("Sentinel1 IW SLC products are composed of several burst overlapping in" " azimuth time for each subswath, separated by black lines [1]. The burst" " extraction consist in extracting a single burst, by selecting only lines" diff --git a/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx b/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx index 142b0108c1002f691899dc7fa6b52cea1c1438de..c60b8f0d34f4bf89a375b2d0dbfeb963f13a0c18 100644 --- a/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx +++ b/Modules/Applications/AppSARCalibration/app/otbSARCalibration.cxx @@ -51,7 +51,6 @@ private: SetDescription("Perform radiometric calibration of SAR images. Following sensors are supported: TerraSAR-X, Sentinel1 and Radarsat-2.Both Single Look Complex(SLC) and detected products are supported as input."); // Documentation - SetDocName("SAR Radiometric calibration"); SetDocLongDescription("The objective of SAR calibration is to provide imagery in which the pixel values can be directly related to the radar backscatter of the scene. This application allows computing Sigma Naught (Radiometric Calibration) for TerraSAR-X, Sentinel1 L1 and Radarsat-2 sensors. Metadata are automatically retrieved from image products.The application supports complex and non-complex images (SLC or detected products)."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx b/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx index 95723672549f402ee1e83cb0e899e82bbe3d0566..cb0682774d691945f9256c03b92d48fe415140bb 100644 --- a/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx +++ b/Modules/Applications/AppSARCalibration/app/otbSARConcatenateBursts.cxx @@ -58,7 +58,6 @@ private: SetDescription("Concatenate a list of Bursts to provide a whole SAR Deburst Image."); // Documentation - SetDocName("SAR Concatenate Bursts"); SetDocLongDescription("This application performs a burst concatenation and provides a SAR Deburst Image. " "It reads the input image list (single bursts) " "and generates a whole SAR image with deburst operations."); diff --git a/Modules/Applications/AppSARCalibration/app/otbSARDeburst.cxx b/Modules/Applications/AppSARCalibration/app/otbSARDeburst.cxx index d69219edbfa32193f438f76f84584d81ac69a49b..3211f8ff6955e3fa588a70857c77c8223936a0cc 100644 --- a/Modules/Applications/AppSARCalibration/app/otbSARDeburst.cxx +++ b/Modules/Applications/AppSARCalibration/app/otbSARDeburst.cxx @@ -50,7 +50,6 @@ private: SetDescription("This application performs deburst of Sentinel1 IW SLC images by removing redundant lines."); // Documentation - SetDocName("SAR Deburst"); SetDocLongDescription("Sentinel1 IW SLC products are composed of several burst overlapping in" " azimuth time for each subswath, separated by black lines [1]. The deburst" " operation consist in generating a continuous image in terms of azimuth" diff --git a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx index b96d2e70c3835825f99f19339de19ce23838a7a4..9098a0506a5dab146f66c28e3ce9fc7c19992aff 100644 --- a/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx +++ b/Modules/Applications/AppSARDecompositions/app/otbSARDecompositions.cxx @@ -81,7 +81,6 @@ private: SetDescription("From one-band complex images (each one related to an element of the Sinclair matrix), returns the selected decomposition."); // Documentation - SetDocName("SARDecompositions"); SetDocLongDescription( "From one-band complex images (HH, HV, VH, VV), returns the selected decomposition.\n \n" "All the decompositions implemented are intended for the mono-static case (transmitter and receiver are co-located).\n" diff --git a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx index d167e27dc9306e933f0f2d96b051d1cc24155a3c..efc0bc96782d3c2c806bd197ce6a7056f944f8d6 100644 --- a/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx +++ b/Modules/Applications/AppSARPolarMatrixConvert/app/otbSARPolarMatrixConvert.cxx @@ -84,7 +84,6 @@ private: SetDescription("This applications allows converting classical polarimetric matrices to each other."); // Documentation - SetDocName("SARPolarMatrixConvert"); SetDocLongDescription( "This application allows converting classical polarimetric matrices to each other.\n" diff --git a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx index 77b43d10a6d1ae982f8e15f5d55bc2428afdddd7..c7a1acba00b03c27faad88705c03915eae7bcd88 100644 --- a/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx +++ b/Modules/Applications/AppSARPolarSynth/app/otbSARPolarSynth.cxx @@ -50,7 +50,6 @@ private: SetDescription("Gives, for each pixel, the power that would have been received by a SAR system with a basis different from the classical (H,V) one (polarimetric synthetis)."); // Documentation - SetDocName("SARPolarSynth"); SetDocLongDescription("This application gives, for each pixel, the power that would have been received by a SAR system with a basis different from the classical (H,V) one (polarimetric synthetis).\n" "The new basis A and B are indicated through two Jones vectors, defined by the user thanks to orientation (psi) and ellipticity (khi) parameters.\n" "These parameters are namely psii, khii, psir and khir. The suffixes (i) and (r) refer to the transmitting antenna and the receiving antenna respectively.\n" diff --git a/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx b/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx index acb86804eca8bebbacac12fbaf2bd58eb65d8c1f..fa6a5101d29e26efe3607fb9ba8d58d802a7a822 100644 --- a/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx +++ b/Modules/Applications/AppSARUtils/app/otbComputeModulusAndPhase.cxx @@ -61,7 +61,6 @@ private: SetName("ComputeModulusAndPhase"); SetDescription("This application computes the modulus and the phase of a complex SAR image or an image with 2 components (real and imaginary parts)."); - SetDocName("Compute Modulus and Phase"); SetDocLongDescription( "This application computes the modulus and the phase of a " "complex SAR image. The input should be a single band image with " diff --git a/Modules/Applications/AppSARUtils/app/otbDespeckle.cxx b/Modules/Applications/AppSARUtils/app/otbDespeckle.cxx index d91076666138dfe8973ed89227f99d8361909fcb..0d7a0f5ccfb32bea7bbc67f24957cc180c7bc4ad 100644 --- a/Modules/Applications/AppSARUtils/app/otbDespeckle.cxx +++ b/Modules/Applications/AppSARUtils/app/otbDespeckle.cxx @@ -60,7 +60,6 @@ private: SetDescription("Perform speckle noise reduction on SAR image."); // Documentation - SetDocName("Despeckle"); SetDocLongDescription("SAR images are affected by speckle noise that inherently exists in and which" " degrades the image quality. It is caused by the coherent nature of" " back-scattered waves from multiple distributed targets. It is locally strong" diff --git a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx index 62f0a974dfb71279b554b0bdd040880d94bef05d..158ec83a55920368b0deb69bf4ada7df385247e9 100644 --- a/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbConnectedComponentSegmentation.cxx @@ -73,7 +73,6 @@ private: { SetName("ConnectedComponentSegmentation"); SetDescription("Connected component segmentation and object based image filtering of the input image according to user-defined criterions."); - SetDocName("Connected Component Segmentation"); SetDocLongDescription("This application allows one to perform a masking, connected components segmentation and object based image filtering. First and optionally, a mask can be built based on user-defined criterions to select pixels of the image which will be segmented. Then a connected component segmentation is performed with a user defined criterion to decide whether two neighbouring pixels belong to the same segment or not. After this segmentation step, an object based image filtering is applied using another user-defined criterion reasoning on segment properties, like shape or radiometric attributes. " "Criterions are mathematical expressions analysed by the MuParser library (http://muparser.sourceforge.net/). For instance, expression \"((b1>80) and intensity>95)\" will merge two neighbouring pixel in a single segment if their intensity is more than 95 and their value in the first image band is more than 80. See parameters documentation for a list of available attributes. The output of the object based image filtering is vectorized and can be written in shapefile or KML format. If the input image is in raw geometry, resulting polygons will be transformed to WGS84 using sensor modelling before writing, to ensure consistency with GIS software. For this purpose, a Digital Elevation Model can be provided to the application. The whole processing is done on a per-tile basis for large images, so this application can handle images of arbitrary size."); SetDocLimitations("Due to the tiling scheme in case of large images, some segments can be arbitrarily split across multiple tiles."); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx index dcc25d7101c02f9a879009032c1640d2a03f8c11..1025607255651a56aab73d5d1208bf6f3456310e 100644 --- a/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbHooverCompareSegmentation.cxx @@ -133,7 +133,6 @@ private: SetDescription("Compare two segmentations with Hoover metrics"); // Documentation - SetDocName("Hoover compare segmentation"); SetDocLongDescription("This application compares a machine segmentation (MS) with a partial " "ground truth segmentation (GT). The Hoover metrics are used to estimate " "scores for correct detection, over-segmentation, under-segmentation and " diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSSegmentation.cxx index 478acd849d7d895ee6f6b84026d1b400444de1a6..bf5c40c7b1d46fd11b14dec19e00ea29b00fbe21 100644 --- a/Modules/Applications/AppSegmentation/app/otbLSMSSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLSMSSegmentation.cxx @@ -220,7 +220,6 @@ private: SetName("LSMSSegmentation"); SetDescription("This application performs the second step of the exact Large-Scale Mean-Shift segmentation workflow (LSMS) [1]."); - SetDocName("Exact Large-Scale Mean-Shift segmentation, step 2"); SetDocLongDescription("This application will produce a labeled image where neighbor pixels" " whose range distance is below range radius (and optionally spatial" " distance below spatial radius) will be grouped together into the same" diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx index b0bffe8fc8b992df8f9a7edca0f52c3932ee746c..6f8f839953e039d408f676a8f7c70231db5ec3ba 100644 --- a/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLSMSSmallRegionsMerging.cxx @@ -78,7 +78,6 @@ private: SetName("LSMSSmallRegionsMerging"); SetDescription("This application performs the third (optional) step of the exact Large-Scale Mean-Shift segmentation workflow [1]."); - SetDocName("Exact Large-Scale Mean-Shift segmentation, step 3 (optional)"); SetDocLongDescription("Given a segmentation result (can be the out output parameter of the" " LSMSSegmentation application [2]) and the original image, it will" " merge segments whose size in pixels is lower than minsize parameter" @@ -97,12 +96,14 @@ private: " application is not compatible with in-memory connection since it does" " its own internal streaming."); SetDocAuthors("David Youssefi"); - SetDocSeeAlso( "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable" - " mean-shift algorithm and its application to the segmentation of" - " arbitrarily large remote sensing images. IEEE Transactions on" - " Geoscience and Remote Sensing, 53(2), 952-964.\n" - "[2] LSMSegmentation\n" - "[3] LSMSVectorization"); + SetDocSeeAlso( + "Alternative: SmallRegionsMerging\n" + "[1] Michel, J., Youssefi, D., & Grizonnet, M. (2015). Stable" + " mean-shift algorithm and its application to the segmentation of" + " arbitrarily large remote sensing images. IEEE Transactions on" + " Geoscience and Remote Sensing, 53(2), 952-964.\n" + "[2] LSMSSegmentation\n" + "[3] LSMSVectorization"); AddDocTag(Tags::Segmentation); AddDocTag(Tags::Deprecated); AddDocTag("LSMS"); diff --git a/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx b/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx index ef9446185b575167612854e59047d463e24401bf..467a0d8a0510821701ba4b8298fad4d8c0cb6261 100644 --- a/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLSMSVectorization.cxx @@ -71,7 +71,6 @@ private: SetName("LSMSVectorization"); SetDescription("This application performs the fourth step of the exact Large-Scale Mean-Shift segmentation workflow [1]."); - SetDocName("Exact Large-Scale Mean-Shift segmentation, step 4"); SetDocLongDescription("Given a segmentation result (label image), that may come from the" " LSMSSegmentation [2] application (out parameter) or have been" " processed for small regions merging [3] (out parameter), it will" diff --git a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx index bc414d0f2081c4d6d9a7951ea079b24318838cea..67ec7cbb0e3e354b8f4ac6251d27d51a9f2c73f2 100644 --- a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx @@ -56,7 +56,6 @@ private: SetDescription("Large-scale segmentation using MeanShift"); // Documentation - SetDocName("Large-Scale MeanShift"); SetDocLongDescription("This application chains together the 4 steps of the " "MeanShit framework, that is the MeanShiftSmoothing, the " "LSMSSegmentation, the LSMSSmallRegionsMerging and the " diff --git a/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx b/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx index 9923e70c55232e92372da8f407917de4d7bcb68d..1965b856068822cc5948dc7af3dab815a1b0cdc6 100644 --- a/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx +++ b/Modules/Applications/AppSegmentation/app/otbMeanShiftSmoothing.cxx @@ -52,7 +52,6 @@ private: SetDescription("This application smooths an image using the MeanShift algorithm."); // Documentation - SetDocName("MeanShift Smoothing"); SetDocLongDescription("MeanShift [1,2,3] is an iterative edge-preserving image smoothing" " algorithm often used in image processing and as a first step for" " image segmentation. The MeanShift algorithm can be applied to" diff --git a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx index b850bbed7fb450e1e3dc96878fba33c6bb0061f9..ceb97c4c08649d3eeb14127b7298f92dd35c3648 100644 --- a/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx +++ b/Modules/Applications/AppSegmentation/app/otbSegmentation.cxx @@ -144,7 +144,6 @@ private: SetDescription("Performs segmentation of an image, and output either a raster or a vector file. In vector mode, large input datasets are supported."); // Documentation - SetDocName("Segmentation"); SetDocLongDescription( "This application allows one to perform various segmentation algorithms on a multispectral image." " Available segmentation algorithms are two different versions of Mean-Shift segmentation algorithm (one being multi-threaded)," diff --git a/Modules/Applications/AppSegmentation/app/otbSmallRegionsMerging.cxx b/Modules/Applications/AppSegmentation/app/otbSmallRegionsMerging.cxx index 84d3e8a5e183f7d58f5fde39a636398cf9b1af85..6288293e79c1c8a433c06f722abc63492781c247 100644 --- a/Modules/Applications/AppSegmentation/app/otbSmallRegionsMerging.cxx +++ b/Modules/Applications/AppSegmentation/app/otbSmallRegionsMerging.cxx @@ -65,7 +65,6 @@ private: SetDescription("This application merges small regions of a segmentation " "result."); - SetDocName("Small Region Merging"); SetDocLongDescription("Given a segmentation result and the original image," " it will merge segments whose size in pixels is" " lower than minsize parameter with the adjacent" diff --git a/Modules/Applications/AppStereo/app/otbBlockMatching.cxx b/Modules/Applications/AppStereo/app/otbBlockMatching.cxx index e7a93159fdf9a88a2476f746b91f10a6afb860f6..2fac42ef3b6a584e135d335075c144018a9a937f 100644 --- a/Modules/Applications/AppStereo/app/otbBlockMatching.cxx +++ b/Modules/Applications/AppStereo/app/otbBlockMatching.cxx @@ -130,7 +130,6 @@ private: SetDescription("Performs block-matching to estimate pixel-wise disparities" " between two images."); - SetDocName("Pixel-wise Block-Matching"); SetDocLongDescription( "This application allows one to performs " "block-matching to estimate pixel-wise disparities for a pair of images " diff --git a/Modules/Applications/AppStereo/app/otbDisparityMapToElevationMap.cxx b/Modules/Applications/AppStereo/app/otbDisparityMapToElevationMap.cxx index 4aebc52cb849747385936daedef6d902b54e61a2..04ec3d28567cb049daa3c4b13ec833d803ef2220 100644 --- a/Modules/Applications/AppStereo/app/otbDisparityMapToElevationMap.cxx +++ b/Modules/Applications/AppStereo/app/otbDisparityMapToElevationMap.cxx @@ -67,7 +67,6 @@ private: SetName("DisparityMapToElevationMap"); SetDescription("Projects a disparity map into a regular elevation map."); - SetDocName("Disparity map to elevation map"); SetDocLongDescription( "This application uses a disparity map computed from " "a stereo image pair to produce an elevation map on the ground area " diff --git a/Modules/Applications/AppStereo/app/otbFineRegistration.cxx b/Modules/Applications/AppStereo/app/otbFineRegistration.cxx index 44f36e296555f1f61c7dbcf2fa72f1682e80ae5b..83d98a2b64fc5ba10dad13540e744b156b2cfe1f 100644 --- a/Modules/Applications/AppStereo/app/otbFineRegistration.cxx +++ b/Modules/Applications/AppStereo/app/otbFineRegistration.cxx @@ -118,7 +118,6 @@ private: SetName("FineRegistration"); SetDescription("Estimate disparity map between two images."); - SetDocName("Fine Registration"); SetDocLongDescription("This application computes a disparity map between " "two images that correspond to the same scene. It is intended for case " "where small misregistration between images should be estimated and fixed" diff --git a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx index 80e7b38d0f506a40649adb5b6019fa4265bf60e3..25e5d01dc1111409d4aee1e0d14df18a4ce70278 100644 --- a/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx +++ b/Modules/Applications/AppStereo/app/otbGeneratePlyFile.cxx @@ -57,7 +57,6 @@ private: SetName("GeneratePlyFile"); SetDescription("Generate a 3D Ply file from a DEM and a color image."); - SetDocName("Ply 3D files generation"); SetDocLongDescription("The application converts an image containing " "elevations into a PLY file, which is a file format to store 3D models. " "This format is adpated for visualization on software such as MeshLab [2]" diff --git a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx index 55e9972f6764f3f3502ddfa70e5482c265e6dc23..4302458f1671e7a639e985762a41b472c20efb97 100644 --- a/Modules/Applications/AppStereo/app/otbStereoFramework.cxx +++ b/Modules/Applications/AppStereo/app/otbStereoFramework.cxx @@ -317,7 +317,6 @@ private: SetName("StereoFramework"); SetDescription("Compute the ground elevation based on one or multiple stereo pair(s)"); - SetDocName("Stereo Framework"); SetDocLongDescription( "Compute the ground elevation with a stereo block matching algorithm " "between one or multiple stereo pair in sensor geometry. The output is " diff --git a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx index a613d6d53a7a9e243a3b5d00815344a4d7a516e1..5e6eee5bc6bdf2f5d73aaa1852edb187254a726d 100644 --- a/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx +++ b/Modules/Applications/AppStereo/app/otbStereoRectificationGridGenerator.cxx @@ -105,7 +105,6 @@ private: SetDescription("Generates two deformation fields to resample in epipolar " "geometry, a pair of stereo images up to the sensor model precision"); - SetDocName("Stereo-rectification deformation grid generator"); SetDocLongDescription( "This application generates a pair of deformation " "grid to stereo-rectify a pair of stereo images according to sensor " diff --git a/Modules/Applications/AppTest/app/otbTestApplication.cxx b/Modules/Applications/AppTest/app/otbTestApplication.cxx index 60fff26221848c208c765326036987f3b32f37d6..53ca3223a803f44c532b64101a0bff77ed26fde7 100644 --- a/Modules/Applications/AppTest/app/otbTestApplication.cxx +++ b/Modules/Applications/AppTest/app/otbTestApplication.cxx @@ -47,7 +47,6 @@ private: SetName("TestApplication"); SetDescription("This application helps developers to test parameters types"); - SetDocName("Test"); SetDocLongDescription("The purpose of this application is to test parameters types."); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx b/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx index 4b00e122696f80b729e54861d4906fb9b36e515c..c7756a084771e884ab968d56a7398ad170bf847b 100644 --- a/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx +++ b/Modules/Applications/AppTest/test/otbWrapperApplicationDocTests.cxx @@ -105,7 +105,6 @@ int otbWrapperApplicationDocTest(int argc, char* argv[]) // Check doc element... DocElement name("Name",app->GetName()); - DocElement docName("Doc Name",app->GetDocName()); DocElement description("Description",app->GetDescription()); DocElement longDescription("Long description",app->GetDocLongDescription()); DocElement authors("DocAuthors",app->GetDocAuthors()); @@ -115,9 +114,6 @@ int otbWrapperApplicationDocTest(int argc, char* argv[]) isOK = CheckNonEmpty(name) && isOK; isOK = CheckNoNewline(name) && isOK; - isOK = CheckNonEmpty(docName) && isOK; - isOK = CheckNoNewline(docName) && isOK; - isOK = CheckNonEmpty(description) && isOK; isOK = CheckNonEmpty(longDescription) && isOK; diff --git a/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx b/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx index 82fc9982b074b77cb9576ad42ab2f7451eed44d0..b4985ae6412f171c2abf15c3eee4357bdc0d10dc 100644 --- a/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx +++ b/Modules/Applications/AppTextures/app/otbHaralickTextureExtraction.cxx @@ -73,7 +73,6 @@ SetName("HaralickTextureExtraction"); SetDescription("Computes Haralick textural features on the selected channel of the input image"); // Documentation -SetDocName("Haralick Texture Extraction"); SetDocLongDescription( "This application computes three sets of Haralick features [1][2].\n\n" diff --git a/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx b/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx index b94831841f69dbf0dae4d1f9971fdf01426e8248..2fb1064e57fc12e88ddc872657b53e21bee1c16b 100644 --- a/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx +++ b/Modules/Applications/AppTextures/app/otbSFSTextureExtraction.cxx @@ -63,7 +63,6 @@ SetDescription("Computes Structural Feature Set textures on every pixel of the " "input image selected channel"); // Documentation -SetDocName("SFS Texture Extraction"); SetDocLongDescription("Structural Feature Set [1] are based on the histograms of " "the pixels in multiple directions of the image. The SFSTextureExtraction application " "computes the 6 following features: SFS'Length, SFS'Width, SFS'PSI, SFS'W-Mean, " diff --git a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx index 8a4936fdc9c699917e6e831f2559135c8da52ab6..1a6754a8b7945786d1561d81589cf9519e187719 100644 --- a/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx +++ b/Modules/Applications/AppVectorDataTranslation/app/otbRasterization.cxx @@ -65,7 +65,6 @@ private: SetName("Rasterization"); SetDescription("Reproject and rasterize a vector dataset"); - SetDocName("Rasterization"); SetDocLongDescription( "Reproject and rasterize a vector dataset. The grid of the rasterized output can be set by using a reference image, or by " "setting all parmeters (origin, size, spacing) by hand. In the latter case, at least the spacing (ground sampling distance) is needed (other " diff --git a/Modules/Applications/AppVectorUtils/app/otbConcatenateVectorData.cxx b/Modules/Applications/AppVectorUtils/app/otbConcatenateVectorData.cxx index baab41dcc8477c89bdbabd8791bae14c99c74b31..6c036765faef3781311af00f3069a065b3cd3d59 100644 --- a/Modules/Applications/AppVectorUtils/app/otbConcatenateVectorData.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbConcatenateVectorData.cxx @@ -52,7 +52,6 @@ private: SetName("ConcatenateVectorData"); SetDescription("Concatenate vector data files"); - SetDocName("Concatenate Vector Data"); SetDocLongDescription("This application concatenates a list of vector data " "files to produce a unique vector data output file.\n\n" "This application will gather all the geometries from the input files and" diff --git a/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx b/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx index 888bce06d9831bfc7049158393b83cf51d1577d5..06225729683969509059c44f9a894ef897f70744 100644 --- a/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbOSMDownloader.cxx @@ -55,7 +55,6 @@ private: SetName("OSMDownloader"); SetDescription("Download vector data from OSM and store it to file"); // Documentation - SetDocName("Open Street Map layers import"); SetDocLongDescription("The application connects to Open Street Map server" ", downloads the data corresponding to the spatial extent of the support" " image, and filters the geometries based on OSM tags to produce a vector" diff --git a/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx b/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx index 9e819877252ad25aba10490d384e0374cefcc332..10e208ae1e19d4a2835346d8f239325ce70d22f7 100644 --- a/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbVectorDataExtractROI.cxx @@ -70,7 +70,6 @@ private: SetName("VectorDataExtractROI"); SetDescription("Perform an extract ROI on the input vector data according to the input image extent"); - SetDocName("VectorData Extract ROI"); SetDocLongDescription("This application extracts the vector data features" " belonging to a region specified by the support " "image envelope. Any features intersecting the " diff --git a/Modules/Applications/AppVectorUtils/app/otbVectorDataSetField.cxx b/Modules/Applications/AppVectorUtils/app/otbVectorDataSetField.cxx index e7cee12768682a0508aed4d099d81237827675a2..003f1ca207a7bef6ecbc343e08ff312184122921 100644 --- a/Modules/Applications/AppVectorUtils/app/otbVectorDataSetField.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbVectorDataSetField.cxx @@ -49,7 +49,6 @@ private: SetDescription("Set a field in vector data."); // Documentation - SetDocName("Vector data set field"); SetDocLongDescription("Set a specified field to a specified value on all features of a vector data."); SetDocLimitations("Doesn't work with KML files yet"); SetDocAuthors("OTB-Team"); diff --git a/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx b/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx index 14e56aa2a5cf139a670bd60a0c20e4f88e9ef0cc..f607a8adcd9d090729e27b93b4894fad4d5693e0 100644 --- a/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx +++ b/Modules/Applications/AppVectorUtils/app/otbVectorDataTransform.cxx @@ -59,7 +59,6 @@ private: SetName("VectorDataTransform"); SetDescription("Apply a transform to each vertex of the input VectorData"); - SetDocName("Vector Data Transformation"); SetDocLongDescription("This application iterates over each vertex in the " "input vector data file and performs a transformation on this vertex.\n\n" "It is the equivalent of [1] that transforms images. For instance, if you" diff --git a/Modules/Core/LabelMap/test/CMakeLists.txt b/Modules/Core/LabelMap/test/CMakeLists.txt index 068325e08e42cce455f0d61cd27a8d1764ede388..be4639ecdd26f58a333f08f6164bb8c54c8b4992 100644 --- a/Modules/Core/LabelMap/test/CMakeLists.txt +++ b/Modules/Core/LabelMap/test/CMakeLists.txt @@ -41,8 +41,8 @@ otb_module_target_label(otbLabelMapTestDriver) otb_add_test(NAME obTvLabelObjectMapVectorizer COMMAND otbLabelMapTestDriver otbLabelObjectMapVectorizer - ${INPUTDATA}/rcc8_mire1.png - rcc8_mire1_label_vectorizer.gml) + ${INPUTDATA}/labelImage_UnsignedChar.tif + otbLabelObjectMapVectorizerOutput.gml) otb_add_test(NAME obTvLabelImageToLabelMapWithAdjacencyFilter COMMAND otbLabelMapTestDriver --compare-ascii ${NOTOL} @@ -64,13 +64,13 @@ otb_add_test(NAME obTvKMeansAttributesLabelMapFilter COMMAND otbLabelMapTestDriv ${TEMP}/obTvKMeansAttributesLabelMapFilter.txt) otb_add_test(NAME obTvLabelMapToSampleListFilter COMMAND otbLabelMapTestDriver otbLabelMapToSampleListFilter - ${OTB_DATA_ROOT}/Input/rcc8_mire1.png + ${OTB_DATA_ROOT}/Input/labelImage_UnsignedChar.tif SHAPE::Flusser01 SHAPE::Flusser02 SHAPE::Flusser03 SHAPE::Flusser04 SHAPE::Flusser05 SHAPE::Flusser06 SHAPE::Flusser07 SHAPE::Flusser08 SHAPE::Flusser09 SHAPE::Flusser10 SHAPE::Flusser11) otb_add_test(NAME obTvLabelMapWithClassLabelToLabeledSampleListFilter COMMAND otbLabelMapTestDriver otbLabelMapWithClassLabelToLabeledSampleListFilter - ${OTB_DATA_ROOT}/Input/rcc8_mire1.png + ${OTB_DATA_ROOT}/Input/labelImage_UnsignedChar.tif SHAPE::Flusser01 SHAPE::Flusser02 SHAPE::Flusser03 SHAPE::Flusser04 SHAPE::Flusser05 SHAPE::Flusser06 SHAPE::Flusser07 SHAPE::Flusser08 SHAPE::Flusser09 SHAPE::Flusser10 SHAPE::Flusser11) diff --git a/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx b/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx index 695a24f06d7db8c3dc9d71871ab38b78d4d9f525..31d6b9a066c0e57d9f111e7173699d4d0bd146b6 100644 --- a/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx +++ b/Modules/Core/LabelMap/test/otbLabelMapWithClassLabelToLabeledSampleListFilter.cxx @@ -62,7 +62,7 @@ int otbLabelMapWithClassLabelToLabeledSampleListFilter(int argc, char* argv[]) LabelMapFilterType::Pointer labelMapFilter = LabelMapFilterType::New(); labelMapFilter->SetInput(lreader->GetOutput()); - labelMapFilter->SetInputForegroundValue(255); + labelMapFilter->SetInputForegroundValue(1); ShapeLabelMapFilterType::Pointer shapeLabelMapFilter = ShapeLabelMapFilterType::New(); shapeLabelMapFilter->SetInput(labelMapFilter->GetOutput()); diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h b/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h deleted file mode 100644 index 4406a107fb9c43269b30bffa577d9e5a73de37c4..0000000000000000000000000000000000000000 --- a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.h +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDataNodeImageFunction_h -#define otbDataNodeImageFunction_h - -#include "otbDataNodeFunctionBase.h" -#include "otbDataNode.h" -#include "itkContinuousIndex.h" -#include "itkImageBase.h" - -namespace otb -{ -/** \class DataNodeImageFunction - * \brief TODO - * - * - * - * \ingroup Functions - * \sa NDVIDataNodeFeatureFunction - * - * \ingroup OTBVectorDataBase - */ - -template < -class TImage, -class TOutput, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT DataNodeImageFunction : - public DataNodeFunctionBase<DataNode<TCoordRep, - TImage::ImageDimension, - TPrecision>, - TOutput> -{ -public: - /** Dimension underlying input image. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TImage::ImageDimension); - - /** Standard class typedefs. */ - typedef DataNodeImageFunction Self; - typedef DataNodeFunctionBase<DataNode<TCoordRep, - itkGetStaticConstMacro(ImageDimension), - TPrecision>, - TOutput> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Run-time type information (and related methods). */ - itkTypeMacro(DataNodeImageFunction, DataNodeFunctionBase); - - /** Some typedefs. */ - typedef TImage InputImageType; - typedef typename InputImageType::PixelType InputPixelType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - - typedef TOutput OutputType; - - /** CoordRepType typedef support. */ - typedef TCoordRep CoordRepType; - - /** PrecisionType typedef support. */ - typedef TPrecision PrecisionType; - - /** Index Type. */ - typedef typename InputImageType::IndexType IndexType; - typedef typename InputImageType::IndexValueType IndexValueType; - - /** ContinuousIndex Type. */ - typedef itk::ContinuousIndex<CoordRepType, itkGetStaticConstMacro(ImageDimension)> - ContinuousIndexType; - - /** DataNode Type */ - typedef typename Superclass::DataNodeType DataNodeType; - - /** Point Type */ - typedef typename DataNodeType::PointType PointType; - - /** Set the input image. - * \warning this method caches BufferedRegion information. - * If the BufferedRegion has changed, user must call - * SetInputImage again to update cached values. */ - virtual void SetInputImage( const InputImageType * ptr ); - - /** Get the input image. */ - const InputImageType * GetInputImage() const - { return m_Image.GetPointer(); } - - /** Evaluate the function at specified DataNode position. - * Subclasses must provide this method. */ - TOutput Evaluate( const DataNodeType& node ) const override = 0; - - /** Check if an index is inside the image buffer. - * we take into account the fact that each voxel has its - * center at the integer coordinate and extends half way - * to the next integer coordinate. - * \warning For efficiency, no validity checking of - * the input image is done. */ - virtual bool IsInsideBuffer( const IndexType & index ) const - { - for( unsigned int j = 0; j < ImageDimension; ++j ) - { - if( index[j] < m_StartIndex[j] ) - { - return false; - } - if( index[j] > m_EndIndex[j] ) - { - return false; - } - } - return true; - } - - /** Check if a continuous index is inside the image buffer. - * \warning For efficiency, no validity checking of - * the input image is done. */ - virtual bool IsInsideBuffer( const ContinuousIndexType & index ) const - { - for( unsigned int j = 0; j < ImageDimension; ++j ) - { - if( index[j] < m_StartContinuousIndex[j] ) - { - return false; - } - if( index[j] >= m_EndContinuousIndex[j] ) - //Comment this instruction after itkv4 migration (correct - //usage of centered-pixel coordinates) - //if( index[j] > m_EndContinuousIndex[j] ) - { - return false; - } - } - return true; - } - - /** Check if a point is inside the image buffer. - * \warning For efficiency, no validity checking of - * the input image pointer is done. */ - virtual bool IsInsideBuffer( const PointType & point ) const - { - ContinuousIndexType index; - m_Image->TransformPhysicalPointToContinuousIndex( point, index ); - return this->IsInsideBuffer( index ); - } - - /** Convert point to continuous index */ - void ConvertPointToContinuousIndex( const PointType & point, - ContinuousIndexType & cindex ) const - { - m_Image->TransformPhysicalPointToContinuousIndex( point, cindex ); - } - - /** Convert continuous index to nearest index. */ - inline void ConvertContinuousIndexToNearestIndex( const ContinuousIndexType & cindex, - IndexType & index ) const - { - index.CopyWithRound( cindex ); - } - - /** Set/Get methods */ - itkGetConstReferenceMacro(StartIndex, IndexType); - itkGetConstReferenceMacro(EndIndex, IndexType); - - itkGetConstReferenceMacro(StartContinuousIndex, ContinuousIndexType); - itkGetConstReferenceMacro(EndContinuousIndex, ContinuousIndexType); - -protected: - DataNodeImageFunction(); - ~DataNodeImageFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** Const pointer to the input image. */ - InputImageConstPointer m_Image; - - /** Cache some values for testing if indices are inside buffered region. */ - IndexType m_StartIndex; - IndexType m_EndIndex; - ContinuousIndexType m_StartContinuousIndex; - ContinuousIndexType m_EndContinuousIndex; - -private: - DataNodeImageFunction(const Self&) = delete; - void operator=(const Self&) = delete; - -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbDataNodeImageFunction.hxx" -#endif - -#endif diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx b/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx deleted file mode 100644 index b06e770312b5cf63b3bc4b59708aa40c5334e706..0000000000000000000000000000000000000000 --- a/Modules/Core/VectorDataBase/include/otbDataNodeImageFunction.hxx +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDataNodeImageFunction_hxx -#define otbDataNodeImageFunction_hxx - -#include "otbDataNodeImageFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TImage, class TOutput, class TCoordRep, class TPrecision> -DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision> -::DataNodeImageFunction() -{ - m_Image = nullptr; - m_StartIndex.Fill(0); - m_EndIndex.Fill(0); - m_StartContinuousIndex.Fill(0.0f); - m_EndContinuousIndex.Fill(0.0f); -} - - -/** - * Standard "PrintSelf" method - */ -template <class TImage, class TOutput, class TCoordRep, class TPrecision> -void -DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision> -::PrintSelf( - std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf( os, indent ); - os << indent << "InputImage: " << m_Image.GetPointer() << std::endl; - os << indent << "StartIndex: " << m_StartIndex << std::endl; - os << indent << "EndIndex: " << m_EndIndex << std::endl; - os << indent << "StartContinuousIndex: " << m_StartContinuousIndex << std::endl; - os << indent << "EndContinuousIndex: " << m_EndContinuousIndex << std::endl; -} - - -/** - * Initialize by setting the input image - */ -template <class TImage, class TOutput, class TCoordRep, class TPrecision> -void -DataNodeImageFunction<TImage, TOutput, TCoordRep, TPrecision> -::SetInputImage( - const InputImageType * ptr ) -{ - // set the input image - m_Image = ptr; - - if ( ptr ) - { - typename InputImageType::SizeType size = ptr->GetBufferedRegion().GetSize(); - m_StartIndex = ptr->GetBufferedRegion().GetIndex(); - - for ( unsigned int j = 0; j < ImageDimension; ++j ) - { - m_EndIndex[j] = m_StartIndex[j] + static_cast<IndexValueType>( size[j] ) - 1; - m_StartContinuousIndex[j] = static_cast<CoordRepType>( m_StartIndex[j] - 0.5 ); - m_EndContinuousIndex[j] = static_cast<CoordRepType>( m_EndIndex[j] + 0.5 ); - - //Comment these instructions after migration to ITKv4 where there is a correct - //usage of centered-pixel coordinates - //(ITK_USE_CENTERED_PIXEL_COORDINATES_CONSISTENTLY always ON) - //m_StartContinuousIndex[j] = static_cast<CoordRepType>( m_StartIndex[j] ); - //m_EndContinuousIndex[j] = static_cast<CoordRepType>( m_EndIndex[j] ); - } - } -} - - -} // end namespace itk - -#endif diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h b/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h deleted file mode 100644 index c99f15d0b23334b25ec307b7fcb53e93d764ba26..0000000000000000000000000000000000000000 --- a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDataNodeVectorDataFunction_h -#define otbDataNodeVectorDataFunction_h - -#include "otbDataNodeFunctionBase.h" -#include "otbVectorDataProperties.h" - - -namespace otb -{ -/** \class DataNodeVectorDataFunction - * \brief TODO - * - * - * - * \ingroup Functions - * \sa - * - * \ingroup OTBVectorDataBase - */ - -template < -class TOutput, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT DataNodeVectorDataFunction : - public DataNodeFunctionBase<DataNode<TCoordRep, - 2, - TPrecision>, - TOutput> -{ -public: - /** Standard class typedefs. */ - typedef DataNodeVectorDataFunction Self; - typedef DataNodeFunctionBase<DataNode<TCoordRep, - 2, - TPrecision>, - TOutput> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Run-time type information (and related methods). */ - itkTypeMacro(DataNodeVetorDataFunction, DataNodeFunctionBase); - - /** Some typedefs. */ - typedef VectorData<TCoordRep, 2, TPrecision> VectorDataType; - typedef typename VectorDataType::ConstPointer VectorDataConstPointerType; - typedef TOutput OutputType; - - /** CoordRepType typedef support. */ - typedef TCoordRep CoordRepType; - - /** PrecisionType typedef support. */ - typedef TPrecision PrecisionType; - - /** DataNode Type */ - typedef typename Superclass::DataNodeType DataNodeType; - - /** Point Type */ - typedef typename DataNodeType::PointType PointType; - - /** Set the input VetorData. */ - virtual void SetInputVectorData( const VectorDataType * ptr ); - - /** Get the input VectorData. */ - const VectorDataType * GetInputVectorData() const - { return m_VectorData.GetPointer(); } - - /** Evaluate the function at specified DataNode position. - * Subclasses must provide this method. */ - TOutput Evaluate( const DataNodeType& node ) const override = 0; - -protected: - DataNodeVectorDataFunction(); - ~DataNodeVectorDataFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** Const pointer to the input VectorData. */ - VectorDataConstPointerType m_VectorData; - -private: - DataNodeVectorDataFunction(const Self&) = delete; - void operator=(const Self&) = delete; - -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbDataNodeVectorDataFunction.hxx" -#endif - -#endif diff --git a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx b/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx deleted file mode 100644 index 9ca52e1798d94b391825ca5629ba3e37a35dc1d9..0000000000000000000000000000000000000000 --- a/Modules/Core/VectorDataBase/include/otbDataNodeVectorDataFunction.hxx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDataNodeVectorDataFunction_hxx -#define otbDataNodeVectorDataFunction_hxx - -#include "otbDataNodeVectorDataFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TOutput, class TCoordRep, class TPrecision> -DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision> -::DataNodeVectorDataFunction() -{ - m_VectorData = nullptr; -} - - -/** - * Standard "PrintSelf" method - */ -template <class TOutput, class TCoordRep, class TPrecision> -void -DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision> -::PrintSelf( - std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf( os, indent ); - os << indent << "VetorData: " << m_VectorData.GetPointer() << std::endl; -} - - -/** - * Initialize by setting the input VectorData - */ -template <class TOutput, class TCoordRep, class TPrecision> -void -DataNodeVectorDataFunction<TOutput, TCoordRep, TPrecision> -::SetInputVectorData( - const VectorDataType * ptr ) -{ - // set the input VectorData - m_VectorData = ptr; -} - -} // end namespace otb - -#endif diff --git a/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h b/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h deleted file mode 100644 index ba09b76b6d314c30615c420b164e74c0588488b5..0000000000000000000000000000000000000000 --- a/Modules/Core/VectorDataBase/include/otbGISConnectionImplementation.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbGISConnectionImplementation_h -#define otbGISConnectionImplementation_h - -#include "itkDataObject.h" -#include "itkObjectFactory.h" -#include <string> - -namespace otb -{ -/** \class GISConnectionImplementation - * \brief Base class for GIS DB connection implementations - * - * - * - * \ingroup OTBVectorDataBase - */ - -template <class TransactorType> -class ITK_EXPORT GISConnectionImplementation - : public itk::DataObject -{ -public: - /** Standard class typedefs */ - typedef GISConnectionImplementation Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Standard macros */ - itkNewMacro(Self); - itkTypeMacro(GISConnectionImplementation, itk::DataObject); - - /** Acessors */ - itkGetMacro(Host, std::string); - itkSetMacro(Host, std::string); - - itkGetMacro(DBName, std::string); - itkSetMacro(DBName, std::string); - - itkGetMacro(User, std::string); - itkSetMacro(User, std::string); - - itkGetMacro(Password, std::string); - itkSetMacro(Password, std::string); - - itkGetMacro(Port, std::string); - itkSetMacro(Port, std::string); - - itkGetMacro(Options, std::string); - itkSetMacro(Options, std::string); - - /** Using the connection */ - - virtual void ConnectToDB(){} - - virtual void PerformTransaction(const TransactorType& itkNotUsed(theTransaction)) const {} - -protected: - /** Constructor */ - GISConnectionImplementation(){}; - /** Destructor */ - virtual ~GISConnectionImplementation(){}; - -private: - GISConnectionImplementation(const Self &) = delete; - void operator =(const Self&) = delete; - - std::string m_Host; - std::string m_DBName; - std::string m_User; - std::string m_Password; - std::string m_Port; - std::string m_Options; - -}; -} // end namespace otb - -#endif diff --git a/Modules/Detection/ObjectDetection/CMakeLists.txt b/Modules/Detection/ObjectDetection/CMakeLists.txt deleted file mode 100644 index e43a781cad9f8f9c4566a125e2023eb9444e3b6f..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBObjectDetection) -otb_module_impl() diff --git a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h deleted file mode 100644 index 6432b507d125bbc7c51e331341c884a5da73a6b3..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.h +++ /dev/null @@ -1,378 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDescriptorsListSampleGenerator_h -#define otbDescriptorsListSampleGenerator_h - -#include <vector> - -#include "itkVariableLengthVector.h" -#include "itkImageRegion.h" -#include "itkFunctionBase.h" -#include "itkListSample.h" -#include "itkSimpleDataObjectDecorator.h" - -#include "otbListSampleSource.h" -#include "otbVectorData.h" -#include "otbPersistentImageFilter.h" -#include "otbPersistentFilterStreamingDecorator.h" - -namespace otb -{ - -template <class TOutputPrecision> -class DefaultDescriptorsType -{ -public: - typedef itk::VariableLengthVector<TOutputPrecision> Type; -}; - -/** \class PersistentDescriptorsListSampleGenerator - * \brief [internal] Helper class for the implementation of DescriptorsListSampleGenerator - * - * This class inherits PersistentImageFilter and provides the Reset/Synthesize functions, - * plus the ThreadedGenerateData function implementing the image function evaluation - * - * \ingroup OTBObjectDetection - */ -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabel> -class ITK_EXPORT PersistentDescriptorsListSampleGenerator : - public PersistentImageFilter<TInputImage, TInputImage> -{ -public: - /** Standard Self typedef */ - typedef PersistentDescriptorsListSampleGenerator Self; - typedef PersistentImageFilter<TInputImage, TInputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Runtime information support. */ - itkTypeMacro(PersistentDescriptorsListSampleGenerator, PersistentImageFilter); - - /** Image related typedefs. */ - typedef TInputImage InputImageType; - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::RegionType RegionType; - typedef typename TInputImage::SizeType SizeType; - typedef typename TInputImage::IndexType IndexType; - typedef typename TInputImage::PixelType PixelType; - - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); - - /** Image related typedefs. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TInputImage::ImageDimension); - - /** Smart Pointer type to a DataObject. */ - typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType; - typedef typename itk::DataObject::Pointer DataObjectPointer; - - /** Input VectorData */ - typedef TVectorData VectorDataType; - typedef typename VectorDataType::Pointer VectorDataPointerType; - typedef typename VectorDataType::DataNodeType VectorDataNodeType; - typedef typename VectorDataType::DataNodePointerType VectorDataNodePointerType; - typedef typename VectorDataType::DataTreeType VectorDataTreeType; - typedef typename VectorDataType::DataTreePointerType VectorDataTreePointerType; - typedef typename VectorDataNodeType::PointType VectorDataPointType; - typedef typename VectorDataNodeType::LineType VectorDataLineType; - typedef typename VectorDataNodeType::PolygonType VectorDataPolygonType; - typedef itk::PreOrderTreeIterator<VectorDataTreeType> VectorDataTreeIteratorType; - - /** Function type for descriptors extraction */ - typedef TFunctionType DescriptorsFunctionType; - typedef typename DescriptorsFunctionType::Pointer DescriptorsFunctionPointerType; - typedef typename DescriptorsFunctionType::InputType DescriptorsFunctionPointType; - - typedef itk::ContinuousIndex - <typename DescriptorsFunctionPointType::ValueType, - itkGetStaticConstMacro(InputImageDimension)> ContinuousIndexType; - - /** ListSample output */ - typedef TListSample ListSampleType; - typedef typename ListSampleType::Pointer ListSamplePointerType; - typedef typename ListSampleType::MeasurementVectorType SampleMeasurementVectorType; - typedef typename ListSampleType::MeasurementType SampleMeasurementType; - - /** LabelListSample output */ - typedef TLabel LabelType; - typedef itk::FixedArray<LabelType,1> LabelSampleType; - typedef itk::Statistics::ListSample<LabelSampleType> LabelListSampleType; - typedef typename LabelListSampleType::Pointer LabelListSamplePointerType; - typedef typename LabelListSampleType::MeasurementVectorType LabelMeasurementVectorType; - typedef typename LabelListSampleType::MeasurementType LabelMeasurementType; - - /** ListSamplePositions output */ - typedef std::vector<DescriptorsFunctionPointType> SamplesPositionType; - typedef itk::SimpleDataObjectDecorator<SamplesPositionType> SamplesPositionObjectType; - typedef typename SamplesPositionObjectType::Pointer SamplesPositionObjectPointerType; - - void SetSamplesLocations(VectorDataType * input); - VectorDataType * GetSamplesLocations(void); - - /** The function to evaluate */ - itkSetObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - itkGetObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - itkGetConstObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - - /** Output sample list */ - ListSampleType* GetListSample(); - - /** Output label list */ - LabelListSampleType* GetLabelListSample(); - - /** Output sample position list */ - SamplesPositionType& GetSamplesPositions(); - SamplesPositionObjectType* GetSamplesPositionsObject(); - - itkSetMacro( NeighborhoodRadius, unsigned int ); - itkGetConstReferenceMacro( NeighborhoodRadius, unsigned int ); - - /** Make a DataObject of the correct type to be used as the specified - * output. */ - itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx) override; - using Superclass::MakeOutput; - - void AllocateOutputs() override; - void GenerateOutputInformation() override; - void Reset(void) override; - void Synthetize(void) override; - - void AddInput(itk::DataObject * dataObject) override - { - Superclass::AddInput(dataObject); - } - -protected: - PersistentDescriptorsListSampleGenerator(); - ~PersistentDescriptorsListSampleGenerator() override; - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - void GenerateInputRequestedRegion() override; - - void BeforeThreadedGenerateData() override; - - /** Multi-thread version GenerateData. */ - void ThreadedGenerateData(const RegionType& outputRegionForThread, - itk::ThreadIdType threadId) override; - -private: - PersistentDescriptorsListSampleGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - bool IsInsideWithNeighborhoodRadius(const RegionType& region, const ContinuousIndexType &index) const - { - typedef typename IndexType::IndexValueType IndexValueType; - typedef typename ContinuousIndexType::ValueType ContinuousIndexValueType; - - for(unsigned int i=0; i<ImageDimension; ++i) - { - if( itk::Math::RoundHalfIntegerUp<IndexValueType>(index[i]) < static_cast<IndexValueType>( region.GetIndex(i) ) + static_cast<IndexValueType>(m_NeighborhoodRadius) ) - //Comment this instruction after itkv4 migration (correct - //usage of centered-pixel coordinates) - //if( index[i] < static_cast<IndexValueType>( region.GetIndex(i) ) + m_NeighborhoodRadius ) - { - return false; - } - // bound is the last valid pixel location - const ContinuousIndexValueType bound = static_cast<ContinuousIndexValueType>( - region.GetIndex(i) + region.GetSize(i) - 0.5); - //Comment this instruction after itkv4 migration (correct - //usage of centered-pixel coordinates) - //const ContinuousIndexValueType bound = static_cast<ContinuousIndexValueType>( - // region.GetIndex(i) + static_cast<IndexValueType>(region.GetSize(i)) - 1); - - if( index[i] > bound - m_NeighborhoodRadius ) - { - return false; - } - } - return true; - } - typedef std::vector<ListSamplePointerType> ListSampleArray; - typedef std::vector<LabelListSamplePointerType> LabelListSampleArray; - typedef std::vector<SamplesPositionType> SamplesPositionArray; - - ListSampleArray m_ThreadListSample; - LabelListSampleArray m_ThreadLabelListSample; - SamplesPositionArray m_ThreadSamplesPosition; - - DescriptorsFunctionPointerType m_DescriptorsFunction; - - unsigned int m_NeighborhoodRadius; -}; - - -/** \class DescriptorsListSampleGenerator - * \brief This class generates a ListSample by computing local descriptors - * on an image at specified positions. - * - * Given an image (by SetInputImage()) and a vector data containing points (by SetSamplesLocations()), - * this class evaluates an ImageFunction (set by SetDescriptorsFunction()) at each point of the vector data - * over the image. - * It generates a ListSample containing the descriptors values for each sample, - * along with a label ListSample containing the label associated with each sample. - * The label is read from the vector data using the data field "Class", read as an int - * - * This class is streaming capable and multithreaded - * - * \ingroup OTBObjectDetection - */ -template <class TInputImage, class TVectorData, class TListSample, class TLabel, class TOutputPrecision = double, class TCoordRep = double> -class ITK_EXPORT DescriptorsListSampleGenerator : - public PersistentFilterStreamingDecorator< - PersistentDescriptorsListSampleGenerator< TInputImage, - TVectorData, - itk::FunctionBase< itk::Point<TCoordRep, 2>, - typename DefaultDescriptorsType<TOutputPrecision>::Type >, - TListSample, - TLabel > > -{ -public: - /** Standard Self typedef */ - typedef DescriptorsListSampleGenerator Self; - typedef PersistentFilterStreamingDecorator - < PersistentDescriptorsListSampleGenerator - <TInputImage, - TVectorData, - itk::FunctionBase< itk::Point<TCoordRep, 2>, typename DefaultDescriptorsType<TOutputPrecision>::Type >, - TListSample, - TLabel> > Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(DescriptorsListSampleGenerator, PersistentFilterStreamingDecorator); - - typedef TInputImage InputImageType; - typedef TVectorData InputVectorDataType; - typedef TListSample ListSampleType; - typedef TCoordRep CoordRepType; - typedef TOutputPrecision OutputPrecision; - - /** The coordinates used when evaluating function */ - typedef itk::Point<TCoordRep, 2> PointType; - - /** The return value of the function */ - typedef typename DefaultDescriptorsType<TOutputPrecision>::Type DescriptorType; - - /** The function evaluated on the input image at locations specified by the vector data */ - typedef itk::FunctionBase<PointType, DescriptorType> DescriptorsFunctionType; - typedef typename DescriptorsFunctionType::Pointer DescriptorsFunctionPointerType; - - typedef typename Superclass::FilterType PersistentFilterType; - typedef typename PersistentFilterType::LabelListSampleType LabelListSampleType; - typedef typename PersistentFilterType::SamplesPositionObjectType SamplesPositionObjectType; - typedef typename PersistentFilterType::SamplesPositionType SamplesPositionType; - - - /** Input image to extract feature */ - void SetInputImage(InputImageType * input) - { - this->GetFilter()->SetInput(input); - } - - /** Input image to extract feature */ - InputImageType * GetInputImage() - { - return this->GetFilter()->GetInput(); - } - - void AddInput(itk::DataObject * dataObject) override - { - this->GetFilter()->AddInput(dataObject); - } - - /** Sample locations as a VectorData of points. The label is in the ClassKey feature */ - void SetSamplesLocations(InputVectorDataType * input) - { - this->GetFilter()->SetSamplesLocations(input); - } - - /** Sample locations as a VectorData of points. The label is in the ClassKey feature */ - InputImageType * GetSamplesLocations() - { - return this->GetFilter()->GetSamplesLocations(); - } - - /** The function to evaluate */ - void SetDescriptorsFunction(DescriptorsFunctionType * input) - { - this->GetFilter()->SetDescriptorsFunction(input); - } - - /** The function to evaluate */ - DescriptorsFunctionType * GetDescriptorsFunction() - { - return this->GetFilter()->GetDescriptorsFunction(); - } - - /** Final sample list */ - ListSampleType* GetListSample() - { - return this->GetFilter()->GetListSample(); - } - - /** Final label list */ - LabelListSampleType* GetLabelListSample() - { - return this->GetFilter()->GetLabelListSample(); - } - - /** Final label list */ - SamplesPositionType& GetSamplesPositions() - { - return this->GetFilter()->GetSamplesPositions(); - } - - SamplesPositionObjectType* GetSamplesPositionsObject() - { - return this->GetFilter()->GetSamplesPositionsObject(); - } - - otbSetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int); - otbGetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int); - - protected: - /** Constructor */ - DescriptorsListSampleGenerator(); - - /** Destructor */ - ~DescriptorsListSampleGenerator() override; - - private: - DescriptorsListSampleGenerator(const Self &) = delete; - void operator =(const Self&) = delete; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbDescriptorsListSampleGenerator.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx b/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx deleted file mode 100644 index 7fb7b6f55ec2d70ed30d592b63fba40da9513e0a..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbDescriptorsListSampleGenerator.hxx +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDescriptorsListSampleGenerator_hxx -#define otbDescriptorsListSampleGenerator_hxx - -#include "otbDescriptorsListSampleGenerator.h" - -#include "itkContinuousIndex.h" - -namespace otb -{ - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::PersistentDescriptorsListSampleGenerator() - : m_NeighborhoodRadius(0) -{ - // Need 2 inputs : a vector image and a vectordata - this->SetNumberOfRequiredInputs(2); - - // Have 4 outputs : the image created by Superclass, - // the sample list, the label sample list, the positions of the samples - this->SetNumberOfRequiredOutputs(3); - this->itk::ProcessObject::SetNthOutput(1, this->MakeOutput(1).GetPointer()); - this->itk::ProcessObject::SetNthOutput(2, this->MakeOutput(2).GetPointer()); - this->itk::ProcessObject::SetNthOutput(3, this->MakeOutput(3).GetPointer()); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::~PersistentDescriptorsListSampleGenerator() -{ -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::AllocateOutputs() -{ - // This is commented to prevent the streaming of the whole image for the first stream strip - // It shall not cause any problem because the output image of this filter is not intended to be used. - //InputImagePointer image = const_cast< TInputImage * >( this->GetInput() ); - //this->GraftOutput( image ); - // Nothing that needs to be allocated for the remaining outputs -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GenerateOutputInformation() -{ - Superclass::GenerateOutputInformation(); - if (this->GetInput()) - { - this->GetOutput()->CopyInformation(this->GetInput()); - this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion()); - - if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0) - { - this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion()); - } - } -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::SetSamplesLocations(VectorDataType* location) -{ - this->SetNthInput(1, location); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::VectorDataType* -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GetSamplesLocations() -{ - - return static_cast<VectorDataType*>(this->itk::ProcessObject::GetInput(1)); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::ListSampleType* -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GetListSample() -{ - return dynamic_cast<ListSampleType*>(this->itk::ProcessObject::GetOutput(1)); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::LabelListSampleType* -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GetLabelListSample() -{ - return dynamic_cast<LabelListSampleType*>( this->itk::ProcessObject::GetOutput(2) ); -} - - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::SamplesPositionType& -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GetSamplesPositions() -{ - return this->GetSamplesPositionsObject()->Get(); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -typename PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample>::SamplesPositionObjectType* -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GetSamplesPositionsObject() -{ - return dynamic_cast<SamplesPositionObjectType*>(this->itk::ProcessObject::GetOutput(3)); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -itk::DataObject::Pointer -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::MakeOutput(DataObjectPointerArraySizeType idx) -{ - itk::DataObject::Pointer output; - switch (idx) - { - case 0: - output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer()); - break; - case 1: - { - ListSamplePointerType listSample = ListSampleType::New(); - output = static_cast<itk::DataObject*>(listSample.GetPointer()); - break; - } - case 2: - { - LabelListSamplePointerType labelListSample = LabelListSampleType::New(); - output = static_cast<itk::DataObject*>(labelListSample.GetPointer()); - break; - } - case 3: - { - SamplesPositionObjectPointerType samplesPositions = SamplesPositionObjectType::New(); - output = static_cast<itk::DataObject*>(samplesPositions.GetPointer()); - break; - } - default: - output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer()); - break; - } - return output; -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::Reset() -{ - m_ThreadListSample = ListSampleArray(this->GetNumberOfThreads()); - for (unsigned int i = 0; i < this->GetNumberOfThreads(); ++i) - { - m_ThreadListSample[i] = ListSampleType::New(); - } - - m_ThreadLabelListSample = LabelListSampleArray(this->GetNumberOfThreads()); - for (unsigned int i = 0; i < this->GetNumberOfThreads(); ++i) - { - m_ThreadLabelListSample[i] = LabelListSampleType::New(); - } - - m_ThreadSamplesPosition = SamplesPositionArray(this->GetNumberOfThreads()); - - this->GetListSample()->Clear(); - this->GetLabelListSample()->Clear(); - this->GetSamplesPositions().clear(); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::Synthetize() -{ - // Merge the ListSample from all the threads - ListSampleType* listSample = this->GetListSample(); - LabelListSampleType* labelListSample = this->GetLabelListSample(); - SamplesPositionType& samplesPosition = this->GetSamplesPositions(); - VectorDataPointType ref; - - // Get the output list measurement vector sample sizes once - listSample->SetMeasurementVectorSize(m_ThreadListSample[0]->GetMeasurementVectorSize()); - labelListSample->SetMeasurementVectorSize(m_ThreadLabelListSample[0]->GetMeasurementVectorSize()); - - // Copy the first thread elements into lists - ListSampleType* threadListSample = m_ThreadListSample[0]; - LabelListSampleType* threadLabelListSample = m_ThreadLabelListSample[0]; - SamplesPositionType& threadSamplesPosition = m_ThreadSamplesPosition[0]; - for (unsigned int i = 0; i < threadListSample->Size(); ++i) - { - listSample->PushBack( threadListSample->GetMeasurementVector(i) ); - labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) ); - samplesPosition.push_back( threadSamplesPosition[i] ); - } - - // Add the other thread element checking if the point dosn't already exist - for (itk::ThreadIdType threadId = 1; threadId < this->GetNumberOfThreads(); ++threadId ) - { - threadListSample = m_ThreadListSample[threadId]; - threadLabelListSample = m_ThreadLabelListSample[threadId]; - threadSamplesPosition = m_ThreadSamplesPosition[threadId]; - - for (unsigned int i = 0; i < threadListSample->Size(); ++i) - { - const DescriptorsFunctionPointType & curSamplesPosition = threadSamplesPosition[i]; - if( std::find(samplesPosition.begin(), samplesPosition.end(), curSamplesPosition) == samplesPosition.end() ) - { - listSample->PushBack( threadListSample->GetMeasurementVector(i) ); - labelListSample->PushBack( threadLabelListSample->GetMeasurementVector(i) ); - samplesPosition.push_back( curSamplesPosition ); - } - } - } -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::GenerateInputRequestedRegion() -{ - Superclass::GenerateInputRequestedRegion(); - - // get pointers to the input and output - typename Superclass::InputImagePointer inputPtr = - const_cast< TInputImage * >( this->GetInput() ); - typename Superclass::OutputImagePointer outputPtr = this->GetOutput(); - - if ( !inputPtr || !outputPtr ) - { - return; - } - - // get a copy of the input requested region (should equal the output - // requested region) - typename TInputImage::RegionType inputRequestedRegion; - inputRequestedRegion = inputPtr->GetRequestedRegion(); - - // pad the input requested region by the operator radius - inputRequestedRegion.PadByRadius( m_NeighborhoodRadius + 5 ); - - // crop the input requested region at the input's largest possible region - if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) ) - { - inputPtr->SetRequestedRegion( inputRequestedRegion ); - return; - } - else - { - // Couldn't crop the region (requested region is outside the largest - // possible region). Throw an exception. - - // store what we tried to request (prior to trying to crop) - inputPtr->SetRequestedRegion( inputRequestedRegion ); - } -} - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::BeforeThreadedGenerateData() -{} - - -template <class TInputImage, class TVectorData, class TFunctionType, class TListSample, class TLabelListSample> -void -PersistentDescriptorsListSampleGenerator<TInputImage, TVectorData, TFunctionType, TListSample, TLabelListSample> -::ThreadedGenerateData(const RegionType& outputRegionForThread, - itk::ThreadIdType threadId) -{ - ListSampleType* listSample = m_ThreadListSample[threadId]; - LabelListSampleType* labelListSample = m_ThreadLabelListSample[threadId]; - SamplesPositionType& samplesPosition = m_ThreadSamplesPosition[threadId]; - - VectorDataTreeIteratorType vectorDataIt(this->GetSamplesLocations()->GetDataTree()); - bool isInitialized = false; - - for (vectorDataIt.GoToBegin(); !vectorDataIt.IsAtEnd(); ++vectorDataIt) - { - if (vectorDataIt.Get()->IsPointFeature()) - { - VectorDataPointType point = vectorDataIt.Get()->GetPoint(); - ContinuousIndexType cidx; - this->GetInput()->TransformPhysicalPointToContinuousIndex(point, cidx); - - RegionType paddedRegion = outputRegionForThread; - paddedRegion.PadByRadius(m_NeighborhoodRadius); - if (this->IsInsideWithNeighborhoodRadius(paddedRegion, cidx)) - { - // Set the Measurement Vector Size of the samplelists, once - if(!isInitialized) - { - // output list sample - listSample->SetMeasurementVectorSize(m_DescriptorsFunction->Evaluate(point).Size()); - labelListSample->SetMeasurementVectorSize(LabelMeasurementVectorType::Length); - isInitialized = true; - } - - SampleMeasurementVectorType sample(m_DescriptorsFunction->Evaluate(point)); - listSample->PushBack( sample ); - - LabelMeasurementVectorType label; - label[0] = static_cast<LabelMeasurementType>(vectorDataIt.Get()->GetFieldAsInt("Class")); - labelListSample->PushBack( label ); - - samplesPosition.push_back(point); - } - } - } -} - - -template <class TInputImage, class TVectorData, class TListSample, class TLabelListSample, class TOutputPrecision, class TCoordRep> -DescriptorsListSampleGenerator<TInputImage, TVectorData, TListSample, TLabelListSample, TOutputPrecision, TCoordRep> -::DescriptorsListSampleGenerator() -{ - - -} - -template <class TInputImage, class TVectorData, class TListSample, class TLabelListSample, class TOutputPrecision, class TCoordRep> -DescriptorsListSampleGenerator<TInputImage, TVectorData, TListSample, TLabelListSample, TOutputPrecision, TCoordRep> -::~DescriptorsListSampleGenerator() -{ - -} - - -} // end namespace otb - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h deleted file mode 100644 index f4c79f003f9b7a1c7e5c3841720e9b9979bac03e..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbFlusserMomentsIFFactory_h -#define otbFlusserMomentsIFFactory_h - -#include "itkLightObject.h" - -#include "otbMetaImageFunction.h" -#include "itkDataObject.h" -#include "otbImage.h" -#include "otbImageFunctionAdaptor.h" -#include "otbFlusserMomentsImageFunction.h" - - -namespace otb -{ -/** \class FlusserMomentsFFactory - * \brief add a FlusserMoments image function to a - * MetaImageFunction - * - * This class aims at adding an adapted - * FlusserMomentsImageFunction to an existing - * MetaImageFunction through the method Create. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TImageType, class TCoordRep = double, class TPrecision = double> -class ITK_EXPORT FlusserMomentsIFFactory : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef FlusserMomentsIFFactory Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(FlusserMomentsIFFactory, itk::LightObject); - - // Input and output typedef - typedef TImageType InputImageType; - typedef TCoordRep CoordRepType; - typedef TPrecision PrecisionType; - - // Other typedef - typedef typename MetaImageFunction<TPrecision>::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<PrecisionType> ParamContainerType; - typedef FlusserMomentsImageFunction<InputImageType, CoordRepType> - FlusserMomentsIF; - typedef ImageFunctionAdaptor<FlusserMomentsIF, TPrecision> - AdaptedFlusserMomentsIF; - - void Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container); - -protected: - FlusserMomentsIFFactory(){} - ~FlusserMomentsIFFactory() override{} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - FlusserMomentsIFFactory(const Self& ) = delete; - void operator=(const Self& ) = delete; - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbFlusserMomentsIFFactory.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx deleted file mode 100644 index 6aa08394d2145baf8474c072587f9b2757430419..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbFlusserMomentsIFFactory.hxx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbFlusserMomentsIFFactory_hxx -#define otbFlusserMomentsIFFactory_hxx - -#include "otbFlusserMomentsIFFactory.h" - - -namespace otb -{ -template <class TImageType, class TCoordRep, class TPrecision> -void -FlusserMomentsIFFactory<TImageType, TCoordRep, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TImageType, class TCoordRep, class TPrecision> -void -FlusserMomentsIFFactory<TImageType, TCoordRep, TPrecision> -::Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container) -{ - typename AdaptedFlusserMomentsIF::Pointer function = AdaptedFlusserMomentsIF::New(); - - function->SetInputImage(image); - function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]); - - metaIF->AddFunction(function); - container->push_back(image); -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h deleted file mode 100644 index e89dbcf376b2d11fc590b07ce0012e6045c35cab..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbFourierMellinDescriptorsIFFactory_h -#define otbFourierMellinDescriptorsIFFactory_h - -#include "itkLightObject.h" - -#include "otbMetaImageFunction.h" -#include "itkDataObject.h" -#include "otbImageFunctionAdaptor.h" -#include "otbFourierMellinDescriptorsImageFunction.h" - - -namespace otb -{ -/** \class FourierMellinDescriptorsFFactory - * \brief add a FourierMellinDescriptors image function to a - * MetaImageFunction - * - * This class aims at adding an adapted - * FourierMellinDescriptorsImageFunction to an existing - * MetaImageFunction through the method Create. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TImageType, class TCoordRep = double, class TPrecision = double> -class ITK_EXPORT FourierMellinDescriptorsIFFactory : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef FourierMellinDescriptorsIFFactory Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(FourierMellinDescriptorsIFFactory, itk::LightObject); - - // Input and output typedef - typedef TImageType InputImageType; - typedef TCoordRep CoordRepType; - typedef TPrecision PrecisionType; - - // Other typedef - typedef typename MetaImageFunction<TPrecision>::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<PrecisionType> ParamContainerType; - typedef FourierMellinDescriptorsImageFunction<InputImageType, CoordRepType> - FourierMellinDescriptorsIF; - typedef ImageFunctionAdaptor<FourierMellinDescriptorsIF, TPrecision> - AdaptedFourierMellinDescriptorsIF; - - void Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container); - -protected: - FourierMellinDescriptorsIFFactory(){} - ~FourierMellinDescriptorsIFFactory() override{} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - FourierMellinDescriptorsIFFactory(const Self& ) = delete; - void operator=(const Self& ) = delete; - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbFourierMellinDescriptorsIFFactory.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx deleted file mode 100644 index bb19f36cf7a608203ca02e2fffd12a8bbb729951..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbFourierMellinDescriptorsIFFactory.hxx +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbFourierMellinDescriptorsIFFactory_hxx -#define otbFourierMellinDescriptorsIFFactory_hxx - -#include "otbFourierMellinDescriptorsIFFactory.h" - - -namespace otb -{ -template <class TImageType, class TCoordRep, class TPrecision> -void -FourierMellinDescriptorsIFFactory<TImageType, TCoordRep, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TImageType, class TCoordRep, class TPrecision> -void -FourierMellinDescriptorsIFFactory<TImageType, TCoordRep, TPrecision> -::Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container) -{ - typename AdaptedFourierMellinDescriptorsIF::Pointer function = AdaptedFourierMellinDescriptorsIF::New(); - - function->SetInputImage(image); - function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]); - function->GetInternalImageFunction()->SetPmax(param[1]); - function->GetInternalImageFunction()->SetQmax(param[2]); - - metaIF->AddFunction(function); - container->push_back(image); -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h b/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h deleted file mode 100644 index b00367a73b0b655ddfc57f2305cc15e18922636e..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.h +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbHaralickTexturesIFFactory_h -#define otbHaralickTexturesIFFactory_h - -#include "itkLightObject.h" - -#include "otbMetaImageFunction.h" -#include "itkDataObject.h" -#include "otbImage.h" -#include "otbImageFunctionAdaptor.h" -#include "otbHaralickTexturesImageFunction.h" - - -namespace otb -{ -/** \class HaralickTexturesFFactory - * \brief add a HaralickTextures image function to a - * MetaImageFunction - * - * This class aims at adding an adapted - * HaralickTexturesImageFunction to an existing - * MetaImageFunction through the method Create. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TImageType, class TCoordRep = double, class TPrecision = double> -class ITK_EXPORT HaralickTexturesIFFactory : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef HaralickTexturesIFFactory Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(haralickTexturesIFFactory, itk::LightObject); - - // Input and output typedef - typedef TImageType InputImageType; - typedef TCoordRep CoordRepType; - typedef TPrecision PrecisionType; - - // Other typedef - typedef typename MetaImageFunction<TPrecision>::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<PrecisionType> ParamContainerType; - typedef HaralickTexturesImageFunction<InputImageType, CoordRepType> - HaralickTexturesIF; - typedef typename HaralickTexturesIF::OffsetType OffsetType; - typedef ImageFunctionAdaptor<HaralickTexturesIF, TPrecision> - AdaptedHaralickTexturesIF; - - void Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container); - -protected: - HaralickTexturesIFFactory(){} - ~HaralickTexturesIFFactory() override{} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - HaralickTexturesIFFactory(const Self& ) = delete; - void operator=(const Self& ) = delete; - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbHaralickTexturesIFFactory.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx deleted file mode 100644 index fe1d2934f0fce071bc89d7bd8d7f66964c21a8a7..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbHaralickTexturesIFFactory.hxx +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbHaralickTexturesIFFactory_hxx -#define otbHaralickTexturesIFFactory_hxx - -#include "otbHaralickTexturesIFFactory.h" - - -namespace otb -{ -template <class TImageType, class TCoordRep, class TPrecision> -void -HaralickTexturesIFFactory<TImageType, TCoordRep, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TImageType, class TCoordRep, class TPrecision> -void -HaralickTexturesIFFactory<TImageType, TCoordRep, TPrecision> -::Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container) -{ - typename AdaptedHaralickTexturesIF::Pointer function = AdaptedHaralickTexturesIF::New(); - - function->SetInputImage(image); - function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]); - function->SetInputImageMinimum(param[1]); - function->SetInputImageMaximum(param[2]); - function->SetNumberOfBinsPerAxis(param[3]); - - OffsetType offset; - offset.Fill(param[4]); - function->GetInternalImageFunction()->SetOffset(offset); - - metaIF->AddFunction(function); - container->push_back(image); -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h b/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h deleted file mode 100644 index 9dd970997cbdc27a374e2fd22f6a8c59070f01eb..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLabeledSampleLocalizationGenerator_h -#define otbLabeledSampleLocalizationGenerator_h - -#include "otbVectorDataSource.h" -#include "otbVectorData.h" -#include "itkPreOrderTreeIterator.h" -#include "itkMersenneTwisterRandomVariateGenerator.h" -#include "itkEuclideanDistanceMetric.h" -#include <string> - - -namespace otb -{ -/** \class LabeledSampleLocalizationGenerator - * \brief Produces a VectorData from potentialy multiple VectorData - * - * This generator produces a unique vector data containing labeled positions - * extracted from inputs. - * - * Input points are transmitted to the output. In addition, 'no class' - * points are randomly picked inside input polygons making sure - * they are at least at a given distance (InhibitionRadius) of every - * known points. - * - * Classes are specified by the VectorData with a metadata field identified by - * a specific key. This key can be provided by the SetClassKey() method - * (using "Class" as a default key). - * The field is retrieved by GetFieldAsInt(), thus must be int-compatible - * - * - * \ingroup OTBObjectDetection - */ -template <class TVectorData> -class ITK_EXPORT LabeledSampleLocalizationGenerator : - public VectorDataSource<TVectorData> -{ -public: - /** Standard class typedefs */ - typedef LabeledSampleLocalizationGenerator Self; - typedef VectorDataSource<TVectorData> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Run-time type information (and related methods). */ - itkTypeMacro(LabeledSampleLocalizationGenerator, VectorDataSource); - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - typedef TVectorData VectorDataType; - typedef typename VectorDataType::Pointer VectorDataPointerType; - typedef typename VectorDataType::DataNodeType DataNodeType; - typedef typename DataNodeType::PolygonType::RegionType RegionType; - typedef typename DataNodeType::PointType PointType; - typedef typename DataNodeType::PolygonType::VertexType VertexType; - typedef typename std::vector<PointType> PointVectorType; - - typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType> TreeIteratorType; - - typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType; - typedef itk::Statistics::EuclideanDistanceMetric<PointType> EuclideanDistanceMetricType; - - /** Connects the VectorDatas from which the localizations are going to be extracted. */ - using Superclass::PushBackInput; - void PushBackInput(const VectorDataType *); - const VectorDataType * GetInput(unsigned int idx) const; - - /** Field name containing the class identifier */ - itkGetConstMacro(ClassKey, std::string); - itkSetMacro(ClassKey, std::string); - - /** Identifier for the negative samples class */ - itkGetConstMacro(NoClassIdentifier, int); - itkSetMacro(NoClassIdentifier, int); - - /** The density of auto-generated negative samples inside the polygons */ - itkGetConstMacro(RandomLocalizationDensity, double); - itkSetMacro(RandomLocalizationDensity, double); - - /** The minimum distance between a generated negative sample and positive samples */ - itkGetConstMacro(InhibitionRadius, double); - itkSetMacro(InhibitionRadius, double); - - /** The maximum iteration number during negative sample positions */ - itkGetConstMacro(NbMaxIteration, unsigned long int); - itkSetMacro(NbMaxIteration, unsigned long int); - - /** Set the number of samples position to generate inside the inhibition radius window around a positive point */ - itkGetConstMacro(NumberOfPositiveSamplesPerPoint, unsigned int); - itkSetMacro(NumberOfPositiveSamplesPerPoint, unsigned int); - - /** Set the seed for random number generator */ - void SetSeed(unsigned int seed) - { - m_RandomGenerator->SetSeed(seed); - } - -protected: - LabeledSampleLocalizationGenerator(); - ~LabeledSampleLocalizationGenerator() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** Triggers the Computation of the sample list */ - void GenerateData(void) override; - - PointVectorType RandomPointsGenerator(DataNodeType * node); - - PointVectorType PointDensification(DataNodeType * node); - -private: - LabeledSampleLocalizationGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - std::string GetNextID() - { - std::ostringstream oss; - oss << m_CurrentID++; - return oss.str(); - } - - RandomGeneratorType::Pointer m_RandomGenerator; - - std::string m_ClassKey; - int m_NoClassIdentifier; - double m_RandomLocalizationDensity; - double m_InhibitionRadius; - unsigned long int m_NbMaxIteration; - unsigned int m_NumberOfPositiveSamplesPerPoint; - unsigned int m_CurrentID; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbLabeledSampleLocalizationGenerator.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx b/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx deleted file mode 100644 index dc0869fc214e889a64dc9f410a6b106545e14574..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbLabeledSampleLocalizationGenerator.hxx +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLabeledSampleLocalizationGenerator_hxx -#define otbLabeledSampleLocalizationGenerator_hxx - -#include "otbLabeledSampleLocalizationGenerator.h" - -#include "otbMath.h" - -namespace otb -{ -template<class TVectorData> -LabeledSampleLocalizationGenerator<TVectorData> -::LabeledSampleLocalizationGenerator() : - m_ClassKey("Class"), - m_NoClassIdentifier(0), - m_RandomLocalizationDensity(.005), - m_InhibitionRadius(5.0), - m_NbMaxIteration(10000), - m_NumberOfPositiveSamplesPerPoint(50), - m_CurrentID(0) -{ - this->SetNumberOfRequiredInputs(1); - this->SetNumberOfRequiredOutputs(1); - - m_RandomGenerator = RandomGeneratorType::GetInstance(); -} - -template <class TVectorData> -void -LabeledSampleLocalizationGenerator<TVectorData> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - this->Superclass::PrintSelf(os, indent); - os << indent << "Class Key: " << m_ClassKey << std::endl; - os << indent << "Negative Class Identifier: " << m_NoClassIdentifier << std::endl; - os << indent << "Sampling Density: " << m_RandomLocalizationDensity << std::endl; - os << indent << "Inhibition Radius: " << m_InhibitionRadius << std::endl; -} - - -template <class TVectorData> -void -LabeledSampleLocalizationGenerator<TVectorData> -::PushBackInput(const VectorDataType * vectorData) -{ - this->Superclass::SetNthInput(this->GetNumberOfIndexedInputs(), const_cast<VectorDataType *>(vectorData)); -} - -template <class TVectorData> -const TVectorData * -LabeledSampleLocalizationGenerator<TVectorData> -::GetInput(unsigned int idx) const -{ - if (this->GetNumberOfInputs() < idx) - { - return nullptr; - } - - return static_cast<const VectorDataType *>(this->Superclass::GetInput(idx)); -} - -template <class TVectorData> -typename LabeledSampleLocalizationGenerator<TVectorData> -::PointVectorType -LabeledSampleLocalizationGenerator<TVectorData> -::PointDensification(DataNodeType * node) -{ - - PointVectorType pPoint; - PointType centerPoint = node->GetPoint(); - - for(unsigned int i = 0; i < m_NumberOfPositiveSamplesPerPoint; ++i) - { - PointType point; - for(unsigned int dim = 0; dim < 2; ++dim) - { - point[dim] = centerPoint[dim]+this->m_RandomGenerator->GetUniformVariate(-m_InhibitionRadius, m_InhibitionRadius); - } - pPoint.push_back(point); - } - return pPoint; -} - -template <class TVectorData> -typename LabeledSampleLocalizationGenerator<TVectorData> -::PointVectorType -LabeledSampleLocalizationGenerator<TVectorData> -::RandomPointsGenerator(DataNodeType * node) -{ - // Output - PointVectorType vPoint; - - // Euclidean distance - typename EuclideanDistanceMetricType::Pointer euclideanDistanceMetric = EuclideanDistanceMetricType::New(); - - // Gathering Information - RegionType generatorRegion = node->GetPolygonExteriorRing()->GetBoundingRegion(); - typename RegionType::SizeType generatorRegionSize = generatorRegion.GetSize(); - typename RegionType::IndexType generatorRegionIndex = generatorRegion.GetIndex(); - //typename RegionType::IndexType generatorRegionOrigin = generatorRegion.GetOrigin(); - - // Identify inside known points - std::vector<PointType> insiders; - typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetOutput(0)); - TreeIteratorType itVector(vectorData->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPointFeature() && itVector.Get()->GetFieldAsInt(m_ClassKey) != m_NoClassIdentifier) - { - VertexType vertex; - vertex[0] = itVector.Get()->GetPoint()[0]; - vertex[1] = itVector.Get()->GetPoint()[1]; - - if(node->GetPolygonExteriorRing()->IsInside(vertex)) - { - insiders.push_back(itVector.Get()->GetPoint()); - } - } - ++itVector; - } - - // Generation - unsigned int nbMaxPosition = (unsigned int)(node->GetPolygonExteriorRing()->GetArea() - * this->GetRandomLocalizationDensity()); - unsigned long int nbIter = this->GetNbMaxIteration(); - unsigned int nbPosition = nbMaxPosition; - - PointType rangeMin, rangeMax; - - for(unsigned int dim = 0; dim < 2; ++dim) - { - rangeMin[dim] = generatorRegionIndex[dim]; - rangeMax[dim] = generatorRegionIndex[dim] + generatorRegionSize[dim]; - } - - while(nbIter > 0 && nbPosition > 0) - { - VertexType candidate; - for(unsigned int dim = 0; dim < 2; ++dim) - { - candidate[dim] = this->m_RandomGenerator->GetUniformVariate(rangeMin[dim], rangeMax[dim]); - } - - if(node->GetPolygonExteriorRing()->IsInside(candidate)) - { - typename PointVectorType::const_iterator pit = insiders.begin(); - bool valid = true; - - while(valid && pit!=insiders.end()) - { - valid = (euclideanDistanceMetric->Evaluate(candidate, *pit) > this->GetInhibitionRadius()); - ++pit; - } - PointType point; - point[0] = candidate[0]; - point[1] = candidate[1]; - if(valid) - { - vPoint.push_back(point); - } - nbPosition --; - } - nbIter --; - } - return vPoint; -} - -template <class TVectorData> -void -LabeledSampleLocalizationGenerator<TVectorData> -::GenerateData() -{ - unsigned int nbInputs = this->GetNumberOfInputs(); - - this->GetOutput(0)->SetMetaDataDictionary(this->GetInput(0)->GetMetaDataDictionary()); - - // Retrieving root node - typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get(); - // Create the document node - typename DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - this->GetOutput(0)->GetDataTree()->Add(document, root); - - std::string positiveClassIdentifier; - bool firstFeature = true; - // Copy all point feature in output VectorData - for (unsigned int i=0; i<nbInputs; ++i) - { - typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i)); - - TreeIteratorType itVector(vectorData->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPointFeature()) - { - //Get the value of the positive value of - if (firstFeature) - { - positiveClassIdentifier = itVector.Get()->GetFieldAsString(m_ClassKey); - firstFeature = false; - } - // Duplicate input feature - typename DataNodeType::Pointer currentGeometry = DataNodeType::New(); - currentGeometry->SetNodeId(this->GetNextID()); - currentGeometry->SetNodeType(otb::FEATURE_POINT); - currentGeometry->SetPoint(itVector.Get()->GetPoint()); - - std::vector<std::string> fields = itVector.Get()->GetFieldList(); - for (std::vector<std::string>::const_iterator it = fields.begin(); it != fields.end(); ++it) - { - currentGeometry->SetFieldAsString( *it, itVector.Get()->GetFieldAsString(*it) ); - // The PositiveClass identifier must be an attribute of the class - - } - - this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document); - } - ++itVector; - } - } - - // Iterates through the polygon features and generates random point inside the polygon with - // the "NoClass" identifier - for (unsigned int i=0; i<nbInputs; ++i) - { - typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i)); - - TreeIteratorType itVector(vectorData->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPolygonFeature()) - { - PointVectorType vPoints = RandomPointsGenerator(itVector.Get()); - - for (typename PointVectorType::const_iterator it = vPoints.begin(); it != vPoints.end(); ++it) - { - typename DataNodeType::Pointer currentGeometry = DataNodeType::New(); - currentGeometry->SetNodeId(this->GetNextID()); - currentGeometry->SetNodeType(otb::FEATURE_POINT); - currentGeometry->SetPoint(*it); - currentGeometry->SetFieldAsInt(this->GetClassKey(), this->GetNoClassIdentifier()); - this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document); - } - } - ++itVector; - } - } - // Densify positive points - for (unsigned int i=0; i<nbInputs; ++i) - { - typename VectorDataType::ConstPointer vectorData = static_cast<const VectorDataType *>(this->GetInput(i)); - - TreeIteratorType itVector(vectorData->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPointFeature()) - { - PointVectorType pPoints = PointDensification(itVector.Get()); - - for (typename PointVectorType::const_iterator it = pPoints.begin(); it != pPoints.end(); ++it) - { - typename DataNodeType::Pointer currentGeometry = DataNodeType::New(); - currentGeometry->SetNodeId(this->GetNextID()); - currentGeometry->SetNodeType(otb::FEATURE_POINT); - currentGeometry->SetPoint(*it); - currentGeometry->SetFieldAsInt(this->GetClassKey(), atoi(positiveClassIdentifier.c_str()) ); - this->GetOutput(0)->GetDataTree()->Add(currentGeometry, document); - } - } - ++itVector; - } - } -} - -} // end namespace otb - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h b/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h deleted file mode 100644 index 1747e5912b28fce922d3a4a04633ac461138b703..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLocalHistogramIFFactory_h -#define otbLocalHistogramIFFactory_h - -#include "itkLightObject.h" - -#include "otbMetaImageFunction.h" -#include "itkDataObject.h" -#include "otbImage.h" -#include "otbImageFunctionAdaptor.h" -#include "otbLocalHistogramImageFunction.h" - - -namespace otb -{ -/** \class LocalHistogramIFFactory - * \brief add a LocalHistogram image function to a - * MetaImageFunction - * - * This class aims at adding an adapted - * LocalHistogramImageFunction to an existing MetaImageFunction - * through the method Create. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TImageType, class TCoordRep = double, class TPrecision = double> -class ITK_EXPORT LocalHistogramIFFactory : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef LocalHistogramIFFactory Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(LocalHistogramIFFactory, itk::LightObject); - - // Input and output typedef - typedef TImageType InputImageType; - typedef TCoordRep CoordRepType; - typedef TPrecision PrecisionType; - - // Other typedef - typedef typename MetaImageFunction<TPrecision>::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<PrecisionType> ParamContainerType; - typedef LocalHistogramImageFunction<InputImageType, CoordRepType> - LocalHistogramIF; - typedef ImageFunctionAdaptor<LocalHistogramIF, TPrecision> - AdaptedLocalHistogramIF; - - void Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container); - -protected: - LocalHistogramIFFactory(){} - ~LocalHistogramIFFactory() override{} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - LocalHistogramIFFactory(const Self& ) = delete; - void operator=(const Self& ) = delete; - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbLocalHistogramIFFactory.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx deleted file mode 100644 index c3c8d27695fc7d38089f79700f988ef4b7a1ccda..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbLocalHistogramIFFactory.hxx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLocalHistogramIFFactory_hxx -#define otbLocalHistogramIFFactory_hxx - -#include "otbLocalHistogramIFFactory.h" - - -namespace otb -{ -template <class TImageType, class TCoordRep, class TPrecision> -void -LocalHistogramIFFactory<TImageType, TCoordRep, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TImageType, class TCoordRep, class TPrecision> -void -LocalHistogramIFFactory<TImageType, TCoordRep, TPrecision> -::Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container) -{ - typename AdaptedLocalHistogramIF::Pointer function = AdaptedLocalHistogramIF::New(); - - function->SetInputImage(image); - function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]); - function->GetInternalImageFunction()->SetNumberOfHistogramBins(param[1]); - function->GetInternalImageFunction()->SetHistogramMin(param[2]); - function->GetInternalImageFunction()->SetHistogramMax(param[3]); - - metaIF->AddFunction(function); - container->push_back(image); -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h b/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h deleted file mode 100644 index a99de90d24b8365f194f87f2966e227d4b7abb3e..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbMultiChannelIFFactory.h +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMultiChannelIFFactory_h -#define otbMultiChannelIFFactory_h - -#include "otbVectorImageToImageListFilter.h" -#include "otbVectorImage.h" -#include "otbImage.h" -#include "otbImageList.h" -#include "itkDataObject.h" -#include "otbMetaImageFunction.h" - - -namespace otb -{ -/** \class MultiChannelIFFactory - * \brief Yhis class handle the image type before the use of an - * image function factory - * - * According to the image type, the Create method of this class can - * call an ImageFunctionFactory for each band of the input image or - * once if the image type is otb::Image. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TIFFactory, class TInputImage> -class MultiChannelIFFactory -{ -public: - typedef TIFFactory IFFactoryType; - typedef TInputImage InputImageType; - typedef typename IFFactoryType::Pointer IFFactoryPointerType; - typedef typename IFFactoryType::InputImageType ImageType; - typedef typename IFFactoryType::CoordRepType CoordRepType; - typedef typename IFFactoryType::PrecisionType PrecisionType; - typedef typename std::vector<PrecisionType> ParameterContainerType; - typedef typename std::vector<itk::DataObject::Pointer> ImageContainer; - typedef typename MetaImageFunction<PrecisionType>::Pointer MetaIFPointerType; - - typedef ImageList<ImageType> ImageListType; - typedef VectorImageToImageListFilter<InputImageType, - ImageListType> VIToILFilterType; - - void Create(InputImageType * image, - ParameterContainerType param, - MetaIFPointerType metaIF, - ImageContainer * container) - { - m_Factory->Create(image, param, metaIF, container); - } - - MultiChannelIFFactory() - { - m_Factory = IFFactoryType::New(); - } - - virtual ~MultiChannelIFFactory(){}; - -private: - IFFactoryPointerType m_Factory; - -}; - - -template <class TIFFactory, typename TPixel, unsigned int VImageDimension> -class MultiChannelIFFactory<TIFFactory, otb::VectorImage<TPixel, VImageDimension> > -{ -public: - typedef TIFFactory IFFactoryType; - typedef typename IFFactoryType::Pointer IFFactoryPointerType; - typedef typename IFFactoryType::InputImageType ImageType; - typedef typename IFFactoryType::CoordRepType CoordRepType; - typedef typename IFFactoryType::PrecisionType PrecisionType; - typedef VectorImage<TPixel, 2> InputImageType; - - typedef typename std::vector<PrecisionType> ParameterContainerType; - typedef typename std::vector<itk::DataObject::Pointer> ImageContainer; - typedef typename MetaImageFunction<PrecisionType>::Pointer MetaIFPointerType; - - typedef ImageList<ImageType> ImageListType; - typedef VectorImageToImageListFilter<InputImageType, - ImageListType> VIToILFilterType; - - void Create(InputImageType * image, - ParameterContainerType param, - MetaIFPointerType metaIF, - ImageContainer * container) - { - unsigned int nbBand; - typename VIToILFilterType::Pointer filter = VIToILFilterType::New(); - - filter->SetInput(image); - filter->UpdateOutputInformation(); - nbBand = filter->GetOutput()->Size(); - - for (unsigned int i=0; i<nbBand; ++i) - { - filter->GetOutput()->GetNthElement(i)->UpdateOutputInformation(); - m_Factory->Create(filter->GetOutput()->GetNthElement(i), param, metaIF, container); - } - } - - MultiChannelIFFactory() - { - m_Factory = IFFactoryType::New(); - } - - virtual ~MultiChannelIFFactory(){}; - -private: - IFFactoryPointerType m_Factory; - -}; -} //end namespace - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h b/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h deleted file mode 100644 index 01d371d964df9245b8c225f546f4c09429cf1730..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.h +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbObjectDetectionClassifier_h -#define otbObjectDetectionClassifier_h - -#include <vector> -#include <string> - -#include "itkImageRegion.h" -#include "itkFixedArray.h" -#include "itkVariableLengthVector.h" -#include "itkListSample.h" -#include "itkDataObjectDecorator.h" -#include "itkSimpleDataObjectDecorator.h" -#include "itkFunctionBase.h" - -#include "otbVectorData.h" -#include "otbMachineLearningModel.h" -#include "otbPersistentImageFilter.h" -#include "otbPersistentFilterStreamingDecorator.h" - -namespace otb -{ - -template <class TFunctionPrecision> -class DefaultDescriptorType -{ -public: - typedef itk::VariableLengthVector<TFunctionPrecision> Type; -}; - -/** \class PersistentObjectDetectionClassifier - * \brief [internal] Helper class for the implementation of ObjectDetectionClassifier - * with streaming capabilities - * - * This class inherits PersistentImageFilter and provides the Reset/Synthesize functions, - * plus the ThreadedGenerateData function implementing the image function evaluation - * - * - * \ingroup OTBObjectDetection - */ -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -class ITK_EXPORT PersistentObjectDetectionClassifier : - public PersistentImageFilter<TInputImage, TInputImage> -{ -public: - /** Standard Self typedef */ - typedef PersistentObjectDetectionClassifier Self; - typedef PersistentImageFilter<TInputImage, TInputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Runtime information support. */ - itkTypeMacro(PersistentObjectDetectionClassifier, PersistentImageFilter); - - /** Image related typedefs. */ - typedef TInputImage InputImageType; - typedef typename TInputImage::Pointer InputImagePointer; - typedef typename TInputImage::RegionType RegionType; - typedef typename TInputImage::SizeType SizeType; - typedef typename TInputImage::IndexType IndexType; - typedef typename TInputImage::PixelType PixelType; - - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); - - /** Image related typedefs. */ - itkStaticConstMacro(ImageDimension, unsigned int, - TInputImage::ImageDimension); - - /** Smart Pointer type to a DataObject. */ - typedef typename itk::DataObject::Pointer DataObjectPointer; - typedef itk::ProcessObject::DataObjectPointerArraySizeType DataObjectPointerArraySizeType; - - /** Input VectorData */ - typedef TOutputVectorData VectorDataType; - typedef typename VectorDataType::Pointer VectorDataObjectType; - typedef typename VectorDataType::DataNodeType VectorDataNodeType; - typedef typename VectorDataType::DataNodePointerType VectorDataNodePointerType; - typedef typename VectorDataType::DataTreeType VectorDataTreeType; - typedef typename VectorDataType::DataTreePointerType VectorDataTreePointerType; - typedef typename VectorDataNodeType::PointType VectorDataPointType; - typedef typename VectorDataNodeType::LineType VectorDataLineType; - typedef typename VectorDataNodeType::PolygonType VectorDataPolygonType; - typedef itk::PreOrderTreeIterator<VectorDataTreeType> VectorDataTreeIteratorType; - - /** Function type for descriptors extraction */ - typedef TFunctionType DescriptorsFunctionType; - typedef typename DescriptorsFunctionType::Pointer DescriptorsFunctionPointerType; - typedef typename DescriptorsFunctionType::InputType DescriptorsFunctionPointType; - typedef typename DescriptorsFunctionType::OutputType DescriptorType; - typedef typename DescriptorType::ValueType DescriptorPrecision; - - typedef itk::ContinuousIndex - <typename DescriptorsFunctionPointType::ValueType, - itkGetStaticConstMacro(InputImageDimension)> ContinuousIndexType; - - /** TLabel output */ - typedef TLabel LabelType; - typedef MachineLearningModel<DescriptorPrecision, LabelType> ModelType; - typedef typename ModelType::Pointer ModelPointerType; - typedef typename ModelType::InputSampleType ModelMeasurementType; - - typedef itk::Statistics::ListSample<DescriptorType> ListSampleType; - - void AddInput(itk::DataObject * dataObject) override - { - this->Superclass::AddInput(dataObject); - } - - /** learning model used for classification */ - void SetModel(ModelType * model); - - const ModelType* GetModel(void) const; - - VectorDataType* GetOutputVectorData(void); - - /** The function to evaluate */ - itkSetObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - itkGetObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - itkGetConstObjectMacro(DescriptorsFunction, DescriptorsFunctionType); - - itkSetMacro( NeighborhoodRadius, unsigned int ); - itkGetConstReferenceMacro( NeighborhoodRadius, unsigned int ); - - itkGetConstMacro(ClassKey, std::string); - itkSetMacro(ClassKey, std::string); - - itkGetMacro(NoClassLabel, LabelType); - itkSetMacro(NoClassLabel, LabelType); - - /** Set/Get the Shifts for this sample list */ - itkGetMacro(Shifts, DescriptorType); - itkSetMacro(Shifts, DescriptorType); - itkGetMacro(Scales, DescriptorType); - itkSetMacro(Scales, DescriptorType); - - /** Set/Get the grid step for detection */ - itkSetMacro(GridStep, unsigned int); - itkGetMacro(GridStep, unsigned int); - - /** Make a DataObject of the correct type to be used as the specified - * output. */ - itk::DataObject::Pointer MakeOutput(DataObjectPointerArraySizeType idx) override; - using Superclass::MakeOutput; - - void AllocateOutputs() override; - - void GenerateOutputInformation() override; - - void Reset(void) override; - - void Synthetize(void) override; - -protected: - PersistentObjectDetectionClassifier(); - ~PersistentObjectDetectionClassifier() override; - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - void GenerateInputRequestedRegion() override; - - void BeforeThreadedGenerateData() override; - - /** Multi-thread version GenerateData. */ - void ThreadedGenerateData(const RegionType& outputRegionForThread, - itk::ThreadIdType threadId) override; - -private: - PersistentObjectDetectionClassifier(const Self &) = delete; - void operator =(const Self&) = delete; - - template <typename TCoordRepType> - bool - IsInsideWithNeighborhoodRadius(const RegionType& region, const ContinuousIndexType &index) const - { - typedef typename IndexType::IndexValueType IndexValueType; - - for(unsigned int i=0; i<ImageDimension; ++i) - { - if( itk::Math::RoundHalfIntegerUp<IndexValueType>(index[i]) < static_cast<IndexValueType>( region.GetIndex(i) ) + m_NeighborhoodRadius + 1 ) - //Comment this instruction after itkv4 migration (correct - //usage of centered-pixel coordinates) - //if( index[i] < static_cast<TCoordRepType>( region.GetIndex(i) ) + m_NeighborhoodRadius ) - { - return false; - } - // bound is the last valid pixel location - const TCoordRepType bound = static_cast<TCoordRepType>( - region.GetIndex(i) + region.GetSize(i) - 0.5); - //Comment this instruction after itkv4 migration (correct - //usage of centered-pixel coordinates) - //const TCoordRepType bound = static_cast<TCoordRepType>( - // region.GetIndex(i) + static_cast<IndexValueType>(region.GetSize(i)) - 1); - if( index[i] > bound - m_NeighborhoodRadius - 1 ) - { - return false; - } - } - return true; - } - - typedef std::pair<DescriptorsFunctionPointType, LabelType> DetectedPoint; - typedef std::vector<DetectedPoint> PointArray; - typedef std::vector<PointArray> PointArrayContainer; - PointArrayContainer m_ThreadPointArray; - - DescriptorsFunctionPointerType m_DescriptorsFunction; - - unsigned int m_NeighborhoodRadius; - std::string m_ClassKey; - LabelType m_NoClassLabel; - DescriptorType m_Shifts; - DescriptorType m_Scales; - DescriptorType m_InvertedScales; - - /** Step of the detection grid */ - unsigned int m_GridStep; - - /** classification model */ - ModelPointerType m_Model; - -}; - - -/** \class ObjectDetectionClassifier - * \brief This class detects object in an image, given a ML model and a local descriptors function - * - * Given an image (by SetInputImage()), a ML model (by SetModel) and an local descriptors ImageFunction - * (set by SetDescriptorsFunction()), this class computes the local descriptors on a regular grid - * over the image, and evaluates the class label of the corresponding sample. - * It outputs a vector data with the points for which the descriptors are not classified as "negative", - * the negative class label being given by SetNoClassLabel() - * - * This class is streaming capable and multithreaded - * - * \ingroup OTBObjectDetection - */ -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision = double, class TCoordRep = double> -class ITK_EXPORT ObjectDetectionClassifier : - public PersistentFilterStreamingDecorator< - PersistentObjectDetectionClassifier< TInputImage, - TOutputVectorData, - TLabel, - itk::FunctionBase< itk::Point<TCoordRep, 2>, - typename DefaultDescriptorType<TFunctionPrecision>::Type> > - > -{ -public: - /** Standard Self typedef */ - typedef ObjectDetectionClassifier Self; - typedef PersistentFilterStreamingDecorator - < PersistentObjectDetectionClassifier - <TInputImage, - TOutputVectorData, - TLabel, - itk::FunctionBase< itk::Point<TCoordRep, 2>, - typename DefaultDescriptorType<TFunctionPrecision>::Type> > - > Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(ObjectDetectionClassifier, PersistentFilterStreamingDecorator); - - typedef TInputImage InputImageType; - typedef TOutputVectorData OutputVectorDataType; - typedef TLabel LabelType; - typedef TCoordRep CoordRepType; - typedef TFunctionPrecision FunctionPrecision; - - /** The coordinates used when evaluating function */ - typedef itk::Point<TCoordRep, 2> PointType; - - /** The return value of the function */ - typedef typename DefaultDescriptorType<FunctionPrecision>::Type DescriptorType; - - /** The function evaluated on the input image at locations specified by the vector data */ - typedef itk::FunctionBase<PointType, DescriptorType> DescriptorsFunctionType; - typedef typename DescriptorsFunctionType::Pointer DescriptorsFunctionPointerType; - - typedef typename Superclass::FilterType PersistentFilterType; - - typedef typename PersistentFilterType::ModelType ModelType; - typedef typename PersistentFilterType::ModelPointerType ModelPointerType; - - /** Input image to extract feature */ - void SetInputImage(InputImageType* input) - { - this->GetFilter()->SetInput(input); - } - - /** Sample locations as a VectorData of points. The label is in the ClassKey feature */ - OutputVectorDataType* GetOutputVectorData() - { - return this->GetFilter()->GetOutputVectorData(); - } - - void AddInput(itk::DataObject * dataObject) override - { - this->GetFilter()->AddInput(dataObject); - } - - /** The function to evaluate */ - void SetDescriptorsFunction(DescriptorsFunctionType * input) - { - this->GetFilter()->SetDescriptorsFunction(input); - } - - /** The function to evaluate */ - DescriptorsFunctionType * GetDescriptorsFunction() - { - return this->GetFilter()->GetDescriptorsFunction(); - } - - /** The function to evaluate */ - void SetModel(ModelType* model) - { - this->GetFilter()->SetModel(model); - } - - /** The classification model */ - const ModelType* GetModel() - { - return this->GetFilter()->GetModel(); - } - - otbSetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int); - otbGetObjectMemberMacro(Filter, NeighborhoodRadius, unsigned int); - - /** Set/Get the name of the field containing the class information */ - otbGetObjectMemberMacro(Filter, ClassKey, std::string); - otbSetObjectMemberMacro(Filter, ClassKey, std::string); - - /** Set/Get the label of the negative samples */ - otbGetObjectMemberMacro(Filter, NoClassLabel, LabelType); - otbSetObjectMemberMacro(Filter, NoClassLabel, LabelType); - - /** Set/Get the Shifts for this sample list */ - otbGetObjectMemberMacro(Filter, Shifts, DescriptorType); - otbSetObjectMemberMacro(Filter, Shifts, DescriptorType); - - /** Set/Get the Scales for this sample list */ - otbGetObjectMemberMacro(Filter, Scales, DescriptorType); - otbSetObjectMemberMacro(Filter, Scales, DescriptorType); - - /** Set/Get the grid step for detection */ - otbSetObjectMemberMacro(Filter, GridStep, unsigned int); - otbGetObjectMemberMacro(Filter, GridStep, unsigned int); - - - protected: - /** Constructor */ - ObjectDetectionClassifier(); - - /** Destructor */ - ~ObjectDetectionClassifier() override; - - private: - ObjectDetectionClassifier(const Self &) = delete; - void operator =(const Self&) = delete; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbObjectDetectionClassifier.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx b/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx deleted file mode 100644 index 97781629e68ef470e1f35b8aeac6ccb1d273f1dd..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbObjectDetectionClassifier.hxx +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbObjectDetectionClassifier_hxx -#define otbObjectDetectionClassifier_hxx - -#include "otbObjectDetectionClassifier.h" - -#include "itkContinuousIndex.h" - -namespace otb -{ - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::PersistentObjectDetectionClassifier() - : m_NeighborhoodRadius(0), - m_ClassKey("Class"), - m_NoClassLabel(0), - m_GridStep(10) -{ - this->SetNumberOfRequiredInputs(1); - - // Have 2 outputs : the image created by Superclass, a vector data with points - this->SetNumberOfRequiredOutputs(3); - this->itk::ProcessObject::SetNthOutput(1, this->MakeOutput(1).GetPointer()); - this->itk::ProcessObject::SetNthOutput(2, this->MakeOutput(2).GetPointer()); -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::~PersistentObjectDetectionClassifier() -{ -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::AllocateOutputs() -{ - // This is commented to prevent the streaming of the whole image for the first stream strip - // It shall not cause any problem because the output image of this filter is not intended to be used. - //InputImagePointer image = const_cast< TInputImage * >( this->GetInput() ); - //this->GraftOutput( image ); - // Nothing that needs to be allocated for the remaining outputs -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::GenerateOutputInformation() -{ - Superclass::GenerateOutputInformation(); - if (this->GetInput()) - { - this->GetOutput()->CopyInformation(this->GetInput()); - this->GetOutput()->SetLargestPossibleRegion(this->GetInput()->GetLargestPossibleRegion()); - - if (this->GetOutput()->GetRequestedRegion().GetNumberOfPixels() == 0) - { - this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion()); - } - } -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::SetModel(ModelType* model) -{ - if (model != m_Model) - { - m_Model = model; - this->Modified(); - } -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -const typename PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>::ModelType* -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::GetModel(void) const -{ - return m_Model; -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -typename PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType>::VectorDataType* -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::GetOutputVectorData() -{ - return static_cast<VectorDataType*>(this->itk::ProcessObject::GetOutput(1)); -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -itk::DataObject::Pointer -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::MakeOutput(DataObjectPointerArraySizeType idx) -{ - itk::DataObject::Pointer output; - switch (idx) - { - case 0: - output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer()); - break; - case 1: - { - output = static_cast<itk::DataObject*>(VectorDataType::New().GetPointer()); - break; - } - default: - output = static_cast<itk::DataObject*>(InputImageType::New().GetPointer()); - break; - } - return output; -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::Reset() -{ - m_ThreadPointArray = PointArrayContainer(this->GetNumberOfThreads()); - -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::Synthetize() -{ - // merge all points in a single vector data - //std::copy(m_ThreadPointArray[0].begin(), m_ThreadPointArray[0].end(), - //std::ostream_iterator<DescriptorsFunctionPointType>(std::cout, "\n") ); - - VectorDataType* vdata = this->GetOutputVectorData(); - - // Retrieving root node - VectorDataNodePointerType root = vdata->GetDataTree()->GetRoot()->Get(); - // Create the document node - VectorDataNodePointerType document = VectorDataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - VectorDataNodePointerType folder = VectorDataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - vdata->GetDataTree()->Add(document, root); - vdata->GetDataTree()->Add(folder, document); - - for (itk::ThreadIdType threadId = 0; threadId < m_ThreadPointArray.size(); ++threadId) - { - PointArray& pointArray = m_ThreadPointArray[threadId]; - typename PointArray::const_iterator it = pointArray.begin(); - typename PointArray::const_iterator end = pointArray.end(); - - for (; it != end; ++it) - { - VectorDataNodePointerType currentGeometry = VectorDataNodeType::New(); - currentGeometry->SetNodeId("FEATURE_POINT"); - currentGeometry->SetNodeType(otb::FEATURE_POINT); - VectorDataPointType p; - p[0] = it->first[0]; - p[1] = it->first[1]; - currentGeometry->SetPoint(p); - currentGeometry->SetFieldAsInt(m_ClassKey, it->second); - vdata->GetDataTree()->Add(currentGeometry, folder); - } - } -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::GenerateInputRequestedRegion() -{ - Superclass::GenerateInputRequestedRegion(); - - // get pointers to the input and output - typename Superclass::InputImagePointer inputPtr = - const_cast< TInputImage * >( this->GetInput() ); - typename Superclass::OutputImagePointer outputPtr = this->GetOutput(); - - if ( !inputPtr || !outputPtr ) - { - return; - } - - // get a copy of the input requested region (should equal the output - // requested region) - typename TInputImage::RegionType inputRequestedRegion; - inputRequestedRegion = inputPtr->GetRequestedRegion(); - - // pad the input requested region by the operator radius - inputRequestedRegion.PadByRadius( m_NeighborhoodRadius + 1 ); - - // crop the input requested region at the input's largest possible region - if ( inputRequestedRegion.Crop(inputPtr->GetLargestPossibleRegion()) ) - { - inputPtr->SetRequestedRegion( inputRequestedRegion ); - return; - } - else - { - // Couldn't crop the region (requested region is outside the largest - // possible region). Throw an exception. - - // store what we tried to request (prior to trying to crop) - inputPtr->SetRequestedRegion( inputRequestedRegion ); - } -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::BeforeThreadedGenerateData() -{ - // Compute the 1/(sigma) vector - m_InvertedScales = m_Scales; - for(unsigned int idx = 0; idx < m_Scales.Size(); ++idx) - { - if(m_Scales[idx]-1e-10 < 0.) - m_InvertedScales[idx] = 0.; - else - m_InvertedScales[idx] = 1 / m_Scales[idx]; - } - -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionType> -void -PersistentObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionType> -::ThreadedGenerateData(const RegionType& outputRegionForThread, - itk::ThreadIdType threadId) -{ - InputImageType* input = static_cast<InputImageType*>(this->itk::ProcessObject::GetInput(0)); - const ModelType* model = this->GetModel(); - - IndexType begin = outputRegionForThread.GetIndex(); - IndexType end = begin; - end[0] += outputRegionForThread.GetSize(0); - end[1] += outputRegionForThread.GetSize(1); - - IndexType current = begin; - for (; current[1] != end[1]; current[1]++) - { - if (current[1] % m_GridStep == 0) - { - for(current[0] = begin[0]; current[0] != end[0]; current[0]++) - { - if (current[0] % m_GridStep == 0) - { - DescriptorsFunctionPointType point; - input->TransformIndexToPhysicalPoint(current, point); - - DescriptorType descriptor = m_DescriptorsFunction->Evaluate(point); - ModelMeasurementType modelMeasurement(descriptor.GetSize()); - for (unsigned int i = 0; i < descriptor.GetSize(); ++i) - { - modelMeasurement[i] = (descriptor[i] - m_Shifts[i]) * m_InvertedScales[i]; - } - LabelType label = (model->Predict(modelMeasurement))[0]; - - if (label != m_NoClassLabel) - { - m_ThreadPointArray[threadId].push_back(std::make_pair(point, label)); - } - } - } - } - } -} - - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision, class TCoordRep> -ObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionPrecision, TCoordRep> -::ObjectDetectionClassifier() -{ - -} - -template <class TInputImage, class TOutputVectorData, class TLabel, class TFunctionPrecision, class TCoordRep> -ObjectDetectionClassifier<TInputImage, TOutputVectorData, TLabel, TFunctionPrecision, TCoordRep> -::~ObjectDetectionClassifier() -{ - -} - - -} // end namespace otb - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h b/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h deleted file mode 100644 index a40dfbed7341939bc664d29410bebf526de9d640..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRadiometricMomentsIFFactory_h -#define otbRadiometricMomentsIFFactory_h - -#include "itkLightObject.h" - -#include "otbMetaImageFunction.h" -#include "itkDataObject.h" -#include "otbImage.h" -#include "otbImageFunctionAdaptor.h" -#include "otbRadiometricMomentsImageFunction.h" - - -namespace otb -{ -/** \class RadiometricMomentsIFFactory - * \brief add a RadiometricMoments image function to a - * MetaImageFunction - * - * This class aims at adding an adapted - * RadiometricMomentsImageFunction to an existing MetaImageFunction - * through the method Create. - * - * - * \ingroup OTBObjectDetection - */ - -template <class TImageType, class TCoordRep = double, class TPrecision = double> -class ITK_EXPORT RadiometricMomentsIFFactory : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef RadiometricMomentsIFFactory Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(RadiometricMomentsIFFactory, itk::LightObject); - - // Input and output typedef - typedef TImageType InputImageType; - typedef TCoordRep CoordRepType; - typedef TPrecision PrecisionType; - - // Other typedef - typedef typename MetaImageFunction<TPrecision>::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<PrecisionType> ParamContainerType; - typedef RadiometricMomentsImageFunction<InputImageType, CoordRepType> - RadiometricMomentsIF; - typedef ImageFunctionAdaptor<RadiometricMomentsIF, TPrecision> - AdaptedRadiometricMomentsIF; - - void Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container); - -protected: - RadiometricMomentsIFFactory(){} - ~RadiometricMomentsIFFactory() override{} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - RadiometricMomentsIFFactory(const Self& ) = delete; - void operator=(const Self& ) = delete; - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRadiometricMomentsIFFactory.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx b/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx deleted file mode 100644 index 18f0bc730a5b998d856e8052d63a289075c1e2d9..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbRadiometricMomentsIFFactory.hxx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRadiometricMomentsIFFactory_hxx -#define otbRadiometricMomentsIFFactory_hxx - -#include "otbRadiometricMomentsIFFactory.h" - - -namespace otb -{ -template <class TImageType, class TCoordRep, class TPrecision> -void -RadiometricMomentsIFFactory<TImageType, TCoordRep, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TImageType, class TCoordRep, class TPrecision> -void -RadiometricMomentsIFFactory<TImageType, TCoordRep, TPrecision> -::Create(InputImageType * image, - ParamContainerType param, - MetaImageFunctionPointerType metaIF, - DataObjectContainerType * container) -{ - typename AdaptedRadiometricMomentsIF::Pointer function = AdaptedRadiometricMomentsIF::New(); - - function->SetInputImage(image); - function->GetInternalImageFunction()->SetNeighborhoodRadius(param[0]); - - metaIF->AddFunction(function); - container->push_back(image); -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h b/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h deleted file mode 100644 index 4ff7757898791d4a8a4324f3ecbce7f1429868d4..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbStandardMetaImageFunctionBuilder_h -#define otbStandardMetaImageFunctionBuilder_h - - -#include "itkVariableLengthVector.h" - -#include "otbMultiChannelIFFactory.h" - -#include "otbLocalHistogramIFFactory.h" -#include "otbFlusserMomentsIFFactory.h" -#include "otbRadiometricMomentsIFFactory.h" -#include "otbFourierMellinDescriptorsIFFactory.h" -#include "otbHaralickTexturesIFFactory.h" - - -namespace otb -{ -/** \class StandardMetaImageFunctionBuilder - * \brief Build a Standard MetaImageFunction - * - * The StandardMetaImageFunctionBuilder class allows calling multiple - * ImageFunctions: - * - otbRadiometricMomentsImageFunction - * - otbFlusserMomentsImageFunction - * - otbFourierMellinDescriptorsImageFunction - * - otbLocalHistogramImageFunction - * On Multiple Images (and VectorImages Processed as ImageList). - * - * Each ImageFunction can be parametrized. The only thing to do to - * complete the MetaImageFunction is to AddImages. - * - * - * - * - * \ingroup OTBObjectDetection - */ - -template <class TPrecision = double, class TCoordRep = double> -class ITK_EXPORT StandardMetaImageFunctionBuilder : - public itk::LightObject -{ -public: - /** Standard class typedefs. */ - typedef StandardMetaImageFunctionBuilder Self; - typedef itk::LightObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - // New macro - itkNewMacro(Self); - - // RTTI typeinfo - itkTypeMacro(StandardMetaImageFunctionBuilder, itk::LightObject); - - // Input and output typedef - typedef TPrecision ValueType; - typedef TCoordRep CoordRepType; - - // Other typedef - typedef MetaImageFunction<TPrecision, CoordRepType> MetaImageFunctionType; - typedef typename MetaImageFunctionType::Pointer MetaImageFunctionPointerType; - typedef typename std::vector<itk::DataObject::Pointer> DataObjectContainerType; - typedef typename std::vector<ValueType> ParamContainerType; - - //Accessors - unsigned int GetNeighborhoodRadius(); - void SetNeighborhoodRadius(unsigned int radius); - - ParamContainerType GetFlusserMomentsIFParameters(); - void SetFlusserMomentsIFParameters(ParamContainerType Param); - - ParamContainerType GetLocalHistogramIFParameters(); - void SetLocalHistogramIFParameters(ParamContainerType Param); - - ParamContainerType GetRadiometricMomentsIFParameters(); - void SetRadiometricMomentsIFParameters(ParamContainerType Param); - - ParamContainerType GetFourierMellinDescriptorsIFParameters(); - void SetFourierMellinDescriptorsIFParameters(ParamContainerType Param); - - ParamContainerType GetHaralickTexturesIFParameters(); - void SetHaralickTexturesIFParameters(ParamContainerType Param); - - MetaImageFunctionPointerType GetMetaImageFunction(); - DataObjectContainerType GetDataObjectContainer(); - - // Adding Image - template <class TInputImage> - void AddImage(TInputImage * image) - { - typedef TInputImage InputImageType; - typedef typename InputImageType::InternalPixelType InternalPixelType; - typedef Image<InternalPixelType, 2> ImageType; - - //Mono-Channel Factories - typedef LocalHistogramIFFactory<ImageType, - CoordRepType, TPrecision> LocalHistogramIFFactoryType; - typedef FlusserMomentsIFFactory<ImageType, - CoordRepType, TPrecision> FlusserMomentsIFFactoryType; - typedef RadiometricMomentsIFFactory<ImageType, - CoordRepType, TPrecision> RadiometricMomentsIFFactoryType; - typedef FourierMellinDescriptorsIFFactory<ImageType, - CoordRepType, TPrecision> FourierMellinDescriptorsIFFactoryType; - typedef HaralickTexturesIFFactory<ImageType, - CoordRepType, TPrecision> HaralickTexturesIFFactoryType; - - //Multi-Channel Factories - typedef MultiChannelIFFactory<LocalHistogramIFFactoryType, InputImageType> - MCLocalHistogramIFFactoryType; - typedef MultiChannelIFFactory<FlusserMomentsIFFactoryType, InputImageType> - MCFlusserMomentsIFFactoryType; - typedef MultiChannelIFFactory<RadiometricMomentsIFFactoryType, InputImageType> - MCRadiometricMomentsIFFactoryType; - typedef MultiChannelIFFactory<FourierMellinDescriptorsIFFactoryType, InputImageType> - MCFourierMellinDescriptorsIFFactoryType; - typedef MultiChannelIFFactory<HaralickTexturesIFFactoryType, InputImageType> - MCHaralickTexturesIFFactoryType; - - MCLocalHistogramIFFactoryType MCLocalHistogramIFFactory; - MCFlusserMomentsIFFactoryType MCFlusserMomentsIFFactory; - MCRadiometricMomentsIFFactoryType MCRadiometricMomentsIFFactory; - MCFourierMellinDescriptorsIFFactoryType MCFourierMellinDescriptorsIFFactory; - MCHaralickTexturesIFFactoryType MCHaralickTexturesIFFactory; - - - MCRadiometricMomentsIFFactory.Create(image, - this->GetRadiometricMomentsIFParameters(), - m_MetaImageFunction, - &m_DataObjectContainer); - MCFlusserMomentsIFFactory.Create(image, - this->GetFlusserMomentsIFParameters(), - m_MetaImageFunction, - &m_DataObjectContainer); - - MCFourierMellinDescriptorsIFFactory.Create(image, - this->GetFourierMellinDescriptorsIFParameters(), - m_MetaImageFunction, - &m_DataObjectContainer); - - //MCLocalHistogramIFFactory.Create(image, - // m_LocalHistogramParam, - // m_MetaImageFunction, - // &m_DataObjectContainer); - - //MCHaralickTexturesIFFactory.Create(image, - // m_HaralickTexturesParam, - // m_MetaImageFunction, - // &m_DataObjectContainer); - } - -protected: - StandardMetaImageFunctionBuilder(); - ~StandardMetaImageFunctionBuilder() override; - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - StandardMetaImageFunctionBuilder(const Self& ) = delete; - void operator=(const Self& ) = delete; - - MetaImageFunctionPointerType m_MetaImageFunction; - DataObjectContainerType m_DataObjectContainer; - unsigned int m_NeighborhoodRadius; - ParamContainerType m_FlusserMomentsParam; //[NeighborhoodRadius] - ParamContainerType m_RadiometricMomentsParam; //[NeighborhoodRadius] - ParamContainerType m_LocalHistogramParam; //[NeighborhoodRadius; nbBins; minHistogram; maxHistogram] - ParamContainerType m_FourierMellinDescriptorsParam; //[NeighborhoodRadius; PMax; QMax] - ParamContainerType m_HaralickTexturesParam; //[NeighborhoodRadius; ImageMin; ImageMax; NbBinPerAxis; Offset] - -}; - -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbStandardMetaImageFunctionBuilder.hxx" -#endif - -#endif diff --git a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx b/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx deleted file mode 100644 index 27313af0c10e0cc27a1b56e0915ba747c374a79f..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/include/otbStandardMetaImageFunctionBuilder.hxx +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbStandardMetaImageFunctionBuilder_hxx -#define otbStandardMetaImageFunctionBuilder_hxx - -#include "otbStandardMetaImageFunctionBuilder.h" - - -namespace otb -{ -template <class TPrecision, class TCoordRep> -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::StandardMetaImageFunctionBuilder() -{ - m_NeighborhoodRadius = 4; - - m_MetaImageFunction = MetaImageFunctionType::New(); - - m_FlusserMomentsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius())); - - m_RadiometricMomentsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius())); - - m_LocalHistogramParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius())); - m_LocalHistogramParam.push_back(16); - m_LocalHistogramParam.push_back(0); - m_LocalHistogramParam.push_back(4096); - - m_FourierMellinDescriptorsParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius())); - m_FourierMellinDescriptorsParam.push_back(3); - m_FourierMellinDescriptorsParam.push_back(3); - - m_HaralickTexturesParam.push_back(static_cast<ValueType>(this->GetNeighborhoodRadius())); - m_HaralickTexturesParam.push_back(0); - m_HaralickTexturesParam.push_back(4096); - m_HaralickTexturesParam.push_back(30); - m_HaralickTexturesParam.push_back(2); -} - -template <class TPrecision, class TCoordRep> -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::~StandardMetaImageFunctionBuilder() -{ - -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template <class TPrecision, class TCoordRep> -unsigned int -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetNeighborhoodRadius() -{ - return m_NeighborhoodRadius; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetNeighborhoodRadius(unsigned int radius) -{ - if (radius>0) - { - m_NeighborhoodRadius = radius; - - m_FlusserMomentsParam[0] = static_cast<ValueType>(radius); - m_RadiometricMomentsParam[0] = static_cast<ValueType>(radius); - m_LocalHistogramParam[0] = static_cast<ValueType>(radius); - m_FourierMellinDescriptorsParam[0] = static_cast<ValueType>(radius); - m_HaralickTexturesParam[0] = static_cast<ValueType>(radius); - } -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetFlusserMomentsIFParameters() -{ - return m_FlusserMomentsParam; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetFlusserMomentsIFParameters(ParamContainerType Param) -{ - if (Param.size()==1) - { - m_FlusserMomentsParam[0] = Param[0]; - } -} - - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetLocalHistogramIFParameters() -{ - return m_LocalHistogramParam; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetLocalHistogramIFParameters(ParamContainerType Param) -{ - if (Param.size()==4) - { - m_LocalHistogramParam[0] = Param[0]; - m_LocalHistogramParam[1] = Param[1]; - m_LocalHistogramParam[2] = Param[2]; - m_LocalHistogramParam[3] = Param[3]; - } -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetRadiometricMomentsIFParameters() -{ - return m_RadiometricMomentsParam; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetRadiometricMomentsIFParameters(ParamContainerType Param) -{ - if (Param.size()==1) - { - m_RadiometricMomentsParam[0] = Param[0]; - } -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetFourierMellinDescriptorsIFParameters() -{ - return m_FourierMellinDescriptorsParam; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetFourierMellinDescriptorsIFParameters(ParamContainerType Param) -{ - if (Param.size()==3) - { - m_FourierMellinDescriptorsParam[0] = Param[0]; - m_FourierMellinDescriptorsParam[1] = Param[1]; - m_FourierMellinDescriptorsParam[2] = Param[2]; - } -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::ParamContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetHaralickTexturesIFParameters() -{ - return m_HaralickTexturesParam; -} - -template <class TPrecision, class TCoordRep> -void -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::SetHaralickTexturesIFParameters(ParamContainerType Param) -{ - if (Param.size()==5) - { - m_HaralickTexturesParam[0] = Param[0]; - m_HaralickTexturesParam[1] = Param[1]; - m_HaralickTexturesParam[2] = Param[2]; - m_HaralickTexturesParam[3] = Param[3]; - m_HaralickTexturesParam[4] = Param[4]; - } -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::MetaImageFunctionPointerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetMetaImageFunction() -{ - return m_MetaImageFunction; -} - -template <class TPrecision, class TCoordRep> -typename StandardMetaImageFunctionBuilder<TPrecision, TCoordRep>::DataObjectContainerType -StandardMetaImageFunctionBuilder<TPrecision, TCoordRep> -::GetDataObjectContainer() -{ - return m_DataObjectContainer; -} - -}//end namespace -#endif diff --git a/Modules/Detection/ObjectDetection/otb-module.cmake b/Modules/Detection/ObjectDetection/otb-module.cmake deleted file mode 100644 index 5033f185dab2dc5e272c9fa280517f193a8cacfe..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/otb-module.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "This module contains useful classes for object detection.") - -otb_module(OTBObjectDetection - DEPENDS - OTBCommon - OTBDescriptors - OTBITK - OTBImageBase - OTBMoments - OTBObjectList - OTBStatistics - OTBStreaming - OTBSupervised - OTBTextures - OTBVectorDataBase - - TEST_DEPENDS - OTBIOXML - OTBImageIO - OTBLibSVM - OTBTestKernel - OTBVectorDataIO - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Detection/ObjectDetection/test/CMakeLists.txt b/Modules/Detection/ObjectDetection/test/CMakeLists.txt deleted file mode 100644 index 14989ab892c009f4f2ddbc0a61ac0d650ad74509..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/CMakeLists.txt +++ /dev/null @@ -1,117 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBObjectDetectionTests -otbObjectDetectionTestDriver.cxx -otbLabeledSampleLocalizationGenerator.cxx -otbStandardMetaImageFunctionBuilder.cxx -otbDescriptorsListSampleGenerator.cxx -otbObjectDetectionClassifier.cxx -) - -add_executable(otbObjectDetectionTestDriver ${OTBObjectDetectionTests}) -target_link_libraries(otbObjectDetectionTestDriver ${OTBObjectDetection-Test_LIBRARIES}) -otb_module_target_label(otbObjectDetectionTestDriver) - -# Tests Declaration - - -otb_add_test(NAME odTvLabeledSampleLocalizationGenerator COMMAND otbObjectDetectionTestDriver - --compare-ogr ${NOTOL} - ${BASELINE_FILES}/TvLabeledSampleLocalizationGeneratorOutput.shp - ${TEMP}/TvLabeledSampleLocalizationGeneratorOutput.shp - otbLabeledSampleLocalizationGenerator - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01LabeledPoints.shp - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Polygons.shp - ${TEMP}/TvLabeledSampleLocalizationGeneratorOutput.shp - ) - - -otb_add_test(NAME odTvStandardMetaImageFunctionBuilder COMMAND otbObjectDetectionTestDriver - otbStandardMetaImageFunctionBuilder - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01.tif - ) - -otb_add_test(NAME odTvDescriptorsListSampleGeneratorStreaming COMMAND otbObjectDetectionTestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt - ${TEMP}/TvDescriptorsListSampleGeneratorStreamingOutput.txt - otbDescriptorsListSampleGenerator - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp - ${TEMP}/TvDescriptorsListSampleGeneratorStreamingOutput.txt - 50 # streaming - 5 # neighborhood radius - ) - -#otb_add_test(NAME odTvDescriptorsSVMModelCreation COMMAND otbObjectDetectionTestDriver - #--compare-ascii ${NOTOL} - #${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm - #${TEMP}/TvDescriptorsSVMModelCreation.svm - #otbDescriptorsSVMModelCreation - #${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif - #${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp - #${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml - #${TEMP}/TvDescriptorsSVMModelCreation.svm - #0 # streaming - #5 # neighborhood radius - #) - -otb_add_test(NAME odTvDescriptorsListSampleGeneratorNoStreaming COMMAND otbObjectDetectionTestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt - ${TEMP}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt - otbDescriptorsListSampleGenerator - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_amplitude.tif - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Samples.shp - ${TEMP}/TvDescriptorsListSampleGeneratorNoStreamingOutput.txt - 0 # streaming - 5 # neighborhood radius - ) - - - -otb_add_test(NAME odTvObjectDetectionClassifierStreaming COMMAND otbObjectDetectionTestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/TvObjectDetectionClassifierOutput.txt - ${TEMP}/TvObjectDetectionClassifierOutputStreaming.txt - otbObjectDetectionClassifier - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif - ${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml - ${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm - ${TEMP}/TvObjectDetectionClassifierOutputStreaming.txt - 50 # streaming - 5 # neighborhood radius - ) - -otb_add_test(NAME odTvObjectDetectionClassifier COMMAND otbObjectDetectionTestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/TvObjectDetectionClassifierOutput.txt - ${TEMP}/TvObjectDetectionClassifierOutput.txt - otbObjectDetectionClassifier - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01_extract_amplitude.tif - ${INPUTDATA}/ObjectReco/Boats/FeatureStats_RadiometricMoments_amplitude.xml - ${BASELINE_FILES}/TvDescriptorsSVMModelCreation.svm - ${TEMP}/TvObjectDetectionClassifierOutput.txt - 0 # streaming - 5 # neighborhood radius - ) diff --git a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx b/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx deleted file mode 100644 index ac0e7c21549ee6a301db2fddd7a745d51b00ce38..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/otbDescriptorsListSampleGenerator.cxx +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -#include <iterator> - -#include "otbImage.h" -#include "otbRadiometricMomentsImageFunction.h" -#include "otbDescriptorsListSampleGenerator.h" -#include "otbImageFileReader.h" -#include "otbVectorDataFileReader.h" -#include "otbImageFunctionAdaptor.h" - -#include "otbStatisticsXMLFileReader.h" -#include "otbShiftScaleSampleListFilter.h" -#include "otbLibSVMMachineLearningModel.h" - -const unsigned int Dimension = 2; -typedef int LabelType; -typedef double PixelType; -typedef double FunctionPrecisionType; -typedef double CoordRepType; - -typedef otb::Image<PixelType, Dimension> ImageType; -typedef otb::VectorData<> VectorDataType; -typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType> FunctionType; -typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType> AdaptedFunctionType; - -typedef itk::VariableLengthVector<FunctionPrecisionType> SampleType; -typedef itk::Statistics::ListSample<SampleType> ListSampleType; -typedef itk::FixedArray<LabelType, 1> LabelSampleType; -typedef itk::Statistics::ListSample<LabelSampleType> LabelListSampleType; - -typedef otb::DescriptorsListSampleGenerator - < ImageType, - VectorDataType, - ListSampleType, - LabelType, - FunctionPrecisionType, - CoordRepType > DescriptorsListSampleGeneratorType; - -typedef otb::ImageFileReader<ImageType> ImageReaderType; -typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - -typedef otb::StatisticsXMLFileReader<SampleType> StatisticsReader; -typedef otb::Statistics::ShiftScaleSampleListFilter<ListSampleType> ShiftScaleListSampleFilterType; - -typedef otb::LibSVMMachineLearningModel<FunctionPrecisionType, LabelType> SVMType; - -typedef FunctionType::PointType PointType; -typedef DescriptorsListSampleGeneratorType::SamplesPositionType SamplesPositionType; - -struct SampleEntry -{ - PointType position; - LabelType label; - SampleType measurement; -}; - -struct CompareSampleEntry -{ - bool operator () (SampleEntry p, SampleEntry q) - { - // order with the y axis position - if (p.position[1] < q.position[1]) - return true; - if (p.position[1] > q.position[1]) - return false; - - // If one the same line, - // order with the x axis position - if (p.position[0] < q.position[0]) - return true; - - return false; - } -}; - -std::ostream &operator<<(std::ostream &stream, SampleEntry entry) -{ - stream << "---" << std::endl - << "Label : " << entry.label << std::endl - << "Position : " << entry.position << std::endl - << "Measurements : " << entry.measurement; - return stream; -} - - -int otbDescriptorsListSampleGenerator(int argc, char* argv[]) -{ - if (argc != 6) - { - std::cerr << "Wrong number of arguments" << std::endl; - return EXIT_FAILURE; - } - - const char* inputImageFileName = argv[1]; - const char* inputSamplesLocation = argv[2]; - const char* outputFileName = argv[3]; - int streaming = atoi(argv[4]); - int neighborhood = atoi(argv[5]); - - ImageReaderType::Pointer imageReader = ImageReaderType::New(); - imageReader->SetFileName(inputImageFileName); - - VectorDataReaderType::Pointer vectorDataReader = VectorDataReaderType::New(); - vectorDataReader->SetFileName(inputSamplesLocation); - - //imageReader->Update(); - //vectorDataReader->Update(); - - AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New(); - descriptorsFunction->SetInputImage(imageReader->GetOutput()); - descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(5); - - DescriptorsListSampleGeneratorType::Pointer descriptorsGenerator = DescriptorsListSampleGeneratorType::New(); - descriptorsGenerator->SetInputImage(imageReader->GetOutput()); - descriptorsGenerator->SetSamplesLocations(vectorDataReader->GetOutput()); - descriptorsGenerator->SetDescriptorsFunction(descriptorsFunction.GetPointer()); - descriptorsGenerator->SetNeighborhoodRadius(neighborhood); - descriptorsGenerator->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming ); - descriptorsGenerator->Update(); - - ListSampleType::Pointer samples = descriptorsGenerator->GetListSample(); - LabelListSampleType::Pointer labels = descriptorsGenerator->GetLabelListSample(); - SamplesPositionType& positions = descriptorsGenerator->GetSamplesPositions(); - - ListSampleType::Iterator sampleIt = samples->Begin(); - LabelListSampleType::Iterator labelIt = labels->Begin(); - SamplesPositionType::const_iterator posIt = positions.begin(); - - ListSampleType::Iterator sampleEnd = samples->End(); - LabelListSampleType::Iterator labelEnd = labels->End(); - SamplesPositionType::const_iterator posEnd = positions.end(); - - std::vector<SampleEntry> entries; - - while (sampleIt != sampleEnd && labelIt != labelEnd && posIt != posEnd) - { - SampleEntry entry; - entry.position = *posIt; - entry.label = labelIt.GetMeasurementVector()[0]; - entry.measurement = sampleIt.GetMeasurementVector(); - - entries.push_back(entry); - - ++sampleIt; - ++labelIt; - ++posIt; - } - - std::sort(entries.begin(), entries.end(), CompareSampleEntry()); - std::ofstream file(outputFileName); - std::copy(entries.begin(), entries.end(), std::ostream_iterator<SampleEntry>(file, "\n")); - file.close(); - - return EXIT_SUCCESS; -} - - - -int otbDescriptorsSVMModelCreation(int argc, char* argv[]) -{ - if (argc != 7) - { - std::cerr << "Wrong number of arguments" << std::endl; - return EXIT_FAILURE; - } - - const char* inputImageFileName = argv[1]; - const char* inputSamplesLocation = argv[2]; - const char* featureStatisticsFileName = argv[3]; - const char* outputFileName = argv[4]; - int streaming = atoi(argv[5]); - int neighborhood = atoi(argv[6]); - - ImageReaderType::Pointer imageReader = ImageReaderType::New(); - imageReader->SetFileName(inputImageFileName); - - VectorDataReaderType::Pointer vectorDataReader = VectorDataReaderType::New(); - vectorDataReader->SetFileName(inputSamplesLocation); - - //imageReader->Update(); - //vectorDataReader->Update(); - - AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New(); - descriptorsFunction->SetInputImage(imageReader->GetOutput()); - descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood); - - DescriptorsListSampleGeneratorType::Pointer descriptorsGenerator = DescriptorsListSampleGeneratorType::New(); - descriptorsGenerator->SetInputImage(imageReader->GetOutput()); - descriptorsGenerator->SetSamplesLocations(vectorDataReader->GetOutput()); - descriptorsGenerator->SetDescriptorsFunction(descriptorsFunction.GetPointer()); - descriptorsGenerator->SetNeighborhoodRadius(5); - descriptorsGenerator->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming ); - descriptorsGenerator->Update(); - - // Normalize the samples - // Read the mean and variance form the XML file - StatisticsReader::Pointer statisticsReader = StatisticsReader::New(); - statisticsReader->SetFileName(featureStatisticsFileName); - SampleType meanMeasurentVector = statisticsReader->GetStatisticVectorByName("mean"); - SampleType varianceMeasurentVector = statisticsReader->GetStatisticVectorByName("stddev"); - - // Shift scale the samples - ShiftScaleListSampleFilterType::Pointer shiftscaleFilter = ShiftScaleListSampleFilterType::New(); - shiftscaleFilter->SetInput(descriptorsGenerator->GetListSample()); - shiftscaleFilter->SetShifts(meanMeasurentVector); - shiftscaleFilter->SetScales(varianceMeasurentVector); - shiftscaleFilter->Update(); - - SVMType::Pointer svmEstimator = SVMType::New(); - svmEstimator->SetInputListSample(shiftscaleFilter->GetOutput()); - svmEstimator->SetTargetListSample(descriptorsGenerator->GetLabelListSample()); - svmEstimator->Train(); - svmEstimator->Save(outputFileName); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx b/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx deleted file mode 100644 index 5497da01d457c7889ac52c691c5e59cdd535201f..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/otbLabeledSampleLocalizationGenerator.cxx +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" -#include "otbLabeledSampleLocalizationGenerator.h" - - -int otbLabeledSampleLocalizationGenerator(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD1 = argv[1]; - const char * inputVD2 = argv[2]; - const char * outputVD = argv[3]; - - typedef otb::VectorData<> VectorDataType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef otb::LabeledSampleLocalizationGenerator<VectorDataType> GeneratorType; - - // instantiation - VectorDataReaderType::Pointer reader1 = VectorDataReaderType::New(); - VectorDataReaderType::Pointer reader2 = VectorDataReaderType::New(); - VectorDataWriterType::Pointer writer = VectorDataWriterType::New(); - GeneratorType::Pointer generator = GeneratorType::New(); - - reader1->SetFileName(inputVD1); - //reader1->Update(); - - reader2->SetFileName(inputVD2); - //reader2->Update(); - - generator->PushBackInput(reader1->GetOutput()); - generator->PushBackInput(reader2->GetOutput()); - - generator->SetSeed(0); // enable reproducible random number sequence - generator->SetClassKey("Class"); - generator->SetNoClassIdentifier(0); - generator->SetInhibitionRadius(5); - generator->SetRandomLocalizationDensity(0.004); - generator->SetNbMaxIteration(1000); - generator->SetNumberOfPositiveSamplesPerPoint(2); - - //generator->Update(); - - writer->SetFileName(outputVD); - writer->SetInput(generator->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx b/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx deleted file mode 100644 index ee37856db93074bef43637baea584286c4b2959a..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/otbObjectDetectionClassifier.cxx +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include <iostream> -#include <iterator> - -#include "otbImage.h" -#include "otbRadiometricMomentsImageFunction.h" -#include "itkListSample.h" -#include "itkVariableLengthVector.h" -#include "otbObjectDetectionClassifier.h" -#include "otbImageFileReader.h" -#include "otbImageFunctionAdaptor.h" -#include "otbStatisticsXMLFileReader.h" -#include "itkPreOrderTreeIterator.h" -#include "otbLibSVMMachineLearningModel.h" - -const unsigned int Dimension = 2; -typedef int LabelType; -typedef double PixelType; -typedef double FunctionPrecisionType; -typedef double CoordRepType; - -typedef otb::Image<PixelType, Dimension> ImageType; -typedef otb::VectorData<> VectorDataType; -typedef VectorDataType::PointType PointType; -typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> TreeIteratorType; - -typedef otb::ObjectDetectionClassifier - < ImageType, - VectorDataType, - LabelType, - FunctionPrecisionType, - CoordRepType > ObjectDetectionClassifierType; - -typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType> FunctionType; -typedef otb::ImageFunctionAdaptor<FunctionType, FunctionPrecisionType> AdaptedFunctionType; - -typedef otb::ImageFileReader<ImageType> ImageReaderType; - -typedef otb::LibSVMMachineLearningModel<PixelType,LabelType> SVMModelType; -typedef SVMModelType::Pointer SVMModelPointerType; - -typedef otb::StatisticsXMLFileReader<AdaptedFunctionType::OutputType> StatisticsXMLFileReaderType; - - -struct ComparePoint -{ - bool operator () (PointType p, PointType q) - { - // order with the y axis position - if (p[1] < q[1]) - return true; - if (p[1] > q[1]) - return false; - - // If one the same line, - // order with the x axis position - if (p[0] < q[0]) - return true; - - return false; - } -}; - -std::ostream &operator<<(std::ostream &stream, PointType p) -{ - stream << p[0] << " " << p[1]; - return stream; -} - - - -int otbObjectDetectionClassifier(int argc, char* argv[]) -{ - if (argc != 7) - { - std::cerr << "Wrong number of arguments" << std::endl; - return EXIT_FAILURE; - } - - const char* inputImageFileName = argv[1]; - const char* inputFeatureStats = argv[2]; - const char* inputSVMModel = argv[3]; - const char* outputVectorDataFileName = argv[4]; - int streaming = atoi(argv[5]); - int neighborhood = atoi(argv[6]); - - ImageReaderType::Pointer imageReader = ImageReaderType::New(); - imageReader->SetFileName(inputImageFileName); - - StatisticsXMLFileReaderType::Pointer statisticsReader = StatisticsXMLFileReaderType::New(); - statisticsReader->SetFileName(inputFeatureStats); - - - SVMModelPointerType svmModel = SVMModelType::New(); - svmModel->Load(inputSVMModel); - - AdaptedFunctionType::Pointer descriptorsFunction = AdaptedFunctionType::New(); - descriptorsFunction->SetInputImage(imageReader->GetOutput()); - descriptorsFunction->GetInternalImageFunction()->SetNeighborhoodRadius(neighborhood); - - ObjectDetectionClassifierType::Pointer classifier = ObjectDetectionClassifierType::New(); - classifier->SetInputImage(imageReader->GetOutput()); - classifier->SetNeighborhoodRadius(neighborhood); - classifier->SetModel(svmModel); - classifier->SetDescriptorsFunction(descriptorsFunction); - classifier->SetNoClassLabel(0); - classifier->SetClassKey("Class"); - classifier->SetShifts(statisticsReader->GetStatisticVectorByName("mean")); - classifier->SetScales(statisticsReader->GetStatisticVectorByName("stddev")); - classifier->GetStreamer()->SetNumberOfLinesStrippedStreaming( streaming ); - classifier->SetGridStep(neighborhood/2); - classifier->Update(); - - std::vector<ObjectDetectionClassifierType::PointType> points; - VectorDataType::Pointer vectorData = classifier->GetOutputVectorData(); - - TreeIteratorType itVector(vectorData->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPointFeature()) - { - points.push_back(itVector.Get()->GetPoint()); - } - ++itVector; - } - - std::sort(points.begin(), points.end(), ComparePoint()); - std::ofstream file(outputVectorDataFileName); - std::copy(points.begin(), points.end(), std::ostream_iterator<PointType>(file, "\n")); - file.close(); - - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx b/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx deleted file mode 100644 index 3d7686897dff2f713650bcf46755b97571e1b22a..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/otbObjectDetectionTestDriver.cxx +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbLabeledSampleLocalizationGenerator); - REGISTER_TEST(otbStandardMetaImageFunctionBuilder); - REGISTER_TEST(otbDescriptorsListSampleGenerator); - REGISTER_TEST(otbDescriptorsSVMModelCreation); - REGISTER_TEST(otbObjectDetectionClassifier); -} diff --git a/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx b/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx deleted file mode 100644 index 5ac5d938059ae6671036b2e206ca820c3d17ebf2..0000000000000000000000000000000000000000 --- a/Modules/Detection/ObjectDetection/test/otbStandardMetaImageFunctionBuilder.cxx +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbStandardMetaImageFunctionBuilder.h" -#include "otbVectorImage.h" -#include "otbImageFileReader.h" - -#include "otbImageFunctionAdaptor.h" -#include "otbFlusserMomentsImageFunction.h" -#include "otbRadiometricMomentsImageFunction.h" -#include "otbFourierMellinDescriptorsImageFunction.h" -#include "otbLocalHistogramImageFunction.h" -#include "otbHaralickTexturesImageFunction.h" - - - -int otbStandardMetaImageFunctionBuilder(int itkNotUsed(argc), char* argv[]) -{ - const char * inputFilename = argv[1]; - - std::vector<double> p1, p2, p3, p4, p5; - - typedef double PrecisionType; - typedef double CoordRepType; - typedef otb::StandardMetaImageFunctionBuilder<PrecisionType, - CoordRepType> BuilderType; - - typedef otb::Image<PrecisionType, 2> ImageType; - typedef otb::VectorImage<PrecisionType, 2> VectorImageType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::ImageFileReader<VectorImageType> VectorImageReaderType; - - typedef BuilderType::MetaImageFunctionType MetaImageFunctionType; - typedef BuilderType::DataObjectContainerType DataObjectContainerType; - - typedef otb::FlusserMomentsImageFunction<ImageType, CoordRepType> FlusserMomentsIF; - typedef otb::ImageFunctionAdaptor<FlusserMomentsIF, PrecisionType> AdaptedFlusserMomentsIF; - - typedef otb::RadiometricMomentsImageFunction<ImageType, CoordRepType> RadiometricMomentsIF; - typedef otb::ImageFunctionAdaptor<RadiometricMomentsIF, PrecisionType> AdaptedRadiometricMomentsIF; - typedef otb::FourierMellinDescriptorsImageFunction<ImageType, CoordRepType> FourierMellinDescriptorsIF; - typedef otb::ImageFunctionAdaptor<FourierMellinDescriptorsIF, PrecisionType> AdaptedFourierMellinDescriptorsIF; - - p1.push_back(7); - p1.push_back(128); - p1.push_back(0); - p1.push_back(1500); - - p2.push_back(6); - - p3.push_back(5); - - p4.push_back(9); - p4.push_back(5); - p4.push_back(5); - - p5.push_back(10); - p5.push_back(1); - p5.push_back(1500); - p5.push_back(16); - p5.push_back(4); - - // instantiation - ImageReaderType::Pointer Ireader = ImageReaderType::New(); - VectorImageReaderType::Pointer VIreader = VectorImageReaderType::New(); - - BuilderType::Pointer builder = BuilderType::New(); - - Ireader->SetFileName(inputFilename); - VIreader->SetFileName(inputFilename); - - builder->AddImage(Ireader->GetOutput()); - builder->SetNeighborhoodRadius(8); - - builder->SetLocalHistogramIFParameters(p1); - builder->SetFlusserMomentsIFParameters(p2); - builder->SetRadiometricMomentsIFParameters(p3); - builder->SetFourierMellinDescriptorsIFParameters(p4); - builder->SetHaralickTexturesIFParameters(p5); - - builder->AddImage(VIreader->GetOutput()); - - MetaImageFunctionType::Pointer MIF = builder->GetMetaImageFunction(); - std::cout << MIF << std::endl; - - DataObjectContainerType DOC = builder->GetDataObjectContainer(); - std::cout << "DataObjectContainer.size(): " << DOC.size() << std::endl; - - std::cout << static_cast<AdaptedRadiometricMomentsIF *>(MIF->GetNthFunction(0))->GetInternalImageFunction() - << std::endl; - std::cout << static_cast<AdaptedRadiometricMomentsIF *>(MIF->GetNthFunction(3))->GetInternalImageFunction() - << std::endl; - - - std::cout << static_cast<AdaptedFlusserMomentsIF *>(MIF->GetNthFunction(1))->GetInternalImageFunction() - << std::endl; - std::cout << static_cast<AdaptedFlusserMomentsIF *>(MIF->GetNthFunction(7))->GetInternalImageFunction() - << std::endl; - - std::cout << static_cast<AdaptedFourierMellinDescriptorsIF *>(MIF->GetNthFunction(2))->GetInternalImageFunction() - << std::endl; - std::cout << static_cast<AdaptedFourierMellinDescriptorsIF *>(MIF->GetNthFunction(11))->GetInternalImageFunction() - << std::endl; - -/* - std::cout << static_cast<AdaptedLocalHistogramIF *>(MIF->GetNthFunction())->GetInternalImageFunction() - << std::endl; - std::cout << static_cast<AdaptedLocalHistogramIF *>(MIF->GetNthFunction(5))->GetInternalImageFunction() - << std::endl; - - std::cout << static_cast<AdaptedHaralickTexturesIF *>(MIF->GetNthFunction(4))->GetInternalImageFunction() - << std::endl; - std::cout << static_cast<AdaptedHaralickTexturesIF *>(MIF->GetNthFunction(21))->GetInternalImageFunction() - << std::endl; -*/ - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/CMakeLists.txt b/Modules/Detection/RoadExtraction/CMakeLists.txt deleted file mode 100644 index 7bb7b02fa9cc2361802ec609782cd7bb9488749b..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBRoadExtraction) -otb_module_impl() diff --git a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h deleted file mode 100644 index fda5cfa3c111a11ce9354629dee45f43d47137e4..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBreakAngularPathListFilter_h -#define otbBreakAngularPathListFilter_h - -#include "otbPathListToPathListFilter.h" -#include "otbMacro.h" - -namespace otb -{ -/** \class BreakAngularPathListFilter - * \brief CBase class for breaking angulars the input PathList, returning a PathList. - * - * \example FeatureExtraction/ExtractRoadByStepsExample.cxx - * - * - * \ingroup OTBRoadExtraction - */ -template <class TPath> -class ITK_EXPORT BreakAngularPathListFilter - : public PathListToPathListFilter<TPath> -{ -public: - /** Standard typedefs */ - typedef BreakAngularPathListFilter Self; - typedef PathListToPathListFilter<TPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(BreakAngularPathListFilter, PathListToPathListFilter); - - /** Template parameters typedefs */ - typedef typename Superclass::PathType PathType; - typedef typename Superclass::PathListType PathListType; - typedef typename Superclass::PathPointerType PathPointerType; - typedef typename PathListType::Pointer PathListPointerType; - - typedef double MaxAngleType; - - /** Set/Get the max angle */ - itkSetMacro(MaxAngle, MaxAngleType); - itkGetConstMacro(MaxAngle, MaxAngleType); - -protected: - /** Constructor */ - BreakAngularPathListFilter(); - /** Destructor */ - ~BreakAngularPathListFilter() override {} - /** GenerateData method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - BreakAngularPathListFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - /** Calculate break angular for a path */ - void BreakAngularPath(const MaxAngleType maxAngle, - const PathPointerType inputPath, - PathListPointerType outputPathList); - - /** Max angle value */ - MaxAngleType m_MaxAngle; - -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbBreakAngularPathListFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx deleted file mode 100644 index 5fcec599fd55dc345d293a089f3d070f24dddf8e..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbBreakAngularPathListFilter.hxx +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBreakAngularPathListFilter_hxx -#define otbBreakAngularPathListFilter_hxx - -#include "otbBreakAngularPathListFilter.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath> -BreakAngularPathListFilter<TPath> -::BreakAngularPathListFilter() -{ -} - -template <class TPath> -void -BreakAngularPathListFilter<TPath> -::BreakAngularPath(const MaxAngleType maxAngle, const PathPointerType inputPath, PathListPointerType outputPathList) -{ - typename PathType::VertexListType::ConstPointer vertexList = inputPath->GetVertexList(); - typename PathType::VertexListType::ConstIterator pathIt = vertexList->Begin(); - - typename PathType::VertexType pixel1, pixel2, pixel3; - - // Initialization - PathPointerType newPath = PathType::New(); - newPath->Initialize(); - - double alpha1(0.), alpha2(0.); - - while (pathIt != vertexList->End()) - { - // Add Pixel 1 - newPath->AddVertex(pathIt.Value()); - pixel1 = pathIt.Value(); - ++pathIt; - if (pathIt != vertexList->End()) - { - pixel2 = pathIt.Value(); - ++pathIt; - if (pathIt != vertexList->End()) - { - pixel3 = pathIt.Value(); - - alpha1 = std::atan2((pixel1[1] - pixel2[1]), (pixel1[0] - pixel2[0])); - alpha2 = std::atan2((pixel2[1] - pixel3[1]), (pixel2[0] - pixel3[0])); - alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_2PI); - alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_2PI); - if (std::abs(alpha1 - alpha2) > static_cast<double>(maxAngle)) - { - // Add Pixel 2 - newPath->AddVertex(pixel2); - //Create new PathType in the out path list - outputPathList->PushBack(newPath); - // Reinit - newPath = PathType::New(); - - } - --pathIt; // Return previous pixel - } - else - { - // Add last Pixel (Pixel 2) - newPath->AddVertex(pixel2); - } - } - } - //Create new PathType in the out list - outputPathList->PushBack(newPath); -} - -template <class TPath> -void -BreakAngularPathListFilter<TPath> -::GenerateData() -{ - const PathListType * inputPathList = this->GetInput(); - PathListType * outputPathList = this->GetOutput(); - - typename PathListType::ConstIterator listIt = inputPathList->Begin(); - outputPathList->Clear(); - - PathListPointerType newTempPathList = PathListType::New(); - while (listIt != inputPathList->End()) - { - (void) BreakAngularPath(m_MaxAngle, listIt.Get(), outputPathList); - ++listIt; - } -} - -/** - * PrintSelf Method - */ -template <class TPath> -void -BreakAngularPathListFilter<TPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Angular max value : " << m_MaxAngle << std::endl; -} - -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h deleted file mode 100644 index 6c57fa13c9c52783693e4e699eaf689fbaf2ff7d..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.h +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbGenericRoadExtractionFilter_h -#define otbGenericRoadExtractionFilter_h - -#include "itkUnaryFunctorImageFilter.h" -#include "itkGradientRecursiveGaussianImageFilter.h" - -#include "otbVectorImage.h" -#include "otbImageToPathListFilter.h" -#include "itkSqrtImageFilter.h" -#include "otbNeighborhoodScalarProductFilter.h" -#include "otbNonMaxRemovalByDirectionFilter.h" -#include "otbVectorizationPathListFilter.h" -#include "otbSimplifyPathListFilter.h" -#include "otbBreakAngularPathListFilter.h" -#include "otbRemoveTortuousPathListFilter.h" -#include "otbLinkPathListFilter.h" -#include "otbRemoveIsolatedByDirectionFilter.h" -#include "otbRemoveWrongDirectionFilter.h" -#include "otbLikelihoodPathListFilter.h" - -namespace otb -{ -/** - * \class GenericRoadExtractionFilter - * \brief This class performs the extraction of roads from an image. - * - * This composite filter implements a fast and robust road extraction - * for high resolution satellite images. The line - * detection is done using a Gaussian gradient with a scalar product to find - * the road directions. Finally, extracted roads are vectorized and - * processed to improve the results removing some occultations and false - * detections. - * - * The full method is detailed in E. Christophe and J. Inglada, "Robust Road - * Extraction for High Resolution Satellite Images," in IEEE International - * Conference on Image Processing, ICIP'07, 2007. - * - * This filter is fast, as the detection typically takes 3 seconds for a - * 1000 \f$ \times \f$ 1000 images with four spectral bands. Results can be - * used as an initialization for more complex algorithms. - * - * \sa itk::SqrtImageFilter - * \sa itk::GradientRecursiveGaussianImageFilter - * \sa NeighborhoodScalarProductFilter - * \sa RemoveIsolatedByDirectionFilter - * \sa RemoveWrongDirectionFilter - * \sa NonMaxRemovalByDirectionFilter - * \sa VectorizationPathListFilter - * \sa SimplifyPathListFilter - * \sa BreakAngularPathListFilter - * \sa RemoveTortuousPathListFilter - * \sa LinkPathListFilter - * \sa LikelihoodPathListFilter - * - * \ingroup OTBRoadExtraction - */ -template <class TInputImage, class TOutputPath> -class ITK_EXPORT GenericRoadExtractionFilter - : public ImageToPathListFilter<TInputImage, TOutputPath> -{ -public: - /** Standard typedefs */ - typedef GenericRoadExtractionFilter Self; - typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(GenericRoadExtractionFilter, ImageToPathListFilter); - /** Template parameters typedefs */ - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::OutputPathType OutputPathType; - typedef typename Superclass::OutputPathListType OutputPathListType; - typedef typename InputImageType::PixelType InputPixelType; - typedef double InternalPixelType; - - typedef otb::VectorImage<InternalPixelType, InputImageType::ImageDimension> VectorImageType; - typedef otb::Image<InternalPixelType, InputImageType::ImageDimension> ModulusType; - typedef otb::Image<InternalPixelType, InputImageType::ImageDimension> DirectionType; - - typedef itk::CovariantVector<InternalPixelType, InputImageType::ImageDimension> - VectorPixelType; - typedef otb::Image<VectorPixelType, InputImageType::ImageDimension> CovariantVectorImageType; - - typedef itk::SqrtImageFilter< - InputImageType, - InputImageType> SquareRootImageFilterType; - - typedef itk::GradientRecursiveGaussianImageFilter< - InputImageType, - CovariantVectorImageType> GradientFilterType; - - typedef NeighborhoodScalarProductFilter< - CovariantVectorImageType, - ModulusType, - DirectionType> NeighborhoodScalarProductFilterType; - - typedef RemoveIsolatedByDirectionFilter< - ModulusType, - DirectionType, - ModulusType> RemoveIsolatedByDirectionFilterType; - - typedef RemoveWrongDirectionFilter< - ModulusType, - DirectionType, - ModulusType> RemoveWrongDirectionFilterType; - - typedef NonMaxRemovalByDirectionFilter< - ModulusType, - DirectionType, - ModulusType> NonMaxRemovalByDirectionFilterType; - - typedef VectorizationPathListFilter< - ModulusType, - DirectionType, - OutputPathType> VectorizationPathListFilterType; - - typedef SimplifyPathListFilter<OutputPathType> SimplifyPathListFilterType; - typedef BreakAngularPathListFilter<OutputPathType> BreakAngularPathListFilterType; - typedef RemoveTortuousPathListFilter<OutputPathType> RemoveTortuousPathListFilterType; - typedef LinkPathListFilter<OutputPathType> LinkPathListFilterType; - typedef LikelihoodPathListFilter<OutputPathType, ModulusType> LikelihoodPathListFilterType; - - /** Template parameters typedefs for internals filters */ - typedef typename GradientFilterType::RealType SigmaType; - typedef typename VectorizationPathListFilterType::InputPixelType AmplitudeThresholdType; -// typedef typename SimplifyPathListFilterType::ToleranceType ToleranceType; - typedef double ToleranceType; - typedef typename BreakAngularPathListFilterType::MaxAngleType MaxAngleType; -// typedef typename RemoveTortuousPathListFilterType::MeanDistanceThresholdType MeanDistanceThresholdType; - typedef double MeanDistanceThresholdType; - typedef typename LinkPathListFilterType::RealType LinkRealType; - - /** Get/Set the alpha value */ - itkGetConstReferenceMacro(Alpha, double); - itkSetMacro(Alpha, double); - - /** Get/Set the amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/ - itkSetMacro(AmplitudeThreshold, AmplitudeThresholdType); - itkGetMacro(AmplitudeThreshold, AmplitudeThresholdType); - - /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/ - itkGetMacro(Tolerance, ToleranceType); - itkSetMacro(Tolerance, ToleranceType); - - /** Get/Set the resolution */ - itkGetMacro(Resolution, double); - itkSetMacro(Resolution, double); - - /** Set/Get the max angle (use bye the BreakAngularPathListFilter)*/ - itkSetMacro(MaxAngle, MaxAngleType); - itkGetConstMacro(MaxAngle, MaxAngleType); - - /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/ - itkGetMacro(FirstMeanDistanceThreshold, MeanDistanceThresholdType); - itkSetMacro(FirstMeanDistanceThreshold, MeanDistanceThresholdType); - itkGetMacro(SecondMeanDistanceThreshold, MeanDistanceThresholdType); - itkSetMacro(SecondMeanDistanceThreshold, MeanDistanceThresholdType); - - /** Get/Set the angular threshold (use by LinkPathFilter)*/ - itkSetMacro(AngularThreshold, LinkRealType); - itkGetMacro(AngularThreshold, LinkRealType); - /** Get/Set the distance threshold (use by LinkPathFilter)*/ - itkSetMacro(DistanceThreshold, LinkRealType); - itkGetMacro(DistanceThreshold, LinkRealType); - -protected: - /** Constructor */ - GenericRoadExtractionFilter(); - /** Destructor */ - ~GenericRoadExtractionFilter() override {} - - /** Prepare main computation method - * Note : this function isn't called - */ - void BeforeGenerateData(void); - - /** Main computation method */ - void GenerateData(void) override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - - GenericRoadExtractionFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - typename SquareRootImageFilterType::Pointer m_SquareRootImageFilter; - typename GradientFilterType::Pointer m_GradientFilter; - typename NeighborhoodScalarProductFilterType::Pointer m_NeighborhoodScalarProductFilter; - typename RemoveIsolatedByDirectionFilterType::Pointer m_RemoveIsolatedByDirectionFilter; - typename RemoveWrongDirectionFilterType::Pointer m_RemoveWrongDirectionFilter; - typename NonMaxRemovalByDirectionFilterType::Pointer m_NonMaxRemovalByDirectionFilter; - typename VectorizationPathListFilterType::Pointer m_VectorizationPathListFilter; - typename SimplifyPathListFilterType::Pointer m_FirstSimplifyPathListFilter; - typename SimplifyPathListFilterType::Pointer m_SecondSimplifyPathListFilter; - typename BreakAngularPathListFilterType::Pointer m_BreakAngularPathListFilter; - typename RemoveTortuousPathListFilterType::Pointer m_FirstRemoveTortuousPathListFilter; - typename RemoveTortuousPathListFilterType::Pointer m_SecondRemoveTortuousPathListFilter; - typename LinkPathListFilterType::Pointer m_LinkPathListFilter; - typename LikelihoodPathListFilterType::Pointer m_LikelihoodPathListFilter; - - /** Amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/ - AmplitudeThresholdType m_AmplitudeThreshold; - /** Tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/ - ToleranceType m_Tolerance; - /** Max angle (use bye the BreakAngularPathListFilter)*/ - MaxAngleType m_MaxAngle; - /** Tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/ - MeanDistanceThresholdType m_FirstMeanDistanceThreshold; - MeanDistanceThresholdType m_SecondMeanDistanceThreshold; - /** The angular threshold (use by LinkPathListFilter) */ - LinkRealType m_AngularThreshold; - - /** The distance threshold (use by LinkPathListFilter) */ - double m_DistanceThreshold; - - /** Alpha. Use to calculate the sigma value used by the GradientRecursiveGaussianImageFilter */ - double m_Alpha; - - /** Resolution of the image. Use to calculate the sigma value used by the GradientRecursiveGaussianImageFilter - and the m_DistanceThreshold value used by the LinkPathListFilter - This value is set bye the image's spacing.*/ - double m_Resolution; - -}; - -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbGenericRoadExtractionFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx deleted file mode 100644 index fe69fd3c7894a61ffd07e7a942c54a78e7ef8f14..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbGenericRoadExtractionFilter.hxx +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbGenericRoadExtractionFilter_hxx -#define otbGenericRoadExtractionFilter_hxx - -#include "otbGenericRoadExtractionFilter.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputPath> -GenericRoadExtractionFilter<TInputImage, TOutputPath> -::GenericRoadExtractionFilter() -{ - this->SetNumberOfRequiredInputs(1); - this->SetNumberOfRequiredOutputs(1); - - m_SquareRootImageFilter = SquareRootImageFilterType::New(); - m_GradientFilter = GradientFilterType::New(); - m_NeighborhoodScalarProductFilter = NeighborhoodScalarProductFilterType::New(); - m_RemoveIsolatedByDirectionFilter = RemoveIsolatedByDirectionFilterType::New(); - m_RemoveWrongDirectionFilter = RemoveWrongDirectionFilterType::New(); - m_NonMaxRemovalByDirectionFilter = NonMaxRemovalByDirectionFilterType::New(); - m_VectorizationPathListFilter = VectorizationPathListFilterType::New(); - m_FirstSimplifyPathListFilter = SimplifyPathListFilterType::New(); - m_SecondSimplifyPathListFilter = SimplifyPathListFilterType::New(); - m_BreakAngularPathListFilter = BreakAngularPathListFilterType::New(); - m_FirstRemoveTortuousPathListFilter = RemoveTortuousPathListFilterType::New(); - m_SecondRemoveTortuousPathListFilter = RemoveTortuousPathListFilterType::New(); - m_LinkPathListFilter = LinkPathListFilterType::New(); - m_LikelihoodPathListFilter = LikelihoodPathListFilterType::New(); - - /** Amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/ - m_AmplitudeThreshold = static_cast<AmplitudeThresholdType>(0.00005); - /** Tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathFilter)*/ - m_Tolerance = static_cast<ToleranceType>(1.); - /** Max angle (use bye the BreakAngularPathListFilter)*/ - m_MaxAngle = static_cast<MaxAngleType>(CONST_PI_8); - /** Tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathFilter)*/ - m_FirstMeanDistanceThreshold = static_cast<MeanDistanceThresholdType>(1.); - m_SecondMeanDistanceThreshold = static_cast<MeanDistanceThresholdType>(10.); - /** The angular threshold (use by LinkPathFilter) */ - m_AngularThreshold = static_cast<LinkRealType>(CONST_PI_8); - - /** The distance threshold (use by LinkPathFilter) */ - m_DistanceThreshold = 25.; - - /** Alpha value */ - /** Use to calculate the sigma value use by the GradientRecursiveGaussianImageFilter */ - m_Alpha = 1.0; - - /** Resolution of the image */ - m_Resolution = 1.; -} -/** - * Prepare main computation method - */ -template <class TInputImage, class TOutputPath> -void -GenericRoadExtractionFilter<TInputImage, TOutputPath> -::BeforeGenerateData() -{ - /** Calculation of resolution value */ - typename InputImageType::SpacingType spacing = this->GetInput()->GetSignedSpacing(); - // Getting x Spacing for the resolution - m_Resolution = static_cast<double>(spacing[0]); - if (m_Resolution == 0.) - { - itkWarningMacro(<< "The image spacing is zero. So the resolution used in the filter is forced to 1."); - m_Resolution = 1.; - } - -} - -/** - * Main computation method - */ -template <class TInputImage, class TOutputPath> -void -GenericRoadExtractionFilter<TInputImage, TOutputPath> -::GenerateData() -{ - // // Input images pointers - typename InputImageType::ConstPointer inputImage = this->GetInput(); - typename OutputPathListType::Pointer outputPathList = this->GetOutput(); - - /////////////////////////////////////// - //// Algorithm for road extraction //// - /////////////////////////////////////// - - // - - m_SquareRootImageFilter->SetInput(inputImage); - - m_GradientFilter->SetInput(m_SquareRootImageFilter->GetOutput()); - /** Sigma calculated with the alpha and image resolution parameters */ - m_GradientFilter->SetSigma(static_cast<SigmaType>(m_Alpha * (1.2 / m_Resolution + 1.))); - m_GradientFilter->SetUseImageDirection(false); - - m_NeighborhoodScalarProductFilter->SetInput(m_GradientFilter->GetOutput()); - - m_RemoveIsolatedByDirectionFilter->SetInput(m_NeighborhoodScalarProductFilter->GetOutput()); - m_RemoveIsolatedByDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection()); - - m_RemoveWrongDirectionFilter->SetInput(m_RemoveIsolatedByDirectionFilter->GetOutput()); - m_RemoveWrongDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection()); - - m_NonMaxRemovalByDirectionFilter->SetInput(m_RemoveWrongDirectionFilter->GetOutput()); - m_NonMaxRemovalByDirectionFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection()); - - m_VectorizationPathListFilter->SetInput(m_NonMaxRemovalByDirectionFilter->GetOutput()); - m_VectorizationPathListFilter->SetInputDirection(m_NeighborhoodScalarProductFilter->GetOutputDirection()); - m_VectorizationPathListFilter->SetAmplitudeThreshold(m_AmplitudeThreshold); - - m_FirstSimplifyPathListFilter->SetInput(m_VectorizationPathListFilter->GetOutput()); - m_FirstSimplifyPathListFilter->GetFunctor().SetTolerance(m_Tolerance); - - m_BreakAngularPathListFilter->SetInput(m_FirstSimplifyPathListFilter->GetOutput()); - m_BreakAngularPathListFilter->SetMaxAngle(m_MaxAngle); - - m_FirstRemoveTortuousPathListFilter->SetInput(m_BreakAngularPathListFilter->GetOutput()); - m_FirstRemoveTortuousPathListFilter->GetFunctor().SetThreshold(m_FirstMeanDistanceThreshold); - - m_LinkPathListFilter->SetInput(m_FirstRemoveTortuousPathListFilter->GetOutput()); - m_LinkPathListFilter->SetAngularThreshold(m_AngularThreshold); - m_LinkPathListFilter->SetDistanceThreshold(static_cast<LinkRealType>(m_DistanceThreshold / m_Resolution)); - - m_SecondSimplifyPathListFilter->SetInput(m_LinkPathListFilter->GetOutput()); - m_SecondSimplifyPathListFilter->GetFunctor().SetTolerance(m_Tolerance); - - m_SecondRemoveTortuousPathListFilter->SetInput(m_SecondSimplifyPathListFilter->GetOutput()); - m_SecondRemoveTortuousPathListFilter->GetFunctor().SetThreshold(m_SecondMeanDistanceThreshold); - - m_LikelihoodPathListFilter->SetInput(m_SecondRemoveTortuousPathListFilter->GetOutput()); - m_LikelihoodPathListFilter->SetInputImage(m_NonMaxRemovalByDirectionFilter->GetOutput()); - - // Graft output seems to be broken for PolylineParametricPath - // So we use update, and copy the path to the output path list. - // m_LikelihoodPathListFilter->GraftOutput(this->GetOutput()); - m_LikelihoodPathListFilter->Update(); - // outputPathList = m_LikelihoodPathListFilter->GetOutput(); - for (typename LikelihoodPathListFilterType::PathListType::ConstIterator it - = m_LikelihoodPathListFilter->GetOutput()->Begin(); - it != m_LikelihoodPathListFilter->GetOutput()->End(); - ++it) - { - outputPathList->PushBack(it.Get()); - } -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputPath> -void -GenericRoadExtractionFilter<TInputImage, TOutputPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "m_Alpha:" << m_Alpha << std::endl; - os << indent << "m_Resolution:" << m_Resolution << std::endl; - os << indent << "m_AmplitudeThreshold: " << m_AmplitudeThreshold << std::endl; - os << indent << "m_Tolerance: " << m_Tolerance << std::endl; - os << indent << "m_MaxAngle: " << m_MaxAngle << std::endl; - os << indent << "m_FirstMeanDistanceThreshold: " << m_FirstMeanDistanceThreshold << std::endl; - os << indent << "m_SecondMeanDistanceThreshold: " << m_SecondMeanDistanceThreshold << std::endl; - os << indent << "m_DistanceThreshold: " << m_DistanceThreshold << std::endl; - os << indent << "m_AngularThreshold: " << m_AngularThreshold << std::endl; - -} -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h b/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h deleted file mode 100644 index bdb44cf1f065d6f29f879f5e6da32b08fea2ca2b..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.h +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToPathListAlignFilter_h -#define otbImageToPathListAlignFilter_h - -#include "itkImageSource.h" -#include "itkConceptChecking.h" -#include "otbImage.h" -#include "otbImageToPathListFilter.h" -#include <vector> - -namespace otb -{ - -/** \class ImageToPathListAlignFilter - * \brief Base class used to implement filter to extract align points or group of points and give the coordinates. - * - * - * \ingroup OTBRoadExtraction - */ -template <class TInputImage, class TOutputPath> -class ITK_EXPORT ImageToPathListAlignFilter : public ImageToPathListFilter<TInputImage, TOutputPath> -{ -public: - /** Standard class typedefs. */ - typedef ImageToPathListAlignFilter Self; - typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ImageToPathListAlignFilter, ImageToPathListFilter); -// itkTypeMacro(ImageToPathListAlignFilter, itk::ImageSource); - - /** ImageDimension constants */ - itkStaticConstMacro(InputImageDimension, unsigned int, - TInputImage::ImageDimension); - - /** Some convenient typedefs. */ - typedef typename Superclass::OutputPathListType OutputPathListType; - - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::InputImageRegionType InputImageRegionType; - typedef typename InputImageType::Pointer InputImagePointer; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - - typedef typename InputImageType::SizeType SizeType; - typedef typename InputImageType::ValueType ValueType; - typedef typename InputImageType::PixelType PixelType; - - typedef typename Superclass::OutputPathType OutputPathType; - // typedef typename Superclass::OutputPathListType OutputPathListType; - typedef typename Superclass::OutputPathPointerType OutputPathPointerType; - -// typedef float RealType; -//typedef typename itk::NumericTraits<PixelType>::RealType RealType; - typedef double RealType; -// typedef typename itk::Image<RealType, InputImageDimension> RealImageType; - typedef typename otb::Image<RealType, InputImageDimension> RealImageType; - typedef typename RealImageType::Pointer RealImageTypePointer; - typedef typename RealImageType::IndexType RealImageTypeIndexType; - - /** Spacing (size of a pixel) of the output image. The - * spacing is the geometric distance between image samples. - * It is stored internally as double, but may be set from - * float. \sa GetSpacing() */ - virtual void SetSpacing(const double* spacing); - virtual void SetSpacing(const float* spacing); - virtual const double* GetSpacing() const; - - /** Set/Get the value for pixels on and off the path. - * By default, this filter will return a "0" image with path pixels set to 1 */ - itkSetMacro(PathValue, ValueType); - itkGetMacro(PathValue, ValueType); - itkSetMacro(BackgroundValue, ValueType); - itkGetMacro(BackgroundValue, ValueType); - - /** The origin of the output image. The origin is the geometric - * coordinates of the index (0, 0, ..., 0). It is stored internally - * as double but may be set from float. - * \sa GetOrigin() */ - virtual void SetOrigin(const double* origin); - virtual void SetOrigin(const float* origin); - virtual const double * GetOrigin() const; - - /** Set/Get Size */ - itkSetMacro(Size, SizeType); - itkGetMacro(Size, SizeType); - - itkSetMacro(isMeaningfulSegment, bool); - itkSetMacro(NbGradDirection, int); - itkSetMacro(NbLineDirection, int); - itkSetMacro(MinGradNorm, double); - itkSetMacro(Eps, double); - itkGetConstReferenceMacro(isMeaningfulSegment, bool); - itkGetConstReferenceMacro(NbGradDirection, int); - itkGetConstReferenceMacro(NbLineDirection, int); - itkGetConstReferenceMacro(MinGradNorm, double); - itkGetConstReferenceMacro(Eps, double); - -protected: - ImageToPathListAlignFilter(); - ~ImageToPathListAlignFilter() override; - - void GenerateOutputInformation() override {} // do nothing - void GenerateData() override; - virtual std::vector<double> tab(int n, double p, double m); - virtual void AngleCalculate(const InputImageType* InputImageIn); - - SizeType m_Size; - double m_Spacing[InputImageDimension]; - double m_Origin[InputImageDimension]; - ValueType m_PathValue; - ValueType m_BackgroundValue; - - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - ImageToPathListAlignFilter(const Self &) = delete; - void operator =(const Self&) = delete; - bool m_isMeaningfulSegment; /// to get all meaningful segments (maximal or not - int m_NbGradDirection; /// Number of allowed gradient direction, default 16 - int m_NbLineDirection; /// Number of line directions to scan, default 96) - double m_MinGradNorm; /// Minimum gradient norm to define a direction, default 2. - double m_Eps; /// -log10(max. number of false alarms), default 0 - std::vector<double> m_seglist; - - RealImageType * m_AngleImage; //Angle image use by GenerateData and AngleCalculate methods -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageToPathListAlignFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx b/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx deleted file mode 100644 index 3ba3ef83d435c64c28995b047ffcfe72a7316c79..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbImageToPathListAlignFilter.hxx +++ /dev/null @@ -1,585 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToPathListAlignFilter_hxx -#define otbImageToPathListAlignFilter_hxx - -#include "otbImageToPathListAlignFilter.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "itkConstNeighborhoodIterator.h" -#include "itkPathIterator.h" -#include "itkNumericTraits.h" -#include "itkImageLinearIteratorWithIndex.h" -#include "otbMath.h" - -namespace otb -{ - -struct one_segment -{ - short start; /* starting position (distance from border) */ - short end; /* ending position (hence, length is end-start+1) */ - double nfa; /* number of false alarms */ - char ok; -}; - -/** Constructor */ -template <class TInputImage, class TOutputPath> -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::ImageToPathListAlignFilter() -{ - this->SetNumberOfRequiredInputs(1); - m_Size.Fill(0); - m_isMeaningfulSegment = false; - m_NbGradDirection = 16; - m_NbLineDirection = 96; - m_MinGradNorm = 2.0; - m_Eps = 0.0; - - for (unsigned int i = 0; i < InputImageDimension; ++i) - { - // Set an image spacing for the user - m_Spacing[i] = 1.0; - m_Origin[i] = 0; - } - - m_PathValue = itk::NumericTraits<ValueType>::One; - m_BackgroundValue = itk::NumericTraits<ValueType>::Zero; -} - -/** Destructor */ -template <class TInputImage, class TOutputPath> -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::~ImageToPathListAlignFilter() -{ -} - -//---------------------------------------------------------------------------- -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::SetSpacing(const double* spacing) -{ - unsigned int i; - for (i = 0; i < InputImageDimension; ++i) - { - if (spacing[i] != m_Spacing[i]) - { - break; - } - } - if (i < InputImageDimension) - { - for (i = 0; i < InputImageDimension; ++i) - { - m_Spacing[i] = spacing[i]; - } - this->Modified(); - } -} - -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::SetSpacing(const float* spacing) -{ - unsigned int i; - for (i = 0; i < InputImageDimension; ++i) - { - if ((double) spacing[i] != m_Spacing[i]) - { - break; - } - } - if (i < InputImageDimension) - { - for (i = 0; i < InputImageDimension; ++i) - { - m_Spacing[i] = spacing[i]; - } - this->Modified(); - } -} - -template <class TInputImage, class TOutputPath> -const double * -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::GetSpacing() const -{ - return m_Spacing; -} - -//---------------------------------------------------------------------------- -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::SetOrigin(const double* origin) -{ - unsigned int i; - for (i = 0; i < InputImageDimension; ++i) - { - if (origin[i] != m_Origin[i]) - { - break; - } - } - if (i < InputImageDimension) - { - for (i = 0; i < InputImageDimension; ++i) - { - m_Origin[i] = origin[i]; - } - } -} - -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::SetOrigin(const float* origin) -{ - unsigned int i; - for (i = 0; i < InputImageDimension; ++i) - { - if ((double) origin[i] != m_Origin[i]) - { - break; - } - } - if (i < InputImageDimension) - { - for (i = 0; i < InputImageDimension; ++i) - { - m_Origin[i] = origin[i]; - } - } -} - -template <class TInputImage, class TOutputPath> -const double * -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::GetOrigin() const -{ - return m_Origin; -} - -//---------------------------------------------------------------------------- -/* Algorithm */ -template <class TInputImage, class TOutputPath> -std::vector<double> -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::tab(int n, double p, double m) -{ - std::vector<double> out; - int adr1, adr2, x, y; -// double lambda; - double q; - - q = 1.0 - p; - out.resize((n + 1) * (n + 1)); - adr1 = 0; - - /*** compute proba (=x among y) ***/ - out[0] = 1.0; - for (y = 1, adr2 = 0; y <= n; ++y) - { - adr1 = adr2; - adr2 += n + 1; - out[adr2] = q * out[adr1]; - for (x = 1; x <= y; ++x) - out[adr2 + x] = p * out[adr1 + x - 1] + q * out[adr1 + x]; - } - - /*** sum to obtain proba (>=k among y) ***/ - for (y = 1, adr1 = n + 1; y <= n; ++y, adr1 += n + 1) - for (x = y - 1; x >= 0; x--) - out[adr1 + x] += out[adr1 + x + 1]; - - /*** multiply by m (number of segments) to obtain expectation***/ - for (adr1 = (n + 1) * (n + 1); --adr1 >= 0; ) - out[adr1] *= m; - - return out; -} - -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::AngleCalculate(const InputImageType* InputImage) -{ - double threshold; - int n, p, x, y; - - typename InputImageType::SizeType Taille; - typename RealImageType::IndexType IndexOut; - - Taille = InputImage->GetLargestPossibleRegion().GetSize(); - - typename RealImageType::RegionType region; - region.SetSize(InputImage->GetLargestPossibleRegion().GetSize()); - IndexOut[0] = 0; - IndexOut[1] = 0; -// region.SetIndex(InputImage->GetLargestPossibleRegion().GetIndex()); - region.SetIndex(IndexOut); - m_AngleImage->SetRegions(region); - m_AngleImage->SetOrigin(InputImage->GetOrigin()); - m_AngleImage->SetSignedSpacing(InputImage->GetSignedSpacing()); - m_AngleImage->Allocate(); - - n = Taille[0]; - p = Taille[1]; - - threshold = m_MinGradNorm; - threshold *= threshold; - - typename InputImageType::IndexType idx; - - for (x = 0; x < p; ++x) - { - idx[0] = (n - 1); - idx[1] = x; -// indice = (n-1)*p +x - m_AngleImage->SetPixel(idx, static_cast<RealType>(-1000.0)); - } - for (y = 0; y < n; ++y) - { - idx[0] = y; - idx[1] = p - 1; -// indice = p*y+p-1 - m_AngleImage->SetPixel(idx, static_cast<RealType>(-1000.0)); - } - - typename InputImageType::IndexType adr; - RealType PixelA, PixelB, PixelC, PixelD; - RealType com1, com2, gx, gy, norm; - - for (x = 0; x < p - 1; ++x) - for (y = 0; y < n - 1; ++y) - { -// indice = y*p+x - adr[0] = y; - adr[1] = x; - idx[0] = adr[0] + 1; - idx[1] = adr[1] + 1; - PixelA = static_cast<RealType>(InputImage->GetPixel(idx)); - idx[0] = adr[0]; - idx[1] = adr[1]; - assert(idx[0] < n); - assert(idx[1] < p); - assert(idx[0] >= 0); - assert(idx[1] >= 0); - PixelB = static_cast<RealType>(InputImage->GetPixel(idx)); - idx[0] = adr[0] + 1; - idx[1] = adr[1]; - assert(idx[0] < n); - assert(idx[1] < p); - assert(idx[0] >= 0); - assert(idx[1] >= 0); - PixelC = static_cast<RealType>(InputImage->GetPixel(idx)); - idx[0] = adr[0]; - idx[1] = adr[1] + 1; - assert(idx[0] < n); - assert(idx[1] < p); - assert(idx[0] >= 0); - assert(idx[1] >= 0); - PixelD = static_cast<RealType>(InputImage->GetPixel(idx)); - com1 = PixelA - PixelB; - com2 = PixelC - PixelD; - gx = 0.5 * (com1 + com2); - gy = 0.5 * (com1 - com2); - norm = gx * gx + gy * gy; - - if (norm <= threshold) m_AngleImage->SetPixel(adr, static_cast<RealType>(-1000.0)); - else m_AngleImage->SetPixel(adr, static_cast<RealType>(std::atan2(gx, -gy))); - } -} - -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::GenerateData(void) -{ -// SizeType size; -// double origin[InputImageDimension]; - typename InputImageType::SizeType Taille; - RealImageTypeIndexType indexAngle; -// Flist result; - int iseglist, size_seglist; /* associated counter and dynamic size */ - int iseg, size_seg; - double nfa, max_nfa; - std::vector<double> test; - std::vector<int> count, startbloc, endbloc; - std::vector<double> seglist; /* list of recorded segments */ - std::vector<one_segment> seg; - int mx, my, ox, oy, nx, ny, n; - int xx, yy, pos, posmax, nblocs, inbloc, max_nblocs; - int cur, i, j, side, l, lphase; - // int tmp; - int itheta, ntheta; - double theta, theta0, dtheta, dx, dy, prec; - double error = 0.0; - itkDebugMacro(<< "ImageToPathListAlignFilter::GenerateData() called"); - - // Get the input and output pointers - const InputImageType * InputImage = this->GetInput(); - OutputPathListType * OutputPath = this->GetOutput(); - // Generate the image - - /* Filter algorithm */ - - Taille = InputImage->GetLargestPossibleRegion().GetSize(); - nx = Taille[0]; - ny = Taille[1]; - max_nfa = std::pow(10.0, -(m_Eps)); - -// typename InputImageType::IndexType adr; - - /*** maximal length for a line */ - n = (int) std::ceil(hypot((double) nx, (double) ny)) + 1; - - /*** compute angle map of u ***/ - RealImageTypePointer lAngleImagePointer = RealImageType::New(); - m_AngleImage = static_cast<RealImageType*>(lAngleImagePointer.GetPointer()); - this->AngleCalculate(InputImage); - - /*** compute P(k, l) ***/ - test = tab(n, 1.0 / (double) (m_NbGradDirection), (double) (nx * ny) * (double) (nx * ny)); - - /*** initialization ***/ - prec = CONST_PI / (double) (m_NbGradDirection); - ntheta = m_NbLineDirection / 2; /* i.e. # directions of NON-ORIENTED lines */ - dtheta = CONST_PI / (double) ntheta; - - /******************** memory allocation ********************/ - - max_nblocs = n / 2 + 1; /* maximal number of blocs */ - count.resize(max_nblocs); - startbloc.resize(max_nblocs); - endbloc.resize(max_nblocs); - - size_seg = 10000; /* initial allocation (may reallocate later) */ - seg.resize(size_seg); - - size_seglist = 10000; /* initial allocation (may reallocate later) */ - seglist.resize(5 * size_seglist); - - /* counter for recorded segments (seglist) */ - iseglist = 0; - - /******************** first loop : the four sides ********************/ - - for (side = 0; side < 4; side++) - { - printf("side %d/4 ", side + 1); - - theta0 = CONST_PI_2 * (double) side; - mx = ((side == 0 || side == 2) ? 1 : 0); - my = ((side == 1 || side == 3) ? 1 : 0); - ox = ((side == 1) ? nx - 1 : 0); - oy = ((side == 2) ? ny - 1 : 0); - - posmax = nx * mx + ny * my; - - /*** second loop : angles ***/ - for (itheta = 0; itheta < ntheta; itheta++) - { - printf("."); - fflush(stdout); - theta = theta0 + (double) (itheta) * dtheta; - dx = (double) std::cos((double) theta); - dy = (double) std::sin((double) theta); - - /*** third loop : start positions ***/ - for (pos = 0; pos < posmax; ++pos) - { - - /* clear segment array */ - iseg = 0; - - /*** fourth loop : phase for two-spaced pixels ***/ - for (lphase = 0; lphase < 2; lphase++) - { - - /*** detect aligned points by blocs ***/ - inbloc = nblocs = cur = l = count[0] = 0; - xx = ox + pos * mx + (int) (dx * (double) (l * 2 + lphase)); - yy = oy + pos * my + (int) (dy * (double) (l * 2 + lphase)); - - for (; xx >= 0 && xx < nx && yy >= 0 && yy < ny; ) - { - indexAngle[0] = xx; - indexAngle[1] = yy; - // indice = yy*nx+xx - assert(indexAngle[0] < nx); - assert(indexAngle[1] < ny); - assert(indexAngle[0] >= 0); - assert(indexAngle[1] >= 0); - - error = static_cast<double>(m_AngleImage->GetPixel(indexAngle)); - if (error > -100.0) - { - error -= theta; - while (error <= -CONST_PI) - error += CONST_2PI; - while (error > CONST_PI) - error -= CONST_2PI; - if (error < 0.0) error = -error; - if (error < prec) - { - ++cur; - if (!inbloc) - { - startbloc[nblocs] = l; - inbloc = 1; - } - } - else - { - if (inbloc) - { - endbloc[nblocs] = l - 1; - ++nblocs; - count[nblocs] = cur; - } - inbloc = 0; - } - } - /* compute next point */ - ++l; - xx = ox + pos * mx + (int) (dx * (double) (l * 2 + lphase)); - yy = oy + pos * my + (int) (dy * (double) (l * 2 + lphase)); - } - - /*** detect meaningful segments ***/ - for (i = 0; i < nblocs; ++i) - for (j = i; j < nblocs; ++j) - if ((nfa = test[count[j + 1] - count[i] - + (n + 1) * (1 + endbloc[j] - startbloc[i])]) < max_nfa) - { - seg[iseg].start = startbloc[i] * 2 + lphase; - seg[iseg].end = endbloc[j] * 2 + lphase; - seg[iseg].nfa = nfa; - seg[iseg].ok = 1; - iseg++; - /* reallocate if necessary */ - if (iseg == size_seg) - { - size_seg = (size_seg * 3) / 2; - seg.resize(size_seg); -// if (!seg) -// mwerror(FATAL, 1,"Not enough memory."); - } - } - } - /*** end of phase loop ***/ - - /*** remove non-maximal segments ***/ - if (!m_isMeaningfulSegment) - for (i = 0; i < iseg; ++i) - for (j = 0; j < iseg; ++j) - if (i != j) - - /* seg[i] is included in seg[j] ? */ - if (seg[i].start >= seg[j].start && seg[i].end <= seg[j].end) - { - - /* remove the less meaningful of seg[i] and seg[j] */ - if (seg[i].nfa < seg[j].nfa) seg[j].ok = 0; - else seg[i].ok = 0; - - } - - /*** store detected segments ***/ - for (i = 0; i < iseg; ++i) - if (seg[i].ok) - { - seglist[iseglist * 5] = (double) (ox + pos * mx) + dx * (double) (seg[i].start); - seglist[iseglist * 5 + 1] = (double) (oy + pos * my) + dy * (double) (seg[i].start); - seglist[iseglist * 5 + 2] = (double) (ox + pos * mx) + dx * (double) (seg[i].end); - seglist[iseglist * 5 + 3] = (double) (oy + pos * my) + dy * (double) (seg[i].end); - seglist[iseglist * 5 + 4] = -(double) log10(seg[i].nfa); - iseglist++; - /* reallocate seglist if necessary */ - if (iseglist == size_seglist) - { - size_seglist = (size_seglist * 3) / 2; - seglist.resize(size_seglist); -// if (!seglist) -// mwerror(FATAL, 1,"Not enough memory."); - } - } - } - } - /*** end of second loop ***/ - - printf(" nb de segments: %d\n", iseglist); - } - /******************** end of first loop ********************/ - - seg.clear(); - endbloc.clear(); - startbloc.clear(); - count.clear(); - test.clear(); - - /* build segments list */ - seglist.resize(5 * iseglist); - - /* build segments list */ - OutputPath->Clear(); -// OutputPath->Resize(iseglist); - - typedef typename OutputPathType::ContinuousIndexType ContinuousIndexType; - typename InputImageType::PointType point; - - ContinuousIndexType cindex; - for (i = 0; i < iseglist; ++i) - { - - OutputPathPointerType path = OutputPathType::New(); - - path->Initialize(); - point[0] = seglist[i * 5]; - point[1] = seglist[i * 5 + 1]; - InputImage->TransformPhysicalPointToContinuousIndex(point, cindex); - path->AddVertex(cindex); - cindex[0] = seglist[i * 5 + 2]; - cindex[1] = seglist[i * 5 + 3]; - path->AddVertex(cindex); - - OutputPath->PushBack(path); - } - itkDebugMacro(<< "ImageToPathListAlignFilter::GenerateData() finished"); - -} // end update function - -template <class TInputImage, class TOutputPath> -void -ImageToPathListAlignFilter<TInputImage, TOutputPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -// os << indent << "Size : " << m_Size << std::endl; -// os << indent << "Path Value : " << m_PathValue << std::endl; -// os << indent << "Background Value : " << m_BackgroundValue << std::endl; -} - -} // end namespace otb - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h deleted file mode 100644 index 26b8f1c84b1ba6ab47644027d48b28e7d124a64f..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLikelihoodPathListFilter_h -#define otbLikelihoodPathListFilter_h - -#include "otbPathListToPathListFilter.h" -#include "otbMacro.h" -#include <string> - -namespace otb -{ -/** \class LikelihoodPathListFilter - * \brief Affect a value to each path of the list based on the image - * - * PathList and image are given as an input, the filter affect a value to each - * path: this value is equal to the sum of the pixels crossed by the path - * (using a PolyLineImageConstIterator) divided by the number of points in the - * path - * - * - * \ingroup OTBRoadExtraction - */ -template <class TPath, class TImage> -class ITK_EXPORT LikelihoodPathListFilter - : public PathListToPathListFilter<TPath> -{ -public: - /** Standard typedefs */ - typedef LikelihoodPathListFilter Self; - typedef PathListToPathListFilter<TPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(LikelihoodPathListFilter, PathListToPathListFilter); - - /** Template parameters typedefs */ - typedef typename Superclass::PathType PathType; - typedef typename Superclass::PathListType PathListType; - typedef typename Superclass::PathPointerType PathPointerType; - typedef typename PathListType::Pointer PathListPointerType; - typedef typename PathListType::ConstIterator IteratorType; - typedef typename PathType::VertexType VertexType; - typedef typename PathType::VertexListType VertexListType; - typedef typename VertexListType::ConstIterator VertexIteratorType; - typedef double RealType; - - typedef TImage ImageType; - typedef typename ImageType::Pointer ImagePointerType; - typedef typename ImageType::ConstPointer ImageConstPointerType; - - /** - * Set the input Likelihood image. - * \param image The Likelihood image. - */ - void SetInputImage(const ImageType * image); - - /** - * Get the input Likelihood image. - * \return The input Likelihood image. - */ - const ImageType * GetInputImage(void); - -protected: - /** Constructor */ - LikelihoodPathListFilter(); - /** Destructor */ - ~LikelihoodPathListFilter() override {} - /** GenerateData method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - LikelihoodPathListFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - std::string m_Key; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbLikelihoodPathListFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx deleted file mode 100644 index f1bcde145d843ae512d228c20b78da49c740f6ad..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbLikelihoodPathListFilter.hxx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLikelihoodPathListFilter_hxx -#define otbLikelihoodPathListFilter_hxx - -#include "otbLikelihoodPathListFilter.h" -#include "otbPolyLineImageConstIterator.h" -#include "itkMetaDataObject.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath, class TImage> -LikelihoodPathListFilter<TPath, TImage> -::LikelihoodPathListFilter() -{ - m_Key = "Value"; - this->SetNumberOfRequiredInputs(2); - this->SetNumberOfRequiredInputs(2); -} -template <class TPath, class TImage> -void -LikelihoodPathListFilter<TPath, TImage> -::SetInputImage(const ImageType * image) -{ - this->itk::ProcessObject::SetNthInput(1, const_cast<ImageType *>(image)); -} -template <class TPath, class TImage> -const typename LikelihoodPathListFilter<TPath, TImage> -::ImageType * -LikelihoodPathListFilter<TPath, TImage> -::GetInputImage(void) -{ - if (this->GetNumberOfInputs() < 1) - { - return nullptr; - } - return static_cast<const ImageType *>(this->itk::ProcessObject::GetInput(1)); -} - -template <class TPath, class TImage> -void -LikelihoodPathListFilter<TPath, TImage> -::GenerateData() -{ - // I/O wiring - ImageConstPointerType inputImagePtr = this->GetInputImage(); - const PathListType * inputPtr = this->GetInput(); - PathListType * outputPtr = this->GetOutput(); - - typedef otb::PolyLineImageConstIterator<ImageType, PathType> ImageIteratorType; - - for (IteratorType it = inputPtr->Begin(); it != inputPtr->End(); ++it) - { - PathPointerType path = it.Get(); - ImageIteratorType imageIt(inputImagePtr, path); - double cumulatedValues = 0.0; - double nbPoints = 0.0; - for (imageIt.GoToBegin(); !imageIt.IsAtEnd(); ++imageIt, ++nbPoints) - { - cumulatedValues += static_cast<double>(imageIt.Get()); - } - itk::MetaDataDictionary& dict = path->GetMetaDataDictionary(); - itk::EncapsulateMetaData<double>(dict, m_Key, cumulatedValues / nbPoints); - outputPtr->PushBack(path); - } -} -/** - * PrintSelf Method - */ -template <class TPath, class TImage> -void -LikelihoodPathListFilter<TPath, TImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h deleted file mode 100644 index 6fb1aef06fff2f50bd862718d6a8763357afe71e..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLinkPathListFilter_h -#define otbLinkPathListFilter_h - -#include "otbPathListToPathListFilter.h" -#include "otbMacro.h" - -namespace otb -{ -/** \class LinkPathListFilter - * \brief This filters link path from the input path list according to distance and angular criterions. - * - * This filter examines both ends of each path to link and is able to link several path into one single path. - * The two criterions to link a path are : - * - The two ends to link must be closer than the user defined threshold in terms of euclidean distance, - * - The angle at the link must not be sharp (less than the user defined threshold). - * - * Please note that this filter may invert the order of the vertices in the newly created path. - * - * This filter is part of the road extraction framework. - * - * \sa ParallelLinePathListFilter - * - * \ingroup PathFilters - * - * - * \ingroup OTBRoadExtraction - */ -template <class TPath> -class ITK_EXPORT LinkPathListFilter - : public PathListToPathListFilter<TPath> -{ -public: - /** Standard typedefs */ - typedef LinkPathListFilter Self; - typedef PathListToPathListFilter<TPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(LinkPathListFilter, PathListToPathListFilter); - - /** Template parameters typedefs */ - typedef typename Superclass::PathType PathType; - typedef typename Superclass::PathListType PathListType; - typedef typename Superclass::PathPointerType PathPointerType; - typedef typename PathListType::Pointer PathListPointerType; - typedef typename PathListType::ConstIterator IteratorType; - typedef typename PathType::VertexType VertexType; - typedef typename PathType::VertexListType VertexListType; - typedef typename VertexListType::ConstIterator VertexIteratorType; - typedef double RealType; - - itkSetMacro(AngularThreshold, RealType); - itkGetMacro(AngularThreshold, RealType); - itkSetMacro(DistanceThreshold, RealType); - itkGetMacro(DistanceThreshold, RealType); - itkSetMacro(ModuloPI, bool); - itkGetMacro(ModuloPI, bool); - -protected: - /** Constructor */ - LinkPathListFilter(); - /** Destructor */ - ~LinkPathListFilter() override {} - /** GenerateData method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** - * Verify the angular condition to link a path. - * \param v1 First vertex (before first path ending), - * \param v2 second vertex (first path ending), - * \param v3 third vertex (second path beginning), - * \param v4 fourth vertex (second path after beginning), - * \return True or false whether the condition is verified or not. - **/ - bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4); - - /** - * Actually link the end of path p1 to the beginning of path p2. - * \param p1 First path to link, - * \param revert1 whether p1 need to be reverted or not, - * \param p2 second path to link, - * \param revert2 whether p2 need to be reverted or not, - * \return the linked path. - */ - PathPointerType LinkPath(PathPointerType p1, bool revert1, PathPointerType p2, bool revert2); - -private: - LinkPathListFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - RealType m_AngularThreshold; - RealType m_DistanceThreshold; - - /// Do not use the sign of the orientation of the lines - bool m_ModuloPI; - -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbLinkPathListFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx deleted file mode 100644 index 7b2570338264626746d1614b3c6967d9718877b4..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbLinkPathListFilter.hxx +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbLinkPathListFilter_hxx -#define otbLinkPathListFilter_hxx - -#include "otbLinkPathListFilter.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath> -LinkPathListFilter<TPath> -::LinkPathListFilter() -{ - m_DistanceThreshold = 10.; - m_AngularThreshold = 3.14; - m_ModuloPI = false; -} - -template <class TPath> -void -LinkPathListFilter<TPath> -::GenerateData() -{ - // IO - const PathListType * inputPtr = this->GetInput(); - PathListType * outputPtr = this->GetOutput(); - - // Input iterator - IteratorType inputIt = inputPtr->Begin(); - - std::vector<bool> eraseFlagVector; - - // First we copy all input path to output - while (inputIt != inputPtr->End()) - { - outputPtr->PushBack(inputIt.Get()); - eraseFlagVector.push_back(false); - ++inputIt; - } - - IteratorType outputIt1 = outputPtr->Begin(); - unsigned int index1 = 0; - - while (outputIt1 != outputPtr->End()) - { - if (!eraseFlagVector[index1]) - { - IteratorType outputIt2 = outputIt1; - ++outputIt2; - // indicate if a path was found and wath is its index - unsigned int pathToLinkIndex = 0; - double distance = -1.0; - unsigned int index2 = index1 + 1; - bool found = false; - bool revert1 = false; - bool revert2 = false; - if (!eraseFlagVector[index1]) - { - while (outputIt2 != outputPtr->End()) - { - if (!eraseFlagVector[index2]) - { - //otbMsgDevMacro(<<"Examining links between path "<<index1<<" and path "<<index2); - // Examining end of path1 with beginning of path2 - VertexIteratorType vSourceIt = outputIt1.Get()->GetVertexList()->End(); - VertexIteratorType vTargetIt = outputIt2.Get()->GetVertexList()->Begin(); - --vSourceIt; - VertexType v2 = vSourceIt.Value(); - --vSourceIt; - VertexType v1 = vSourceIt.Value(); - VertexType v3 = vTargetIt.Value(); - ++vTargetIt; - VertexType v4 = vTargetIt.Value(); - double tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2)); - if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance))) - { - if (VerifyAngularCondition(v1, v2, v3, v4)) - { - // we found a better candidate - //otbMsgDevMacro(<<"Link between end of path "<<index1<<" and beginning of path "<<index2<<" is currently the best choice"); - distance = tmpDistance; - pathToLinkIndex = index2; - revert1 = false; - revert2 = false; - if (!found) - { - found = true; - } - } - } - // Examining end of path1 with end of path2 - vTargetIt = outputIt2.Get()->GetVertexList()->End(); - --vTargetIt; - v3 = vTargetIt.Value(); - --vTargetIt; - v4 = vTargetIt.Value(); - tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2)); - - if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance))) - { - if (VerifyAngularCondition(v1, v2, v3, v4)) - { - // we found a better candidate - //otbMsgDevMacro(<<"Link between end of path "<<index1<<" and end of path "<<index2<<" is currently the best choice"); - distance = tmpDistance; - pathToLinkIndex = index2; - revert1 = false; - revert2 = true; - if (!found) - { - found = true; - } - } - } - // Examining beginning of path1 with end of path2 - vSourceIt = outputIt1.Get()->GetVertexList()->Begin(); - v2 = vSourceIt.Value(); - ++vSourceIt; - v1 = vSourceIt.Value(); - tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2)); - - if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance))) - { - if (VerifyAngularCondition(v1, v2, v3, v4)) - { - // we found a better candidate - //otbMsgDevMacro(<<"Link between beginning of path "<<index1<<" and end of path "<<index2<<" is currently the best choice"); - distance = tmpDistance; - pathToLinkIndex = index2; - revert1 = true; - revert2 = true; - if (!found) - { - found = true; - } - } - } - // Examining beginning of path1 with beginning of path2 - vTargetIt = outputIt2.Get()->GetVertexList()->Begin(); - v3 = vTargetIt.Value(); - ++vTargetIt; - v4 = vTargetIt.Value(); - tmpDistance = std::sqrt(std::pow(v2[0] - v3[0], 2) + std::pow(v2[1] - v3[1], 2)); - if ((tmpDistance < static_cast<double>(m_DistanceThreshold)) && ((!found) || (tmpDistance < distance))) - { - if (VerifyAngularCondition(v1, v2, v3, v4)) - { - // we found a better candidate - //otbMsgDevMacro(<<"Link between beginning of path "<<index1<<" and beginning of path "<<index2<<" is currently the best choice"); - distance = tmpDistance; - pathToLinkIndex = index2; - revert1 = true; - revert2 = false; - if (!found) - { - found = true; - } - } - } - } - ++index2; - ++outputIt2; - } - if (found) - { - //otbMsgDevMacro(<<"Search ended, merging path "<<index1<<" and path "<<pathToLinkIndex); - // an appropriate path was found - outputIt2 = outputPtr->Begin() + pathToLinkIndex; - PathPointerType newPath = this->LinkPath(outputIt1.Get(), revert1, outputIt2.Get(), revert2); - outputPtr->PushBack(newPath); - // add a non erased flag for the new path - eraseFlagVector.push_back(false); - // mark the old path as erased - eraseFlagVector[index1] = true; - eraseFlagVector[pathToLinkIndex] = true; - } - } - } - ++index1; - // This replaces ++outputIt1 because the iterators is somehow invalidated by a pushback. - outputIt1 = outputPtr->Begin() + index1; - } - - // search ended, now removing the erased path - typename std::vector<bool>::reverse_iterator it = eraseFlagVector.rbegin(); - index1 = eraseFlagVector.size() - 1; - while (it != eraseFlagVector.rend()) - { - if (eraseFlagVector[index1]) - { - outputPtr->Erase(index1); - } - --index1; - ++it; - } -} -/** - * Verify the angular condition to link a path. - * \param v1 First vertex (before first path ending), - * \param v2 second vertex (first path ending), - * \param v3 third vertex (second path beginning), - * \param v4 fourth vertex (second path after beginning), - * \return True or false whether the condition is verified or not. - **/ -template <class TPath> -bool -LinkPathListFilter<TPath> -::VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4) -{ - double alpha1 = std::atan2((v2[1] - v1[1]), (v2[0] - v1[0])); - double alpha2 = std::atan2((v4[1] - v3[1]), (v4[0] - v3[0])); - double alpha3 = std::atan2((v3[1] - v2[1]), (v3[0] - v2[0])); - - if (m_ModuloPI) - { - alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_PI); - alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_PI); - alpha3 = (alpha3 >= 0) ? alpha3 : (alpha3 + CONST_PI); - } - else - { - alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_2PI); - alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_2PI); - alpha3 = (alpha3 >= 0) ? alpha3 : (alpha3 + CONST_2PI); - } - - bool resp = (std::abs(alpha1 - alpha2) < static_cast<double>(m_AngularThreshold)) - && (std::abs(alpha1 - alpha3) < static_cast<double>(m_AngularThreshold)) - && (std::abs(alpha2 - alpha3) < static_cast<double>(m_AngularThreshold)); - return resp; -} -/** - * Actually link the end of path p1 to the beginning of path p2. - * \param p1 First path to link, - * \param revert1 whether p1 need to be reverted or not, - * \param p2 second path to link, - * \param revert2 whether p2 need to be reverted or not, - * \return the linked path. - */ -template <class TPath> -typename LinkPathListFilter<TPath> -::PathPointerType -LinkPathListFilter<TPath> -::LinkPath(PathPointerType p1, bool revert1, PathPointerType p2, bool revert2) -{ - PathPointerType resp = PathType::New(); - - VertexIteratorType it; - - if (revert1) - { - for (it = (p1->GetVertexList()->End()); it != p1->GetVertexList()->Begin(); ) - { - --it; - resp->AddVertex((it).Value()); - } - } - else - { - for (it = p1->GetVertexList()->Begin(); it != p1->GetVertexList()->End(); ++it) - { - resp->AddVertex((it).Value()); - } - } - - if (revert2) - { - for (it = (p2->GetVertexList()->End()); it != p2->GetVertexList()->Begin(); ) - { - --it; - resp->AddVertex((it).Value()); - } - } - else - { - for (it = p2->GetVertexList()->Begin(); it != p2->GetVertexList()->End(); ++it) - { - resp->AddVertex(it.Value()); - } - } - return resp; -} -/** - * PrintSelf Method - */ -template <class TPath> -void -LinkPathListFilter<TPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h b/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h deleted file mode 100644 index 9406349db143cd333c4ad3359a4196c38667bde8..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbModulusAndDirectionImageToImageFilter_h -#define otbModulusAndDirectionImageToImageFilter_h - -#include "itkImageToImageFilter.h" - -namespace otb -{ - -/** \class ModulusAndDirectionImageToImageFilter - * - * \brief Base class for modulus and direction image filters. - * - * This is the base class for alls class' generate an image dulus and - * by using an modulus and a direction images intputs. - * SetInput() method set the modulus image input and - * SetInputDirection() set the image direction input. - * - * - * \ingroup OTBRoadExtraction - */ -template <class TInputImage, - class TInputImageDirection, - class TOutputImage> -class ITK_EXPORT ModulusAndDirectionImageToImageFilter : public itk::ImageToImageFilter<TInputImage, TOutputImage> -{ -public: - /** Extract dimensions as well of the images of entry of exit. */ - itkStaticConstMacro(InputImageDimension, - unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OutputImageDimension, - unsigned int, - TOutputImage::ImageDimension); - - /** typedef for the classes standards. */ - typedef ModulusAndDirectionImageToImageFilter Self; - typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for management of the object factory. */ - itkNewMacro(Self); - - /** Return the name of the class. */ - itkTypeMacro(ModulusAndDirectionImageToImageFilter, itk::ImageToImageFilter); - - typedef typename Superclass::InputImageType InputImageType; - typedef TInputImageDirection InputImageDirectionType; - typedef typename Superclass::OutputImageType OutputImageType; - - /** Set/Get the image input of this process object. */ - using Superclass::SetInput; - void SetInput(const InputImageType *input) override; - virtual void SetInputDirection(const InputImageDirectionType *direction); - const InputImageType * GetInput(void); - const InputImageDirectionType * GetInputDirection(void); - -protected: - ModulusAndDirectionImageToImageFilter(); - ~ModulusAndDirectionImageToImageFilter() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - ModulusAndDirectionImageToImageFilter(const Self &) = delete; - void operator =(const Self&) = delete; - -}; -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbModulusAndDirectionImageToImageFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx b/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx deleted file mode 100644 index 159b2b95d789e01d3d855e773007fa7ad30e51e1..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbModulusAndDirectionImageToImageFilter.hxx +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbModulusAndDirectionImageToImageFilter_hxx -#define otbModulusAndDirectionImageToImageFilter_hxx - -#include "otbModulusAndDirectionImageToImageFilter.h" -#include "itkProcessObject.h" - -namespace otb -{ - -/** - * - */ -template <class TInputImage, class TOutputImage, class TOutputImageDirection> -ModulusAndDirectionImageToImageFilter<TInputImage, TOutputImage, TOutputImageDirection>:: -ModulusAndDirectionImageToImageFilter() -{ - this->SetNumberOfRequiredInputs(2); - this->SetNumberOfRequiredInputs(2); - this->SetNumberOfRequiredOutputs(1); - this->SetNumberOfRequiredOutputs(1); - - this->SetNthOutput(0, OutputImageType::New()); -} - -template <class TInputImage, class TInputImageDirection, class TOutputImage> -void -ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>:: -SetInput(const InputImageType *input) -{ - // Process object is not const-correct so the const_cast is required here - this->itk::ProcessObject::SetNthInput(0, - const_cast<InputImageType *>(input)); -} - -template <class TInputImage, class TInputImageDirection, class TOutputImage> -void -ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>:: -SetInputDirection(const InputImageDirectionType *direction) -{ - // Process object is not const-correct so the const_cast is required here - this->itk::ProcessObject::SetNthInput(1, - const_cast<InputImageDirectionType *>(direction)); -} - -/** Return the input image modulus */ -template <class TInputImage, class TInputImageDirection, class TOutputImage> -const typename ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>::InputImageType * -ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>:: -GetInput(void) -{ - if (this->GetNumberOfInputs() < 1) - { - return nullptr; - } - - return static_cast<const TInputImage *> - (this->itk::ProcessObject::GetInput(0)); -} - -/** Return the intput image direction */ -template <class TInputImage, class TInputImageDirection, class TOutputImage> -const typename ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, - TOutputImage>::InputImageDirectionType * -ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>:: -GetInputDirection(void) -{ - if (this->GetNumberOfInputs() < 2) - { - return nullptr; - } - - return static_cast<const TInputImageDirection *> - (this->itk::ProcessObject::GetInput(1)); - -} - -/** - * Standard "PrintSelf" method - */ -template <class TInputImage, class TInputImageDirection, class TOutputImage> -void -ModulusAndDirectionImageToImageFilter<TInputImage, TInputImageDirection, TOutputImage>:: -PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - -} - -} // end namespace otb - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h deleted file mode 100644 index b5f2ccb57daa26d30ec5aa8ab1137b312f3e8db6..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.h +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNeighborhoodScalarProductFilter_h -#define otbNeighborhoodScalarProductFilter_h - -#include "otbImageToModulusAndDirectionImageFilter.h" - -namespace otb -{ -/** \class NeighborhoodScalarProductFilter - * \brief This filter is designed to be part of a pipeline aiming at linear feature extraction, such as roads. - * - * This filter takes as input a two-band image resulting from a gradient operator. The first channel contains - * the gradient value in the first image direction, the second contains the gradient value in the second image direction. - * - * Assuming that the linear feature we want to detect is darker than its surrounding environnement, we can deduce that - * the gradient direction will be opposite on each side of the road. Therefore, we compute for each pixel to compute the scalar - * product of the gradient vector for each opposite pixels in the neighborhood of radius 1 of the pixel to compute. - * - * The lower negativ scalar product value along these four pairs of pixel gives us the direction in which there is most - * likely a linear feature. - * - * This filters has two outputs : - * - The first output (from the GetOutput() method) gives the modulus of the lower negativ scalar product value for this pixel. - * - The second output (from the GetOutputDirection() method) gives the direction in radian of this linear feature. - * - * Please note that there are only 8 possible values for the direction image, corresponding to two directions for each pair of opposite - * pixels. In our conventions, negatives angle values represent opposite gradient vectors, whereas positive angle values represent convergent - * gradient vectors. - * \ingroup Streamed - * \ingroup Threaded - * - * \ingroup OTBRoadExtraction - */ -template <class TInputImage, class TOutputModulus, class TOutputDirection> -class ITK_EXPORT NeighborhoodScalarProductFilter - : public ImageToModulusAndDirectionImageFilter<TInputImage, TOutputModulus, TOutputDirection> -{ -public: - /** Standard typedefs */ - typedef NeighborhoodScalarProductFilter Self; - typedef ImageToModulusAndDirectionImageFilter<TInputImage, TOutputModulus, TOutputDirection> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NeighborhoodScalarProductFilter, ImageToModulusAndDirectionImageFilter); - - /** Template parameters typedefs */ - typedef TInputImage InputImageType; - typedef typename InputImageType::ConstPointer InputImageConstPointerType; - typedef typename InputImageType::PixelType InputPixelType; - typedef TOutputModulus OutputModulusType; - typedef typename OutputModulusType::Pointer OutputModulusPointerType; - typedef typename OutputModulusType::RegionType RegionType; - typedef typename OutputModulusType::SizeType SizeType; - typedef typename OutputModulusType::IndexType IndexType; - typedef TOutputDirection OutputDirectionType; - typedef typename OutputDirectionType::Pointer OutputDirectionPointerType; - typedef typename OutputDirectionType::RegionType OutputImageRegionType; - -protected: - /** Constructor */ - NeighborhoodScalarProductFilter(); - /** Destructor */ - ~NeighborhoodScalarProductFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** NeighborhoodScalarProductImageFilter can be implemented as a multithreaded filter. - * Therefore, this implementation provides a ThreadedGenerateData() routine - * which is called for each processing thread. The output image data is - * allocated automatically by the superclass prior to calling - * ThreadedGenerateData(). ThreadedGenerateData can only write to the - * portion of the output image specified by the parameter - * "outputRegionForThread" - * - * \sa ImageToImageFilter::ThreadedGenerateData(), - * ImageToImageFilter::GenerateData() */ - void ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, - itk::ThreadIdType threadId) override; -private: - NeighborhoodScalarProductFilter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNeighborhoodScalarProductFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx b/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx deleted file mode 100644 index a2f66c9a02e6430f105d371e4ff41002f8b8beba..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbNeighborhoodScalarProductFilter.hxx +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNeighborhoodScalarProductFilter_hxx -#define otbNeighborhoodScalarProductFilter_hxx - -#include "otbNeighborhoodScalarProductFilter.h" -#include "itkImageRegionIterator.h" -#include "itkConstNeighborhoodIterator.h" -#include "itkNeighborhoodAlgorithm.h" -#include "itkProgressReporter.h" - -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputModulus, class TOutputDirection> -NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection> -::NeighborhoodScalarProductFilter() -{} - -template <class TInputImage, class TOutputModulus, class TOutputDirection> -void -NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection> -::ThreadedGenerateData(const OutputImageRegionType& outputRegionForThread, itk::ThreadIdType threadId) -{ - // some typedefs - typedef itk::ConstNeighborhoodIterator<InputImageType> NeighborhoodIteratorType; - typedef typename NeighborhoodIteratorType::RadiusType RadiusType; - typedef typename NeighborhoodIteratorType::OffsetType OffsetType; - typedef itk::ImageRegionIterator<OutputModulusType> OutputIteratorType; - typedef itk::ImageRegionIterator<OutputDirectionType> OutputDirectionIteratorType; - typedef itk::NeighborhoodAlgorithm::ImageBoundaryFacesCalculator<InputImageType> BoundaryFacesCalculatorType; - typedef typename BoundaryFacesCalculatorType::FaceListType FaceListType; - typedef typename FaceListType::iterator FaceListIteratorType; - - // Pointers on inputs/outputs - InputImageType * inputPtr = const_cast<InputImageType *>(this->GetInput()); - OutputModulusPointerType outputPtr = this->GetOutput(); - OutputDirectionPointerType outputDirPtr = this->GetOutputDirection(); - - // Neighborhood radius - RadiusType r; - r.Fill(1); - - // Find the data-set boundary "faces" - BoundaryFacesCalculatorType bC; - FaceListType faceList = bC(inputPtr, outputRegionForThread, r); - FaceListIteratorType fit; - - // support progress methods/callbacks - itk::ProgressReporter progress(this, threadId, outputRegionForThread.GetNumberOfPixels()); - - // Process each of the boundary faces. These are N-d regions which border - // the edge of the buffer. - for (fit = faceList.begin(); fit != faceList.end(); ++fit) - { - NeighborhoodIteratorType neighInputIt(r, inputPtr, *fit); - OutputIteratorType outputIt(outputPtr, *fit); - OutputDirectionIteratorType outputDirIt(outputDirPtr, *fit); - neighInputIt.GoToBegin(); - outputIt.GoToBegin(); - outputDirIt.GoToBegin(); - - while ((!neighInputIt.IsAtEnd()) && (!outputIt.IsAtEnd()) && (!outputDirIt.IsAtEnd())) - { - // local variable initialization - int neighborhoodNumberMax = 0; - double scalarMaxValue = 0; - //TODO for a more general algorithm this might be replaced by: - //double scalarMaxValue = itk::NumericTraits<double>::NonpositiveMin(); - int flagPosNegDirection = 0; - - // walk through each case - for (int neighborhoodNumber = 0; neighborhoodNumber < 4; ++neighborhoodNumber) - { - double scalarCurrentValue = 0.0; - OffsetType offset1; - OffsetType offset2; - switch (neighborhoodNumber) - { - case 0: - offset1[0] = 1; - offset1[1] = -1; - offset2[0] = -1; - offset2[1] = 1; - break; - case 1: - offset1[0] = 1; - offset1[1] = 0; - offset2[0] = -1; - offset2[1] = 0; - break; - case 2: - offset1[0] = 1; - offset1[1] = 1; - offset2[0] = -1; - offset2[1] = -1; - break; - case 3: - offset1[0] = 0; - offset1[1] = 1; - offset2[0] = 0; - offset2[1] = -1; - break; - } - // Get the gradient values - InputPixelType pixel1 = neighInputIt.GetPixel(offset1); - InputPixelType pixel2 = neighInputIt.GetPixel(offset2); - - // Compute the scalar product - scalarCurrentValue = -(pixel1[0] * pixel2[0] + pixel1[1] * pixel2[1]); - - // If the value is higher than the current max value - if (scalarCurrentValue > scalarMaxValue) - { - // keep this configuration - scalarMaxValue = scalarCurrentValue; - neighborhoodNumberMax = neighborhoodNumber; - - // Also keep the direction - if (pixel1[0] < 0) - { - flagPosNegDirection = 1; - } - else - { - flagPosNegDirection = 0; - } - - } - } - // Compute the direction - double angle = static_cast<double>((1 + neighborhoodNumberMax)) * static_cast<double>(CONST_PI_4); - if (flagPosNegDirection) - { - angle -= CONST_PI; - } - - // Set the output values - outputIt.Set(scalarMaxValue); - outputDirIt.Set(angle); - ++neighInputIt; - ++outputIt; - ++outputDirIt; - progress.CompletedPixel(); - } - } -} -/** - * PrintSelf Method - */ -template <class TInputImage, class TOutputModulus, class TOutputDirection> -void -NeighborhoodScalarProductFilter<TInputImage, TOutputModulus, TOutputDirection> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h deleted file mode 100644 index 4e6d12cce270fde7ccf6d77c7be4c8e4b55b7ae4..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbNonMaxRemovalByDirectionFilter.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNonMaxRemovalByDirectionFilter_h -#define otbNonMaxRemovalByDirectionFilter_h - -#include "otbModulusAndDirectionImageToImageFilter.h" -#include "otbBinaryFunctorNeighborhoodImageFilter.h" - -#include "otbMath.h" - -namespace otb -{ -namespace Functor -{ -/** \class NonMaxRemovalByDirectionFunctor - * \brief This functor is used by the NonMaxRemovalByDirectionFilter - * \sa NonMaxRemovalByDirectionFilter - * \ingroup Functor - * - * \ingroup OTBRoadExtraction - */ -template <class TInput1, class TInput2, class TOutput> -class NonMaxRemovalByDirectionFunctor -{ -public: - NonMaxRemovalByDirectionFunctor() {} - virtual ~NonMaxRemovalByDirectionFunctor() {} - inline TOutput operator ()(const TInput1& itA, const TInput2& itB) - { - TOutput resp = 0; - if (itA.GetCenterPixel() != 0) - { - typename TInput1::OffsetType offset1, offset2; - offset1.Fill(0); - offset2.Fill(0); - int neighborhoodNumber; - if (itB.GetCenterPixel() > 0) - { - neighborhoodNumber = static_cast<int>(itB.GetCenterPixel() / (CONST_PI_4) -1); - } - else - { - neighborhoodNumber = static_cast<int>((itB.GetCenterPixel() + CONST_PI) / (CONST_PI_4) -1); - } - switch (neighborhoodNumber) - { - case 0: - offset1[0] = 1; - offset1[1] = -1; - offset2[0] = -1; - offset2[1] = 1; - break; - case 1: - offset1[0] = 1; - offset1[1] = 0; - offset2[0] = -1; - offset2[1] = 0; - break; - case 2: - offset1[0] = 1; - offset1[1] = 1; - offset2[0] = -1; - offset2[1] = -1; - break; - case 3: - offset1[0] = 0; - offset1[1] = 1; - offset2[0] = 0; - offset2[1] = -1; - break; - } - if ((itA.GetCenterPixel() > itA.GetPixel(offset1)) - && (itA.GetCenterPixel() > itA.GetPixel(offset2))) - { - resp = itA.GetCenterPixel(); - } - } - return resp; - } -}; -} -/** \class NonMaxRemovalByDirectionFilter - * \brief This filters removes (sets to null intensity) pixels which are not the maxima of the - * scalar product modulus value in the given direction. - * - * \ingroup Streamed - * \ingroup Threaded - * - * \ingroup OTBRoadExtraction - */ -template <class TInputModulus, class TInputDirection, class TOutputImage> -class ITK_EXPORT NonMaxRemovalByDirectionFilter - : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef NonMaxRemovalByDirectionFilter Self; - typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NonMaxRemovalByDirectionFilter, ModulusAndDirectionImageToImageFilter); - - /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as - using the BinaryFunctorNeighBorhoodImageFilter, which is appropriate here */ - typedef Functor::NonMaxRemovalByDirectionFunctor< - typename itk::ConstNeighborhoodIterator<TInputModulus>, - typename itk::ConstNeighborhoodIterator<TInputDirection>, - typename TOutputImage::PixelType> FunctorType; - typedef otb::BinaryFunctorNeighborhoodImageFilter<TInputModulus, TInputDirection, TOutputImage, - FunctorType> ComputingFilterType; - -protected: - /** Constructor */ - NonMaxRemovalByDirectionFilter() {}; - /** Destructor */ - ~NonMaxRemovalByDirectionFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override - { - Superclass::PrintSelf(os, indent); - } - /** Main computation method */ - void GenerateData(void) override - { - typename ComputingFilterType::Pointer filter = ComputingFilterType::New(); - filter->SetInput1(this->GetInput()); - filter->SetInput2(this->GetInputDirection()); - filter->GraftOutput(this->GetOutput()); - filter->Update(); - this->GraftOutput(filter->GetOutput()); - } - -private: - NonMaxRemovalByDirectionFilter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h deleted file mode 100644 index 3cabe035adffb2aca8f72e1c236dbe930767dcf5..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.h +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbParallelLinePathListFilter_h -#define otbParallelLinePathListFilter_h - -#include "otbPathListToPathListFilter.h" -#include "otbMacro.h" - -namespace otb -{ -/** \class ParallelLinePathListFilter - * \brief Detects parallel lines in imagery, the required input data are a PathList object. - * - * The class consists of three basic functions that determine the angle between two lines, - * the distance between the lines and the common part of the lines. First, all input lines - * are checked if there is a second line running in the same direction. Thereafter, all line - * pairs that already fulfilled the angular criterion are checked whether they are close to - * each other or not, i.e. the orthogonal distance between them is calculated. Finally, it - * has to be verified if the two lines have a common part since lines may fulfill the two - * first criteria but be located in different parts of the image. In order to adapt the - * detection algorithm to the user's needs, the thresholds AngularThreshold, DistanceThreshold - * and CommonDistanceThreshold can be set. - * - * A possible processing chain would be to extract lines with a line detector, to convert the - * result to PathList object (an ObjectList of PolyLineParametricPath), to link short line - * segments with the otbLinkPathListFilter to longer lines and to finally detect all parallel - * long lines. - * - * \sa LinkPathListFilter - * - * \ingroup PathFilters - * - * - * \ingroup OTBRoadExtraction - */ -template <class TPath> -class ITK_EXPORT ParallelLinePathListFilter - : public PathListToPathListFilter<TPath> -{ -public: - /** Standard typedefs */ - typedef ParallelLinePathListFilter Self; - typedef PathListToPathListFilter<TPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(ParallelLinePathListFilter, PathListToPathListFilter); - - /** Template parameters typedefs */ - typedef typename Superclass::PathType PathType; - typedef typename Superclass::PathListType PathListType; - typedef typename Superclass::PathPointerType PathPointerType; - typedef typename PathListType::Pointer PathListPointerType; - typedef typename PathListType::ConstIterator IteratorType; - typedef typename PathType::VertexType VertexType; - typedef typename PathType::VertexListType VertexListType; - typedef typename VertexListType::ConstIterator VertexIteratorType; - typedef double RealType; - - itkSetMacro(AngularThreshold, RealType); - itkGetMacro(AngularThreshold, RealType); - itkSetMacro(DistanceThreshold, RealType); - itkGetMacro(DistanceThreshold, RealType); - itkSetMacro(CommonDistanceThreshold, RealType); - itkGetMacro(CommonDistanceThreshold, RealType); - -protected: - /** Constructor */ - ParallelLinePathListFilter(); - /** Destructor */ - ~ParallelLinePathListFilter() override {} - /** GenerateData method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - /** - * Verify the angular condition to find parallel lines. - * This function verifies if two lines are parallel by - * computing the angle in relation to the y-axis. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the first criteria to be fulfilled. - **/ - bool VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4); - - /** - * Verify the maximum distance condition to find parallel lines. - * The orthogonal distance between two parallel lines is calculated. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the second criteria to be fulfilled. - **/ - bool VerifyMaxDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4); - - /** - * Verify the common distance condition to find parallel lines. - * The overlapping part of the parallel lines is computed. In case - * no overlapping part exists or the value is below the specified - * threshold, false is returned. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the third criteria to be fulfilled. - **/ - bool VerifyCommonDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4); - - /** - * Write the first parallel path. - * p1: First parallel path (line segment), - */ - PathPointerType WriteParallelPath(PathPointerType p1); - -private: - ParallelLinePathListFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - RealType m_AngularThreshold; - RealType m_DistanceThreshold; - RealType m_CommonDistanceThreshold; - -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbParallelLinePathListFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx b/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx deleted file mode 100644 index 44eb3c082fa64a768954134cb6fa251f40f6e99f..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbParallelLinePathListFilter.hxx +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbParallelLinePathListFilter_hxx -#define otbParallelLinePathListFilter_hxx - -#include "otbParallelLinePathListFilter.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath> -ParallelLinePathListFilter<TPath> -::ParallelLinePathListFilter() -{ - m_DistanceThreshold = 100.; - m_CommonDistanceThreshold = 10.; - m_AngularThreshold = 3.14; -} - -template <class TPath> -void -ParallelLinePathListFilter<TPath> -::GenerateData() -{ - // IO - const PathListType * inputPtr = this->GetInput(); - PathListType * outputPtr = this->GetOutput(); - - // Input iterator - IteratorType inputIt = inputPtr->Begin(); - - std::vector<bool> eraseFlagVector1; - std::vector<unsigned int> parallelLineIndex; - - // First we copy all input path to output - while (inputIt != inputPtr->End()) - { - // Write the next input path always to the - // last element of the list. This last element is - // newly created. - outputPtr->PushBack(inputIt.Get()); - - // If a new element is copied to the output vector, - // "false" is written to the corresponding index of - // the vector eraseFlagVector. - eraseFlagVector1.push_back(false); - - ++inputIt; - } - - unsigned int VectorSize = static_cast<unsigned int>(eraseFlagVector1.size()); - //std::cout<<" Number of Lines: "<< VectorSize <<std::endl; - - IteratorType outputIt1 = outputPtr->Begin(); - unsigned int index1 = 0; - unsigned int firstLineCounter = 0, parallelLineCounter = 0; - unsigned int commonDistCounter = 0, maxDistCounter = 0; - -// Iterate through all lines of the pathlist - while (firstLineCounter < VectorSize) - { - if (!eraseFlagVector1[index1]) - { - IteratorType outputIt2 = outputIt1; - ++outputIt2; - unsigned int index2 = index1 + 1; - - // Check if any of the following lines are parallel - while (outputIt2 != outputPtr->End()) - { - - if (!eraseFlagVector1[index2]) - { // Read the first and the last vertex of each line pair that is checked - VertexIteratorType vSourceIt = outputIt1.Get()->GetVertexList()->Begin(); - VertexType v1 = vSourceIt.Value(); - vSourceIt = outputIt1.Get()->GetVertexList()->End(); - --vSourceIt; - VertexType v2 = vSourceIt.Value(); - - VertexIteratorType vTargetIt = outputIt2.Get()->GetVertexList()->Begin(); - VertexType v3 = vTargetIt.Value(); - vTargetIt = outputIt2.Get()->GetVertexList()->End(); - --vTargetIt; - VertexType v4 = vTargetIt.Value(); - - // Check for parallel lines - if (VerifyAngularCondition(v1, v2, v3, v4)) - { - ++parallelLineCounter; - if (VerifyMaxDistanceCondition(v1, v2, v3, v4)) - { - ++maxDistCounter; - if (VerifyCommonDistanceCondition(v1, v2, v3, v4)) - { - ++commonDistCounter; - // Write index of first parallel path - parallelLineIndex.push_back(index1); - - // Write index of second parallel path - parallelLineIndex.push_back(index2); - } - } - } - } - - ++index2; - ++outputIt2; - } - } - - // mark the old path as erased - eraseFlagVector1[index1] = true; - ++firstLineCounter; - ++index1; - ++outputIt1; - } // end of for loop - - otbMsgDevMacro( << "Number of line pairs that pass the angular condition: " << parallelLineCounter ); - otbMsgDevMacro( << "Number of line pairs that pass the maximum distance condition: " << maxDistCounter ); - otbMsgDevMacro( << "Number of line pairs that pass the common distance condition: " << commonDistCounter ); - - // Write all parallel lines and set the non-erase flagg. - typename std::vector<unsigned int>::iterator lineIt1 = parallelLineIndex.begin(); - unsigned int sortLineIndex = 0; - while (lineIt1 != parallelLineIndex.end()) - { - IteratorType outputIt3 = outputPtr->Begin() + parallelLineIndex[sortLineIndex]; - - PathPointerType newPath1 = this->WriteParallelPath(outputIt3.Get()); - outputPtr->PushBack(newPath1); - // add a non-erase flag for the new path - eraseFlagVector1.push_back(false); - ++sortLineIndex; - otbMsgDevMacro( << "Number of lines written in the path list: " << sortLineIndex ); - ++lineIt1; - } - - // Search ended, now removing the erased path from the first line pointer - typename std::vector<bool>::reverse_iterator it1 = eraseFlagVector1.rbegin(); - index1 = eraseFlagVector1.size() - 1; - while (it1 != eraseFlagVector1.rend()) - { - if (eraseFlagVector1[index1]) - { - outputPtr->Erase(index1); - } - - --index1; - ++it1; - } - -} -/** - * Verify the angular condition to find parallel lines. - * This function verifies if two lines are parallel by - * computing the angle in relation to the y-axis. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the first criteria to be fulfilled. - **/ -template <class TPath> -bool -ParallelLinePathListFilter<TPath> -::VerifyAngularCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4) -{ - double alpha1 = std::atan2((v2[1] - v1[1]), (v2[0] - v1[0])); - double alpha2 = std::atan2((v4[1] - v3[1]), (v4[0] - v3[0])); - - alpha1 = (alpha1 >= 0) ? alpha1 : (alpha1 + CONST_PI); - alpha2 = (alpha2 >= 0) ? alpha2 : (alpha2 + CONST_PI); - - // Return true if the angle between the two lines is smaller than - // the specified threshold. - bool angle = (std::abs(alpha1 - alpha2) < static_cast<double>(m_AngularThreshold)); - - return angle; -} - -/** - * Verify the maximum distance condition to find parallel lines. - * The orthogonal distance between two parallel lines is calculated. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the second criteria to be fulfilled. - **/ -template <class TPath> -bool -ParallelLinePathListFilter<TPath> -::VerifyMaxDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType itkNotUsed(v4)) -{ - // Compute the direction vector of the first line - VertexType vectorDir12; - - vectorDir12[0] = v2[0] - v1[0]; - vectorDir12[1] = v2[1] - v1[1]; - - // Compute the orthogonal distance between the two parallel lines - // with equation d = |(v3 - v1)X(v2 - v1)|/|v2 - v1| - double distance = 0., denominator = 0., nominator = 0.; - denominator = std::abs((v3[0] - v1[0]) * vectorDir12[1] - (v3[1] - v1[1]) * vectorDir12[0]); - nominator = sqrt(pow(vectorDir12[0], 2) + pow(vectorDir12[1], 2)); - distance = denominator / nominator; - //std::cout<< "Distance between two parallel lines: " << distance <<std::endl; - - // Check if the orthogonal distance between the lines - // is beneath the chosen threshold. - bool dist = (distance <= static_cast<double>(m_DistanceThreshold)); - - return dist; -} - -/** - * Verify the common distance condition to find parallel lines. - * The overlapping part of the parallel lines is computed. In case - * no overlapping part exists or the value is below the specified - * threshold, false is returned. - * First line segment: v1 is the first vertex, v2 the second one - * (not necessarily the path ending). - * Second line segment: v3 is the first vertex, v4 the second one - * (not necessarily the path ending). - * Return true if the condition is verified. - * - * This is the third criteria to be fulfilled. - **/ -template <class TPath> -bool -ParallelLinePathListFilter<TPath> -::VerifyCommonDistanceCondition(VertexType v1, VertexType v2, VertexType v3, VertexType v4) -{ -// Compute the length of each line - double length12 = 0.; - // double length34 = 0.; - length12 = sqrt(pow((v2[0] - v1[0]), 2) + pow((v2[1] - v1[1]), 2)); - //length34 = sqrt(pow((v4[0] - v3[0]), 2) + pow((v4[1] - v3[1]), 2)); - - // Set v1[0] to zero and align the y-axis of - // the new coordinate system with line one (v1 and v2). - // Compute the coordinates of the first and of the - // second line in the new coordinate system. - VertexType tempv1, tempv2, tempv3, tempv4; - - //Initialization - tempv1.Fill(0.); - tempv2.Fill(0.); - tempv3.Fill(0.); - tempv4.Fill(0.); - - if (v1[1] == v2[1]) - { - if (v1[0] < v2[0]) - { - tempv1[0] = 0., tempv1[1] = 0.; - tempv2[0] = 0., tempv2[1] = length12; - tempv3[0] = v3[0] - v1[0], tempv3[1] = v3[1] - v1[1]; - tempv4[0] = v4[0] - v1[0], tempv4[1] = v4[1] - v1[1]; - } - else - { - tempv2[0] = 0., tempv2[1] = 0.; - tempv1[0] = 0., tempv1[1] = length12; - tempv3[0] = v3[0] - v2[0], tempv3[1] = v3[1] - v2[1]; - tempv4[0] = v4[0] - v2[0], tempv4[1] = v4[1] - v2[1]; - } - } - // Check the direction of the line (vector). - // The origin of the new coordinate system is - // set to the smaller of the two vertices. - // Then, a rotation and translation of the vertices - // of the second line (v3 and v4) to the new coordinate - // system is performed. - - VertexType temptransv3, temptransv4; - - if (v1[1] < v2[1]) - { - if (v1[0] == v2[0]) - { - tempv1[0] = 0., tempv1[1] = 0.; - tempv2[0] = 0., tempv2[1] = length12; - tempv3[0] = v3[0] - v1[0], tempv3[1] = v3[1] - v1[1]; - tempv4[0] = v4[0] - v1[0], tempv4[1] = v4[1] - v1[1]; - } - - else - { - // Coordinates of the first line in the new coordinate system - tempv1[0] = 0.; - tempv1[1] = 0.; - tempv2[0] = 0.; - tempv2[1] = length12; - - // Rotate the system clockwise - double sinealpha; - if (v2[0] > v1[0]) - { - sinealpha = (v2[0] - v1[0]) / length12; - } - else - { - sinealpha = (v1[0] - v2[0]) / length12; - } - double alpha1 = std::asin(sinealpha); - - // Translation - temptransv3[0] = v3[0] - v1[0]; - temptransv3[1] = v3[1] - v1[1]; - temptransv4[0] = v4[0] - v1[0]; - temptransv4[1] = v4[1] - v1[1]; - - // Rotation - tempv3[0] = temptransv3[0] * cos(alpha1) + temptransv3[1] * sin(alpha1); - tempv3[1] = temptransv3[1] * cos(alpha1) - temptransv3[0] * sin(alpha1); - tempv4[0] = temptransv4[0] * cos(alpha1) + temptransv4[1] * sin(alpha1); - tempv4[1] = temptransv4[1] * cos(alpha1) - temptransv4[0] * sin(alpha1); - - otbMsgDevMacro(<< "tempv1[0], tempv1[1], tempv2[0], tempv2[1]: " ); - otbMsgDevMacro(<< tempv1[0] << ", " << tempv1[1] << ", " << tempv2[0] << ", " << tempv2[1] ); - otbMsgDevMacro(<< "Alpha: " << alpha1 ); - otbMsgDevMacro(<< "tempv3[0], tempv3[1], tempv4[0], tempv4[1]: " - << tempv3[0] << ", " << tempv3[1] << ", " - << tempv4[0] << ", " << tempv4[1] ); - otbMsgDevMacro(<< "Calculated length of the second line: " - << sqrt(pow((tempv4[0] - tempv3[0]), 2) + pow((tempv4[1] - tempv3[1]), 2)) ); - otbMsgDevMacro(<< "Original length of line 1: " << length12 ); - } - } - - if (v2[1] < v1[1]) - { - - if (v1[0] == v2[0]) - { - tempv2[0] = 0., tempv2[1] = 0.; - tempv1[0] = 0., tempv1[1] = length12; - tempv3[0] = v3[0] - v2[0], tempv3[1] = v3[1] - v2[1]; - tempv4[0] = v4[0] - v2[0], tempv4[1] = v4[1] - v2[1]; - } - else - { - tempv1[0] = 0.; - tempv1[1] = 0.; - tempv2[0] = 0.; - tempv2[1] = length12; - - // Rotate the system clockwise - double sinealpha; - if (v2[0] > v1[0]) - { - sinealpha = (v2[0] - v1[0]) / length12; - } - else - { - sinealpha = (v1[0] - v2[0]) / length12; - } - - double alpha1 = std::asin(sinealpha); - - // Translation - temptransv3[0] = v3[0] - v2[0]; - temptransv3[1] = v3[1] - v2[1]; - temptransv4[0] = v4[0] - v2[0]; - temptransv4[1] = v4[1] - v2[1]; - - // Rotation - tempv3[0] = temptransv3[0] * cos(alpha1) + temptransv3[1] * sin(alpha1); - tempv3[1] = temptransv3[1] * cos(alpha1) - temptransv3[0] * sin(alpha1); - tempv4[0] = temptransv4[0] * cos(alpha1) + temptransv4[1] * sin(alpha1); - tempv4[1] = temptransv4[1] * cos(alpha1) - temptransv4[0] * sin(alpha1); - - otbMsgDevMacro( << "tempv1[0], tempv1[1], tempv2[0], tempv2[1]: " ); - otbMsgDevMacro( << tempv1[0] << ", " << tempv1[1] << ", " << tempv2[0] << ", " << tempv2[1] ); - otbMsgDevMacro( << "Alpha: " << alpha1 ); - otbMsgDevMacro( << "tempv3[0], tempv3[1], tempv4[0], tempv4[1]: " - << tempv3[0] << ", " << tempv3[1] << ", " << tempv4[0] << ", " << tempv4[1] ); - otbMsgDevMacro( << "Calculated length of the second line: " - << sqrt(pow((tempv4[0] - tempv3[0]), 2) + pow((tempv4[1] - tempv3[1]), 2)) ); - otbMsgDevMacro( << "Original length of line 1: " << length12 ); - } - } - - // Compute the length of the overlapping part - // of the two lines. This is done by simply - // comparing the y-values of the lines (remember - // that both lines are parallel and also parallel - // to the new y-axis). - double commonDist = 0.; - - if (tempv3[1] >= tempv4[1]) - { - if (tempv3[1] >= 0 && tempv3[1] <= tempv2[1]) - { - if (tempv4[1] >= 0) - { - commonDist = std::abs(tempv4[1] - tempv3[1]); - } - - else if (tempv4[1] < 0) - { - commonDist = tempv3[1]; - } - } - else if (tempv3[1] >= 0 && tempv3[1] >= tempv2[1]) - { - if (tempv4[1] >= 0) - { - commonDist = tempv2[1] - tempv4[1]; - } - - else if (tempv4[1] < 0) - { - commonDist = tempv2[1]; - } - - } - else if (tempv4[1] >= tempv2[1]) - { // No overlapping parts exist. The (negative) distance - // between the two closest endpoints is calculated. - commonDist = -std::abs(tempv4[1] - tempv2[1]); - } - else if (tempv3[1] < 0) - { // No overlapping parts exist. The (negative) distance - // between the two closest endpoints is calculated. - commonDist = tempv3[1]; - } - } - - else - { - if (tempv4[1] >= 0 && tempv4[1] <= tempv2[1]) - { - if (tempv3[1] >= 0) - { - commonDist = std::abs(tempv3[1] - tempv4[1]); - } - - else if (tempv3[1] < 0) - { - commonDist = tempv4[1]; - } - } - else if (tempv4[1] >= 0 && tempv4[1] >= tempv2[1]) - { - if (tempv3[1] >= 0) - { - commonDist = tempv2[1] - tempv3[1]; - } - - else if (tempv3[1] < 0) - { - commonDist = tempv2[1]; - } - - } - else if (tempv3[1] >= tempv2[1]) - { // No overlapping parts exist. The (negative) distance - // between the two closest endpoints is calculated. - commonDist = -std::abs(tempv3[1] - tempv2[1]); - } - else if (tempv4[1] < 0) - { // No overlapping parts exist. The (negative) distance - // between the two closest endpoints is calculated. - commonDist = tempv4[1]; - } - } - // The common parallel parts of the two lines have to be greater than - // the provided threshold. - otbMsgDevMacro( << "Calculated common distance of the parallel lines: " << commonDist ); - bool common = (commonDist >= static_cast<double>(m_CommonDistanceThreshold)); - - return common; -} - -/** - * Write parallel line in a new path list. - * p1: First parallel path (line segment) - */ -template <class TPath> -typename ParallelLinePathListFilter<TPath> -::PathPointerType -ParallelLinePathListFilter<TPath> -::WriteParallelPath(PathPointerType p1) -{ - PathPointerType resp = PathType::New(); - - VertexIteratorType it; - - for (it = p1->GetVertexList()->Begin(); it != p1->GetVertexList()->End(); ++it) - { - resp->AddVertex((it).Value()); - } - - return resp; -} - -/** - * PrintSelf Method - */ -template <class TPath> -void -ParallelLinePathListFilter<TPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h deleted file mode 100644 index cc60ea4b97a1a93fbf256effb390d614bb4e7a82..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbRemoveIsolatedByDirectionFilter.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRemoveIsolatedByDirectionFilter_h -#define otbRemoveIsolatedByDirectionFilter_h - -#include "otbModulusAndDirectionImageToImageFilter.h" -#include "otbBinaryFunctorNeighborhoodImageFilter.h" - -namespace otb -{ -namespace Functor -{ -/** \class RemoveIsolatedByDirectionFunctor - * \brief Binary neighborhood functor to remove isolated pixels by direction. - * Used by the RemoveIsolatedByDirectionFilter. - * \sa RemoveIsolatedByDirectionFilter - * \ingroup Functor - * - * \ingroup OTBRoadExtraction - */ -template <class TInput1, class TInput2, class TOutput> -class RemoveIsolatedByDirectionFunctor -{ -public: - RemoveIsolatedByDirectionFunctor() {} - virtual ~RemoveIsolatedByDirectionFunctor() {} - inline TOutput operator ()(const TInput1& itA, const TInput2& itB) - { - double currentDirection = itB.GetCenterPixel(); - int nEqualNeighbors = 0; - for (int neighborhoodIndex = 0; neighborhoodIndex < 9; ++neighborhoodIndex) - { - if (itB.GetPixel(neighborhoodIndex) == currentDirection) - { - ++nEqualNeighbors; - } - } - if (nEqualNeighbors <= 1) - { - //should never be 0 as it is at least equal to itself - return 0; - } - else - { - return static_cast<TOutput>(itA.GetCenterPixel()); - } - } -}; -} -/** \class RemoveIsolatedByDirectionFilter - * \brief This filter removes (sets to null intensity) pixels isolated by direction. - * - * For a given pixel, the filter walk through its neighborhood in direction image, counting pixels having - * the same direction as the center pixel. If there is no such a pixel, the center pixel is considered to be - * isolated in direction, and thus will be removed (set to 0). If the pixel is not isolated in direction, the output - * value is the value of the pixel in the modulus image. - * Of course this filter requires the direction to be discrete, in order to be able to count the directions. - * - * \ingroup Streamed - * \ingroup Threaded - * - * \ingroup OTBRoadExtraction - */ -template <class TInputModulus, class TInputDirection, class TOutputImage> -class ITK_EXPORT RemoveIsolatedByDirectionFilter - : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef RemoveIsolatedByDirectionFilter Self; - typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(RemoveIsolatedByDirectionFilter, ModulusAndDirectionImageToImageFilter); - - /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as - using the BinaryFunctorNeighBorhoodImageFilter, which is appropriate here */ - typedef Functor::RemoveIsolatedByDirectionFunctor< - typename itk::ConstNeighborhoodIterator<TInputModulus>, - typename itk::ConstNeighborhoodIterator<TInputDirection>, - typename TOutputImage::PixelType> FunctorType; - typedef otb::BinaryFunctorNeighborhoodImageFilter<TInputModulus, TInputDirection, TOutputImage, - FunctorType> ComputingFilterType; - -protected: - /** Constructor */ - RemoveIsolatedByDirectionFilter() {}; - /** Destructor */ - ~RemoveIsolatedByDirectionFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override - { - Superclass::PrintSelf(os, indent); - } - /** Main computation method */ - void GenerateData(void) override - { - typename ComputingFilterType::Pointer filter = ComputingFilterType::New(); - filter->SetInput1(this->GetInput()); - filter->SetInput2(this->GetInputDirection()); - filter->GraftOutput(this->GetOutput()); - filter->Update(); - this->GraftOutput(filter->GetOutput()); - } - -private: - RemoveIsolatedByDirectionFilter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h deleted file mode 100644 index abe69a7b58a8664696e69c5832a6e05102085dea..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbRemoveTortuousPathListFilter.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRemoveTortuousPathListFilter_h -#define otbRemoveTortuousPathListFilter_h - -#include "otbUnaryFunctorObjectListBooleanFilter.h" -#include "otbPathMeanDistanceFunctor.h" -#include "otbObjectList.h" - -namespace otb -{ -/** \class RemoveTortuousPathListFilter - * \brief This filter remove path considered as tortuous. - * - * A path is considered to be tortuous if the mean distance between each consecutive vertices - * is strictly lower than the user provided threshold. - * - * This class is just a shortcut to the UnaryFunctorObjectListBooleanFilter with - * the PathMeanDistanceFunctor. - * - *<b>Recent API changes:</b> - * Now part of the UnaryFunctorObjectListBooleanFilter hierarchy, replace call to SetMeanDistanceThreshold() - * by GetFunctor().SetThreshold(). - * - * The inequality is now a strict one. - * - * \sa BreakAngularPathListFilter - * \sa SimplifyPathFilter - * \sa UnaryFunctorObjectListBooleanFilter - * \sa PathMeanDistanceFunctor - * - * \example FeatureExtraction/ExtractRoadByStepsExample.cxx - * - * - * \ingroup OTBRoadExtraction - */ - -// template <class TPath> -template <class TPath> -class ITK_EXPORT RemoveTortuousPathListFilter : - public UnaryFunctorObjectListBooleanFilter< - ObjectList<TPath>, - ObjectList<TPath>, - PathMeanDistanceFunctor<typename TPath::Pointer> > -{}; - -} // End namespace otb - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h b/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h deleted file mode 100644 index b0d4fffb991f383be9bbec4f9a51c187e16ab0c6..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbRemoveWrongDirectionFilter.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRemoveWrongDirectionFilter_h -#define otbRemoveWrongDirectionFilter_h - -#include "otbModulusAndDirectionImageToImageFilter.h" -#include "itkBinaryFunctorImageFilter.h" -#include "otbMath.h" - -namespace otb -{ -namespace Functor -{ -/** \class RemoveWrongDirectionFunctor - * \brief This functor is used by the RemoveWrongDirectionFilter - * - * \sa RemoveWrongDirectionFilter - * \ingroup Functor - * - * \example FeatureExtraction/ExtractRoadByStepsExample.cxx - * - * - * \ingroup OTBRoadExtraction - */ -template <class TInput1, class TInput2, class TOutput> -class RemoveWrongDirectionFunctor -{ -public: - RemoveWrongDirectionFunctor() {} - virtual ~RemoveWrongDirectionFunctor() {} - inline TOutput operator ()(const TInput1& A, const TInput2& B) - { - if (B < CONST_PI_8) - { - return 0; - } - else - { - return A; - } - } -}; -} -/** \class RemoveWrongDirectionFilter - * \brief This filter removes (sets to null intensity) pixels with wrong direction. - * - * This filter is part of the road extraction framework. By using the Spectral Angle filter, - * we can assume that the direction of a road on our scalar product image is positive (greater - * than \f$ \pi/8 \f$). - * Therefore in the input modulus and direction images, pixels whose direction is lower than - * this threshold are suppressed - * (in fact, their intensity is set to 0). - * - * \sa NeighborhoodScalarProductFilter - * \ingroup Streamed - * \ingroup Threaded - * - * \ingroup OTBRoadExtraction - */ -template <class TInputModulus, class TInputDirection, class TOutputImage> -class ITK_EXPORT RemoveWrongDirectionFilter - : public ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef RemoveWrongDirectionFilter Self; - typedef ModulusAndDirectionImageToImageFilter<TInputModulus, TInputDirection, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(RemoveWrongDirectionFilter, ModulusAndDirectionImageToImageFilter); - - /** typedef of the computing filter (this allows us to derive from ModulusAndDirectionToImageFilter as well as - using the BinaryFunctorImageFilter, which is appropriate here */ - typedef Functor::RemoveWrongDirectionFunctor< - typename TInputModulus::PixelType, - typename TInputDirection::PixelType, - typename TOutputImage::PixelType> FunctorType; - typedef itk::BinaryFunctorImageFilter<TInputModulus, TInputDirection, TOutputImage, FunctorType> ComputingFilterType; - -protected: - /** Constructor */ - RemoveWrongDirectionFilter() {}; - /** Destructor */ - ~RemoveWrongDirectionFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override - { - Superclass::PrintSelf(os, indent); - } - /** Main computation method */ - void GenerateData(void) override - { - typename ComputingFilterType::Pointer filter = ComputingFilterType::New(); - filter->SetInput1(this->GetInput()); - filter->SetInput2(this->GetInputDirection()); - filter->GraftOutput(this->GetOutput()); - filter->Update(); - this->GraftOutput(filter->GetOutput()); - } - -private: - RemoveWrongDirectionFilter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h b/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h deleted file mode 100644 index 77c19f0ca336f0300b9d1349bed6951d2608467a..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRoadExtractionFilter_h -#define otbRoadExtractionFilter_h - - -#include "otbSpectralAngleDistanceImageFilter.h" -#include "otbGenericRoadExtractionFilter.h" - -namespace otb -{ -/** - * \class RoadExtractionFilter - * \brief This class performs the extraction of roads from an image. - * - * This composite filter implements a fast and robust road extraction - * for high resolution satellite images. This is a composite filter using the - * SpectralAngleDistanceImageFilter and the GenericRoadExtractionFilter and is - * intended to be used with optical high resolution data. The full method is - * described in E. Christophe and J. Inglada, "Robust Road Extraction for High - * Resolution Satellite Images," in IEEE International Conference on - * Image Processing, ICIP 2007. - * - * The algorithm uses all spectral - * bands based on the spectral angle with a reference pixel. Then, the line - * detection is done using a Gaussian gradient with a scalar product to find - * the road directions. Finally, extracted roads are vectorized and - * processed to improve the results removing some occultations and false - * detections. - * - * This filter is fast, as the detection typically takes 3 seconds for a - * 1000 \f$ \times \f$ 1000 images with four spectral bands. Results can be - * used as an initialization for more complex algorithms. - * - * \sa SpectralAngleDistanceImageFilter - * \sa GenericRoadExtractionFilter - * - * \example FeatureExtraction/ExtractRoadExample.cxx - * - * - * \ingroup OTBRoadExtraction - */ -template <class TInputImage, class TOutputPath> -class ITK_EXPORT RoadExtractionFilter - : public ImageToPathListFilter<TInputImage, TOutputPath> -{ -public: - /** Standard typedefs */ - typedef RoadExtractionFilter Self; - typedef ImageToPathListFilter<TInputImage, TOutputPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(RoadExtractionFilter, ImageToPathListFilter); - /** Template parameters typedefs */ - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::OutputPathType OutputPathType; - typedef typename Superclass::OutputPathListType OutputPathListType; - typedef typename InputImageType::PixelType InputPixelType; - typedef double InternalPixelType; - - typedef otb::VectorImage<InternalPixelType, InputImageType::ImageDimension> VectorImageType; - typedef otb::Image<InternalPixelType, InputImageType::ImageDimension> SpectralAngleType; - typedef otb::Image<InternalPixelType, InputImageType::ImageDimension> ModulusType; - typedef otb::Image<InternalPixelType, InputImageType::ImageDimension> DirectionType; - - typedef itk::CovariantVector<InternalPixelType, InputImageType::ImageDimension> - VectorPixelType; - typedef otb::Image<VectorPixelType, InputImageType::ImageDimension> CovariantVectorImageType; - - /* Template parameters typedefs for composites filters */ - typedef SpectralAngleDistanceImageFilter< - InputImageType, - SpectralAngleType> SpectralAngleDistanceImageFilterType; - - typedef GenericRoadExtractionFilter<SpectralAngleType, OutputPathType> - GenericRoadExtractionFilterType; - - /** Template parameters typedefs for internals filters */ - typedef typename GenericRoadExtractionFilterType::SigmaType SigmaType; - typedef typename GenericRoadExtractionFilterType::AmplitudeThresholdType AmplitudeThresholdType; - typedef typename GenericRoadExtractionFilterType::ToleranceType ToleranceType; - typedef typename GenericRoadExtractionFilterType::MaxAngleType MaxAngleType; - typedef typename GenericRoadExtractionFilterType::MeanDistanceThresholdType MeanDistanceThresholdType; - typedef typename GenericRoadExtractionFilterType::LinkRealType LinkRealType; - - /** Get/Set the reference pixel (use by the SpectralAngleDistanceImageFilter)*/ - otbGetObjectMemberConstReferenceMacro(SpectralAngleDistanceImageFilter, ReferencePixel, InputPixelType); - otbSetObjectMemberMacro(SpectralAngleDistanceImageFilter, ReferencePixel, InputPixelType); - - /** Get/Set the alpha value */ - otbGetObjectMemberConstReferenceMacro(GenericRoadExtractionFilter, Alpha, double); - otbSetObjectMemberMacro(GenericRoadExtractionFilter, Alpha, double); - - /** Get/Set the amplitude threshold to start following a path (use by the VectorizationPathListFilter)*/ - otbSetObjectMemberMacro(GenericRoadExtractionFilter, AmplitudeThreshold, AmplitudeThresholdType); - otbGetObjectMemberMacro(GenericRoadExtractionFilter, AmplitudeThreshold, AmplitudeThresholdType); - - /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by the SimplifyPathListFilter)*/ - otbGetObjectMemberMacro(GenericRoadExtractionFilter, Tolerance, ToleranceType); - otbSetObjectMemberMacro(GenericRoadExtractionFilter, Tolerance, ToleranceType); - - /** Set/Get the max angle (use bye the BreakAngularPathListFilter)*/ - otbSetObjectMemberMacro(GenericRoadExtractionFilter, MaxAngle, MaxAngleType); - otbGetObjectMemberConstMacro(GenericRoadExtractionFilter, MaxAngle, MaxAngleType); - - /** Get/Set the tolerance for segment consistency (tolerance in terms of distance) (use by RemoveTortuousPathListFilter)*/ - otbGetObjectMemberMacro(GenericRoadExtractionFilter, FirstMeanDistanceThreshold, MeanDistanceThresholdType); - otbSetObjectMemberMacro(GenericRoadExtractionFilter, FirstMeanDistanceThreshold, MeanDistanceThresholdType); - otbGetObjectMemberMacro(GenericRoadExtractionFilter, SecondMeanDistanceThreshold, MeanDistanceThresholdType); - otbSetObjectMemberMacro(GenericRoadExtractionFilter, SecondMeanDistanceThreshold, MeanDistanceThresholdType); - - /** Get/Set the angular threshold (use by LinkPathFilter)*/ - otbSetObjectMemberMacro(GenericRoadExtractionFilter, AngularThreshold, LinkRealType); - otbGetObjectMemberMacro(GenericRoadExtractionFilter, AngularThreshold, LinkRealType); - /** Get/Set the distance threshold (use by LinkPathFilter)*/ - otbSetObjectMemberMacro(GenericRoadExtractionFilter, DistanceThreshold, LinkRealType); - otbGetObjectMemberMacro(GenericRoadExtractionFilter, DistanceThreshold, LinkRealType); - -protected: - /** Constructor */ - RoadExtractionFilter(); - /** Destructor */ - ~RoadExtractionFilter() override {} - - /** Prepare main computation method */ - void BeforeGenerateData(void); - - /** Main computation method */ - void GenerateData(void) override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - - RoadExtractionFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - /** SpectralAngleDistanceImageFilter use by the composite filter */ - typename SpectralAngleDistanceImageFilterType::Pointer m_SpectralAngleDistanceImageFilter; - typename GenericRoadExtractionFilterType::Pointer m_GenericRoadExtractionFilter; - -}; - -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRoadExtractionFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx deleted file mode 100644 index 67ee3a9fbbc7bce8f6aa09f2a87f88995a9e1613..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbRoadExtractionFilter.hxx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRoadExtractionFilter_hxx -#define otbRoadExtractionFilter_hxx - -#include "otbRoadExtractionFilter.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputPath> -RoadExtractionFilter<TInputImage, TOutputPath> -::RoadExtractionFilter() -{ - this->SetNumberOfRequiredInputs(1); - this->SetNumberOfRequiredOutputs(1); - - m_SpectralAngleDistanceImageFilter = SpectralAngleDistanceImageFilterType::New(); - m_GenericRoadExtractionFilter = GenericRoadExtractionFilterType::New(); - -} - -/** - * Main computation method - */ -template <class TInputImage, class TOutputPath> -void -RoadExtractionFilter<TInputImage, TOutputPath> -::GenerateData() -{ - // Input images pointers - typename InputImageType::ConstPointer inputImage = this->GetInput(); - typename OutputPathListType::Pointer outputPathList = this->GetOutput(); - - m_SpectralAngleDistanceImageFilter->SetInput(inputImage); - - m_GenericRoadExtractionFilter->SetInput(m_SpectralAngleDistanceImageFilter->GetOutput()); - - m_GenericRoadExtractionFilter->Update(); - for (typename GenericRoadExtractionFilterType::OutputPathListType::ConstIterator it - = m_GenericRoadExtractionFilter->GetOutput()->Begin(); - it != m_GenericRoadExtractionFilter->GetOutput()->End(); - ++it) - { - outputPathList->PushBack(it.Get()); - } -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputPath> -void -RoadExtractionFilter<TInputImage, TOutputPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "m_ReferencePixel: " << m_SpectralAngleDistanceImageFilter->GetReferencePixel() << std::endl; -} - -} // End namespace otb -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h b/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h deleted file mode 100644 index 2c0f99fad114390d0c5517ddad580fc5da6f43b0..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbSimplifyPathListFilter.h +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbSimplifyPathListFilter_h -#define otbSimplifyPathListFilter_h - -#include "otbUnaryFunctorObjectListFilter.h" -#include "otbSimplifyPathFunctor.h" -#include "otbObjectList.h" - -namespace otb -{ -/** \class SimplifyPathListFilter - * \brief This filter performs a simplification of the path in the input list. - * - * It reduces the number of vertices in each path, according to a tolerance criterion. It aims at - * removing aligned vertices while keeping sharp angular points. - * - * In order to ensure the unicity of its output, each path is considered first from begin to end, then - * from begin to the first vertex before the end. At each step, the consistency of the path is checked : - * the equation of the line passing by the first and last vertices is computed. Then, for each - * vertices between them, the euclidean distance to this line is computed. If for one vertex, this distance - * is upper than the tolerance threshold, the path is considered to be inconsistent and no vertices can be removed. - * - * If the path is considered consistent (which will occur at least with a 2 vertices path), - * only the beginning and ending - * vertices are kept and a new search iteration begin at its end. - * - * This filter is part of the road extraction framework. - * - * This class is just a shortcut to the UnaryFunctorObjectListFilter with - * the SimplifyPathFunctor. - * - * <b>Recent API changes:</b> - * Now part of the UnaryFunctorObjectListFilter hierarchy, replace call to SetTolerance() - * by GetFunctor().SetTolerance(). - * - * - * \sa BreakAngularPathListFilter - * \sa RemoveTortuousPathFilter. - * \sa UnaryFunctorObjectListFilter - * \sa SimplifyPathFunctor - * - * \example FeatureExtraction/ExtractRoadByStepsExample.cxx - * - * - * \ingroup OTBRoadExtraction - */ - -template <class TPath> -class ITK_EXPORT SimplifyPathListFilter : - public UnaryFunctorObjectListFilter< - ObjectList<TPath>, - ObjectList<TPath>, - SimplifyPathFunctor<TPath, TPath> > -{}; - -} // End namespace otb - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h b/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h deleted file mode 100644 index 476725d3af8d4261353de5e8a2b61165305d9873..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.h +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorDataToRoadDescriptionFilter_h -#define otbVectorDataToRoadDescriptionFilter_h - -#include "otbVectorDataToSpecificDescriptionFilterBase.h" -#include "otbVectorData.h" - -//#include "otbNDVIDataNodeFeatureFunction.h" -//#include "otbSpectralAngleDataNodeFeatureFunction.h" -#include "otbParserConditionDataNodeFeatureFunction.h" -#include "otbDBOverlapDataNodeFeatureFunction.h" - -namespace otb -{ -/** \class VectorDataToRoadDescriptionFilter - * \brief VectorDataToRoadDescriptionFilter associates a score to each - * adapted input VectorData DataNode. - * - * VectorDataToRoadDescriptionFilter is dedicated to road description. - * Input and output are both VectorDatas in index coordinate. - * Each DataNode of the output VectorData contains its scores - * regarding to the associated descriptors. - * The support is an Optical Image and the descriptor are: - * - (NDVI >= threshold) per cent along the tested lines - * - mean Spectral Angle regarding a reference pixel along the tested lines - * - DB Overlap compute the number of building crossed by the data node in percent - * regarding all the buildings within a data node neighborhood - * - * \ingroup VectorDataFilter - * \sa VectorDataToSpecificDescriptionFilterBase - * \sa VectorDataToBuildingDescriptionFilter - * - * \ingroup OTBRoadExtraction - */ - -template <class TVectorData, class TOpticalImage> -class ITK_EXPORT VectorDataToRoadDescriptionFilter : -public otb::VectorDataToSpecificDescriptionFilterBase<TVectorData> -{ -public: - /** Standard class typedefs. */ - typedef VectorDataToRoadDescriptionFilter Self; - typedef otb::VectorDataToSpecificDescriptionFilterBase<TVectorData> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(VectorDataToRoadDescriptionFilter, VectorDataToSpecificDescriptionFilterBase); - - /** Some typedefs. */ - typedef TVectorData VectorDataType; - typedef typename TVectorData::Pointer VectorDataPointer; - typedef typename VectorDataType::DataNodeType DataNodeType; - typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType> - TreeIteratorType; - typedef typename DataNodeType::ValuePrecisionType - PrecisionType; - typedef typename DataNodeType::PrecisionType - CoordRepType; - - typedef TOpticalImage OpticalImageType; - typedef typename TOpticalImage::Pointer OpticalImageTypePointer; - - typedef std::vector<std::string> DescriptorsListType; - - /* - typedef otb::NDVIDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType> - NDVIFeatureFunctionType; - typedef otb::SpectralAngleDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType> - SpectralAngleFeatureFunctionType; - */ - typedef otb::ParserConditionDataNodeFeatureFunction<OpticalImageType, CoordRepType, PrecisionType> - ParserConditionFeatureFunctionType; - - typedef otb::DBOverlapDataNodeFeatureFunction<CoordRepType, PrecisionType> - DBOverlapFeatureFunctionType; - - typedef itk::DataObject::Pointer DataObjectPointer; - typedef itk::DataObject DataObject; - - virtual void AddOpticalImage(const OpticalImageType * support); - const OpticalImageType * GetOpticalImage(); - - virtual void AddBuildingsDB(const VectorDataType * support); - const VectorDataType * GetBuildingsDB(); - - const DescriptorsListType& GetDescriptorsList() const - { - return m_DescriptorsList; - } - -protected: - /** Constructor */ - VectorDataToRoadDescriptionFilter(); - /** Destructor */ - ~VectorDataToRoadDescriptionFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Triggers the Computation of the Descriptors */ - void GenerateData(void) override; - -private: - VectorDataToRoadDescriptionFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - typename ParserConditionFeatureFunctionType::Pointer m_NDVIFeatureFunction; - typename ParserConditionFeatureFunctionType::Pointer m_SpectralAngleFeatureFunction; - typename DBOverlapFeatureFunctionType::Pointer m_DBOverlapFeatureFunction; - DescriptorsListType m_DescriptorsList; - -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbVectorDataToRoadDescriptionFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx b/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx deleted file mode 100644 index e58488f53621c3e3423510e7b750bd7c4cee54ca..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/include/otbVectorDataToRoadDescriptionFilter.hxx +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorDataToRoadDescriptionFilter_hxx -#define otbVectorDataToRoadDescriptionFilter_hxx - -#include "otbVectorDataToRoadDescriptionFilter.h" - -namespace otb -{ - -// Constructor -template <class TVectorData, class TOpticalImage> -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::VectorDataToRoadDescriptionFilter() -{ - this->SetNumberOfRequiredInputs(3); - - m_NDVIFeatureFunction = ParserConditionFeatureFunctionType::New(); - m_NDVIFeatureFunction->SetExpression("ndvi(b3, b4) > 0.4"); - - m_SpectralAngleFeatureFunction = ParserConditionFeatureFunctionType::New(); - m_SpectralAngleFeatureFunction->SetExpression("spectralAngle > 0.25"); - - //Example for QuickBird images (on a specific image) - typename ParserConditionFeatureFunctionType::PixelType refPixel; - refPixel.SetSize(4); - refPixel[0] = 252; - refPixel[1] = 357; - refPixel[2] = 232; - refPixel[3] = 261; - m_SpectralAngleFeatureFunction->SetSpectralAngleReferencePixel(refPixel); - - m_DBOverlapFeatureFunction = DBOverlapFeatureFunctionType::New(); - - m_DescriptorsList.push_back("NONDVI"); - m_DescriptorsList.push_back("ROADSA"); - m_DescriptorsList.push_back("NOBUIL"); -} - -template <class TVectorData, class TOpticalImage> -void -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::AddOpticalImage(const OpticalImageType * support) -{ - this->AddSupport(const_cast<OpticalImageType *>(support), 0); -} - -template <class TVectorData, class TOpticalImage> -const typename VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::OpticalImageType * -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::GetOpticalImage() -{ - return static_cast<const OpticalImageType *> - (this->GetSupport(0)); -} - - -template <class TVectorData, class TOpticalImage> -void -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::AddBuildingsDB(const VectorDataType * support) -{ - this->AddSupport(const_cast<VectorDataType *>(support), 1); -} - -template <class TVectorData, class TOpticalImage> -const typename VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::VectorDataType * -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::GetBuildingsDB() -{ - return static_cast<const VectorDataType *> - (this->GetSupport(1)); -} - -template <class TVectorData, class TOpticalImage> -void -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::GenerateData() -{ - m_NDVIFeatureFunction->SetInputImage(const_cast<OpticalImageType *>(this->GetOpticalImage())); - m_SpectralAngleFeatureFunction->SetInputImage(const_cast<OpticalImageType *>(this->GetOpticalImage())); - m_DBOverlapFeatureFunction->SetInputVectorData(const_cast<VectorDataType *>(this->GetBuildingsDB())); - - // Retrieving root node - typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get(); - // Create the document node - typename DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - this->GetOutput(0)->GetDataTree()->Add(document, root); - // Create the folder node - typename DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - this->GetOutput(0)->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(this->GetInput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder()) - { - typename DataNodeType::Pointer currentGeometry = itVector.Get(); - currentGeometry->SetFieldAsDouble("NONDVI", (double)(m_NDVIFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0])); - currentGeometry->SetFieldAsDouble("ROADSA", (double)(m_SpectralAngleFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0])); - currentGeometry->SetFieldAsDouble("NOBUIL", (double)(m_DBOverlapFeatureFunction->Evaluate(*(currentGeometry.GetPointer()))[0])); - - this->GetOutput(0)->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } -} - -// PrintSelf Method -template <class TVectorData, class TOpticalImage> -void -VectorDataToRoadDescriptionFilter<TVectorData, TOpticalImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // end namespace otb - -#endif diff --git a/Modules/Detection/RoadExtraction/otb-module.cmake b/Modules/Detection/RoadExtraction/otb-module.cmake deleted file mode 100644 index 0af2a5ba034b1c7a2444e4e744eac1921589de45..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/otb-module.cmake +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "Everything users need to extract roads.") - -otb_module(OTBRoadExtraction - DEPENDS - OTBVectorDataBase - OTBITK - OTBImageBase - OTBVectorDataManipulation - OTBImageManipulation - OTBMathParser - OTBPath - OTBObjectList - OTBCommon - - TEST_DEPENDS - OTBTestKernel - OTBImageIO - OTBProjection - OTBVectorDataIO - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx b/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx deleted file mode 100644 index 2188101cb207bdb24ff483f41d4fa3a71cbddd6e..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/AlignementsQB.cxx +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include <iostream> -#include "itkPolyLineParametricPath.h" - -#include "otbImageFileWriter.h" -#include "otbImageFileReader.h" -#include "otbExtractROI.h" -#include "otbImageToPathListAlignFilter.h" -#include "otbDrawPathFilter.h" -//#include "otbColorImageViewer.h" - -#include <stdio.h> - -int main(int argc, char ** argv) -{ - if (argc != 3) - { - - std::cout << "Usage : " << argv[0] << " inputImage outputImage" << std::endl; - return 1; - - } - - const char * inputFilename = argv[1]; - const char * outputFilename = argv[2]; - - typedef unsigned char InputPixelType; - typedef unsigned char OutputPixelType; - - const unsigned int Dimension = 2; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - reader->SetFileName(inputFilename); - writer->SetFileName(outputFilename); - - reader->Update(); - - std::cout << "Lecture terminee" << std::endl; - - typedef otb::ExtractROI<InputPixelType, InputPixelType> ROIFilterType; - - ROIFilterType::Pointer roiFilter = ROIFilterType::New(); - - roiFilter->SetInput(reader->GetOutput()); - roiFilter->SetStartX(10); - roiFilter->SetStartY(0); - roiFilter->SetSizeX(256); - roiFilter->SetSizeY(256); - - roiFilter->Update(); - - std::cout << "Extraction ROI" << std::endl; - - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> ListAlignFilterType; - - ListAlignFilterType::Pointer alignFilter = ListAlignFilterType::New(); - - alignFilter->SetInput(roiFilter->GetOutput()); - - alignFilter->Update(); - - std::cout << "Alignements termines" << std::endl; - - typedef ROIFilterType::OutputImageType BackgroundImageType; - - typedef otb::DrawPathFilter<BackgroundImageType, PathType, OutputImageType> DrawPathFilterType; - - DrawPathFilterType::Pointer drawPathFilter = DrawPathFilterType::New(); - - typedef ListAlignFilterType::OutputPathListType ListType; - - ListType* listePaths = alignFilter->GetOutput(); - - ListType::Iterator listIt = listePaths->Begin(); - - BackgroundImageType::Pointer backgroundImage = roiFilter->GetOutput(); - - roiFilter->Update(); - - unsigned int color = 0; - - while (listIt != listePaths->End()) - { - - drawPathFilter->SetImageInput(backgroundImage); - drawPathFilter->SetInputPath(listIt.Get()); - //drawPathFilter->SetPathValue( color ); - - drawPathFilter->Update(); - - backgroundImage = drawPathFilter->GetOutput(); - - ++listIt; - ++color; - - } - - writer->SetInput(drawPathFilter->GetOutput()); - - writer->Update(); - -/* typedef otb::ColorImageViewer<unsigned char, double> ViewerType; - ViewerType viewer; - - viewer.SetLabel( "Input Image" ); - viewer.SetImage( drawPathFilter->GetOutput() ); - - viewer.Show(); - Fl::run(); -*/ - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/CMakeLists.txt b/Modules/Detection/RoadExtraction/test/CMakeLists.txt deleted file mode 100644 index 8c99e4420f49ffb44aa1701a95ad0c237988a736..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/CMakeLists.txt +++ /dev/null @@ -1,218 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBRoadExtractionTests -otbRoadExtractionTestDriver.cxx -otbLikelihoodPathListFilter.cxx -otbRemoveWrongDirectionFilter.cxx -otbSimplifyPathListFilter.cxx -otbAlignImageToPath.cxx -otbNonMaxRemovalByDirectionFilter.cxx -otbRoadExtractionFilter.cxx -otbLinkPathListFilter.cxx -otbRemoveTortuousPathListFilter.cxx -otbParallelLinePathListFilter.cxx -otbRemoveIsolatedByDirectionFilter.cxx -otbVectorDataToRoadDescriptionFilter.cxx -otbSimplifyManyPathListFilter.cxx -otbNeighborhoodScalarProductFilter.cxx -otbDrawPathAlign.cxx -otbBreakAngularPathListFilter.cxx -) - -add_executable(otbRoadExtractionTestDriver ${OTBRoadExtractionTests}) -target_link_libraries(otbRoadExtractionTestDriver ${OTBRoadExtraction-Test_LIBRARIES}) -otb_module_target_label(otbRoadExtractionTestDriver) - -# Tests Declaration - -otb_add_test(NAME feTvLikelihoodPathListFilter COMMAND otbRoadExtractionTestDriver - --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/feTvLikelihoodPathOutput.txt - ${TEMP}/feTvLikelihoodPathOutput.txt - otbLikelihoodPathListFilter - ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr - ${TEMP}/feTvLikelihoodPathOutput.txt - 157 335 204 376 | - 21 305 35 308 77 354 85 358 | - 73 160 126 173 - ) - -otb_add_test(NAME feTvRemoveWrongDirectionFilter COMMAND otbRoadExtractionTestDriver - --compare-image ${EPSILON_8} - ${BASELINE}/feTvRemoveWrongDirectionOutput.tif - ${TEMP}/feTvRemoveWrongDirectionOutput.tif - otbRemoveWrongDirectionFilter - ${INPUTDATA}/InputForRoadDetection_IsolatedRem.raw.hdr - ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr - ${TEMP}/feTvRemoveWrongDirectionOutput.tif - ) - -otb_add_test(NAME feTvSimplifyPathListFilter COMMAND otbRoadExtractionTestDriver - --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/feTvSimplifyPathOutput.txt - ${TEMP}/feTvSimplifyPathOutput.txt - otbSimplifyPathListFilter - ${TEMP}/feTvSimplifyPathOutput.txt - 1.0 - 1 1 5 1 7 1 11 1 21 1 31 1 | - 1 1 5 1 7 1 11 1 21 11 31 11 | - 1 1 5 5 7 7 11 11 21 21 31 31 41 41 | - 1 1 5 1 7 1 11 1 21 11 31 11 41 11 58 11 70 11 - ) - -otb_add_test(NAME feTvAlignMV2ITK COMMAND otbRoadExtractionTestDriver - --compare-ascii ${EPSILON_3} ${BASELINE_FILES}/feAlign.txt - ${TEMP}/feAlign.txt - otbAlignImageToPath - ${INPUTDATA}/poupees.raw.hdr - ${TEMP}/feAlign.txt) - -otb_add_test(NAME feTvNonMaxRemovalByDirectionFilter COMMAND otbRoadExtractionTestDriver - --compare-image ${EPSILON_8} - ${BASELINE}/feTvNonMaxRemovalByDirectionOutput.tif - ${TEMP}/feTvNonMaxRemovalByDirectionOutput.tif - otbNonMaxRemovalByDirectionFilter - ${INPUTDATA}/InputForRoadDetection_WrongRem.raw.hdr - ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr - ${TEMP}/feTvNonMaxRemovalByDirectionOutput.tif - ) - -otb_add_test(NAME feTvRoadExtractionFilter COMMAND otbRoadExtractionTestDriver - --compare-image ${EPSILON_8} - ${BASELINE}/feTvOutputRoadDetection.tif - ${TEMP}/feTvOutputRoadDetection.tif - otbRoadExtractionFilter - ${INPUTDATA}/qb_RoadExtract.img.hdr - ${TEMP}/feTvOutputRoadDetection.tif - 337 557 432 859 # ReferencePixel - 1.0 # Alpha - 0.00005 # AmplitudeThreshold - 1.0 # Tolerance - 22.5 # (degre) MaxAngle (3.14159265358979323846/8.) - 1.0 # FirstMeanDistanceThreshold - 10.0 # SecondMeanDistanceThreshold - 25. # DistanceThreshold for LinkPathFiler - 22.5 # AngularThreshold for LinkPathFiler - ) - -otb_add_test(NAME feTvLinkPathListFilter COMMAND otbRoadExtractionTestDriver - --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/feTvLinkPathOutput.txt - ${TEMP}/feTvLinkPathOutput.txt - otbLinkPathListFilter - ${TEMP}/feTvLinkPathOutput.txt - 30 40 - 1 1 51 1 | - 61 1 91 1 | - 111 11 211 11 | - 1 51 51 51 | - 71 71 71 91 | - 71 131 71 201 | - 141 111 101 111 | - 151 111 191 111 | - 111 71 141 71 | - 181 71 151 71 | - 11 131 11 101 | - 11 171 11 141 - ) - -otb_add_test(NAME feTvRemoveTortuousPathListFilter COMMAND otbRoadExtractionTestDriver - --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/feTvRemoveTortuousPathOutput.txt - ${TEMP}/feTvRemoveTortuousPathOutput.txt - otbRemoveTortuousPathListFilter - ${TEMP}/feTvRemoveTortuousPathOutput.txt - 10.0 - 1 1 1 11 | - 1 1 5 1 7 1 11 1 | - 1 1 7 7 21 21 31 31 41 41 | - 1 1 5 1 7 1 11 1 21 11 31 11 41 11 58 11 70 11 - ) - -otb_add_test(NAME feTvParallelLinePathListFilter COMMAND otbRoadExtractionTestDriver - otbParallelLinePathListFilter) - -otb_add_test(NAME feTvRemoveIsolatedByDirectionFilter COMMAND otbRoadExtractionTestDriver - --compare-image ${EPSILON_8} - ${BASELINE}/feTvRemoveIsolatedByDirectionOutput.tif - ${TEMP}/feTvRemoveIsolatedByDirectionOutput.tif - otbRemoveIsolatedByDirectionFilter - ${INPUTDATA}/InputForRoadDetectionScalarProductMod.raw.hdr - ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr - ${TEMP}/feTvRemoveIsolatedByDirectionOutput.tif - ) - -otb_add_test(NAME fzTvVectorDataToRoadDescriptionFilter COMMAND otbRoadExtractionTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/fzTvVectorDataToRoadDescriptionFilterOutput.shp - ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp - otbVectorDataToRoadDescriptionFilter - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp - ${INPUTDATA}/DEM/srtm_directory - 0 - ) - -otb_add_test(NAME feTpSimplifyManyPathListFilter COMMAND otbRoadExtractionTestDriver - otbSimplifyManyPathListFilter - ${TEMP}/feTvSimplifyManyPathOutput.txt - 1.0 - ) - -otb_add_test(NAME feTvNeighborhoodScalarProductFilter COMMAND otbRoadExtractionTestDriver - --compare-n-images ${EPSILON_6} 2 - ${BASELINE}/feTvNeighborhoodScalarProductModulusOutput.tif - ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.tif - ${BASELINE}/feTvNeighborhoodScalarProductDirectionOutput.tif - ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.tif - otbNeighborhoodScalarProductFilter - ${INPUTDATA}/InputForRoadDetection_SpectralAngle.raw.hdr - ${TEMP}/feTvNeighborhoodScalarProductModulusOutput.tif - ${TEMP}/feTvNeighborhoodScalarProductDirectionOutput.tif - 1.0 - ) - -otb_add_test(NAME feTvDrawPathTestAlign COMMAND otbRoadExtractionTestDriver - --compare-image ${NOTOL} ${BASELINE}/feDrawPathAlignDeuxTraits.png - ${TEMP}/feDrawPathAlignDeuxTraits.png - otbDrawPathAlign - ${INPUTDATA}/DeuxTraits.png - ${TEMP}/feDrawPathAlignDeuxTraits.png) - -otb_add_test(NAME feTvBreakAngularPathListFilter COMMAND otbRoadExtractionTestDriver - --compare-ascii ${NOTOL} ${BASELINE_FILES}/feBreakAngularPathListOutput.txt - ${TEMP}/feBreakAngularPathListOutput.txt - otbBreakAngularPathListFilter - ${TEMP}/feBreakAngularPathListOutput.txt - 10 20 30 50 90 140 180 | - 1 1 5 1 7 1 11 1 21 1 31 1 | - 1 1 5 1 7 1 11 1 21 11 31 11 | - 1 1 5 1 7 1 11 1 21 11 31 11 41 11 | - 1 1 5 1 7 1 11 1 21 11 31 11 41 11 58 11 70 11 | - 1 11 5 11 7 11 11 11 21 1 31 1 41 1 | - 1 1 5 1 7 1 11 1 21 11 31 21 41 31 | - 1 1 5 1 5 11 5 21 | - 1 1 31 1 41 1 - ) diff --git a/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx b/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx deleted file mode 100644 index 567713ab741daf32e26794ade7f4be75cf9c8ffc..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbAlignImageToPath.cxx +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - - - -#include <iostream> -#include "itkPolyLineParametricPath.h" - -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImageToPathListAlignFilter.h" - -#include "itkPathSource.h" - -#include <stdio.h> - -int otbAlignImageToPath(int itkNotUsed(argc), char * argv[]) -{ - const char * inputFilename = argv[1]; - const char * outputFilename = argv[2]; - - typedef double InputPixelType; - typedef double OutputPixelType; - const unsigned int Dimension = 2; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - - typedef itk::PolyLineParametricPath<Dimension> PathType; - - PathType::Pointer ltoto = PathType::New(); - - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - - typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> ListAlignFilterType; - typedef ListAlignFilterType::ValueType ValueType; - typedef ListAlignFilterType::SizeType SizeType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - InputImageType::Pointer ImageIn = InputImageType::New(); - - ListAlignFilterType::Pointer testList = ListAlignFilterType::New(); - - reader->SetFileName(inputFilename); - - //OTB-FA-00010-CS - testList->SetInput(reader->GetOutput()); - - typedef ListAlignFilterType::OutputPathListType ListAlignFilterOutputPathListType; - - otbGenericMsgDebugMacro(<< "Before update"); - testList->Update(); - otbGenericMsgDebugMacro(<< "After update"); - - ValueType pathValue; - pathValue = testList->GetPathValue(); - testList->SetPathValue(pathValue); - - ValueType backgroundValue; - backgroundValue = testList->GetBackgroundValue(); - testList->SetBackgroundValue(backgroundValue); - - SizeType size; - size = testList->GetSize(); - testList->SetSize(size); - - bool isMeaningfulSegment; - isMeaningfulSegment = testList->GetisMeaningfulSegment(); - testList->SetisMeaningfulSegment(isMeaningfulSegment); - - int NbGradDirection; - NbGradDirection = testList->GetNbGradDirection(); - testList->SetNbGradDirection(NbGradDirection); - - int NbLineDirection; - NbLineDirection = testList->GetNbLineDirection(); - testList->SetNbLineDirection(NbLineDirection); - - double MinGradNorm; - MinGradNorm = testList->GetMinGradNorm(); - testList->SetMinGradNorm(MinGradNorm); - - double Eps; - Eps = testList->GetEps(); - testList->SetEps(Eps); - - ListAlignFilterOutputPathListType * sortiePath = testList->GetOutput(); - - otbGenericMsgDebugMacro(<< "Writing :"); - - FILE *file = fopen(outputFilename, "w"); - if (file == nullptr) - { - fprintf(stderr, "Error, can't open file"); - exit(-1); - } - typedef itk::ContinuousIndex<double, 2> VertexType; - typedef itk::VectorContainer<unsigned, VertexType> VertexListType; - typedef VertexListType::ConstPointer VertexListTypePointer; - VertexListTypePointer vertexList; - VertexType cindex; - double x1, y1; - //double x2, y2; - - int nbPath = sortiePath->Size(); - otbGenericMsgDebugMacro(<< "NbSegment: " << nbPath); - fprintf(file, "Nb Segment: %d\n", nbPath); - for (int i = 0; i < nbPath; ++i) - { - vertexList = sortiePath->GetNthElement(i)->GetVertexList(); - cindex = vertexList->GetElement(0); - x1 = cindex[0]; - y1 = cindex[1]; - cindex = vertexList->GetElement(1); - //x2 = cindex[0]; - //y2 = cindex[1]; - fprintf(file, "%8.3f %8.3f\n", x1, y1); - } - fclose(file); - - // writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx deleted file mode 100644 index dde12b6ad8d6082b5ca64fedfa9d9a6bb0b0ab05..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbBreakAngularPathListFilter.cxx +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbBreakAngularPathListFilter.h" - -#include "itkPolyLineParametricPath.h" -#include <fstream> -#include <vector> -#include "otbMath.h" -#include <cstdlib> - -int otbBreakAngularPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * outfname = argv[1]; - - typedef std::vector<double> PointsVectorType; - typedef std::vector<PointsVectorType> PointsMatrixType; - PointsMatrixType MatricePoints; - PointsVectorType ListPoints; - PointsVectorType ListMaxAngle; - - int cpt = 2; - - ListMaxAngle.clear(); - while (argv[cpt][0] != '|') - { - ListMaxAngle.push_back(static_cast<double>(::atof(argv[cpt]))); - ++cpt; - } - ++cpt; - ListPoints.clear(); - - while (argv[cpt] != nullptr) - { - if (argv[cpt][0] == '|') - { - if ((ListPoints.size() % 2) != 0) - { - itkGenericExceptionMacro(<< "Missing point in parameters !"); - } - MatricePoints.push_back(ListPoints); - ListPoints.clear(); - } - else - { - ListPoints.push_back(static_cast<double>(::atof(argv[cpt]))); - } - ++cpt; - } - MatricePoints.push_back(ListPoints); - - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::BreakAngularPathListFilter<PathType> BreakAngularPathListFilterType; - typedef BreakAngularPathListFilterType::PathListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - std::cout << "List " << std::endl; - for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it) - { - cindex[0] = *it; - ++it; - cindex[1] = *it; - std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - - // Instantiating object - BreakAngularPathListFilterType::Pointer breakAngularFilter = BreakAngularPathListFilterType::New(); - breakAngularFilter->SetInput(InputPathList); - - std::ofstream file; - file.open(outfname); - - for (PointsVectorType::iterator itAngle = ListMaxAngle.begin(); itAngle != ListMaxAngle.end(); ++itAngle) - { - - breakAngularFilter->SetMaxAngle((*itAngle) * otb::CONST_PI / 180.); - breakAngularFilter->Update(); - - PathListType::Pointer OutputPathList = breakAngularFilter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "--------------------------------------------------------------------------" << std::endl; - file << "MAX ANGULAR :" << breakAngularFilter->GetMaxAngle() << "(" << (*itAngle) << " deg.)" << std::endl; - file << "INPUT list of Path " << ": " << std::endl; - while (pathListIt != InputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - - counter = 1; - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - - } //Enf for angle - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx b/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx deleted file mode 100644 index c5847cc841ae136d46887fce8fd8b6e2c2d86fc1..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbDrawPathAlign.cxx +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - - -#include "itkMacro.h" -#include "itkPolyLineParametricPath.h" - -#include "otbImageFileReader.h" -#include "otbPathListSource.h" -#include "otbImageToPathListAlignFilter.h" -#include "otbDrawPathListFilter.h" -#include "otbImageFileWriter.h" - -int otbDrawPathAlign(int itkNotUsed(argc), char * argv[]) -{ - const char * inputFilename = argv[1]; - const char * outputFilename = argv[2]; - - typedef unsigned char InputPixelType; - typedef unsigned char OutputPixelType; - const unsigned int Dimension = 2; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef itk::PolyLineParametricPath<Dimension> PathType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> PathListType; - typedef PathListType::OutputPathListType OutputPathListType; - - typedef otb::DrawPathListFilter<InputImageType, PathType, OutputImageType> DrawPathFilterType; - - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - DrawPathFilterType::Pointer DrawPath = DrawPathFilterType::New(); - PathType::Pointer VertexList = PathType::New(); - - reader->SetFileName(inputFilename); - writer->SetFileName(outputFilename); - - typedef otb::ImageToPathListAlignFilter<InputImageType, PathType> PathListAlignType; - PathListAlignType::Pointer testList = PathListAlignType::New(); - - //OTB-FA-00010-CS - testList->SetInput(reader->GetOutput()); - testList->Update(); - - OutputPathListType * sortiePath = testList->GetOutput(); - int nbPath = sortiePath->Size(); - std::cout << "NbPath: " << nbPath << std::endl; - - InputImageType::ConstPointer imageIn = reader->GetOutput(); - - DrawPath->SetInput(imageIn); - DrawPath->SetInputPath(sortiePath); - - writer->SetInput(DrawPath->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx deleted file mode 100644 index a1a7054b0fec3afe46e7d85c3451ad2cb38c598a..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbLikelihoodPathListFilter.cxx +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbLikelihoodPathListFilter.h" -#include "otbPolyLineParametricPathWithValue.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include <fstream> - -int otbLikelihoodPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - - std::cout << std::endl; - - const char * infname = argv[1]; - const char * outfname = argv[2]; - - typedef std::vector<double> PointsVectorType; - typedef std::vector<PointsVectorType> PointsMatrixType; - PointsMatrixType MatricePoints; - PointsVectorType ListPoints; - - int cpt = 3; - ListPoints.clear(); - - while (argv[cpt] != nullptr) - { - if (argv[cpt][0] == '|') - { - if ((ListPoints.size() % 2) != 0) - { - itkGenericExceptionMacro(<< "Missing point in parameters !"); - } - MatricePoints.push_back(ListPoints); - ListPoints.clear(); - } - else - { - ListPoints.push_back(static_cast<double>(::atof(argv[cpt]))); - } - ++cpt; - } - MatricePoints.push_back(ListPoints); - - const unsigned int Dimension = 2; - typedef double PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType; - typedef otb::LikelihoodPathListFilter<PathType, ImageType> LikelihoodPathListFilterType; - typedef LikelihoodPathListFilterType::PathListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - std::cout << "List " << std::endl; - for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it) - { - cindex[0] = *it; - ++it; - cindex[1] = *it; - std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - - //Instantiating object - LikelihoodPathListFilterType::Pointer filter = LikelihoodPathListFilterType::New(); - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(infname); - reader->Update(); - - filter->SetInput(InputPathList); - filter->SetInputImage(reader->GetOutput()); - filter->Update(); - - std::cout << "Filter execution ended" << std::endl; - - PathListType::Pointer OutputPathList = filter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - std::ofstream file; - file.open(outfname); - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "INPUT list of Path " << ": " << std::endl; - while (pathListIt != InputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - counter = 1; - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << " Value: " << pathListIt.Get()->GetValue(); - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx deleted file mode 100644 index c41995abfaa600794e2e725c52121ea06f1e47bb..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbLinkPathListFilter.cxx +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbLinkPathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include "otbMath.h" -#include <fstream> -#include <cstdlib> - -int otbLinkPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - - std::cout << std::endl; - - const char * outfname = argv[1]; - const double distance = atof(argv[2]); - const double angle = ::atof(argv[3]) * otb::CONST_PI / 180.; - - typedef std::vector<double> PointsVectorType; - typedef std::vector<PointsVectorType> PointsMatrixType; - PointsMatrixType MatricePoints; - PointsVectorType ListPoints; - - int cpt = 4; - ListPoints.clear(); - - while (argv[cpt] != nullptr) - { - if (argv[cpt][0] == '|') - { - if ((ListPoints.size() % 2) != 0) - { - itkGenericExceptionMacro(<< "Missing point in parameters !"); - } - MatricePoints.push_back(ListPoints); - ListPoints.clear(); - } - else - { - ListPoints.push_back(static_cast<double>(::atof(argv[cpt]))); - } - ++cpt; - } - MatricePoints.push_back(ListPoints); - - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::LinkPathListFilter<PathType> LinkPathListFilterType; - typedef LinkPathListFilterType::PathListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - std::cout << "List " << std::endl; - for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it) - { - cindex[0] = *it; - ++it; - cindex[1] = *it; - std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - //Instantiating object - LinkPathListFilterType::Pointer filter = LinkPathListFilterType::New(); - - filter->SetInput(InputPathList); - filter->SetDistanceThreshold(distance); - filter->SetAngularThreshold(angle); - filter->Update(); - - std::cout << "Filter execution ended" << std::endl; - - PathListType::Pointer OutputPathList = filter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - std::ofstream file; - file.open(outfname); - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "Maximum distance threshold: " << filter->GetDistanceThreshold() << " (" << distance << ")" << std::endl; - file << "Maximum angle threshold: " << filter->GetAngularThreshold() << " (" << angle * 180 / otb::CONST_PI << ")" << - std::endl; - file << "INPUT list of Path " << ": " << std::endl; - while (pathListIt != InputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - counter = 1; - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx b/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx deleted file mode 100644 index 75c62bb6ab0c1f770bdade075f0aabc90ad5cba7..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbNeighborhoodScalarProductFilter.cxx +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbNeighborhoodScalarProductFilter.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "itkGradientRecursiveGaussianImageFilter.h" - -int otbNeighborhoodScalarProductFilter(int itkNotUsed(argc), char * argv[]) -{ - - const char * infname = argv[1]; - const char * outfname = argv[2]; - const char * diroutfname = argv[3]; - const double sigma = atof(argv[4]); - - const unsigned int Dimension = 2; - typedef double PixelType; - typedef itk::CovariantVector<PixelType, Dimension> VectorPixelType; - typedef otb::Image<VectorPixelType, Dimension> VectorImageType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::NeighborhoodScalarProductFilter<VectorImageType, ImageType, ImageType> FilterType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef itk::GradientRecursiveGaussianImageFilter<ImageType, VectorImageType> GradientFilterType; - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - GradientFilterType::Pointer gradient = GradientFilterType::New(); - - reader->SetFileName(infname); - reader->Update(); - - gradient->SetInput(reader->GetOutput()); - gradient->SetSigma(sigma); - filter->SetInput(gradient->GetOutput()); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - writer = WriterType::New(); - writer->SetFileName(diroutfname); - writer->SetInput(filter->GetOutputDirection()); - writer->Update(); - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx deleted file mode 100644 index cb8970e5de831bd4818789b586443a52d29d468d..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbNonMaxRemovalByDirectionFilter.cxx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbNonMaxRemovalByDirectionFilter.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" - -int otbNonMaxRemovalByDirectionFilter(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - typedef double PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef otb::NonMaxRemovalByDirectionFilter<ImageType, ImageType, ImageType> NonMaxRemovalByDirectionFilterType; - - // Instantiating object - ReaderType::Pointer modReader = ReaderType::New(); - ReaderType::Pointer dirReader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - modReader->SetFileName(argv[1]); - dirReader->SetFileName(argv[2]); - writer->SetFileName(argv[3]); - NonMaxRemovalByDirectionFilterType::Pointer filter = NonMaxRemovalByDirectionFilterType::New(); - filter->SetInput(modReader->GetOutput()); - filter->SetInputDirection(dirReader->GetOutput()); - writer->SetInput(filter->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx deleted file mode 100644 index f2b67fc6ad757b8e6e93f86608a698e1ed339880..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbParallelLinePathListFilter.cxx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbParallelLinePathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include <cstdlib> - -int otbParallelLinePathListFilter(int itkNotUsed(argc), char * itkNotUsed(argv) []) -{ - - // We create some lines - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::ObjectList<PathType> PathListType; - - PathListType::Pointer lineList = PathListType::New(); - PathListType::Pointer parallelList = PathListType::New(); - - typedef PathType::ContinuousIndexType ContinuousIndexType; - ContinuousIndexType cindex; - - /*-----*/ - PathType::Pointer aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 1; - cindex[1] = 1; - aLine->AddVertex(cindex); - - cindex[0] = 1; - cindex[1] = 100; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - parallelList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 10; - cindex[1] = 1; - aLine->AddVertex(cindex); - - cindex[0] = 10; - cindex[1] = 100; - aLine->AddVertex(cindex); - parallelList->PushBack(aLine); - lineList->PushBack(aLine); - - /*-----*/ - aLine = PathType::New(); - aLine->Initialize(); - cindex[0] = 174; - cindex[1] = 99; - aLine->AddVertex(cindex); - - cindex[0] = 281; - cindex[1] = 1; - aLine->AddVertex(cindex); - - lineList->PushBack(aLine); - - // Parallel lines are detected. - - typedef otb::ParallelLinePathListFilter<PathType> ParallelLinePathType; - ParallelLinePathType::Pointer parallelLinePathListFilter = ParallelLinePathType::New(); - parallelLinePathListFilter->SetDistanceThreshold(10); - parallelLinePathListFilter->SetAngularThreshold(10); - parallelLinePathListFilter->SetCommonDistanceThreshold(10); - parallelLinePathListFilter->SetInput(lineList); - parallelLinePathListFilter->Update(); - - PathListType::Pointer pathList = parallelLinePathListFilter->GetOutput(); - PathListType::Iterator listIt = pathList->Begin(); - - PathListType::Iterator parListIt = parallelList->Begin(); - - // A path is a line segment in this case. - while (listIt != pathList->End() && parListIt != parallelList->End()) - { - PathType::VertexListType::ConstPointer vertexList = (listIt.Get())->GetVertexList(); - - PathType::VertexListType::ConstPointer parVertexList = (parListIt.Get())->GetVertexList(); - - PathType::VertexListType::ConstIterator pathIt = vertexList->Begin(); - PathType::VertexListType::ConstIterator parPathIt = parVertexList->Begin(); - // Loop over all the vertices in one path - while (pathIt != vertexList->End() && - parPathIt != parVertexList->End()) - { - - if (pathIt.Value() != parPathIt.Value()) - { - std::cout << pathIt.Index() << pathIt.Value() << std::endl; - return EXIT_FAILURE; - - } - ++pathIt; - ++parPathIt; - } - ++listIt; - ++parListIt; - } - - return EXIT_SUCCESS; - -} diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx deleted file mode 100644 index a2a9ade45086a8b60e17e1c71ab78a2d5dcc6cb9..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbRemoveIsolatedByDirectionFilter.cxx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbRemoveIsolatedByDirectionFilter.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" - -int otbRemoveIsolatedByDirectionFilter(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - typedef double PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef otb::RemoveIsolatedByDirectionFilter<ImageType, ImageType, ImageType> RemoveIsolatedByDirectionFilterType; - - // Instantiating object - ReaderType::Pointer modReader = ReaderType::New(); - ReaderType::Pointer dirReader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - modReader->SetFileName(argv[1]); - dirReader->SetFileName(argv[2]); - writer->SetFileName(argv[3]); - RemoveIsolatedByDirectionFilterType::Pointer filter = RemoveIsolatedByDirectionFilterType::New(); - filter->SetInput(modReader->GetOutput()); - filter->SetInputDirection(dirReader->GetOutput()); - writer->SetInput(filter->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx deleted file mode 100644 index 21b28e0c90ec845d6c0e37887d2876a4fca2b6ee..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbRemoveTortuousPathListFilter.cxx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbRemoveTortuousPathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include <fstream> -#include <cstdlib> - -int otbRemoveTortuousPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * outfname = argv[1]; - const double threshold = atof(argv[2]); - - typedef std::vector<double> PointsVectorType; - typedef std::vector<PointsVectorType> PointsMatrixType; - PointsMatrixType MatricePoints; - PointsVectorType ListPoints; - - int cpt = 3; - ListPoints.clear(); - - while (argv[cpt] != nullptr) - { - if (argv[cpt][0] == '|') - { - if ((ListPoints.size() % 2) != 0) - { - itkGenericExceptionMacro(<< "Missing point in parameters !"); - } - MatricePoints.push_back(ListPoints); - ListPoints.clear(); - } - else - { - ListPoints.push_back(static_cast<double>(::atof(argv[cpt]))); - } - ++cpt; - } - MatricePoints.push_back(ListPoints); - - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::RemoveTortuousPathListFilter<PathType> RemoveTortuousPathListFilterType; - typedef RemoveTortuousPathListFilterType::InputListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - std::cout << "List " << std::endl; - for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it) - { - cindex[0] = *it; - ++it; - cindex[1] = *it; - std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - // Instantiating object - RemoveTortuousPathListFilterType::Pointer filter = RemoveTortuousPathListFilterType::New(); - - filter->SetInput(InputPathList); - filter->GetFunctor().SetThreshold(threshold); - filter->Update(); - - PathListType::Pointer OutputPathList = filter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - std::ofstream file; - file.open(outfname); - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "Minimum Mean Distance: " << filter->GetFunctor().GetThreshold() << " (" << threshold << ")" << std::endl; - file << "INPUT list of Path " << ": " << std::endl; - while (pathListIt != InputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - counter = 1; - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx deleted file mode 100644 index 146623060c18a74dc415f0a51f8a939254d7c999..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbRemoveWrongDirectionFilter.cxx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbRemoveWrongDirectionFilter.h" -#include "otbImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" - -int otbRemoveWrongDirectionFilter(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - typedef double PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef otb::RemoveWrongDirectionFilter<ImageType, ImageType, ImageType> RemoveWrongDirectionFilterType; - - // Instantiating object - ReaderType::Pointer modReader = ReaderType::New(); - ReaderType::Pointer dirReader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - modReader->SetFileName(argv[1]); - dirReader->SetFileName(argv[2]); - writer->SetFileName(argv[3]); - RemoveWrongDirectionFilterType::Pointer filter = RemoveWrongDirectionFilterType::New(); - filter->SetInput(modReader->GetOutput()); - filter->SetInputDirection(dirReader->GetOutput()); - writer->SetInput(filter->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx deleted file mode 100644 index 80e757ab1b4a624493fbbab5b141e221ff63aff4..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbRoadExtractionFilter.cxx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbImage.h" -#include "otbRoadExtractionFilter.h" -#include "otbDrawPathListFilter.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbPolyLineParametricPathWithValue.h" -#include "otbMath.h" - -int otbRoadExtractionFilter(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - typedef otb::VectorImage<double, Dimension> InputImageType; - typedef otb::Image<double, Dimension> OutputImageType; - typedef otb::PolyLineParametricPathWithValue<double, Dimension> PathType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - typedef otb::RoadExtractionFilter<InputImageType, PathType> RoadExtractionFilterType; - typedef RoadExtractionFilterType::InputPixelType InputPixelType; - typedef otb::DrawPathListFilter<OutputImageType, PathType, OutputImageType> DrawPathFilterType; - - //Parameters - const char * inputFileName(argv[1]); - const char * outputFileName(argv[2]); - InputPixelType ReferencePixel; - ReferencePixel.Reserve(4); - ReferencePixel.SetElement(0, ::atof(argv[3])); - ReferencePixel.SetElement(1, ::atof(argv[4])); - ReferencePixel.SetElement(2, ::atof(argv[5])); - ReferencePixel.SetElement(3, ::atof(argv[6])); - const double Alpha = ::atof(argv[7]); - const double AmplitudeThreshold = ::atof(argv[8]); - const double Tolerance = ::atof(argv[9]); - const double MaxAngle = ((otb::CONST_PI * ::atof(argv[10])) / 180.); - const double FirstMeanDistanceThreshold = ::atof(argv[11]); - const double SecondMeanDistanceThreshold = ::atof(argv[12]); - const double LinkAngularThreshold = ((otb::CONST_PI * ::atof(argv[13])) / 180.); - const double LinkDistanceThreshold = ::atof(argv[14]); - - // Instantiating object - ReaderType::Pointer reader = ReaderType::New(); - RoadExtractionFilterType::Pointer roadExtraction = RoadExtractionFilterType::New(); - DrawPathFilterType::Pointer draw = DrawPathFilterType::New(); - WriterType::Pointer writer = WriterType::New(); - - //Initialization parameters - reader->SetFileName(inputFileName); - - roadExtraction->SetInput(reader->GetOutput()); - roadExtraction->SetReferencePixel(ReferencePixel); - roadExtraction->SetAlpha(Alpha); - roadExtraction->SetAmplitudeThreshold(AmplitudeThreshold); - roadExtraction->SetTolerance(Tolerance); - roadExtraction->SetMaxAngle(MaxAngle); - roadExtraction->SetFirstMeanDistanceThreshold(FirstMeanDistanceThreshold); - roadExtraction->SetSecondMeanDistanceThreshold(SecondMeanDistanceThreshold); - roadExtraction->SetAngularThreshold(LinkAngularThreshold); - roadExtraction->SetDistanceThreshold(LinkDistanceThreshold); - - reader->GenerateOutputInformation(); - OutputImageType::Pointer image = OutputImageType::New(); - image->CopyInformation(reader->GetOutput()); - image->SetRegions(image->GetLargestPossibleRegion()); - image->Allocate(); - image->FillBuffer(0); - - draw->SetInput(image); - //Use internal value of path - draw->UseInternalPathValueOn(); - draw->SetInputPath(roadExtraction->GetOutput()); - - writer->SetFileName(outputFileName); - writer->SetInput(draw->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx b/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx deleted file mode 100644 index 2765863108877e2fb1ecda2ec2914a4e15316586..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbRoadExtractionTestDriver.cxx +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbLikelihoodPathListFilter); - REGISTER_TEST(otbRemoveWrongDirectionFilter); - REGISTER_TEST(otbSimplifyPathListFilter); - REGISTER_TEST(otbAlignImageToPath); - REGISTER_TEST(otbNonMaxRemovalByDirectionFilter); - REGISTER_TEST(otbRoadExtractionFilter); - REGISTER_TEST(otbLinkPathListFilter); - REGISTER_TEST(otbRemoveTortuousPathListFilter); - REGISTER_TEST(otbParallelLinePathListFilter); - REGISTER_TEST(otbRemoveIsolatedByDirectionFilter); - REGISTER_TEST(otbVectorDataToRoadDescriptionFilter); - REGISTER_TEST(otbSimplifyManyPathListFilter); - REGISTER_TEST(otbNeighborhoodScalarProductFilter); - REGISTER_TEST(otbDrawPathAlign); - REGISTER_TEST(otbBreakAngularPathListFilter); -} diff --git a/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx deleted file mode 100644 index 12a79b10a8160ea6d9fb4af08c92acb764607d27..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbSimplifyManyPathListFilter.cxx +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbSimplifyPathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include <fstream> -#include <cstdlib> - -/** - * This filter is intended to test the multithreading capabilities - * of the otb::UnaryFunctorObjectListFilter - */ - -int otbSimplifyManyPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * outfname = argv[1]; - const double tolerance = atof(argv[2]); - -// typedef std::vector<double> PointsVectorType; -// typedef std::vector< PointsVectorType > PointsMatrixType; -// PointsMatrixType MatricePoints; -// PointsVectorType ListPoints; - - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::SimplifyPathListFilter<PathType> SimplifyPathListFilterType; - typedef SimplifyPathListFilterType::InputListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - unsigned long int numberOfPaths = 10000; - srand(123456); - - for (unsigned long int i = 0; i < numberOfPaths; ++i) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - unsigned int numberOfPoints = static_cast<int>((rand() / (RAND_MAX + 1.0)) * 90) + 10; -// std::cout << "List :" << numberOfPoints << " points" << std::endl; - cindex[0] = 0; - cindex[1] = 0; - for (unsigned int j = 0; j < numberOfPoints; ++j) - { - cindex[0] += (rand() / (RAND_MAX + 1.0)) * 100 - 50; - cindex[1] += (rand() / (RAND_MAX + 1.0)) * 100 - 50; -// std::cout << "Point Index :"<<cindex[0]<<", "<<cindex[1]<<std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - // Instantiating object - SimplifyPathListFilterType::Pointer simplifyFilter = SimplifyPathListFilterType::New(); - - simplifyFilter->SetInput(InputPathList); - simplifyFilter->GetFunctor().SetTolerance(tolerance); - simplifyFilter->Update(); - - PathListType::Pointer OutputPathList = simplifyFilter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - std::ofstream file; - file.open(outfname); - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "TOLERANCE: " << simplifyFilter->GetFunctor().GetTolerance() << "(" << tolerance << ")" << std::endl; - - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx b/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx deleted file mode 100644 index 54095a10ec232ab00a3ac9cc1e55fd27d27a822f..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbSimplifyPathListFilter.cxx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbSimplifyPathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include <fstream> -#include <cstdlib> - -int otbSimplifyPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * outfname = argv[1]; - const double tolerance = atof(argv[2]); - - typedef std::vector<double> PointsVectorType; - typedef std::vector<PointsVectorType> PointsMatrixType; - PointsMatrixType MatricePoints; - PointsVectorType ListPoints; - - int cpt = 3; - ListPoints.clear(); - - while (argv[cpt] != nullptr) - { - if (argv[cpt][0] == '|') - { - if ((ListPoints.size() % 2) != 0) - { - itkGenericExceptionMacro(<< "Missing point in parameters !"); - } - MatricePoints.push_back(ListPoints); - ListPoints.clear(); - } - else - { - ListPoints.push_back(static_cast<double>(::atof(argv[cpt]))); - } - ++cpt; - } - MatricePoints.push_back(ListPoints); - - const unsigned int Dimension = 2; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::SimplifyPathListFilter<PathType> SimplifyPathListFilterType; - typedef SimplifyPathListFilterType::InputListType PathListType; - PathType::ContinuousIndexType cindex; - - PathListType::Pointer InputPathList = PathListType::New(); - - //Generate PathList - for (PointsMatrixType::iterator listpos = MatricePoints.begin(); listpos != MatricePoints.end(); ++listpos) - { - PathType::Pointer path = PathType::New(); - //Generate PathList - std::cout << "List " << std::endl; - for (PointsVectorType::iterator it = (*listpos).begin(); it != (*listpos).end(); ++it) - { - cindex[0] = *it; - ++it; - cindex[1] = *it; - std::cout << "Point Index :" << cindex[0] << ";" << cindex[1] << std::endl; - path->AddVertex(cindex); - } - InputPathList->PushBack(path); - } - // Instantiating object - SimplifyPathListFilterType::Pointer simplifyFilter = SimplifyPathListFilterType::New(); - - simplifyFilter->SetInput(InputPathList); - simplifyFilter->GetFunctor().SetTolerance(tolerance); - simplifyFilter->Update(); - - PathListType::Pointer OutputPathList = simplifyFilter->GetOutput(); - - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - - std::ofstream file; - file.open(outfname); - unsigned int counter = 1; - PathListIteratorType pathListIt = InputPathList->Begin(); - - file << "TOLERANCE: " << simplifyFilter->GetFunctor().GetTolerance() << "(" << tolerance << ")" << std::endl; - file << "INPUT list of Path " << ": " << std::endl; - while (pathListIt != InputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - counter = 1; - pathListIt = OutputPathList->Begin(); - file << "OUTPUT list of Path " << ": " << std::endl; - while (pathListIt != OutputPathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx b/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx deleted file mode 100644 index 98715c2b867184293e7943a188a534c96a928222..0000000000000000000000000000000000000000 --- a/Modules/Detection/RoadExtraction/test/otbVectorDataToRoadDescriptionFilter.cxx +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbVectorDataToRoadDescriptionFilter.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" -#include "otbVectorDataProperties.h" -#include "otbRemoteSensingRegion.h" -#include "otbVectorDataIntoImageProjectionFilter.h" - - - - - -int otbVectorDataToRoadDescriptionFilter(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputImg = argv[2]; - const char * inputDB = argv[3]; - const char * outputVD = argv[4]; - const char * DEMDirectory = argv[5]; - int DisplayWarnings = atoi(argv[6]); - - typedef double PrecisionType; - typedef otb::VectorData<PrecisionType, 2> VectorDataType; - typedef otb::VectorImage<PrecisionType> ImageType; - - typedef otb::VectorDataToRoadDescriptionFilter<VectorDataType, ImageType> - VectorDataToRoadDescriptionFilterType; - - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::VectorDataFileReader<VectorDataType> - VectorDataReaderType; - typedef otb::VectorDataFileWriter<VectorDataType> - VectorDataWriterType; - typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> - VectorDataReProjFilter; - - - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReaderType::Pointer DBReader = VectorDataReaderType::New(); - ImageReaderType::Pointer reader = ImageReaderType::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New(); - - VectorDataToRoadDescriptionFilterType::Pointer filter = - VectorDataToRoadDescriptionFilterType::New(); - - if (!DisplayWarnings) - { - reader->SetGlobalWarningDisplay(0); - } - otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDirectory); - - reader->SetFileName(inputImg); - reader->UpdateOutputInformation(); - - DBReader->SetFileName(inputDB); - DBReader->Update(); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - vdReProjFilter->SetInputImage(reader->GetOutput()); - vdReProjFilter->SetInputVectorData(vdReader->GetOutput()); - vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true); - vdReProjFilter->Update(); - - filter->SetInput(vdReProjFilter->GetOutput()); - filter->AddOpticalImage(reader->GetOutput()); - filter->AddBuildingsDB(DBReader->GetOutput()); - - vdWriter->SetFileName(outputVD); - vdWriter->SetInput(filter->GetOutput()); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/UrbanArea/CMakeLists.txt b/Modules/Detection/UrbanArea/CMakeLists.txt deleted file mode 100644 index 3bc279da0f37ffd74bdb90c4814be43d9ee1dec6..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBUrbanArea) -otb_module_impl() diff --git a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h b/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h deleted file mode 100644 index cfee272c5486c76220c4e513ea43b8647e518dbe..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.h +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbUrbanAreaDetectionImageFilter_h -#define otbUrbanAreaDetectionImageFilter_h - -#include "otbImage.h" -#include "otbWaterIndicesFunctor.h" -#include "otbVegetationIndicesFunctor.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkBinaryErodeImageFilter.h" -#include "itkBinaryDilateImageFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "itkMacro.h" -#include "itkSobelEdgeDetectionImageFilter.h" -#include "otbEdgeDetectorImageFilter.h" -#include "otbEdgeDensityImageFilter.h" -#include "otbBinaryImageDensityFunction.h" -#include "otbVectorImageToIntensityImageFilter.h" - -namespace otb -{ - -namespace Functor -{ - -/** \class RadiometricNonWaterNonVegetationIndexFunctor - * \brief This functor computes ndwi and ndvi of an image - * \brief in order to find urban areas and generate a grayscale image - * - * \ingroup OTBUrbanArea - */ -template<class TInput, class TOutput = double> -class RadiometricNonWaterNonVegetationIndexFunctor -{ -public: - typedef Functor::NDVI<double, double, double> VegetationFunctorType; - typedef Functor::NDWI2<double, double, double> WaterFunctorType; - typedef TOutput ValueType; - - VegetationFunctorType GetVegetationFunctor(){ return m_VegetationFunctor; } - WaterFunctorType GetWaterFunctor(){ return m_WaterFunctor; } - - void SetRedIndex(int id){ m_VegetationFunctor.SetRedIndex(id); } - void SetGreenIndex(int id){ m_WaterFunctor.SetGIndex(id); } - void SetNIRIndex(int id) - { - m_VegetationFunctor.SetNIRIndex(id); - m_WaterFunctor.SetNIRIndex(id); - } - - RadiometricNonWaterNonVegetationIndexFunctor(){} - virtual ~RadiometricNonWaterNonVegetationIndexFunctor(){} - - inline TOutput operator ()(const TInput& pInPix) - { - TOutput lVIval, lWIval, lOutPix; - - TInput zero = pInPix; - zero.Fill(0); - if (pInPix != zero) - { - lVIval = static_cast<ValueType>(std::max(0., m_VegetationFunctor(pInPix))); - lWIval = static_cast<ValueType>(std::max(0., m_WaterFunctor(pInPix))); - - lOutPix = std::sqrt(std::abs((1 - lVIval) * (1 - lWIval))); - } - else lOutPix = 0; - - return lOutPix; - } - -protected: - VegetationFunctorType m_VegetationFunctor; - WaterFunctorType m_WaterFunctor; - -}; - -/** \class RadiometricNonWaterNonVegetationDetectionFunctor - * \brief This functor uses computes RadiometricNonWaterNonVegetationIndexFunctor - * \brief and appli a threshold to produce a binary image - * - * \ingroup OTBUrbanArea - */ -template<class TInput, class TOutput> -class RadiometricNonWaterNonVegetationDetectionFunctor -{ -public: - typedef RadiometricNonWaterNonVegetationIndexFunctor<TInput> RadiometricNonWaterNonVegetationIndexFunctorType; - - RadiometricNonWaterNonVegetationDetectionFunctor() - { - m_LowerThreshold = 0.0; - m_UpperThreshold = 1.0; - } - - virtual ~RadiometricNonWaterNonVegetationDetectionFunctor() {} - inline TOutput operator ()(const TInput& inPix) - { - // The vegetation and water areas are put to 0. - double indexesVal = static_cast<double>(m_RadiometricNonWaterNonVegetationIndexFunctor(inPix)); - - if ((indexesVal > m_LowerThreshold) && (indexesVal <= m_UpperThreshold)) - { - return static_cast<TOutput>(1); - } - else - { - return static_cast<TOutput>(0); - } - } - - void SetLowerThreshold(double threshold){ m_LowerThreshold = threshold; } - void SetUpperThreshold(double threshold){ m_UpperThreshold = threshold; } - double GetLowerThreshold(){ return m_LowerThreshold; } - double GetUpperThreshold(){ return m_UpperThreshold; } - - void SetRedIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetRedIndex(id); } - void SetGreenIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetGreenIndex(id); } - void SetNIRIndex(int id){ m_RadiometricNonWaterNonVegetationIndexFunctor.SetNIRIndex(id); } - -protected: - RadiometricNonWaterNonVegetationIndexFunctorType m_RadiometricNonWaterNonVegetationIndexFunctor; - double m_LowerThreshold; - double m_UpperThreshold; - -}; - -} //end namespace functor - -/** \class UrbanAreaDetectionImageFilter - * \brief This filter uses associated functors to produce a binary or grayscale image - * \brief where the white areas represents the urban areas. - * - * \ingroup OTBUrbanArea - */ -template <class TInputImage, class TOutputImage, - class TFunction = Functor::RadiometricNonWaterNonVegetationIndexFunctor< - typename TInputImage::PixelType, - typename TOutputImage::PixelType> > -class ITK_EXPORT UrbanAreaDetectionImageFilter : - public itk::ImageToImageFilter<TInputImage, TOutputImage> -{ -public: - /** Standard class typedefs. */ - typedef UrbanAreaDetectionImageFilter Self; - typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(UrbanAreaDetectionImageFilter, itk::ImageToImageFilter); - - /** Images typedefs */ - typedef TInputImage VectorImageType; - typedef TOutputImage OutputImageType; - typedef double SingleImagePixelType; - typedef Image<SingleImagePixelType, 2> SingleImageType; - typedef SingleImageType::SizeType SizeType; - typedef typename OutputImageType::PixelType OutputImagePixelType; - typedef typename VectorImageType::PixelType VectorImagePixelType; - - /** Filters typedefs */ - // NonVegetationNonWaterIndexFilter - typedef Functor::RadiometricNonWaterNonVegetationDetectionFunctor<VectorImagePixelType, - OutputImagePixelType> FunctorType; - typedef itk::UnaryFunctorImageFilter <VectorImageType, OutputImageType, - FunctorType> UrbanAreaExtractionFilterType; - typedef typename UrbanAreaExtractionFilterType::Pointer - UrbanAreaExtrationFilterPointerType; - // Erode/Dilate Filters - typedef typename itk::BinaryBallStructuringElement<OutputImagePixelType, - 2> StructuringElementType; - typedef typename itk::BinaryErodeImageFilter<OutputImageType, OutputImageType, - StructuringElementType> ErodeFilterType; - typedef typename itk::BinaryDilateImageFilter<OutputImageType, OutputImageType, - StructuringElementType> DilateFilterType; - // Intensity - typedef VectorImageToIntensityImageFilter<VectorImageType, SingleImageType> IntensityFilterType; - typedef typename IntensityFilterType::Pointer IntensityFilterPointerType; - // EdgeDensityFilter - typedef BinaryImageDensityFunction<SingleImageType> - CountFunctionType; - typedef itk::SobelEdgeDetectionImageFilter<SingleImageType, SingleImageType> SobelType; - typedef EdgeDetectorImageFilter<SingleImageType, SingleImageType, - SobelType> SobelDetectorType; - typedef EdgeDensityImageFilter<SingleImageType, SingleImageType, SobelDetectorType, - CountFunctionType> EdgeDensityFilterType; - typedef typename EdgeDensityFilterType::Pointer - EdgeDensityFilterPointerType; - // Threshold - typedef itk::BinaryThresholdImageFilter<SingleImageType, OutputImageType> ThresholdFilterType; - typedef typename ThresholdFilterType::Pointer ThresholdFilterPointerType; - // Multiply - typedef itk::MultiplyImageFilter<VectorImageType, OutputImageType, VectorImageType> MultiplyImageFilterType; - typedef typename MultiplyImageFilterType::Pointer MultiplyImageFilterPointerType; - - /** Get/Set indices */ - void SetRedIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetRedIndex(id); } - void SetGreenIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetGreenIndex(id); } - void SetNIRIndex(int id){ m_UrbanAreaExtractionFilter->GetFunctor().SetNIRIndex(id); } - unsigned int GetRedIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetRedIndex(); } - unsigned int GetGreenIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetGreenIndex(); } - unsigned int GetNIRIndex(){ return m_UrbanAreaExtractionFilter->GetFunctor().GetNIRIndex(); } - /** Get/Set threshold values */ - itkGetMacro(ThresholdValue, double); - itkSetMacro(ThresholdValue, double); - itkGetMacro(ThresholdDensity, double); - itkSetMacro(ThresholdDensity, double); - itkGetMacro(SobelLowerThreshold, double); - itkSetMacro(SobelLowerThreshold, double); - itkGetMacro(SobelUpperThreshold, double); - itkSetMacro(SobelUpperThreshold, double); - - /** Methods */ - void GenerateData() override; - -protected: - UrbanAreaDetectionImageFilter(); - ~UrbanAreaDetectionImageFilter() override{} - -private: - UrbanAreaDetectionImageFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - /** Filters */ - IntensityFilterPointerType m_IntensityFilter; - EdgeDensityFilterType::Pointer m_EdgeDensityFilter; - SobelDetectorType::Pointer m_SobelFilter; - ThresholdFilterPointerType m_Thresholder; - UrbanAreaExtrationFilterPointerType m_UrbanAreaExtractionFilter; - MultiplyImageFilterPointerType m_MultiplyFilter; - - /** Thresholds */ - double m_ThresholdValue; - double m_ThresholdDensity; - - double m_SobelLowerThreshold; - double m_SobelUpperThreshold; - -}; // end class RadiometricNonWaterNonVegetationDetectionImageFilter - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbUrbanAreaDetectionImageFilter.hxx" -#endif - -#endif diff --git a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx b/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx deleted file mode 100644 index f9cc85fd1fe317ae0122d7185a102200295b964c..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/include/otbUrbanAreaDetectionImageFilter.hxx +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbUrbanAreaDetectionImageFilter_hxx -#define otbUrbanAreaDetectionImageFilter_hxx - -#include "otbUrbanAreaDetectionImageFilter.h" -#include "itkProgressAccumulator.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TInputImage, class TOutputImage, class TFunction> -UrbanAreaDetectionImageFilter<TInputImage, TOutputImage, TFunction> -::UrbanAreaDetectionImageFilter() -{ - - m_IntensityFilter = IntensityFilterType::New(); - m_EdgeDensityFilter = EdgeDensityFilterType::New(); - m_SobelFilter = SobelDetectorType::New(); - m_Thresholder = ThresholdFilterType::New(); - m_UrbanAreaExtractionFilter = UrbanAreaExtractionFilterType::New(); - - m_MultiplyFilter = MultiplyImageFilterType::New(); - - /** Init the Pipeline */ - // EdgeDensity - m_EdgeDensityFilter->SetInput(m_IntensityFilter->GetOutput()); - m_EdgeDensityFilter->SetDetector(m_SobelFilter); - // Threshold - m_Thresholder->SetInput(m_EdgeDensityFilter->GetOutput()); - // Mask Image - m_MultiplyFilter->SetInput2(m_Thresholder->GetOutput()); - // NonVegetationNonWaterIndex - m_UrbanAreaExtractionFilter->SetInput(m_MultiplyFilter->GetOutput()); - - m_ThresholdValue = 0.5; - m_ThresholdDensity = 0.1; - m_SobelLowerThreshold = -100.0; - m_SobelUpperThreshold = 200.0; -} - -/** - * Parameters the filters of the pipeline - */ -template <class TInputImage, class TOutputImage, class TFunction> -void -UrbanAreaDetectionImageFilter<TInputImage, TOutputImage, TFunction> -::GenerateData() -{ - - // Intensity - m_IntensityFilter->SetInput(this->GetInput()); - - // Edge Density - m_SobelFilter->SetLowerThreshold(m_SobelLowerThreshold); - m_SobelFilter->SetUpperThreshold(m_SobelUpperThreshold); - SizeType lSize; - lSize[0] = static_cast<unsigned int>(10); - lSize[1] = static_cast<unsigned int>(10); - m_EdgeDensityFilter->SetNeighborhoodRadius(lSize); - - // Threshold - m_Thresholder->SetInsideValue(0); - m_Thresholder->SetOutsideValue(1); - m_Thresholder->SetLowerThreshold(-10.); - m_Thresholder->SetUpperThreshold(m_ThresholdDensity); - - // Apply the mask on the input image - m_MultiplyFilter->SetInput1(this->GetInput()); - - // Give a threshold to urbanAreaFilter - m_UrbanAreaExtractionFilter->GetFunctor().SetLowerThreshold(m_ThresholdValue); - - // Progress accumulator - itk::ProgressAccumulator::Pointer progress = itk::ProgressAccumulator::New(); - progress->SetMiniPipelineFilter(this); - progress->RegisterInternalFilter(m_UrbanAreaExtractionFilter, 0.5f); - - /** GraftOutput */ - m_UrbanAreaExtractionFilter->GraftOutput(this->GetOutput()); - m_UrbanAreaExtractionFilter->Update(); - this->GraftOutput(m_UrbanAreaExtractionFilter->GetOutput()); - -} - -} // end namespace otb - -#endif diff --git a/Modules/Detection/UrbanArea/otb-module.cmake b/Modules/Detection/UrbanArea/otb-module.cmake deleted file mode 100644 index fdbd78381f39a9606ef054a34b63afe218380753..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/otb-module.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "This module is concerned with the detection of urban area.") - -otb_module(OTBUrbanArea - DEPENDS - OTBStatistics - OTBITK - OTBImageBase - OTBEdge - OTBImageManipulation - OTBIndices - - TEST_DEPENDS - OTBTestKernel - OTBImageIO - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Detection/UrbanArea/test/CMakeLists.txt b/Modules/Detection/UrbanArea/test/CMakeLists.txt deleted file mode 100644 index 48c2ed26443e5dd8564dfc84ecd9bceb0de148c8..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/test/CMakeLists.txt +++ /dev/null @@ -1,47 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBUrbanAreaTests -otbUrbanAreaTestDriver.cxx -otbUrbanAreaDetectionImageFilter.cxx -) - -add_executable(otbUrbanAreaTestDriver ${OTBUrbanAreaTests}) -target_link_libraries(otbUrbanAreaTestDriver ${OTBUrbanArea-Test_LIBRARIES}) -otb_module_target_label(otbUrbanAreaTestDriver) - -# Tests Declaration - - -otb_add_test(NAME raTvUrbanAreaDetectionImageFilter COMMAND otbUrbanAreaTestDriver - --compare-image ${EPSILON_8} ${BASELINE}/raTvUrbanAreaDetection.png - ${TEMP}/raTvUrbanAreaDetection.png - otbUrbanAreaDetectionImageFilter - ${INPUTDATA}/qb_RoadExtract2sub200x200.tif - ${TEMP}/raTvUrbanAreaDetection.png - 3 # red - 2 # green - 4 # nir - 0.8 # threshold NDVI+NDWI - 0.005 # threshold EdgeDensity - ) - diff --git a/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx b/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx deleted file mode 100644 index cac601a228731321ee4f17e2f45577f310261e5d..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/test/otbUrbanAreaDetectionImageFilter.cxx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbUrbanAreaDetectionImageFilter.h" - -int otbUrbanAreaDetectionImageFilter(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> InputVectorImageType; - typedef otb::Image<unsigned char, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputVectorImageType> ReaderType; - - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef otb::UrbanAreaDetectionImageFilter<InputVectorImageType, - OutputImageType> UrbanAreaDetectionFilterType; - - // Instantiating objects - UrbanAreaDetectionFilterType::Pointer filter = UrbanAreaDetectionFilterType::New(); - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - const char * inputFilename = argv[1]; - const char * outputFilename = argv[2]; - - reader->SetFileName(inputFilename); - writer->SetFileName(outputFilename); - - filter->SetInput(reader->GetOutput()); - filter->SetRedIndex(::atoi(argv[3])); - filter->SetGreenIndex(::atoi(argv[4])); - filter->SetNIRIndex(::atoi(argv[5])); - filter->SetThresholdValue(::atof(argv[6])); - filter->SetThresholdDensity(::atof(argv[7])); - - writer->SetInput(filter->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx b/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx deleted file mode 100644 index 2d035d4ce44de5ef7094525271d5d64fc6603460..0000000000000000000000000000000000000000 --- a/Modules/Detection/UrbanArea/test/otbUrbanAreaTestDriver.cxx +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbUrbanAreaDetectionImageFilter); -} diff --git a/Modules/Feature/Edge/test/CMakeLists.txt b/Modules/Feature/Edge/test/CMakeLists.txt index 687442cbfefdfdabffaa329e34f29029d1cb5a25..171dbfe4c705dfb54e101cc0c9697fcad5cb3fd7 100644 --- a/Modules/Feature/Edge/test/CMakeLists.txt +++ b/Modules/Feature/Edge/test/CMakeLists.txt @@ -120,7 +120,7 @@ otb_add_test(NAME bfTvPersistentVectorizationImageFilter COMMAND otbEdgeTestDriv ${BASELINE_FILES}/bfTvPersistentVectorizationImageFilterOutput.txt ${TEMP}/bfTvPersistentVectorizationImageFilterOutput.txt otbPersistentVectorizationFilter - ${INPUTDATA}/Seg1InputForRCC8Graph.tif + ${INPUTDATA}/labelImage_UnsignedChar.tif ${TEMP}/bfTvPersistentVectorizationImageFilterOutput.txt ) diff --git a/Modules/Feature/SeamCarving/CMakeLists.txt b/Modules/Feature/SeamCarving/CMakeLists.txt deleted file mode 100644 index 48e2f8a8d73200ced3943178074537e8688b16ef..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBSeamCarving) -otb_module_impl() diff --git a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h deleted file mode 100644 index 7066a891f52719b0371d20eb5a13150e7a393def..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbAddCarvingPathFilter_h -#define otbAddCarvingPathFilter_h - -#include "itkImageAndPathToImageFilter.h" -#include "itkImageSliceIteratorWithIndex.h" - -namespace otb -{ -/** \class AddCarvingPathFilter - * \brief This class add pixels given in one path - * - * This filter add pixels found by the otb::ImageToCarvingPathFilter - * thus increasing the image size. - * the image (if Direction is set to 0) or from left to right - * (if direction is set to 1). Pixel value is computed as the average - * between the neighborhood pixels. - * - * This is one component necessary to apply the seam carving algorithm - * published by Shai Avidan, Ariel Shamir, - * Seam Carving for Content-Aware Image Resizing, - * ACM Transactions on Graphics, Volume 26, Number 3, - * SIGGRAPH 2007 - * - * \par INPUTS - * The first input is an image, usually, the same one provided to the - * otb::ImageToCarvingPathFilter - * The second input is a path, typically the output of otb::ImageToCarvingPathFilter. - * - * \par OUTPUTS - * The output is an image with a bigger size than the input image. There is one more - * column if direction is 0 and one more line if direction is 1. - * - * \sa ImageToCarvingPathFilter - * - * - * \ingroup PathFilters - * \ingroup ImageFilters - * - * \ingroup OTBSeamCarving - */ - -template <class TInputImage, class TInputPath, class TOutputImage> -class ITK_EXPORT AddCarvingPathFilter : public itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> -{ -public: - /** Standard class typedefs. */ - typedef AddCarvingPathFilter Self; - typedef itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(AddCarvingPathFilter, itk::ImageAndPathToImageFilter); - - /** Some convenient typedefs. */ - typedef TInputImage InputImageType; - typedef typename InputImageType::Pointer InputImagePointer; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::RegionType InputImageRegionType; - typedef typename InputImageType::PixelType InputImagePixelType; - typedef TInputPath InputPathType; - typedef typename InputPathType::Pointer InputPathPointer; - typedef typename InputPathType::ConstPointer InputPathConstPointer; - typedef typename InputPathType::InputType InputPathInputType; - typedef typename InputPathType::OutputType InputPathOutputType; - typedef typename InputPathType::IndexType InputPathIndexType; - typedef typename InputPathType::OffsetType InputPathOffsetType; - typedef TOutputImage OutputImageType; - typedef typename OutputImageType::Pointer OutputImagePointer; - typedef typename OutputImageType::ConstPointer OutputImageConstPointer; - - typedef typename OutputImageType::RegionType OutputImageRegionType; - typedef typename OutputImageType::PixelType OutputImagePixelType; - typedef typename OutputImageType::ValueType OutputImageValueType; - -// typedef typename itk::ImageRegionConstIterator<InputImageType> InputIteratorType; -// typedef typename itk::ImageRegionIterator<OutputImageType> OutputIteratorType; - typedef typename itk::ImageSliceConstIteratorWithIndex<InputImageType> InputIteratorType; - typedef typename itk::ImageSliceIteratorWithIndex<OutputImageType> OutputIteratorType; - - /** Set/Get the path input of this process object. - Note: these methods are adding to get the proper name */ - void SetInputPath(const TInputPath * path); - - const TInputPath * GetInputPath(void); - - itkSetMacro(Value, OutputImagePixelType); - itkGetConstReferenceMacro(Value, OutputImagePixelType); - - /** Set and Get direction value */ - itkSetMacro(Direction, unsigned int); - itkGetConstMacro(Direction, unsigned int); - - void GenerateOutputInformation() override; - void GenerateInputRequestedRegion() override; - -protected: - AddCarvingPathFilter(); - ~AddCarvingPathFilter() override {} - - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - void GenerateData() override; - -private: - AddCarvingPathFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - OutputImagePixelType m_Value; - unsigned int m_Direction; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbAddCarvingPathFilter.hxx" -#endif - -#endif diff --git a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx deleted file mode 100644 index 5864bc0917135aa882a10265d23c3d21ed8a57cf..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbAddCarvingPathFilter.hxx +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef otbAddCarvingPathFilter_hxx -#define otbAddCarvingPathFilter_hxx - -#include "otbAddCarvingPathFilter.h" -#include "itkMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TInputPath, class TOutputImage> -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::AddCarvingPathFilter() -{ - m_Value = static_cast<OutputImagePixelType>(255.0); - m_Direction = 0; -} -/** - * Main computation method. - */ -template <class TInputImage, class TInputPath, class TOutputImage> -inline void -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::SetInputPath(const TInputPath * path) -{ - this->SetPathInput(path); -} -template <class TInputImage, class TInputPath, class TOutputImage> -const TInputPath * -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GetInputPath(void) -{ - return this->GetPathInput(); -} - -template <class TInputImage, class TInputPath, class TOutputImage> -void -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GenerateData(void) -{ - - const InputImageType * inputImage = this->GetImageInput(); - const InputPathType * inputPath = this->GetPathInput(); - OutputImageType * outputImage = this->GetOutput(); - - outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); - outputImage->Allocate(); - - InputIteratorType inputIterator(inputImage, - inputImage->GetLargestPossibleRegion()); - OutputIteratorType outputIterator(outputImage, - outputImage->GetLargestPossibleRegion()); - - unsigned int dir0; - unsigned int dir1; - - if (m_Direction == 0) - { - dir0 = 0; - dir1 = 1; - } - else - { - dir0 = 1; - dir1 = 0; - } - - inputIterator.SetFirstDirection(dir0); - inputIterator.SetSecondDirection(dir1); - inputIterator.GoToBegin(); - outputIterator.SetFirstDirection(dir0); - outputIterator.SetSecondDirection(dir1); - outputIterator.GoToBegin(); - - int line = -1; - typename InputImageType::IndexType index; - typename InputPathType::VertexListType::ConstPointer vertexList = inputPath->GetVertexList(); - typename InputPathType::VertexListType::ConstIterator pathIterator; - typename InputImageType::IndexType indexToAdd; - typedef typename InputImageType::IndexType::IndexValueType IndexValueType; - - typename InputImageType::SizeType inputSize; - inputSize = inputImage->GetLargestPossibleRegion().GetSize(); - - //go to the end of the path - pathIterator = vertexList->Begin(); - while (pathIterator != vertexList->End()) - { - ++pathIterator; - } - --pathIterator; - - while (!outputIterator.IsAtEnd()) - { - while (!outputIterator.IsAtEndOfSlice()) - { - bool flag = false; - while (!outputIterator.IsAtEndOfLine()) - { - index = outputIterator.GetIndex(); - - if (index[dir1] != line) - { - line = index[dir1]; - typename InputImageType::PointType tmpIndex; - inputImage->TransformContinuousIndexToPhysicalPoint(pathIterator.Value(), tmpIndex); - inputImage->TransformPhysicalPointToIndex(tmpIndex, indexToAdd); - if (pathIterator != vertexList->Begin()) - { - --pathIterator; - } - if (index[dir1] != indexToAdd[dir1]) - { - itkExceptionMacro(<< "Error : " << index[dir1] << " , " << indexToAdd[dir1]); - } - } - - if ((flag == true) - || ((index[dir0] != indexToAdd[dir0]) - && (index[dir0] < static_cast<IndexValueType>(inputSize[dir0])))) - { - outputIterator.Set(inputIterator.Get()); - ++inputIterator; - } - else - { - flag = true; - OutputImagePixelType newValue = itk::NumericTraits<OutputImagePixelType>::Zero; - int n = 0; - InputIteratorType tmpIterator = inputIterator; - --tmpIterator; - if (!tmpIterator.IsAtReverseEndOfLine()) - { - newValue = tmpIterator.Get(); - ++n; - } - tmpIterator = inputIterator; - ++tmpIterator; - if (!tmpIterator.IsAtEndOfLine()) - { - newValue += tmpIterator.Get(); - ++n; - } - assert(n != 0); - newValue /= n; - outputIterator.Set(newValue); - } - ++outputIterator; - - } - - if ((outputIterator.GetIndex())[dir0] != (inputIterator.GetIndex())[dir0] + 1) - { - itkExceptionMacro(<< "Error 2: " << (outputIterator.GetIndex())[dir0] << " , " - << (inputIterator.GetIndex())[dir0]); - } - inputIterator.NextLine(); - outputIterator.NextLine(); - } - inputIterator.NextSlice(); - outputIterator.NextSlice(); - } - -} - -/** - * Printself Method - */ -template <class TInputImage, class TInputPath, class TOutputImage> -void -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Path Value: " << m_Value << std::endl; -} - -template <class TInputImage, class TInputPath, class TOutputImage> -void -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GenerateOutputInformation() -{ - // call the superclass' implementation of this method - Superclass::GenerateOutputInformation(); - - // get pointers to the input and output - typename Superclass::InputImageConstPointer inputPtr = this->GetInput(); - typename Superclass::OutputImagePointer outputPtr = this->GetOutput(); - - unsigned int dir0; - //unsigned int dir1; - - if (m_Direction == 0) - { - dir0 = 0; - //dir1 = 1; - } - else - { - dir0 = 1; - //dir1 = 0; - } - - // we need to compute the output spacing, the output image size, and the - // output image start index - const typename TInputImage::SpacingType& - inputSpacing = inputPtr->GetSignedSpacing(); - const typename TInputImage::SizeType& inputSize - = inputPtr->GetLargestPossibleRegion().GetSize(); - const typename TInputImage::IndexType& inputStartIndex - = inputPtr->GetLargestPossibleRegion().GetIndex(); - - typename TOutputImage::SpacingType outputSpacing; - typename TOutputImage::SizeType outputSize; - typename TOutputImage::IndexType outputStartIndex; - - for (unsigned int i = 0; i < TOutputImage::ImageDimension; ++i) - { - outputSpacing[i] = inputSpacing[i]; - outputSize[i] = (unsigned int) (inputSize[i]); - outputStartIndex[i] = inputStartIndex[i]; - } - // we remove one column of the image - outputSize[dir0] = inputSize[dir0] + 1; - - outputPtr->SetSignedSpacing(outputSpacing); - - typename TOutputImage::RegionType outputLargestPossibleRegion; - outputLargestPossibleRegion.SetSize(outputSize); - outputLargestPossibleRegion.SetIndex(outputStartIndex); - - outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion); -} - -template <class TInputImage, class TInputPath, class TOutputImage> -void -AddCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GenerateInputRequestedRegion() -{ - // call the superclass' implementation of this method - Superclass::GenerateInputRequestedRegion(); - // get pointers to the input and output - InputImagePointer inputPtr = - const_cast<InputImageType *>(this->GetInput()); - if (!inputPtr) - { - itkExceptionMacro(<< "Input has not been set."); - } - - inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion()); - -} - -} // end namespace otb - -#endif diff --git a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h deleted file mode 100644 index ad9142b72266dec5ef435f97e972d8adb24f574e..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToCarvingPathFilter_h -#define otbImageToCarvingPathFilter_h - -#include "otbImageToPathFilter.h" -#include "itkImageSliceConstIteratorWithIndex.h" - -namespace otb -{ -/** - * \class ImageToCarvingPathFilter - * \brief This filter find the minimum energy path of an image. - * - * This filter find the minimum energy path from top to bottom of - * the image (if Direction is set to 0) or from left to right - * (if direction is set to 1). - * - * This is one component necessary to apply the seam carving algorithm - * published by Shai Avidan, Ariel Shamir, - * Seam Carving for Content-Aware Image Resizing, - * ACM Transactions on Graphics, Volume 26, Number 3, - * SIGGRAPH 2007 - * - * \par INPUTS - * The input is an image, typically the output of a gradient filter. - * - * \par OUTPUTS - * The output is - * a polyline parametric path comprising one and only one pixel per line - * (resp. column) if direction is 0 (resp. 1). - * - * \sa RemoveCarvingPathFilter - * - * \ingroup PathFilters - * \ingroup ImageFilters - * - * \ingroup OTBSeamCarving - */ - -template <class TInputImage, class TOutputPath> -class ITK_EXPORT ImageToCarvingPathFilter - : public ImageToPathFilter<TInputImage, TOutputPath> -{ -public: - /** standards typedefs */ - typedef ImageToCarvingPathFilter Self; - typedef ImageToPathFilter<TInputImage, TOutputPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /// Creation through the object factory - itkNewMacro(Self); - /// Runtime information - itkTypeMacro(ImageToCarvingPathFilter, ImageToPathFilter); - - /// Template parameters typedef - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::InputImagePointerType InputImagePointerType; - typedef typename Superclass::OutputPathType OutputPathType; - typedef typename Superclass::OutputPathPointerType OutputPathPointerType; - - typedef typename InputImageType::PixelType PixelType; - - /** Set and Get foreground value */ - itkSetMacro(ForegroundValue, PixelType); - itkGetConstMacro(ForegroundValue, PixelType); - - /** Set and Get direction value */ - itkSetMacro(Direction, unsigned int); - itkGetConstMacro(Direction, unsigned int); - - /** Get EnergyPerPix value */ - itkGetConstMacro(EnergyPerPix, double); - -protected: - ImageToCarvingPathFilter(); - ~ImageToCarvingPathFilter() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - void GenerateOutputInformation() override {} //does nothing - void GenerateData() override; - -private: - ImageToCarvingPathFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - PixelType m_ForegroundValue; - unsigned int m_Direction; - double m_EnergyPerPix; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageToCarvingPathFilter.hxx" -#endif - -#endif diff --git a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx deleted file mode 100644 index 11123630270d2e508b792d13397913d0b4c84bc3..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbImageToCarvingPathFilter.hxx +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToCarvingPathFilter_hxx -#define otbImageToCarvingPathFilter_hxx - -#include "otbImageToCarvingPathFilter.h" -#include "otbMacro.h" -#include "itkConstantPadImageFilter.h" -#include "itkConstShapedNeighborhoodIterator.h" -#include "itkImageRegionConstIterator.h" -#include "itkNumericTraits.h" -#include "itkImageLinearConstIteratorWithIndex.h" - -namespace otb -{ -/* - * Constructor. - */ -template <class TInputImage, class TOutputPath> -ImageToCarvingPathFilter<TInputImage, TOutputPath> -::ImageToCarvingPathFilter() -{ - m_ForegroundValue = PixelType(255); - m_Direction = 0; - m_EnergyPerPix = 0.0; -} - -/** - * Main computation method. - */ -template <class TInputImage, class TOutputPath> -void -ImageToCarvingPathFilter<TInputImage, TOutputPath> -::GenerateData(void) -{ - - const InputImageType * inputImage = this->GetInput(); - OutputPathType * outputPath = this->GetOutput(); - - typedef itk::ImageSliceConstIteratorWithIndex - <InputImageType> IteratorType; - typedef itk::NeighborhoodIterator<InputImageType> - NeighborhoodIteratorType; - - IteratorType it(inputImage, - inputImage->GetLargestPossibleRegion()); - it.GoToBegin(); - - PixelType maxValue = itk::NumericTraits<PixelType>::max(); - - typename InputImageType::Pointer energyImage = InputImageType::New(); - energyImage->SetRegions(inputImage->GetLargestPossibleRegion()); - energyImage->Allocate(); - - typename NeighborhoodIteratorType::RadiusType radius; - radius.Fill(1); - NeighborhoodIteratorType neighIt(radius, energyImage, - energyImage->GetLargestPossibleRegion()); - neighIt.GoToBegin(); - - unsigned int dir0; - unsigned int dir1; - - typename IteratorType::OffsetType UP0; - typename IteratorType::OffsetType UP1; - typename IteratorType::OffsetType UP2; - typename IteratorType::OffsetType NEXT; - - const typename IteratorType::OffsetType LEFT = {{-1, 0}}; - const typename IteratorType::OffsetType RIGHT = {{1, 0}}; - const typename IteratorType::OffsetType UP = {{0, -1}}; - const typename IteratorType::OffsetType DOWN = {{0, 1}}; - const typename IteratorType::OffsetType LEFTUP = {{-1, -1}}; -// const typename IteratorType::OffsetType RIGHTDOWN ={{1, 1}}; - const typename IteratorType::OffsetType RIGHTUP = {{1, -1}}; - const typename IteratorType::OffsetType LEFTDOWN = {{-1, 1}}; -// const typename IteratorType::OffsetType CENTER ={{0, 0}}; - - if (m_Direction == 0) - { - dir0 = 0; - dir1 = 1; - UP0 = LEFTUP; - UP1 = UP; - UP2 = RIGHTUP; - NEXT = DOWN; - } - else - { - dir0 = 1; - dir1 = 0; - UP0 = LEFTUP; - UP1 = LEFT; - UP2 = LEFTDOWN; - NEXT = RIGHT; - } - - /** Compute the energy image top-down or left-right - * with cumulative energy (dynamic programming first step) */ - it.SetFirstDirection(dir0); - it.SetSecondDirection(dir1); - it.GoToBegin(); - neighIt.GoToBegin(); - while (!it.IsAtEnd()) - { - while (!it.IsAtEndOfSlice()) - { - while (!it.IsAtEndOfLine()) - { - neighIt.SetLocation(it.GetIndex()); //TODO bad for performances... find a better option - // this is really about 20% of total processing time !!! - - PixelType min = maxValue; - bool isInside = false; - bool flag = false; - if (neighIt.GetPixel(UP0, isInside) < min) - { - if (isInside) - { - min = neighIt.GetPixel(UP0); - flag = true; - } - } - if (neighIt.GetPixel(UP1, isInside) < min) - { - if (isInside) - { - min = neighIt.GetPixel(UP1); - flag = true; - } - } - if (neighIt.GetPixel(UP2, isInside) < min) - { - if (isInside) - { - min = neighIt.GetPixel(UP2); - flag = true; - } - } - - if (!flag) //no previous value - { - min = 0; - } - - PixelType newValue = it.Get() + min; - neighIt.SetCenterPixel(newValue); - - ++it; - - } - it.NextLine(); - } - it.NextSlice(); - } - - /** Follow the minima bottom-up or right-left - * (dynamic programming second step) */ - - //find the starting point to follow on the last line - typedef itk::ImageLinearConstIteratorWithIndex<InputImageType> - LinearIteratorType; - - LinearIteratorType LinIt(energyImage, - energyImage->GetLargestPossibleRegion()); - LinIt.SetDirection(dir0); - LinIt.GoToReverseBegin(); - typedef typename InputImageType::IndexType IndexType; - - PixelType min = maxValue; - IndexType indexToAdd; - while (!LinIt.IsAtReverseEndOfLine()) - { - if (LinIt.Get() < min) - { - min = LinIt.Get(); - indexToAdd = LinIt.GetIndex(); - } - --LinIt; - } - outputPath->AddVertex(indexToAdd); - m_EnergyPerPix = ((double) min) / (inputImage->GetLargestPossibleRegion().GetSize())[dir1]; - - //follow the min - neighIt.SetLocation(indexToAdd); - bool flag = true; - while (flag) - { - flag = false; - PixelType minValue = maxValue; - IndexType indexToAdd2; - bool isInside = false; - - if (neighIt.GetPixel(UP0, isInside) < min) - { - if (isInside) - { - minValue = neighIt.GetPixel(UP0); - indexToAdd2 = neighIt.GetIndex(UP0); - flag = true; - } - } - - if (neighIt.GetPixel(UP1, isInside) < minValue) - { - if (isInside) - { - minValue = neighIt.GetPixel(UP1); - indexToAdd2 = neighIt.GetIndex(UP1); - flag = true; - } - } - - if (neighIt.GetPixel(UP2, isInside) < minValue) - { - if (isInside) - { - minValue = neighIt.GetPixel(UP2); - indexToAdd2 = neighIt.GetIndex(UP2); - flag = true; - } - } - - if (flag) - { - outputPath->AddVertex(indexToAdd2); - neighIt.SetLocation(indexToAdd2); - } - - } - -} - -template <class TInputImage, class TOutputPath> -void -ImageToCarvingPathFilter<TInputImage, TOutputPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << "Foreground value : " << m_ForegroundValue << std::endl; -} -} // end namespace otb - -#endif diff --git a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h b/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h deleted file mode 100644 index c503944f713ee8a93ea76f5eb209557ee829ea45..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRemoveCarvingPathFilter_h -#define otbRemoveCarvingPathFilter_h - -#include "itkImageAndPathToImageFilter.h" -#include "itkImageSliceIteratorWithIndex.h" - -namespace otb -{ -/** \class RemoveCarvingPathFilter - * \brief This class remove pixels given in one path - * - * - * - * This filter remove pixels found by the otb::ImageToCarvingPathFilter - * thus decreasing the image size. - * the image (if Direction is set to 0) or from left to right - * (if direction is set to 1). - * - * This is one component necessary to apply the seam carving algorithm - * published by Shai Avidan, Ariel Shamir, - * Seam Carving for Content-Aware Image Resizing, - * ACM Transactions on Graphics, Volume 26, Number 3, - * SIGGRAPH 2007 - * - * \par INPUTS - * The first input is an image, usually, the same one provided to the - * otb::ImageToCarvingPathFilter - * The second input is a path, typically the output of otb::ImageToCarvingPathFilter. - * - * \par OUTPUTS - * The output is an image with a smaller size than the input image. There is one less - * column if direction is 0 and one less line if direction is 1. - * - * \sa ImageToCarvingPathFilter - * - * - * \ingroup PathFilters - * \ingroup ImageFilters - * - * \ingroup OTBSeamCarving - */ - -template <class TInputImage, class TInputPath, class TOutputImage> -class ITK_EXPORT RemoveCarvingPathFilter : public itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> -{ -public: - /** Standard class typedefs. */ - typedef RemoveCarvingPathFilter Self; - typedef itk::ImageAndPathToImageFilter<TInputImage, TInputPath, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(RemoveCarvingPathFilter, itk::ImageAndPathToImageFilter); - - /** Some convenient typedefs. */ - typedef TInputImage InputImageType; - typedef typename InputImageType::Pointer InputImagePointer; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::RegionType InputImageRegionType; - typedef typename InputImageType::PixelType InputImagePixelType; - typedef TInputPath InputPathType; - typedef typename InputPathType::Pointer InputPathPointer; - typedef typename InputPathType::ConstPointer InputPathConstPointer; - typedef typename InputPathType::InputType InputPathInputType; - typedef typename InputPathType::OutputType InputPathOutputType; - typedef typename InputPathType::IndexType InputPathIndexType; - typedef typename InputPathType::OffsetType InputPathOffsetType; - typedef TOutputImage OutputImageType; - typedef typename OutputImageType::Pointer OutputImagePointer; - typedef typename OutputImageType::ConstPointer OutputImageConstPointer; - - typedef typename OutputImageType::RegionType OutputImageRegionType; - typedef typename OutputImageType::PixelType OutputImagePixelType; - typedef typename OutputImageType::ValueType OutputImageValueType; - -// typedef typename itk::ImageRegionConstIterator<InputImageType> InputIteratorType; -// typedef typename itk::ImageRegionIterator<OutputImageType> OutputIteratorType; - typedef typename itk::ImageSliceConstIteratorWithIndex<InputImageType> InputIteratorType; - typedef typename itk::ImageSliceIteratorWithIndex<OutputImageType> OutputIteratorType; - - /** Set/Get the path input of this process object. - Note: these methods are adding to get the proper name */ - void SetInputPath(const TInputPath * path); - - const TInputPath * GetInputPath(void); - - itkSetMacro(Value, OutputImagePixelType); - itkGetConstReferenceMacro(Value, OutputImagePixelType); - - /** Set and Get direction value */ - itkSetMacro(Direction, unsigned int); - itkGetConstMacro(Direction, unsigned int); - - void GenerateOutputInformation() override; - -protected: - RemoveCarvingPathFilter(); - ~RemoveCarvingPathFilter() override {} - - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - void GenerateData() override; - -private: - RemoveCarvingPathFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - OutputImagePixelType m_Value; - unsigned int m_Direction; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRemoveCarvingPathFilter.hxx" -#endif - -#endif diff --git a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx b/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx deleted file mode 100644 index 46640119ef2d1a78837cc0d9ab133ba0fb6a137e..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/include/otbRemoveCarvingPathFilter.hxx +++ /dev/null @@ -1,224 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#ifndef otbRemoveCarvingPathFilter_hxx -#define otbRemoveCarvingPathFilter_hxx - -#include "otbRemoveCarvingPathFilter.h" -#include "itkMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TInputPath, class TOutputImage> -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::RemoveCarvingPathFilter() -{ - m_Value = static_cast<OutputImagePixelType>(255.0); - m_Direction = 0; -} - -template <class TInputImage, class TInputPath, class TOutputImage> -inline void -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::SetInputPath(const TInputPath * path) -{ - this->SetPathInput(path); -} - -template <class TInputImage, class TInputPath, class TOutputImage> -const TInputPath * -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GetInputPath(void) -{ - return this->GetPathInput(); -} - -/** - * Main computation method. - */ -template <class TInputImage, class TInputPath, class TOutputImage> -void -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GenerateData(void) -{ - - const InputImageType * inputImage = this->GetImageInput(); - const InputPathType * inputPath = this->GetPathInput(); - OutputImageType * outputImage = this->GetOutput(); - - outputImage->SetBufferedRegion(outputImage->GetRequestedRegion()); - outputImage->Allocate(); - - InputIteratorType inputIterator(inputImage, - inputImage->GetLargestPossibleRegion()); - OutputIteratorType outputIterator(outputImage, - outputImage->GetLargestPossibleRegion()); - - unsigned int dir0; - unsigned int dir1; - - if (m_Direction == 0) - { - dir0 = 0; - dir1 = 1; - } - else - { - dir0 = 1; - dir1 = 0; - } - - inputIterator.SetFirstDirection(dir0); - inputIterator.SetSecondDirection(dir1); - inputIterator.GoToBegin(); - outputIterator.SetFirstDirection(dir0); - outputIterator.SetSecondDirection(dir1); - outputIterator.GoToBegin(); - - int line = -1; - typename InputImageType::IndexType index; - typename InputPathType::VertexListType::ConstPointer vertexList = inputPath->GetVertexList(); - typename InputPathType::VertexListType::ConstIterator pathIterator; - typename InputImageType::IndexType indexToRemove; - - //go to the end of the path - pathIterator = vertexList->Begin(); - while (pathIterator != vertexList->End()) - { - ++pathIterator; - } - --pathIterator; - - while (!inputIterator.IsAtEnd()) - { - while (!inputIterator.IsAtEndOfSlice()) - { - while (!inputIterator.IsAtEndOfLine()) - { - index = inputIterator.GetIndex(); - - if (index[dir1] != line) - { - line = index[dir1]; - typename InputImageType::PointType tmpIndex; - inputImage->TransformContinuousIndexToPhysicalPoint(pathIterator.Value(), tmpIndex); - inputImage->TransformPhysicalPointToIndex(tmpIndex, indexToRemove); - - if (pathIterator != vertexList->Begin()) - { - --pathIterator; - } - if (index[dir1] != indexToRemove[dir1]) - { - itkExceptionMacro(<< "Error!!!"); - } - } - if (index[dir0] != indexToRemove[dir0]) - { - outputIterator.Set(inputIterator.Get()); - ++outputIterator; - } - ++inputIterator; - } - inputIterator.NextLine(); - outputIterator.NextLine(); - } - inputIterator.NextSlice(); - outputIterator.NextSlice(); - } - -} - -/** - * Printself Method - */ -template <class TInputImage, class TInputPath, class TOutputImage> -void -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Path Value: " << m_Value << std::endl; -} - -template <class TInputImage, class TInputPath, class TOutputImage> -void -RemoveCarvingPathFilter<TInputImage, TInputPath, TOutputImage> -::GenerateOutputInformation() -{ - // call the superclass' implementation of this method - Superclass::GenerateOutputInformation(); - - // get pointers to the input and output - typename Superclass::InputImageConstPointer inputPtr = this->GetInput(); - typename Superclass::OutputImagePointer outputPtr = this->GetOutput(); - - unsigned int dir0; - //unsigned int dir1; - - if (m_Direction == 0) - { - dir0 = 0; - //dir1 = 1; - } - else - { - dir0 = 1; - //dir1 = 0; - } - - // we need to compute the output spacing, the output image size, and the - // output image start index - const typename TInputImage::SpacingType& - inputSpacing = inputPtr->GetSignedSpacing(); - const typename TInputImage::SizeType& inputSize - = inputPtr->GetLargestPossibleRegion().GetSize(); - const typename TInputImage::IndexType& inputStartIndex - = inputPtr->GetLargestPossibleRegion().GetIndex(); - - typename TOutputImage::SpacingType outputSpacing; - typename TOutputImage::SizeType outputSize; - typename TOutputImage::IndexType outputStartIndex; - - for (unsigned int i = 0; i < TOutputImage::ImageDimension; ++i) - { - outputSpacing[i] = inputSpacing[i]; - outputSize[i] = (unsigned int) (inputSize[i]); - outputStartIndex[i] = inputStartIndex[i]; - } - // we remove one column of the image - outputSize[dir0] = inputSize[dir0] - 1; - - outputPtr->SetSignedSpacing(outputSpacing); - - typename TOutputImage::RegionType outputLargestPossibleRegion; - outputLargestPossibleRegion.SetSize(outputSize); - outputLargestPossibleRegion.SetIndex(outputStartIndex); - - outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion); -} - -} // end namespace otb - -#endif diff --git a/Modules/Feature/SeamCarving/otb-module.cmake b/Modules/Feature/SeamCarving/otb-module.cmake deleted file mode 100644 index d0f0c8465d5031e2097b607a671cbfe534636d43..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/otb-module.cmake +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "This module contains necessary components to apply the seam -carving algorithm published by Shai Avidan, Ariel Shamir, Seam Carving for -Content-Aware Resizing, ACM Transactions on Graphics, Volume 26, Number 3, SIGGRAPH -2007.") - -otb_module(OTBSeamCarving - DEPENDS - OTBPath - OTBCommon - OTBITK - - TEST_DEPENDS - OTBTestKernel - OTBImageBase - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Feature/SeamCarving/test/CMakeLists.txt b/Modules/Feature/SeamCarving/test/CMakeLists.txt deleted file mode 100644 index f8775d775c5a1ca807d63b5504e0a58401cae263..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/test/CMakeLists.txt +++ /dev/null @@ -1,32 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBSeamCarvingTests -otbSeamCarvingTestDriver.cxx -) - -add_executable(otbSeamCarvingTestDriver ${OTBSeamCarvingTests}) -target_link_libraries(otbSeamCarvingTestDriver ${OTBSeamCarving-Test_LIBRARIES}) -otb_module_target_label(otbSeamCarvingTestDriver) - -# Tests Declaration - diff --git a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx b/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx deleted file mode 100644 index fb60f6825789081e61c2b52bad4e851b9758170f..0000000000000000000000000000000000000000 --- a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ -} diff --git a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h b/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h deleted file mode 100644 index 6d8d3fb4e696f8ff9d426f83133276001766e4b6..0000000000000000000000000000000000000000 --- a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBinaryImageMinimalBoundingRegionCalculator_h -#define otbBinaryImageMinimalBoundingRegionCalculator_h - -#include "itkImageToImageFilter.h" -#include "itkObjectFactory.h" - -namespace otb -{ -/** - * \class BinaryImageMinimalBoundingRegionCalculator - * \brief This class compute the smallest region of the image - * containing every pixel with the foreground value. - * - * This class is used for instance in the RCC8 calculator filter, - * where the input region used for computation has to be the smallest possible - * for costs reasons. The Pad arg allows the user to get a region of pad pixel larger - * at each bound in case a security margin has to be kept. - * - * \sa ImageToImageRCC8Calculator - * - * \ingroup OTBImageManipulation - */ -template <class TInputImage> -class ITK_EXPORT BinaryImageMinimalBoundingRegionCalculator - : public itk::ImageToImageFilter<TInputImage, TInputImage> -{ -public: - /** Standard typedefs */ - typedef BinaryImageMinimalBoundingRegionCalculator Self; - typedef itk::ImageToImageFilter<TInputImage, TInputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(BinaryImageMinimalBoundingRegionCalculator, ImageToImageFilter); - - typedef TInputImage InputImageType; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::RegionType RegionType; - typedef typename InputImageType::Pointer InputImagePointerType; - /** Toogle the pad option */ - itkGetMacro(Region, RegionType); - itkSetMacro(InsideValue, PixelType); - itkGetMacro(InsideValue, PixelType); - itkSetMacro(Pad, unsigned int); - itkGetMacro(Pad, unsigned int); - -protected: - /** Constructor */ - BinaryImageMinimalBoundingRegionCalculator(); - /** Destructor */ - ~BinaryImageMinimalBoundingRegionCalculator() override {} - /** Main computation method */ - void GenerateData(void) override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; -private: - BinaryImageMinimalBoundingRegionCalculator(const Self &) = delete; - void operator =(const Self&) = delete; - /** The computed region */ - RegionType m_Region; - /** Toogle if pad wanted */ - unsigned int m_Pad; - /** Inside value */ - PixelType m_InsideValue; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbBinaryImageMinimalBoundingRegionCalculator.hxx" -#endif - -#endif diff --git a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx b/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx deleted file mode 100644 index cfe5d95b6b9d8099421302cab87764d99d84e8a3..0000000000000000000000000000000000000000 --- a/Modules/Filtering/ImageManipulation/include/otbBinaryImageMinimalBoundingRegionCalculator.hxx +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBinaryImageMinimalBoundingRegionCalculator_hxx -#define otbBinaryImageMinimalBoundingRegionCalculator_hxx - -#include "otbBinaryImageMinimalBoundingRegionCalculator.h" -#include "itkImageSliceConstIteratorWithIndex.h" -#include "otbMacro.h" - -namespace otb -{ -/* - * Constructor - */ -template <class TInputImage> -BinaryImageMinimalBoundingRegionCalculator<TInputImage> -::BinaryImageMinimalBoundingRegionCalculator() -{ - // The pad option is desactivated by default - m_Pad = 0; - // Set the default region - typename InputImageType::SizeType size; - typename InputImageType::IndexType index; - size[0] = 0; - size[1] = 0; - index[0] = 0; - index[1] = 0; - m_Region.SetSize(size); - m_Region.SetIndex(index); - m_InsideValue = static_cast<PixelType>(255); -} -/** - * Main computation method - */ -template <class TInputImage> -void -BinaryImageMinimalBoundingRegionCalculator<TInputImage> -::GenerateData(void) -{ - // Input images pointers - const InputImageType* image = this->GetInput(); - // Iterator definition - typedef itk::ImageSliceConstIteratorWithIndex<InputImageType> SliceIteratorType; - // Indexes containing upper-left and lower-right corner - typename InputImageType::IndexType min; - typename InputImageType::IndexType max; - min[0] = 0; - min[1] = 0; - max[1] = 0; - max[1] = 0; - for (unsigned int axis = 0; axis < InputImageType::ImageDimension; ++axis) - { // Create the forward iterator to find lower bound - SliceIteratorType fit(image, image->GetLargestPossibleRegion()); - - fit.SetFirstDirection(!axis); - fit.SetSecondDirection(axis); - fit.GoToBegin(); - - // Walk through the two images line by line - while (!fit.IsAtEnd()) - { - while (!fit.IsAtEndOfSlice()) - { - while (!fit.IsAtEndOfLine()) - { - // If a common intersection is found - if (fit.Get() == m_InsideValue) - { - // then the lower bound is found - min[axis] = fit.GetIndex()[axis]; - fit.GoToReverseBegin(); // skip to the end - break; - } - ++fit; - } - fit.NextLine(); - } - fit.NextSlice(); - } - // Create the reverse iterator to find upper bound - SliceIteratorType rit(image, image->GetLargestPossibleRegion()); - rit.SetFirstDirection(!axis); - rit.SetSecondDirection(axis); - rit.GoToReverseBegin(); - // Walk through the two images line by line - while (!rit.IsAtReverseEnd()) - { - while (!rit.IsAtReverseEndOfSlice()) - { - while (!rit.IsAtReverseEndOfLine()) - { - // If a common intersection is found - if (rit.Get() == m_InsideValue) - { - max[axis] = rit.GetIndex()[axis]; - rit.GoToBegin(); //Skip to reverse end - break; - } - --rit; - - } - rit.PreviousLine(); - - } - rit.PreviousSlice(); - } - } - - typename InputImageType::SizeType size; - typename InputImageType::IndexType index; - - for (unsigned int i = 0; i < InputImageType::ImageDimension; ++i) - { - size[i] = max[i] - min[i] + 1; - index[i] = min[i]; - } - - m_Region.SetIndex(index); - m_Region.SetSize(size); - - if (m_Pad) - { - m_Region.PadByRadius(m_Pad); - } - - m_Region.Crop(image->GetLargestPossibleRegion()); -} -/** - * PrintSelf method - */ -template <class TInputImage> -void -BinaryImageMinimalBoundingRegionCalculator<TInputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // End namespace otb - -#endif diff --git a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt index e8317ea3781b71aeff5124c768480cea1b8efd5c..53e76737f0b54cf6717ef348095b401642d630c8 100644 --- a/Modules/Filtering/ImageManipulation/test/CMakeLists.txt +++ b/Modules/Filtering/ImageManipulation/test/CMakeLists.txt @@ -51,7 +51,6 @@ otbVectorRescaleIntensityImageFilter.cxx otbLog10ThresholdedImageFilterTest.cxx otbExtractROIResample.cxx otbLocalGradientVectorImageFilter.cxx -otbBinaryImageMinimalBoundingRegionCalculator.cxx otbPerBandVectorImageFilterWithSobelFilter.cxx otbBinaryImageDensityFunction.cxx otbThresholdVectorImageFilter.cxx @@ -451,18 +450,6 @@ otb_add_test(NAME bfTvLocalGradientVectorImageFilter COMMAND otbImageManipulatio ${INPUTDATA}/cupriteSubHsi.tif ${TEMP}/bfTvLocalGradientVectorImageFilter.tif) -otb_add_test(NAME bfTvBoundingRegionCalculator COMMAND otbImageManipulationTestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/bfBoundingRegionCalculatorOutput.txt - ${TEMP}/bfBoundingRegionCalculatorOutput.txt - otbBinaryImageMinimalBoundingRegionCalculator - 4 - ${TEMP}/bfBoundingRegionCalculatorOutput.txt - ${INPUTDATA}/rcc8_mire1.png - ${INPUTDATA}/rcc8_mire2.png - ${INPUTDATA}/rcc8_mire3.png - ${INPUTDATA}/rcc8_mire4.png - ) otb_add_test(NAME bfTvPerBandVectorImageFilterWithSobelFilter COMMAND otbImageManipulationTestDriver --compare-image ${EPSILON_7} diff --git a/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx b/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx deleted file mode 100644 index 90d3167cbb890262026198319a4b781b9af99b73..0000000000000000000000000000000000000000 --- a/Modules/Filtering/ImageManipulation/test/otbBinaryImageMinimalBoundingRegionCalculator.cxx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbImage.h" -#include "otbBinaryImageMinimalBoundingRegionCalculator.h" -#include "otbImageFileReader.h" -#include "otbImageList.h" - -int otbBinaryImageMinimalBoundingRegionCalculator(int itkNotUsed(argc), char* argv[]) -{ - const unsigned int Dimension = 2; - - int nbImages = atoi(argv[1]); - char * outfile = argv[2]; - - typedef unsigned char PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::BinaryImageMinimalBoundingRegionCalculator<ImageType> - BoundingRegionCalculatorType; - typedef BoundingRegionCalculatorType::RegionType RegionType; - typedef otb::ImageList<ImageType> ImageListType; - typedef ImageListType::Iterator IteratorType; - // reference image list - ImageListType::Pointer images = ImageListType::New(); - - // Reading input images - std::ofstream out; - out.open(outfile, std::ios::out); - out << "Test results from otbBinaryImageBoundingRegionCalculator test." << std::endl; - for (int i = 1; i <= nbImages; ++i) - { - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[2 + i]); - reader->Update(); - images->PushBack(reader->GetOutput()); - } - - // Declaration - BoundingRegionCalculatorType::Pointer brct; - // Computing bounding region for each image - for (IteratorType it = images->Begin(); it != images->End(); ++it) - { - brct = BoundingRegionCalculatorType::New(); - brct->SetInput(it.Get()); - brct->Update(); - RegionType region = brct->GetRegion(); - out << region.GetIndex() << "\t" << region.GetSize() << std::endl; - } - out << std::endl << "Testing the pad option" << std::endl << std::endl; - for (IteratorType it = images->Begin(); it != images->End(); ++it) - { - brct = BoundingRegionCalculatorType::New(); - brct->SetPad(1); - brct->SetInput(it.Get()); - brct->Update(); - RegionType region = brct->GetRegion(); - out << region.GetIndex() << "\t" << region.GetSize() << std::endl; - } - - out.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx index 98efbed44de03307f9ab8818fc8dcd85d67110a9..0b24cab0e47dd8544329617ada28fc1433a2897a 100644 --- a/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx +++ b/Modules/Filtering/ImageManipulation/test/otbImageManipulationTestDriver.cxx @@ -51,7 +51,6 @@ void RegisterTests() REGISTER_TEST(otbLog10ThresholdedImageFilterTest); REGISTER_TEST(otbExtractROIResample); REGISTER_TEST(otbLocalGradientVectorImageFilterTest); - REGISTER_TEST(otbBinaryImageMinimalBoundingRegionCalculator); REGISTER_TEST(otbPerBandVectorImageFilterWithSobelFilter); REGISTER_TEST(otbBinaryImageDensityFunction); REGISTER_TEST(otbThresholdVectorImageFilterTest); diff --git a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h b/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h deleted file mode 100644 index f04fbd9892dcfbc7f378e0bdd6efce28e586f366..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.h +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbParserConditionDataNodeFeatureFunction_h -#define otbParserConditionDataNodeFeatureFunction_h - -#include "otbDataNodeImageFunction.h" -#include "otbPolyLineImageConstIterator.h" -#include "otbMaskMuParserFunctor.h" -#include <string> - -namespace otb -{ -/** \class ParserConditionDataNodeFeatureFunction - * \brief Compute a ParserCondition based feature alongside a - * datanode. - * - * This function evaluate a condition alongside a datanode. - * The descriptor is the percentage of pixels iterated for which - * the condition is true. - * - * \ingroup Functions - * \sa DataNodeImageFunction - * \sa SpectralAngleDataNodeFeatureFunction - * - * \ingroup OTBMathParser - */ - -template < -class TImage, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT ParserConditionDataNodeFeatureFunction : - public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> -{ -public: - /** Standard class typedefs. */ - typedef ParserConditionDataNodeFeatureFunction Self; - typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(ParserConditionDataNodeFeatureFunction, DataNodeImageFunction); - - /** Some typedefs. */ - typedef typename Superclass::DataNodeType DataNodeType; - typedef typename DataNodeType::LineType LineType; - - typedef TImage InputImageType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::InternalPixelType ScalarRealType; - typedef typename InputImageType::IndexType IndexType; - typedef typename InputImageType::IndexValueType IndexValueType; - - typedef TCoordRep CoordRepType; - - typedef TPrecision PrecisionType; - - typedef PolyLineImageConstIterator<InputImageType, LineType> - ImageLineIteratorType; - - typedef Functor::MaskMuParserFunctor<PixelType> ParserConditionFunctorType; - typedef typename ParserConditionFunctorType::Pointer ParserConditionFunctorPointer; - - typedef std::vector<PrecisionType> OutputType; - - OutputType Evaluate( const DataNodeType& node ) const override; - - std::string GetExpression() const - { - return m_ParserConditionFunctor->GetExpression(); - } - - void SetExpression(std::string expression) - { - m_ParserConditionFunctor->SetExpression(expression); - } - - void SetSpectralAngleReferencePixel(const PixelType& pixel) - { - m_ParserConditionFunctor->SetSpectralAngleReferencePixel(pixel); - } - -protected: - ParserConditionDataNodeFeatureFunction(); - ~ParserConditionDataNodeFeatureFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - ParserConditionDataNodeFeatureFunction(const Self&) = delete; - void operator=(const Self&) = delete; - - /** ParserCondition Functor */ - ParserConditionFunctorPointer m_ParserConditionFunctor; -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbParserConditionDataNodeFeatureFunction.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx b/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx deleted file mode 100644 index a32c38294f18b8a09a165f97bd7f347677813351..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MathParser/include/otbParserConditionDataNodeFeatureFunction.hxx +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbParserConditionDataNodeFeatureFunction_hxx -#define otbParserConditionDataNodeFeatureFunction_hxx - -#include "otbParserConditionDataNodeFeatureFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TImage, class TCoordRep, class TPrecision> -ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::ParserConditionDataNodeFeatureFunction() -{ - m_ParserConditionFunctor = ParserConditionFunctorType::New(); -} - -/** - * Standard "PrintSelf" method - */ -template <class TImage, class TCoordRep, class TPrecision> -void -ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::PrintSelf( std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf( os, indent ); - //os << indent << "ParserCondition : " << m_ParserConditionFunctor << std::endl; -} - -template <class TImage, class TCoordRep, class TPrecision> -typename ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::OutputType - ParserConditionDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::Evaluate( const DataNodeType& node ) const -{ - // The parser evaluation can't be const since the parser state - // changes at the first evaluation, but in fact we don't modify - // anything here. - // To fit with the rest of the framework, we try to keep the Evaluate - // function const - Self* _this = const_cast<Self*>(this); - ParserConditionFunctorType& parser = *(_this->m_ParserConditionFunctor); - // Ugly things over - - - const typename ImageLineIteratorType::PathType* path; - - switch (node.GetNodeType()) - { - case FEATURE_POINT: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - case FEATURE_LINE: - { - path = node.GetLine(); - break; - } - case FEATURE_POLYGON: - { - path = node.GetPolygonExteriorRing(); - break; - } - default: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - } - - ImageLineIteratorType lineIt(this->GetInputImage(), path); - lineIt.GoToBegin(); - - double nbValidPixel = 0.; - double nbVisitedPixel = 0.; - - while(!lineIt.IsAtEnd()) - { - if(this->IsInsideBuffer(lineIt.GetIndex())) - { - if( parser(this->GetInputImage()->GetPixel(lineIt.GetIndex())) ) - { - nbValidPixel += 1; - } - nbVisitedPixel += 1; - } - ++lineIt; - } - - OutputType output; - if(nbVisitedPixel == 0) - { - output.push_back(static_cast<PrecisionType>(0.)); - } - else - { - output.push_back(static_cast<PrecisionType>(nbValidPixel/nbVisitedPixel)); - } - - output.push_back(static_cast<PrecisionType>(nbValidPixel)); - output.push_back(static_cast<PrecisionType>(nbVisitedPixel)); - return output; -} - -} // end namespace otb - -#endif diff --git a/Modules/Filtering/MathParser/test/CMakeLists.txt b/Modules/Filtering/MathParser/test/CMakeLists.txt index 9f082865ac762f233a0383f097e990260d26203e..f2dbcdfd271d6eecd4f97d9e075847a7f49b85c3 100644 --- a/Modules/Filtering/MathParser/test/CMakeLists.txt +++ b/Modules/Filtering/MathParser/test/CMakeLists.txt @@ -23,7 +23,6 @@ otb_module_test() set(OTBMathParserTests otbMathParserTestDriver.cxx otbMaskMuParserFilterTest.cxx -otbParserConditionDataNodeFeatureFunction.cxx otbParserTest.cxx otbImageListToSingleImageFilterTest.cxx otbBandMathImageFilter.cxx @@ -48,32 +47,6 @@ otb_add_test(NAME bfTvMaskMuParserFilterTest COMMAND otbMathParserTestDriver "(b1>100)*(b2>120)" ) -otb_add_test(NAME bfTvParserConditionDataNodeFeatureFunction_Line_NDVI COMMAND otbMathParserTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp - ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Line_NDVI.shp - otbParserConditionDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Line_NDVI.shp - "ndvi(b3,b4) > 0.047" - 0 - ) - -otb_add_test(NAME bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI COMMAND otbMathParserTestDriver - --compare-ogr ${EPSILON_6} - ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp - ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI.shp - otbParserConditionDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvParserConditionDataNodeFeatureFunction_Polygon_NDVI.shp - "ndvi(b3,b4) > 0.047" - 0 - ) - otb_add_test(NAME coTvParser COMMAND otbMathParserTestDriver otbParserTest ) diff --git a/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx b/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx index 5ef579c49abbcd1d1a033f9c42ac09072d8aad97..4f12db6c962a985a8c7a0d92e2a449f28e8aef28 100644 --- a/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx +++ b/Modules/Filtering/MathParser/test/otbMathParserTestDriver.cxx @@ -23,7 +23,6 @@ void RegisterTests() { REGISTER_TEST(otbMaskMuParserFilterTest); - REGISTER_TEST(otbParserConditionDataNodeFeatureFunction); REGISTER_TEST(otbParserTest); REGISTER_TEST(otbImageListToSingleImageFilter); REGISTER_TEST(otbBandMathImageFilter); diff --git a/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx b/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx deleted file mode 100644 index 4982b50ced444f777c2ae95ef66d2990c174319a..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MathParser/test/otbParserConditionDataNodeFeatureFunction.cxx +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "otbParserConditionDataNodeFeatureFunction.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbVectorData.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataFileWriter.h" -#include "itkPreOrderTreeIterator.h" - - -int otbParserConditionDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputImg = argv[2]; - const char * DEMDir = argv[3]; - const char * outputVD = argv[4]; - const char * expression = argv[5]; - int DisplayWarnings = atoi(argv[6]); - - typedef double CoordRepType; - typedef double PrecisionType; - typedef otb::VectorImage<PrecisionType> ImageType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::VectorData<CoordRepType, 2, PrecisionType> VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> VectorDataReProjFilter; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> TreeIteratorType; - - typedef otb::ParserConditionDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType> - ParserConditionDataNodeFeaturefunctionType; - typedef ParserConditionDataNodeFeaturefunctionType::OutputType ParserConditionFeatureOutputType; - - ImageReaderType::Pointer imgReader = ImageReaderType::New(); - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - ParserConditionDataNodeFeaturefunctionType::Pointer - ParserConditionFeatureFunction = ParserConditionDataNodeFeaturefunctionType::New(); - - if (!DisplayWarnings) - { - imgReader->SetGlobalWarningDisplay(0); - } - - otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - imgReader->SetFileName(inputImg); - imgReader->UpdateOutputInformation(); - imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction - - vdReProjFilter->SetInputImage(imgReader->GetOutput()); - vdReProjFilter->SetInputVectorData(vdReader->GetOutput()); - vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true); - vdReProjFilter->Update(); - - ParserConditionFeatureFunction->SetExpression(expression); - ParserConditionFeatureFunction->SetInputImage(imgReader->GetOutput()); - - // Output - VectorDataType::Pointer outVD = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature()) - { - const DataNodeType::Pointer currentGeometry = itVector.Get(); - ParserConditionFeatureOutputType currentResult; - currentResult = ParserConditionFeatureFunction->Evaluate(*(currentGeometry.GetPointer())); - currentGeometry->SetFieldAsDouble("NDVI", (double) (currentResult[0])); - outVD->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - vdWriter->SetInput(outVD); - vdWriter->SetFileName(outputVD); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt b/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt deleted file mode 100644 index fdbf5b6d47d68fab8095ce62a22602de84cc7092..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBMorphologicalPyramid) -otb_module_impl() diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h deleted file mode 100644 index b74ea6f27e557e57d9f33e79217a4170cab9d26b..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.h +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidAnalysisFilter_h -#define otbMorphologicalPyramidAnalysisFilter_h - -#include "otbImageToImageListFilter.h" - -namespace otb -{ -/** \class MorphologicalPyramidAnalysisFilter - * \brief Multiscale analysis filter using the morphological pyramid algorithm. - * - * Pyramidal decomposition is based on the following statement : once an - * image has been smoothed with a linear filter, it does not contain - * any more high-frequency details. Therefore, it can be down-sampled - * without any loss of information, according to Shannon Theorem. By - * iterating the same smoothing on the down-sampled image, a - * multi-resolution decomposition of the scene is - * computed. If the smoothing filter is a morphological filter, this - * is no longer true, as the filter is not linear. However, by keeping - * the details possibly lost in the down-sampling operation, such a - * decomposition can be used. - * - * The MorphologicalPyramidAnalysisFilter provide such a - * decomposition. It's computation process is an iterative analyse - * involving smoothing by the morphological filter, computing the - * details lost in the smoothing, down-sampling the current image, and - * computing the details lost in the down-sampling. - * - * \ingroup MultiScale - * \sa MorphologicalPyramidSynthesisFilter, OpeningClosingMorphologicalFilter, - * ClosingOpeningMorphologicalFilter - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -class ITK_EXPORT MorphologicalPyramidAnalysisFilter - : public ImageToImageListFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef MorphologicalPyramidAnalysisFilter Self; - typedef ImageToImageListFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(MorphologicalPyramidAnalysisFilter, MorphologicalPyramidAnalysisFilter); - /** Input image dimension constant macro */ - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - /** Template parameters typedefs */ - typedef TMorphoFilter MorphoFilterType; - typedef typename MorphoFilterType::KernelType KernelType; - /** Output related typedefs */ - typedef typename Superclass::OutputImageType OutputImageType; - typedef typename Superclass::OutputImageListType OutputImageListType; - typedef typename OutputImageListType::Pointer OutputImageListPointerType; - typedef typename Superclass::OutputImagePointerType OutputImagePointerType; - /** Input related typedefs */ - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::InputImageRegionType InputImageRegionType; - typedef typename InputImageType::Pointer InputImagePointerType; - typedef typename InputImageType::ConstPointer InputImageConstPointerType; - typedef typename InputImageType::SizeType SizeType; - typedef typename InputImageType::ValueType ValueType; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::SpacingType SpacingType; - /** Accessors */ - itkSetMacro(NumberOfLevels, int); - itkSetMacro(DecimationRatio, double); - itkGetConstReferenceMacro(NumberOfLevels, int); - itkGetConstReferenceMacro(DecimationRatio, double); - /** - * Get The Analyse image at each level of the pyramid. - * \return The analysed image at each level of the pyramid. - */ - OutputImageListType* GetOutput(void) override; - /** - * Get The SupFilter details - * \return The brighter details extracted from the filtering operation. - */ - OutputImageListType * GetSupFilter(void); - /** - * Get The InfFilter details - * \return The darker details extracted from the filtering operation. - */ - OutputImageListType * GetInfFilter(void); - /** - * Get The SupDeci details - * \return The brighter details extracted from the resampling operation. - */ - OutputImageListType * GetSupDeci(void); - /** - * Get The InfDeci details - * \return The brighter details extracted from the resampling operation. - */ - OutputImageListType * GetInfDeci(void); - -protected: - /** Constructor */ - MorphologicalPyramidAnalysisFilter(); - /** Destructor */ - ~MorphologicalPyramidAnalysisFilter() override; - void GenerateOutputInformation() override {} // does nothing - /** Main computation method */ - void GenerateData() override; - /** Printself method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** Number of levels of the algorithm */ - int m_NumberOfLevels; - /** Subsampling scale used */ - double m_DecimationRatio; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidAnalysisFilter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx deleted file mode 100644 index efa6eb0b51ea324ee4742cf7f7cc0c912dc060d3..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidAnalysisFilter.hxx +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidAnalysisFilter_hxx -#define otbMorphologicalPyramidAnalysisFilter_hxx - -#include "otbMorphologicalPyramidAnalysisFilter.h" - -#include "itkSubtractImageFilter.h" -#include "itkMaximumImageFilter.h" -#include "itkImageDuplicator.h" -#include "otbMorphologicalPyramidResampler.h" -#include "itkProgressAccumulator.h" -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::MorphologicalPyramidAnalysisFilter() -{ - this->SetNumberOfRequiredOutputs(2); - m_DecimationRatio = 2.0; - m_NumberOfLevels = 4; - OutputImageListPointerType supFilter = OutputImageListType::New(); - this->SetNthOutput(0, supFilter.GetPointer()); - OutputImageListPointerType infFilter = OutputImageListType::New(); - this->SetNthOutput(1, infFilter.GetPointer()); - OutputImageListPointerType outputList = OutputImageListType::New(); - this->SetNthOutput(2, outputList.GetPointer()); - OutputImageListPointerType supDeci = OutputImageListType::New(); - this->SetNthOutput(3, supDeci.GetPointer()); - OutputImageListPointerType infDeci = OutputImageListType::New(); - this->SetNthOutput(4, infDeci.GetPointer()); -} -/** - * Destructor - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::~MorphologicalPyramidAnalysisFilter() {} -/** - * Get The Analyse image at each level of the pyramid. - * \return The analysed image at each level of the pyramid. - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::OutputImageListType* -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GetOutput(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(2)); -} -/** - * Get The SupFilter details - * \return The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::OutputImageListType* -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GetSupFilter(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(0)); -} -/** - * Get The InfFilter details - * \return The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::OutputImageListType* -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GetInfFilter(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(1)); -} -/** - * Get The SupDeci details - * \return The brighter details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::OutputImageListType* -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GetSupDeci(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(3)); -} -/** - * Get The InfDeci details - * \return The brighter details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -typename MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::OutputImageListType* -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GetInfDeci(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(4)); -} -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -void -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::GenerateData(void) -{ - // Input image pointer - OutputImageListType * OutputImageList = this->GetOutput(); - - // Output images pointers - OutputImageListType * supFilter = this->GetSupFilter(); - OutputImageListType * infFilter = this->GetInfFilter(); - OutputImageListType * supDeci = this->GetSupDeci(); - OutputImageListType * infDeci = this->GetInfDeci(); - - // typedefs of the filters - typedef itk::SubtractImageFilter<InputImageType, InputImageType, OutputImageType> SubtractFilterType; - typedef itk::MaximumImageFilter<InputImageType, InputImageType, InputImageType> MaxFilterType; - typedef itk::ImageDuplicator<InputImageType> DuplicatorType; - typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType> ResamplerType; - - // Input Image duplication to the currentImage Pointer - typename DuplicatorType::Pointer duplicator = DuplicatorType::New(); - duplicator->SetInputImage(this->GetInput()); - duplicator->Update(); - typename InputImageType::Pointer currentImage = duplicator->GetOutput(); - typename InputImageType::Pointer upsampled; - - // Structuring element size computation - const int structElementDimension = static_cast<int>(std::ceil(this->GetDecimationRatio() / 2.)); - - // Structuring element creation - KernelType structuringElement; - structuringElement.SetRadius(structElementDimension); - structuringElement.CreateStructuringElement(); - - // Filters declarations - typename MorphoFilterType::Pointer morphoFilter; - typename MaxFilterType::Pointer max; - typename SubtractFilterType::Pointer subtract1, subtract2, subtract3, subtract4; - typename ResamplerType::Pointer resampler1, resampler2; - - // Size declaration - typename InputImageType::SizeType size; - - // local variables declarations and initializations - int i = 0; - int sizeTmp; - //--------------------------------------------------------// - // Main loop // - //--------------------------------------------------------// - // While the number of iterations is not reached - otbMsgDevMacro(<< "Entering main loop"); - while (i < this->GetNumberOfLevels()) - { - - // morphological filtering - morphoFilter = MorphoFilterType::New(); - morphoFilter->SetKernel(structuringElement); - morphoFilter->SetInput(currentImage); - morphoFilter->Update(); - - // Maximum between current and filtered image - max = MaxFilterType::New(); - max->SetInput1(morphoFilter->GetOutput()); - max->SetInput2(currentImage); - max->Update(); - - // SupFilter detail image computation - subtract1 = SubtractFilterType::New(); - subtract1->SetInput1(max->GetOutput()); - subtract1->SetInput2(morphoFilter->GetOutput()); - subtract1->Update(); - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: subtract1 OK " << - subtract1->GetOutput()->GetLargestPossibleRegion().GetSize()); - supFilter->PushBack(subtract1->GetOutput()); - otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to SupFilter"); - - // InfFilter detail image computation - subtract2 = SubtractFilterType::New(); - subtract2->SetInput1(max->GetOutput()); - subtract2->SetInput2(currentImage); - subtract2->Update(); - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: subtract2 OK " << - subtract2->GetOutput()->GetLargestPossibleRegion().GetSize()); - infFilter->PushBack(subtract2->GetOutput()); - otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to InfFilter"); - - // New Size - size = morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize(); - for (unsigned int j = 0; j < InputImageType::ImageDimension; ++j) - { - sizeTmp = size[j]; - // As we knwow that our values will always be positive ones, we can simulate round by ceil(value+0.5) - size[j] = static_cast<unsigned int>(std::ceil((static_cast<double>(sizeTmp) / this->GetDecimationRatio()) + 0.5)); - } - otbMsgDevMacro(<< "New size: " << size); - - // Image subsampling - // Current image becomes the newly subsampled image - resampler1 = ResamplerType::New(); - resampler1->SetInput(morphoFilter->GetOutput()); - resampler1->SetSize(size); - resampler1->Update(); - currentImage = resampler1->GetOutput(); - - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: DownSampling OK " << currentImage->GetLargestPossibleRegion().GetSize()); - // New current image is appended to the output list - OutputImageList->PushBack(currentImage); - - // Image upsampling - resampler2 = ResamplerType::New(); - resampler2->SetInput(resampler1->GetOutput()); - resampler2->SetSize(morphoFilter->GetOutput()->GetLargestPossibleRegion().GetSize()); - resampler2->Update(); - - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: UpSampling OK " << - resampler2->GetOutput()->GetLargestPossibleRegion().GetSize()); - // Computation of the details lost in the subsampling operation - max = MaxFilterType::New(); - max->SetInput1(morphoFilter->GetOutput()); - max->SetInput2(resampler2->GetOutput()); - max->Update(); - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: Max OK " << max->GetOutput()->GetLargestPossibleRegion().GetSize()); - - // InfDeci detail image computation - subtract4 = SubtractFilterType::New(); - subtract4->SetInput1(max->GetOutput()); - subtract4->SetInput2(morphoFilter->GetOutput()); - subtract4->Update(); - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: subtract4 OK " << - subtract4->GetOutput()->GetLargestPossibleRegion().GetSize()); - infDeci->PushBack(subtract4->GetOutput()); - otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to InfDeci"); - - // SupDeci detail image computation - subtract3 = SubtractFilterType::New(); - subtract3->SetInput1(max->GetOutput()); - subtract3->SetInput2(resampler2->GetOutput()); - subtract3->Update(); - otbMsgDevMacro( - << "MorphologicalPyramidAnalysisFilter: subtract3 OK " << - subtract3->GetOutput()->GetLargestPossibleRegion().GetSize()); - supDeci->PushBack(subtract3->GetOutput()); - otbMsgDevMacro("MorphologicalPyramidAnalysisFilter: step " << i << " - Image appended to SupDeci"); - - // Iteration ounter incrementation - ++i; - } - otbMsgDevMacro(<< "Exiting main loop"); -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage, class TMorphoFilter> -void -MorphologicalPyramidAnalysisFilter<TInputImage, TOutputImage, TMorphoFilter> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "DecimationRatio: " << m_DecimationRatio << std::endl; - os << indent << "NumberOfLevels: " << m_NumberOfLevels << std::endl; -} -} // End namespace otb -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h deleted file mode 100644 index 65768b624caba0047b54cb4ced32745a59326cca..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.h +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidMRToMSConverter_h -#define otbMorphologicalPyramidMRToMSConverter_h - -#include "otbImageListToImageListFilter.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * \class MRToMSConverter - * \brief This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one. - * - * This class convert a multi resolution decomposition from the morphological pyramid to a multi-scale one. - * - * The operation consists in iterativly upsampling and adding decimation details to a given detail image. - * - * \sa MorphologicalPyramidAnalyseFilter - * \sa MorphologicalPyramidSynthesisFilter - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage> -class ITK_EXPORT MRToMSConverter - : public ImageListToImageListFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef MRToMSConverter Self; - typedef ImageListToImageListFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(MRToMSConverter, ImageListToImageListFilter); - /** Input parameters typedefs */ - typedef TInputImage InputImageType; - typedef typename Superclass::InputImagePointer InputImagePointer; - typedef typename Superclass::InputImageListType InputImageListType; - typedef typename Superclass::InputImageListPointerType InputImageListPointerType; - typedef typename InputImageListType::Iterator InputImageListIteratorType; - /** Output parameters typedefs */ - typedef TOutputImage OutputImageType; - typedef typename Superclass::OutputImagePointer OutputImagePointerType; - typedef typename Superclass::OutputImageListType OutputImageListType; - typedef typename Superclass::OutputImageListPointerType OutputImageListPointerType; - - /** - * Set The input list. - * \param imageList The analysed image at each level of the pyramid. - */ - using Superclass::SetInput; - void SetInput(const InputImageListType * imageList) override; - /** - * Set The SupFilter details - * \param imageList The brighter details extracted from the filtering operation. - */ - void SetSupFilter(InputImageListType * imageList); - /** - * Set The InfFilter details - * \param imageList The darker details extracted from the filtering operation. - */ - void SetInfFilter(InputImageListType * imageList); - /** - * Set The SupDeci details - * \param imageList The brighter details extracted from the filtering operation. - */ - void SetSupDeci(InputImageListType * imageList); - /** - * Set The InfDeci details - * \param imageList The darker details extracted from the filtering operation. - */ - void SetInfDeci(InputImageListType * imageList); - /** - * Get the input list. - * \return The list of the analysed image at each pyramid level. - */ - InputImageListType* GetInput(void) override; - /** - * Get The SupFilter details - * \return The brighter details extracted from the filtering operation. - */ - InputImageListType* GetSupFilter(void); - /** - * Get The InfFilter details - * \return The darker details extracted from the filtering operation. - */ - InputImageListType* GetInfFilter(void); - /** - * Get The SupDeci details - * \return The brighter details extracted from the resampling operation. - */ - InputImageListType* GetSupDeci(void); - /** - * Get The InfDeci details - * \return The brighter details extracted from the resampling operation. - */ - InputImageListType* GetInfDeci(void); - /** - * Get The inputList at full resolution. - * \return The analysed image at each pyramid level - * resampled at full resolution. - */ - OutputImageListType* GetOutput(void) override; - /** - * Get The SupFilter details at full resolution. - * \return The brighter details extracted from the filtering operation - * resampled at full resolution. - */ - OutputImageListType * GetSupFilterFullResolution(void); - /** - * Get The InfFilter details at full resolution. - * \return The darker details extracted from the filtering operation - * resampled at full resolution. - */ - OutputImageListType * GetInfFilterFullResolution(void); - /** - * Get The SupDeci details at full resolution. - * \return The brighter details extracted from the resampling operation - * resampled at full resolution. - */ - OutputImageListType * GetSupDeciFullResolution(void); - /** - * Get The InfDeci details at full resolution. - * \return The darker details extracted from the resampling operation - * resampled at full resolution. - */ - OutputImageListType * GetInfDeciFullResolution(void); - -protected: - /** Constructor */ - MRToMSConverter(); - /** Destructor */ - ~MRToMSConverter() override {} - - /** Main computation method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - MRToMSConverter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace MorphologicalPyramid -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidMRToMSConverter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx deleted file mode 100644 index 51f9ff57e667d987d420a3a02d2c8a120da27e46..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidMRToMSConverter.hxx +++ /dev/null @@ -1,359 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidMRToMSConverter_hxx -#define otbMorphologicalPyramidMRToMSConverter_hxx - -#include "otbMorphologicalPyramidMRToMSConverter.h" -#include "otbMorphologicalPyramidResampler.h" -#include "otbMacro.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage> -MRToMSConverter<TInputImage, TOutputImage> -::MRToMSConverter() -{ - this->SetNumberOfRequiredInputs(2); - this->SetNumberOfRequiredOutputs(2); - OutputImageListPointerType supFilter = OutputImageListType::New(); - this->SetNthOutput(0, supFilter.GetPointer()); - OutputImageListPointerType infFilter = OutputImageListType::New(); - this->SetNthOutput(1, infFilter.GetPointer()); - OutputImageListPointerType outputList = OutputImageListType::New(); - this->SetNthOutput(2, outputList.GetPointer()); - OutputImageListPointerType supDeci = OutputImageListType::New(); - this->SetNthOutput(3, supDeci.GetPointer()); - OutputImageListPointerType infDeci = OutputImageListType::New(); - this->SetNthOutput(4, infDeci.GetPointer()); -} -/** - * Get The inputList at full resolution. - * \return The analysed image at each pyramid level - * resampled at full resolution. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::OutputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetOutput(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(2)); -} -/** - * Get The SupFilter details at full resolution. - * \return The brighter details extracted from the filtering operation. - * resampled at full resolution. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::OutputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetSupFilterFullResolution(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(0)); -} -/** - * Get The InfFilter details at full resolution. - * \return The darker details extracted from the filtering operation. - * resampled at full resolution. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::OutputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetInfFilterFullResolution(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(1)); -} -/** - * Get The SupDeci details at full resolution. - * \return The brighter details extracted from the resampling operation. - * resampled at full resolution. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::OutputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetSupDeciFullResolution(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(3)); -} -/** - * Get The InfDeci details at full resolution. - * \return The brighter details extracted from the resampling operation. - * resampled at full resolution. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::OutputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetInfDeciFullResolution(void) -{ - return dynamic_cast<OutputImageListType*>(this->itk::ProcessObject::GetOutput(4)); -} -/** - * Set The input list. - * \param imageList The analysed image at each level of the pyramid. - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::SetInput(const InputImageListType * imageList) -{ - this->SetNthInput(2, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The SupFilter details - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::SetSupFilter(InputImageListType * imageList) -{ - this->SetNthInput(0, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The InfFilter details - * \param imageList The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::SetInfFilter(InputImageListType * imageList) -{ - this->SetNthInput(1, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The SupDeci details - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::SetSupDeci(InputImageListType * imageList) -{ - this->SetNthInput(3, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The InfDeci details - * \param imageList The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::SetInfDeci(InputImageListType * imageList) -{ - this->SetNthInput(4, const_cast<InputImageListType *>(imageList)); -} -/** - * Get the input list. - * \return The list of the analysed image at each pyramid level. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::InputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetInput(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2)); -} -/** - * Get The SupFilter details. - * \return The brighter details extracted from the filtering operation - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::InputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetSupFilter(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(0)); -} -/** - * Get The InfFilter details. - * \return The darker details extracted from the filtering operation - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::InputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetInfFilter(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1)); -} -/** - * Get The SupDeci details. - * \return The brighter details extracted from the resampling operation - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::InputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetSupDeci(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(3)); -} -/** - * Get The InfDeci details. - * \return The darker details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage> -typename MRToMSConverter<TInputImage, TOutputImage> -::InputImageListType* -MRToMSConverter<TInputImage, TOutputImage> -::GetInfDeci(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(4)); -} -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::GenerateData() -{ - // Input images lists pointers - InputImageListPointerType supFilter = this->GetSupFilter(); - InputImageListPointerType infFilter = this->GetInfFilter(); - InputImageListPointerType supDeci = this->GetSupDeci(); - InputImageListPointerType infDeci = this->GetInfDeci(); - InputImageListPointerType inputList = this->GetInput(); - - // Output images lists pointers - OutputImageListPointerType supFilterFullResolution = this->GetSupFilterFullResolution(); - OutputImageListPointerType infFilterFullResolution = this->GetInfFilterFullResolution(); - OutputImageListPointerType supDeciFullResolution = this->GetSupDeciFullResolution(); - OutputImageListPointerType infDeciFullResolution = this->GetInfDeciFullResolution(); - OutputImageListPointerType outputList = this->GetOutput(); - - // typedef of the resampling filter - typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType> ResamplerType; - - // Definition of the resampler filters - typename ResamplerType::Pointer resampler; - - // Full resolution size - typename InputImageType::SizeType frsize = supFilter->Front()->GetLargestPossibleRegion().GetSize(); - otbMsgDevMacro(<< "MRToMSConverter: Full resolution size: " << frsize); - - // SupFilter resampling - otbMsgDevMacro(<< "MRToMSConverter: SupFilter resampling."); - InputImageListIteratorType it = supFilter->Begin(); - // The first image does not need any resampling - supFilterFullResolution->PushBack(it.Get()); - ++it; - for (; it != supFilter->End(); ++it) - { - resampler = ResamplerType::New(); - resampler->SetSize(frsize); - resampler->SetInput(it.Get()); - resampler->Update(); - supFilterFullResolution->PushBack(resampler->GetOutput()); - } - otbMsgDevMacro(<< "MRToMSConverter: InfFilter resampling."); - // InfFilter resampling - it = infFilter->Begin(); - // The first image does not need any resampling - infFilterFullResolution->PushBack(it.Get()); - ++it; - for (; it != infFilter->End(); ++it) - { - resampler = ResamplerType::New(); - resampler->SetSize(frsize); - resampler->SetInput(it.Get()); - resampler->Update(); - infFilterFullResolution->PushBack(resampler->GetOutput()); - } - - if (inputList) - { - otbMsgDevMacro(<< "MRToMSConverter: Optional inputList resampling."); - // Analyse image resampling - it = inputList->Begin(); - // The first image does not need any resampling - outputList->PushBack(it.Get()); - ++it; - for (; it != inputList->End(); ++it) - { - resampler = ResamplerType::New(); - resampler->SetSize(frsize); - resampler->SetInput(it.Get()); - resampler->Update(); - outputList->PushBack(resampler->GetOutput()); - } - } - - if (supDeci) - { - otbMsgDevMacro(<< "MRToMSConverter: Optional supDeci resampling."); - // SupDeci resampling - it = supDeci->Begin(); - // The first image does not need any resampling - supDeciFullResolution->PushBack(it.Get()); - ++it; - for (; it != supDeci->End(); ++it) - { - resampler = ResamplerType::New(); - resampler->SetSize(frsize); - resampler->SetInput(it.Get()); - resampler->Update(); - supDeciFullResolution->PushBack(resampler->GetOutput()); - } - } - - if (infDeci) - { - otbMsgDevMacro(<< "MRToMSConverter: Optional infDeci resampling."); - // InfDeci resampling - it = infDeci->Begin(); - // The first image does not need any resampling - infDeciFullResolution->PushBack(it.Get()); - ++it; - for (; it != infDeci->End(); ++it) - { - resampler = ResamplerType::New(); - resampler->SetSize(frsize); - resampler->SetInput(it.Get()); - resampler->Update(); - infDeciFullResolution->PushBack(resampler->GetOutput()); - } - } -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage> -void -MRToMSConverter<TInputImage, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace MorphologicalPyramid -} // End namespace otb -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h deleted file mode 100644 index 7ce6013ba36c5a2a8b28627f6135a13ea942abfa..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.h +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidResampler_h -#define otbMorphologicalPyramidResampler_h - -#include "itkImageToImageFilter.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * \class Resampler - * \brief This class performs the resampling of the given image to the given size. - * - * This class performs the resampling of the given image to the given size.It is used - * in the MorphologicalPyramidAnalyseFilter and MorphologicalPyramidSynthesisFilter. - * - * The resampling is done by the itk::ResampleImageFilter, templated with the interpolator - * itk::LinearInterpolateImageFunction and the transform itk::ScaleTransform. - * - * \sa MorphologicalPyramidAnalyseFilter - * \sa MorphologicalPyramidSynthesisFilter - * \sa ResampleImageFilter - * \sa LinearInterpolateImageFunction - * \sa ScaleTransform - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage> -class ITK_EXPORT Resampler - : public itk::ImageToImageFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef Resampler Self; - typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(Resampler, ImageToImageFilter); - /** Template parameters typedefs */ - typedef TInputImage InputImageType; - typedef TOutputImage OutputImageType; - typedef typename OutputImageType::Pointer OutputImagePointer; - typedef typename InputImageType::Pointer InputImagePointer; - typedef typename OutputImageType::RegionType OutputImageRegionType; - typedef typename TInputImage::PixelType PixelType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename OutputImageType::SizeType SizeType; - typedef typename OutputImageType::SpacingType SpacingType; - /** Size parameter accessor */ - itkSetMacro(Size, SizeType); - itkGetMacro(Size, SizeType); - -protected: - /** Constructor */ - Resampler(); - /** Destructor */ - ~Resampler() override {} - /** Generate output information */ - void GenerateOutputInformation() override; - /** Configure input requested region to be the largest possible region */ - void GenerateInputRequestedRegion() override; - /** Configure output requested region to be the largest possible region */ - void EnlargeOutputRequestedRegion(itk::DataObject * itkNotUsed(output)) override; - /** Main computation method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; -private: - Resampler(const Self &) = delete; - void operator =(const Self&) = delete; - /// Output image size - SizeType m_Size; -}; -} // End namespace MorphologicalPyramid -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidResampler.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx deleted file mode 100644 index 97cbf4a3c122c794ba8e2b735c49ff8ca3f64d79..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidResampler.hxx +++ /dev/null @@ -1,183 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidResampler_hxx -#define otbMorphologicalPyramidResampler_hxx -#include "otbMorphologicalPyramidResampler.h" -#include "itkResampleImageFilter.h" -#include "itkScalableAffineTransform.h" -#include "itkNearestNeighborInterpolateImageFunction.h" -#include "itkProgressAccumulator.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage> -Resampler<TInputImage, TOutputImage> -::Resampler() -{ - for (unsigned int i = 0; i < InputImageType::ImageDimension; ++i) - { - m_Size[i] = 0; - } -} -/** - * Configure input requested region to be the largest possible region. - */ -template <class TInputImage, class TOutputImage> -void -Resampler<TInputImage, TOutputImage> -::GenerateInputRequestedRegion() -{ - // Superclass method call - Superclass::GenerateInputRequestedRegion(); - // Input and output image pointers retrieval - InputImagePointer inputPtr = const_cast<InputImageType *> (this->GetInput()); - OutputImagePointer outputPtr = this->GetOutput(); - // If the pointers are not correct - if (!inputPtr || !outputPtr) - { - // exit - return; - } - // else - // Configure input requested region to be the largest possible region - inputPtr->SetRequestedRegion(inputPtr->GetLargestPossibleRegion()); -} -/** - * Configure output requested region to be the largest possible region - */ -template <class TInputImage, class TOutputImage> -void -Resampler<TInputImage, TOutputImage> -::EnlargeOutputRequestedRegion(itk::DataObject *itkNotUsed(output)) -{ - this->GetOutput()->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion()); -} -/** - * Generate output information - */ -template <class TInputImage, class TOutputImage> -void -Resampler<TInputImage, TOutputImage> -::GenerateOutputInformation() -{ - // Superclass method call - Superclass::GenerateOutputInformation(); - // Input and output image pointers retrieval - InputImageConstPointer inputPtr = this->GetInput(); - OutputImagePointer outputPtr = this->GetOutput(); - // If the pointers are not correct - if (!inputPtr || !outputPtr) - { - // exit - return; - } - unsigned int i; - // Computing output spacing, size and index from input data - const typename InputImageType::SpacingType& inputSpacing = inputPtr->GetSignedSpacing(); - const typename InputImageType::IndexType& inputStartIndex = inputPtr->GetLargestPossibleRegion().GetIndex(); - typename OutputImageType::IndexType outputStartIndex; - typename OutputImageType::SpacingType spacing; - for (i = 0; i < OutputImageType::ImageDimension; ++i) - { - outputStartIndex[i] = inputStartIndex[i]; - } - - outputPtr->SetSignedSpacing(inputSpacing); - typename OutputImageType::RegionType outputLargestPossibleRegion; - outputLargestPossibleRegion.SetSize(this->GetSize()); - outputLargestPossibleRegion.SetIndex(outputStartIndex); - outputPtr->SetLargestPossibleRegion(outputLargestPossibleRegion); -} -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage> -void -Resampler<TInputImage, TOutputImage> -::GenerateData() -{ - typename OutputImageType::Pointer result; - - // Filters typedefs - typedef itk::ResampleImageFilter<InputImageType, OutputImageType> ResampleFilterType; - typedef itk::ScalableAffineTransform<double, InputImageType::ImageDimension> TransformType; - typedef itk::LinearInterpolateImageFunction<InputImageType, double> InterpolatorType; - - // Resampling filter creation - typename ResampleFilterType::Pointer resampler = ResampleFilterType::New(); - typename InterpolatorType::Pointer interpolator = InterpolatorType::New(); - typename TransformType::Pointer transform = TransformType::New(); - - // Scale parameters computation - typename TransformType::InputVectorType scales; - typename InputImageType::SizeType inputSize = this->GetInput()->GetLargestPossibleRegion().GetSize(); - typename InputImageType::SpacingType inputSpacing = this->GetInput()->GetSignedSpacing(); - scales[0] = static_cast<double>(inputSize[0]) / static_cast<double>(m_Size[0]); - scales[1] = static_cast<double>(inputSize[1]) / static_cast<double>(m_Size[1]); - transform->SetScale(scales); - transform->SetCenter(this->GetInput()->GetOrigin()); - typename TransformType::OutputVectorType translation; - translation[0] = 0.5 * inputSpacing[0] * (scales[0] - 1.0); - translation[1] = 0.5 * inputSpacing[1] * (scales[1] - 1.0); - transform->SetTranslation(translation); - - - // Resampling filter set up - resampler->SetTransform(transform); - resampler->SetInterpolator(interpolator); - resampler->SetOutputOrigin(this->GetInput()->GetOrigin()); - resampler->SetSize(this->GetSize()); - resampler->SetOutputSpacing( this->GetInput()->GetSpacing() ); - resampler->SetOutputDirection( this->GetInput()->GetDirection() ); - resampler->ReleaseDataFlagOn(); - - // Progress accumulator - itk::ProgressAccumulator::Pointer progress = itk::ProgressAccumulator::New(); - progress->SetMiniPipelineFilter(this); - progress->RegisterInternalFilter(resampler, .5f); - - // Input image connexion - resampler->SetInput(this->GetInput()); - resampler->Update(); - result = resampler->GetOutput(); - - /** Output filter connexion */ - this->GraftOutput(result); -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage> -void -Resampler<TInputImage, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Size: " << m_Size << std::endl; -} -} // End namespace MorphologicalPyramid -} // End namespace otb -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h deleted file mode 100644 index ea999b2a6d399ac17c860be768c528f5166feff2..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.h +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSegmentationFilter_h -#define otbMorphologicalPyramidSegmentationFilter_h - -#include "otbImageListToImageListFilter.h" -namespace otb -{ -/** \class MorphologicalPyramidSegmentationFilter - * \brief This filter performs a segmentation of the details supFilter and infFilter extracted - * with the morphological pyramid. - * - * The first step is to convert the multi-resolution analysis from the pyramid to a multi-scale one using the - * MRToMSConverter filter. - * - * The segmentation algorithm used is based on seeds extraction using the ImageToPointSetFilter, followed by - * a connected threshold segmentation using the ConnectedThresholdImageFilter. A final relabelling step is done - * with the LabelImageFilter and RelabelImageFilter to remove object whose sizes are to small regarding the - * MinimumObjectSize parameter. The threshold for seeds extraction and segmentation are computed using quantiles. - * - * A pre processing step is applied by multiplying the full resolution brighter details (resp. darker details) - * with the original image (resp. the inverted original image). This performs an enhancement of the regions contour - * precision. - * - * The details from the pyramid are set via the SetBrighterDetails() and SetDarkerDetails() methods. The brighter and - * darker details depends on the filter used in the pyramid analysis. If the OpeningClosing filter is used, then the - * brighter details are those from the supFilter image list, whereas if the ClosingOpening filter is used, the brighter - * details are those from the infFilter list. - * - * The output of the segmentation filter is a single segmentation images list, containing first the brighter details - * segmentation from higher scale to lower, and then the darker details in the same order. The attention of the used - * is drawn to the fact that since the label filter used internally will deal with a large number of labels, so the - * OutputPixelType is required to be sufficiently precise. Unsigned short or Unsigned long would be a good choice, - * unless the user has a very good reason to think that a less precise type will be sufficient. - * - * \ingroup MultiScale - * \sa MorphologicalPyramidSynthesisFilter, OpeningClosingMorphologicalFilter, - * ClosingOpeningMorphologicalFilter, Segmenter, MRToMSConverter, Resampler - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage> -class ITK_EXPORT MorphologicalPyramidSegmentationFilter - : public ImageListToImageListFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef MorphologicalPyramidSegmentationFilter Self; - typedef ImageListToImageListFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(MorphologicalPyramidSegmentationFilter, ImageListToImageListFilter); - /** Input image dimension constant macro */ - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - /** Output related typedefs */ - typedef typename Superclass::OutputImageType OutputImageType; - typedef typename OutputImageType::PixelType OutputPixelType; - typedef typename Superclass::OutputImageListType OutputImageListType; - typedef typename OutputImageListType::Pointer OutputImageListPointerType; - typedef typename Superclass::OutputImagePointerType OutputImagePointerType; - typedef typename OutputImageListType::Iterator OutputImageListIteratorType; - /** Input related typedefs */ - typedef typename Superclass::InputImageType InputImageType; - typedef typename InputImageType::PixelType InputPixelType; - typedef typename InputImageType::Pointer InputImagePointerType; - typedef typename Superclass::InputImageListType InputImageListType; - typedef typename InputImageListType::Pointer InputImageListPointerType; - /** Vector of number of objects */ - typedef std::vector<OutputPixelType> NumberOfObjectsVectorType; - /** Min object size parameter accessor */ - itkSetMacro(MinimumObjectSize, unsigned long); - itkGetMacro(MinimumObjectSize, unsigned long); - /** Quantile for seeds extraction */ - itkSetMacro(SeedsQuantile, double); - itkGetMacro(SeedsQuantile, double); - /** Quantile for connected thresholding */ - itkSetMacro(ConnectedThresholdQuantile, double); - itkGetMacro(ConnectedThresholdQuantile, double); - /** - * Get a vector containing the number of segmented objects for each image. - * \return The vector. - */ - NumberOfObjectsVectorType GetNumberOfObjectsVector(void); - /** - * Set the reference image. - * \param image The reference image which was decomposed by the pyramid. - */ - void SetReferenceImage(InputImageType * image); - /** - * Set the brighter details from the pyramid. The brighter details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \param imageList The brighter details extracted from the filtering operation. - */ - void SetBrighterDetails(InputImageListType * imageList); - /** - * Set the darker details from the pyramid. The darker details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \param imageList The darker details extracted from the filtering operation. - */ - void SetDarkerDetails(InputImageListType * imageList); - /** - * Get the reference image - * \return The reference image. - */ - InputImageType* GetReferenceImage(void); - /** - * Get the brighter details from the pyramid. The brighter details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \return The brighter details extracted from the resampling operation. - */ - InputImageListType* GetBrighterDetails(void); - /** - * Get the darker details from the pyramid. The darker details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \return The darker details extracted from the resampling operation. - */ - InputImageListType *GetDarkerDetails(void); - -protected: - /** Constructor */ - MorphologicalPyramidSegmentationFilter(); - /** Destructor */ - ~MorphologicalPyramidSegmentationFilter() override; - void GenerateOutputInformation() override {} // does nothing - /** Main computation method */ - void GenerateData() override; - /** Printself method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; -private: - unsigned long m_MinimumObjectSize; - /** Quantile for seeds determination */ - double m_SeedsQuantile; - /** Quantile to set the connectedThresholdFilter threshold */ - double m_ConnectedThresholdQuantile; - /** Number of segmented objects per images */ - NumberOfObjectsVectorType m_NumberOfObjectsVector; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidSegmentationFilter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx deleted file mode 100644 index eab84021facc5864d3204878b836da3088359f84..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmentationFilter.hxx +++ /dev/null @@ -1,212 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSegmentationFilter_hxx -#define otbMorphologicalPyramidSegmentationFilter_hxx - -#include "otbMorphologicalPyramidSegmentationFilter.h" - -#include "otbMorphologicalPyramidMRToMSConverter.h" -#include "otbMorphologicalPyramidSegmenter.h" -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage> -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::MorphologicalPyramidSegmentationFilter() -{ - this->SetNumberOfRequiredInputs(3); - m_MinimumObjectSize = 10; - m_SeedsQuantile = 0.9; - m_ConnectedThresholdQuantile = 0.9; -} -/** - * Destructor - */ -template <class TInputImage, class TOutputImage> -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::~MorphologicalPyramidSegmentationFilter() {} - -/** - * Set the reference image. - * \param image The reference image which was decomposed by the pyramid. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::SetReferenceImage(InputImageType * image) -{ - this->SetNthInput(0, const_cast<InputImageType *>(image)); -} -/** - * Set the brighter details from the pyramid. The brighter details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::SetBrighterDetails(InputImageListType * imageList) -{ - this->SetNthInput(1, const_cast<InputImageListType *>(imageList)); -} -/** - * Set the darker details from the pyramid. The darker details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \param imageList The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::SetDarkerDetails(InputImageListType * imageList) -{ - this->SetNthInput(2, const_cast<InputImageListType *>(imageList)); -} -/** - * Get the reference image - * \return The reference image. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::InputImageType* -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::GetReferenceImage(void) -{ - return dynamic_cast<InputImageType *>(this->itk::ProcessObject::GetInput(0)); -} -/** - * Get the brighter details from the pyramid. The brighter details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::GetBrighterDetails(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1)); -} -/** - * Get the darker details from the pyramid. The darker details are the supFilter or - * infFilter details from the pyramid, depending on the morphological filter used. - * \return The darker details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::GetDarkerDetails(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2)); -} - -/** - * Get a vector containing the number of segmented objects for each image. - * \return The vector. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::NumberOfObjectsVectorType -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::GetNumberOfObjectsVector(void) -{ - return m_NumberOfObjectsVector; -} -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::GenerateData(void) -{ - // Reference image pointer - InputImagePointerType referenceImage = this->GetReferenceImage(); - otbMsgDevMacro("SegmentationFilter: reference image size: " << referenceImage->GetLargestPossibleRegion().GetSize()); - - // Output images list pointer - OutputImageListPointerType outputList = this->GetOutput(); - - // Multi resolution to multi scale filter typedef - typedef otb::MorphologicalPyramid::MRToMSConverter<InputImageType, InputImageType> MRToMSConverterType; - - // Segmentation filter typedef - typedef otb::MorphologicalPyramid::Segmenter<InputImageType, OutputImageType> SegmenterType; - - // MR To MS conversion - typename MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New(); - mrtoms->SetSupFilter(this->GetBrighterDetails()); - mrtoms->SetInfFilter(this->GetDarkerDetails()); - mrtoms->Update(); - - // Full resolution Input images lists pointers - InputImageListPointerType brighter = mrtoms->GetSupFilterFullResolution(); - InputImageListPointerType darker = mrtoms->GetInfFilterFullResolution(); - - // Segmentation filter definition - typename InputImageListType::Iterator it; - // Segment the supFilter details - for (it = brighter->Begin(); it != brighter->End(); ++it) - { - typename SegmenterType::Pointer segmenter = SegmenterType::New(); - segmenter->SetMinimumObjectSize(m_MinimumObjectSize); - segmenter->SetSeedsQuantile(m_SeedsQuantile); - segmenter->SetConnectedThresholdQuantile(m_ConnectedThresholdQuantile); - segmenter->SetOriginalImage(referenceImage); - segmenter->SetDetailsImage(it.Get()); - segmenter->Update(); - m_NumberOfObjectsVector.push_back(segmenter->GetNumberOfObjects()); - outputList->PushBack(segmenter->GetOutput()); - } - - // Segment the infFilter details - for (it = darker->Begin(); it != darker->End(); ++it) - { - typename SegmenterType::Pointer segmenter = SegmenterType::New(); - segmenter->SetMinimumObjectSize(m_MinimumObjectSize); - segmenter->SetSeedsQuantile(m_SeedsQuantile); - segmenter->SetConnectedThresholdQuantile(m_ConnectedThresholdQuantile); - segmenter->SetOriginalImage(referenceImage); - segmenter->SetSegmentDarkDetailsBool(true); - - segmenter->SetDetailsImage(it.Get()); - segmenter->Update(); - m_NumberOfObjectsVector.push_back(segmenter->GetNumberOfObjects()); - outputList->PushBack(segmenter->GetOutput()); - } -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSegmentationFilter<TInputImage, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h deleted file mode 100644 index 873ee46da44eab0b49cf18fef11e36406b55c3e2..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.h +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSegmenter_h -#define otbMorphologicalPyramidSegmenter_h - -#include "itkImageToImageFilter.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * \class Segmenter - * \brief This class performs the segmentation of a detail image extracted from a - * morphological pyramid analysis. - * - * This class performs the segmentation of a detail image extracted from a - * morphological pyramid analysis. - * - * The Segmentation is performed using the ConnectedThresholdImageFilter. The seeds - * are extracted from the image using the ImageToPointSetFilter. The thresolds are set - * by using quantiles computed with the HistogramGenerator. - * - * \sa MorphologicalPyramidAnalyseFilter - * \sa MorphologicalPyramidSynthesisFilter - * \sa ResampleImageFilter - * \sa LinearInterpolateImageFunction - * \sa ScaleTransform - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage> -class ITK_EXPORT Segmenter - : public itk::ImageToImageFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef Segmenter Self; - typedef itk::ImageToImageFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(Segmenter, ImageToImageFilter); - /** Template parameters typedefs */ - typedef TInputImage InputImageType; - typedef typename InputImageType::PixelType InputPixelType; - typedef typename InputImageType::Pointer InputImagePointerType; - typedef TOutputImage OutputImageType; - typedef typename OutputImageType::Pointer OutputImagePointerType; - typedef typename OutputImageType::PixelType OutputPixelType; - typedef typename OutputImageType::RegionType OutputImageRegionType; - typedef typename OutputImageType::SizeType SizeType; - typedef typename OutputImageType::SpacingType SpacingType; - - /** ImageDimension constants */ - itkStaticConstMacro(DetailsImageDimension, unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OriginalImageDimension, unsigned int, - TInputImage::ImageDimension); - itkStaticConstMacro(OutputImageDimension, unsigned int, - TOutputImage::ImageDimension); - /** - * Set the details image. - * \param detailsImage The details image from the morphological pyramid - */ - void SetDetailsImage(const InputImageType * detailsImage); - /** - * Get the details image. - * \return detailsImage The input details image. - */ - InputImageType * GetDetailsImage(void); - /** - * Set the original image. - * \param originalImage The original image to segment. - */ - void SetOriginalImage(const InputImageType * originalImage); - /** - * Get the original image. - * \return originalImage The original image to segment. - */ - InputImageType * GetOriginalImage(void); - - /** Min object size parameter accessor */ - itkSetMacro(MinimumObjectSize, unsigned long); - itkGetMacro(MinimumObjectSize, unsigned long); - /** Quantile for seeds extraction */ - itkSetMacro(SeedsQuantile, double); - itkGetMacro(SeedsQuantile, double); - /** Quantile for connected thresholding */ - itkSetMacro(ConnectedThresholdQuantile, double); - itkGetMacro(ConnectedThresholdQuantile, double); - /** Toogle the darker detail segmentation */ - itkSetMacro(SegmentDarkDetailsBool, bool); - itkGetMacro(SegmentDarkDetailsBool, bool); - itkBooleanMacro(SegmentDarkDetailsBool); - /** Get the number of segmented objects */ - itkGetMacro(NumberOfObjects, OutputPixelType); - -protected: - /** Constructor */ - Segmenter(); - /** Destructor */ - ~Segmenter() override {} - /** Main computation method */ - void GenerateData(void) override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** - * Configure the input datas. - */ - void GenerateInputRequestedRegion(void) override; - /** - * Configure the output data. - */ - using Superclass::EnlargeOutputRequestedRegion; - void EnlargeOutputRequestedRegion(void); - -private: - Segmenter(const Self &) = delete; - void operator =(const Self&) = delete; - /** Minimum size for the segmented object */ - unsigned long m_MinimumObjectSize; - /** Quantile for seeds determination */ - double m_SeedsQuantile; - /** Quantile to set the connectedThresholdFilter threshold */ - double m_ConnectedThresholdQuantile; - /** Set to true if the details to segment are darker than background */ - bool m_SegmentDarkDetailsBool; - /** Number of segmented objects */ - OutputPixelType m_NumberOfObjects; -}; -} // End namespace MorphologicalPyramid -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidSegmenter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx deleted file mode 100644 index 555b483dd25bdc150964a02d9fc8dab61beb90ac..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSegmenter.hxx +++ /dev/null @@ -1,319 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSegmenter_hxx -#define otbMorphologicalPyramidSegmenter_hxx - -#include "otbMorphologicalPyramidSegmenter.h" - -#include "otbImage.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkConnectedThresholdImageFilter.h" -#include "itkConnectedComponentImageFilter.h" -#include "itkRelabelComponentImageFilter.h" -#include "itkThresholdImageFilter.h" -#include "itkMultiplyImageFilter.h" -#include "itkCastImageFilter.h" -#include "itkInvertIntensityImageFilter.h" -#include "itkRescaleIntensityImageFilter.h" -#include "otbThresholdImageToPointSetFilter.h" -#include "itkScalarImageToHistogramGenerator.h" -#include "itkMinimumMaximumImageCalculator.h" - -namespace otb -{ -namespace MorphologicalPyramid -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage> -Segmenter<TInputImage, TOutputImage> -::Segmenter() -{ - this->SetNumberOfRequiredInputs(2); - m_SeedsQuantile = 0.9; - m_MinimumObjectSize = 10; - m_SegmentDarkDetailsBool = false; - m_NumberOfObjects = 0; - m_ConnectedThresholdQuantile = 0.9; -} -/** - * Set the details image. - * \param detailsImage The details image from the morphological pyramid - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::SetDetailsImage(const InputImageType * detailsImage) -{ - this->SetNthInput(0, const_cast<TInputImage *>(detailsImage)); -} -/** - * Set the details image. - * \return detailsImage The input details image. - */ -template <class TInputImage, class TOutputImage> -typename Segmenter<TInputImage, TOutputImage>::InputImageType * -Segmenter<TInputImage, TOutputImage> -::GetDetailsImage(void) -{ - return const_cast<InputImageType *>(this->GetInput(0)); -} -/** - * Set the original image. - * \param originalImage The original image to segment. - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::SetOriginalImage(const InputImageType * originalImage) -{ - this->SetNthInput(1, const_cast<TInputImage *>(originalImage)); -} -/** - * Get the original image. - * \return originalImage The original image to segment. - */ -template <class TInputImage, class TOutputImage> -typename Segmenter<TInputImage, TOutputImage>::InputImageType * -Segmenter<TInputImage, TOutputImage> -::GetOriginalImage(void) -{ - return const_cast<InputImageType *>(this->GetInput(1)); -} -/** - * Configure the input datas. - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::GenerateInputRequestedRegion() -{ - // call the superclass' implementation of this method - Superclass::GenerateInputRequestedRegion(); - - // get pointers to the inputs - InputImagePointerType detailsPtr = - const_cast<InputImageType *>(this->GetInput(0)); - - InputImagePointerType origPtr = - const_cast<InputImageType *>(this->GetInput(1)); - - if (!detailsPtr || !origPtr) - { - return; - } - - // We need to - // configure the inputs such that all the data is available. - detailsPtr->SetRequestedRegion(detailsPtr->GetLargestPossibleRegion()); - origPtr->SetRequestedRegion(origPtr->GetLargestPossibleRegion()); -} -/** - * Configure the output data - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::EnlargeOutputRequestedRegion(void) -{ - this->GetOutput() - ->SetRequestedRegion(this->GetOutput()->GetLargestPossibleRegion()); -} - -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::GenerateData() -{ - // Input images pointers - InputImagePointerType details = this->GetDetailsImage(); - InputImagePointerType original = this->GetOriginalImage(); - - // Typedefs for details image enhancement - typedef double FloatPixelType; - typedef otb::Image<FloatPixelType, InputImageType::ImageDimension> FloatImageType; - typedef itk::InvertIntensityImageFilter<InputImageType, InputImageType> InvertFilterType; - typedef itk::MultiplyImageFilter<FloatImageType, FloatImageType, InputImageType> MultiplyFilterType; - typedef itk::CastImageFilter<InputImageType, FloatImageType> CastImageFilterType; - typedef itk::MinimumMaximumImageCalculator<InputImageType> MinMaxCalculatorType; - - //Typedefs for seeds extraction - typedef itk::PointSet<InputPixelType, InputImageType::ImageDimension> PointSetType; - typedef otb::ThresholdImageToPointSetFilter<InputImageType, PointSetType> PointSetFilterType; - typedef typename PointSetType::PointsContainer::Iterator PointSetIteratorType; - - // Typedefs for segmentation - typedef itk::ConnectedThresholdImageFilter<InputImageType, InputImageType> ConnectedFilterType; - typedef itk::ConnectedComponentImageFilter<InputImageType, OutputImageType> LabelFilterType; - typedef itk::RelabelComponentImageFilter<OutputImageType, OutputImageType> RelabelFilterType; - typedef itk::ThresholdImageFilter<OutputImageType> ThresholdFilterType; - - // Typedefs for statistics computation - typedef itk::Statistics::ScalarImageToHistogramGenerator<InputImageType> HistGeneratorType; - - ///////////////////////////////////// - //// Details image enhancement ////// - ///////////////////////////////////// - - // Filters instantiation - typename InvertFilterType::Pointer invert; - typename CastImageFilterType::Pointer cast1 = CastImageFilterType::New(); - typename CastImageFilterType::Pointer cast2 = CastImageFilterType::New(); - typename MultiplyFilterType::Pointer mult = MultiplyFilterType::New(); - typename MinMaxCalculatorType::Pointer minMax = MinMaxCalculatorType::New(); - - // Pipeline connection - cast1->SetInput(details); - - minMax->SetImage(original); - minMax->ComputeMaximum(); - - // If we want to segment darker detail, the original image must have its itensity inverted - if (m_SegmentDarkDetailsBool) - { - invert = InvertFilterType::New(); - invert->SetInput(original); - invert->SetMaximum(minMax->GetMaximum()); - cast2->SetInput(invert->GetOutput()); - } - else - { - cast2->SetInput(original); - } - mult->SetInput1(cast1->GetOutput()); - mult->SetInput2(cast2->GetOutput()); - mult->Update(); - - ///////////////////////////////////// - //// Thresholds computation ///////// - ///////////////////////////////////// - - // Filter instantiation - typename HistGeneratorType::Pointer histogram = HistGeneratorType::New(); - // Seeds Threshold is computed from the quantile - histogram->SetInput(details); - histogram->SetNumberOfBins(255); - histogram->SetMarginalScale(10.0); - histogram->Compute(); - InputPixelType pointSetThreshold = - static_cast<InputPixelType>(histogram->GetOutput()->Quantile(0, m_SeedsQuantile)); - - // Segmentation Threshold is computed from the quantile - histogram = HistGeneratorType::New(); - histogram->SetInput(mult->GetOutput()); - histogram->SetNumberOfBins(255); - histogram->SetMarginalScale(10.0); - histogram->Compute(); - InputPixelType connectedThresholdValue = - static_cast<InputPixelType>(histogram->GetOutput()->Quantile(0, m_ConnectedThresholdQuantile)); - - ///////////////////////////////////// - //// Seeds extraction /////////////// - ///////////////////////////////////// - - typename PointSetFilterType::Pointer pointSetFilter = PointSetFilterType::New(); - pointSetFilter->SetInput(0, details); - pointSetFilter->SetLowerThreshold(pointSetThreshold); - pointSetFilter->Update(); - - ///////////////////////////////////// - //// Segmentation /////////////////// - ///////////////////////////////////// - - // Filters instantiation - typename ConnectedFilterType::Pointer connectedThreshold = ConnectedFilterType::New(); - typename LabelFilterType::Pointer labeler = LabelFilterType::New(); - typename RelabelFilterType::Pointer relabeler = RelabelFilterType::New(); - typename ThresholdFilterType::Pointer threshold = ThresholdFilterType::New(); - - //Passing seeds to the connected filter - connectedThreshold = ConnectedFilterType::New(); - connectedThreshold->ClearSeeds(); - connectedThreshold->SetInput(mult->GetOutput()); - PointSetIteratorType it = pointSetFilter->GetOutput()->GetPoints()->Begin(); - while (it != pointSetFilter->GetOutput()->GetPoints()->End()) - { - typename OutputImageType::IndexType index; - index[0] = static_cast<long int>(it.Value()[0]); - index[1] = static_cast<long int>(it.Value()[1]); - connectedThreshold->AddSeed(index); - ++it; - } - - // segmentation - connectedThreshold->SetLower(connectedThresholdValue); - - // labelling - labeler = LabelFilterType::New(); - relabeler = RelabelFilterType::New(); - labeler->SetInput(connectedThreshold->GetOutput()); - relabeler->SetInput(labeler->GetOutput()); - relabeler->SetMinimumObjectSize(m_MinimumObjectSize); - relabeler->Update(); - - // In some cases it might happen that the whole extent of the image is segmented as a single region. - // Since this is not desirable, we test this case here to avoid it. - threshold = ThresholdFilterType::New(); - threshold->SetInput(relabeler->GetOutput()); - OutputPixelType num = 0; - if (relabeler->GetNumberOfObjects() == 1) - { - unsigned int surface = mult->GetOutput()->GetLargestPossibleRegion().GetSize()[0] - * mult->GetOutput()->GetLargestPossibleRegion().GetSize()[1]; - if (relabeler->GetSizeOfObjectsInPixels()[0] == surface) - { - num = 0; - } - else - { - num = 1; - } - } - else - { - num = static_cast<OutputPixelType>(relabeler->GetNumberOfObjects()); - } - threshold->ThresholdOutside(0, num); - - // Output connection - threshold->GraftOutput(this->GetOutput()); - threshold->Update(); - this->GraftOutput(threshold->GetOutput()); - m_NumberOfObjects = num; -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage> -void -Segmenter<TInputImage, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - -} -} // End namespace MorphologicalPyramid -} // End namespace otb -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h deleted file mode 100644 index 20a8f447aef515dbb646b154de76e1fe832bca29..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSynthesisFilter_h -#define otbMorphologicalPyramidSynthesisFilter_h - -#include "otbImageToImageListFilter.h" - -namespace otb -{ -/** - * \class MorphologicalPyramidSynthesisFilter - * \brief Recomposition of the multiscale analysis performed with - * a MorphologicalPyramidAnalyseFilter. - * - * Once a morphological pyramidal decompisition has been made, it is - * possible to rebuild without any loss of information the original - * image at full resolution. The MorphologicalPyramidsynthesisFilter - * provides such a functionality. At each iteration, it performs the - * up-sampling of the current image using the - * otb::morphologicalPyramid::Resampler filter, the addition of - * the details lost in down-sampling, and the addition of the details - * lost in smoothing. - * - * \ingroup MultiScale - * \sa MorphologicalPyramidAnalyseFilter - * \sa MorphologicalPyramidResampler - * - * \ingroup OTBMorphologicalPyramid - */ -template <class TInputImage, class TOutputImage> -class ITK_EXPORT MorphologicalPyramidSynthesisFilter - : public ImageToImageListFilter<TInputImage, TOutputImage> -{ -public: - /** Standard typedefs */ - typedef MorphologicalPyramidSynthesisFilter Self; - typedef ImageToImageListFilter<TInputImage, TOutputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through object factory macro */ - itkNewMacro(Self); - /** Type macro */ - itkTypeMacro(MorphologicalPyramidSynthesisFilter, MorphologicalPyramidSynthesisFilter); - /** Input image dimension constant macro */ - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - /** Output related typedefs */ - typedef typename Superclass::OutputImageType OutputImageType; - typedef typename Superclass::OutputImageListType OutputImageListType; - typedef typename OutputImageListType::Pointer OutputImageListPointerType; - typedef typename Superclass::OutputImagePointerType OutputImagePointerType; - typedef typename Superclass::OutputImageListType::Iterator ImageListIterator; - typedef typename Superclass::OutputImageListType::ReverseIterator ImageListReverseIterator; - /** Input related typedefs */ - typedef typename Superclass::InputImageType InputImageType; - typedef typename Superclass::InputImageRegionType InputImageRegionType; - typedef typename InputImageType::Pointer InputImagePointer; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::SizeType SizeType; - typedef typename InputImageType::ValueType ValueType; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::SpacingType SpacingType; - typedef otb::ImageList<InputImageType> InputImageListType; - typedef typename InputImageListType::Pointer InputImageListPointerType; - /** Size vector typedefs */ - typedef std::vector<SizeType> SizeVectorType; - typedef typename SizeVectorType::iterator SizeIterator; - typedef typename SizeVectorType::reverse_iterator SizeReverseIterator; - /** - * Set The SupFilter details - * \param imageList The brighter details extracted from the filtering operation. - */ - void SetSupFilter(InputImageListType * imageList); - /** - * Set The InfFilter details - * \param imageList The darker details extracted from the filtering operation. - */ - void SetInfFilter(InputImageListType * imageList); - /** - * Set The SupDeci details - * \param imageList The brighter details extracted from the filtering operation. - */ - void SetSupDeci(InputImageListType * imageList); - /** - * Set The InfDeci details - * \param imageList The darker details extracted from the filtering operation. - */ - void SetInfDeci(InputImageListType * imageList); - /** - * Get The SupFilter details - * \return The brighter details extracted from the filtering operation. - */ - InputImageListType* GetSupFilter(void); - /** - * Get The InfFilter details - * \return The darker details extracted from the filtering operation. - */ - InputImageListType* GetInfFilter(void); - /** - * Get The SupDeci details - * \return The brighter details extracted from the resampling operation. - */ - InputImageListType* GetSupDeci(void); - /** - * Get The InfDeci details - * \return The brighter details extracted from the resampling operation. - */ - InputImageListType* GetInfDeci(void); - -protected: - /** Constructor */ - MorphologicalPyramidSynthesisFilter(); - /** Destructor */ - ~MorphologicalPyramidSynthesisFilter() override; - void GenerateOutputInformation() override {} // does nothing - /** Main computation method */ - void GenerateData() override; - /** Printself method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbMorphologicalPyramidSynthesisFilter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx b/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx deleted file mode 100644 index 3f8d81ccf76f316314434ba1c39437c007115289..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/include/otbMorphologicalPyramidSynthesisFilter.hxx +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbMorphologicalPyramidSynthesisFilter_hxx -#define otbMorphologicalPyramidSynthesisFilter_hxx - -#include "otbMorphologicalPyramidSynthesisFilter.h" - -#include "otbMorphologicalPyramidResampler.h" -#include "itkSubtractImageFilter.h" -#include "itkAddImageFilter.h" -#include "itkImageDuplicator.h" -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputImage> -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::MorphologicalPyramidSynthesisFilter() -{ - this->SetNumberOfRequiredInputs(5); -} -/** - * Destructor - */ -template <class TInputImage, class TOutputImage> -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::~MorphologicalPyramidSynthesisFilter() {} -/** - * Set The SupFilter details - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::SetSupFilter(InputImageListType * imageList) -{ - this->SetNthInput(1, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The InfFilter details - * \param imageList The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::SetInfFilter(InputImageListType * imageList) -{ - this->SetNthInput(2, const_cast<InputImageListType *>(imageList)); -} - -/** - * Set The SupDeci details - * \param imageList The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::SetSupDeci(InputImageListType * imageList) -{ - this->SetNthInput(3, const_cast<InputImageListType *>(imageList)); -} -/** - * Set The InfDeci details - * \param imageList The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::SetInfDeci(InputImageListType * imageList) -{ - this->SetNthInput(4, const_cast<InputImageListType *>(imageList)); -} - -/** - * Get The SupFilter details - * \return The brighter details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::GetSupFilter(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(1)); -} -/** - * Get The InfFilter details - * \return The darker details extracted from the filtering operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::GetInfFilter(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(2)); -} -/** - * Get The SupDeci details - * \return The brighter details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::GetSupDeci(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(3)); -} -/** - * Get The InfDeci details - * \return The darker details extracted from the resampling operation. - */ -template <class TInputImage, class TOutputImage> -typename MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::InputImageListType* -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::GetInfDeci(void) -{ - return dynamic_cast<InputImageListType *>(this->itk::ProcessObject::GetInput(4)); -} -/** - * Main computation method - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::GenerateData(void) -{ - otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter : Entering main method."); - // Input image pointer - InputImageListType * supFilter = this->GetSupFilter(); - InputImageListType * infFilter = this->GetInfFilter(); - InputImageListType * supDeci = this->GetSupDeci(); - InputImageListType * infDeci = this->GetInfDeci(); - - // Output pointer - OutputImageListType * OutputImageList = this->GetOutput(); - - // typedefs of the filters - typedef itk::SubtractImageFilter<InputImageType, InputImageType, OutputImageType> SubtractFilterType; - typedef itk::AddImageFilter<InputImageType, InputImageType, InputImageType> AddFilterType; - typedef otb::MorphologicalPyramid::Resampler<InputImageType, InputImageType> ResamplerType; - typedef itk::ImageDuplicator<InputImageType> DuplicatorType; - - // Input Image duplication to the currentImage Pointer - typename DuplicatorType::Pointer duplicator = DuplicatorType::New(); - duplicator->SetInputImage(this->GetInput()); - duplicator->Update(); - - // Input Image duplication to the currentImage Pointer - typename InputImageType::Pointer currentImage = duplicator->GetOutput(); - - // Filters declarations - typename AddFilterType::Pointer add1, add2; - typename SubtractFilterType::Pointer subtract1, subtract2; - typename ResamplerType::Pointer resampler; - - // Size vector computation - SizeVectorType size; - - ImageListIterator it = supFilter->Begin(); - - while (it != supFilter->End()) - { - size.push_back(it.Get()->GetLargestPossibleRegion().GetSize()); - ++it; - } - otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter : Size vector computation OK"); - - // Iterators definition - ImageListReverseIterator itinfFilter = infFilter->ReverseBegin(); - ImageListReverseIterator itsupFilter = supFilter->ReverseBegin(); - ImageListReverseIterator itinfDeci = infDeci->ReverseBegin(); - ImageListReverseIterator itsupDeci = supDeci->ReverseBegin(); - SizeReverseIterator itSize = size.rbegin(); - - int i = 1; -//--------------------------------------------------------// -// Main loop // -//--------------------------------------------------------// - while (itinfFilter != infFilter->ReverseEnd() - && itsupFilter != supFilter->ReverseEnd() - && itinfDeci != infDeci->ReverseEnd() - && itsupDeci != supDeci->ReverseEnd() - && itSize != size.rend()) - { - - ++i; - // Upsampling current image - resampler = ResamplerType::New(); - resampler->SetSize(*itSize); - resampler->SetInput(currentImage); - resampler->Update(); - otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: step " << i << " Upsampling OK"); - // Adding *sup details from current level - add1 = AddFilterType::New(); - add1->SetInput1(resampler->GetOutput()); - add1->SetInput2(itsupFilter.Get()); - add2 = AddFilterType::New(); - add2->SetInput1(add1->GetOutput()); - add2->SetInput2(itsupDeci.Get()); - - // Adding *inf details from current level - subtract1 = SubtractFilterType::New(); - subtract1->SetInput1(add2->GetOutput()); - subtract1->SetInput2(itinfFilter.Get()); - subtract2 = SubtractFilterType::New(); - subtract2->SetInput1(subtract1->GetOutput()); - subtract2->SetInput2(itinfDeci.Get()); - subtract2->Update(); - otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: step " << i << " Details addition OK"); - - // Updating current image - currentImage = subtract2->GetOutput(); - OutputImageList->PushBack(currentImage); - - // Iterators incrementation - ++itsupFilter; - ++itinfFilter; - ++itsupDeci; - ++itinfDeci; - ++itSize; - } - otbMsgDevMacro(<< "MorphologicalPyramidSynthesisFilter: Exiting main method."); -} -/** - * PrintSelf method - */ -template <class TInputImage, class TOutputImage> -void -MorphologicalPyramidSynthesisFilter<TInputImage, TOutputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb - -#endif diff --git a/Modules/Filtering/MorphologicalPyramid/otb-module.cmake b/Modules/Filtering/MorphologicalPyramid/otb-module.cmake deleted file mode 100644 index 677f456dbaf8e456576007b5ba645deeb8e4a3f0..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/otb-module.cmake +++ /dev/null @@ -1,43 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "If the smoothing filter used in the pyramidal analysis is a -morphological filter, one cannot safely subsample the filtered image without loss -of information. However, by keeping the details possibly lost in the -down-sampling operation, such a decomposition can be used. The Morphological Pyramid is an -approach to such a decomposition. This module contains classes useful in meeting -that goal.") - -otb_module(OTBMorphologicalPyramid - DEPENDS - OTBCommon - OTBITK - OTBImageBase - OTBObjectList - OTBPointSet - - TEST_DEPENDS - OTBImageIO - OTBMorphologicalProfiles - OTBTestKernel - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt b/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt deleted file mode 100644 index 90bf757fdcb09ac89bbd1b9deb5899cd11f81b1f..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/CMakeLists.txt +++ /dev/null @@ -1,148 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBMorphologicalPyramidTests -otbMorphologicalPyramidTestDriver.cxx -otbMorphologicalPyramidAnalysisFilter.cxx -otbMorphologicalPyramidSegmenter.cxx -otbMorphologicalPyramidSynthesisFilter.cxx -otbMorphologicalPyramidMRToMSConverter.cxx -otbMorphologicalPyramidResampler.cxx -otbMorphologicalPyramidSegmentationFilter.cxx -) - -add_executable(otbMorphologicalPyramidTestDriver ${OTBMorphologicalPyramidTests}) -target_link_libraries(otbMorphologicalPyramidTestDriver ${OTBMorphologicalPyramid-Test_LIBRARIES}) -otb_module_target_label(otbMorphologicalPyramidTestDriver) - -# Tests Declaration - -otb_add_test(NAME msTvMorphoPyrAnalysisFilter COMMAND otbMorphologicalPyramidTestDriver - --compare-n-images ${NOTOL} 5 - ${BASELINE}/msPyrAn_mire_log_an_2.png - ${TEMP}/msPyrAn_mire_log_an_2.png - ${BASELINE}/msPyrAn_mire_log_sf_2.png - ${TEMP}/msPyrAn_mire_log_sf_2.png - ${BASELINE}/msPyrAn_mire_log_if_2.png - ${TEMP}/msPyrAn_mire_log_if_2.png - ${BASELINE}/msPyrAn_mire_log_sd_2.png - ${TEMP}/msPyrAn_mire_log_sd_2.png - ${BASELINE}/msPyrAn_mire_log_id_2.png - ${TEMP}/msPyrAn_mire_log_id_2.png - otbMorphologicalPyramidAnalysisFilter - ${INPUTDATA}/mire_log.png - ${TEMP}/msPyrAn_mire_log - png - 2 - 2.0) - -otb_add_test(NAME msTvMorphoPyrSegmentBright COMMAND otbMorphologicalPyramidTestDriver - --compare-image ${NOTOL} - ${BASELINE}/msPyrSegmenter_IKO_Halles_4_2_sf.tif - ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_sf.tif - otbMorphologicalPyramidSegmenter - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_sf.tif - 0 - 0.9 - 0.9 - 10 - ) -set_property(TEST msTvMorphoPyrSegmentBright PROPERTY DEPENDS msTvMorphoPyrMRToMSConverter) - -otb_add_test(NAME msTvMorphoPyrSegmentDark COMMAND otbMorphologicalPyramidTestDriver - --compare-image ${NOTOL} - ${BASELINE}/msPyrSegmenter_IKO_Halles_4_2_if.tif - ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_if.tif - otbMorphologicalPyramidSegmenter - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrSegmenter_IKO_Halles_4_2_if.tif - 1 - 0.9 - 0.9 - 10 - ) -set_property(TEST msTvMorphoPyrSegmentDark PROPERTY DEPENDS msTvMorphoPyrMRToMSConverter) - -otb_add_test(NAME msTvMorphoPyrSynthesisFilter COMMAND otbMorphologicalPyramidTestDriver - --compare-image ${NOTOL} - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrSynth_IKO_Halles_4_2.tif - otbMorphologicalPyramidSynthesisFilter - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrSynth_IKO_Halles_4_2.tif - 4 - 2.0) - -otb_add_test(NAME msTvMorphoPyrMRToMSConverter COMMAND otbMorphologicalPyramidTestDriver - --compare-n-images ${EPSILON_8} 3 - ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif - ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif - ${BASELINE}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif - otbMorphologicalPyramidMRToMSConverter - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_sf_full.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_if_full.tif - ${TEMP}/msPyrMRToMS_IKO_Halles_4_2_an_full.tif - 4 - 2.0) - -otb_add_test(NAME msTvMorphoPyrResampler COMMAND otbMorphologicalPyramidTestDriver - --compare-n-images ${EPSILON_8} 2 - ${BASELINE}/msPyrResampler_IKO_LesHalles_256_2.tif - ${TEMP}/msPyrResampler_IKO_LesHalles_256_2.tif - ${BASELINE}/msPyrResampler_IKO_LesHalles_full.tif - ${TEMP}/msPyrResampler_IKO_LesHalles_full.tif - otbMorphologicalPyramidResampler - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrResampler_IKO_LesHalles_256_2.tif - ${TEMP}/msPyrResampler_IKO_LesHalles_full.tif - 256 - 256 - ) - -otb_add_test(NAME msTvMorphoPyrSegmentationFilter COMMAND otbMorphologicalPyramidTestDriver - --compare-n-images ${NOTOL} 4 - ${BASELINE}/msPyrSegmentation_IKO_Halles_2.tif - ${TEMP}/msPyrSegmentation_IKO_Halles_2.tif - ${BASELINE}/msPyrSegmentation_IKO_Halles_4.tif - ${TEMP}/msPyrSegmentation_IKO_Halles_4.tif - ${BASELINE}/msPyrSegmentation_IKO_Halles_5.tif - ${TEMP}/msPyrSegmentation_IKO_Halles_5.tif - ${BASELINE}/msPyrSegmentation_IKO_Halles_7.tif - ${TEMP}/msPyrSegmentation_IKO_Halles_7.tif - otbMorphologicalPyramidSegmentationFilter - ${INPUTDATA}/ROI_IKO_PAN_LesHalles.tif - ${TEMP}/msPyrSegmentation_IKO_Halles_ - tif - 4 - 2.0 - 0.9 - 0.9 - 10 - ) - diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx deleted file mode 100644 index c2704c3627f73b4d0a830b6fdaf65a4d46cb44fe..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidAnalysisFilter.cxx +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbMorphologicalPyramidAnalysisFilter.h" -#include "otbOpeningClosingMorphologicalFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidAnalysisFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * inputFilename = argv[1]; - const char * outputFilenamePrefix = argv[2]; - const char * outputFilenameSuffix = argv[3]; - const unsigned int numberOfLevels = atoi(argv[4]); - const float decimationRatio = atof(argv[5]); - - const unsigned int Dimension = 2; - typedef unsigned char InputPixelType; - typedef unsigned char OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType; - typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType> - OpeningClosingFilterType; - typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, OutputImageType, OpeningClosingFilterType> - PyramidFilterType; - typedef PyramidFilterType::OutputImageListType::Iterator ImageListIterator; - - // Reading input image - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - - // Instantiation - PyramidFilterType::Pointer pyramid = PyramidFilterType::New(); - pyramid->SetNumberOfLevels(numberOfLevels); - pyramid->SetDecimationRatio(decimationRatio); - pyramid->SetInput(reader->GetOutput()); - pyramid->Update(); - - // Retrieving iterators on the results images - ImageListIterator itAnalyse = pyramid->GetOutput()->Begin(); - ImageListIterator itSupFilter = pyramid->GetSupFilter()->Begin(); - ImageListIterator itInfFilter = pyramid->GetInfFilter()->Begin(); - ImageListIterator itInfDeci = pyramid->GetInfDeci()->Begin(); - ImageListIterator itSupDeci = pyramid->GetSupDeci()->Begin(); - - WriterType::Pointer writer = WriterType::New(); - - int i = 1; - // std::stringstream oss; - std::ostringstream oss; - // Writing the results images - while ((itAnalyse != pyramid->GetOutput()->End()) - && (itSupFilter != pyramid->GetSupFilter()->End()) - && (itInfFilter != pyramid->GetInfFilter()->End()) - && (itInfDeci != pyramid->GetInfDeci()->End()) - && (itSupDeci != pyramid->GetSupDeci()->End()) - ) - { - oss << outputFilenamePrefix << "_an_" << i << "." << outputFilenameSuffix; - writer->SetInput(itAnalyse.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - oss.str(""); - oss << outputFilenamePrefix << "_sf_" << i << "." << outputFilenameSuffix; - writer->SetInput(itSupFilter.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - oss.str(""); - oss << outputFilenamePrefix << "_if_" << i << "." << outputFilenameSuffix; - writer->SetInput(itInfFilter.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - oss.str(""); - oss << outputFilenamePrefix << "_id_" << i << "." << outputFilenameSuffix; - writer->SetInput(itInfDeci.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - std::cout << "File " << oss.str() << " written" << std::endl; - oss.str(""); - oss << outputFilenamePrefix << "_sd_" << i << "." << outputFilenameSuffix; - writer->SetInput(itSupDeci.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - oss.str(""); - ++itAnalyse; - ++itSupFilter; - ++itInfFilter; - ++itInfDeci; - ++itSupDeci; - ++i; - } - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx deleted file mode 100644 index cfc82520f07c0d3996c88da2a996b42b1058f4b2..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidMRToMSConverter.cxx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbMorphologicalPyramidAnalysisFilter.h" -#include "otbMorphologicalPyramidMRToMSConverter.h" -#include "otbOpeningClosingMorphologicalFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidMRToMSConverter(int itkNotUsed(argc), char * argv[]) -{ - const char * inputFilename = argv[1]; - const char * outputFilename1 = argv[2]; - const char * outputFilename2 = argv[3]; - const char * outputFilename3 = argv[4]; - const unsigned int numberOfLevels = atoi(argv[5]); - const float decimationRatio = atof(argv[6]); - - const unsigned int Dimension = 2; - typedef double InputPixelType; - typedef double OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType; - typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType> - OpeningClosingFilterType; - typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, InputImageType, OpeningClosingFilterType> - PyramidAnalysisFilterType; - typedef otb::MorphologicalPyramid::MRToMSConverter<InputImageType, OutputImageType> MRToMSConverterType; - - // Reading input image - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - - // Analysis - PyramidAnalysisFilterType::Pointer pyramidAnalysis = PyramidAnalysisFilterType::New(); - pyramidAnalysis->SetNumberOfLevels(numberOfLevels); - pyramidAnalysis->SetDecimationRatio(decimationRatio); - pyramidAnalysis->SetInput(reader->GetOutput()); - - // From multi resolution to multi scale - MRToMSConverterType::Pointer mrtoms = MRToMSConverterType::New(); - mrtoms->SetInput(pyramidAnalysis->GetOutput()); - mrtoms->SetSupFilter(pyramidAnalysis->GetSupFilter()); - mrtoms->SetSupDeci(pyramidAnalysis->GetSupDeci()); - mrtoms->SetInfFilter(pyramidAnalysis->GetInfFilter()); - mrtoms->SetInfDeci(pyramidAnalysis->GetInfDeci()); - mrtoms->Update(); - - // Writing the output images - WriterType::Pointer writer1 = WriterType::New(); - writer1->SetFileName(outputFilename1); - writer1->SetInput(mrtoms->GetSupFilterFullResolution()->Back()); - writer1->Update(); - - WriterType::Pointer writer2 = WriterType::New(); - writer2->SetFileName(outputFilename2); - writer2->SetInput(mrtoms->GetInfFilterFullResolution()->Back()); - writer2->Update(); - - WriterType::Pointer writer3 = WriterType::New(); - writer3->SetFileName(outputFilename3); - writer3->SetInput(mrtoms->GetOutput()->Back()); - writer3->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx deleted file mode 100644 index 0d43971cf29e675072a0437c1f9e2f91a6d805e6..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidResampler.cxx +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbMorphologicalPyramidResampler.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidResampler(int itkNotUsed(argc), char * argv[]) -{ - const char* inputFilename = argv[1]; - const char* outputFilename1 = argv[2]; - const char* outputFilename2 = argv[3]; - const unsigned int size_x = atoi(argv[4]); - const unsigned int size_y = atoi(argv[5]); - - const unsigned int Dimension = 2; - typedef double InputPixelType; - typedef double OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef otb::MorphologicalPyramid::Resampler<InputImageType, OutputImageType> - ResamplerType; - - // Input image reading - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - - InputImageType::SizeType size; - size[0] = size_x; - size[1] = size_y; - - // Instantiation - ResamplerType::Pointer resampler = ResamplerType::New(); - resampler->SetInput(reader->GetOutput()); - resampler->SetSize(size); - - // File writing - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(resampler->GetOutput()); - writer->SetFileName(outputFilename1); - writer->Update(); - - ResamplerType::Pointer resampler2 = ResamplerType::New(); - resampler2->SetInput(resampler->GetOutput()); - resampler2->SetSize(reader->GetOutput()->GetLargestPossibleRegion().GetSize()); - - WriterType::Pointer writer2 = WriterType::New(); - writer2->SetInput(resampler2->GetOutput()); - writer2->SetFileName(outputFilename2); - writer2->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx deleted file mode 100644 index 959150db21b47e4ddd2131fe26736ff19a11a6a5..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmentationFilter.cxx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbMorphologicalPyramidSegmentationFilter.h" -#include "otbOpeningClosingMorphologicalFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "otbMorphologicalPyramidAnalysisFilter.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidSegmentationFilter(int itkNotUsed(argc), char * argv[]) -{ - const char* inputFilename = argv[1]; - const char* outputFilenamePrefix = argv[2]; - const char * outputFilenameSuffix = argv[3]; - const unsigned int numberOfLevels = atoi(argv[4]); - const double decimationRatio = atof(argv[5]); - const float seedsQuantile = atof(argv[6]); - const float segmentationQuantile = atof(argv[7]); - const unsigned int minObjectSize = atoi(argv[8]); - - const unsigned int Dimension = 2; - typedef double InputPixelType; - typedef unsigned short OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType; - typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType> - OpeningClosingFilterType; - typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, InputImageType, OpeningClosingFilterType> - PyramidFilterType; - typedef otb::MorphologicalPyramidSegmentationFilter<InputImageType, OutputImageType> - SegmentationFilterType; - typedef SegmentationFilterType::OutputImageListIteratorType OutputListIteratorType; - - // Input images reading - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - - //Analyse - PyramidFilterType::Pointer pyramid = PyramidFilterType::New(); - pyramid->SetNumberOfLevels(numberOfLevels); - pyramid->SetDecimationRatio(decimationRatio); - pyramid->SetInput(reader->GetOutput()); - - // Segmentation - SegmentationFilterType::Pointer segmentation = SegmentationFilterType::New(); - segmentation->SetReferenceImage(reader->GetOutput()); - segmentation->SetBrighterDetails(pyramid->GetSupFilter()); - segmentation->SetDarkerDetails(pyramid->GetInfFilter()); - segmentation->SetSeedsQuantile(seedsQuantile); - segmentation->SetConnectedThresholdQuantile(segmentationQuantile); - segmentation->SetMinimumObjectSize(minObjectSize); - segmentation->Update(); - - // Output writing - OutputListIteratorType it = segmentation->GetOutput()->Begin(); - WriterType::Pointer writer; - int index = 1; - std::stringstream oss; - while (it != segmentation->GetOutput()->End()) - { - oss << outputFilenamePrefix << index << "." << outputFilenameSuffix; - writer = WriterType::New(); - writer->SetInput(it.Get()); - writer->SetFileName(oss.str()); - writer->Update(); - std::cout << oss.str() << " file written." << std::endl; - oss.str(""); - ++index; - ++it; - } - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx deleted file mode 100644 index 12b2ac54df9a3ec70a7e2d8490ed48f1fc2bff51..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSegmenter.cxx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbMorphologicalPyramidSegmenter.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidSegmenter(int itkNotUsed(argc), char * argv[]) -{ - const char* inputFilename = argv[1]; - const char* originalFilename = argv[2]; - const char* outputFilename1 = argv[3]; - const bool segmentDark = atoi(argv[4]); - const float seedsQuantile = atof(argv[5]); - const float segmentationQuantile = atof(argv[6]); - const unsigned int minObjectSize = atoi(argv[7]); - - const unsigned int Dimension = 2; - typedef double InputPixelType; - typedef unsigned short OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef otb::MorphologicalPyramid::Segmenter<InputImageType, OutputImageType> - SegmenterType; - - // Input images reading - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - ReaderType::Pointer reader2 = ReaderType::New(); - reader2->SetFileName(originalFilename); - - // Instantiation - SegmenterType::Pointer segmenter = SegmenterType::New(); - segmenter->SetDetailsImage(reader->GetOutput()); - segmenter->SetOriginalImage(reader2->GetOutput()); - segmenter->SetSegmentDarkDetailsBool(segmentDark); - segmenter->SetSeedsQuantile(seedsQuantile); - segmenter->SetConnectedThresholdQuantile(segmentationQuantile); - segmenter->SetMinimumObjectSize(minObjectSize); - - // File writing - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(segmenter->GetOutput()); - writer->SetFileName(outputFilename1); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx deleted file mode 100644 index 084ba8bd43b89bd77f8b326dddf1b231725f3eec..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidSynthesisFilter.cxx +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" - -#include "otbMorphologicalPyramidAnalysisFilter.h" -#include "otbMorphologicalPyramidSynthesisFilter.h" -#include "otbOpeningClosingMorphologicalFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbImage.h" - -int otbMorphologicalPyramidSynthesisFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * inputFilename = argv[1]; - const char * outputFilename = argv[2]; - const unsigned int numberOfLevels = atoi(argv[3]); - const float decimationRatio = atof(argv[4]); - - const unsigned int Dimension = 2; - typedef unsigned char InputPixelType; - typedef unsigned char OutputPixelType; - - typedef otb::Image<InputPixelType, Dimension> InputImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - - typedef otb::ImageFileReader<InputImageType> ReaderType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - - typedef itk::BinaryBallStructuringElement<InputPixelType, Dimension> StructuringElementType; - typedef otb::OpeningClosingMorphologicalFilter<InputImageType, InputImageType, StructuringElementType> - OpeningClosingFilterType; - typedef otb::MorphologicalPyramidAnalysisFilter<InputImageType, OutputImageType, OpeningClosingFilterType> - PyramidAnalysisFilterType; - typedef otb::MorphologicalPyramidSynthesisFilter<InputImageType, OutputImageType> - PyramidSynthesisFilterType; - - // Reading input image - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(inputFilename); - - // Analysis - PyramidAnalysisFilterType::Pointer pyramidAnalysis = PyramidAnalysisFilterType::New(); - pyramidAnalysis->SetNumberOfLevels(numberOfLevels); - pyramidAnalysis->SetDecimationRatio(decimationRatio); - pyramidAnalysis->SetInput(reader->GetOutput()); - pyramidAnalysis->Update(); - - // Synthesis - PyramidSynthesisFilterType::Pointer pyramidSynthesis = PyramidSynthesisFilterType::New(); - pyramidSynthesis->SetInput(pyramidAnalysis->GetOutput()->Back()); - pyramidSynthesis->SetSupFilter(pyramidAnalysis->GetSupFilter()); - pyramidSynthesis->SetSupDeci(pyramidAnalysis->GetSupDeci()); - pyramidSynthesis->SetInfFilter(pyramidAnalysis->GetInfFilter()); - pyramidSynthesis->SetInfDeci(pyramidAnalysis->GetInfDeci()); - pyramidSynthesis->Update(); - - // Writing the output image - WriterType::Pointer writer = WriterType::New(); - writer->SetFileName(outputFilename); - writer->SetInput(pyramidSynthesis->GetOutput()->Back()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx b/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx deleted file mode 100644 index 7eae072f41716ed76033b26bbd70d0592fd0ce36..0000000000000000000000000000000000000000 --- a/Modules/Filtering/MorphologicalPyramid/test/otbMorphologicalPyramidTestDriver.cxx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbMorphologicalPyramidAnalysisFilter); - REGISTER_TEST(otbMorphologicalPyramidSegmenter); - REGISTER_TEST(otbMorphologicalPyramidSynthesisFilter); - REGISTER_TEST(otbMorphologicalPyramidMRToMSConverter); - REGISTER_TEST(otbMorphologicalPyramidResampler); - REGISTER_TEST(otbMorphologicalPyramidSegmentationFilter); -} diff --git a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h b/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h deleted file mode 100644 index 5ca5b65c5285040ec2079884721d9ec09de46ca5..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorizationPathListFilter_h -#define otbVectorizationPathListFilter_h - -#include "otbPathListSource.h" -#include "itkImageRegionIterator.h" -#include "itkNeighborhoodIterator.h" -#include "itkConstantBoundaryCondition.h" -#include "otbImage.h" - -namespace otb -{ -/** \class VectorizationPathListFilter - * \brief This filter performs a vectorization from a line detector modulus and direction outputs. - * - * The output of this filter is an otb::ObjectList<TOutputPath>. - * - * This filter performs vectorization at non-grid position by using the barycenter of the few pixels with - * non-null intensity in the given direction. A threshold can be set to tune the sensibility of the first point - * detection. Path with less than three vertices are not kept by the filter. - * - * \ingroup PathListSource - * - * \ingroup OTBPath - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -class ITK_EXPORT VectorizationPathListFilter - : public PathListSource<TOutputPath> -{ -public: - /** Standard typedefs */ - typedef VectorizationPathListFilter Self; - typedef PathListSource<TOutputPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(VectorizationPathListFilter, PathListSource); - - /** Template parameters typedefs */ - typedef TInputModulus InputModulusType; - typedef typename InputModulusType::ConstPointer InputModulusConstPointerType; - typedef typename InputModulusType::PixelType InputPixelType; - typedef typename InputModulusType::PointType PointType; - typedef typename InputModulusType::IndexType IndexType; - - typedef TInputDirection InputDirectionType; - typedef typename InputDirectionType::ConstPointer InputDirectionConstPointerType; - typedef TOutputPath OutputPathType; - typedef typename OutputPathType::Pointer OutputPathPointerType; - typedef typename OutputPathType::ContinuousIndexType VertexType; - - /** Derived typedefs */ - typedef typename Superclass::OutputPathListType OutputPathListType; - typedef typename Superclass::OutputPathListPointerType OutputPathListPointerType; - - /** Set/get the input modulus */ - using Superclass::SetInput; - void SetInput(InputModulusType * inputModulus); - const InputModulusType * GetInput(void); - - /** Set/get the input direction */ - void SetInputDirection(InputDirectionType * inputDirection); - const InputDirectionType * GetInputDirection(void); - - itkSetMacro(AmplitudeThreshold, InputPixelType); - itkGetMacro(AmplitudeThreshold, InputPixelType); - -protected: - - /** Other internal useful typedefs */ - typedef otb::Image<bool, InputModulusType::ImageDimension> FlagImageType; - typedef typename FlagImageType::Pointer FlagImagePointerType; - - typedef itk::ImageRegionConstIterator<InputModulusType> ModRegionIteratorType; - typedef itk::ImageRegionConstIterator<InputDirectionType> DirRegionIteratorType; - typedef itk::ImageRegionIterator<FlagImageType> FlagRegionIteratorType; - - typedef itk::ConstantBoundaryCondition<InputModulusType> ModBCType; - typedef itk::ConstantBoundaryCondition<InputDirectionType> DirBCType; - typedef itk::ConstantBoundaryCondition<FlagImageType> FlagBCType; - - typedef itk::ConstNeighborhoodIterator<InputModulusType, ModBCType> ModNeighborhoodIteratorType; - typedef itk::ConstNeighborhoodIterator<InputDirectionType, ModBCType> DirNeighborhoodIteratorType; - typedef itk::NeighborhoodIterator<FlagImageType, FlagBCType> FlagNeighborhoodIteratorType; - - typedef typename ModNeighborhoodIteratorType::RadiusType RadiusType; - typedef typename ModNeighborhoodIteratorType::OffsetType OffsetType; - typedef std::vector<OffsetType> OffsetVectorType; - - typedef typename OutputPathType::VertexListType VertexListType; - typedef typename VertexListType::ConstPointer VertexListPointerType; - typedef typename VertexListType::ConstIterator VertexIteratorType; - - /** Constructor */ - VectorizationPathListFilter(); - /** Destructor */ - ~VectorizationPathListFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData(void) override; - /** - * Compute a vector of the 8 neighbors to explore from the direction and the type of search (forward or backward). - * \param direction The direction - * \param flagReverse The type of search - * \return The neighborhood vector - */ - OffsetVectorType GetEightNeighborOffsetFromDirection(double direction, unsigned int flagReverse); - /** - * Compute a vector of the 3 neighbors to explore from the direction and the type of search (forward or backward). - * \param direction The direction - * \param flagReverse The type of search - * \return The neighborhood vector - */ - OffsetVectorType GetThreeNeighborOffsetFromDirection(double direction, unsigned int flagReverse); -private: - VectorizationPathListFilter(const Self &) = delete; - void operator =(const Self&) = delete; - /** Amplitude threshold to start following a path */ - InputPixelType m_AmplitudeThreshold; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbVectorizationPathListFilter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx b/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx deleted file mode 100644 index 66ac753b113d61519262f03e0dbf29c4eaf60c38..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Path/include/otbVectorizationPathListFilter.hxx +++ /dev/null @@ -1,677 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorizationPathListFilter_hxx -#define otbVectorizationPathListFilter_hxx - -#include "otbVectorizationPathListFilter.h" -#include "otbMacro.h" -#include "otbMath.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::VectorizationPathListFilter() -{ - this->SetNumberOfRequiredInputs(2); - this->SetNumberOfRequiredInputs(2); - m_AmplitudeThreshold = 1.0; -} - -template <class TInputModulus, class TInputDirection, class TOutputPath> -void -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::SetInput(InputModulusType * inputModulus) -{ - this->itk::ProcessObject::SetNthInput(0, const_cast<InputModulusType *>(inputModulus)); -} - -template <class TInputModulus, class TInputDirection, class TOutputPath> -const typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::InputModulusType * -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::GetInput(void) -{ - if (this->GetNumberOfInputs() < 1) - { - return nullptr; - } - return static_cast<const TInputModulus*>(this->itk::ProcessObject::GetInput(0)); -} - -template <class TInputModulus, class TInputDirection, class TOutputPath> -void -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::SetInputDirection(InputDirectionType * inputDirection) -{ - this->itk::ProcessObject::SetNthInput(1, const_cast<InputDirectionType *>(inputDirection)); -} - -template <class TInputModulus, class TInputDirection, class TOutputPath> -const typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::InputDirectionType * -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::GetInputDirection(void) -{ - if (this->GetNumberOfInputs() < 2) - { - return nullptr; - } - return static_cast<const TInputDirection *>(this->itk::ProcessObject::GetInput(1)); -} - -/** - * Main computation method - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -void -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::GenerateData(void) -{ - InputModulusConstPointerType modPtr = this->GetInput(); - InputDirectionConstPointerType dirPtr = this->GetInputDirection(); - OutputPathListPointerType outPtr = this->GetOutput(); - - typedef typename OffsetVectorType::iterator OffsetIteratorType; - - RadiusType radius; - radius.Fill(2); - OffsetVectorType offsetVector; - - // Creation of the flag image - FlagImagePointerType flagImage = FlagImageType::New(); - flagImage->SetRegions(modPtr->GetLargestPossibleRegion()); - flagImage->Allocate(); - flagImage->FillBuffer(false); - - // Iterators instantiation - ModRegionIteratorType modIt(modPtr, modPtr->GetLargestPossibleRegion()); - DirRegionIteratorType dirIt(dirPtr, dirPtr->GetLargestPossibleRegion()); - FlagRegionIteratorType flagIt(flagImage, flagImage->GetLargestPossibleRegion()); - - for (modIt.GoToBegin(), dirIt.GoToBegin(), flagIt.GoToBegin(); - (!modIt.IsAtEnd()) && (!dirIt.IsAtEnd()) && (!flagIt.IsAtEnd()); - ++modIt, ++dirIt, ++flagIt) - { - if ((modIt.Get() > m_AmplitudeThreshold) && (!flagIt.Get())) - { - //this is a beginning, to follow in two directions - OutputPathPointerType pathTempDirect = OutputPathType::New(); - OutputPathPointerType pathTempReverse = OutputPathType::New(); - OutputPathPointerType path = OutputPathType::New(); - - bool flagFinish; - int flagReverse = 0; - double totalAmplitude = 0; - - ModNeighborhoodIteratorType nModIt(radius, modPtr, modPtr->GetLargestPossibleRegion()); - DirNeighborhoodIteratorType nDirIt(radius, dirPtr, dirPtr->GetLargestPossibleRegion()); - FlagNeighborhoodIteratorType nFlagIt(radius, flagImage, flagImage->GetLargestPossibleRegion()); - - for (flagReverse = 0; flagReverse < 2; ++flagReverse) - { - nModIt.SetLocation(modIt.GetIndex()); - nDirIt.SetLocation(dirIt.GetIndex()); - nFlagIt.SetLocation(flagIt.GetIndex()); - // temporary point - PointType point; - VertexType vertex; - modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(), point); - modPtr->TransformPhysicalPointToContinuousIndex(point, vertex); - if (flagReverse == 0) - { - flagIt.Set(true); - - // otbMsgDebugMacro(<<"Adding new vertex: "<<vertex); - - pathTempDirect->AddVertex(vertex); - } - flagFinish = false; - while (!flagFinish) - { - offsetVector = GetThreeNeighborOffsetFromDirection(nDirIt.GetCenterPixel(), flagReverse); - OffsetIteratorType vecIt = offsetVector.begin(); - bool flagFound = false; - while (vecIt != offsetVector.end() && !flagFound) - { - flagFound = nModIt.GetPixel(*vecIt) > 0 - && !nFlagIt.GetPixel(*vecIt); - ++vecIt; - } - if (flagFound) - { - point.Fill(0); - PointType tmpPoint; - totalAmplitude = 0; - for (vecIt = offsetVector.begin(); vecIt != offsetVector.end(); ++vecIt) - { - double currentAmplitude = nModIt.GetPixel(*vecIt); - modPtr->TransformIndexToPhysicalPoint(nModIt.GetIndex(*vecIt), tmpPoint); - point[0] += currentAmplitude * tmpPoint[0]; - point[1] += currentAmplitude * tmpPoint[1]; - totalAmplitude += currentAmplitude; - } - point[0] = point[0] / totalAmplitude; - point[1] = point[1] / totalAmplitude; - modPtr->TransformPhysicalPointToContinuousIndex(point, vertex); - if (flagReverse == 0) - { -// otbMsgDevMacro(<<"Adding new vertex (direct): "<<vertex); - - pathTempDirect->AddVertex(vertex); - } - else - { - -// otbMsgDevMacro(<<"Adding new vertex (reverse): "<<vertex); - - pathTempReverse->AddVertex(vertex); - } - // flag the pixel use - nFlagIt.SetCenterPixel(true); - //update the neighbor iterators so they are centered on the nearest pixel to the barycenter - IndexType newIndex; - if (modPtr->TransformPhysicalPointToIndex(point, newIndex)) - { -// otbMsgDevMacro(<<"Moving to new center: " << newIndex); - nModIt.SetLocation(newIndex); - nDirIt.SetLocation(newIndex); - nFlagIt.SetLocation(newIndex); - - if (nModIt.GetCenterPixel() == 0) - { - //we need to check that in case the barycenter is out... - flagFinish = true; - } - if (nFlagIt.GetCenterPixel()) - { - //we don't want to go back to the same pixels - flagFinish = true; - } - } - else - { - //new point outside image - flagFinish = true; - } - } - else - { - flagFinish = true; - } - } - } - VertexListPointerType vertexDirect = pathTempDirect->GetVertexList(); - VertexListPointerType vertexReverse = pathTempReverse->GetVertexList(); - - unsigned int numberVertex = 0; - - VertexIteratorType vertexReverseIt = vertexReverse->End(); - if (vertexReverseIt != vertexReverse->Begin()) - { - --vertexReverseIt; - while (vertexReverseIt != vertexReverse->Begin()) - { - path->AddVertex(vertexReverseIt.Value()); - ++numberVertex; - --vertexReverseIt; - } - path->AddVertex(vertexReverseIt.Value()); - } - - VertexIteratorType vertexDirectIt = vertexDirect->Begin(); - while (vertexDirectIt != vertexDirect->End()) - { - path->AddVertex(vertexDirectIt.Value()); - ++vertexDirectIt; - ++numberVertex; - } - - // otbMsgDebugMacro(<<"Path number of vertices: "<<numberVertex); - - if (numberVertex > 3) - { - outPtr->PushBack(path); - } - } - } -} - -/** - * Compute the 8 neighbors to explore from the direction and the type of search (forward or backward). - * \param direction The direction - * \param flagReverse The type of search - * \return The neighborhood - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::OffsetVectorType -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::GetEightNeighborOffsetFromDirection(double direction, unsigned int flagReverse) -{ - int neighborhoodNumber = 0; - OffsetVectorType offset; - offset.reserve(8); - if (direction > 0) - { - //find the direction in terms of 0, 1, 2, 3 - neighborhoodNumber = (int) (direction / (CONST_PI_4) -1); - } - else - { - neighborhoodNumber = (int) ((direction + CONST_PI) / (CONST_PI_4) -1); - neighborhoodNumber = (neighborhoodNumber + 4); - //if the direction was <0 need to convert to 4, 5, 6, 7 - } - if (flagReverse) - { - //if the reverse flag is activated we need to look on the other side - neighborhoodNumber = (neighborhoodNumber + 4) % 8; - } - OffsetType tmpOffset; - switch (neighborhoodNumber) - { - case 0: - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - tmpOffset[0] = 2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - - break; - - case 1: - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - tmpOffset[0] = 2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - break; - - case 2: - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - - tmpOffset[0] = 0; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - break; - - case 3: - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - tmpOffset[0] = -2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - break; - - case 4: - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - tmpOffset[0] = -2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = -2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - break; - - case 5: - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - tmpOffset[0] = -2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - break; - - case 6: - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - - tmpOffset[0] = 0; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - break; - - case 7: - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - tmpOffset[0] = 2; - tmpOffset[1] = -2; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 2; - tmpOffset[1] = 2; - offset.push_back(tmpOffset); - break; - } - return offset; -} - -/** - * Compute the 3 neighbors to explore from the direction and the type of search (forward or backward). - * \param direction The direction - * \param flagReverse The type of search - * \return The neighborhood - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -typename VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::OffsetVectorType -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::GetThreeNeighborOffsetFromDirection(double direction, unsigned int flagReverse) -{ - int neighborhoodNumber = 0; - OffsetVectorType offset; - offset.reserve(3); - if (direction > 0) - { - //find the direction in terms of 0, 1, 2, 3 - neighborhoodNumber = (int) (direction / (CONST_PI_4) -1); - } - else - { - neighborhoodNumber = (int) ((direction + CONST_PI) / (CONST_PI_4) -1); - neighborhoodNumber = (neighborhoodNumber + 4); - //if the direction was <0 need to convert to 4, 5, 6, 7 - } - if (flagReverse) - { - //if the reverse flag is activated we need to look on the other side - neighborhoodNumber = (neighborhoodNumber + 4) % 8; - } - OffsetType tmpOffset; -// otbMsgDevMacro(<<"Direction: " << neighborhoodNumber) - switch (neighborhoodNumber) - { - case 0: - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - break; - - case 1: - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - break; - - case 2: - tmpOffset[0] = 0; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - - break; - - case 3: - tmpOffset[0] = -1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - break; - - case 4: - tmpOffset[0] = -1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - break; - - case 5: - tmpOffset[0] = -1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - - break; - - case 6: - tmpOffset[0] = 0; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - - break; - - case 7: - tmpOffset[0] = 1; - tmpOffset[1] = -1; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 0; - offset.push_back(tmpOffset); - tmpOffset[0] = 1; - tmpOffset[1] = 1; - offset.push_back(tmpOffset); - - break; - } - return offset; -} - -/** - * PrintSelf Method - */ -template <class TInputModulus, class TInputDirection, class TOutputPath> -void -VectorizationPathListFilter<TInputModulus, TInputDirection, TOutputPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // End namespace otb -#endif diff --git a/Modules/Filtering/Path/test/CMakeLists.txt b/Modules/Filtering/Path/test/CMakeLists.txt index 699c24a3ca0a9e7761c463280b97dc4e468282da..79fe10a22d30c9ca5bd5d652c8e663fea243964d 100644 --- a/Modules/Filtering/Path/test/CMakeLists.txt +++ b/Modules/Filtering/Path/test/CMakeLists.txt @@ -36,7 +36,6 @@ otbDrawPathFilter.cxx otbOrientationPath.cxx otbPolyLineImageConstIterator.cxx otbRegionImageToRectangularPathListFilter.cxx -otbVectorizationPathListFilter.cxx otbClosePathFunctor.cxx otbPolyLineImageIterator.cxx ) @@ -62,12 +61,12 @@ otb_add_test(NAME feTvImageToEdgePathFilterBis COMMAND otbPathTestDriver otb_add_test(NAME feTvImageToEdgePathFilter COMMAND otbPathTestDriver --compare-image ${EPSILON_8} - ${BASELINE}/feImageToEdgePathFilter_rcc8_mire4.png - ${TEMP}/feImageToEdgePathFilter_rcc8_mire4.png + ${BASELINE}/feImageToEdgePathFilterOutput.tif + ${TEMP}/feImageToEdgePathFilterOutput.tif otbImageToEdgePathFilter - ${INPUTDATA}/rcc8_mire4.png - ${TEMP}/feImageToEdgePathFilter_rcc8_mire4.png - 255 + ${INPUTDATA}/labelImage_UnsignedChar.tif + ${TEMP}/feImageToEdgePathFilterOutput.tif + 3 ) otb_add_test(NAME feTuCompacityPathCircle COMMAND otbPathTestDriver @@ -165,31 +164,6 @@ otb_add_test(NAME feTvRegionImageToRectangularPathListFilter COMMAND otbPathTest 0.9 #fit score 10) #minimum size -otb_add_test(NAME feTvVectorizationPathListFilterImageOutput COMMAND otbPathTestDriver - --compare-image ${EPSILON_8} - ${BASELINE}/feTvVectorizationPathListOutput.png - ${TEMP}/feTvVectorizationPathListOutput.png - otbVectorizationPathListFilter - ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr - ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr - ${TEMP}/feTvVectorizationPathListOutputIgnored.txt - ${TEMP}/feTvVectorizationPathListOutput.png - 0.0001 - ) - -otb_add_test(NAME feTvVectorizationPathListFilterAsciiOutput COMMAND otbPathTestDriver - --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/feTvVectorizationPathListOutput.txt - ${TEMP}/feTvVectorizationPathListOutput.txt - otbVectorizationPathListFilter - ${INPUTDATA}/InputForRoadDetection_NonMaxRem.raw.hdr - ${INPUTDATA}/InputForRoadDetectionScalarProductDir.raw.hdr - ${TEMP}/feTvVectorizationPathListOutput.txt - ${TEMP}/feTvVectorizationPathListOutputIgnored.png - 0.0005 - ) - - otb_add_test(NAME bfTvClosePathFunctor COMMAND otbPathTestDriver --compare-ascii ${NOTOL} ${BASELINE_FILES}/bfClosePathFunctorTest.txt diff --git a/Modules/Filtering/Path/test/otbPathTestDriver.cxx b/Modules/Filtering/Path/test/otbPathTestDriver.cxx index 5d1b508991581b0c74237020d6a8eb0d819f6c48..36352f2ca861edbda39448ed175d19b844c00ee3 100644 --- a/Modules/Filtering/Path/test/otbPathTestDriver.cxx +++ b/Modules/Filtering/Path/test/otbPathTestDriver.cxx @@ -36,7 +36,6 @@ void RegisterTests() REGISTER_TEST(otbOrientationPath); REGISTER_TEST(otbPolyLineImageConstIterator); REGISTER_TEST(otbRegionImageToRectangularPathListFilter); - REGISTER_TEST(otbVectorizationPathListFilter); REGISTER_TEST(otbClosePathFunctor); REGISTER_TEST(otbPolyLineImageIterator); } diff --git a/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx b/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx deleted file mode 100644 index d4bf64c81c83e7628b6561ed906de841d124190a..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Path/test/otbVectorizationPathListFilter.cxx +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbVectorizationPathListFilter.h" -#include "itkPolyLineParametricPath.h" -#include "otbImageFileReader.h" -#include <fstream> - -#include "otbDrawPathListFilter.h" -#include "otbImageFileWriter.h" - -int otbVectorizationPathListFilter(int itkNotUsed(argc), char * argv[]) -{ - const char * modfname = argv[1]; - const char * dirfname = argv[2]; - const char * outfname = argv[3]; - const char * outImagefname = argv[4]; - const double thresh = atof(argv[5]); - - const unsigned int Dimension = 2; - typedef double PixelType; - typedef unsigned char OutputPixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::Image<OutputPixelType, Dimension> OutputImageType; - typedef otb::ImageFileWriter<OutputImageType> WriterType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef itk::PolyLineParametricPath<Dimension> PathType; - typedef otb::DrawPathListFilter<OutputImageType, PathType, OutputImageType> DrawFilterType; - typedef otb::VectorizationPathListFilter<ImageType, ImageType, PathType> VectorizationPathListFilterType; - typedef VectorizationPathListFilterType::OutputPathListType PathListType; - typedef PathListType::ConstIterator PathListIteratorType; - typedef PathType::VertexListType VertexListType; - typedef VertexListType::ConstIterator VertexIteratorType; - // Instantiating objects - VectorizationPathListFilterType::Pointer filter = VectorizationPathListFilterType::New(); - ReaderType::Pointer modReader = ReaderType::New(); - ReaderType::Pointer dirReader = ReaderType::New(); - - modReader->SetFileName(modfname); - dirReader->SetFileName(dirfname); - - filter->SetInput(modReader->GetOutput()); - filter->SetInputDirection(dirReader->GetOutput()); - filter->SetAmplitudeThreshold(thresh); - filter->Update(); - - PathListType::Pointer pathList = filter->GetOutput(); - PathListIteratorType pathListIt = pathList->Begin(); - - std::ofstream file; - file.open(outfname); - unsigned int counter = 0; - - while (pathListIt != pathList->End()) - { - file << "Path " << counter << ": "; - for (VertexIteratorType vIt = pathListIt.Get()->GetVertexList()->Begin(); - vIt != pathListIt.Get()->GetVertexList()->End(); - ++vIt) - { - if (vIt != pathListIt.Get()->GetVertexList()->Begin()) - { - file << ", "; - } - file << vIt.Value(); - } - file << std::endl; - ++pathListIt; - ++counter; - } - file.close(); - - OutputImageType::Pointer output = OutputImageType::New(); - output->SetRegions(modReader->GetOutput()->GetLargestPossibleRegion()); - output->Allocate(); - output->FillBuffer(255); - - DrawFilterType::Pointer drawer = DrawFilterType::New(); - drawer->SetInput(output); - drawer->SetInputPath(filter->GetOutput()); - drawer->SetPathValue(0); - - WriterType::Pointer writer = WriterType::New(); - writer->SetFileName(outImagefname); - writer->SetInput(drawer->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h b/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h deleted file mode 100644 index 056a1003cbb58712343a0cc63fa3193483d6eb17..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.h +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbOrthoRectificationFilter_h -#define otbOrthoRectificationFilter_h - -#include <sstream> -#include <stdio.h> - -#include "otbGenericRSResampleImageFilter.h" -#include "otbCompositeTransform.h" -#include "otbInverseSensorModel.h" - -#include "otbVectorImage.h" -#include "otbImage.h" - -namespace otb -{ -/** \class OrthoRectificationFilter - * - * \brief Class for Orthorectifying an image - * - * This class is used to apply map projection and sensor model transformation - * to orthorectify an image, with or without DEM. - * - * \ingroup Projection - * - * \example Projections/OrthoRectificationExample.cxx - * - * - * \ingroup OTBProjection - */ - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision = double> -class ITK_EXPORT OrthoRectificationFilter : - public GenericRSResampleImageFilter<TInputImage, TOutputImage> -{ -public: - /** Standard class typedefs */ - typedef GenericRSResampleImageFilter<TInputImage, - TOutputImage> Superclass; - typedef OrthoRectificationFilter Self; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** types definitions */ - typedef typename TInputImage::IndexType IndexType; - typedef typename TInputImage::SizeType SizeType; - typedef typename TInputImage::SpacingType SpacingType; - typedef typename TInputImage::PointType PointType; - typedef typename TInputImage::RegionType RegionType; - - typedef typename TOutputImage::PixelType OutputPixelType; - - /** output map projection */ - typedef TMapProjection MapProjectionType; - typedef typename TMapProjection::Pointer MapProjectionPointerType; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(OrthoRectificationFilter, GenericRSResampleImageFilter); - - /** Accessors */ - virtual void SetMapProjection(MapProjectionType* arg) - { - if (this->m_MapProjection != arg) - { - this->m_MapProjection = arg; - this->Modified(); - } - } - itkGetObjectMacro(MapProjection, MapProjectionType); - -protected: - OrthoRectificationFilter(); - ~OrthoRectificationFilter() override; - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - void GenerateInputRequestedRegion() override; - void GenerateOutputInformation(void) override; - -private: - OrthoRectificationFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - /** Map Projection used to transform cartographic coordinates in geographic coordinates */ - MapProjectionPointerType m_MapProjection; - -}; - -} // namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbOrthoRectificationFilter.hxx" -#endif - -#endif diff --git a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx b/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx deleted file mode 100644 index c383f86a9cb2bfb58e39c9511eda1f4088cef048..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Projection/include/otbOrthoRectificationFilter.hxx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbOrthoRectificationFilter_hxx -#define otbOrthoRectificationFilter_hxx - -#include "otbOrthoRectificationFilter.h" -#include "itkMetaDataObject.h" - -namespace otb -{ - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision> -OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision> -::OrthoRectificationFilter(): m_MapProjection(nullptr) -{} - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision> -OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision> -::~OrthoRectificationFilter() -{} - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision> -void OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "OrthoRectification" << "\n"; -} - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision> -void -OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision> -::GenerateInputRequestedRegion() -{ - Superclass::GenerateInputRequestedRegion(); -} - -template <class TInputImage, class TOutputImage, class TMapProjection, class TInterpolatorPrecision> -void -OrthoRectificationFilter<TInputImage, TOutputImage, TMapProjection, TInterpolatorPrecision> -::GenerateOutputInformation() -{ - // call the superclass' implementation of this method - Superclass::GenerateOutputInformation(); - - if(!m_MapProjection.IsNull() && !m_MapProjection->GetWkt().empty()) - { - // fill up the metadata information for ProjectionRef - itk::MetaDataDictionary& dict = this->GetOutput()->GetMetaDataDictionary(); - std::string projectionRef = m_MapProjection->GetWkt(); - itk::EncapsulateMetaData<std::string>(dict, MetaDataKey::ProjectionRefKey, projectionRef); - - // Fill the GenericRSTransform with those information - this->SetOutputProjectionRef(projectionRef); - this->UpdateTransform(); - } -} - -} //namespace otb - -#endif diff --git a/Modules/Filtering/Projection/test/CMakeLists.txt b/Modules/Filtering/Projection/test/CMakeLists.txt index e2e346b3c1805dd0124080886dde1d0356cdd5ee..b2e82e3676835ab5d7883aee53e014939ae41d3e 100644 --- a/Modules/Filtering/Projection/test/CMakeLists.txt +++ b/Modules/Filtering/Projection/test/CMakeLists.txt @@ -24,7 +24,6 @@ set(OTBProjectionTests otbSensorModel.cxx otbProjectionTestDriver.cxx otbVectorDataProjectionFilterFromGeoToMap.cxx -otbOrthoRectificationFilter.cxx otbGenericRSResampleImageFilter.cxx otbGeometriesProjectionFilter.cxx otbGenericRSTransformGenericTest.cxx @@ -44,7 +43,6 @@ otbVectorDataProjectionFilterFromMapToImage.cxx otbGenericRSTransformFromImage.cxx otbCompositeTransform.cxx otbLeastSquareAffineTransformEstimator.cxx -otbSpectralAngleDataNodeFeatureFunction.cxx otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx otbGeographicalDistance.cxx otbTileImageFilterRSTransformTest.cxx @@ -188,6 +186,16 @@ RAPIDEYE/level1B/2008-12-25T005918_RE3_1B-NAC_397971_12345_band3.ntf SENTINEL1/S1A_S6_SLC__1SSV_20150619T195043/measurement/s1a-s6-slc-vv-20150619t195043-20150619t195101-006447-00887d-001.tiff ) +set(TOLERANCE_RATIO +0 +0 +0 +0 +0 +0 +0.0002 +) + set(IMG_TYPE "pleiades-1" "wv2-1" @@ -303,6 +311,8 @@ foreach(current_img ${IMG_TEST_ORTHO}) list(GET RESOL ${IMGNB} current_resol ) list(GET GRIDSPACING ${IMGNB} current_grid_spacing) list(GET ISCOMPLEX ${IMGNB} current_is_compex) + list(GET TOLERANCE_RATIO ${IMGNB} current_tolerance_ratio) + math(EXPR IMGNB "${IMGNB} + 1") set( MODENB 0) @@ -313,7 +323,8 @@ foreach(current_img ${IMG_TEST_ORTHO}) otb_add_test(NAME prTvOrthoRectification_${current_imgtype}_${current_mode} COMMAND otbProjectionTestDriver --compare-image ${EPSILON_4} ${BASELINE}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif ${TEMP}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif - otbOrthoRectificationFilter + --tolerance-ratio ${current_tolerance_ratio} + otbGenericRSResampleImageFilter LARGEINPUT{${current_img}?&geom=${INPUTDATA}/${current_geomgcp}.geom} ${TEMP}/prTvOrthoRectification_${current_imgtype}_${current_mode}.tif ${current_originx} @@ -336,19 +347,6 @@ endforeach() #----------------- OrthoRectification tests (end) ----------------------- #------------------------------------------------------------------------ -otb_add_test(NAME prTvotbGenericRSResampleImageFilter COMMAND otbProjectionTestDriver - --compare-image ${EPSILON_4} - ${BASELINE}/prTvotbGenericRSResampleImageFilterOutput.tif - ${TEMP}/prTvotbGenericRSResampleImageFilterOutput.tif - otbGenericRSResampleImageFilter - LARGEINPUT{QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF} - 1000 - 15 - 0 - 1 - ${TEMP}/prTvotbGenericRSResampleImageFilterOutput.tif - ) - otb_add_test(NAME prTvGeometriesProjectionFilterLines COMMAND otbProjectionTestDriver --compare-ogr ${EPSILON_9} ${BASELINE_FILES}/prTvVectorDataProjectionFilterLines.shp @@ -583,29 +581,6 @@ otb_add_test(NAME prTvLeastSquareAffineTransformEstimator COMMAND otbProjectionT 352 807 919 10023 12102 14181 ) -otb_add_test(NAME bfTvSpectralAngleDataNodeFeatureFunction_Polygon COMMAND otbProjectionTestDriver - --compare-ogr ${EPSILON_3} - ${BASELINE_FILES}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp - ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp - otbSpectralAngleDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Polygon.shp - 0 ) - -otb_add_test(NAME bfTvSpectralAngleDataNodeFeatureFunction_Line COMMAND otbProjectionTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp - ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp - otbSpectralAngleDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvSpectralAngleDataNodeFeatureFunctionOutput_Line.shp - 0 - ) - set(VALID_CONDITION err=12) if(OTB_OSSIM_VERSION LESS 20200) set(VALID_CONDITION err=10) @@ -1209,28 +1184,3 @@ set(GenericConversionChecking_INPUTS #${INPUTDATA}/DEM/srtm_directory #3 ) #endforeach() - - - - set(SENSOR_TYPES - "QUICKBIRD/TOULOUSE/000000128955_01_P001_PAN/02APR01105228-P1BS-000000128955_01_P001.TIF" - "GEOEYE/LES_ROCHES/po_350134_bgrn_0000000.tif" - "WORLDVIEW2/ROME/WV-2_standard_8band_bundle_16bit/052298844010_01_P001_MUL/09DEC10103019-M2AS-052298844010_01_P001.TIF" - ) - - foreach( file ${SENSOR_TYPES}) - # Get the sensor name - set(sharp_regexp "([0-9A-Za-z_]*)[ ]*/[ ]*(.*)") - string(REGEX REPLACE "${sharp_regexp}" "\\1" sensor_name "${file}") - # Tests - otb_add_test(NAME prTvotbGenericRSResampleImageFilterFromMap_${sensor_name} COMMAND otbProjectionTestDriver - --compare-image ${EPSILON_4} - ${BASELINE}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif - ${TEMP}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif - otbGenericRSResampleImageFilterFromMap - LARGEINPUT{${file}} - 15 - 0 - ${TEMP}/prTvotbGenericRSResampleImageFilterOutputFromMap_${sensor_name}.tif - ) - endforeach() diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx index 20dc63f23e52b24bdfadf74aabb6159f61f6372b..f9eb115fcf556b9104b6b157d4fa0425e3ebd0a1 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx @@ -21,8 +21,7 @@ #include "otbImageFileReader.h" #include "otbGCPsToRPCSensorModelImageFilter.h" #include "otbImageFileWriter.h" -#include "otbGenericMapProjection.h" -#include "otbOrthoRectificationFilter.h" +#include "otbGenericRSResampleImageFilter.h" #include "otbMacro.h" int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) @@ -47,8 +46,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) typedef GCPsToSensorModelFilterType::Point2DType Point2DType; typedef GCPsToSensorModelFilterType::Point3DType Point3DType; typedef otb::ImageFileWriter<ImageType> WriterType; - typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> MapProjectionType; - typedef otb::OrthoRectificationFilter<ImageType, ImageType, MapProjectionType> OrthoRectifFilterType; + typedef otb::GenericRSResampleImageFilter<ImageType, ImageType> OrthoRectifFilterType; ReaderType::Pointer reader = ReaderType::New(); reader->SetFileName(infname); @@ -91,9 +89,6 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); - - MapProjectionType::Pointer utmMapProjection = MapProjectionType::New(); - orthoRectifFilter->SetInput(rpcEstimator->GetOutput()); ImageType::IndexType start; @@ -116,9 +111,9 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) origin[1] = strtod(argv[4], nullptr); //Origin northing orthoRectifFilter->SetOutputOrigin(origin); - utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[9]),argv[10][0]=='N'?otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt()); + std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[9]),argv[10][0]=='N'?otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt(); - orthoRectifFilter->SetMapProjection(utmMapProjection); + orthoRectifFilter->SetOutputProjectionRef(wkt); ImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); no_data.Fill(0.0); diff --git a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx index c61ad46200e62e100276c9cb1a3a661071918535..31027d1eae899c096547675667a3c57403498061 100644 --- a/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx +++ b/Modules/Filtering/Projection/test/otbGenericRSResampleImageFilter.cxx @@ -19,183 +19,124 @@ */ -#include "otbGenericRSResampleImageFilter.h" + +// iostream is used for general output +#include <iostream> +#include <stdlib.h> +#include <complex> #include "otbImageFileReader.h" #include "otbImageFileWriter.h" +#include "otbGenericMapProjection.h" +#include "itkUnaryFunctorImageFilter.h" -#include <ogr_spatialref.h> - -// Extract ROI -#include "otbMultiChannelExtractROI.h" - -// Images definition -const unsigned int Dimension = 2; -typedef double PixelType; -typedef otb::VectorImage<PixelType, Dimension> ImageType; -typedef ImageType::SizeType SizeType; - -typedef otb::GenericRSResampleImageFilter<ImageType, - ImageType> ImageResamplerType; -typedef ImageResamplerType::OriginType OriginType; -typedef ImageResamplerType::SpacingType SpacingType; - -typedef otb::ImageFileReader<ImageType> ReaderType; -typedef otb::ImageFileWriter<ImageType> WriterType; - +#include "otbDEMHandler.h" +#include "otbUnaryImageFunctorWithVectorImageFilter.h" +#include "otbGenericRSResampleImageFilter.h" +#include "otbComplexToIntensityImageFilter.h" +#include "otbPerBandVectorImageFilter.h" -int otbGenericRSResampleImageFilter(int itkNotUsed(argc), char* argv[]) +int otbGenericRSResampleImageFilter(int argc, char* argv[]) { + if (argc != 15) + { + std::cout << argv[0] << + " <input filename> <output filename> <origin easting> <origin northing>" + " <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>" + " <grid_spacing> <mode> <mode.info> <is_complex>" + << std::endl; - // SmartPointer instantiation - ImageResamplerType::Pointer resampler = ImageResamplerType::New(); - - const char * infname = argv[1]; - const char * outfname = argv[6]; - unsigned int isize = atoi(argv[2]); - double iGridSpacing = atof(argv[3]); - int useInRpc = atoi(argv[4]); - int useOutRpc = atoi(argv[5]); - - - ReaderType::Pointer reader = ReaderType::New(); - - // Read the input image - reader->SetFileName(infname); - reader->UpdateOutputInformation(); - - // Fill the output size with the user selection - SizeType size; - size.Fill(isize); - - // Set the origin & the spacing of the output - OriginType origin; - origin[0] = 367340; - origin[1] = 4.83467e+06; - - SpacingType spacing; - spacing[0] = 0.6; - spacing[1] = -0.6; - - // Build the output projection ref : UTM ref - OGRSpatialReference oSRS; - oSRS.SetProjCS("UTM"); - oSRS.SetUTM(31, true); - char * utmRef = nullptr; - oSRS.exportToWkt(&utmRef); + return EXIT_FAILURE; + } - // Displacement Field spacing - SpacingType gridSpacing; - gridSpacing[0] = iGridSpacing; - gridSpacing[1] = -iGridSpacing; - - // Default value builder - ImageType::PixelType defaultValue; - itk::NumericTraits<ImageType::PixelType>::SetLength(defaultValue, reader->GetOutput()->GetNumberOfComponentsPerPixel()); - - // Set the Resampler Parameters - resampler->SetInput(reader->GetOutput()); - resampler->SetDisplacementFieldSpacing(gridSpacing); - resampler->SetOutputOrigin(origin); - resampler->SetOutputSize(size); - resampler->SetOutputSpacing(spacing); - resampler->SetOutputProjectionRef(utmRef); - resampler->SetEdgePaddingValue(defaultValue); - if (useInRpc) + typedef std::complex<double> ComplexPixelType; + typedef otb::VectorImage<ComplexPixelType,2> ComplexVectorImageType; + typedef otb::VectorImage<double, 2> VectorImageType; + typedef otb::ImageFileReader<VectorImageType> ReaderType; + typedef otb::ImageFileReader<ComplexVectorImageType> ComplexReaderType; + typedef otb::ImageFileWriter<VectorImageType> WriterType; + + // Handling of complex images + typedef otb::Image<ComplexPixelType> ComplexImageType; + typedef otb::Image<double> ImageType; + typedef otb::ComplexToIntensityImageFilter<ComplexImageType, ImageType> IntensityFilterType; + typedef otb::PerBandVectorImageFilter<ComplexVectorImageType,VectorImageType,IntensityFilterType> PerBandIntensityFilterType; + typedef otb::GenericRSResampleImageFilter<VectorImageType, VectorImageType> OrthoRectifFilterType; + + //Allocate pointer + ReaderType::Pointer reader = ReaderType::New(); + ComplexReaderType::Pointer cReader = ComplexReaderType::New(); + WriterType::Pointer writer = WriterType::New(); + PerBandIntensityFilterType::Pointer intensityFilter = PerBandIntensityFilterType::New(); + + OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); + + writer->SetFileName(argv[2]); + + bool isComplex = atoi(argv[14]); + + if(isComplex) { - resampler->SetInputRpcGridSize(20); - resampler->EstimateInputRpcModelOn(); + cReader->SetFileName(argv[1]); + cReader->GenerateOutputInformation(); + intensityFilter->SetInput(cReader->GetOutput()); + VectorImageType::PixelType no_data(cReader->GetOutput()->GetNumberOfComponentsPerPixel()); + no_data.Fill(0); + orthoRectifFilter->SetEdgePaddingValue(no_data); + orthoRectifFilter->SetInput(intensityFilter->GetOutput()); } - - if (useOutRpc) + else { - resampler->SetOutputRpcGridSize(20); - resampler->EstimateOutputRpcModelOn(); + reader->SetFileName(argv[1]); + reader->GenerateOutputInformation(); + VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); + no_data.Fill(0); + orthoRectifFilter->SetEdgePaddingValue(no_data); + orthoRectifFilter->SetInput(reader->GetOutput()); } + VectorImageType::IndexType start; + start[0] = 0; + start[1] = 0; + orthoRectifFilter->SetOutputStartIndex(start); - // Write the resampled image - WriterType::Pointer writer= WriterType::New(); - writer->SetNumberOfDivisionsTiledStreaming(4); - writer->SetFileName(outfname); - writer->SetInput(resampler->GetOutput()); - writer->Update(); + VectorImageType::SizeType size; + size[0] = atoi(argv[5]); // X size + size[1] = atoi(argv[6]); //Y size + orthoRectifFilter->SetOutputSize(size); - std::cout << resampler << std::endl; + VectorImageType::SpacingType spacing; + spacing[0] = atof(argv[7]); + spacing[1] = atof(argv[8]); + orthoRectifFilter->SetOutputSpacing(spacing); - return EXIT_SUCCESS; -} - - -int otbGenericRSResampleImageFilterFromMap(int itkNotUsed(argc), char* argv[]) -{ - typedef otb::MultiChannelExtractROI<PixelType, PixelType> ExtractROIType; - - // SmartPointer instantiation - ExtractROIType::Pointer extractor = ExtractROIType::New(); - ImageResamplerType::Pointer resampler = ImageResamplerType::New(); + VectorImageType::PointType origin; + origin[0] = strtod(argv[3], nullptr); //Origin easting + origin[1] = strtod(argv[4], nullptr); //Origin northing + orthoRectifFilter->SetOutputOrigin(origin); - const char * infname = argv[1]; - const char * outfname = argv[4]; - double iGridSpacing = atof(argv[2]); - int useInRpc = atoi(argv[3]); - - // Reader Instantiation - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(infname); - reader->UpdateOutputInformation(); - - SpacingType spacing; - spacing[0] = 2.5; - spacing[1] = -2.5; + std::string wkt = otb::SpatialReference::FromUTM(atoi(argv[9]),atoi(argv[10]) ? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt(); + orthoRectifFilter->SetOutputProjectionRef(wkt); // Displacement Field spacing - SpacingType gridSpacing; - gridSpacing[0] = iGridSpacing; - gridSpacing[1] = -iGridSpacing; - - // Default value builder - ImageType::PixelType defaultValue; - itk::NumericTraits<ImageType::PixelType>::SetLength(defaultValue, reader->GetOutput()->GetNumberOfComponentsPerPixel()); - - // Extract a roi centered on the input center - ImageType::RegionType roi; - ImageType::IndexType roiIndex; - SizeType roiSize; - - // Fill the size - roiSize.Fill(250); - - // Fill the start index - roiIndex[0] = (unsigned int)((reader->GetOutput()->GetLargestPossibleRegion().GetSize()[0] - roiSize[0]) /2); - roiIndex[1] = (unsigned int)((reader->GetOutput()->GetLargestPossibleRegion().GetSize()[1] - roiSize[1]) /2); - - roi.SetIndex(roiIndex); - roi.SetSize(roiSize); - - extractor->SetExtractionRegion(roi); - extractor->SetInput(reader->GetOutput()); - extractor->UpdateOutputInformation(); - - // Set the Resampler Parameters - resampler->SetInput(extractor->GetOutput()); - resampler->SetDisplacementFieldSpacing(gridSpacing); - resampler->SetOutputParametersFromMap("UTM", spacing); - - if (useInRpc) - { - resampler->SetInputRpcGridSize(20); - resampler->EstimateInputRpcModelOn(); - } - - // Write the resampled image - WriterType::Pointer writer= WriterType::New(); - writer->SetAutomaticTiledStreaming(); - writer->SetFileName(outfname); - writer->SetInput(resampler->GetOutput()); + VectorImageType::SpacingType gridSpacing; + gridSpacing[0] = atof(argv[11]); + gridSpacing[1] = -atof(argv[11]); + orthoRectifFilter->SetDisplacementFieldSpacing(gridSpacing); + + // manage demHandler + if (atoi(argv[12])==1) //mode = no DEM + { + otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(135.8); + } + else if ( (atoi(argv[12])==2) || (atoi(argv[12])==3) ) //mode = DEM SRTM || DEM GTIFF + { + otb::DEMHandler::Instance()->OpenDEMDirectory(argv[13]); + } + + writer->SetInput(orthoRectifFilter->GetOutput()); + writer->SetNumberOfDivisionsTiledStreaming(4); writer->Update(); - std::cout << resampler << std::endl; - return EXIT_SUCCESS; } diff --git a/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx b/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx deleted file mode 100644 index e832b5dc0ff2163ec5abe0c0518544932f845552..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Projection/test/otbOrthoRectificationFilter.cxx +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -// iostream is used for general output -#include <iostream> -#include <stdlib.h> -#include <complex> - -#include "otbImageFileReader.h" -#include "otbImageFileWriter.h" -#include "otbGenericMapProjection.h" -#include "itkUnaryFunctorImageFilter.h" -//#include "itkComplexToModulusImageFilter.h" -#include "otbDEMHandler.h" -#include "otbUnaryImageFunctorWithVectorImageFilter.h" -#include "otbOrthoRectificationFilter.h" -#include "otbComplexToIntensityImageFilter.h" -#include "otbPerBandVectorImageFilter.h" - -int otbOrthoRectificationFilter(int argc, char* argv[]) -{ - if (argc != 15) - { - std::cout << argv[0] << - " <input filename> <output filename> <origin easting> <origin northing>" - " <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>" - " <grid_spacing> <mode> <mode.info> <is_complex>" - << std::endl; - - return EXIT_FAILURE; - } - - typedef std::complex<double> ComplexPixelType; - typedef otb::VectorImage<ComplexPixelType,2> ComplexVectorImageType; - typedef otb::VectorImage<double, 2> VectorImageType; - typedef otb::ImageFileReader<VectorImageType> ReaderType; - typedef otb::ImageFileReader<ComplexVectorImageType> ComplexReaderType; - typedef otb::ImageFileWriter<VectorImageType> WriterType; - - // Handling of complex images - typedef otb::Image<ComplexPixelType> ComplexImageType; - typedef otb::Image<double> ImageType; - typedef otb::ComplexToIntensityImageFilter<ComplexImageType, ImageType> IntensityFilterType; - typedef otb::PerBandVectorImageFilter<ComplexVectorImageType,VectorImageType,IntensityFilterType> PerBandIntensityFilterType; - typedef otb::GenericMapProjection<otb::TransformDirection::INVERSE> MapProjectionType; - typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, MapProjectionType> OrthoRectifFilterType; - - //Allocate pointer - ReaderType::Pointer reader = ReaderType::New(); - ComplexReaderType::Pointer cReader = ComplexReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - PerBandIntensityFilterType::Pointer intensityFilter = PerBandIntensityFilterType::New(); - - OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); - - writer->SetFileName(argv[2]); - - bool isComplex = atoi(argv[14]); - - if(isComplex) - { - cReader->SetFileName(argv[1]); - cReader->GenerateOutputInformation(); - intensityFilter->SetInput(cReader->GetOutput()); - VectorImageType::PixelType no_data(cReader->GetOutput()->GetNumberOfComponentsPerPixel()); - no_data.Fill(0); - orthoRectifFilter->SetEdgePaddingValue(no_data); - orthoRectifFilter->SetInput(intensityFilter->GetOutput()); - } - else - { - reader->SetFileName(argv[1]); - reader->GenerateOutputInformation(); - VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); - no_data.Fill(0); - orthoRectifFilter->SetEdgePaddingValue(no_data); - orthoRectifFilter->SetInput(reader->GetOutput()); - } - - VectorImageType::IndexType start; - start[0] = 0; - start[1] = 0; - orthoRectifFilter->SetOutputStartIndex(start); - - VectorImageType::SizeType size; - size[0] = atoi(argv[5]); // X size - size[1] = atoi(argv[6]); //Y size - orthoRectifFilter->SetOutputSize(size); - - VectorImageType::SpacingType spacing; - spacing[0] = atof(argv[7]); - spacing[1] = atof(argv[8]); - orthoRectifFilter->SetOutputSpacing(spacing); - - VectorImageType::PointType origin; - origin[0] = strtod(argv[3], nullptr); //Origin easting - origin[1] = strtod(argv[4], nullptr); //Origin northing - orthoRectifFilter->SetOutputOrigin(origin); - - MapProjectionType::Pointer utmMapProjection = MapProjectionType::New(); - utmMapProjection->SetWkt(otb::SpatialReference::FromUTM(atoi(argv[9]),atoi(argv[10]) ? otb::SpatialReference::hemisphere::north : otb::SpatialReference::hemisphere::south).ToWkt()); - orthoRectifFilter->SetMapProjection(utmMapProjection); - - // Displacement Field spacing - VectorImageType::SpacingType gridSpacing; - gridSpacing[0] = atof(argv[11]); - gridSpacing[1] = -atof(argv[11]); - orthoRectifFilter->SetDisplacementFieldSpacing(gridSpacing); - - // manage demHandler - if (atoi(argv[12])==1) //mode = no DEM - { - otb::DEMHandler::Instance()->SetDefaultHeightAboveEllipsoid(135.8); - } - else if ( (atoi(argv[12])==2) || (atoi(argv[12])==3) ) //mode = DEM SRTM || DEM GTIFF - { - otb::DEMHandler::Instance()->OpenDEMDirectory(argv[13]); - } - - writer->SetInput(orthoRectifFilter->GetOutput()); - writer->SetNumberOfDivisionsTiledStreaming(4); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx index 6f985e5f5c797ef0a758fb4e70eb198d42b629ad..acbe2a16407fa3b09ef58adf069c95c836bc83ab 100644 --- a/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx +++ b/Modules/Filtering/Projection/test/otbProjectionTestDriver.cxx @@ -24,9 +24,7 @@ void RegisterTests() { REGISTER_TEST(otbSensorModel); REGISTER_TEST(otbVectorDataProjectionFilterFromGeoToMap); - REGISTER_TEST(otbOrthoRectificationFilter); REGISTER_TEST(otbGenericRSResampleImageFilter); - REGISTER_TEST(otbGenericRSResampleImageFilterFromMap); REGISTER_TEST(otbGeometriesProjectionFilter); REGISTER_TEST(otbGenericRSTransformGenericTest); REGISTER_TEST(otbVectorDataTransformFilter); @@ -46,7 +44,6 @@ void RegisterTests() REGISTER_TEST(otbGenericRSTransformImageAndMNTToWGS84ConversionChecking); REGISTER_TEST(otbCompositeTransform); REGISTER_TEST(otbLeastSquareAffineTransformEstimator); - REGISTER_TEST(otbSpectralAngleDataNodeFeatureFunction); REGISTER_TEST(otbGCPsToRPCSensorModelImageFilterCheckRpcModel); REGISTER_TEST(otbGeographicalDistance); REGISTER_TEST(otbTileImageFilterRSTransformTest); diff --git a/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx b/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx deleted file mode 100644 index eb239242e2ad774a69c3480b8d447904c0945516..0000000000000000000000000000000000000000 --- a/Modules/Filtering/Projection/test/otbSpectralAngleDataNodeFeatureFunction.cxx +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbSpectralAngleDataNodeFeatureFunction.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbVectorData.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataFileWriter.h" -#include "itkPreOrderTreeIterator.h" - - -int otbSpectralAngleDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputImg = argv[2]; - const char * DEMDir = argv[3]; - const char * outputVD = argv[4]; - int DisplayWarnings = atoi(argv[5]); - - typedef double CoordRepType; - typedef double PrecisionType; - typedef otb::VectorImage<PrecisionType> ImageType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::VectorData<CoordRepType, 2, PrecisionType> - VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> - VectorDataReProjFilter; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> - TreeIteratorType; - - typedef otb::SpectralAngleDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType> - FeaturefunctionType; - typedef FeaturefunctionType::OutputType - FeatureOutputType; - - ImageReaderType::Pointer imgReader = ImageReaderType::New(); - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - FeaturefunctionType::Pointer featureFunction = FeaturefunctionType::New(); - - if (!DisplayWarnings) - { - imgReader->SetGlobalWarningDisplay(0); - } - - otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - imgReader->SetFileName(inputImg); - imgReader->UpdateOutputInformation(); - imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction - - vdReProjFilter->SetInputImage(imgReader->GetOutput()); - vdReProjFilter->SetInputVectorData(vdReader->GetOutput()); - vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true); - vdReProjFilter->Update(); - - std::cout<< "vdReProjFilter->GetOutput()->Size(): " - << vdReProjFilter->GetOutput()->Size() << std::endl; - - featureFunction->SetInputImage(imgReader->GetOutput()); - featureFunction->SetRadius(0); - - // Output - VectorDataType::Pointer outVD = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature()) - { - const DataNodeType::Pointer currentGeometry = itVector.Get(); - FeatureOutputType currentResult; - currentResult = featureFunction->Evaluate(*(currentGeometry.GetPointer())); - currentGeometry->SetFieldAsDouble("RADIOM", (double)(currentResult[0])); - outVD->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - vdWriter->SetInput(outVD); - vdWriter->SetFileName(outputVD); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h deleted file mode 100644 index 5a0d897384035224960895f0ce23a76dacc68d80..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDBOverlapDataNodeFeatureFunction_h -#define otbDBOverlapDataNodeFeatureFunction_h - -#include "otbDataNodeVectorDataFunction.h" - -#include "itkPreOrderTreeIterator.h" - -namespace otb -{ -/** \class DBOverlapDataNodeFeatureFunction - * \brief - * - * - * \ingroup Functions - * \sa DataNodeVectorDataFunction - * - * \ingroup OTBVectorDataManipulation - */ - -template < -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT DBOverlapDataNodeFeatureFunction : - public DataNodeVectorDataFunction<std::vector<TPrecision>, TCoordRep, TPrecision> -{ -public: - /** Standard class typedefs. */ - typedef DBOverlapDataNodeFeatureFunction Self; - typedef DataNodeVectorDataFunction<std::vector<TPrecision>, TCoordRep, TPrecision> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(DBOverlapDataNodeFeatureFunction, DataNodeVectorDataFunction); - - /** Some typedefs. */ - typedef typename Superclass::DataNodeType DataNodeType; - typedef typename DataNodeType::PointType PointType; - typedef typename DataNodeType::LineType LineType; - typedef typename LineType::VertexType VertexType; - typedef typename DataNodeType::PolygonType PolygonType; - - typedef typename Superclass::VectorDataType VectorDataType; - typedef typename VectorDataType::DataTreeType DataTreeType; - typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType> - TreeIteratorType; - - typedef TCoordRep CoordRepType; - - typedef TPrecision PrecisionType; - - typedef std::vector<PrecisionType> OutputType; - - OutputType Evaluate( const DataNodeType& node ) const override; - - /** Set/Get methods */ - itkGetConstMacro(DistanceThreshold, PrecisionType); - itkSetMacro(DistanceThreshold, PrecisionType); - - /** Method to compute the distance of a point to a segment */ - double ComputeEuclideanDistanceMetricToSegment(VertexType q1, VertexType q2, VertexType p) const; - -protected: - DBOverlapDataNodeFeatureFunction(); - ~DBOverlapDataNodeFeatureFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - DBOverlapDataNodeFeatureFunction(const Self&) = delete; - void operator=(const Self&) = delete; - - /** Road / Building distance Threshold */ - PrecisionType m_DistanceThreshold; -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbDBOverlapDataNodeFeatureFunction.hxx" -#endif - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx deleted file mode 100644 index 3ede4ecc7f096b033ae7ff40a85a0c14fc832c04..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbDBOverlapDataNodeFeatureFunction.hxx +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbDBOverlapDataNodeFeatureFunction_hxx -#define otbDBOverlapDataNodeFeatureFunction_hxx - -#include "otbDBOverlapDataNodeFeatureFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TCoordRep, class TPrecision> -DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision> -::DBOverlapDataNodeFeatureFunction() - :m_DistanceThreshold(50)//in physical coordinates -{ -} - -/** - * Standard "PrintSelf" method - */ -template <class TCoordRep, class TPrecision> -void -DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision> -::PrintSelf( - std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf( os, indent ); - os << indent << "Distance Threshold: " << m_DistanceThreshold << std::endl; -} - -/** - * Method to compute the distance of a point to a segment - */ -template <class TCoordRep, class TPrecision> -double -DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision> -::ComputeEuclideanDistanceMetricToSegment(VertexType q1, VertexType q2, VertexType p) const -{ - // Length of the segment - double l2 = q1.SquaredEuclideanDistanceTo(q2); - - // Is the projection of p on the segment inside (0<u<1) or - // inside the segment bounds - double u = ((p[0] - q1[0]) *(q2[0] - q1[0] ) + - (p[1] - q1[1]) *(q2[1] - q1[1])) / l2; - - if( u < 1e-10 ) u = 0.; - if( u -1. > 1e-10 ) u = 1.; - double x = q1[0] + u *(q2[0] - q1[0] ); - double y = q1[1] + u *(q2[1] - q1[1] ); - double dx = x - p[0]; - double dy = y - p[1]; - - return std::sqrt(dx*dx + dy*dy); - } - -template <class TCoordRep, class TPrecision> -typename DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision> -::OutputType -DBOverlapDataNodeFeatureFunction<TCoordRep, TPrecision> -::Evaluate( const DataNodeType& node ) const -{ - OutputType output; - - //build the tmp DataTree containing polygon within the radius - typename VectorDataType::Pointer tmpDataTree = VectorDataType::New(); - typename DataNodeType::Pointer root = tmpDataTree->GetDataTree()->GetRoot()->Get(); - typename DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - tmpDataTree->GetDataTree()->Add(document, root); - - TreeIteratorType itVector(this->GetInputVectorData()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsPolygonFeature()) - { - typename DataNodeType::Pointer currentGeometry = itVector.Get(); - unsigned int i=0; - while (i<currentGeometry->GetPolygonExteriorRing()->GetVertexList()->Size()) - { - unsigned int j=0; - while (j<node.GetLine()->GetVertexList()->Size()-1) - { - double dist; - dist = this->ComputeEuclideanDistanceMetricToSegment(node.GetLine()->GetVertexList()->GetElement(j), - node.GetLine()->GetVertexList()->GetElement(j+1), - currentGeometry->GetPolygonExteriorRing()->GetVertexList()->GetElement(i)); - //std::cout << "dist: " << dist << std::endl; - //std::cout << "m_DistanceThreshold: " << m_DistanceThreshold << std::endl; - if (dist <= m_DistanceThreshold) - { - //Add the current polygon to the tmp DataTree - //jump to the next one - tmpDataTree->GetDataTree()->Add(currentGeometry, document); - j = node.GetLine()->GetVertexList()->Size(); - i = currentGeometry->GetPolygonExteriorRing()->GetVertexList()->Size(); - } - ++j; - } - ++i; - } - } - ++itVector; - } - - /* - std::cout << this->GetInputVectorData()->GetDataTree()->Count() << std::endl; - std::cout << tmpDataTree->GetDataTree()->Count() << std::endl; - */ - unsigned int crossAcc = 0; - unsigned int nbBuildings = 0; - - TreeIteratorType it(tmpDataTree->GetDataTree()); - it.GoToBegin(); - while (!it.IsAtEnd()) - { - if (it.Get()->IsPolygonFeature()) - { - typename DataNodeType::Pointer currentGeometry = it.Get(); - nbBuildings ++; - for (unsigned int i=0; i<node.GetLine()->GetVertexList()->Size()-1; ++i) - { - - if(currentGeometry->GetPolygonExteriorRing()->NbCrossing(node.GetLine()->GetVertexList()->GetElement(i), - node.GetLine()->GetVertexList()->GetElement(i+1))) - { - crossAcc ++; - break; - } - } - } - ++it; - } - - if(nbBuildings == 0) - { - output.push_back(static_cast<PrecisionType>(0.)); - } - else - { - output.push_back(static_cast<PrecisionType>((double)(crossAcc)/(double)(nbBuildings))); - } - - output.push_back(static_cast<PrecisionType>(crossAcc)); - output.push_back(static_cast<PrecisionType>(nbBuildings)); - - return output; -} - - -} // end namespace otb - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h deleted file mode 100644 index 303db1003b0aeae9e2b39c24a551d57bc2b3bb4c..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_h -#define otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_h - -#include "otbDataNodeImageFunction.h" - -#include "otbBinarySpectralAngleFunctor.h" -#include "otbPolyLineImageConstIterator.h" -#include "itkLineConstIterator.h" -#include "itkVariableLengthVector.h" - -namespace otb -{ -/** \class RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction - * \brief Compute the spectral angle between the radiometry along - * a line and its neighborhood - * - * This function compares the radiometry along a datanode with the - * radiometry of the neighborhood. - * - * It computes the mean of a rectangular area around each line segment, - * and the mean of two rectangular areas on each side of the line segment. - * The descriptor is the spectral angle between the two values, - * scaled by \$f\pi\$f. - * - * The width of the area around a line segment can be specified with - * SetCenterRadius. - * - * The neighborhood area can be specified by two radius, using SetNeighborhoodBeginRadius - * and SetNeighborhoodEndRadius. - * - * - * \ingroup Functions - * \sa DataNodeImageFunction - * \sa NDVIDataNodeFeatureFunction - * - * \ingroup OTBVectorDataManipulation - */ - -template < -class TImage, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction : - public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> -{ -public: - /** Standard class typedefs. */ - typedef RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction Self; - typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction, DataNodeImageFunction); - - /** Some typedefs. */ - typedef typename Superclass::DataNodeType DataNodeType; - typedef typename DataNodeType::LineType LineType; - typedef typename LineType::Pointer LinePointer; - typedef typename LineType::ContinuousIndexType ContinuousIndexType; - typedef typename LineType::VertexListConstIteratorType VertexListConstIteratorType; - - typedef TImage InputImageType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::InternalPixelType ScalarRealType; - typedef typename InputImageType::IndexType IndexType; - typedef typename InputImageType::IndexValueType IndexValueType; - - typedef TCoordRep CoordRepType; - - typedef TPrecision PrecisionType; - - typedef itk::VariableLengthVector<PrecisionType> ReferencePixelType; - - typedef PolyLineImageConstIterator<InputImageType, LineType> ImageLineIteratorType; - typedef itk::LineConstIterator<InputImageType> LineIteratorType; - - typedef Functor::BinarySpectralAngleFunctor<PixelType, ReferencePixelType, PrecisionType> - SpectralAngleFunctorType; - - typedef std::pair<IndexType, IndexType> IndexPairType; - typedef std::vector<PrecisionType> OutputType; - - /* Compute the descriptor value along this DataNode */ - OutputType Evaluate( const DataNodeType& node ) const override; - - /* Get the radius used to define the area around a line segment. - * A radius of 0 means that the area is reduced to a line joining - * the two segments extremities. */ - itkGetConstMacro(CenterRadius, unsigned int); - - /* Set the radius used to define the area around a line segment. - * A radius of 0 means that the area is reduced to a line joining - * the two segments extremities. */ - itkSetMacro(CenterRadius, unsigned int); - - /* Get the radius used to define the start of the neighboring area. - * Typically this value must be greater than CenterRadius */ - itkGetConstMacro(NeighborhoodBeginRadius, unsigned int); - - /* Set the radius used to define the start of the neighboring area. - * Typically this value must be greater than CenterRadius */ - itkSetMacro(NeighborhoodBeginRadius, unsigned int); - - /* Get the radius used to define the end of the neighboring area. - * Typically this value must be greater than NeighborhoodBeginRadius */ - itkGetConstMacro(NeighborhoodEndRadius, unsigned int); - - /* Set the radius used to define the end of the neighboring area. - * Typically this value must be greater than NeighborhoodBeginRadius */ - itkSetMacro(NeighborhoodEndRadius, unsigned int); - -protected: - RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction(); - ~RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction(const Self&) = delete; - void operator=(const Self&) = delete; - - /** Center radius */ - unsigned int m_CenterRadius; - - /** Neighborhood start radius */ - unsigned int m_NeighborhoodBeginRadius; - - /** Neighborhood end radius */ - unsigned int m_NeighborhoodEndRadius; - -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx" -#endif - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx deleted file mode 100644 index eadf8f167ae171fba94d11b0f94a362cdea0435e..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.hxx +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_hxx -#define otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_hxx - -#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template<class TImage, class TCoordRep, class TPrecision> -RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction() : - m_CenterRadius(1), m_NeighborhoodBeginRadius(2), m_NeighborhoodEndRadius(3) -{ -} - -/** - * Standard "PrintSelf" method - */ -template<class TImage, class TCoordRep, class TPrecision> -void RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::PrintSelf(std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -template<class TImage, class TCoordRep, class TPrecision> -typename RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::OutputType RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction< - TImage, TCoordRep, TPrecision>::Evaluate(const DataNodeType& node) const -{ - - // TODO faire avce un ikk - const typename ImageLineIteratorType::PathType* path; - - switch (node.GetNodeType()) - { - case FEATURE_POINT: - { - itkExceptionMacro(<< "This DataNode type is not handled yet"); - break; - } - case FEATURE_LINE: - { - path = node.GetLine(); - break; - } - case FEATURE_POLYGON: - { - path = node.GetPolygonExteriorRing(); - break; - } - default: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - } - - std::vector<std::pair<IndexType, IndexType> > splitedLineIdNeigh; - std::vector<std::pair<IndexType, IndexType> > splitedLineIdCentral; - - // Split line and polygon into segment (ie. line with two vertex - VertexListConstIteratorType it1 = path->GetVertexList()->Begin(); - VertexListConstIteratorType it2 = path->GetVertexList()->Begin(); - VertexListConstIteratorType itStop = path->GetVertexList()->End(); - - ++it2; - if (it2 == itStop) - { - itkExceptionMacro(<< "Invalid DataNode, must at least contain two points"); - } - - while (it1 != itStop && it2 != itStop) - { - IndexType id1, id2; - id1[0] = static_cast<int> (it1.Value()[0]); - id1[1] = static_cast<int> (it1.Value()[1]); - id2[0] = static_cast<int> (it2.Value()[0]); - id2[1] = static_cast<int> (it2.Value()[1]); - - // Compute the direction of the current line - itk::Vector<double, 2> direction; - direction[0] = it2.Value()[0] - it1.Value()[0]; - direction[1] = it2.Value()[1] - it1.Value()[1]; - direction.Normalize(); - - // Compute the orthogonal direction of the current line - itk::Vector<double, 2> orthogonalDirection; - orthogonalDirection[0] = direction[1]; - orthogonalDirection[1] = -direction[0]; - - splitedLineIdCentral.push_back(IndexPairType(id1, id2)); - for (unsigned int j = 1; j <= m_CenterRadius; ++j) - { - IndexType shift11, shift12; - shift11[0] = id1[0] - j * orthogonalDirection[0]; - shift11[1] = id1[1] - j * orthogonalDirection[1]; - shift12[0] = id1[0] + j * orthogonalDirection[0]; - shift12[1] = id1[1] + j * orthogonalDirection[1]; - IndexType shift21, shift22; - shift21[0] = id2[0] - j * orthogonalDirection[0]; - shift21[1] = id2[1] - j * orthogonalDirection[1]; - shift22[0] = id2[0] + j * orthogonalDirection[0]; - shift22[1] = id2[1] + j * orthogonalDirection[1]; - - splitedLineIdCentral.push_back(IndexPairType(shift11, shift21)); - splitedLineIdCentral.push_back(IndexPairType(shift12, shift22)); - } - - for (unsigned int j = m_NeighborhoodBeginRadius; j <= m_NeighborhoodEndRadius; ++j) - { - IndexType shift11, shift12; - shift11[0] = id1[0] - j * orthogonalDirection[0]; - shift11[1] = id1[1] - j * orthogonalDirection[1]; - shift12[0] = id1[0] + j * orthogonalDirection[0]; - shift12[1] = id1[1] + j * orthogonalDirection[1]; - IndexType shift21, shift22; - shift21[0] = id2[0] - j * orthogonalDirection[0]; - shift21[1] = id2[1] - j * orthogonalDirection[1]; - shift22[0] = id2[0] + j * orthogonalDirection[0]; - shift22[1] = id2[1] + j * orthogonalDirection[1]; - - splitedLineIdNeigh.push_back(IndexPairType(shift11, shift21)); - splitedLineIdNeigh.push_back(IndexPairType(shift12, shift22)); - } - ++it1; - ++it2; - } - - // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...) - if (node.GetNodeType() == FEATURE_POLYGON) - { - splitedLineIdCentral.pop_back(); - splitedLineIdNeigh.pop_back(); - splitedLineIdNeigh.pop_back(); - } - - double centralNbVisitedPixel = 0.; - - PixelType centralRadiomAcc(this->GetInputImage()->GetNumberOfComponentsPerPixel()); - centralRadiomAcc.Fill(0); - - for (unsigned int i = 0; i < splitedLineIdCentral.size(); ++i) - { - LineIteratorType lineIt(this->GetInputImage(), splitedLineIdCentral[i].first, splitedLineIdCentral[i].second); - lineIt.GoToBegin(); - - while (!lineIt.IsAtEnd()) - { - if (this->IsInsideBuffer(lineIt.GetIndex())) - { - centralRadiomAcc += this->GetInputImage()->GetPixel( lineIt.GetIndex() ); - centralNbVisitedPixel += 1; - } - ++lineIt; - } - } - - double neighNbVisitedPixel = 0.; - - PixelType neighborRadiomAcc(this->GetInputImage()->GetNumberOfComponentsPerPixel()); - neighborRadiomAcc.Fill(0); - - for (unsigned int i = 0; i < splitedLineIdNeigh.size(); ++i) - { - LineIteratorType lineIt(this->GetInputImage(), splitedLineIdNeigh[i].first, splitedLineIdNeigh[i].second); - lineIt.GoToBegin(); - - while (!lineIt.IsAtEnd()) - { - if (this->IsInsideBuffer(lineIt.GetIndex())) - { - neighborRadiomAcc += this->GetInputImage()->GetPixel( lineIt.GetIndex() ); - neighNbVisitedPixel += 1; - } - ++lineIt; - } - } - - OutputType output; - if (centralNbVisitedPixel > 0 && neighNbVisitedPixel > 0) - { - // Compute averaged radiometry in both areas - centralRadiomAcc /= centralNbVisitedPixel; - neighborRadiomAcc /= neighNbVisitedPixel; - - // Compute the spectral angle between the center area and the neighbor area - SpectralAngleFunctorType spectralAngleFunctor; - double angle = spectralAngleFunctor(neighborRadiomAcc, centralRadiomAcc); - - // Make sure we are in [0, 1] interval - angle /= otb::CONST_PI; - - output.push_back(static_cast<PrecisionType> (angle)); - } - else - { - output.push_back(static_cast<PrecisionType> (0.)); - } - - // TODO: handle streaming, need to output the current state - return output; -} - -} // end namespace otb - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h deleted file mode 100644 index 1bc3dce3fea38484b86e8629213bf652ef138aeb..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.h +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbSpectralAngleDataNodeFeatureFunction_h -#define otbSpectralAngleDataNodeFeatureFunction_h - -#include "otbDataNodeImageFunction.h" - -#include "otbBinarySpectralAngleFunctor.h" -#include "otbPolyLineImageConstIterator.h" -#include "itkLineConstIterator.h" -#include "itkVariableLengthVector.h" - -namespace otb -{ -/** \class SpectralAngleDataNodeFeatureFunction - * \brief Compute a spectral angle based feature alongside a - * datanode. - * - * This function compute a spectral angle alongside a datanode. - * The feature is the mean spectral angle regarding a - * reference pixel alongside the tested datanode. - * - * The output has three elements: - * - #0: mean spectral angle of a neighborhood around the datanode, weighted to fit in [0, 1] interval - * - #1: accumulator of the spectral angle alongside the datanode - * - #2: number of visited pixel - * - * \ingroup Functions - * \sa DataNodeImageFunction - * \sa NDVIDataNodeFeatureFunction - * - * \ingroup OTBVectorDataManipulation - */ - -template < -class TImage, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT SpectralAngleDataNodeFeatureFunction : - public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> -{ -public: - /** Standard class typedefs. */ - typedef SpectralAngleDataNodeFeatureFunction Self; - typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(SpectralAngleDataNodeFeatureFunction, DataNodeImageFunction); - - /** Some typedefs. */ - typedef typename Superclass::DataNodeType DataNodeType; - typedef typename DataNodeType::LineType LineType; - typedef typename LineType::Pointer LinePointer; - typedef typename LineType::ContinuousIndexType ContinuousIndexType; - typedef typename LineType::VertexListConstIteratorType VertexListConstIteratorType; - - typedef TImage InputImageType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::InternalPixelType ScalarRealType; - typedef typename InputImageType::IndexType IndexType; - typedef typename InputImageType::IndexValueType IndexValueType; - - typedef TCoordRep CoordRepType; - - typedef TPrecision PrecisionType; - - typedef itk::VariableLengthVector<PrecisionType> ReferencePixelType; - - typedef PolyLineImageConstIterator<InputImageType, LineType> ImageLineIteratorType; - typedef itk::LineConstIterator<InputImageType> LineIteratorType; - - typedef Functor::BinarySpectralAngleFunctor<PixelType, ReferencePixelType, PrecisionType> - SpectralAngleFunctorType; - - typedef std::pair<IndexType, IndexType> IndexPairType; - typedef std::vector<PrecisionType> OutputType; - - OutputType Evaluate( const DataNodeType& node ) const override; - - /** Set/Get methods */ - itkGetConstMacro(RefPixel, PixelType); - itkSetMacro(RefPixel, PixelType); - - itkGetConstMacro(Radius, unsigned int); - itkSetMacro(Radius, unsigned int); - -protected: - SpectralAngleDataNodeFeatureFunction(); - ~SpectralAngleDataNodeFeatureFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - SpectralAngleDataNodeFeatureFunction(const Self&) = delete; - void operator=(const Self&) = delete; - - /** SpectralAngle Functor & ReferencePixel*/ - ReferencePixelType m_RefPixel; - SpectralAngleFunctorType m_SpectralAngleFunctor; - - /** Neighborhood radius */ - unsigned int m_Radius; -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbSpectralAngleDataNodeFeatureFunction.hxx" -#endif - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx b/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx deleted file mode 100644 index c2ed9e81e295505f4fbaad58afeeaa772f77770e..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/include/otbSpectralAngleDataNodeFeatureFunction.hxx +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbSpectralAngleDataNodeFeatureFunction_hxx -#define otbSpectralAngleDataNodeFeatureFunction_hxx - -#include "otbSpectralAngleDataNodeFeatureFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template<class TImage, class TCoordRep, class TPrecision> -SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::SpectralAngleDataNodeFeatureFunction() : - m_Radius(2) -{ - //Example for QuickBird images (on a specific image) - m_RefPixel.SetSize(4); - m_RefPixel.SetElement(0, 252.284); - m_RefPixel.SetElement(1, 357.3); - m_RefPixel.SetElement(2, 232.644); - m_RefPixel.SetElement(3, 261.558); -} - -/** - * Standard "PrintSelf" method - */ -template<class TImage, class TCoordRep, class TPrecision> -void SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::PrintSelf(std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Reference Pixel: " << m_RefPixel << std::endl; -} - -template<class TImage, class TCoordRep, class TPrecision> -typename SpectralAngleDataNodeFeatureFunction<TImage, TCoordRep, TPrecision>::OutputType SpectralAngleDataNodeFeatureFunction< - TImage, TCoordRep, TPrecision>::Evaluate(const DataNodeType& node) const -{ - - // TODO faire avce un ikk - const typename ImageLineIteratorType::PathType* path; - - switch (node.GetNodeType()) - { - case FEATURE_POINT: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - case FEATURE_LINE: - { - path = node.GetLine(); - break; - } - case FEATURE_POLYGON: - { - path = node.GetPolygonExteriorRing(); - break; - } - default: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - } - - std::vector<std::pair<IndexType, IndexType> > splitedLineIdNeigh; - std::vector<std::pair<IndexType, IndexType> > splitedLineIdCentral; - - // Split line and polygon into segment (ie. line with two vertex - VertexListConstIteratorType it1 = path->GetVertexList()->Begin(); - VertexListConstIteratorType it2 = path->GetVertexList()->Begin(); - VertexListConstIteratorType itStop = path->GetVertexList()->End(); - - ++it2; - if (it2 == itStop) - { - itkExceptionMacro(<< "Invalid DataNode, must at least contain two points"); - } - - while (it1 != itStop && it2 != itStop) - { - IndexType id1, id2; - id1[0] = static_cast<int> (it1.Value()[0]); - id1[1] = static_cast<int> (it1.Value()[1]); - id2[0] = static_cast<int> (it2.Value()[0]); - id2[1] = static_cast<int> (it2.Value()[1]); - - // Compute the direction of the current line - itk::Vector<double, 2> direction; - direction[0] = it2.Value()[0] - it1.Value()[0]; - direction[1] = it2.Value()[1] - it1.Value()[1]; - direction.Normalize(); - - // Compute the orthogonal direction of the current line - itk::Vector<double, 2> orthogonalDirection; - orthogonalDirection[0] = direction[1]; - orthogonalDirection[1] = -direction[0]; - - splitedLineIdCentral.push_back(IndexPairType(id1, id2)); - - for (unsigned int j = 1; j <= m_Radius; ++j) - { - IndexType shift11, shift12; - shift11[0] = id1[0] - j * orthogonalDirection[0]; - shift11[1] = id1[1] - j * orthogonalDirection[1]; - shift12[0] = id1[0] + j * orthogonalDirection[0]; - shift12[1] = id1[1] + j * orthogonalDirection[1]; - IndexType shift21, shift22; - shift21[0] = id2[0] - j * orthogonalDirection[0]; - shift21[1] = id2[1] - j * orthogonalDirection[1]; - shift22[0] = id2[0] + j * orthogonalDirection[0]; - shift22[1] = id2[1] + j * orthogonalDirection[1]; - - splitedLineIdCentral.push_back(IndexPairType(shift11, shift21)); - splitedLineIdCentral.push_back(IndexPairType(shift12, shift22)); - } - - ++it1; - ++it2; - } - - // in FEATURE_POLYGON case, first point appears twice (first vertex and last vertew, thus we create a line of 1 point...) - if (node.GetNodeType() == FEATURE_POLYGON) - { - splitedLineIdCentral.pop_back(); - } - - double centralAccSpectralAngle = 0.; - //double centralAccSpectralAngleSecondOrder = 0.; - double centralNbVisitedPixel = 0.; - - for (unsigned int i = 0; i < splitedLineIdCentral.size(); ++i) - { - LineIteratorType lineIt(this->GetInputImage(), splitedLineIdCentral[i].first, splitedLineIdCentral[i].second); - lineIt.GoToBegin(); - - while (!lineIt.IsAtEnd()) - { - if (this->IsInsideBuffer(lineIt.GetIndex())) - { - PixelType currPixel = this->GetInputImage()->GetPixel( lineIt.GetIndex() ); - double angle = m_SpectralAngleFunctor(currPixel, this->GetRefPixel()); - centralAccSpectralAngle += angle; - //centralAccSpectralAngleSecondOrder += angle * angle; - centralNbVisitedPixel += 1; - } - ++lineIt; - } - } - - OutputType output; - - double meanCentral = 0.; - //double stddevCentral = 0.; - if (centralNbVisitedPixel != 0.) - { - meanCentral = static_cast<double> (centralAccSpectralAngle) / centralNbVisitedPixel; - //stddevCentral = std::sqrt( centralAccSpectralAngleSecondOrder/centralNbVisitedPixel - meanCentral*meanCentral ); - } - - if (meanCentral == 0.) - { - output.push_back(static_cast<PrecisionType> (0.)); - } - else - { - // Compute the descriptor here - // meanCentral is in [0, pi] - // We need a descriptor in [0 1] - - double descriptor = meanCentral / otb::CONST_PI; - output.push_back(static_cast<PrecisionType>( descriptor )); - } - - output.push_back(static_cast<PrecisionType> (centralAccSpectralAngle)); - output.push_back(static_cast<PrecisionType> (centralNbVisitedPixel)); - - return output; -} - -} // end namespace otb - -#endif diff --git a/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt b/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt index 8513e931ac8918b27fe82f9d51d17cacbeb759a9..a4f17c2c5abfea6b32e5f7bc1bdd3270b66e4334 100644 --- a/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt +++ b/Modules/Filtering/VectorDataManipulation/test/CMakeLists.txt @@ -22,12 +22,10 @@ otb_module_test() set(OTBVectorDataManipulationTests otbVectorDataManipulationTestDriver.cxx -otbDBOverlapDataNodeFeatureFunction.cxx otbVectorDataExtractROI.cxx otbPolygonCompacityFunctor.cxx otbVectorDataToRandomLineGenerator.cxx otbConcatenateVectorDataFilter.cxx -otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx ) add_executable(otbVectorDataManipulationTestDriver ${OTBVectorDataManipulationTests}) @@ -36,18 +34,6 @@ otb_module_target_label(otbVectorDataManipulationTestDriver) # Tests Declaration -otb_add_test(NAME bfTvDBOverlapDataNodeFeatureFunction COMMAND otbVectorDataManipulationTestDriver - --compare-ogr ${NOTOL} - ${BASELINE_FILES}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp - ${TEMP}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp - otbDBOverlapDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${TEMP}/bfTvDBOverlapDataNodeFeatureFunctionOutput.shp - 0 - ) - - otb_add_test(NAME coTvVectorDataExtractROI COMMAND otbVectorDataManipulationTestDriver --compare-ogr ${NOTOL} ${BASELINE_FILES}/coVectorDataExtractROIOutput.shp @@ -84,12 +70,10 @@ otb_add_test(NAME bfTvVectorDataToRandomLineGenerator COMMAND otbVectorDataManip ${BASELINE_FILES}/bfTvVectorDataToRandomLineGeneratorOutput.shp ${TEMP}/bfTvVectorDataToRandomLineGeneratorOutput.shp otbVectorDataToRandomLineGenerator - ${INPUTDATA}/ObjectReco/Boats/maur_B010202_01Polygons.shp + ${INPUTDATA}/Capitole-Shadows.shp ${TEMP}/bfTvVectorDataToRandomLineGeneratorOutput.shp ) - - otb_add_test(NAME bfTvConcatenateVectorDataFilter COMMAND otbVectorDataManipulationTestDriver --compare-ogr ${NOTOL} ${BASELINE_FILES}/otbConcatenateVectorDataFilter_Output.shp @@ -99,24 +83,3 @@ otb_add_test(NAME bfTvConcatenateVectorDataFilter COMMAND otbVectorDataManipulat ${INPUTDATA}/waterways.shp ${TEMP}/otbConcatenateVectorDataFilter_Output.shp ) - -otb_add_test(NAME bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_Polygon COMMAND otbVectorDataManipulationTestDriver - --compare-ogr ${EPSILON_3} - ${BASELINE_FILES}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp - ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp - otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Polygon.shp - 0 ) -otb_add_test(NAME bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction_Line COMMAND otbVectorDataManipulationTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp - ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp - otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunctionOutput_Line.shp - 0 ) diff --git a/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx b/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx deleted file mode 100644 index 7bc471de7647fdd08f38f284fcabda330f9a50bb..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/test/otbDBOverlapDataNodeFeatureFunction.cxx +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbDBOverlapDataNodeFeatureFunction.h" - -#include "otbVectorData.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" - - -int otbDBOverlapDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputDB = argv[2]; - const char * outputVD = argv[3]; - int DisplayWarnings = atoi(argv[4]); - - typedef double CoordRepType; - typedef double PrecisionType; - typedef otb::VectorData<CoordRepType, 2, PrecisionType> - VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> - TreeIteratorType; - - typedef otb::DBOverlapDataNodeFeatureFunction<CoordRepType, PrecisionType> - DataNodeFunctionType; - typedef DataNodeFunctionType::OutputType - FeatureOutputType; - - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReaderType::Pointer vdDBReader = VectorDataReaderType::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - DataNodeFunctionType::Pointer function = DataNodeFunctionType::New(); - - if (!DisplayWarnings) - { - vdReader->SetGlobalWarningDisplay(0); - } - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - vdDBReader->SetFileName(inputDB); - vdDBReader->Update(); - - function->SetInputVectorData(vdDBReader->GetOutput()); - function->SetDistanceThreshold(0.003); - - // Output - VectorDataType::Pointer outVD = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vdReader->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature()) - { - const DataNodeType::Pointer currentGeometry = itVector.Get(); - FeatureOutputType currentResult; - currentResult = function->Evaluate(*(currentGeometry.GetPointer())); - currentGeometry->SetFieldAsDouble("DBOVER", (double)(currentResult[0])); - outVD->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - vdWriter->SetInput(outVD); - vdWriter->SetFileName(outputVD); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx b/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx deleted file mode 100644 index a5481e05d3f0b64f74f0b2e2153722fa960ff722..0000000000000000000000000000000000000000 --- a/Modules/Filtering/VectorDataManipulation/test/otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.cxx +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbVectorData.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataFileWriter.h" -#include "itkPreOrderTreeIterator.h" - - -int otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputImg = argv[2]; - const char * DEMDir = argv[3]; - const char * outputVD = argv[4]; - int DisplayWarnings = atoi(argv[5]); - - typedef double CoordRepType; - typedef double PrecisionType; - typedef otb::VectorImage<PrecisionType> ImageType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::VectorData<CoordRepType, 2, PrecisionType> - VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> - VectorDataReProjFilter; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> - TreeIteratorType; - - typedef otb::RadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType> - FeaturefunctionType; - typedef FeaturefunctionType::OutputType - FeatureOutputType; - - ImageReaderType::Pointer imgReader = ImageReaderType::New(); - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - FeaturefunctionType::Pointer featureFunction = FeaturefunctionType::New(); - - if (!DisplayWarnings) - { - imgReader->SetGlobalWarningDisplay(0); - } - - otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - imgReader->SetFileName(inputImg); - imgReader->UpdateOutputInformation(); - imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction - - vdReProjFilter->SetInputImage(imgReader->GetOutput()); - vdReProjFilter->SetInputVectorData(vdReader->GetOutput()); - vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true); - vdReProjFilter->Update(); - - std::cout<< "vdReProjFilter->GetOutput()->Size(): " - << vdReProjFilter->GetOutput()->Size() << std::endl; - - featureFunction->SetInputImage(imgReader->GetOutput()); - - // Output - VectorDataType::Pointer outVD = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature()) - { - const DataNodeType::Pointer currentGeometry = itVector.Get(); - FeatureOutputType currentResult; - currentResult = featureFunction->Evaluate(*(currentGeometry.GetPointer())); - currentGeometry->SetFieldAsDouble("RADIOM_HOM", (double)(currentResult[0])); - outVD->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - vdWriter->SetInput(outVD); - vdWriter->SetFileName(outputVD); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx b/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx index c4230b11556a036ec89fa39103beba40d12a5252..d09a9aaed3041af20589dc65f6f1a6903c3e4437 100644 --- a/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx +++ b/Modules/Filtering/VectorDataManipulation/test/otbVectorDataManipulationTestDriver.cxx @@ -22,10 +22,8 @@ void RegisterTests() { - REGISTER_TEST(otbDBOverlapDataNodeFeatureFunction); REGISTER_TEST(otbVectorDataExtractROI); REGISTER_TEST(otbPolygonCompacityFunctor); REGISTER_TEST(otbVectorDataToRandomLineGenerator); REGISTER_TEST(otbConcatenateVectorDataFilter); - REGISTER_TEST(otbRadiometryHomogenousWithNeighborhoodDataNodeFeatureFunction); } diff --git a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h b/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h deleted file mode 100644 index 224f16af2c1b9b5f91200dd65209a03e4b231501..0000000000000000000000000000000000000000 --- a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.h +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbStandardDSCostFunction_h -#define otbStandardDSCostFunction_h - -#include "itkSingleValuedCostFunction.h" - -#include "otbVectorDataToDSValidatedVectorDataFilter.h" -#include <string> - -namespace otb -{ -/** \class StandardDSCostFunction - * \brief Standard Cost Function used to estimate the fuzzy model parameters - * in the Dempster-Shafer framework - * - * This class has been developed to estimate, with the help of the Amoeba - * optimizer, the fuzzy model parameters to be used in the class - * otb::VectorDataToDSValidatedVectorDataFilter. The cost value compute the - * cost according to: - * - an enriched ground truth vector data (using VectorDataToRoadDescription) - * - an enriched negative sample VectorData or at least random samples - * - an hypothesis (the same as the considered DSValidationFilter) - * (by default (NONDVI, ROADSA, NOBUIL)) - * - a weight between 0 and 1 (0.5 by default) corresponding to the situation - * policy regarding under detection/false detection (1 no under detection - * 0 no false detection) - * For now the cost function use the NONDVI Feature, ROADSA Feature and and - * the NOBUIL Feature. - * For each evolution of the VectorDataToDSValidatedVectorDataFilter, - * this cost function must be adapted. - * - * \ingroup CostFunction - * \sa VectorDataToDSValidatedVectorDataFilter - * \sa AmoebaOptimizer - * - * \ingroup OTBDempsterShafer - */ - -template <class TDSValidationFilter> -class ITK_EXPORT StandardDSCostFunction : -public itk::SingleValuedCostFunction -{ -public: - /** Standard class typedefs. */ - typedef StandardDSCostFunction Self; - typedef itk::SingleValuedCostFunction Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(StandardDSCostFunction, itk::SingleValuedCostFunction); - - typedef Superclass::MeasureType MeasureType; //double - typedef Superclass::DerivativeType DerivativeType; //Array<double> - typedef Superclass::ParametersType ParametersType; //Array<double> - - typedef TDSValidationFilter DSValidationFilterType; - typedef typename DSValidationFilterType::VectorDataType - VectorDataType; - typedef typename DSValidationFilterType::TreeIteratorType - TreeIteratorType; - typedef typename DSValidationFilterType::LabelSetType - LabelSetType; - - typedef FuzzyDescriptorsModelManager FuzzyDescriptorsModelManagerType; - - typedef FuzzyDescriptorsModelManager::DescriptorListType - DescriptorListType; - typedef FuzzyDescriptorsModelManager::DescriptorsModelType - DescriptorsModelType; - typedef FuzzyDescriptorsModelManager::PairType PairType; - - typedef Parser ParserType; - - /** This method returns the value of the cost function corresponding - * to the specified parameters. */ - MeasureType GetValue( const ParametersType & parameters ) const override; - - /** This method returns the derivative of the cost function corresponding - * to the specified parameters. */ - void GetDerivative( const ParametersType & parameters, - DerivativeType & derivative ) const override; - - unsigned int GetNumberOfParameters(void) const override; - - itkSetMacro(Weight, double); - itkGetConstMacro(Weight, double); - - itkSetMacro(CriterionFormula, std::string); - itkGetConstMacro(CriterionFormula, std::string); - - void SetDescriptorList(DescriptorListType list) - { - m_DescriptorList = list; - } - - DescriptorListType GetDescriptorList() - { - return m_DescriptorList; - } - - itkSetObjectMacro(GTVectorData, VectorDataType); - itkGetConstObjectMacro(GTVectorData, VectorDataType); - - itkSetObjectMacro(NSVectorData, VectorDataType); - itkGetConstObjectMacro(NSVectorData, VectorDataType); - - - LabelSetType GetBeliefHypothesis() - { - return m_BeliefHypothesis; - } - - void SetBeliefHypothesis(LabelSetType hypothesis) - { - m_BeliefHypothesis = hypothesis; - } - - LabelSetType GetPlausibilityHypothesis() - { - return m_PlausibilityHypothesis; - } - - void SetPlausibilityHypothesis(LabelSetType hypothesis) - { - m_PlausibilityHypothesis = hypothesis; - } - -protected: - /** Constructor */ - StandardDSCostFunction(); - /** Destructor */ - ~StandardDSCostFunction() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - StandardDSCostFunction(const Self &) = delete; - void operator =(const Self&) = delete; - - - typename VectorDataType::Pointer m_GTVectorData; //Ground Truth - typename VectorDataType::Pointer m_NSVectorData; //Negative Samples - - typename ParserType::Pointer m_Parser; - std::string m_CriterionFormula; - - double m_Weight; //range ]0; 1[ - - LabelSetType m_BeliefHypothesis; - LabelSetType m_PlausibilityHypothesis; - - DescriptorListType m_DescriptorList; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbStandardDSCostFunction.hxx" -#endif - -#endif diff --git a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx b/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx deleted file mode 100644 index 236c1e5e9ae83b087987a43347be174f80a4d5ac..0000000000000000000000000000000000000000 --- a/Modules/Learning/DempsterShafer/include/otbStandardDSCostFunction.hxx +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbStandardDSCostFunction_hxx -#define otbStandardDSCostFunction_hxx - -#include "otbStandardDSCostFunction.h" - -namespace otb -{ -// Constructor -template <class TDSValidationFilter> -StandardDSCostFunction<TDSValidationFilter> -::StandardDSCostFunction() : - m_CriterionFormula("((Belief + Plausibility)/2.)"), - m_Weight(0.5) -{ - m_GTVectorData = VectorDataType::New(); - m_NSVectorData = VectorDataType::New(); - m_Parser = ParserType::New(); -} - -template <class TDSValidationFilter> -unsigned int -StandardDSCostFunction<TDSValidationFilter> -::GetNumberOfParameters() const - { - return m_DescriptorList.size()*4; - } - -template <class TDSValidationFilter> -typename StandardDSCostFunction<TDSValidationFilter> -::MeasureType - StandardDSCostFunction<TDSValidationFilter> -::GetValue(const ParametersType & parameters) const - { - if (parameters.size() != m_DescriptorList.size()*4) - { - itkExceptionMacro(<< "Wrong model!" ) - } - - //Initialize parser - m_Parser->SetExpr(m_CriterionFormula); - - DescriptorsModelType descModel; - for (unsigned int i = 0; i < m_DescriptorList.size(); ++i) - { - std::vector<double> tmp; - for (unsigned int j = 0; j < 4; ++j) - { - tmp.push_back(parameters[4*i+j]); - } - PairType pair( m_DescriptorList[i], tmp); - descModel.push_back(pair); - } - - typename DSValidationFilterType::Pointer internalFunctionGT = DSValidationFilterType::New(); - internalFunctionGT->SetCriterionFormula("1"); - internalFunctionGT->SetInput(m_GTVectorData); - internalFunctionGT->SetBeliefHypothesis(m_BeliefHypothesis); - internalFunctionGT->SetPlausibilityHypothesis(m_PlausibilityHypothesis); - try - { - internalFunctionGT->SetDescriptorModels(descModel); - } - catch ( itk::ExceptionObject & ) - { - return 1; - } - internalFunctionGT->Update(); - - typename DSValidationFilterType::Pointer internalFunctionNS = DSValidationFilterType::New(); - internalFunctionNS->SetCriterionFormula("1"); - internalFunctionNS->SetInput(m_NSVectorData); - internalFunctionNS->SetBeliefHypothesis(m_BeliefHypothesis); - internalFunctionNS->SetBeliefHypothesis(m_PlausibilityHypothesis); - try - { - internalFunctionNS->SetDescriptorModels(descModel); - } - catch (itk::ExceptionObject &) - { - return 1; - } - internalFunctionNS->Update(); - - double accGT = 0.0; - double accNS = 0.0; - double nGT = 0.0; - double nNS = 0.0; - - TreeIteratorType itVectorGT(internalFunctionGT->GetOutput()->GetDataTree()); - itVectorGT.GoToBegin(); - while (!itVectorGT.IsAtEnd()) - { - if (!itVectorGT.Get()->IsRoot() && !itVectorGT.Get()->IsDocument() && !itVectorGT.Get()->IsFolder()) - { - double belief = itVectorGT.Get()->GetFieldAsDouble("Belief"); - double plausibility = itVectorGT.Get()->GetFieldAsDouble("Plausi"); - - m_Parser->DefineVar("Belief", &belief); - m_Parser->DefineVar("Plausibility", &plausibility); - - accGT += ((1 - m_Parser->Eval()) * (1 - m_Parser->Eval())); - nGT += 1.0; - - m_Parser->ClearVar(); - } - itVectorGT++; - } - - TreeIteratorType itVectorNS(internalFunctionNS->GetOutput()->GetDataTree()); - itVectorNS.GoToBegin(); - while (!itVectorNS.IsAtEnd()) - { - if (!itVectorNS.Get()->IsRoot() && !itVectorNS.Get()->IsDocument() && !itVectorNS.Get()->IsFolder()) - { - double belief = itVectorNS.Get()->GetFieldAsDouble("Belief"); - double plausibility = itVectorNS.Get()->GetFieldAsDouble("Plausi"); - - m_Parser->DefineVar("Belief", &belief); - m_Parser->DefineVar("Plausibility", &plausibility); - - accNS += (m_Parser->Eval() * m_Parser->Eval()); - nNS += 1.0; - - m_Parser->ClearVar(); - } - itVectorNS++; - } - return (m_Weight * accGT / nGT + (1 - m_Weight) * accNS / nNS); -} - -template <class TDSValidationFilter> -void -StandardDSCostFunction<TDSValidationFilter> -::GetDerivative(const ParametersType & itkNotUsed(parameters), DerivativeType & itkNotUsed(derivative)) const - { - //Not necessary for Amoeba Optimizer - itkExceptionMacro(<< "Not Supposed to be used when using Amoeba Optimizer!") - } - -// PrintSelf Method -template <class TDSValidationFilter> -void -StandardDSCostFunction<TDSValidationFilter> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - - -}// end namespace otb - -#endif diff --git a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h deleted file mode 100644 index 43a3b9a6f953f658e9217d9a39f6d23a1482acc2..0000000000000000000000000000000000000000 --- a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.h +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorDataToDSValidatedVectorDataFilter_h -#define otbVectorDataToDSValidatedVectorDataFilter_h - -#include "otbMassOfBelief.h" - -#include "otbVectorDataToVectorDataFilter.h" - -#include "itkPreOrderTreeIterator.h" -#include "otbVectorData.h" -#include "otbFuzzyDescriptorsModelManager.h" - -#include "otbFuzzyVariable.h" -#include "otbJointMassOfBeliefFilter.h" -#include "otbParser.h" -#include <string> - -namespace otb -{ -/** \class VectorDataToDSValidatedVectorDataFilter - * \brief VectorData filter validating data nodes using - * Dempster-Shafer theory. - * - * This filter takes as input a vector data containing - * features score and validate (or not) each data node - * according to these features score, a fuzzy model corresponding - * to each feature and a criterion according to the Dempster-Shafer - * theory. By default the filter is (for now) parametrized to process - * VectorDatas providing by the VectorDataToRoadDescriptionFilter. - * The hypothesis must be set using the SetHypothesis method. - * The convention is for each feature Fe, a mass of Belief is defined - * with two variables named Fe and Fe_. Thus, an hypothesis must declared: - * VectorDataToVectorDataFilter::LabelSetType hyp; - * hyp.insert("Fe(i)"); - * hyp.insert("Fe(j)_"); - * hyp.insert("Fe(k)_"); - * - * Fe(i), Fe(j) and Fe(k) being descriptors. - * - * The criterion can be set through SetCriterionFormula() as a - * string referring to "Belief" and "Plausibility" from the - * Dempster-Shafer theory. By default the criterion is: - * "((Belief + Plausibility)/2) >= 0.5" - * - * The considered features will be the intersection between - * the features embedded in this filter and the features embedded - * in the input vector data. For now, the filter uses "NONDVI" and - * "ROADSA" features. - * - * - * \ingroup VectorDataFilter - * \sa VectorDataToRoadDescriptionFilter - * \sa VectorDataToBuildingDescriptionFilter - * - * \ingroup OTBDempsterShafer - */ - -template <class TVectorData, class TPrecision=float> -class ITK_EXPORT VectorDataToDSValidatedVectorDataFilter : -public otb::VectorDataToVectorDataFilter<TVectorData, TVectorData> -{ -public: - /** Standard class typedefs. */ - typedef VectorDataToDSValidatedVectorDataFilter Self; - typedef VectorDataToVectorDataFilter<TVectorData, - TVectorData> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(VectorDataToDSValidatedVectorDataFilter, VectorDataToVectorDataFilter); - - /** Some typedefs. */ - typedef TVectorData VectorDataType; - typedef typename VectorDataType::Pointer VectorDataPointer; - typedef typename VectorDataType::DataNodeType DataNodeType; - typedef itk::PreOrderTreeIterator<typename VectorDataType::DataTreeType> - TreeIteratorType; - - typedef TPrecision PrecisionType; - typedef MassOfBelief<std::string, PrecisionType> - MassOfBeliefFunctionType; - typedef typename MassOfBeliefFunctionType::LabelSetType - LabelSetType; - typedef JointMassOfBeliefFilter<MassOfBeliefFunctionType> - JointMassOfBeliefFilterType; - typedef Parser ParserType; - - typedef itk::DataObject::Pointer DataObjectPointer; - typedef itk::DataObject DataObject; - - - typedef FuzzyVariable<std::string, PrecisionType> FuzzyVarType; - - typedef FuzzyDescriptorsModelManager::PairType PairType; - typedef FuzzyDescriptorsModelManager::DescriptorsModelType DescriptorModelsType; - - /** Descriptor model accessors. */ - virtual void AddDescriptor(const std::string& key, std::vector<double> model); - virtual void ClearDescriptors(); - - void SetDescriptorModels( DescriptorModelsType model ); - DescriptorModelsType GetDescriptorModels() - { - return m_DescriptorModels; - } - - /** Parameter accessors. */ - itkGetConstMacro(CriterionFormula, std::string); - itkSetMacro(CriterionFormula, std::string); - - itkGetMacro(CriterionThreshold, double); - itkSetMacro(CriterionThreshold, double); - - LabelSetType GetBeliefHypothesis() - { - return m_BeliefHypothesis; - } - - void SetBeliefHypothesis(LabelSetType hypothesis) - { - m_BeliefHypothesis = hypothesis; - } - - LabelSetType GetPlausibilityHypothesis() - { - return m_PlausibilityHypothesis; - } - - void SetPlausibilityHypothesis(LabelSetType hypothesis) - { - m_PlausibilityHypothesis = hypothesis; - } - - unsigned int GetNumberOfParameters() - { - return (m_DescriptorModels.size() * 4); - } - - -protected: - /** Triggers the Computation */ - void GenerateData(void) override; - /** Constructor */ - VectorDataToDSValidatedVectorDataFilter(); - /** Destructor */ - ~VectorDataToDSValidatedVectorDataFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - - std::string GetNextID() - { - std::ostringstream oss; - oss << m_CurrentID++; - return oss.str(); - } - -private: - VectorDataToDSValidatedVectorDataFilter(const Self &) = delete; - void operator =(const Self&) = delete; - - // Descriptor bench - DescriptorModelsType m_DescriptorModels; - std::vector< typename FuzzyVarType::Pointer > m_FuzzyVars; - LabelSetType m_Universe, - m_BeliefHypothesis, - m_PlausibilityHypothesis; - double m_Bel, m_Plau; - typename ParserType::Pointer m_Parser; - - std::string m_CriterionFormula; - double m_CriterionThreshold; - unsigned int m_CurrentID; -}; - -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbVectorDataToDSValidatedVectorDataFilter.hxx" -#endif - -#endif diff --git a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx b/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx deleted file mode 100644 index 8e07927bb6fd9106cce86ea182c59e9da92d690c..0000000000000000000000000000000000000000 --- a/Modules/Learning/DempsterShafer/include/otbVectorDataToDSValidatedVectorDataFilter.hxx +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbVectorDataToDSValidatedVectorDataFilter_hxx -#define otbVectorDataToDSValidatedVectorDataFilter_hxx - -#include "otbVectorDataToDSValidatedVectorDataFilter.h" -#include <iostream> - -namespace otb -{ - -// Constructor -template <class TVectorData, class TPrecision> - VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::VectorDataToDSValidatedVectorDataFilter() : - m_Bel(0.0), - m_Plau(0.0), - m_CriterionFormula("((Belief + Plausibility)/2.)"), - m_CriterionThreshold(0.5), - m_CurrentID(0) -{ - this->SetNumberOfRequiredInputs(1); - - m_Parser = ParserType::New(); -} - - -template <class TVectorData, class TPrecision> -void -VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::AddDescriptor(const std::string& key, std::vector<double> model) -{ - bool alreadyExist = false; - - if (model.size() != 4) - { - itkExceptionMacro(<< "Wrong model! Size(=" << model.size() << ") > 4" ) - } - else if (model[0]<0 || model[1]<model[0] || model[2]<model[1] || model[2]>1) - { - itkExceptionMacro(<< "Wrong model! Values have to be 0<=v1<=v2<=v3<=1" ) - } - else if (model[3]<.75 || model[3]>1.0) - { - itkExceptionMacro(<< "Wrong model! Values have to be 0.75<=v4<=1" ) - } - else - { - for (unsigned int i=0; i<m_DescriptorModels.size(); ++i) - { - if (m_DescriptorModels[i].first.compare(key) == 0) - { - for (unsigned int j=0; j<4; ++j) - { - m_DescriptorModels[i].second.at(j) = model[j]; - } - alreadyExist = true; - } - } - if (!alreadyExist) - { - m_DescriptorModels.push_back(std::pair<std::string, std::vector<double> >(key, model)); - } - } - - this->Modified(); -} - - -template <class TVectorData, class TPrecision> -void -VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::ClearDescriptors() -{ - m_DescriptorModels.clear(); -} - -template <class TVectorData, class TPrecision> -void -VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::SetDescriptorModels(DescriptorModelsType model) -{ - for (unsigned int i=0; i<model.size(); ++i) - { - this->AddDescriptor(model[i].first, model[i].second); - } -} - - -template <class TVectorData, class TPrecision> -void -VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::GenerateData() -{ - //Initialize Dempster Shafer tools - if( m_DescriptorModels.size() == 0 ) - { - itkExceptionMacro(<< "No defined Descriptor. Please add a descriptor model."); - } - - for (unsigned int i=0; i<m_DescriptorModels.size(); ++i) - { - typename FuzzyVarType::Pointer fuz = FuzzyVarType::New(); - std::string fuzName, fuzName_; - fuzName = m_DescriptorModels[i].first; - fuzName_ = m_DescriptorModels[i].first + "_"; - - fuz->SetMembership(fuzName, - 0.0, - 0.0, - m_DescriptorModels[i].second[0], - m_DescriptorModels[i].second[1], - 0.0, - m_DescriptorModels[i].second[3]); - fuz->SetMembership(fuzName_, - m_DescriptorModels[i].second[1], - m_DescriptorModels[i].second[2], - 1.0, - 1.0, - 0.0, - m_DescriptorModels[i].second[3]); - - m_FuzzyVars.push_back(fuz); - - m_Universe.insert(fuzName); - m_Universe.insert(fuzName_); - } - - //Initialize parser - m_Parser->SetExpr(m_CriterionFormula); - m_Parser->DefineVar("Belief", &m_Bel); - m_Parser->DefineVar("Plausibility", &m_Plau); - - // Output - this->GetOutput(0)->SetMetaDataDictionary(this->GetInput()->GetMetaDataDictionary()); - // Retrieving root node - typename DataNodeType::Pointer root = this->GetOutput(0)->GetDataTree()->GetRoot()->Get(); - // Create the document node - typename DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - this->GetOutput(0)->GetDataTree()->Add(document, root); - // Create the folder node - typename DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - this->GetOutput(0)->GetDataTree()->Add(folder, document); - this->GetOutput(0)->SetProjectionRef(this->GetInput()->GetProjectionRef()); - - TreeIteratorType itVector(this->GetInput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (!itVector.Get()->IsRoot() && !itVector.Get()->IsDocument() && !itVector.Get()->IsFolder()) - { - typename DataNodeType::Pointer currentGeometry = itVector.Get(); - typename JointMassOfBeliefFilterType::Pointer jointMassFilter = JointMassOfBeliefFilterType::New(); - - for (unsigned int i=0; i<m_DescriptorModels.size(); ++i) - { - if (currentGeometry->HasField(m_DescriptorModels[i].first)) - { - LabelSetType H, H_; - std::string fuzName, fuzName_; - fuzName = m_DescriptorModels[i].first; - fuzName_ = m_DescriptorModels[i].first + "_"; - - typename MassOfBeliefFunctionType::Pointer mass = MassOfBeliefFunctionType::New(); - mass->InitializePowerSetMasses(m_Universe); - - H.insert(fuzName); - H_.insert(fuzName_); - - mass->SetMass(H, m_FuzzyVars[i]->GetMembership(fuzName, currentGeometry->GetFieldAsDouble(fuzName))); - mass->SetMass(H_, m_FuzzyVars[i]->GetMembership(fuzName_, currentGeometry->GetFieldAsDouble(fuzName))); - - mass->EstimateUncertainty(); - - jointMassFilter->PushBackInput(mass); - } - } - jointMassFilter->Update(); - m_Bel = jointMassFilter->GetOutput()->GetBelief(m_BeliefHypothesis); - m_Plau = jointMassFilter->GetOutput()->GetPlausibility(m_PlausibilityHypothesis); - - if (m_Parser->Eval() >= m_CriterionThreshold) - { - currentGeometry->SetNodeId(this->GetNextID()); - currentGeometry->SetFieldAsDouble("Belief", m_Bel); - currentGeometry->SetFieldAsDouble("Plausi", m_Plau); - this->GetOutput(0)->GetDataTree()->Add(currentGeometry, folder); - } - } - ++itVector; - } -} - - -// PrintSelf Method -template <class TVectorData, class TPrecision> -void -VectorDataToDSValidatedVectorDataFilter<TVectorData, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // end namespace otb - -#endif diff --git a/Modules/Learning/DempsterShafer/test/CMakeLists.txt b/Modules/Learning/DempsterShafer/test/CMakeLists.txt index d999a90fa0638dc4c981451209009bb73d925a46..9ebe35857fe75dfddf2560633365b8cfe8145a65 100644 --- a/Modules/Learning/DempsterShafer/test/CMakeLists.txt +++ b/Modules/Learning/DempsterShafer/test/CMakeLists.txt @@ -24,7 +24,6 @@ set(OTBDempsterShaferTests otbDempsterShaferTestDriver.cxx otbMassOfBeliefDSApplied.cxx otbConfusionMatrixToMassOfBeliefTest.cxx -otbVectorDataToDSValidatedVectorDataFilter.cxx otbDempsterShaferFusionTests.cxx otbDSFusionOfClassifiersImageFilterTest.cxx otbJointMassOfBeliefFilter.cxx @@ -85,16 +84,6 @@ otb_add_test(NAME fzTvConfusionMatrixToMassOfBeliefTestRecall COMMAND otbDempste otbConfusionMatrixToMassOfBeliefTest RECALL) -otb_add_test(NAME fzTvVectorDataToDSValidatedVectorDataFilter COMMAND otbDempsterShaferTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/fzTvDSValidatedRoadVectorDataOutput.shp - ${TEMP}/fzTvDSValidatedRoadVectorDataOutput.shp - otbVectorDataToDSValidatedVectorDataFilter - ${TEMP}/fzTvVectorDataToRoadDescriptionFilterOutput.shp - ${TEMP}/fzTvDSValidatedRoadVectorDataOutput.shp - ) -set_property(TEST fzTvVectorDataToDSValidatedVectorDataFilter PROPERTY DEPENDS fzTvVectorDataToRoadDescriptionFilter) - otb_add_test(NAME fzDSFusionTestConfMatFileVCMTestPrecision COMMAND otbDempsterShaferTestDriver otbDempsterShaferFusionConfMatFileTest ${INPUTDATA}/Classification/QB_1_ortho_C1_V.csv diff --git a/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx b/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx index c38750c9cbd2443e8282a74b0005689c78455836..d8b30b333994660ead3a090f59519756a05a8330 100644 --- a/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx +++ b/Modules/Learning/DempsterShafer/test/otbDempsterShaferTestDriver.cxx @@ -24,7 +24,6 @@ void RegisterTests() { REGISTER_TEST(otbMassOfBeliefDSApplied); REGISTER_TEST(otbConfusionMatrixToMassOfBeliefTest); - REGISTER_TEST(otbVectorDataToDSValidatedVectorDataFilter); REGISTER_TEST(otbDempsterShaferFusionOptRecConfMatTest); REGISTER_TEST(otbDempsterShaferFusionOptRecTest); REGISTER_TEST(otbDempsterShaferFusionOptTest); diff --git a/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx b/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx deleted file mode 100644 index d237ea5d2f5de3a453a862dac05964355ea6d0c8..0000000000000000000000000000000000000000 --- a/Modules/Learning/DempsterShafer/test/otbVectorDataToDSValidatedVectorDataFilter.cxx +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbVectorDataToDSValidatedVectorDataFilter.h" - -#include "otbVectorDataFileReader.h" -#include "otbVectorDataFileWriter.h" - - -int otbVectorDataToDSValidatedVectorDataFilter(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * outputVD = argv[2]; - - typedef float PrecisionType; - typedef otb::VectorData<PrecisionType> VectorDataType; - typedef otb::VectorDataFileReader<VectorDataType> - VectorDataReaderType; - typedef otb::VectorDataFileWriter<VectorDataType> - VectorDataWriterType; - - typedef otb::VectorDataToDSValidatedVectorDataFilter<VectorDataType, PrecisionType> - VectorDataValidationFilterType; - typedef VectorDataValidationFilterType::LabelSetType - LabelSetType; - typedef otb::FuzzyDescriptorsModelManager - FuzzyManagerType; - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - - VectorDataValidationFilterType::Pointer filter = - VectorDataValidationFilterType::New(); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - filter->SetInput(vdReader->GetOutput()); - //filter->GetDescriptorModels(); - FuzzyManagerType::Print(filter->GetDescriptorModels()); - LabelSetType plau, bel; - plau.insert("NONDVI"); - plau.insert("ROADSA"); - plau.insert("NOBUIL"); - filter->SetPlausibilityHypothesis(plau); - bel.insert("ROADSA"); - bel.insert("NONDVI"); - bel.insert("NOBUIL"); - filter->SetBeliefHypothesis(bel); - - std::vector<double> stdModel; - stdModel.push_back(0.25); - stdModel.push_back(0.50); - stdModel.push_back(0.75); - stdModel.push_back(0.90); - filter->AddDescriptor("NONDVI", stdModel); - filter->AddDescriptor("ROADSA", stdModel); - filter->AddDescriptor("NOBUIL", stdModel); - - FuzzyManagerType::Print(filter->GetDescriptorModels()); - - vdWriter->SetFileName(outputVD); - vdWriter->SetInput(filter->GetOutput()); - vdWriter->Update(); - - std::cout << "Input VectorData Size : " - << vdReader->GetOutput()->Size() << std::endl - << "CriterionFormula : " - << filter->GetCriterionFormula() << std::endl - << "Output VecttorData Size : " - << filter->GetOutput()->Size() - << std::endl; - - return EXIT_SUCCESS; -} diff --git a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h index 77e8691cf6eb6298639156171113bec261d0e6de..69574043779cf5b6144a34f5b6e446721047ec2e 100644 --- a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h +++ b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.h @@ -48,6 +48,7 @@ #include "shark/Models/Clustering/Centroids.h" #include "shark/Models/Clustering/ClusteringModel.h" #include "shark/Algorithms/KMeans.h" +#include "shark/Models/Normalizer.h" #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop @@ -124,9 +125,14 @@ public: /** Set the number of class for the kMeans algorithm.*/ itkSetMacro( K, unsigned ); - /** If true, normalized input data sample list */ - itkGetMacro( Normalized, bool ); - itkSetMacro( Normalized, bool ); + /** Initialize the centroids for the kmeans algorithm */ + void SetCentroidsFromData(const shark::Data<shark::RealVector>& data) + { + m_Centroids.setCentroids(data); + this->Modified(); + } + + void ExportCentroids(const std::string& filename); protected: /** Constructor */ @@ -142,9 +148,6 @@ protected: virtual void DoPredictBatch(const InputListSampleType *, const unsigned int &startIndex, const unsigned int &size, TargetListSampleType *, ConfidenceListSampleType * = nullptr, ProbaListSampleType * = nullptr) const override; - template<typename DataType> - DataType NormalizeData(const DataType &data) const; - /** PrintSelf method */ void PrintSelf(std::ostream &os, itk::Indent indent) const override; @@ -153,16 +156,13 @@ private: void operator=(const Self &) = delete; // Parameters set by the user - bool m_Normalized; unsigned int m_K; unsigned int m_MaximumNumberOfIterations; bool m_CanRead; - /** Centroids results form kMeans */ shark::Centroids m_Centroids; - /** shark Model could be SoftClusteringModel or HardClusteringModel */ boost::shared_ptr<ClusteringModelType> m_ClusteringModel; diff --git a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx index 3838d38aaa5e56bd4f69531711a7d6e1f45cc880..6554c67d318439e7f3d2f1560f9aa1eda5661957 100644 --- a/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx +++ b/Modules/Learning/Unsupervised/include/otbSharkKMeansMachineLearningModel.hxx @@ -35,11 +35,10 @@ #include "otb_shark.h" #include "otbSharkUtils.h" -#include "shark/Algorithms/Trainers/NormalizeComponentsUnitVariance.h" //normalize #include "shark/Algorithms/KMeans.h" //k-means algorithm #include "shark/Models/Clustering/HardClusteringModel.h" #include "shark/Models/Clustering/SoftClusteringModel.h" -#include "shark/Algorithms/Trainers/NormalizeComponentsUnitVariance.h" +#include <shark/Data/Csv.h> //load the csv file #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic pop @@ -52,7 +51,7 @@ namespace otb template<class TInputValue, class TOutputValue> SharkKMeansMachineLearningModel<TInputValue, TOutputValue> ::SharkKMeansMachineLearningModel() : - m_Normalized( false ), m_K(2), m_MaximumNumberOfIterations( 10 ) + m_K(2), m_MaximumNumberOfIterations( 10 ) { // Default set HardClusteringModel this->m_ConfidenceIndex = true; @@ -77,27 +76,11 @@ SharkKMeansMachineLearningModel<TInputValue, TOutputValue> otb::Shark::ListSampleToSharkVector( this->GetInputListSample(), vector_data ); shark::Data<shark::RealVector> data = shark::createDataFromRange( vector_data ); - // Normalized input value if necessary - if( m_Normalized ) - data = NormalizeData( data ); - // Use a Hard Clustering Model for classification shark::kMeans( data, m_K, m_Centroids, m_MaximumNumberOfIterations ); m_ClusteringModel = boost::make_shared<ClusteringModelType>( &m_Centroids ); } -template<class TInputValue, class TOutputValue> -template<typename DataType> -DataType -SharkKMeansMachineLearningModel<TInputValue, TOutputValue> -::NormalizeData(const DataType &data) const -{ - shark::Normalizer<> normalizer; - shark::NormalizeComponentsUnitVariance<> normalizingTrainer( true );//zero mean - normalizingTrainer.train( normalizer, data ); - return normalizer( data ); -} - template<class TInputValue, class TOutputValue> typename SharkKMeansMachineLearningModel<TInputValue, TOutputValue> ::TargetSampleType @@ -258,6 +241,14 @@ SharkKMeansMachineLearningModel<TInputValue, TOutputValue> return true; } +template<class TInputValue, class TOutputValue> +void +SharkKMeansMachineLearningModel<TInputValue, TOutputValue> +::ExportCentroids(const std::string & filename) +{ + shark::exportCSV(m_Centroids.centroids(), filename, ' '); +} + template<class TInputValue, class TOutputValue> void SharkKMeansMachineLearningModel<TInputValue, TOutputValue> diff --git a/Modules/OBIA/RCC8/CMakeLists.txt b/Modules/OBIA/RCC8/CMakeLists.txt deleted file mode 100644 index 6fca751fa59c10469a9a3699bad9ee2b893dcd8b..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBRCC8) - -set(OTBRCC8_LIBRARIES OTBRCC8) -otb_module_impl() diff --git a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h deleted file mode 100644 index 9169b4ecd88b7b116268d4e70297078ddd320348..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageListToRCC8GraphFilter_h -#define otbImageListToRCC8GraphFilter_h - -#include "otbRCC8GraphSource.h" -#include "otbImageList.h" - -namespace otb -{ -/** \class ImageListToRCC8GraphFilter - * \brief Base class for filters taking an images list as input to - * produce a RCC8 graph. - * - * \ingroup OTBRCC8 - */ -template <class TInputImage, class TOutputGraph> -class ITK_EXPORT ImageListToRCC8GraphFilter - : public RCC8GraphSource<TOutputGraph> -{ -public: - /** Standard typedefs */ - typedef ImageListToRCC8GraphFilter Self; - typedef RCC8GraphSource<TOutputGraph> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Type macro */ - itkNewMacro(Self); - /** Creation through object factory macro */ - itkTypeMacro(ImageListToRCC8GraphFilter, RCC8GraphSource); - /** Template input parameters typedefs */ - typedef TInputImage InputImageType; - typedef typename InputImageType::ConstPointer InputImagePointer; - typedef typename InputImageType::RegionType InputImageRegionType; - typedef typename InputImageType::PixelType InputImagePixelType; - typedef typename InputImageType::SizeType SizeType; - typedef typename InputImageType::ValueType ValueType; - typedef ImageList<InputImageType> InputImageListType; - typedef typename InputImageListType::Pointer InputImageListPointerType; - typedef typename InputImageListType::ConstPointer InputImageListConstPointer; - /** Template output parameters typedefs */ - typedef TOutputGraph OutputGraphType; - typedef typename Superclass::OutputGraphPointerType OutputGraphPointerType; - typedef typename OutputGraphType::VertexType VertexType; - typedef typename VertexType::Pointer VertexPointerType; - typedef typename OutputGraphType::RCC8ValueType RCC8ValueType; - /** InputImage dimension constant */ - itkStaticConstMacro(InputImageDimension, unsigned int, TInputImage::ImageDimension); - /** Overriding the SetInput() and GetInput() methods */ - using Superclass::SetInput; - virtual void SetInput(const InputImageListType * imageList); - virtual InputImageListType * GetInput(void); - -protected: - /** Constructor */ - ImageListToRCC8GraphFilter(); - /** Destructor */ - ~ImageListToRCC8GraphFilter() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - ImageListToRCC8GraphFilter(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageListToRCC8GraphFilter.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx deleted file mode 100644 index cab322360e9c030331788328f1e7069c0dd3c63d..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageListToRCC8GraphFilter.hxx +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageListToRCC8GraphFilter_hxx -#define otbImageListToRCC8GraphFilter_hxx - -#include "otbImageListToRCC8GraphFilter.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TInputImage, class TOutputGraph> -ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> -::ImageListToRCC8GraphFilter() -{ - this->SetNumberOfRequiredInputs(1); -} -/** - * Input Connection - * \param image The input image. - */ -template <class TInputImage, class TOutputGraph> -void -ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> -::SetInput(const InputImageListType *imageList) -{ - // A single input image - this->itk::ProcessObject::SetNthInput(0, const_cast<InputImageListType*>(imageList)); -} -/** - * Input image retrieval - * \return The input image. - */ -template <class TInputImage, class TOutputGraph> -typename ImageListToRCC8GraphFilter<TInputImage, TOutputGraph>::InputImageListType * -ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> -::GetInput(void) -{ - // If there is no input - if (this->GetNumberOfInputs() < 1) - { - // exit - return nullptr; - } - // else return the first input - return static_cast<InputImageListType *> - (this->itk::ProcessObject::GetInput(0)); -} -/** - * PrintSelf Method - */ -template <class TInputImage, class TOutputGraph> -void -ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h deleted file mode 100644 index 5c198e6720935e7699397a4132035b1b1a65f40f..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageMultiSegmentationToRCC8GraphFilter_h -#define otbImageMultiSegmentationToRCC8GraphFilter_h - -#include "otbImageListToRCC8GraphFilter.h" - -namespace otb -{ -/** - * \class ImageMultiSegmentationToRCC8GraphFilter - * \brief This class takes a list of labelled segmentation images - * and build the RCC8 graph of the set of regions it represents. - * - * \ingroup OTBRCC8 - */ -template <class TInputImage, class TOutputGraph> -class ITK_EXPORT ImageMultiSegmentationToRCC8GraphFilter - : public ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> -{ -public: - /** Standard class typedefs. */ - typedef ImageMultiSegmentationToRCC8GraphFilter Self; - typedef ImageListToRCC8GraphFilter<TInputImage, TOutputGraph> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(ImageMultiSegmentationToRCC8GraphFilter, ImageListToRCC8GraphFilter); - /** Input related typedefs */ - typedef TInputImage InputImageType; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::Pointer InputImagePointerType; - typedef typename Superclass::InputImageListType InputImageListType; - typedef typename InputImageListType::Pointer InputImageListPointerType; - typedef typename InputImageListType::ConstIterator ConstListIteratorType; - /** Output related typedefs */ - typedef TOutputGraph OutputGraphType; - typedef typename OutputGraphType::Pointer OutputGraphPointerType; - typedef typename OutputGraphType::VertexType VertexType; - typedef typename VertexType::Pointer VertexPointerType; - typedef typename VertexType::PathType PathType; - typedef typename OutputGraphType::VertexDescriptorType VertexDescriptorType; - /** Knowledge enum typedef */ - typedef typename OutputGraphType::RCC8ValueType RCC8ValueType; - typedef enum {NO_INFO, LEVEL_1, LEVEL_3, FULL} KnowledgeValueType; - typedef std::pair<KnowledgeValueType, RCC8ValueType> KnowledgeStateType; - /** Toogle optimisation flag */ - itkBooleanMacro(Optimisation); - itkSetMacro(Optimisation, bool); - - /** - * Get the number of occurrences of the given value - * \return The value. - */ - unsigned int GetRelationsCount(RCC8ValueType val); - - /** - * Get number of relations - * \return The number of relations. - */ - unsigned int GetNumberOfRelations(void); - -protected: - /** Constructor */ - ImageMultiSegmentationToRCC8GraphFilter(); - /** Destructor */ - ~ImageMultiSegmentationToRCC8GraphFilter() override; - /** Main computation method */ - void GenerateData() override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** - * Get the composition knowledge. - * \param r1 First RCC8 relation value, - * \param r2 Second RCC8 relation value, - * \return The knowledge associated with the composition. - */ - KnowledgeStateType GetKnowledge(RCC8ValueType r1, RCC8ValueType r2); - -private: - /** Optimisation flag */ - bool m_Optimisation; - unsigned int m_Accumulator[8]; - -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageMultiSegmentationToRCC8GraphFilter.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx deleted file mode 100644 index 8b9906bc6b92547e7bf10d9696597b9ea6f8f296..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageMultiSegmentationToRCC8GraphFilter.hxx +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageMultiSegmentationToRCC8GraphFilter_hxx -#define otbImageMultiSegmentationToRCC8GraphFilter_hxx - -#include "otbImageMultiSegmentationToRCC8GraphFilter.h" -#include "itkMinimumMaximumImageCalculator.h" -#include "otbPolygonToPolygonRCC8Calculator.h" -#include "otbRCC8VertexIterator.h" -#include "otbRCC8InEdgeIterator.h" -#include "otbRCC8OutEdgeIterator.h" -#include "itkProgressReporter.h" -#include "otbImageToEdgePathFilter.h" -#include "otbSimplifyPathListFilter.h" - -namespace otb -{ -/** - * Constructor. - */ -template <class TInputImage, class TOutputGraph> -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::ImageMultiSegmentationToRCC8GraphFilter() -{ - m_Optimisation = false; -} -/** - * Destructor. - */ -template <class TInputImage, class TOutputGraph> -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::~ImageMultiSegmentationToRCC8GraphFilter() -{} - -template <class TInputImage, class TOutputGraph> -unsigned int -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::GetRelationsCount(RCC8ValueType val) -{ - return m_Accumulator[val]; -} - -template <class TInputImage, class TOutputGraph> -unsigned int -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::GetNumberOfRelations() -{ - unsigned int result = 0; - for (unsigned int i = 0; i < 8; ++i) - { - result += m_Accumulator[i]; - - } - return result; -} -template <class TInputImage, class TOutputGraph> -typename ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::KnowledgeStateType -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::GetKnowledge(RCC8ValueType r1, RCC8ValueType r2) -{ - m_Accumulator[0] = 0; - m_Accumulator[1] = 0; - m_Accumulator[2] = 0; - m_Accumulator[3] = 0; - m_Accumulator[4] = 0; - m_Accumulator[5] = 0; - m_Accumulator[6] = 0; - m_Accumulator[7] = 0; - - // otbMsgDebugMacro(<<"RCC8GraphFilter: entering GetKnowledge method."); - // This is the RCC8 composition table - const int knowledge[8][8] - = - { - /** DC EC PO TPP TPPi NTPP i EQ */ - /** DC */ {-3, -2, -2, -2, 0, -2, 0, 0}, - /** EC */ {-1, -3, -2, -3, -1, -3, 0, 1}, - /** PO */ {-1, -1, -3, -3, -1, -3, -1, 2}, - /** TPP */ { 0, -1, -2, -3, -3, 5, -1, 3}, - /** TPPi*/ {-1, -1, -1, -3, -1, -3, 6, 4}, - /** NTPP*/ { 0, 0, -2, 5, -2, 5, -3, 5}, - /** NTPPi*/ {-1, -1, -1, -1, 6, -3, 6, 6}, - /** EQ */ { 0, 1, 2, 3, 4, 5, 6, 7} - }; - - int value = knowledge[r1][r2]; - // Each negative case correspond to a level of knowledge - if (value >= 0) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: FULL"); - return KnowledgeStateType(FULL, static_cast<RCC8ValueType>(value)); - } - else if (value == -1) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: LEVEL_1"); - return KnowledgeStateType(LEVEL_1, OTB_RCC8_DC); - } - else if (value == -2) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.LEVEL_3"); - return KnowledgeStateType(LEVEL_3, OTB_RCC8_DC); - } - else - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.NO_INFO"); - return KnowledgeStateType(NO_INFO, OTB_RCC8_DC); - } -} -/** - * Main computation method. - */ -template <class TInputImage, class TOutputGraph> -void -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::GenerateData() -{ - // Input image list pointer - InputImageListPointerType segList = this->GetInput(); - - // Output graph pointer - OutputGraphPointerType graph = this->GetOutput(); - - // invert value vector - RCC8ValueType invert[8] = {OTB_RCC8_DC, OTB_RCC8_EC, OTB_RCC8_PO, OTB_RCC8_TPPI, - OTB_RCC8_TPP, OTB_RCC8_NTPPI, OTB_RCC8_NTPP, OTB_RCC8_EQ}; - - // Some typedefs - typedef otb::ImageToEdgePathFilter<InputImageType, PathType> EdgeExtractionFilterType; - typedef otb::SimplifyPathListFilter<PathType> SimplifyPathFilterType; - typedef typename SimplifyPathFilterType::InputListType PathListType; - - typedef itk::MinimumMaximumImageCalculator<InputImageType> MinMaxCalculatorType; - typedef PolygonToPolygonRCC8Calculator<PathType> RCC8CalculatorType; - typedef RCC8VertexIterator<OutputGraphType> VertexIteratorType; - typedef RCC8InEdgeIterator<OutputGraphType> InEdgeIteratorType; - - - // Vector of label - std::vector<PixelType> maxLabelVector; - - // Vertex indexes - unsigned int vertexIndex = 0; - unsigned int segmentationImageIndex = 0; - unsigned int nbVertices = 0; - - // For each segmentation image - for (ConstListIteratorType it = segList->Begin(); it != segList->End(); ++it) - { - // Compute the maximum label - typename MinMaxCalculatorType::Pointer minMax = MinMaxCalculatorType::New(); - minMax->SetImage(it.Get()); - minMax->ComputeMaximum(); - maxLabelVector.push_back(minMax->GetMaximum()); - otbMsgDebugMacro(<< "Number of objects in image " << segmentationImageIndex << ": " - << minMax->GetMaximum()); - - // then for each region of the images - for (PixelType label = 1; label <= maxLabelVector.back(); ++label) - { - typename PathListType::Pointer region = PathListType::New(); - typename EdgeExtractionFilterType::Pointer extraction = EdgeExtractionFilterType::New(); - extraction->SetInput(it.Get()); - extraction->SetForegroundValue(label); - extraction->Update(); - region->PushBack(extraction->GetOutput()); - typename SimplifyPathFilterType::Pointer simplifier = SimplifyPathFilterType::New(); - simplifier->SetInput(region); - simplifier->GetFunctor().SetTolerance(0.1); - simplifier->Update(); - - // Create a new vertex - VertexPointerType vertex = VertexType::New(); - // Set its properties - vertex->SetPath(simplifier->GetOutput()->GetNthElement(0)); - vertex->SetSegmentationLevel(segmentationImageIndex / 2); - vertex->SetSegmentationType(segmentationImageIndex % 2); - // Put it in the graph - graph->SetVertex(vertexIndex, vertex); - ++vertexIndex; - ++nbVertices; - } - ++segmentationImageIndex; - } - - itk::ProgressReporter progress(this, 0, nbVertices*nbVertices); - - VertexIteratorType vIt1(graph); - VertexIteratorType vIt2(graph); - - // For each couple of vertices - for (vIt1.GoToBegin(); !vIt1.IsAtEnd(); ++vIt1) - { - for (vIt2.GoToBegin(); !vIt2.IsAtEnd(); ++vIt2) - { - //We do not examine each couple because of the RCC8 symmetry - if (vIt1.GetIndex() < vIt2.GetIndex()) - { - - // Compute the RCC8 relation - typename RCC8CalculatorType::Pointer calc = RCC8CalculatorType::New(); - calc->SetPolygon1(vIt1.Get()->GetPath()); - calc->SetPolygon2(vIt2.Get()->GetPath()); - RCC8ValueType value = OTB_RCC8_DC; - - // if the optimisations are activated - if (m_Optimisation) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: Entering optimisation loop"); - InEdgeIteratorType inIt1(vIt1.GetIndex(), graph); - InEdgeIteratorType inIt2(vIt2.GetIndex(), graph); - // otbMsgDebugMacro(<<"Optimisation loop: iterators initialised"); - VertexDescriptorType betweenIndex; - KnowledgeStateType know(NO_INFO, OTB_RCC8_DC); - inIt1.GoToBegin(); - - // Iterate through the edges going to the first vertex - while (!inIt1.IsAtEnd() && (know.first != FULL)) - { - betweenIndex = inIt1.GetSourceIndex(); - inIt2.GoToBegin(); - bool edgeFound = false; - while (!inIt2.IsAtEnd() && (know.first != FULL)) - { - // try to find an intermediate vertex between the two ones which - // we vant to compute the relationship - if (inIt2.GetSourceIndex() == betweenIndex) - { - // if an intermediate vertex is found - edgeFound = true; - // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex); - // See if it brings some info on the RCCC8 value - know = GetKnowledge(invert[inIt1.GetValue()], inIt2.GetValue()); - calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1); - calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3); - // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second); - } - ++inIt2; - } - // If no intermediate was found - if (!edgeFound) - { - // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex); - // Try using a DC relationship - know = GetKnowledge(invert[inIt1.GetValue()], OTB_RCC8_DC); - calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1); - calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3); - // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second); - } - ++inIt1; - } - // If the search has fully determined the RCC8 - if (know.first == FULL) - { - // Get the value - value = know.second; - } - else - { - // Else trigger the computation - // (which will take the optimisation phase info into account) - calc->Compute(); - value = calc->GetValue(); - } - // otbMsgDebugMacro(<<"RCC8GraphFilter: Leaving optimisation loop"); - } - // If the optimisations are not activated - else - { - calc->Compute(); - value = calc->GetValue(); - } - m_Accumulator[value] += 1; - m_Accumulator[invert[value]] += 1; - // If the vertices are connected - if (value > OTB_RCC8_DC) - { - // Add the edge to the graph. - otbMsgDevMacro(<< "Adding edge: " << vIt1.GetIndex() << " -> " << vIt2.GetIndex() << ": " << value); - graph->AddEdge(vIt1.GetIndex(), vIt2.GetIndex(), value); - } - } - progress.CompletedPixel(); - progress.CompletedPixel(); - } - } -} - -template <class TInputImage, class TOutputGraph> -void -ImageMultiSegmentationToRCC8GraphFilter<TInputImage, TOutputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h deleted file mode 100644 index d2a4fb922a0b22534b1ee8e10775c094be823ddf..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.h +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToImageRCC8Calculator_h -#define otbImageToImageRCC8Calculator_h - -#include "itkImageToImageFilter.h" -#include "itkObjectFactory.h" -#include "otbRCC8Value.h" -#include "otbImage.h" - -namespace otb -{ -/** - * \class ImageToImageRCC8Calculator - * \brief This class compute the RCC8 relation between the regions from two segmentation images. - * - * The RCC8 system comes from qualitative spatial reasoning. - * It is a set of pairwise disjoint exhaustive relation between two closed region of space. - * There are 8 possible relations : - * DC: Disconnected - * EC: Externaly connected - * PO: Partial overlap - * TPP: Tangential proper part - * NTPP: Non tangential proper part - * TPPI: Tangential proper part inverse - * NTPPI: Non tangential proper part inverse - * EQ: Equivalence - * - * The goal of this class is to determine which of these 8 relations link the two inputs regions represented - * by the segmentation images. Since this class will further be used iteratively on a possibly large set - * of region, it is optimised : the decision is managed by a decision tree, and the input data size is reduced - * to the smallest set needed to determine the relation. - * - * \ingroup OTBRCC8 - */ -template <class TInputImage> -class ITK_EXPORT ImageToImageRCC8Calculator : public itk::ImageToImageFilter<TInputImage, TInputImage> -{ -public: - /** Standard class typedefs. */ - typedef ImageToImageRCC8Calculator Self; - typedef itk::ImageToImageFilter<TInputImage, TInputImage> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(ImageToImageRCC8Calculator, ImageToImageFilter); - /** Types definitions for the input image. */ - typedef TInputImage ImageType; - typedef typename ImageType::Pointer ImagePointerType; - typedef typename ImageType::ConstPointer ImageConstPointerType; - typedef typename ImageType::PixelType PixelType; - typedef typename ImageType::IndexType IndexType; - typedef typename ImageType::RegionType RegionType; - /** Internal bool image type */ - typedef bool BoolPixelType; - typedef otb::Image<BoolPixelType, ImageType::ImageDimension> BoolImageType; - typedef typename BoolImageType::Pointer BoolImagePointerType; - - /** RCC8 values type */ - typedef RCC8Value RCC8ValueType; - /** - * Get the RCC8 relation. - * \return The RCC8 relation value. - */ - RCC8ValueType GetValue(void); - /** - * Set the first input image. - * \param image - */ - void SetInput1(ImageType * image); - /** - * Set the second input image. - * \param image - */ - void SetInput2(ImageType * image); - /** - * Get the first input image. - * \return The first input image. - */ - ImageType * GetInput1(void); - /** - * Get the second input image. - * \return The second input image. - */ - ImageType * GetInput2(void); - /** Set/Get the inside value of the region of image 1*/ - itkSetMacro(InsideValue1, PixelType); - itkGetMacro(InsideValue1, PixelType); - /** Set/Get the inside value of the region of image 2*/ - itkSetMacro(InsideValue2, PixelType); - itkGetMacro(InsideValue2, PixelType); - /** Set external knowledge to help the decision process */ - itkSetMacro(Level1APrioriKnowledge, bool); - itkSetMacro(Level3APrioriKnowledge, bool); - itkGetMacro(Level1APrioriKnowledge, bool); - itkGetMacro(Level3APrioriKnowledge, bool); -protected: - /** Constructor */ - ImageToImageRCC8Calculator(); - /** Destructor */ - ~ImageToImageRCC8Calculator() override {} - /** - * Compute the minimal image region required. - * \return The minimal region required. - */ - RegionType ComputeMinimalRegion(void); - /** - * Compute the intersection between regions edges. - * \return true if the intersection is not empty. - */ - bool ComputeEdgeEdgeBool(void); - /** - * Compute the intersection between exterior of region1 and - * interior of region2. - * \return true if the intersection is not empty. - */ - bool ComputeExterInterBool(void); - /** - * Compute the intersection between interior of region1 and - * exterior of region2. - * \return true if the intersection is not empty. - */ - bool ComputeInterExterBool(void); - /** - * Compute the intersection between regions interiors. - * \return true if the intersection is not empty. - */ - bool ComputeInterInterBool(void); - /** - * Compute the relation value from the input booleans. Please note - * that the actual computed value is set to the m_Value parameters, and has - * nothing to do with the returned boolean, which indicates if the determination - * process was successful. - * \param edgeEdgeBool True if edge-edge intersection is not empty. - * \param interExterBool True if interior-exterior intersection is not empty. - * \param exterInterBool True if exterior-interior intersection is not empty. - * \return True if the decision process was successful. - */ - bool ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool); - /** - * Test if the boolean image is totally black or not. This is a based on the lazy operator - * paradigm. - * \param image The image to test. - * \return True or false. - */ - bool IsBoolImageNotEmpty(BoolImagePointerType image); - /** - * Compute a bool image of minimal ROI size, surrounded by a false padding, and corresponding - * to the input image. - * \param image The image to convert. - * \param insideValue The inside value. - * \return The converted image - */ - BoolImagePointerType ConvertToBoolImage(ImagePointerType image, PixelType insideValue); - /** Main computation method */ - void GenerateData(void) override; - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** The RCC8 relation value */ - RCC8ValueType m_Value; - /** The minimal ROI needed to compute the relation value */ - RegionType m_MinimalROI; - /** Decision tree Level 1 A priori knowledge */ - bool m_Level1APrioriKnowledge; - /** Decision tree Level 3 A priori knowledge */ - bool m_Level3APrioriKnowledge; - /** Inside value 1 */ - PixelType m_InsideValue1; - /** Inside value 2 */ - PixelType m_InsideValue2; - /** Internal bool image representation*/ - BoolImagePointerType m_BoolImage1; - BoolImagePointerType m_BoolImage2; -}; -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbImageToImageRCC8Calculator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx b/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx deleted file mode 100644 index decd905bf7c446e19bfd0206bea0e59bd43e77ed..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbImageToImageRCC8Calculator.hxx +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbImageToImageRCC8Calculator_hxx -#define otbImageToImageRCC8Calculator_hxx - -#include "otbImageToImageRCC8Calculator.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkBinaryDilateImageFilter.h" -#include "itkBinaryBallStructuringElement.h" -#include "itkInvertIntensityImageFilter.h" -#include "itkSubtractImageFilter.h" -#include "itkAndImageFilter.h" -#include "itkImageRegionIterator.h" -#include "otbBinaryImageMinimalBoundingRegionCalculator.h" -#include "otbMacro.h" - -//TODELETE #include "otbImageFileWriter.h" -//TODELETE #include "itkCastImageFilter.h" - -namespace otb -{ -/** - * Constructor - */ -template<class TInputImage> -ImageToImageRCC8Calculator<TInputImage> -::ImageToImageRCC8Calculator() -{ - m_Value = OTB_RCC8_DC; - m_InsideValue1 = static_cast<PixelType>(255); - m_InsideValue2 = static_cast<PixelType>(255); - m_Level1APrioriKnowledge = false; - m_Level3APrioriKnowledge = false; - this->SetNumberOfRequiredInputs(2); -} -/** - * Set the first input image. - * \param image - */ -template<class TInputImage> -void -ImageToImageRCC8Calculator<TInputImage> -::SetInput1(ImageType * image) -{ - this->SetNthInput(0, const_cast<ImageType *>(image)); -} -/** - * Set the second input image. - * \param image - */ -template<class TInputImage> -void -ImageToImageRCC8Calculator<TInputImage> -::SetInput2(ImageType * image) -{ - this->SetNthInput(1, const_cast<ImageType *>(image)); -} -/** - * Get the first input image. - * \return The first input image. - */ -template<class TInputImage> -typename ImageToImageRCC8Calculator<TInputImage> -::ImageType* -ImageToImageRCC8Calculator<TInputImage> -::GetInput1(void) -{ - return dynamic_cast<ImageType*>(this->itk::ProcessObject::GetInput(0)); -} -/** - * Get the second input image. - * \return The second input image. - */ -template<class TInputImage> -typename ImageToImageRCC8Calculator<TInputImage> -::ImageType* -ImageToImageRCC8Calculator<TInputImage> -::GetInput2(void) -{ - return dynamic_cast<ImageType*>(this->itk::ProcessObject::GetInput(1)); -} -/** - * Get the RCC8 relation. - * \return The RCC8 relation value. - */ -template <class TInputImage> -typename ImageToImageRCC8Calculator<TInputImage> -::RCC8ValueType -ImageToImageRCC8Calculator<TInputImage> -::GetValue(void) -{ - return m_Value; -} -/** - * Compute the minimal image region required. - * \return The minimal region required. - */ -template <class TInputImage> -typename ImageToImageRCC8Calculator<TInputImage> -::RegionType -ImageToImageRCC8Calculator<TInputImage> -::ComputeMinimalRegion(void) -{ - // Input images pointers - typename ImageType::Pointer image1 = this->GetInput1(); - typename ImageType::Pointer image2 = this->GetInput2(); - typename ImageType::RegionType region1, region2, region; - typedef otb::BinaryImageMinimalBoundingRegionCalculator<ImageType> RegionCalculator; - typename RegionCalculator::Pointer rc = RegionCalculator::New(); - rc->SetInput(image1); - rc->SetPad(2); - rc->SetInsideValue(this->GetInsideValue1()); - rc->Update(); - region1 = rc->GetRegion(); - rc = RegionCalculator::New(); - rc->SetInput(image2); - rc->SetPad(2); - rc->SetInsideValue(this->GetInsideValue2()); - rc->Update(); - region2 = rc->GetRegion(); - // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion() Region1: index: "<<region1.GetIndex()<<" size: "<<region1.GetSize()); - // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion() Region2: index: "<<region2.GetIndex()<<" size: "<<region2.GetSize()); - - //TODELETE std::cout<<"RCC8Calculator->ComputeMinimalRegion() Region1: index: "<<region1.GetIndex()<<" size: "<<region1.GetSize()<<std::endl; -//TODELETE std::cout<<"RCC8Calculator->ComputeMinimalRegion() Region2: index: "<<region2.GetIndex()<<" size: "<<region2.GetSize()<<std::endl; - - typename ImageType::SizeType size; - typename ImageType::IndexType index; - - for (unsigned int i = 0; i < ImageType::ImageDimension; ++i) - { - index[i] = std::min(region1.GetIndex()[i], region2.GetIndex()[i]); - int potSize = std::max(region1.GetIndex()[i] + region1.GetSize()[i], - region2.GetIndex()[i] + region2.GetSize()[i]); - size[i] = (potSize - index[i] < 0 ? 0 : potSize - index[i]); - } - region.SetIndex(index); - region.SetSize(size); - region.PadByRadius(2); - region.Crop(image1->GetLargestPossibleRegion()); - region.Crop(image2->GetLargestPossibleRegion()); - // otbMsgDebugMacro(<<"RCC8Calculator->ComputeMinimalRegion(): index: "<<index<<" size: "<<size); - //TODELETE std::cout<<"RCC8Calculator->ComputeMinimalRegion(): index: "<<index<<" size: "<<size<<std::endl; - return region; -} -/** - * Compute a bool image of minimal ROI size, surrounded by a false padding, and corresponding - * to the input image. - * \param image The image to convert. - * \param insideValue The inside value. - * \return The converted image - */ -template<class TInputImage> -typename ImageToImageRCC8Calculator<TInputImage> -::BoolImagePointerType -ImageToImageRCC8Calculator<TInputImage> -::ConvertToBoolImage(ImagePointerType image, PixelType insideValue) -{ - typedef itk::ImageRegionConstIterator<ImageType> ConstIterator; - typedef itk::ImageRegionIterator<BoolImageType> Iterator; - typename BoolImageType::Pointer output = BoolImageType::New(); - typename BoolImageType::SizeType boolImageSize; - boolImageSize[0] = m_MinimalROI.GetSize()[0] + 2; - boolImageSize[1] = m_MinimalROI.GetSize()[1] + 2; - typename BoolImageType::IndexType boolImageIndex; - boolImageIndex[0] = m_MinimalROI.GetIndex()[0] - 1; - boolImageIndex[1] = m_MinimalROI.GetIndex()[1] - 1; - //otbMsgDebugMacro(<<"RCC8Calculator->ConvertToBoolImage() size: "<<boolImageSize<<" index: "<<boolImageIndex); - - typename BoolImageType::RegionType boolRegion; - boolRegion.SetSize(boolImageSize); - boolRegion.SetIndex(boolImageIndex); - output->SetRegions(boolRegion); - output->Allocate(); - output->FillBuffer(false); - - ConstIterator inputIt(image, m_MinimalROI); - Iterator outputIt(output, m_MinimalROI); - inputIt.GoToBegin(); - outputIt.GoToBegin(); - while (!inputIt.IsAtEnd() && !outputIt.IsAtEnd()) - { - outputIt.Set(inputIt.Get() == insideValue); - ++inputIt; - ++outputIt; - } - - return output; -} -/** - * Compute the intersection between regions edges. - * \return true if the intersection is not empty. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::ComputeEdgeEdgeBool(void) -{ - - /// Definition of the Filters used to compute the boolean - typedef itk::SubtractImageFilter<BoolImageType, BoolImageType, - BoolImageType> - SubtractFilterType; - typedef itk::BinaryBallStructuringElement<bool, - BoolImageType::ImageDimension> - BinaryBallStructuringElementType; - typedef itk::BinaryDilateImageFilter<BoolImageType, BoolImageType, BinaryBallStructuringElementType> DilateFilterType; - typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType; - /// Declaration and instantiation - typename DilateFilterType::Pointer dilateFilter1 = DilateFilterType::New(); - typename DilateFilterType::Pointer dilateFilter2 = DilateFilterType::New(); - typename SubtractFilterType::Pointer subtractFilter1 = SubtractFilterType::New(); - typename SubtractFilterType::Pointer subtractFilter2 = SubtractFilterType::New(); - typename AndFilterType::Pointer andFilter = AndFilterType::New(); - /// Configuration of the erosion filter - BinaryBallStructuringElementType structElement1, structElement2; - structElement1.SetRadius(1); - structElement2.SetRadius(1); - structElement1.CreateStructuringElement(); - structElement2.CreateStructuringElement(); - dilateFilter1->SetKernel(structElement1); - dilateFilter2->SetKernel(structElement2); - /// The erosion is performed to get the surrounding edge of this - /// region by subtraction to the original image - dilateFilter1->SetInput(m_BoolImage1); - dilateFilter1->Update(); - subtractFilter1->SetInput2(m_BoolImage1); - subtractFilter1->SetInput1(dilateFilter1->GetOutput()); - subtractFilter1->Update(); - /// The erosion is performed to get the surrounding edge of this - /// region by subtraction to the original image - dilateFilter2->SetInput(m_BoolImage2); - dilateFilter2->Update(); - subtractFilter2->SetInput2(m_BoolImage2); - subtractFilter2->SetInput1(dilateFilter2->GetOutput()); - subtractFilter2->Update(); - /// Now we can compute the intersection between the 2 edges - andFilter->SetInput1(subtractFilter1->GetOutput()); - andFilter->SetInput2(subtractFilter2->GetOutput()); - andFilter->Update(); - /// test if the intersection is empty or not - return this->IsBoolImageNotEmpty(andFilter->GetOutput()); -} -/** - * Compute the intersection between exterior of region1 and - * interior of region2. - * \return true if the intersection is not empty. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::ComputeExterInterBool(void) -{ - /// Definition of the filters used - typedef itk::InvertIntensityImageFilter<BoolImageType, BoolImageType> InvertFilterType; - typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType; - /// Declaration and instantiation - typename InvertFilterType::Pointer invert = InvertFilterType::New(); - typename AndFilterType::Pointer andFilter = AndFilterType::New(); - /// The exterior is the inverted input image - invert->SetMaximum(true); - invert->SetInput(m_BoolImage1); - andFilter->SetInput1(m_BoolImage2); - andFilter->SetInput2(invert->GetOutput()); - andFilter->Update(); - /// test if the intersection is empty or not - return IsBoolImageNotEmpty(andFilter->GetOutput()); -} -/** - * Compute the intersection between interior of region1 and - * exterior of region2. - * \return true if the intersection is not empty. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::ComputeInterExterBool(void) -{ - /// Definition of the filters used - typedef itk::InvertIntensityImageFilter<BoolImageType, BoolImageType> InvertFilterType; - typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType; -//TODELETE typedef otb::Image<unsigned char, 2> TmpImageType; -//TODELETE typedef itk::CastImageFilter<BoolImageType, TmpImageType> CastFilterType; - -//TODELETE typedef ImageFileWriter<TmpImageType> WriterType; -/// Declaration and instantiation - typename InvertFilterType::Pointer invert = InvertFilterType::New(); - typename AndFilterType::Pointer andFilter = AndFilterType::New(); - /// The exterior is the inverted input image - invert->SetMaximum(true); - invert->SetInput(m_BoolImage2); - -//TODELETE typename CastFilterType::Pointer caster = CastFilterType::New(); -//TODELETE caster->SetInput(invert->GetOutput()); -//TODELETE typename WriterType::Pointer writer = WriterType::New(); -//TODELETE writer->SetFileName("invert.tif"); -//TODELETE writer->SetInput(caster->GetOutput()); -//TODELETE writer->Update(); - - andFilter->SetInput1(m_BoolImage1); - andFilter->SetInput2(invert->GetOutput()); - andFilter->Update(); - -//TODELETE caster = CastFilterType::New(); -//TODELETE caster->SetInput(andFilter->GetOutput()); -//TODELETE writer = WriterType::New(); -//TODELETE writer->SetFileName("and.tif"); -//TODELETE writer->SetInput(caster->GetOutput()); -//TODELETE writer->Update(); - - /// test if the intersection is empty or not - return IsBoolImageNotEmpty(andFilter->GetOutput()); -} -/** - * Compute the intersection between regions interiors. - * \return true if the intersection is not empty. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::ComputeInterInterBool(void) -{ - /// Definition of the filters used - typedef itk::AndImageFilter<BoolImageType, BoolImageType, BoolImageType> AndFilterType; - - /// Declaration and instantiation - typename AndFilterType::Pointer andFilter = AndFilterType::New(); - /// The exterior is the inverted input image - andFilter->SetInput1(m_BoolImage1); - andFilter->SetInput2(m_BoolImage2); - andFilter->Update(); - /// test if the intersection is empty or not - return IsBoolImageNotEmpty(andFilter->GetOutput()); -} -/** - * Compute the relation value from the input booleans. Please note - * that the actual computed value is set to the m_Value parameters, and has - * nothing to do with the returned boolean, which indicates if the determination - * process was successful. - * \param edgeEdgeBool True if edge-edge intersection is not empty. - * \param interExterBool True if interior-exterior intersection is not empty. - * \param exterInterBool True if exterior-interior intersection is not empty. - * \return True if the decision process was successful. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool) -{ - // otbMsgDebugMacro(<<"RCC8Calculator->ComputeRelation()"); - // This decision process is based on a decision tree - if ((!interExterBool) && (edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_EQ; - return true; - } - else if ((!interExterBool) && (edgeEdgeBool) && (exterInterBool)) - { - m_Value = OTB_RCC8_TPP; - return true; - } - else if ((interExterBool) && (!edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_NTPPI; - return true; - } - else if ((interExterBool) && (!edgeEdgeBool) && (exterInterBool)) - { - m_Value = OTB_RCC8_DC; - return true; - } - else if ((interExterBool) && (edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_TPPI; - return true; - } - else - { - return false; - } -} -/** - * Test if the boolean image is totally black or not. This is a based on the lazy operator - * paradigm. - * \param image The image to test. - * \return True or false. - */ -template<class TInputImage> -bool -ImageToImageRCC8Calculator<TInputImage> -::IsBoolImageNotEmpty(BoolImagePointerType image) -{ - typedef itk::ImageRegionConstIterator<BoolImageType> IteratorType; - // TODO : we'll eventually need to change something. - IteratorType it(image, image->GetLargestPossibleRegion()); - it.GoToBegin(); - while (!it.IsAtEnd()) - { - if (it.Get()) - { - return true; - } - ++it; - } - return false; -} -/** - * Main computation method. - */ -template <class TInputImage> -void -ImageToImageRCC8Calculator<TInputImage> -::GenerateData(void) -{ - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData()"); - /// First we compute the minimal region of interest we will use for the relation computation - m_MinimalROI = this->ComputeMinimalRegion(); - /// If they are disjoint, the answer is trivial - if ((m_MinimalROI.GetSize()[0] <= 1) || (m_MinimalROI.GetSize()[1] <= 1)) - { - /// The relation is DC - m_Value = OTB_RCC8_DC; - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Disjoint regions"); - } - else - { - /// else each input images is cast to boolean type and reduced to - // the minimal region - m_BoolImage1 = ConvertToBoolImage(this->GetInput1(), m_InsideValue1); - m_BoolImage2 = ConvertToBoolImage(this->GetInput2(), m_InsideValue2); - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Bool images computed: "<<m_BoolImage1->GetLargestPossibleRegion().GetSize()); - /// Then the boolean which will be used to determine the relation - /// are declared - bool edgeEdgeBool, interExterBool, exterInterBool, interInterBool; - /// The boolean edgeEdge is needed in each case, so it si computed - /// now - edgeEdgeBool = ComputeEdgeEdgeBool(); - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): edgeEdge "<<edgeEdgeBool); - //TODELETE std::cout<<"RCC8Calculator->GenerateData(): edgeEdge "<<edgeEdgeBool<<std::endl; - /// Here comes the outside knowledge - if (this->GetLevel1APrioriKnowledge()) - { - /// If the Level1APrioriKnowledge is set, then the - /// interExterBool is set to true - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Level1APrioriKnowledge."); - interExterBool = true; - } - else - { - /// Else it must be computed - interExterBool = ComputeInterExterBool(); - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): interExter "<<interExterBool); - } - /// At this stage we can determine if the relation is of type NTPP - //TODELETE std::cout<<"RCC8Calculator->GenerateData(): interExter "<<interExterBool<<std::endl; - if ((!interExterBool) && (!edgeEdgeBool)) - { - m_Value = OTB_RCC8_NTPP; - } - else - { - /// If not, we must consider the intersection between exterior - if (this->GetLevel3APrioriKnowledge()) - { - /// If the Level3APRioriKnowledge flag is set, this boolean - /// can be determined from the two others - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): Level3APrioriKnowledge."); - exterInterBool = true; - } - else - { - /// Else it must be computed - exterInterBool = ComputeExterInterBool(); - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): ExterInter "<<exterInterBool); - } - //TODELETE std::cout<<"RCC8Calculator->GenerateData(): ExterInter "<<exterInterBool<<std::endl; - /// If it is not sufficient to compute the relation - if (!ComputeRelation(edgeEdgeBool, interExterBool, exterInterBool)) - { - /// Compute the last boolean - interInterBool = ComputeInterInterBool(); - //TODELETE std::cout<<"RCC8Calculator->GenerateData(): InterInter "<<interInterBool<<std::endl; - // otbMsgDebugMacro(<<"RCC8Calculator->GenerateData(): InterInter "<<interInterBool); - /// Which allow the full determination - if ((interExterBool) && (edgeEdgeBool) && (exterInterBool) && (!interInterBool)) - { - m_Value = OTB_RCC8_EC; - } - else - { - m_Value = OTB_RCC8_PO; - } - } - } - } -} -/** -* PrintSelf method -*/ -template<class TInputImage> -void -ImageToImageRCC8Calculator<TInputImage> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} - -} // end namespace itk - -#endif diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h deleted file mode 100644 index 7c2d8175a3cccfa6282af5e58125269886fd980b..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.h +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPolygonListToRCC8GraphFilter_h -#define otbPolygonListToRCC8GraphFilter_h - -#include "otbRCC8GraphSource.h" -#include "otbPolygonToPolygonRCC8Calculator.h" -#include "otbRCC8VertexIterator.h" -#include "otbRCC8InEdgeIterator.h" -#include "otbRCC8OutEdgeIterator.h" - -namespace otb -{ -/** - * \class PolygonListToRCC8GraphFilter - * \brief This class computes an RCC8 graph from a set of polygons. - * \sa ImageMultiSegmentationToRCC8GraphFilter - * - * \ingroup OTBRCC8 - */ -template <class TPolygonList, class TOutputGraph> -class ITK_EXPORT PolygonListToRCC8GraphFilter - : public RCC8GraphSource<TOutputGraph> -{ -public: - /** Standard class typedefs. */ - typedef PolygonListToRCC8GraphFilter Self; - typedef RCC8GraphSource<TOutputGraph> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(PolygonListToRCC8GraphFilter, RCC8GraphSource); - - /** Input related typedef */ - typedef TPolygonList PolygonListType; - typedef typename PolygonListType::ConstPointer PolygonListConstPointerType; - typedef typename PolygonListType::ObjectType PolygonType; - typedef typename PolygonType::Pointer PolygonPointerType; - - /** Output related typedefs */ - typedef TOutputGraph OutputGraphType; - typedef typename OutputGraphType::Pointer OutputGraphPointerType; - typedef typename OutputGraphType::VertexType VertexType; - typedef typename VertexType::Pointer VertexPointerType; - typedef typename VertexType::PathType PathType; - typedef typename OutputGraphType::VertexDescriptorType VertexDescriptorType; - - /** Knowledge enum typedef */ - typedef typename OutputGraphType::RCC8ValueType RCC8ValueType; - typedef enum {NO_INFO, LEVEL_1, LEVEL_3, FULL} KnowledgeValueType; - typedef std::pair<KnowledgeValueType, RCC8ValueType> KnowledgeStateType; - - /** RCC8 calculator typedef */ - typedef PolygonToPolygonRCC8Calculator<PolygonType> RCC8CalculatorType; - - /** Graph iterators typedefs */ - typedef RCC8VertexIterator<OutputGraphType> VertexIteratorType; - typedef RCC8InEdgeIterator<OutputGraphType> InEdgeIteratorType; - typedef RCC8OutEdgeIterator<OutputGraphType> OutEdgeIteratorType; - - typedef typename VertexIteratorType::VertexDescriptorType EdgePairElementType; - typedef std::pair<EdgePairElementType, EdgePairElementType> EdgePairType; - typedef std::map<EdgePairType, RCC8ValueType> EdgeMapType; - typedef std::vector<EdgeMapType> EdgeMapVectorType; - - typedef std::vector<unsigned int> SegmentationRangesType; - - /** Toogle optimisation flag */ - itkBooleanMacro(Optimisation); - itkSetMacro(Optimisation, bool); - itkBooleanMacro(UseInverted); - itkSetMacro(UseInverted, bool); - - void SetSegmentationRanges(SegmentationRangesType ranges) - { - m_SegmentationRanges = ranges; - } - - const SegmentationRangesType& GetSegmentationRanges() const - { - return m_SegmentationRanges; - } - - /** - * Get the number of occurrences of the given value - * \return The value. - */ - unsigned int GetRelationsCount(RCC8ValueType val); - - /** - * Get number of relations - * \return The number of relations. - */ - unsigned int GetNumberOfRelations(void); - - using Superclass::SetInput; - /** Set the input of the filter */ - virtual void SetInput(const PolygonListType *input); - /** Get the input of the filter */ - const PolygonListType * GetInput(void); - -protected: - /** Constructor */ - PolygonListToRCC8GraphFilter(); - /** Destructor */ - ~PolygonListToRCC8GraphFilter() override; - /** Main computation method */ - void GenerateData() override; - - /** Multi-threading implementation */ - - virtual void BeforeThreadedGenerateData(); - - virtual void AfterThreadedGenerateData(); - - /** startIndex and stopIndex represent the indices of the vertex to - examine in thread threadId */ - virtual void ThreadedGenerateData(unsigned int startIndex, unsigned int stopIndex, itk::ThreadIdType threadId); - - /** Static function used as a "callback" by the MultiThreader. The threading - * library will call this routine for each thread, which will delegate the - * control to ThreadedGenerateData(). */ - static ITK_THREAD_RETURN_TYPE ThreaderCallback(void *arg); - - /** Internal structure used for passing image data into the threading library */ - struct ThreadStruct - { - Pointer Filter; - }; - - /** End Multi-threading implementation */ - - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** - * Get the composition knowledge. - * \param r1 First RCC8 relation value, - * \param r2 Second RCC8 relation value, - * \return The knowledge associated with the composition. - */ - KnowledgeStateType GetKnowledge(RCC8ValueType r1, RCC8ValueType r2); - -private: - /** Optimisation flag */ - bool m_Optimisation; - unsigned int m_Accumulator[8]; - EdgeMapVectorType m_EdgesPerThread; - - /** This array stores the indices corresponding to each segmentation */ - SegmentationRangesType m_SegmentationRanges; - - /** If set to true, the filter will also add the invert relationship - * between v2 and v1 */ - bool m_UseInverted; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbPolygonListToRCC8GraphFilter.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx b/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx deleted file mode 100644 index 10842bf64866a0753828b9cf23f056173dd90ee1..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbPolygonListToRCC8GraphFilter.hxx +++ /dev/null @@ -1,460 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPolygonListToRCC8GraphFilter_hxx -#define otbPolygonListToRCC8GraphFilter_hxx - -#include "otbPolygonListToRCC8GraphFilter.h" -#include "itkProgressReporter.h" - -namespace otb -{ -/** - * Constructor. - */ -template <class TPolygonList, class TOutputGraph> -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::PolygonListToRCC8GraphFilter() -{ - this->SetNumberOfRequiredInputs(1); - m_Optimisation = false; - m_UseInverted = false; -} -/** - * Destructor. - */ -template <class TPolygonList, class TOutputGraph> -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::~PolygonListToRCC8GraphFilter() -{} - -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::SetInput(const PolygonListType *input) -{ - // Process object is not const-correct so the const_cast is required here - this->itk::ProcessObject::SetNthInput(0, - const_cast<PolygonListType *>(input)); -} - -template <class TPolygonList, class TOutputGraph> -const typename PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph>::PolygonListType * -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::GetInput(void) -{ - if (this->GetNumberOfInputs() < 1) - { - return nullptr; - } - - return static_cast<const TPolygonList *> - (this->itk::ProcessObject::GetInput(0)); -} - -template <class TPolygonList, class TOutputGraph> -unsigned int -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::GetRelationsCount(RCC8ValueType val) -{ - return m_Accumulator[val]; -} - -template <class TPolygonList, class TOutputGraph> -unsigned int -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::GetNumberOfRelations() -{ - unsigned int result = 0; - for (unsigned int i = 0; i < 8; ++i) - { - result += m_Accumulator[i]; - - } - return result; -} -template <class TPolygonList, class TOutputGraph> -typename PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::KnowledgeStateType -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::GetKnowledge(RCC8ValueType r1, RCC8ValueType r2) -{ - m_Accumulator[0] = 0; - m_Accumulator[1] = 0; - m_Accumulator[2] = 0; - m_Accumulator[3] = 0; - m_Accumulator[4] = 0; - m_Accumulator[5] = 0; - m_Accumulator[6] = 0; - m_Accumulator[7] = 0; - - // otbMsgDebugMacro(<<"RCC8GraphFilter: entering GetKnowledge method."); - // This is the RCC8 composition table - const int knowledge[8][8] - = - { - /** DC EC PO TPP TPPi NTPP i EQ */ - /** DC */ {-3, -2, -2, -2, 0, -2, 0, 0}, - /** EC */ {-1, -3, -2, -3, -1, -3, 0, 1}, - /** PO */ {-1, -1, -3, -3, -1, -3, -1, 2}, - /** TPP */ { 0, -1, -2, -3, -3, 5, -1, 3}, - /** TPPi*/ {-1, -1, -1, -3, -1, -3, 6, 4}, - /** NTPP*/ { 0, 0, -2, 5, -2, 5, -3, 5}, - /** NTPPi*/ {-1, -1, -1, -1, 6, -3, 6, 6}, - /** EQ */ { 0, 1, 2, 3, 4, 5, 6, 7} - }; - - int value = knowledge[r1][r2]; - // Each negative case correspond to a level of knowledge - if (value >= 0) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: FULL"); - return KnowledgeStateType(FULL, static_cast<RCC8ValueType>(value)); - } - else if (value == -1) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method: LEVEL_1"); - return KnowledgeStateType(LEVEL_1, OTB_RCC8_DC); - } - else if (value == -2) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.LEVEL_3"); - return KnowledgeStateType(LEVEL_3, OTB_RCC8_DC); - } - else - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: leaving GetKnowledge method.NO_INFO"); - return KnowledgeStateType(NO_INFO, OTB_RCC8_DC); - } -} -/** - * Main computation method. - */ -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::GenerateData() -{ - // Call a method that can be overridden by a subclass to perform - // some calculations prior to splitting the main computations into - // separate threads - this->BeforeThreadedGenerateData(); - - // Set up the multithreaded processing - ThreadStruct str; - str.Filter = this; - - // // Initializing edges vectors per thread - EdgeMapType defaultEdgeMap; - m_EdgesPerThread = EdgeMapVectorType(this->GetNumberOfThreads(), defaultEdgeMap); - - // Setting up multithreader - this->GetMultiThreader()->SetNumberOfThreads(this->GetNumberOfThreads()); - this->GetMultiThreader()->SetSingleMethod(this->ThreaderCallback, &str); - - // multithread the execution - this->GetMultiThreader()->SingleMethodExecute(); - - // Call a method that can be overridden by a subclass to perform - // some calculations after all the threads have completed - this->AfterThreadedGenerateData(); -} - -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::BeforeThreadedGenerateData() -{ - // Output graph pointer - OutputGraphPointerType graph = this->GetOutput(); - PolygonListConstPointerType inputPtr = this->GetInput(); - -// Initializing output graph - graph->SetNumberOfVertices(inputPtr->Size()); - graph->Build(); - - // Vertex indexes - unsigned int nbVertices = 0; - - typedef typename PolygonListType::ConstIterator PolygonListConstIteratorType; - - // Loads the polygons list to graph nodes - for (PolygonListConstIteratorType it = inputPtr->Begin(); - it != inputPtr->End(); ++it) - { - // Create a new vertex - VertexPointerType vertex = VertexType::New(); - // Set its properties - vertex->SetPath(it.Get()); - - // look for the appropriate segmentation index - - unsigned int segIndex = 1; - - while (segIndex < m_SegmentationRanges.size() && - (nbVertices < m_SegmentationRanges[segIndex - 1] || nbVertices >= m_SegmentationRanges[segIndex])) - { - ++segIndex; - } - - vertex->SetSegmentationLevel(segIndex - 1); - - // Put it in the graph - graph->SetVertex(nbVertices, vertex); - otbMsgDevMacro(<< "Adding vertex: " << nbVertices); - ++nbVertices; - } -} - -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::ThreadedGenerateData(unsigned int startIndex, unsigned int stopIndex, itk::ThreadIdType threadId) -{ - //std::cout<<"Starting thread "<<threadId <<" to work on range ["<<startIndex<<", "<<stopIndex<<"]"<<std::endl; - - // Output graph pointer - OutputGraphPointerType graph = this->GetOutput(); - PolygonListConstPointerType inputPtr = this->GetInput(); - - // invert value vector - RCC8ValueType invert[8] = {OTB_RCC8_DC, OTB_RCC8_EC, OTB_RCC8_PO, OTB_RCC8_TPPI, - OTB_RCC8_TPP, OTB_RCC8_NTPPI, OTB_RCC8_NTPP, OTB_RCC8_EQ}; - - unsigned int nbVertices = graph->GetNumberOfVertices(); - itk::ProgressReporter progress(this, threadId, ((int) stopIndex - (int) startIndex)*nbVertices); - - otbMsgDevMacro(<< "Adjacency matrix size: " << nbVertices * nbVertices); - - VertexIteratorType vIt1(graph); - VertexIteratorType vIt2(graph); - - unsigned int count = 0; - - // For each couple of vertices - for (vIt1.GoToBegin(); !vIt1.IsAtEnd(); ++vIt1) - { - // TODO: this is not correct and should be replaced by a - // vIt1(graph, index1, index2), which does not exist for the moment - if ((count >= startIndex) && (count < stopIndex)) - { - for (vIt2.GoToBegin(); !vIt2.IsAtEnd(); ++vIt2) - { - //We do not examine each couple because of the RCC8 symmetry - if (vIt1.GetIndex() < vIt2.GetIndex()) - { - - // Compute the RCC8 relation - typename RCC8CalculatorType::Pointer calc = RCC8CalculatorType::New(); - calc->SetPolygon1(vIt1.Get()->GetPath()); - calc->SetPolygon2(vIt2.Get()->GetPath()); - RCC8ValueType value = OTB_RCC8_DC; - - // if the optimisations are activated - if (m_Optimisation) - { - // otbMsgDebugMacro(<<"RCC8GraphFilter: Entering optimisation loop"); - InEdgeIteratorType inIt1(vIt1.GetIndex(), graph); - InEdgeIteratorType inIt2(vIt2.GetIndex(), graph); - // otbMsgDebugMacro(<<"Optimisation loop: iterators initialised"); - VertexDescriptorType betweenIndex; - KnowledgeStateType know(NO_INFO, OTB_RCC8_DC); - inIt1.GoToBegin(); - - // Iterate through the edges going to the first vertex - while (!inIt1.IsAtEnd() && (know.first != FULL)) - { - betweenIndex = inIt1.GetSourceIndex(); - inIt2.GoToBegin(); - bool edgeFound = false; - while (!inIt2.IsAtEnd() && (know.first != FULL)) - { - // try to find an intermediate vertex between the two ones which - // we vant to compute the relationship - if (inIt2.GetSourceIndex() == betweenIndex) - { - // if an intermediate vertex is found - edgeFound = true; - // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex); - // See if it brings some info on the RCCC8 value - know = GetKnowledge(invert[inIt1.GetValue()], inIt2.GetValue()); - calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1); - calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3); - // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second); - } - ++inIt2; - } - // If no intermediate was found - if (!edgeFound) - { - // otbMsgDebugMacro(<<"Optimisation loop: found an intermediary vertex:" <<betweenIndex); - // Try using a DC relationship - know = GetKnowledge(invert[inIt1.GetValue()], OTB_RCC8_DC); - calc->SetLevel1APrioriKnowledge(know.first == LEVEL_1); - calc->SetLevel3APrioriKnowledge(know.first == LEVEL_3); - // otbMsgDebugMacro(<<"Optimisation loop: knowledge: "<<know.first<<","<<know.second); - } - ++inIt1; - } - // If the search has fully determined the RCC8 - if (know.first == FULL) - { - // Get the value - value = know.second; - } - else - { - // Else trigger the computation - // (which will take the optimisation phase info into account) - calc->Compute(); - value = calc->GetValue(); - } - // otbMsgDebugMacro(<<"RCC8GraphFilter: Leaving optimisation loop"); - } - // If the optimisations are not activated - else - { - calc->Compute(); - value = calc->GetValue(); - } - m_Accumulator[value] += 1; - m_Accumulator[invert[value]] += 1; - // If the vertices are connected - if (value > OTB_RCC8_DC) - { - // Add the edge to the graph. - otbMsgDevMacro(<< "Adding edge: " << vIt1.GetIndex() << " -> " << vIt2.GetIndex() << ": " << value); - if (value == OTB_RCC8_NTPPI) - { - m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = OTB_RCC8_NTPP; - } - else if (value == OTB_RCC8_TPPI) - { - m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = OTB_RCC8_TPP; - } - else - { - m_EdgesPerThread[threadId][EdgePairType(vIt1.GetIndex(), vIt2.GetIndex())] = value; - } - if (m_UseInverted) - { - m_EdgesPerThread[threadId][EdgePairType(vIt2.GetIndex(), vIt1.GetIndex())] = invert[value]; - } - } - } - progress.CompletedPixel(); - progress.CompletedPixel(); - } - } - ++count; - } - otbMsgDebugMacro(<< "End thread " << threadId); -} - -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::AfterThreadedGenerateData() -{ - // in order to have the same output graph whatever the number of - // thread is, we use a map to sort the edges in lexicographical - // order - - OutputGraphPointerType graph = this->GetOutput(); - EdgeMapType globalEdgeMap; - - // merge all edges - for (typename EdgeMapVectorType::iterator vIt = m_EdgesPerThread.begin(); - vIt != m_EdgesPerThread.end(); ++vIt) - { - for (typename EdgeMapType::iterator mIt = (*vIt).begin(); - mIt != (*vIt).end(); ++mIt) - { - globalEdgeMap[mIt->first] = mIt->second; - } - } - - // Report edges to the graph - for (typename EdgeMapType::iterator mIt = globalEdgeMap.begin(); - mIt != globalEdgeMap.end(); ++mIt) - { - graph->AddEdge(mIt->first.first, mIt->first.second, mIt->second); - } -} - -// Callback routine used by the threading library. This routine just calls -// the ThreadedGenerateData method after setting the correct region for this -// thread. - -template <class TPolygonList, class TOutputGraph> -ITK_THREAD_RETURN_TYPE -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::ThreaderCallback(void *arg) -{ - ThreadStruct *str; - int threadId, threadCount; - unsigned int total, start, stop; - - threadId = ((itk::MultiThreader::ThreadInfoStruct *) (arg))->ThreadID; - threadCount = ((itk::MultiThreader::ThreadInfoStruct *) (arg))->NumberOfThreads; - str = (ThreadStruct *) (((itk::MultiThreader::ThreadInfoStruct *) (arg))->UserData); - - total = str->Filter->GetOutput()->GetNumberOfVertices(); - - if (threadId < static_cast<int>(total)) - { - - // Split the adjacency matrix in strip of equal dimension - start = - static_cast<unsigned int>(std::floor(total * - std::sqrt(static_cast<double>(threadId) / - static_cast<double>(threadCount)) + 0.5)); - stop = - static_cast<unsigned int>(std::floor(total * - std::sqrt(static_cast<double>(threadId + - 1) / static_cast<double>(threadCount)) + 0.5)); - if (stop > total) stop = total; - - // For very small graphs it might occur that start = stop. In this - // case the vertex at that index will be processed in the next strip. - if (start != stop) - { - str->Filter->ThreadedGenerateData(start, stop, threadId); - } - } - // else - // { - // otherwise don't use this thread. Sometimes the threads don't - // break up very well and it is just as efficient to leave a - // few threads idle. - // } - - return ITK_THREAD_RETURN_VALUE; -} - -template <class TPolygonList, class TOutputGraph> -void -PolygonListToRCC8GraphFilter<TPolygonList, TOutputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h b/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h deleted file mode 100644 index b19cf4a7a31d6d30959b4fe39d193535021376f8..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPolygonToPolygonRCC8Calculator_h -#define otbPolygonToPolygonRCC8Calculator_h - -#include "itkObject.h" -#include "otbRCC8Value.h" -#include "otbImage.h" - -namespace otb -{ -/** - * \class PolygonToPolygonRCC8Calculator - * \brief This class compute the RCC8 relation between the regions from two segmentation images. - * - * The RCC8 system comes from qualitative spatial reasoning. - * It is a set of pairwise disjoint exhaustive relation between two closed region of space. - * There are 8 possible relations : - * DC: Disconnected - * EC: Externaly connected - * PO: Partial overlap - * TPP: Tangential proper part - * NTPP: Non tangential proper part - * TPPI: Tangential proper part inverse - * NTPPI: Non tangential proper part inverse - * EQ: Equivalence - * - * The goal of this class is to determine which of these 8 relations link the two inputs regions represented - * by the closed input path. Since this class will further be used iteratively on a possibly large set - * of regiosn, it is optimised : the decision is managed by a decision tree. - * - * \ingroup OTBRCC8 - */ -template <class TInputPolygon> -class ITK_EXPORT PolygonToPolygonRCC8Calculator : public itk::Object -{ -public: - /** Standard class typedefs. */ - typedef PolygonToPolygonRCC8Calculator Self; - typedef itk::Object Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(PolygonToPolygonRCC8Calculator, Object); - /** Types definitions for the input image. */ - typedef TInputPolygon PolygonType; - typedef typename PolygonType::Pointer PolygonPointerType; - typedef typename PolygonType::ConstPointer PolygonConstPointerType; - typedef typename PolygonType::VertexListType VertexListType; - typedef typename PolygonType::ContinuousIndexType ContinuousIndexType; - typedef typename PolygonType::RegionType::ImageRegionType RegionType; - typedef typename VertexListType::ConstIterator VertexListConstIteratorType; - typedef std::vector<bool> BoolVectorType; - - /** RCC8 values type */ - typedef RCC8Value RCC8ValueType; - - /** - * Get the RCC8 relation. - * \return The RCC8 relation value. - */ - RCC8ValueType GetValue(void); - - /** Set external knowledge to help the decision process */ - itkSetMacro(Level1APrioriKnowledge, bool); - itkSetMacro(Level3APrioriKnowledge, bool); - itkGetMacro(Level1APrioriKnowledge, bool); - itkGetMacro(Level3APrioriKnowledge, bool); - - itkSetObjectMacro(Polygon1, PolygonType); - itkSetObjectMacro(Polygon2, PolygonType); - itkGetObjectMacro(Polygon1, PolygonType); - itkGetObjectMacro(Polygon2, PolygonType); - - /** Main computation method */ - void Compute(void); - - virtual bool ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool); - - virtual bool ComputeInterExter(PolygonPointerType path1, PolygonPointerType path2); - - virtual bool ComputeEdgeEdge(PolygonPointerType path1, PolygonPointerType path2); - - virtual bool ComputeInterInter(PolygonPointerType path1, PolygonPointerType path2); - - virtual bool RegionsIntersectionIsNull(const RegionType& region1, const RegionType& region2); - -protected: - /** Constructor */ - PolygonToPolygonRCC8Calculator(); - /** Destructor */ - ~PolygonToPolygonRCC8Calculator() override {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** The RCC8 relation value */ - RCC8ValueType m_Value; - /** Decision tree Level 1 A priori knowledge */ - bool m_Level1APrioriKnowledge; - /** Decision tree Level 3 A priori knowledge */ - bool m_Level3APrioriKnowledge; - /** Polygon of region 1 */ - PolygonPointerType m_Polygon1; - /** Polygon of region 2 */ - PolygonPointerType m_Polygon2; - /** Epsilon */ - double m_Epsilon; - -}; -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbPolygonToPolygonRCC8Calculator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx b/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx deleted file mode 100644 index bcb836fa4c5baf6e07c9a9bb782b6d90042455d9..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbPolygonToPolygonRCC8Calculator.hxx +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPolygonToPolygonRCC8Calculator_hxx -#define otbPolygonToPolygonRCC8Calculator_hxx - -#include "otbPolygonToPolygonRCC8Calculator.h" -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template<class TInputPolygon> -PolygonToPolygonRCC8Calculator<TInputPolygon> -::PolygonToPolygonRCC8Calculator() -{ - m_Value = OTB_RCC8_DC; - m_Level1APrioriKnowledge = false; - m_Level3APrioriKnowledge = false; -} -/** - * Get the RCC8 relation. - * \return The RCC8 relation value. - */ -template <class TInputPolygon> -typename PolygonToPolygonRCC8Calculator<TInputPolygon> -::RCC8ValueType -PolygonToPolygonRCC8Calculator<TInputPolygon> -::GetValue(void) -{ - return m_Value; -} - -template<class TInputPolygon> -void -PolygonToPolygonRCC8Calculator<TInputPolygon> -::Compute(void) -{ - // First check if bounding regions are disjoints - RegionType region1 = m_Polygon1->GetBoundingRegion().GetImageRegion(); - RegionType region2 = m_Polygon2->GetBoundingRegion().GetImageRegion(); - - // If intersection is not null, we have to do the computation - if (!RegionsIntersectionIsNull(region1, region2)) - { - - bool edgeEdgeBool, interExterBool, exterInterBool, interInterBool; - /// The boolean edgeEdge is needed in each case, so it si computed - /// now - edgeEdgeBool = ComputeEdgeEdge(m_Polygon1, m_Polygon2); - - //std::cout<<"EdgeEdge: "<<edgeEdgeBool<<std::endl; - - if (this->GetLevel1APrioriKnowledge()) - { - interExterBool = true; - } - else - { - /// Else it must be computed - interExterBool = ComputeInterExter(m_Polygon1, m_Polygon2); - } - - //std::cout<<"InterExter: "<<interExterBool<<std::endl; - - /// At this stage we can determine if the relation is of type NTPP - if ((!interExterBool) && (!edgeEdgeBool)) - { - m_Value = OTB_RCC8_NTPP; - } - else - { - /// If not, we must consider the intersection between exterior - if (this->GetLevel3APrioriKnowledge()) - { - /// If the Level3APRioriKnowledge flag is set, this boolean - /// can be determined from the two others - exterInterBool = true; - } - else - { - /// Else it must be computed - exterInterBool = ComputeInterExter(m_Polygon2, m_Polygon1); - } - - //std::cout<<"ExterInter: "<<exterInterBool<<std::endl; - - /// If it is not sufficient to compute the relation - if (!ComputeRelation(edgeEdgeBool, interExterBool, exterInterBool)) - { - /// Compute the last boolean - interInterBool = ComputeInterInter(m_Polygon1, m_Polygon2); - - //std::cout<<"InterInter: "<<interInterBool<<std::endl; - - /// Which allow the full determination - if ((interExterBool) && (edgeEdgeBool) && (exterInterBool) && (!interInterBool)) - { - m_Value = OTB_RCC8_EC; - } - else - { - m_Value = OTB_RCC8_PO; - } - } - } - } -} - -template<class TInputPolygon> -bool -PolygonToPolygonRCC8Calculator<TInputPolygon> -::RegionsIntersectionIsNull(const RegionType& region1, const RegionType& region2) -{ - for (unsigned int dim = 0; dim < RegionType::ImageDimension; ++dim) - { - if (region1.GetIndex()[dim] + static_cast<int>(region1.GetSize()[dim]) < region2.GetIndex()[dim]) - { - return true; - } - else if (region2.GetIndex()[dim] + static_cast<int>(region2.GetSize()[dim]) < region1.GetIndex()[dim]) - { - return true; - } - } - return false; -} - -template<class TInputPolygon> -bool -PolygonToPolygonRCC8Calculator<TInputPolygon> -::ComputeRelation(bool edgeEdgeBool, bool interExterBool, bool exterInterBool) -{ - // This decision process is based on a decision tree - if ((!interExterBool) && (edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_EQ; - return true; - } - else if ((!interExterBool) && (edgeEdgeBool) && (exterInterBool)) - { - m_Value = OTB_RCC8_TPP; - return true; - } - else if ((interExterBool) && (!edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_NTPPI; - return true; - } - else if ((interExterBool) && (!edgeEdgeBool) && (exterInterBool)) - { - m_Value = OTB_RCC8_DC; - return true; - } - else if ((interExterBool) && (edgeEdgeBool) && (!exterInterBool)) - { - m_Value = OTB_RCC8_TPPI; - return true; - } - else - { - return false; - } -} - -template<class TInputPolygon> -bool -PolygonToPolygonRCC8Calculator<TInputPolygon> -::ComputeInterExter(PolygonPointerType polygon1, PolygonPointerType polygon2) -{ - bool resp = false; - VertexListConstIteratorType it = polygon1->GetVertexList()->Begin(); - VertexListConstIteratorType it_end = polygon1->GetVertexList()->End(); - - ContinuousIndexType current = it.Value(); - ContinuousIndexType first = current; - bool isInside = polygon2->IsInside(current); - bool firstIsInside = isInside; - bool isExterior = !isInside && !polygon2->IsOnEdge(current); - - //std::cout<<current<<" is inside: "<<isInside<<std::endl; - //std::cout<<current<<" is on edge: "<<polygon2->IsOnEdge(current)<<std::endl; - - unsigned int index = 0; - if (isExterior) - { - resp = true; - } - ++it; - while (!resp && it != it_end) - { - bool nextIsInside = polygon2->IsInside(it.Value()); - - if (isInside && nextIsInside) - { - //std::cout<<current<<" is inside and "<<it.Value()<<" is inside, nb crossings: "<<polygon2->NbCrossing(current, it.Value())<<std::endl; - resp = polygon2->NbCrossing(current, it.Value()) > 0; - } - current = it.Value(); - isInside = nextIsInside; - isExterior = !isInside && !polygon2->IsOnEdge(current); - //std::cout<<current<<" is inside: "<<isInside<<std::endl; - //std::cout<<current<<" is on edge: "<<polygon2->IsOnEdge(current)<<std::endl; - if (isExterior) - { - resp = true; - } - - ++index; - ++it; - } - - if (!resp && isInside && firstIsInside) - { - resp = polygon2->NbCrossing(current, first) > 0; - //std::cout<<current<<" is inside and "<<first<<" is inside, nb crossings: "<<polygon2->NbCrossing(current, first)<<std::endl; - } - - return resp; -} - -template<class TInputPolygon> -bool -PolygonToPolygonRCC8Calculator<TInputPolygon> -::ComputeInterInter(PolygonPointerType polygon1, PolygonPointerType polygon2) -{ - bool resp = false; - VertexListConstIteratorType it = polygon1->GetVertexList()->Begin(); - VertexListConstIteratorType it_end = polygon1->GetVertexList()->End(); - ContinuousIndexType current = it.Value(); - ContinuousIndexType first = current; - bool currentIsInside = polygon2->IsInside(current); - bool firstIsInside = currentIsInside; - - if (currentIsInside) - { - resp = true; - } - ++it; - while (!resp && it != it_end) - { - bool nextIsInside = polygon2->IsInside(it.Value()); - - if (!currentIsInside && !nextIsInside && !polygon2->IsOnEdge(current) && !polygon2->IsOnEdge(it.Value())) - { - unsigned int nbCrossings = polygon2->NbCrossing(current, it.Value()); - - resp = nbCrossings > 0; - } - currentIsInside = nextIsInside; - current = it.Value(); - - if (currentIsInside) - { - resp = true; - } - ++it; - } - - if (!resp && !currentIsInside && !firstIsInside && !polygon2->IsOnEdge(current) && !polygon2->IsOnEdge(first)) - { - unsigned int nbCrossings = polygon2->NbCrossing(current, first); - - resp = nbCrossings > 0; - } - return resp; -} -template<class TInputPolygon> -bool -PolygonToPolygonRCC8Calculator<TInputPolygon> -::ComputeEdgeEdge(PolygonPointerType polygon1, PolygonPointerType polygon2) -{ - bool resp = false; - VertexListConstIteratorType it = polygon1->GetVertexList()->Begin(); - VertexListConstIteratorType it_end = polygon1->GetVertexList()->End(); - - ContinuousIndexType current = it.Value(); - resp = polygon2->IsOnEdge(current); - //std::cout<<"IsOnEdge: "<<current<<": "<<polygon2->IsOnEdge(current)<<std::endl; - ContinuousIndexType first = current; - ++it; - - while (!resp && it != it_end) - { - if (polygon2->NbTouching(current, it.Value()) > 0) - { - resp = true; - //std::cout<<"NbCrossing: "<<current<<" -> "<<it.Value()<<": "<<polygon2->NbCrossing(current, it.Value())<<std::endl; - } - if (polygon2->NbCrossing(current, it.Value()) > 0) - { - resp = true; - //std::cout<<"NbTouching: "<<current<<" -> "<<it.Value()<<": "<<polygon2->NbTouching(current, it.Value())<<std::endl; - } - current = it.Value(); - - if (polygon2->IsOnEdge(current)) - { - resp = true; - //std::cout<<"IsOnEdge: "<<current<<": "<<polygon2->IsOnEdge(current)<<std::endl; - } - ++it; - } - if (!resp && polygon2->NbTouching(current, first) > 0) - { - resp = true; - //std::cout<<"NbCrossing: "<<current<<" -> "<<first<<": "<<polygon2->NbCrossing(current, first)<<std::endl; - } - if (polygon2->NbCrossing(current, first) > 0) - { - resp = true; - //std::cout<<"NbTouching: "<<current<<" -> "<<first<<": "<<polygon2->NbTouching(current, first)<<std::endl; - } - - return resp; -} -/** - * PrintSelf method - */ -template<class TInputPolygon> -void -PolygonToPolygonRCC8Calculator<TInputPolygon> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // end namespace otb - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8Edge.h b/Modules/OBIA/RCC8/include/otbRCC8Edge.h deleted file mode 100644 index e85d8d3c755e5bfb363551519bde0aafaab2ffbd..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8Edge.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8Edge_h -#define otbRCC8Edge_h - -#include "itkDataObject.h" -#include "itkObjectFactory.h" -#include "otbRCC8Value.h" - -namespace otb -{ -/** \class RCC8Edge - * \brief Base class to represent an edge in a RCC8 Graph. - * - * \sa RCC8Graph, RCC8VertexBase - * - * \ingroup OTBRCC8 - */ -class ITK_EXPORT RCC8Edge : public itk::DataObject -{ -public: - /** Standard class typedefs */ - typedef RCC8Edge Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8Edge, DataObject); - /** RCC8 values typedef */ - typedef RCC8Value RCC8ValueType; - /** RCC8 relation value accessors */ - itkGetMacro(Value, RCC8ValueType); - itkSetMacro(Value, RCC8ValueType); - -protected: - /** Constructor */ - RCC8Edge(); - /** Desctructor */ - ~RCC8Edge() override {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** The RCC8 value */ - RCC8ValueType m_Value; -}; -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h deleted file mode 100644 index c7096be92632966c1df05f1c522c0c68f6baa411..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8EdgeIterator_h -#define otbRCC8EdgeIterator_h - -#include "otbRCC8Graph.h" - -namespace otb -{ -/** - * \class RCC8EdgeIterator - * \brief Iterates on the graph edges. - * - * \ingroup OTBRCC8 - */ -template <class TGraph> -class ITK_EXPORT RCC8EdgeIterator -{ -public: - /** self typedef */ - typedef RCC8EdgeIterator Self; - - /** Graph typedef */ - typedef TGraph GraphType; - typedef typename GraphType::InternalGraphType InternalGraphType; - typedef typename GraphType::Pointer GraphPointerType; - typedef typename GraphType::EdgePointerType EdgePointerType; - typedef typename GraphType::VertexPointerType VertexPointerType; - typedef typename GraphType::VertexDescriptorType VertexDescriptorType; - typedef typename GraphType::RCC8ValueType RCC8ValueType; - /** typedef of the internal iterator */ - typedef typename boost::graph_traits<InternalGraphType>::edge_iterator InternalIteratorType; - /** Typedef of the index map */ - typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType; - - /** Constructor */ - RCC8EdgeIterator(); - /** Copy constructor */ - RCC8EdgeIterator(const Self &iter); - /** Constructor with input graph */ - RCC8EdgeIterator(TGraph * graph); - /** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ - RCC8ValueType GetValue(void); - /** - * Return the source vertex of the current edge. - * \return The source edge. - */ - VertexPointerType GetSourceVertex(void); - /** - * Return the target vertex of the current edge. - * \return The target vertex. - */ - VertexPointerType GetTargetVertex(void); - /** - * Return the source vertex index of the current edge. - * \return The source vertex index. - */ - VertexDescriptorType GetSourceIndex(void); - /** - * Return the target vertex index of the current edge. - * \return The target vertex index. - */ - VertexDescriptorType GetTargetIndex(void); - - /** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ - bool IsAtEnd(void); - /** - * Go to the beginning. - */ - void GoToBegin(void); - /** - * Increment. - */ - Self& operator ++(); - /** - * Decrement. - */ - Self& operator --(); - /** - * Add - */ - Self& operator +(int i); - - /** - * Remove - */ - Self& operator -(int i); - /** - * Difference comparison operator. - */ - bool operator !=(const Self& it); - /** - * Equality comparison operator. - */ - bool operator ==(const Self& it); - /** - * Instantiation operator. - */ - Self& operator =(const Self& it); -private: - // End - InternalIteratorType m_End; - // Internal iterator. - InternalIteratorType m_Iter; - // Input graph pointer - GraphPointerType m_Graph; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8EdgeIterator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx deleted file mode 100644 index 43989016883e56e95e053e6e547d5b78e0e6ce99..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8EdgeIterator.hxx +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8EdgeIterator_hxx -#define otbRCC8EdgeIterator_hxx - -#include "otbRCC8EdgeIterator.h" - -namespace otb -{ -/** Constructor */ -template <class TGraph> -RCC8EdgeIterator<TGraph> -::RCC8EdgeIterator() -{ - m_Graph = GraphType::New(); - boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph()); -} -/** - * Copy operator. - */ -template <class TGraph> -RCC8EdgeIterator<TGraph> -::RCC8EdgeIterator(const Self& iter) -{ - m_Iter = iter.m_Iter; - m_Graph = iter.m_Graph; - m_End = iter.m_End; -} -/** - *Constructor with input graph - */ -template <class TGraph> -RCC8EdgeIterator<TGraph> -::RCC8EdgeIterator(TGraph * graph) -{ - m_Graph = graph; - boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph()); -} -/** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::RCC8ValueType -RCC8EdgeIterator<TGraph> -::GetValue(void) -{ - return (*m_Graph->GetGraph())[*m_Iter]->GetValue(); -} -/** - * Return the source vertex of the current edge. - * \return The source edge. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::VertexPointerType -RCC8EdgeIterator<TGraph> -::GetSourceVertex(void) -{ - return (*m_Graph->GetGraph())[source(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return the target vertex of the current edge. - * \return The target vertex. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::VertexPointerType -RCC8EdgeIterator<TGraph> -::GetTargetVertex(void) -{ - return (*m_Graph->GetGraph())[target(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return the source vertex index of the current edge. - * \return The source vertex index. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::VertexDescriptorType -RCC8EdgeIterator<TGraph> -::GetSourceIndex(void) -{ - IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph())); - return index[source(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return the target vertex index of the current edge. - * \return The target vertex index. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::VertexDescriptorType -RCC8EdgeIterator<TGraph> -::GetTargetIndex(void) -{ - IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph())); - return index[target(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ -template <class TGraph> -bool -RCC8EdgeIterator<TGraph> -::IsAtEnd(void) -{ - return (m_Iter == m_End); -} -/** - * Go to the beginning. - */ -template <class TGraph> -void -RCC8EdgeIterator<TGraph> -::GoToBegin(void) -{ - boost::tuples::tie(m_Iter, m_End) = edges(*m_Graph->GetGraph()); -} -/** - * Increment. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::Self& -RCC8EdgeIterator<TGraph> -::operator++ () - { - ++m_Iter; - return *this; - } -/** - * Decrement. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::Self& -RCC8EdgeIterator<TGraph> -::operator-- () - { - --m_Iter; - return *this; - } -/** - * Add - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::Self& -RCC8EdgeIterator<TGraph> -::operator + (int i) - { - m_Iter = m_Iter + i; - return *this; - } -/** - * Remove - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::Self& -RCC8EdgeIterator<TGraph> -::operator - (int i) - { - m_Iter = m_Iter - i; - return *this; - } -/** - * Difference comparison operator. - */ -template <class TGraph> -bool -RCC8EdgeIterator<TGraph> -::operator != (const Self &iter) - { - return (m_Iter != iter.m_Iter); - } -/** - * Equality comparison operator. - */ -template <class TGraph> -bool -RCC8EdgeIterator<TGraph> -::operator == (const Self &iter) - { - return (m_Iter == iter.m_Iter); - } -/** - * Instantiation operator. - */ -template <class TGraph> -typename RCC8EdgeIterator<TGraph> -::Self& -RCC8EdgeIterator<TGraph> -::operator = (const Self &iter) - { - m_Iter = iter.m_Iter; - return *this; - } -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.h b/Modules/OBIA/RCC8/include/otbRCC8Graph.h deleted file mode 100644 index 9caa3ef59626a55d833fda5aaebebd1b09a28f6e..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8Graph.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8Graph_h -#define otbRCC8Graph_h - -#include "otbRCC8Edge.h" - -//fix compilation in VS7.1 for boost 1.42 -//similar to the fix in Monteverdi -#ifndef BOOST_NO_0X_HDR_INITIALIZER_LIST -#define BOOST_NO_0X_HDR_INITIALIZER_LIST -#endif - -#include "otb_boost_graph_header.h" - -#include "otbImage.h" -#include "otbImageList.h" - -namespace otb -{ -/** - * \class RCC8Graph - * \brief This class is a data structure designed to store RCC8 Graph - * computed from a pyramidal segmentation. - * - * A batch of boost operation has been embedded in order to provide - * basic functionality such as adding a new edge, or retrieving the - * number of vertices. A method is also provided to retrieve the boost - * graph object, in case more advanced processing is required. One - * should remember that if a peculiar operation is needed for some - * applications, one should provide a patch for this class including - * the new functionnalities, for consistency reason. - * - * \ingroup OTBRCC8 - */ -template <class TVertex> -class ITK_EXPORT RCC8Graph : - public itk::DataObject -{ -public: - /** Standard class typedefs. */ - typedef RCC8Graph Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8Graph, itk::DataObject); - /** Vertex typedef */ - typedef TVertex VertexType; - typedef typename VertexType::Pointer VertexPointerType; - /** Edge typedef */ - typedef RCC8Edge EdgeType; - typedef typename EdgeType::Pointer EdgePointerType; - typedef typename EdgeType::RCC8ValueType RCC8ValueType; - /** Typedef for the boost graph representation */ - typedef boost::adjacency_list - <boost::vecS, boost::vecS, boost::bidirectionalS, - VertexPointerType, EdgePointerType> InternalGraphType; - /** Edges and vertices descriptors typedefs (boost objects)*/ - typedef typename InternalGraphType::vertex_descriptor VertexDescriptorType; - typedef typename InternalGraphType::edge_descriptor EdgeDescriptorType; - - /** Getters and Setters for the number of vertices */ - itkSetMacro(NumberOfVertices, unsigned int); - itkGetConstReferenceMacro(NumberOfVertices, unsigned int); - - /** - * Return the internal boost graph object. - * \return The internal boost graph object - */ - InternalGraphType * GetGraph(void) - { - return &m_Graph; - } - /** - * Since the number of vertices is mandatory to instantiate the - * internal boost representation, the build method has to be called - * once this parameter is set. - */ - void Build(void); - /** - * Set a vertex. - * \param index The index of the vertex in the graph. - * \param vertex The vertex to set. - */ - void SetVertex(unsigned int index, VertexPointerType vertex); - /** - * Get a vertex. - * \param index The index of the vertex in the graph - * \return The vertex. - */ - VertexPointerType GetVertex(unsigned int index); - /** - * Add an edge in the graph. - * \param index1 The index of the source vertex. - * \param index2 The index of the target vertex. - * \param r The RCC8 value. - */ - void AddEdge(unsigned int index1, unsigned int index2, RCC8ValueType r); - /** - * Get number of edges - * /return The number of edges. - */ - unsigned int GetNumberOfEdges(void); - -protected: - /** Constructor */ - RCC8Graph(); - /** Destructor */ - ~RCC8Graph() override {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** - * Initialize a range of vertex. - * \param num The index of the last vertices to initialize. - */ - void InitializeGraph(unsigned int num); - -private: - - /** Defines the number of vertices (ie total number of segmentation regions)*/ - unsigned int m_NumberOfVertices; - /** Internal representation using the boost graph library */ - InternalGraphType m_Graph; -}; -} // end namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8Graph.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx b/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx deleted file mode 100644 index f429442c2dd820447bc547283af733bf68f448b4..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8Graph.hxx +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8Graph_hxx -#define otbRCC8Graph_hxx - -#include "otbRCC8Graph.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TVertex> -RCC8Graph<TVertex> -::RCC8Graph() -{ - m_NumberOfVertices = 0; -} -/** - * since the number of vertices is mandatory to instantiate the - * internal boost representation, the build method has to be called - * once this parameter is set. - */ -template <class TVertex> -void -RCC8Graph<TVertex> -::Build(void) -{ - this->InitializeGraph(m_NumberOfVertices - 1); -} -/** - * Initialize a range of vertex. - * \param num The index of the last vertices to initialize. - */ -template <class TVertex> -void -RCC8Graph<TVertex> -::InitializeGraph(unsigned int num) -{ - for (unsigned int i = boost::num_vertices(m_Graph); i <= num; ++i) - { - VertexDescriptorType id = boost::add_vertex(m_Graph); - VertexPointerType vertex = VertexType::New(); - m_Graph[id] = vertex; - } -} -/** - * Set a vertex. - * \param index The index of the vertex in the graph. - * \param vertex The vertex to set. - */ -template<class TVertex> -void -RCC8Graph<TVertex> -::SetVertex(unsigned int index, VertexPointerType vertex) -{ - if (index >= m_NumberOfVertices) - { - this->InitializeGraph(index); - m_NumberOfVertices = index + 1; - } - VertexDescriptorType v = *boost::vertices(m_Graph).first; - m_Graph[v + index] = vertex; -} -/** - * Get a vertex. - * \param index The index of the vertex in the graph - * \return The vertex. - */ -template <class TVertex> -typename RCC8Graph<TVertex> -::VertexPointerType -RCC8Graph<TVertex> -::GetVertex(unsigned int index) -{ - VertexDescriptorType v = *boost::vertices(m_Graph).first; - return m_Graph[v + index]; -} -/** - * Add an edge in the graph. - * \param index1 The index of the source vertex. - * \param index2 The index of the target vertex. - * \param r The rcc8 value associated to the edge. - */ -template <class TVertex> -void -RCC8Graph<TVertex> -::AddEdge(unsigned int index1, unsigned int index2, RCC8ValueType r) -{ - EdgeDescriptorType e = boost::add_edge(index1, index2, m_Graph).first; - EdgeType::Pointer edge = EdgeType::New(); - edge->SetValue(r); - m_Graph[e] = edge; -} -/** - * Get number of edges - * /return The number of edges. - */ -template <class TVertex> -unsigned int -RCC8Graph<TVertex> -::GetNumberOfEdges(void) -{ - return num_edges(m_Graph); -} -/** - * PrintSelf method - */ -template <class TVertex> -void -RCC8Graph<TVertex> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h b/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h deleted file mode 100644 index 0811898a0c6f4f3cbac0d80d93acb28481578bcd..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphFileReader_h -#define otbRCC8GraphFileReader_h - -#include "otbRCC8GraphSource.h" -#include "itkMacro.h" -#include <string> - -namespace otb -{ -/** \class RCC8GraphFileReaderException - * \brief Base exception class for IO problems during reading. - * - * \ingroup OTBRCC8 - */ -class ITK_EXPORT RCC8GraphFileReaderException - : public itk::ExceptionObject -{ -public: - /** Run-time information. */ - itkTypeMacro(RCC8GraphFileReaderException, ExceptionObject); - - /** Constructor. */ - RCC8GraphFileReaderException(const char *file, unsigned int line, - const char* message = "Error in IO", - const char* loc = "Unknown") : - ExceptionObject(file, line, message, loc) {} - /** Constructor. */ - RCC8GraphFileReaderException(const std::string & file, unsigned int line, - const char* message = "Error in IO", - const char* loc = "Unknown") : - ExceptionObject(file, line, message, loc) {} -}; -/** - * \class RCC8GraphFileReader - * \brief This class reads a RCC8 graph from a .dot file (graphviz format). - * - * The parsing algorithm reads the lines from the file, deciding if the line is - * a vertex or edge line. It then call the correct parse method between ParseEdge - * and ParseVertex. The ParseVertex use builds an AttributesMap and pass it to a new - * vertex. - * - * \sa RCC8GraphFileWriter - * \sa RCC8Graph - * - * \ingroup OTBRCC8 - */ -template <class TOutputGraph> -class ITK_EXPORT RCC8GraphFileReader : public RCC8GraphSource<TOutputGraph> -{ -public: - /** Standards typedef */ - typedef RCC8GraphFileReader Self; - typedef RCC8GraphSource<TOutputGraph> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Creation through the object factory */ - itkNewMacro(Self); - /** Runtime type information */ - itkTypeMacro(RCC8GraphFileReader, RCC8GraphSource); - /** Output related typedefs */ - typedef TOutputGraph OutputGraphType; - typedef typename Superclass::OutputGraphPointerType OutputGraphPointerType; - typedef typename OutputGraphType::VertexType VertexType; - typedef typename VertexType::Pointer VertexPointerType; - typedef typename OutputGraphType::RCC8ValueType RCC8ValueType; - - /** Set the filename */ - itkSetStringMacro(FileName); - /** Get the filename */ - itkGetStringMacro(FileName); - -protected: - /** Constructor */ - RCC8GraphFileReader(); - /** Destructor */ - ~RCC8GraphFileReader() override; - /** Main computation method */ - void GenerateData() override; - /** - * Parse edge information from a given line. - * \param line The line to parse. - */ - void ParseEdge(const std::string& line); - /** - * Parse vertex information from a given line. - * \param line The line to parse. - */ - void ParseVertex(const std::string& line); - - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** File name */ - std::string m_FileName; -}; -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8GraphFileReader.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx deleted file mode 100644 index 2bab0d9fc2e0ef0ce2398a2fcadff43e9426a21d..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileReader.hxx +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphFileReader_hxx -#define otbRCC8GraphFileReader_hxx - -#include "otbRCC8GraphFileReader.h" -#include "otbRCC8VertexIterator.h" -#include "otbMacro.h" -#include <fstream> -#include <iostream> -#include <string> - -namespace otb -{ -/** - * Constructor - */ -template <class TOutputGraph> -RCC8GraphFileReader<TOutputGraph> -::RCC8GraphFileReader() -{ - m_FileName = ""; -} -/** - * Destructor - */ -template <class TOutputGraph> -RCC8GraphFileReader<TOutputGraph> -::~RCC8GraphFileReader() -{ -} -/** - * Parse edge information from a given line. - * \param line The line to parse. - */ -template <class TOutputGraph> -void -RCC8GraphFileReader<TOutputGraph> -::ParseEdge(const std::string& line) -{ - typename std::string::size_type pos1 = line.find_first_of(" ", 0); - typename std::string::size_type pos2 = line.find_first_of(" ", pos1 + 1); - typename std::string::size_type pos3 = line.find_first_of(" ", pos2 + 1); - unsigned int source = atoi(line.substr(0, pos1).c_str()); - unsigned int target = atoi(line.substr(pos2 + 1, pos3 - pos2 - 1).c_str()); - typename std::string::size_type pos4 = line.find_first_of("\"", 0); - typename std::string::size_type pos5 = line.find_first_of("\" ", pos4 + 1); - RCC8ValueType value = static_cast<RCC8ValueType>(atoi(line.substr(pos4 + 1, pos5 - pos4 - 1).c_str())); - otbMsgDevMacro(<< "RCC8GraphFileReader: Edge line parsed: " << source << " -> " - << target << " " << value); - this->GetOutput()->AddEdge(source, target, value); -} -/** - * Parse vertex information from a given line. - * \param line The line to parse. - */ -template <class TOutputGraph> -void -RCC8GraphFileReader<TOutputGraph> -::ParseVertex(const std::string& line) -{ - typename VertexType::AttributesMapType attr; - typename std::string::size_type pos = line.find_first_of(" ", 0); - unsigned int index = atoi(line.substr(0, pos).c_str()); - otbMsgDevMacro(<< "RCC8GraphFileReader: Vertex index: " << index); - typename std::string::size_type midPos, nextPos; - - midPos = line.find_first_of("\"", pos + 2); - nextPos = line.find_first_of("\"", midPos + 1); - std::string key, value; - while ((midPos != std::string::npos) && (nextPos != std::string::npos)) - { - key = line.substr(pos + 2, midPos - pos - 3); - value = line.substr(midPos + 1, nextPos - midPos - 1); - attr[key] = value; - otbMsgDevMacro(<< "RCC8GraphFileReader: Vertex attribute: " << key << " " << value); - pos = nextPos; - midPos = line.find_first_of("\"", pos + 2); - nextPos = line.find_first_of("\"", midPos + 1); - } - typename VertexType::Pointer vertex = VertexType::New(); - vertex->SetAttributesMap(attr); - this->GetOutput()->SetVertex(index, vertex); -} - -/** - * Generate data method - */ -template <class TOutputGraph> -void -RCC8GraphFileReader<TOutputGraph> -::GenerateData() -{ - std::ifstream fin; - std::string line; - - // open file input stream - fin.open(m_FileName); - - // Test if the file has been opened correctly - if (!fin) - { - RCC8GraphFileReaderException e(__FILE__, __LINE__); - std::ostringstream msg; - msg << " Could not create IO object for file "; - msg << m_FileName << "." << std::endl; - e.SetDescription(msg.str()); - throw e; - return; - } - - // if so, parse it - while (!fin.eof()) - { - std::getline(fin, line); - if (line.find("->") != std::string::npos) - { - // edge line - this->ParseEdge(line); - } - else if (line.find("[") != std::string::npos) - { - // vertex line - this->ParseVertex(line); - } - } - fin.close(); -} -/** - * PrintSelf method - */ -template <class TInputGraph> -void -RCC8GraphFileReader<TInputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // end namespace otb - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h b/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h deleted file mode 100644 index 4e4284dde3abfd86f2f5dc5a5e996c98d82c924c..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.h +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphFileWriter_h -#define otbRCC8GraphFileWriter_h - -#include "itkProcessObject.h" -#include "itkMacro.h" -#include "otbRCC8Graph.h" -#include <string> - -namespace otb -{ -/** \class RCC8GraphFileWriterException - * \brief Base exception class for IO problems during writing. - * - * \ingroup OTBRCC8 - */ -class ITK_EXPORT RCC8GraphFileWriterException - : public itk::ExceptionObject -{ -public: - /** Run-time information. */ - itkTypeMacro(RCC8GraphFileWriterException, ExceptionObject); - - /** Constructor. */ - RCC8GraphFileWriterException(const char *file, unsigned int line, - const char* message = "Error in IO", - const char* loc = "Unknown") : - ExceptionObject(file, line, message, loc) {} - /** Constructor. */ - RCC8GraphFileWriterException(const std::string & file, unsigned int line, - const char* message = "Error in IO", - const char* loc = "Unknown") : - ExceptionObject(file, line, message, loc) {} -}; -/** - * \class RCC8GraphFileWriter - * \brief This class writes a RCC8 Graph to a dot file (graphviz file format). - * - * The writer first loops on the vertices of the graph, getting the property map - * from each vertex and printing it in a line. - * - * It then iterates on the edges of the graphs, printing source index, target index, - * and RCC8 value in a line for each of them. - * - * \sa RCC8GraphFileReader - * \sa RCC8Graph - * - * \ingroup OTBRCC8 - */ -template <class TInputGraph> -class ITK_EXPORT RCC8GraphFileWriter - : public itk::ProcessObject -{ -public: - /** Standards typedefs */ - typedef RCC8GraphFileWriter Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8GraphFileWriter, ProcessObject); - /** Typedefs for the output graph type */ - typedef TInputGraph InputGraphType; - typedef typename InputGraphType::Pointer InputGraphPointerType; - typedef typename InputGraphType::VertexType VertexType; - typedef typename VertexType::Pointer VertexPointerType; - typedef typename InputGraphType::VertexDescriptorType VertexDescriptorType; - typedef typename InputGraphType::RCC8ValueType RCC8ValueType; - typedef typename VertexType::AttributesMapType AttributesMapType; - typedef typename AttributesMapType::iterator IteratorType; - - /** Set the filename */ - itkSetStringMacro(FileName); - /** Get the filename */ - itkGetStringMacro(FileName); - - using Superclass::SetInput; - /** - * Set the input graph. - * \param inputGraph The graph to write. - */ - virtual void SetInput(const InputGraphType* inputGraph); - /** - * Get the input graph. - * \return The input graph pointer. - */ - virtual InputGraphPointerType GetInput(); - /** - * Update method. - */ - void Update(void) override; - -protected: - /** Constructor */ - RCC8GraphFileWriter(); - /** Destructor */ - ~RCC8GraphFileWriter() override; - /** - * Main computation method. - */ - void GenerateData(void) override; - /** - * Write Method. - * Performs checkings and invoke GenerateData(). - */ - virtual void Write(void); - /** - * Write an edge to file. - * \param of The output file stream. - * \param source The index of the source vertex. - * \param target The index of the target vertex. - * \param value The value of the edge. - */ - void WriteEdge(std::ofstream& of, VertexDescriptorType source, - VertexDescriptorType target, RCC8ValueType value); - /** - * Write a vertex to file. - * \param of The output file stream. - * \param index The index of the edge to write. - * \param vertex The pointer to the vertex object. - */ - void WriteVertex(std::ofstream& of, VertexDescriptorType index, - VertexPointerType vertex); - /** - * PrintSelf method - */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** Filename of the graph file to write */ - std::string m_FileName; -}; -} // namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8GraphFileWriter.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx deleted file mode 100644 index c864a7c47b9ee4b17f187ad5d0b7059c43cc575a..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphFileWriter.hxx +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphFileWriter_hxx -#define otbRCC8GraphFileWriter_hxx - -#include "otbRCC8GraphFileWriter.h" -#include "otbRCC8VertexIterator.h" -#include "otbRCC8EdgeIterator.h" -#include "otbMacro.h" -#include <fstream> - -namespace otb -{ -/** - * Constructor - */ -template <class TInputGraph> -RCC8GraphFileWriter<TInputGraph> -::RCC8GraphFileWriter() -{ - this->SetNumberOfRequiredInputs(1); - m_FileName = ""; -} -/** - * Destructor - */ -template <class TInputGraph> -RCC8GraphFileWriter<TInputGraph> -::~RCC8GraphFileWriter() -{ -} -/** - * Set the input graph. - * \param graph The graph to write. - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::SetInput(const InputGraphType * graph) -{ - this->itk::ProcessObject::SetNthInput(0, const_cast<TInputGraph *>(graph)); -} -/** - * Get the input graph. - * \return The input graph pointer. - */ -template <class TInputGraph> -typename RCC8GraphFileWriter<TInputGraph> -::InputGraphPointerType -RCC8GraphFileWriter<TInputGraph> -::GetInput(void) -{ - return static_cast<TInputGraph*>(this->itk::ProcessObject::GetInput(0)); -} -/** - * Update method. - * (Call the Write() method). - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::Update(void) -{ - this->Write(); -} -/** - * Write Method. - * Performs checkings and invoke GenerateData(). - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::Write(void) -{ - InputGraphType * input = this->GetInput(); - - itkDebugMacro(<< "Writing a RCC8Graph file"); - - // Make sure input is available - if (input == nullptr) - { - itkExceptionMacro(<< "No input to writer!"); - } - - // Make sure that we can write the file given the name - // - if (m_FileName == "") - { - itkExceptionMacro(<< "No filename was specified"); - } - - // Pipeline updating sequence - input->UpdateOutputInformation(); - input->PropagateRequestedRegion(); - input->UpdateOutputData(); - // GenerateData (actually write file) - this->GenerateData(); -} -/** - * Main computation method. - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::GenerateData() -{ - otbMsgDevMacro(<< "RCC8GraphFileWriter: GenerateData call"); - // input graph pointer - InputGraphPointerType input = this->GetInput(); - - // iterators typedefs - typedef otb::RCC8VertexIterator<InputGraphType> VertexIteratorType; - typedef otb::RCC8EdgeIterator<InputGraphType> EdgeIteratorType; - - // Output file stream - std::ofstream out; - - // open the outputfile - out.open(m_FileName, std::ios::out); - - // Test if the file has been opened correctly - if (!out) - { - RCC8GraphFileWriterException e(__FILE__, __LINE__); - std::ostringstream msg; - msg << " Could not create IO object for file "; - msg << m_FileName << "." << std::endl; - e.SetDescription(msg.str()); - throw e; - return; - } - - // Start writing the graph to file - out << "digraph G {" << std::endl; - - // For each vertex in the graph - VertexIteratorType vIt(input); - for (vIt.GoToBegin(); !vIt.IsAtEnd(); ++vIt) - { - this->WriteVertex(out, vIt.GetIndex(), vIt.Get()); - } - - // For each edge in the graph - EdgeIteratorType eIt(input); - for (eIt.GoToBegin(); !eIt.IsAtEnd(); ++eIt) - { - this->WriteEdge(out, eIt.GetSourceIndex(), - eIt.GetTargetIndex(), - eIt.GetValue()); - } - - // Ends the graph writing - out << "}" << std::endl; - - // Close the file - out.close(); -} -/** - * Write an edge to file. - * \param of The output file stream. - * \param source The index of the source vertex. - * \param target The index of the target vertex. - * \param value The value of the edge. - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::WriteEdge(std::ofstream& of, VertexDescriptorType source, - VertexDescriptorType target, RCC8ValueType value) -{ - otbMsgDevMacro(<< "RCC8GraphFileWriter: WriteEdge call: " << source << " " << target << " " << value); - of << source << " -> " << target << " "; - of << "[Value=\"" << value << "\"];"; - of << std::endl; -} -/** - * Write a vertex to file. - * \param of The output file stream. - * \param index The index of the edge to write. - * \param vertex The pointer to the vertex object. - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::WriteVertex(std::ofstream& of, VertexDescriptorType index, - VertexPointerType vertex) -{ - AttributesMapType attr = vertex->GetAttributesMap(); - otbMsgDevMacro(<< "RCC8GraphFileWriter: WriteVertex call: " << index); - of << index << " ["; - IteratorType it = attr.begin(); - while (it != attr.end()) - { - of << (*it).first << "=\""; - of << (*it).second << "\""; - ++it; - if (it == attr.end()) - { - of << "];" << std::endl; - } - else - { - of << ","; - } - } -} -/** - * PrintSelf method - */ -template <class TInputGraph> -void -RCC8GraphFileWriter<TInputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h deleted file mode 100644 index 2a893e4d6c653c67094e26ef0999723bc278878a..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphSource_h -#define otbRCC8GraphSource_h - -#include "itkProcessObject.h" - -namespace otb -{ -/** \class RCC8GraphSource - * \brief Base class for all the filters producing an otbRCC8Graph - * \ingroup DataSources - * - * \ingroup OTBRCC8 - */ -template <class TOutputGraph> -class ITK_EXPORT RCC8GraphSource - : public itk::ProcessObject -{ -public: - /** Standard typedefs */ - typedef RCC8GraphSource Self; - typedef itk::ProcessObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Type macro */ - itkNewMacro(Self); - /** Creation through object factory macro */ - itkTypeMacro(RCC8GraphSource, itk::ProcessObject); - /** Data object pointer type */ - typedef itk::DataObject::Pointer DataObjectPointer; - /** Template parameter typedef*/ - typedef TOutputGraph OutputGraphType; - typedef typename OutputGraphType::Pointer OutputGraphPointerType; - /** Overriding of the GetOutput() method */ - virtual OutputGraphType * GetOutput(void); - -protected: - /** Constructor */ - RCC8GraphSource(); - /** Destructor */ - ~RCC8GraphSource() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - RCC8GraphSource(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8GraphSource.hxx" -#endif -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx b/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx deleted file mode 100644 index ce8d6b707213701de9078dc906c0d4ecedef81bc..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8GraphSource.hxx +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8GraphSource_hxx -#define otbRCC8GraphSource_hxx - -#include "otbRCC8GraphSource.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TOutputGraph> -RCC8GraphSource<TOutputGraph> -::RCC8GraphSource() -{ - this->Superclass::SetNumberOfRequiredOutputs(1); - this->Superclass::SetNthOutput(0, TOutputGraph::New().GetPointer()); -} -/** - * Get the output Graph - * \return The output graph produced. - */ -template <class TOutputGraph> -typename RCC8GraphSource<TOutputGraph>::OutputGraphType * -RCC8GraphSource<TOutputGraph> -::GetOutput(void) -{ - if (this->GetNumberOfOutputs() < 1) - { - return nullptr; - } - return static_cast<OutputGraphType *> (this->ProcessObject::GetOutput(0)); -} -/** - * PrintSelf Method - */ -template<class TOutputGraph> -void -RCC8GraphSource<TOutputGraph> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h deleted file mode 100644 index 8c3242ed14651805c7eee908bb8edb18a5362ca4..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8InEdgeIterator_h -#define otbRCC8InEdgeIterator_h - -#include "otbRCC8Graph.h" - -namespace otb -{ -/** - * \class RCC8InEdgeIterator - * \brief Iterates on the graph in edges from a vertex. - * - * \ingroup OTBRCC8 - */ -template <class TGraph> -class ITK_EXPORT RCC8InEdgeIterator -{ -public: - /** self typedef */ - typedef RCC8InEdgeIterator Self; - - /** Graph typedef */ - typedef TGraph GraphType; - typedef typename GraphType::InternalGraphType InternalGraphType; - typedef typename GraphType::Pointer GraphPointerType; - typedef typename GraphType::EdgePointerType EdgePointerType; - typedef typename GraphType::VertexPointerType VertexPointerType; - typedef typename GraphType::VertexDescriptorType VertexDescriptorType; - typedef typename GraphType::RCC8ValueType RCC8ValueType; - /** typedef of the internal iterator */ - typedef typename boost::graph_traits<InternalGraphType>::in_edge_iterator InternalIteratorType; - /** Typedef of the index map */ - typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType; - - /** Constructor */ - RCC8InEdgeIterator(); - /** Copy constructor */ - RCC8InEdgeIterator(const Self &iter); - /** Constructor with input graph */ - RCC8InEdgeIterator(VertexDescriptorType vertex, GraphType * graph); - /** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ - RCC8ValueType GetValue(void); - /** - * Return the source vertex of the current edge. - * \return The source edge. - */ - VertexPointerType GetSourceVertex(void); - /** - * Return the source vertex index of the current edge. - * \return The source vertex index. - */ - VertexDescriptorType GetSourceIndex(void); - /** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ - bool IsAtEnd(void); - /** - * Go to the beginning. - */ - void GoToBegin(void); - /** - * Increment. - */ - Self& operator ++(); - /** - * Decrement. - */ - Self& operator --(); - /** - * Add - */ - Self& operator +(int i); - - /** - * Remove - */ - Self& operator -(int i); - /** - * Difference comparison operator. - */ - bool operator !=(const Self& it); - /** - * Equality comparison operator. - */ - bool operator ==(const Self& it); - /** - * Instantiation operator. - */ - Self& operator =(const Self& it); -private: - // End - InternalIteratorType m_End; - // Internal iterator. - InternalIteratorType m_Iter; - // Input graph pointer - GraphPointerType m_Graph; - // Target vertex index - VertexDescriptorType m_VertexIndex; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8InEdgeIterator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx deleted file mode 100644 index 5fb34dce81bd7e9f27a2b24dc2e3c851bcce20da..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8InEdgeIterator.hxx +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8InEdgeIterator_hxx -#define otbRCC8InEdgeIterator_hxx - -#include "otbRCC8InEdgeIterator.h" - -namespace otb -{ -/** Constructor */ -template <class TGraph> -RCC8InEdgeIterator<TGraph> -::RCC8InEdgeIterator() -{ - m_Graph = GraphType::New(); - boost::tuples::tie(m_Iter, m_End) = in_edges(0, *m_Graph->GetGraph()); -} -/** - * Copy operator. - */ -template <class TGraph> -RCC8InEdgeIterator<TGraph> -::RCC8InEdgeIterator(const Self& iter) -{ - m_Iter = iter.m_Iter; - m_Graph = iter.m_Graph; - m_VertexIndex = iter.m_VertexIndex; - m_End = iter.m_End; -} -/** - *Constructor with input graph - */ -template <class TGraph> -RCC8InEdgeIterator<TGraph> -::RCC8InEdgeIterator(VertexDescriptorType vertex, GraphType * graph) -{ - m_Graph = graph; - m_VertexIndex = vertex; - boost::tuples::tie(m_Iter, m_End) = in_edges(vertex, *m_Graph->GetGraph()); -} -/** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::RCC8ValueType -RCC8InEdgeIterator<TGraph> -::GetValue(void) -{ - return (*m_Graph->GetGraph())[*m_Iter]->GetValue(); -} -/** - * Return the source vertex of the current edge. - * \return The source edge. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::VertexPointerType -RCC8InEdgeIterator<TGraph> -::GetSourceVertex(void) -{ - return (*m_Graph->GetGraph())[source(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return the source vertex index of the current edge. - * \return The source vertex index. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::VertexDescriptorType -RCC8InEdgeIterator<TGraph> -::GetSourceIndex(void) -{ - IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph())); - return index[source(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ -template <class TGraph> -bool -RCC8InEdgeIterator<TGraph> -::IsAtEnd(void) -{ - return (m_Iter == m_End); -} -/** - * Go to the beginning. - */ -template <class TGraph> -void -RCC8InEdgeIterator<TGraph> -::GoToBegin(void) -{ - boost::tuples::tie(m_Iter, m_End) = in_edges(m_VertexIndex, *m_Graph->GetGraph()); -} -/** - * Increment. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::Self& -RCC8InEdgeIterator<TGraph> -::operator++ () - { - ++m_Iter; - return *this; - } -/** - * Decrement. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::Self& -RCC8InEdgeIterator<TGraph> -::operator-- () - { - --m_Iter; - return *this; - } -/** - * Add - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::Self& -RCC8InEdgeIterator<TGraph> -::operator + (int i) - { - m_Iter = m_Iter + i; - return *this; - } -/** - * Remove - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::Self& -RCC8InEdgeIterator<TGraph> -::operator - (int i) - { - m_Iter = m_Iter - i; - return *this; - } -/** - * Difference comparison operator. - */ -template <class TGraph> -bool -RCC8InEdgeIterator<TGraph> -::operator != (const Self &iter) - { - return (m_Iter != iter.m_Iter); - } -/** - * Equality comparison operator. - */ -template <class TGraph> -bool -RCC8InEdgeIterator<TGraph> -::operator == (const Self &iter) - { - return (m_Iter == iter.m_Iter); - } -/** - * Instantiation operator. - */ -template <class TGraph> -typename RCC8InEdgeIterator<TGraph> -::Self& -RCC8InEdgeIterator<TGraph> -::operator = (const Self &iter) - { - m_Iter = iter.m_Iter; - return *this; - } -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h b/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h deleted file mode 100644 index 3d22bc092c7d8fcc56d71ccb350faca408442961..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.h +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8OutEdgeIterator_h -#define otbRCC8OutEdgeIterator_h - -#include "otbRCC8Graph.h" - -namespace otb -{ -/** - * \class RCC8OutEdgeIterator - * \brief Iterates on the graph out edges from a vertex. - * - * \ingroup OTBRCC8 - */ -template <class TGraph> -class ITK_EXPORT RCC8OutEdgeIterator -{ -public: - /** self typedef */ - typedef RCC8OutEdgeIterator Self; - - /** Graph typedef */ - typedef TGraph GraphType; - typedef typename GraphType::InternalGraphType InternalGraphType; - typedef typename GraphType::Pointer GraphPointerType; - typedef typename GraphType::EdgePointerType EdgePointerType; - typedef typename GraphType::VertexPointerType VertexPointerType; - typedef typename GraphType::VertexDescriptorType VertexDescriptorType; - typedef typename GraphType::RCC8ValueType RCC8ValueType; - /** typedef of the internal iterator */ - typedef typename boost::graph_traits<InternalGraphType>::out_edge_iterator InternalIteratorType; - /** Typedef of the index map */ - typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType; - - /** Constructor */ - RCC8OutEdgeIterator(); - /** Copy constructor */ - RCC8OutEdgeIterator(const Self &iter); - /** Constructor with input graph */ - RCC8OutEdgeIterator(VertexDescriptorType vertex, TGraph * graph); - /** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ - RCC8ValueType GetValue(void); - /** - * Return the target vertex of the current edge. - * \return The target vertex. - */ - VertexPointerType GetTargetVertex(void); - /** - * Return the target vertex index of the current edge. - * \return The target vertex index. - */ - VertexDescriptorType GetTargetIndex(void); - - /** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ - bool IsAtEnd(void); - /** - * Go to the beginning. - */ - void GoToBegin(void); - /** - * Increment. - */ - Self& operator ++(); - /** - * Decrement. - */ - Self& operator --(); - /** - * Add - */ - Self& operator +(int i); - /** - * Remove - */ - Self& operator -(int i); - /** - * Difference comparison operator. - */ - bool operator !=(const Self& it); - /** - * Equality comparison operator. - */ - bool operator ==(const Self& it); - /** - * Instantiation operator. - */ - Self& operator =(const Self& it); -private: - // End - InternalIteratorType m_End; - // Internal iterator. - InternalIteratorType m_Iter; - // Input graph pointer - GraphPointerType m_Graph; - // source vertex descriptor - VertexDescriptorType m_VertexIndex; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8OutEdgeIterator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx deleted file mode 100644 index 811e850eda67dcac88f74c85c8f44369b92c413e..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8OutEdgeIterator.hxx +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8OutEdgeIterator_hxx -#define otbRCC8OutEdgeIterator_hxx - -#include "otbRCC8OutEdgeIterator.h" - -namespace otb -{ -/** Constructor */ -template <class TGraph> -RCC8OutEdgeIterator<TGraph> -::RCC8OutEdgeIterator() -{ - m_Graph = GraphType::New(); - tie(m_Iter, m_End) = out_edges(0, *m_Graph->GetGraph()); -} -/** - * Copy operator. - */ -template <class TGraph> -RCC8OutEdgeIterator<TGraph> -::RCC8OutEdgeIterator(const Self& iter) -{ - m_Iter = iter.m_Iter; - m_Graph = iter.m_Graph; - m_VertexIndex = iter.m_VertexIndex; - m_End = iter.m_End; -} -/** - *Constructor with input graph - */ -template <class TGraph> -RCC8OutEdgeIterator<TGraph> -::RCC8OutEdgeIterator(VertexDescriptorType vertex, TGraph * graph) -{ - m_Graph = graph; - m_VertexIndex = vertex; - tie(m_Iter, m_End) = out_edges(vertex, *m_Graph->GetGraph()); -} -/** - * Get the current edge value. - * \return The value of the current edge pointed by the iterator. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::RCC8ValueType -RCC8OutEdgeIterator<TGraph> -::GetValue(void) -{ - return (*m_Graph->GetGraph())[*m_Iter]->GetValue(); -} -/** - * Return the target vertex of the current edge. - * \return The target vertex. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::VertexPointerType -RCC8OutEdgeIterator<TGraph> -::GetTargetVertex(void) -{ - return (*m_Graph->GetGraph())[target(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return the target vertex index of the current edge. - * \return The target vertex index. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::VertexDescriptorType -RCC8OutEdgeIterator<TGraph> -::GetTargetIndex(void) -{ - IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph())); - return index[target(*m_Iter, (*m_Graph->GetGraph()))]; -} -/** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ -template <class TGraph> -bool -RCC8OutEdgeIterator<TGraph> -::IsAtEnd(void) -{ - return (m_Iter == m_End); -} -/** - * Go to the beginning. - */ -template <class TGraph> -void -RCC8OutEdgeIterator<TGraph> -::GoToBegin(void) -{ - tie(m_Iter, m_End) = out_edges(m_VertexIndex, *m_Graph->GetGraph()); -} -/** - * Increment. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::Self& -RCC8OutEdgeIterator<TGraph> -::operator++ () - { - ++m_Iter; - return *this; - } -/** - * Decrement. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::Self& -RCC8OutEdgeIterator<TGraph> -::operator-- () - { - --m_Iter; - return *this; - } -/** - * Add - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::Self& -RCC8OutEdgeIterator<TGraph> -::operator + (int i) - { - m_Iter = m_Iter + i; - return *this; - } -/** - * Remove - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::Self& -RCC8OutEdgeIterator<TGraph> -::operator - (int i) - { - m_Iter = m_Iter - i; - return *this; - } -/** - * Difference comparison operator. - */ -template <class TGraph> -bool -RCC8OutEdgeIterator<TGraph> -::operator != (const Self &iter) - { - return (m_Iter != iter.m_Iter); - } -/** - * Equality comparison operator. - */ -template <class TGraph> -bool -RCC8OutEdgeIterator<TGraph> -::operator == (const Self &iter) - { - return (m_Iter == iter.m_Iter); - } -/** - * Instantiation operator. - */ -template <class TGraph> -typename RCC8OutEdgeIterator<TGraph> -::Self& -RCC8OutEdgeIterator<TGraph> -::operator = (const Self &iter) - { - m_Iter = iter.m_Iter; - return *this; - } -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h b/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h deleted file mode 100644 index 3876c423319ecb4768529dbaa454a7d1f1e14bb4..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.h +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexBase_h -#define otbRCC8VertexBase_h - -#include "itkDataObject.h" -#include "itkObjectFactory.h" -#include <cstdlib> - -namespace otb -{ -/** \class RCC8VertexBase - * \brief Base class to represent a vertex in a RCC8 Graph. - * - * This class can be derived to add attributes to the vertices of the - * RCC8 graph. - * - * \sa RCC8Graph, RCC8Edge - * - * \ingroup OTBRCC8 - */ -template <class TPath> -class ITK_EXPORT RCC8VertexBase - : public itk::DataObject -{ -public: - /** Standard class typedefs */ - typedef RCC8VertexBase Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8VertexBase, DataObject); - /** Input image associated typedefs*/ - typedef TPath PathType; - typedef typename PathType::Pointer PathPointerType; - typedef typename PathType::ContinuousIndexType ContinuousIndexType; - - /** char* vector attributes */ - typedef std::map<std::string, std::string> AttributesMapType; - - /** Segmentation image index accessors */ - itkGetMacro(SegmentationLevel, unsigned int); - itkSetMacro(SegmentationLevel, unsigned int); - itkGetMacro(SegmentationType, bool); - itkSetMacro(SegmentationType, bool); - /** Object label in image accessor */ - itkGetObjectMacro(Path, PathType); - itkSetObjectMacro(Path, PathType); - /** - * Set the VertexBase attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ - virtual void SetAttributesMap(AttributesMapType attributes); - /** - * Get an attributes vector representing the VertexBase attributes. - * \return The attributes vector - */ - virtual AttributesMapType GetAttributesMap(void); - -protected: - /** Constructor */ - RCC8VertexBase(); - /** Desctructor */ - ~RCC8VertexBase() override {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** The segmentation level */ - unsigned int m_SegmentationLevel; - /** True if bright details, false otherwise */ - bool m_SegmentationType; - /** The path of the edge of the region */ - PathPointerType m_Path; -}; -} // end namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8VertexBase.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx deleted file mode 100644 index 3464483c73676d4ef2b909bc129cfd34058570cb..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexBase.hxx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexBase_hxx -#define otbRCC8VertexBase_hxx - -#include "otbRCC8VertexBase.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath> -RCC8VertexBase<TPath> -::RCC8VertexBase() -{ - m_SegmentationLevel = 0; - m_SegmentationType = true; - m_Path = PathType::New(); - m_Path->Initialize(); -} -/** - * Set the VertexBase attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ -template <class TPath> -void -RCC8VertexBase<TPath> -::SetAttributesMap(AttributesMapType attributes) -{ - m_SegmentationLevel = static_cast<unsigned int>(atoi(attributes["SegmentationLevel"].c_str())); - m_SegmentationType = static_cast<bool>(atoi(attributes["SegmentationType"].c_str())); - unsigned int nbPoints = static_cast<unsigned int>(atoi(attributes["NumberOfPointsInPath"].c_str())); - - std::ostringstream oss; - - m_Path = PathType::New(); - m_Path->Initialize(); - - for (unsigned int i = 0; i < nbPoints; ++i) - { - ContinuousIndexType newPoint; - oss << "P" << i << "x"; - newPoint[0] = atof(attributes[oss.str()].c_str()); - oss.str(""); - oss << "P" << i << "y"; - newPoint[1] = atof(attributes[oss.str()].c_str()); - oss.str(""); - m_Path->AddVertex(newPoint); - } -} -/** - * Get an attributes vector representing the VertexBase attributes. - * \return The attributes vector - */ -template <class TPath> -typename RCC8VertexBase<TPath>::AttributesMapType -RCC8VertexBase<TPath> -::GetAttributesMap(void) -{ - std::ostringstream oss; - AttributesMapType results; - oss << m_SegmentationLevel; - results["SegmentationLevel"] = oss.str(); - oss.str(""); - oss << m_SegmentationType; - results["SegmentationType"] = oss.str(); - oss.str(""); - oss << m_Path->GetVertexList()->Size(); - results["NumberOfPointsInPath"] = oss.str(); - oss.str(""); - - typename PathType::VertexListType::ConstIterator it; - unsigned int index = 0; - - for (it = m_Path->GetVertexList()->Begin(); it != m_Path->GetVertexList()->End(); ++it, ++index) - { - ContinuousIndexType point = it.Value(); - oss << "P" << index << "x"; - std::string key = oss.str(); - oss.str(""); - oss << point[0]; - results[key] = oss.str(); - oss.str(""); - oss << "P" << index << "y"; - key = oss.str(); - oss.str(""); - oss << point[1]; - results[key] = oss.str(); - oss.str(""); - } - return results; -} -/** - * PrintSelf method - */ -template <class TPath> -void -RCC8VertexBase<TPath> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "SegmentationLevel: " << m_SegmentationLevel << std::endl; - os << indent << "SegmentationType: " << m_SegmentationType << std::endl; -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h b/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h deleted file mode 100644 index 51d771e11ae2298f66fdacb4b2ec3c16e7a28cea..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.h +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexIterator_h -#define otbRCC8VertexIterator_h - -#include "otbRCC8Graph.h" - -namespace otb -{ -/** - * \class RCC8VertexIterator - * \brief Iterates on the graph vertices - * - * \ingroup OTBRCC8 - */ -template <class TGraph> -class ITK_EXPORT RCC8VertexIterator -{ -public: - /** self typedef */ - typedef RCC8VertexIterator Self; - - /** Graph typedef */ - typedef TGraph GraphType; - typedef typename GraphType::InternalGraphType InternalGraphType; - typedef typename GraphType::Pointer GraphPointerType; - typedef typename GraphType::VertexPointerType VertexPointerType; - typedef typename GraphType::VertexDescriptorType VertexDescriptorType; - /** typedef of the internal iterator */ - typedef typename boost::graph_traits<InternalGraphType>::vertex_iterator InternalIteratorType; - /** Typedef of the index map */ - typedef typename boost::property_map<InternalGraphType, boost::vertex_index_t>::type IndexMapType; - /** Constructor */ - RCC8VertexIterator(); - /** Copy constructor */ - RCC8VertexIterator(const Self &iter); - /** Constructor with input graph */ - RCC8VertexIterator(TGraph * graph); - /** - * Get the current vertex. - * \return The current vertex pointed by the iterator. - */ - VertexPointerType Get(void); - /** - * Set the current vertex. - * \param vertex The vertex to set. - */ - void Set(VertexPointerType vertex); - /** - * Get the current vertex index. - * \return The current vertex index. - */ - VertexDescriptorType GetIndex(void); - /** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ - bool IsAtEnd(void); - /** - * Go to the beginning. - */ - void GoToBegin(void); - /** - * Increment. - */ - Self& operator ++(); - /** - * Decrement. - */ - Self& operator --(); - /** - * Add - */ - Self& operator +(int i); - - /** - * Remove - */ - Self& operator -(int i); - /** - * Difference comparison operator. - */ - bool operator !=(const Self& it); - /** - * Equality comparison operator. - */ - bool operator ==(const Self& it); - /** - * Instantiation operator. - */ - Self& operator =(const Self& it); -private: - // End - InternalIteratorType m_End; - // Internal iterator. - InternalIteratorType m_Iter; - // Input graph pointer - GraphPointerType m_Graph; -}; -} // End namespace otb - -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8VertexIterator.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx deleted file mode 100644 index 29d13da47d71fa201169c86f2c03f14a6fddbc21..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexIterator.hxx +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexIterator_hxx -#define otbRCC8VertexIterator_hxx - -#include "otbRCC8VertexIterator.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TGraph> -RCC8VertexIterator<TGraph> -::RCC8VertexIterator() -{ - m_Graph = GraphType::New(); - boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph())); -} -/** - * Copy operator. - */ -template <class TGraph> -RCC8VertexIterator<TGraph> -::RCC8VertexIterator(const Self& iter) -{ - m_Iter = iter.m_Iter; - m_Graph = iter.m_Graph; - m_End = iter.m_End; -} -/** - *Constructor with input graph - */ -template <class TGraph> -RCC8VertexIterator<TGraph> -::RCC8VertexIterator(TGraph * graph) -{ - m_Graph = graph; - boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph())); -} -/** - * Get the current object. - * \return The current object pointed by the iterator. - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::VertexPointerType -RCC8VertexIterator<TGraph> -::Get(void) -{ - return (*(m_Graph->GetGraph()))[*m_Iter]; -} -/** - * Set the current vertex. - * \param vertex The vertex to set. - */ -template <class TGraph> -void -RCC8VertexIterator<TGraph> -::Set(VertexPointerType vertex) -{ - (*(m_Graph->GetGraph()))[*m_Iter] = vertex; -} -/** - * Get the current vertex index. - * \return The current vertex index. - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::VertexDescriptorType -RCC8VertexIterator<TGraph> -::GetIndex(void) -{ - IndexMapType index = get(boost::vertex_index, (*m_Graph->GetGraph())); - return index[*m_Iter]; -} -/** - * Return true if the iterator is at the end. - * \return True if the iterator is at the end. - */ -template <class TGraph> -bool -RCC8VertexIterator<TGraph> -::IsAtEnd(void) -{ - return (m_Iter == m_End); -} -/** - * Go to the beginning. - */ -template <class TGraph> -void -RCC8VertexIterator<TGraph> -::GoToBegin(void) -{ - boost::tie(m_Iter, m_End) = boost::vertices(*(m_Graph->GetGraph())); -} -/** - * Increment. - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::Self& -RCC8VertexIterator<TGraph> -::operator++ () - { - ++m_Iter; - return *this; - } -/** - * Decrement. - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::Self& -RCC8VertexIterator<TGraph> -::operator-- () - { - --m_Iter; - return *this; - } -/** - * Add - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::Self& -RCC8VertexIterator<TGraph> -::operator + (int i) - { - m_Iter = m_Iter + i; - return *this; - } -/** - * Remove - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::Self& -RCC8VertexIterator<TGraph> -::operator - (int i) - { - m_Iter = m_Iter - i; - return *this; - } -/** - * Difference comparison operator. - */ -template <class TGraph> -bool -RCC8VertexIterator<TGraph> -::operator != (const Self &iter) - { - return (m_Iter != iter.m_Iter); - } -/** - * Equality comparison operator. - */ -template <class TGraph> -bool -RCC8VertexIterator<TGraph> -::operator == (const Self &iter) - { - return (m_Iter == iter.m_Iter); - } -/** - * Instantiation operator. - */ -template <class TGraph> -typename RCC8VertexIterator<TGraph> -::Self& -RCC8VertexIterator<TGraph> -::operator = (const Self &iter) - { - m_Iter = iter.m_Iter; - return *this; - } -} // End namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h b/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h deleted file mode 100644 index 8b87a877ad3b3c54111a4f66b9d4dd120cd36a62..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexWithCompacity_h -#define otbRCC8VertexWithCompacity_h - -#include "otbRCC8VertexBase.h" - -namespace otb -{ -/** \class RCC8VertexWithCompacity - * \brief Class to represent a vertex in a RCC8 Graph with the compacity value of - * the represented region. - * - * \sa RCC8Graph, RCC8Edge, RCC8VertexBase - * - * \ingroup OTBRCC8 - */ -template <class TPath, class TPrecision = float> -class ITK_EXPORT RCC8VertexWithCompacity - : public RCC8VertexBase<TPath> -{ -public: - /** Standard class typedefs */ - typedef RCC8VertexWithCompacity Self; - typedef otb::RCC8VertexBase<TPath> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8VertexWithCompacity, RCC8VertexBase); - /** Input image associated typedefs*/ - typedef TPath PathType; - /** Precision typedef */ - typedef TPrecision PrecisionType; - /** char* vector attributes */ - typedef typename Superclass::AttributesMapType AttributesMapType; - - /** Segmentation image index accessors */ - itkGetMacro(Compacity, PrecisionType); - itkSetMacro(Compacity, PrecisionType); - /** - * Set the VertexWithCompacity attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ - void SetAttributesMap(AttributesMapType attributes) override; - /** - * Get an attributes vector representing the VertexWithCompacity attributes. - * \return The attributes vector - */ - AttributesMapType GetAttributesMap(void) override; - -protected: - /** Constructor */ - RCC8VertexWithCompacity(); - /** Desctructor */ - ~RCC8VertexWithCompacity() override {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - /** The compacity */ - PrecisionType m_Compacity; -}; -} // end namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8VertexWithCompacity.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx deleted file mode 100644 index 9ad40b3424598407c9686e51f24835f57ff3c6e8..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithCompacity.hxx +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexWithCompacity_hxx -#define otbRCC8VertexWithCompacity_hxx - -#include "otbRCC8VertexWithCompacity.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPath, class TPrecision> -RCC8VertexWithCompacity<TPath, TPrecision> -::RCC8VertexWithCompacity() -{ - m_Compacity = 0.0; -} -/** - * Set the VertexWithCompacity attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ -template <class TPath, class TPrecision> -void -RCC8VertexWithCompacity<TPath, TPrecision> -::SetAttributesMap(AttributesMapType attributes) -{ - this->Superclass::SetAttributesMap(attributes); - m_Compacity = static_cast<TPrecision>(atof(attributes["Compacity"].c_str())); -} -/** - * Get an attributes vector representing the VertexBase attributes. - * \return The attributes vector - */ -template <class TPath, class TPrecision> -typename RCC8VertexWithCompacity<TPath, TPrecision>::AttributesMapType -RCC8VertexWithCompacity<TPath, TPrecision> -::GetAttributesMap(void) -{ - std::stringstream oss; - AttributesMapType results; - results = this->Superclass::GetAttributesMap(); - oss << m_Compacity; - results["Compacity"] = oss.str(); - oss.str(""); - return results; -} -/** - * PrintSelf method - */ -template <class TPath, class TPrecision> -void -RCC8VertexWithCompacity<TPath, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "Compacity: " << m_Compacity << std::endl; -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h b/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h deleted file mode 100644 index 6916c936f5fb7c376123c59e0801fb9623cd8105..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexWithRegionCenter_h -#define otbRCC8VertexWithRegionCenter_h - -#include "otbRCC8VertexBase.h" - -namespace otb -{ -/** \class RCC8VertexWithRegionCenter - * \brief Class to represent a vertex in a RCC8 Graph with the compacity value of - * the represented region. - * - * \sa RCC8Graph, RCC8Edge, RCC8VertexBase - * - * \ingroup OTBRCC8 - */ -template <class TLabel, class TPrecision = float> -class ITK_EXPORT RCC8VertexWithRegionCenter - : public RCC8VertexBase<TLabel> -{ -public: - /** Standard class typedefs */ - typedef RCC8VertexWithRegionCenter Self; - typedef otb::RCC8VertexBase<TLabel> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - /** Method for creation through the object factory. */ - itkNewMacro(Self); - /** Run-time type information (and related methods). */ - itkTypeMacro(RCC8VertexWithRegionCenter, RCC8VertexBase); - /** Input image associated typedefs*/ - typedef TLabel LabelType; - /** Precision typedef */ - typedef TPrecision PrecisionType; - /** char* vector attributes */ - typedef typename Superclass::AttributesMapType AttributesMapType; - - itkGetMacro(RegionCenterXCoordinate, PrecisionType); - itkSetMacro(RegionCenterXCoordinate, PrecisionType); - itkGetMacro(RegionCenterYCoordinate, PrecisionType); - itkSetMacro(RegionCenterYCoordinate, PrecisionType); - /** - * Set the VertexWithRegionCenter attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ - void SetAttributesMap(AttributesMapType attributes); - /** - * Get an attributes vector representing the VertexWithRegionCenter attributes. - * \return The attributes vector - */ - AttributesMapType GetAttributesMap(void); - -protected: - /** Constructor */ - RCC8VertexWithRegionCenter(); - /** Desctructor */ - ~RCC8VertexWithRegionCenter() {} - /** PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const; - -private: - /** The compacity */ - PrecisionType m_RegionCenterXCoordinate; - PrecisionType m_RegionCenterYCoordinate; -}; -} // end namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbRCC8VertexWithRegionCenter.hxx" -#endif - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx b/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx deleted file mode 100644 index 42f9c3adc5872e069ebefc923dec5faf5578069b..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8VertexWithRegionCenter.hxx +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbRCC8VertexWithRegionCenter_hxx -#define otbRCC8VertexWithRegionCenter_hxx - -#include "otbRCC8VertexWithRegionCenter.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TLabel, class TPrecision> -RCC8VertexWithRegionCenter<TLabel, TPrecision> -::RCC8VertexWithRegionCenter() -{ - m_RegionCenterXCoordinate = 0.0; - m_RegionCenterYCoordinate = 0.0; -} -/** - * Set the VertexWithRegionCenter attributes from the attributes vector. - * \param attributes The vector containing the parsed attributes. - */ -template <class TLabel, class TPrecision> -void -RCC8VertexWithRegionCenter<TLabel, TPrecision> -::SetAttributesMap(AttributesMapType attributes) -{ - this->Superclass::SetAttributesMap(attributes); - m_RegionCenterXCoordinate = static_cast<TPrecision>(atof(attributes["RegionCenterXCoordinate"].c_str())); - m_RegionCenterYCoordinate = static_cast<TPrecision>(atof(attributes["RegionCenterYCoordinate"].c_str())); -} -/** - * Get an attributes vector representing the VertexBase attributes. - * \return The attributes vector - */ -template <class TLabel, class TPrecision> -typename RCC8VertexWithRegionCenter<TLabel, TPrecision>::AttributesMapType -RCC8VertexWithRegionCenter<TLabel, TPrecision> -::GetAttributesMap(void) -{ - std::stringstream oss; - AttributesMapType results; - results = this->Superclass::GetAttributesMap(); - oss << m_RegionCenterXCoordinate; - results["RegionCenterXCoordinate"] = oss.str(); - oss.str(""); - oss << m_RegionCenterYCoordinate; - results["RegionCenterYCoordinate"] = oss.str(); - oss.str(""); - return results; -} -/** - * PrintSelf method - */ -template <class TLabel, class TPrecision> -void -RCC8VertexWithRegionCenter<TLabel, TPrecision> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "RegionCenterXCoordinate: " << m_RegionCenterXCoordinate << std::endl; - os << indent << "RegionCenterXCoordinate: " << m_RegionCenterYCoordinate << std::endl; -} -} // end namespace otb -#endif diff --git a/Modules/OBIA/RCC8/otb-module.cmake b/Modules/OBIA/RCC8/otb-module.cmake deleted file mode 100644 index 5e9a368a74170e6094b54479d9477820fd6e7511..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/otb-module.cmake +++ /dev/null @@ -1,45 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "The region connection calculus (RCC) is used for qualitative -spatial representation and . RCC abstractly describes regions by their possible -relations to each other (8 basic relations are possible between two regions). The -RCC8 constraint language has been popularly adopted by the GIS communities. This -module provides classes related to this purpose.") - -otb_module(OTBRCC8 - DEPENDS - OTBITK - OTBImageBase - OTBRoadExtraction - OTBImageManipulation - OTBPath - OTBCommon - OTBBoostAdapters - OTBObjectList - - TEST_DEPENDS - OTBVectorDataBase - OTBTestKernel - OTBImageIO - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/OBIA/RCC8/src/CMakeLists.txt b/Modules/OBIA/RCC8/src/CMakeLists.txt deleted file mode 100644 index 1b18d1544cc6d894fe150c1c4efa644f2b875ae1..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/src/CMakeLists.txt +++ /dev/null @@ -1,34 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(OTBRCC8_SRC - otbRCC8Edge.cxx - ) - -add_library(OTBRCC8 ${OTBRCC8_SRC}) -target_link_libraries(OTBRCC8 - ${OTBImageManipulation_LIBRARIES} - ${OTBImageBase_LIBRARIES} - ${OTBCommon_LIBRARIES} - ${OTBBoost_LIBRARIES} - - ) - -otb_module_target(OTBRCC8) diff --git a/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx b/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx deleted file mode 100644 index 361123310263e7d8c2b4165490e2cc799fd21f0a..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/src/otbRCC8Edge.cxx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "otbRCC8Edge.h" - -namespace otb -{ -/** - * Constructor - */ -RCC8Edge::RCC8Edge() -{ - m_Value = OTB_RCC8_DC; -} -/** - * PrintSelf method - */ -void -RCC8Edge::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); - os << indent << "RCC8 Value: " << m_Value << std::endl; -} -} // end namespace otb diff --git a/Modules/OBIA/RCC8/test/CMakeLists.txt b/Modules/OBIA/RCC8/test/CMakeLists.txt deleted file mode 100644 index 72b127feda0de107037af29017097f9bbde8b9c1..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/CMakeLists.txt +++ /dev/null @@ -1,170 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBRCC8Tests -otbRCC8TestDriver.cxx -otbRCC8GraphFileReader.cxx -otbRCC8GraphIOEndToEnd.cxx -otbPolygonListToRCC8GraphFilter.cxx -otbRCC8VertexBase.cxx -otbPolygonToPolygonRCC8Calculator.cxx -otbImageToImageRCC8Calculator.cxx -otbRCC8Edge.cxx -otbRCC8VertexWithCompacity.cxx -otbRCC8Graph.cxx -otbRCC8GraphFileWriter.cxx -otbImageMultiSegmentationToRCC8GraphFilter.cxx -) - -add_executable(otbRCC8TestDriver ${OTBRCC8Tests}) -target_link_libraries(otbRCC8TestDriver ${OTBRCC8-Test_LIBRARIES}) -otb_module_target_label(otbRCC8TestDriver) - -# Tests Declaration - -otb_add_test(NAME srTvRCC8GraphFileReader COMMAND otbRCC8TestDriver - otbRCC8GraphFileReader - ${TEMP}/srRCC8GraphWriterOutput1.dot - ) -set_property(TEST srTvRCC8GraphFileReader PROPERTY DEPENDS srTvRCC8GraphFileWriter) - -otb_add_test(NAME srTvRCC8GraphIOEndToEnd COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot - ${TEMP}/srRCC8GraphIOEndToEndOut.dot - otbRCC8GraphIOEndToEnd - ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot - ${TEMP}/srRCC8GraphIOEndToEndOut.dot - ) - -otb_add_test(NAME srTvPolygonListToRCC8GraphFilter COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srTvPolygonListToRCC8GraphFilterOutput.dot - ${TEMP}/srTvPolygonListToRCC8GraphFilterOutput.dot - otbPolygonListToRCC8GraphFilter - ${TEMP}/srTvPolygonListToRCC8GraphFilterOutput.dot) - -otb_add_test(NAME srTvRCC8VertexBase COMMAND otbRCC8TestDriver - otbRCC8VertexBase - 5 - 5 - ) - -otb_add_test(NAME srTvPolygonRCC8Calculator COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8PolygonToPolygonCalculatorOutput.txt - ${TEMP}/srRCC8PolygonToPolygonCalculatorOutput.txt - otbPolygonToPolygonRCC8Calculator - 4 - ${TEMP}/srRCC8PolygonToPolygonCalculatorOutput.txt - ${INPUTDATA}/rcc8_mire1.png - ${INPUTDATA}/rcc8_mire2.png - ${INPUTDATA}/rcc8_mire3.png - ${INPUTDATA}/rcc8_mire4.png - ) - -otb_add_test(NAME srTvRCC8Calculator COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8CalculatorOutput.txt - ${TEMP}/srRCC8CalculatorOutput.txt - otbImageToImageRCC8Calculator - 4 - ${TEMP}/srRCC8CalculatorOutput.txt - ${INPUTDATA}/rcc8_mire1.png - ${INPUTDATA}/rcc8_mire2.png - ${INPUTDATA}/rcc8_mire3.png - ${INPUTDATA}/rcc8_mire4.png - ) - -otb_add_test(NAME srTvRCC8Edge COMMAND otbRCC8TestDriver - otbRCC8Edge - ) - -otb_add_test(NAME srTvRCC8VertexWithCompacity COMMAND otbRCC8TestDriver - otbRCC8VertexWithCompacity - 5 - 5 - 0.125354 - ) - -otb_add_test(NAME srTvRCC8Graph COMMAND otbRCC8TestDriver - otbRCC8Graph - ) - -otb_add_test(NAME srTvRCC8GraphFileWriter COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphWriterOutput1.dot - ${TEMP}/srRCC8GraphWriterOutput1.dot - otbRCC8GraphFileWriter - ${TEMP}/srRCC8GraphWriterOutput1.dot - ) - -otb_add_test(NAME srTvMultiSegToRCC8GraphFilter1 COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphFilterOutput.dot - ${TEMP}/srRCC8GraphFilterOutput.dot - otbImageMultiSegmentationToRCC8GraphFilter - ${TEMP}/srRCC8GraphFilterOutput.dot - 0 - 2 - ${INPUTDATA}/Seg1InputForRCC8Graph.tif - ${INPUTDATA}/Seg2InputForRCC8Graph.tif - ) - -otb_add_test(NAME srTvMultiSegToRCC8GraphFilter2 COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphFilterOutput2.dot - ${TEMP}/srRCC8GraphFilterOutput2.dot - otbImageMultiSegmentationToRCC8GraphFilter - ${TEMP}/srRCC8GraphFilterOutput2.dot - 0 - 3 - ${INPUTDATA}/Seg3InputForRCC8Graph.tif - ${INPUTDATA}/Seg4InputForRCC8Graph.tif - ${INPUTDATA}/Seg5InputForRCC8Graph.tif - ) - -otb_add_test(NAME srTvMultiSegToRCC8GraphFilter2WithOpti COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphFilterOutput2.dot - ${TEMP}/srRCC8GraphFilterOutput2WithOpti.dot - otbImageMultiSegmentationToRCC8GraphFilter - ${TEMP}/srRCC8GraphFilterOutput2WithOpti.dot - 1 - 3 - ${INPUTDATA}/Seg3InputForRCC8Graph.tif - ${INPUTDATA}/Seg4InputForRCC8Graph.tif - ${INPUTDATA}/Seg5InputForRCC8Graph.tif - ) - -otb_add_test(NAME srTvMultiSegToRCC8GraphFilter1WithOpti COMMAND otbRCC8TestDriver - --compare-ascii ${NOTOL} - ${BASELINE_FILES}/srRCC8GraphFilterOutput.dot - ${TEMP}/srRCC8GraphFilterOutputWithOpti.dot - otbImageMultiSegmentationToRCC8GraphFilter - ${TEMP}/srRCC8GraphFilterOutputWithOpti.dot - 1 - 2 - ${INPUTDATA}/Seg1InputForRCC8Graph.tif - ${INPUTDATA}/Seg2InputForRCC8Graph.tif - ) - diff --git a/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx b/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx deleted file mode 100644 index b212a1a3ff8e28f4d3d77959fb6765fdac815625..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbImageMultiSegmentationToRCC8GraphFilter.cxx +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbImageList.h" -#include "otbPolygon.h" -#include "otbRCC8VertexBase.h" -#include "otbImageMultiSegmentationToRCC8GraphFilter.h" -#include "otbImageFileReader.h" -#include "otbRCC8GraphFileWriter.h" - -int otbImageMultiSegmentationToRCC8GraphFilter(int itkNotUsed(argc), char* argv[]) -{ - const unsigned int Dimension = 2; - char * outputFilename = argv[1]; - int useOptimisation = atoi(argv[2]); - unsigned int nbImages = atoi(argv[3]); - - // typedefs - typedef unsigned short LabelPixelType; - typedef otb::Image<LabelPixelType, Dimension> LabelImageType; - typedef otb::Polygon<> PolygonType; - typedef otb::RCC8VertexBase<PolygonType> VertexType; - typedef otb::RCC8Graph<VertexType> RCC8GraphType; - typedef otb::ImageMultiSegmentationToRCC8GraphFilter<LabelImageType, RCC8GraphType> - RCC8GraphFilterType; - typedef otb::ImageList<LabelImageType> ImageListType; - typedef otb::ImageFileReader<LabelImageType> ReaderType; - typedef otb::RCC8GraphFileWriter<RCC8GraphType> GraphWriterType; - - ImageListType::Pointer inputList = ImageListType::New(); - - // Reading input images - for (unsigned int i = 0; i < nbImages; ++i) - { - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[4 + i]); - reader->Update(); - inputList->PushBack(reader->GetOutput()); - } - std::cout << "Input image loaded into images list." << std::endl; - // Instantiation - RCC8GraphFilterType::Pointer filter = RCC8GraphFilterType::New(); - filter->SetInput(inputList); - filter->SetOptimisation(useOptimisation > 0); - - // Writing output graph - GraphWriterType::Pointer writer = GraphWriterType::New(); - writer->SetFileName(outputFilename); - writer->SetInput(filter->GetOutput()); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx b/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx deleted file mode 100644 index 0a5d2e1f1c86ac6317c7c83a35d9711b73904d6c..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbImageToImageRCC8Calculator.cxx +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbImageToImageRCC8Calculator.h" -#include "otbImageList.h" -#include "otbImageFileReader.h" - -int otbImageToImageRCC8Calculator(int itkNotUsed(argc), char* argv[]) -{ - const unsigned int Dimension = 2; - - int nbImages = atoi(argv[1]); - char * outfile = argv[2]; - - typedef unsigned char PixelType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::ImageToImageRCC8Calculator<ImageType> CalculatorType; - typedef otb::ImageList<ImageType> ImageListType; - typedef ImageListType::Iterator IteratorType; - // reference image list - ImageListType::Pointer images = ImageListType::New(); - - // Reading input images - std::ofstream out; - out.open(outfile, std::ios::out); - out << "Test results from otbImageToImageRCC8calculator test." << std::endl; - for (int k = 1; k <= nbImages; ++k) - { - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[2 + k]); - reader->Update(); - images->PushBack(reader->GetOutput()); - } - // Declaration - CalculatorType::Pointer calc, calc1, calc2; - // Computing relations for each images couple - int i = 1; - int j = 1; - for (IteratorType it1 = images->Begin(); it1 != images->End(); ++it1) - { - for (IteratorType it2 = images->Begin(); it2 != images->End(); ++it2) - { - std::cout << "Test: computing relation " << i << "," << j << std::endl; - calc = CalculatorType::New(); - calc->SetInput1(it1.Get()); - calc->SetInput2(it2.Get()); - calc->Update(); - out << calc->GetValue() << "\t"; - - if (calc->GetValue() < 3 - || calc->GetValue() == 4 - || calc->GetValue() == 6) - { - calc1 = CalculatorType::New(); - calc1->SetInput1(it1.Get()); - calc1->SetInput2(it2.Get()); - calc1->SetLevel1APrioriKnowledge(true); - calc1->Update(); - if (calc1->GetValue() != calc->GetValue()) - { - std::cout << "Test failed: Result with level1AprioriKnowledge "; - std::cout << "different from result without a priori knowledge" << std::endl; - std::cout << calc->GetValue() << "!=" << calc1->GetValue() << std::endl; - return EXIT_FAILURE; - } - } - if (calc->GetValue() < 4) - { - calc2 = CalculatorType::New(); - calc2->SetInput1(it1.Get()); - calc2->SetInput2(it2.Get()); - calc2->SetLevel3APrioriKnowledge(true); - calc2->Update(); - if (calc2->GetValue() != calc->GetValue()) - { - std::cout << "Test failed: Result with level3AprioriKnowledge "; - std::cout << "different from result without a priori knowledge" << std::endl; - std::cout << calc->GetValue() << "!=" << calc2->GetValue() << std::endl; - return EXIT_FAILURE; - } - } - ++j; - } - j = 1; - ++i; - out << std::endl; - } - out.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx b/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx deleted file mode 100644 index fd136fba08b08afb0be9a7e6ed23acf0ca4d9d6c..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbPolygonListToRCC8GraphFilter.cxx +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbPolygon.h" -#include "otbObjectList.h" -#include "otbRCC8VertexBase.h" -#include "otbPolygonListToRCC8GraphFilter.h" -#include "otbRCC8GraphFileWriter.h" - -// typedefs -typedef otb::Polygon<> PolygonType; -typedef otb::ObjectList<PolygonType> PolygonListType; -typedef otb::RCC8VertexBase<PolygonType> VertexType; -typedef otb::RCC8Graph<VertexType> RCC8GraphType; -typedef otb::PolygonListToRCC8GraphFilter<PolygonListType, RCC8GraphType> RCC8GraphFilterType; -typedef otb::RCC8GraphFileWriter<RCC8GraphType> GraphWriterType; - - -PolygonType::VertexType Vertex(double i,double j) -{ - PolygonType::VertexType vertex; - vertex[0] = i; - vertex[1] = j; - - return vertex; -} - - -int otbPolygonListToRCC8GraphFilter(int itkNotUsed(argc), char* argv[]) -{ - char * outfile = argv[1]; - - PolygonListType::Pointer regions = PolygonListType::New(); - - RCC8GraphFilterType::SegmentationRangesType ranges; - - ranges.push_back(0); - - PolygonType::Pointer polygon = PolygonType::New(); - polygon->AddVertex(Vertex(0,0)); - polygon->AddVertex(Vertex(2,0)); - polygon->AddVertex(Vertex(2,6)); - polygon->AddVertex(Vertex(0,6)); - regions->PushBack(polygon); - - polygon = PolygonType::New(); - polygon->AddVertex(Vertex(1,1)); - polygon->AddVertex(Vertex(4,1)); - polygon->AddVertex(Vertex(4,5)); - polygon->AddVertex(Vertex(1,5)); - regions->PushBack(polygon); - - ranges.push_back(2); - - polygon = PolygonType::New(); - polygon->AddVertex(Vertex(3,1)); - polygon->AddVertex(Vertex(4,1)); - polygon->AddVertex(Vertex(4,2)); - polygon->AddVertex(Vertex(3,2)); - regions->PushBack(polygon); - - polygon = PolygonType::New(); - polygon->AddVertex(Vertex(5,1)); - polygon->AddVertex(Vertex(8,1)); - polygon->AddVertex(Vertex(8,5)); - polygon->AddVertex(Vertex(5,5)); - regions->PushBack(polygon); - - ranges.push_back(4); - - polygon = PolygonType::New(); - polygon->AddVertex(Vertex(6,2)); - polygon->AddVertex(Vertex(7,2)); - polygon->AddVertex(Vertex(7,3)); - polygon->AddVertex(Vertex(6,3)); - regions->PushBack(polygon); - - polygon = PolygonType::New(); - polygon->AddVertex(Vertex(8,1)); - polygon->AddVertex(Vertex(9,1)); - polygon->AddVertex(Vertex(9,5)); - polygon->AddVertex(Vertex(8,5)); - regions->PushBack(polygon); - - // Filter instantiation - RCC8GraphFilterType::Pointer filter = RCC8GraphFilterType::New(); - - filter->SetInput(regions); - filter->SetSegmentationRanges(ranges); - - GraphWriterType::Pointer writer = GraphWriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfile); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx b/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx deleted file mode 100644 index 3f3aa4a6c1f9c203a7e0ae98d4b710a68786c9db..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbPolygonToPolygonRCC8Calculator.cxx +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbPolygonToPolygonRCC8Calculator.h" -#include "otbImageFileReader.h" -#include "otbPolygon.h" -#include "otbImageToEdgePathFilter.h" -#include "otbSimplifyPathListFilter.h" - -int otbPolygonToPolygonRCC8Calculator(int itkNotUsed(argc), char* argv[]) -{ - const unsigned int Dimension = 2; - - int nbImages = atoi(argv[1]); - char * outfile = argv[2]; - - typedef unsigned char PixelType; - typedef otb::Polygon<> PolygonType; - typedef otb::Image<PixelType, Dimension> ImageType; - typedef otb::ImageToEdgePathFilter<ImageType, PolygonType> EdgeExtractionFilterType; - typedef otb::SimplifyPathListFilter<PolygonType> SimplifyPathFilterType; - typedef SimplifyPathFilterType::InputListType PathListType; - typedef otb::ImageFileReader<ImageType> ReaderType; - typedef otb::PolygonToPolygonRCC8Calculator<PolygonType> CalculatorType; - - PolygonType::Pointer path = PolygonType::New(); - - PolygonType::ContinuousIndexType a1, a2, a3, a4, a5, a6, a7; - - a1[0] = 0; - a1[1] = 0; - a2[0] = 10; - a2[1] = 0; - a3[0] = 10; - a3[1] = 10; - a4[0] = 10; - a4[1] = 0; - - a5[0] = 5; - a5[1] = 5; - - a6[0] = 5; - a6[1] = 0; - - a7[0] = 100; - a7[1] = 100; - - path->AddVertex(a1); - path->AddVertex(a2); - path->AddVertex(a3); - path->AddVertex(a4); - - CalculatorType::Pointer calc = CalculatorType::New(); - - typedef PathListType::Iterator IteratorType; - - // reference image list - PathListType::Pointer regions = PathListType::New(); - - // Reading input images - std::ofstream out; - out.open(outfile, std::ios::out); - out << "Test results from otbPolygonToPolygonRCC8calculator test." << std::endl; - for (int cpt = 1; cpt <= nbImages; ++cpt) - { - ReaderType::Pointer reader = ReaderType::New(); - reader->SetFileName(argv[2 + cpt]); - EdgeExtractionFilterType::Pointer extraction = EdgeExtractionFilterType::New(); - extraction->SetInput(reader->GetOutput()); - extraction->SetForegroundValue(255); - extraction->Update(); - regions->PushBack(extraction->GetOutput()); - } - - SimplifyPathFilterType::Pointer simplifier = SimplifyPathFilterType::New(); - simplifier->SetInput(regions); - simplifier->GetFunctor().SetTolerance(0.1); - simplifier->Update(); - - // Declaration - CalculatorType::Pointer calc1, calc2, calc3; - // Computing relations for each images couple - unsigned int i = 1; - unsigned int j = 1; - for (IteratorType it1 = simplifier->GetOutput()->Begin(); it1 != simplifier->GetOutput()->End(); ++it1) - { - for (IteratorType it2 = simplifier->GetOutput()->Begin(); it2 != simplifier->GetOutput()->End(); ++it2) - { - std::cout << "Test: computing relation " << i << "," << j << std::endl; - calc1 = CalculatorType::New(); - calc1->SetPolygon1(it1.Get()); - calc1->SetPolygon2(it2.Get()); - calc1->Compute(); - out << calc1->GetValue() << "\t"; - std::cout << "Result without a priori knowledge " << calc1->GetValue() << std::endl; - - if (calc1->GetValue() < 3 - || calc1->GetValue() == 4 - || calc1->GetValue() == 6) - { - calc2 = CalculatorType::New(); - calc2->SetPolygon1(it1.Get()); - calc2->SetPolygon2(it2.Get()); - calc2->SetLevel1APrioriKnowledge(true); - calc2->Compute(); - std::cout << "Result with level1 a priori knowledge " << calc2->GetValue() << std::endl; - if (calc2->GetValue() != calc1->GetValue()) - { - std::cout << "Test failed: Result with level1AprioriKnowledge "; - std::cout << "different from result without a priori knowledge" << std::endl; - std::cout << calc1->GetValue() << "!=" << calc2->GetValue() << std::endl; - return EXIT_FAILURE; - } - } - if (calc1->GetValue() < 4) - { - calc3 = CalculatorType::New(); - calc3->SetPolygon1(it1.Get()); - calc3->SetPolygon2(it2.Get()); - calc3->SetLevel3APrioriKnowledge(true); - calc3->Compute(); - std::cout << "Result with level3 a priori knowledge " << calc3->GetValue() << std::endl; - if (calc3->GetValue() != calc1->GetValue()) - { - std::cout << "Test failed: Result with level3AprioriKnowledge "; - std::cout << "different from result without a priori knowledge" << std::endl; - std::cout << calc1->GetValue() << "!=" << calc3->GetValue() << std::endl; - return EXIT_FAILURE; - } - } - ++j; - } - j = 1; - ++i; - out << std::endl; - } - out.close(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx b/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx deleted file mode 100644 index 31087db07704262c17156a98e79155651fbbc707..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8Edge.cxx +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbRCC8Edge.h" -#include <cstdlib> - -int otbRCC8Edge(int itkNotUsed(argc), char * itkNotUsed(argv) []) -{ - typedef otb::RCC8Edge RCC8EdgeType; - typedef RCC8EdgeType::RCC8ValueType RCC8ValueType; - RCC8ValueType value = otb::OTB_RCC8_DC; - - // Instantiation - RCC8EdgeType::Pointer edge = RCC8EdgeType::New(); - edge->SetValue(value); - - if (edge->GetValue() != value) - { - std::cout << "Test failed: edge->GetValue()!=value" << std::endl; - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx b/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx deleted file mode 100644 index 47e5bb08efc4b453abf16a9ab4d0c495b80ed239..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8Graph.cxx +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexBase.h" -#include "otbRCC8VertexIterator.h" -#include "otbRCC8EdgeIterator.h" -#include "otbRCC8InEdgeIterator.h" -#include "otbRCC8OutEdgeIterator.h" -#include "otbMacro.h" -#include "otbPolygon.h" - -int otbRCC8Graph(int itkNotUsed(argc), char * itkNotUsed(argv) []) -{ - const unsigned int nbVertices = 2; - typedef otb::Polygon<> PathType; - typedef PathType::VertexType PointType; - typedef otb::RCC8VertexBase<PathType> VertexType; - typedef otb::RCC8Graph<VertexType> RCC8GraphType; - typedef otb::RCC8VertexIterator<RCC8GraphType> VertexIteratorType; - typedef otb::RCC8EdgeIterator<RCC8GraphType> EdgeIteratorType; - - // Instantiation - RCC8GraphType::Pointer rcc8Graph = RCC8GraphType::New(); - // Setting the number of vertices - rcc8Graph->SetNumberOfVertices(nbVertices - 1); - // Call to the build method - rcc8Graph->Build(); - - PointType p1, p2, p3, p4, p5, p6; - - p1[0] = 0; - p1[1] = 0; - p2[0] = 10; - p2[1] = 10; - p3[0] = 10; - p3[1] = 0; - p4[0] = 20; - p4[1] = 20; - p5[0] = 20; - p5[1] = 10; - p6[0] = 10; - p6[1] = 20; - - unsigned int vertex1SegLevel = 0; - unsigned int vertex2SegLevel = 10; - bool vertex1SegType = true; - bool vertex2SegType = false; - - PathType::Pointer path1 = PathType::New(); - path1->AddVertex(p1); - path1->AddVertex(p2); - path1->AddVertex(p3); - - VertexType::Pointer vertex1 = VertexType::New(); - vertex1->SetSegmentationLevel(vertex1SegLevel); - vertex1->SetSegmentationType(vertex1SegType); - vertex1->SetPath(path1); - - PathType::Pointer path2 = PathType::New(); - path2->AddVertex(p4); - path2->AddVertex(p5); - path2->AddVertex(p6); - - VertexType::Pointer vertex2 = VertexType::New(); - vertex2->SetSegmentationLevel(vertex2SegLevel); - vertex2->SetSegmentationType(vertex2SegType); - vertex2->SetPath(path2); - - rcc8Graph->SetVertex(0, vertex1); - rcc8Graph->SetVertex(1, vertex2); - - otbControlConditionTestMacro(rcc8Graph->GetNumberOfVertices() != nbVertices, - "rcc8Graph->GetNumberOfVertices()!=nbVertices"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetSegmentationLevel() != vertex1SegLevel, - "rcc8Graph->GetVertex(0)->GetSegmentationLevel()!=vertex1SegLevel"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetSegmentationType() != vertex1SegType, - "rcc8Graph->GetVertex(0)->GetSegmentationType()!=vertex1SegType"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0) != p1, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1) != p2, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2) != p3, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2)!=p3"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetSegmentationLevel() != vertex2SegLevel, - "rcc8Graph->GetVertex(1)->GetSegmentationLevel()!=vertex2SegLevel"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetSegmentationType() != vertex2SegType, - "rcc8Graph->GetVertex(1)->GetObjectLabelInImgage()!=vertex2SegType"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(0) != p4, - "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(0)!=p4"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(1) != p5, - "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(1)!=p5"); - otbControlConditionTestMacro(rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(2) != p6, - "rcc8Graph->GetVertex(1)->GetPath()->GetVertexList()->GetElement(2)!=p6"); - - VertexIteratorType v(rcc8Graph); - v.GoToBegin(); - otbControlConditionTestMacro(v.Get()->GetSegmentationLevel() != vertex1SegLevel, - "v.Get()->GetSegmentationLevel()!=vertex1SegLevel"); - otbControlConditionTestMacro(v.Get()->GetSegmentationType() != vertex1SegType, - "v.Get()->GetSegmentationType()!=vertex1SegType"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(0) != p1, - "v.Get()->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(1) != p2, - "v.Get()->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(2) != p3, - "v.Get()->GetPath()->GetVertexList()->GetElement(2)!=p3"); - ++v; - otbControlConditionTestMacro(v.Get()->GetSegmentationLevel() != vertex2SegLevel, - "v.Get()->GetSegmentationLevel()!=vertex2SegLevel"); - otbControlConditionTestMacro(v.Get()->GetSegmentationType() != vertex2SegType, - "v.Get()->GetObjectLabelInImgage()!=vertex2SegType"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(0) != p4, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(0)!=p4"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(1) != p5, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(1)!=p5"); - otbControlConditionTestMacro(v.Get()->GetPath()->GetVertexList()->GetElement(2) != p6, - "rcc8Graph->GetVertex(0)->GetPath()->GetVertexList()->GetElement(2)!=p6"); - - // Testing the edge iterator - rcc8Graph->AddEdge(0, 1, otb::OTB_RCC8_NTPPI); - - otbControlConditionTestMacro(rcc8Graph->GetNumberOfEdges() != 1, - "rcc8Graph->GetNumberOfEdges()!=1"); - - EdgeIteratorType e(rcc8Graph); - e.GoToBegin(); - otbControlConditionTestMacro(e.GetValue() != otb::OTB_RCC8_NTPPI, - "e.GetValue()!=otb::OTB_RCC8_NTPPI"); - otbControlConditionTestMacro(e.GetSourceIndex() != 0, - "e.GetSourceIndex()!=0"); - otbControlConditionTestMacro(e.GetTargetIndex() != 1, - "e.GetTargetIndex()!=1"); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx deleted file mode 100644 index 6c6807946062948b332eab371e1f49f47f1eb599..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8GraphFileReader.cxx +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexIterator.h" -#include "otbRCC8EdgeIterator.h" -#include "otbRCC8VertexBase.h" -#include "otbRCC8GraphFileReader.h" -#include "otbMacro.h" -#include "otbPolygon.h" - -int otbRCC8GraphFileReader(int itkNotUsed(argc), char* argv[]) -{ - char * inputFilename = argv[1]; - typedef otb::Polygon<> PathType; - typedef otb::RCC8VertexBase<PathType> VertexType; - typedef otb::RCC8Graph<VertexType> RCC8GraphType; - typedef otb::RCC8GraphFileReader<RCC8GraphType> RCC8GraphFileReaderType; - typedef otb::RCC8VertexIterator<RCC8GraphType> VertexIteratorType; - typedef otb::RCC8EdgeIterator<RCC8GraphType> EdgeIteratorType; - - // Instantiation - RCC8GraphFileReaderType::Pointer rcc8GraphReader = RCC8GraphFileReaderType::New(); - rcc8GraphReader->SetFileName(inputFilename); - - rcc8GraphReader->Update(); - - // Getting the output graph - RCC8GraphType::Pointer graph = rcc8GraphReader->GetOutput(); - - // Checking vertices - VertexIteratorType vIt(graph); - unsigned int count = 0; - - otbControlConditionTestMacro(graph->GetNumberOfVertices() != 4, - "graph->GetNumberOfVertices()!=4"); - otbControlConditionTestMacro(graph->GetNumberOfEdges() != 6, - "graph->GetNumberOfEdges()!=6"); - - // Checking edges - EdgeIteratorType eIt(graph); - count = 0; - for (eIt.GoToBegin(); !eIt.IsAtEnd(); ++eIt, ++count) - { - switch (count) - { - case 0: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_EC, - "eIt.GetValue()!=otb::OTB_RCC8_EC"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 0, - "eIt.GetSourceIndex()!=0"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 1, - "eIt.GetTargetIndex()!=1"); - break; - case 1: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_PO, - "eIt.GetValue()!=otb::OTB_RCC8_PO"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 1, - "eIt.GetSourceIndex()!=1"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 2, - "eIt.GetTargetIndex()!=2"); - break; - case 2: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_TPP, - "eIt.GetValue()!=otb::OTB_RCC8_TPP"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 2, - "eIt.GetSourceIndex()!=2"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 3, - "eIt.GetTargetIndex()!=3"); - break; - case 3: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_TPPI, - "eIt.GetValue()!=otb::OTB_RCC8_TPPI"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 0, - "eIt.GetSourceIndex()!=0"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 2, - "eIt.GetTargetIndex()!=2"); - break; - case 4: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_NTPP, - "eIt.GetValue()!=otb::OTB_RCC8_NTPP"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 1, - "eIt.GetSourceIndex()!=1"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 3, - "eIt.GetTargetIndex()!=3"); - break; - case 5: - otbControlConditionTestMacro(eIt.GetValue() != otb::OTB_RCC8_NTPPI, - "eIt.GetValue()!=otb::OTB_RCC8_NTPPI"); - otbControlConditionTestMacro(eIt.GetSourceIndex() != 0, - "eIt.GetSourceIndex()!=0"); - otbControlConditionTestMacro(eIt.GetTargetIndex() != 3, - "eIt.GetTargetIndex()!=3"); - break; - default: - otbControlConditionTestMacro(true, "Error in graph reading."); - break; - } - } - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx deleted file mode 100644 index 943183126a0653768d444a6c7ba0221443947b3c..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8GraphFileWriter.cxx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexBase.h" -#include "otbRCC8GraphFileWriter.h" -#include "otbPolygon.h" - -int otbRCC8GraphFileWriter(int itkNotUsed(argc), char* argv[]) -{ - const char * outputFile = argv[1]; - - typedef otb::Polygon<> PathType; - typedef otb::RCC8VertexBase<PathType> VertexType; - typedef otb::RCC8Graph<VertexType> RCC8GraphType; - typedef otb::RCC8GraphFileWriter<RCC8GraphType> RCC8GraphFileWriterType; - - // Graph instantiation - RCC8GraphType::Pointer rcc8Graph = RCC8GraphType::New(); - rcc8Graph->SetNumberOfVertices(4); - rcc8Graph->Build(); - - // Vertex filling - PathType::Pointer path = PathType::New(); - path->Initialize(); - - PathType::ContinuousIndexType p1, p2, p3; - - p1[0] = 0; - p1[1] = 0; - - p2[0] = 10; - p2[1] = 10; - - p3[0] = -5; - p3[1] = 2; - - path->AddVertex(p1); - path->AddVertex(p2); - path->AddVertex(p3); - - VertexType::Pointer vertex1, vertex2, vertex3, vertex4; - vertex1 = VertexType::New(); - vertex1->SetSegmentationLevel(0); - vertex1->SetSegmentationType(0); - vertex1->SetPath(path); - rcc8Graph->SetVertex(0, vertex1); - - vertex2 = VertexType::New(); - vertex2->SetSegmentationLevel(1); - vertex2->SetSegmentationType(1); - vertex2->SetPath(path); - rcc8Graph->SetVertex(1, vertex2); - - vertex3 = VertexType::New(); - vertex3->SetSegmentationLevel(2); - vertex3->SetSegmentationType(0); - vertex3->SetPath(path); - rcc8Graph->SetVertex(2, vertex3); - - vertex4 = VertexType::New(); - vertex4->SetSegmentationLevel(3); - vertex4->SetSegmentationType(0); - vertex4->SetPath(path); - rcc8Graph->SetVertex(3, vertex4); - - // Edge filling - rcc8Graph->AddEdge(0, 1, otb::OTB_RCC8_EC); - rcc8Graph->AddEdge(1, 2, otb::OTB_RCC8_PO); - rcc8Graph->AddEdge(2, 3, otb::OTB_RCC8_TPP); - rcc8Graph->AddEdge(0, 2, otb::OTB_RCC8_TPPI); - rcc8Graph->AddEdge(1, 3, otb::OTB_RCC8_NTPP); - rcc8Graph->AddEdge(0, 3, otb::OTB_RCC8_NTPPI); - - // Instantiation - RCC8GraphFileWriterType::Pointer rcc8GraphWriter - = RCC8GraphFileWriterType::New(); - rcc8GraphWriter->SetFileName(outputFile); - rcc8GraphWriter->SetInput(rcc8Graph); - rcc8GraphWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx b/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx deleted file mode 100644 index 2e274dac4c304505e2b28b82a530fce9d4a45bc9..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8GraphIOEndToEnd.cxx +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexBase.h" -#include "otbRCC8GraphFileReader.h" -#include "otbRCC8GraphFileWriter.h" -#include "otbPolygon.h" - -int otbRCC8GraphIOEndToEnd(int itkNotUsed(argc), char* argv[]) -{ - char * inputFilename = argv[1]; - char * outputFilename = argv[2]; - typedef otb::Polygon<> PathType; - typedef otb::RCC8VertexBase<PathType> VertexType; - typedef otb::RCC8Graph<VertexType> RCC8GraphType; - typedef otb::RCC8GraphFileReader<RCC8GraphType> RCC8GraphFileReaderType; - typedef otb::RCC8GraphFileWriter<RCC8GraphType> RCC8GraphFileWriterType; - - // End to end test - RCC8GraphFileReaderType::Pointer rcc8GraphReader = RCC8GraphFileReaderType::New(); - rcc8GraphReader->SetFileName(inputFilename); - RCC8GraphFileWriterType::Pointer rcc8GraphWriter = RCC8GraphFileWriterType::New(); - rcc8GraphWriter->SetInput(rcc8GraphReader->GetOutput()); - rcc8GraphWriter->SetFileName(outputFilename); - rcc8GraphWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx b/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx deleted file mode 100644 index 8a060d25bf7c343f4a8daa8d4e93f7415bae2507..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8TestDriver.cxx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbRCC8GraphFileReader); - REGISTER_TEST(otbRCC8GraphIOEndToEnd); - REGISTER_TEST(otbPolygonListToRCC8GraphFilter); - REGISTER_TEST(otbRCC8VertexBase); - REGISTER_TEST(otbPolygonToPolygonRCC8Calculator); - REGISTER_TEST(otbImageToImageRCC8Calculator); - REGISTER_TEST(otbRCC8Edge); - REGISTER_TEST(otbRCC8VertexWithCompacity); - REGISTER_TEST(otbRCC8Graph); - REGISTER_TEST(otbRCC8GraphFileWriter); - REGISTER_TEST(otbImageMultiSegmentationToRCC8GraphFilter); -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx b/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx deleted file mode 100644 index 6578e4f6ae038cad1485118ed773f18f7c757222..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8VertexBase.cxx +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexBase.h" -#include "otbPolygon.h" -#include "otbMacro.h" - -int otbRCC8VertexBase(int itkNotUsed(argc), char* argv[]) -{ - typedef otb::Polygon<> PathType; - unsigned int imageLevel = atoi(argv[1]); - bool imageType = atoi(argv[2]); - typedef otb::RCC8VertexBase<PathType> RCC8VertexType; - typedef RCC8VertexType::AttributesMapType AttributesMapType; - // Instantiation - RCC8VertexType::Pointer vertex1 = RCC8VertexType::New(); - - PathType::Pointer path = PathType::New(); - path->Initialize(); - - PathType::ContinuousIndexType p1, p2, p3; - - p1[0] = 0; - p1[1] = 0; - - p2[0] = 10; - p2[1] = 10; - - p3[0] = -5; - p3[1] = 2; - - path->AddVertex(p1); - path->AddVertex(p2); - path->AddVertex(p3); - - // Getters / setters tests - vertex1->SetSegmentationLevel(imageLevel); - vertex1->SetSegmentationType(imageType); - vertex1->SetPath(path); - - otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != imageLevel, - "Test failed: vertex1->GetSegmentationLevel()!=imageLevel"); - otbControlConditionTestMacro(vertex1->GetSegmentationType() != imageType, - "Test failed: vertex1->GetSegmentationType()!=imageType"); - - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(0) != p1, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(1) != p2, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(2) != p3, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(2)!=p3"); - - // attributes vector set test - AttributesMapType attr1 = vertex1->GetAttributesMap(); - otbControlConditionTestMacro(attr1["SegmentationLevel"].compare(std::string(argv[1])) != 0, - "Test failed: vertex1->GetAttributesMap()[\"SegmentationLevel\"]!=std::string(argv[1])"); - otbControlConditionTestMacro(atoi(attr1["SegmentationType"].c_str()) != static_cast<int>(imageType), - "Test failed:atoi(attr1[\"SegmentationType\"].c_str())!=imageType "); - - otbControlConditionTestMacro(atof(attr1["P0x"].c_str()) != p1[0], - "Test failed: atof(attr1[\"P0x\"].c_str())!=p1[0]"); - otbControlConditionTestMacro(atof(attr1["P0y"].c_str()) != p1[1], - "Test failed: atof(attr1[\"P0y\"].c_str())!=p1[1]"); - otbControlConditionTestMacro(atof(attr1["P1x"].c_str()) != p2[0], - "Test failed: atof(attr1[\"P1x\"].c_str())!=p2[0]"); - otbControlConditionTestMacro(atof(attr1["P1y"].c_str()) != p2[1], - "Test failed: atof(attr1[\"P1y\"].c_str())!=p2[1]"); - otbControlConditionTestMacro(atof(attr1["P2x"].c_str()) != p3[0], - "Test failed: atof(attr1[\"P2x\"].c_str())!=p3[0]"); - otbControlConditionTestMacro(atof(attr1["P2y"].c_str()) != p3[1], - "Test failed: atof( attr1[\"P2y\"].c_str())!=p3[1]"); - - // attributes vector get test - RCC8VertexType::Pointer vertex2 = RCC8VertexType::New(); - vertex2->SetAttributesMap(attr1); - otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != vertex2->GetSegmentationLevel(), - "Test failed: vertex1->GetSegmentationLevel()!=vertex2->GetSegmentationLevel()"); - otbControlConditionTestMacro(vertex1->GetSegmentationType() != vertex2->GetSegmentationType(), - "Test failed: vertex1->GetSegmentationType()!=vertex2->GetSegmentationType()"); - - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(0) != p1, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(1) != p2, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(2) != p3, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(2)!=p3"); - - return EXIT_SUCCESS; -} diff --git a/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx b/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx deleted file mode 100644 index 697aeda75e5b83da812d4ff32e112d5d88f34e70..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/test/otbRCC8VertexWithCompacity.cxx +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbRCC8VertexWithCompacity.h" -#include "otbMacro.h" -#include "otbPolygon.h" - -int otbRCC8VertexWithCompacity(int itkNotUsed(argc), char* argv[]) -{ - typedef otb::Polygon<> PathType; - typedef double PrecisionType; - - unsigned int imageLevel = atoi(argv[1]); - bool imageType = atoi(argv[2]); - PrecisionType compacity = atof(argv[3]); - - typedef otb::RCC8VertexWithCompacity<PathType, PrecisionType> RCC8VertexType; - typedef RCC8VertexType::AttributesMapType AttributesMapType; - // Instantiation - RCC8VertexType::Pointer vertex1 = RCC8VertexType::New(); - - PathType::Pointer path = PathType::New(); - path->Initialize(); - - PathType::ContinuousIndexType p1, p2, p3; - - p1[0] = 0; - p1[1] = 0; - - p2[0] = 10; - p2[1] = 10; - - p3[0] = -5; - p3[1] = 2; - - path->AddVertex(p1); - path->AddVertex(p2); - path->AddVertex(p3); - - // Getters / setters tests - vertex1->SetSegmentationLevel(imageLevel); - vertex1->SetSegmentationType(imageType); - vertex1->SetPath(path); - vertex1->SetCompacity(compacity); - - otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != imageLevel, - "Test failed: vertex1->GetSegmentationLevel()!=imageLevel"); - otbControlConditionTestMacro(vertex1->GetSegmentationType() != imageType, - "Test failed: vertex1->GetSegmentationType()!=imageType"); - - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(0) != p1, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(1) != p2, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(vertex1->GetPath()->GetVertexList()->GetElement(2) != p3, - "Test failed:vertex1->GetPath()->GetVertexList()->GetElement(2)!=p3"); - otbControlConditionTestMacro(vertex1->GetCompacity() != compacity, - "Test failed: vertex1->GetSegmentationImageIndex()!=imageIndex"); - // attributes vector set test - AttributesMapType attr1 = vertex1->GetAttributesMap(); - - std::ostringstream oss; - oss << p1[0]; - otbControlConditionTestMacro(attr1["P0x"].compare(oss.str()) != 0, - "Test failed:attr1[\"P0x\"].compare(std::string(p1[0]))!=0"); - oss.str(""); - oss << p1[1]; - otbControlConditionTestMacro(attr1["P0y"].compare(oss.str()) != 0, - "Test failed:attr1[\"P0y\"].compare(std::string(p1[1]))!=0"); - oss.str(""); - oss << p2[0]; - otbControlConditionTestMacro(attr1["P1x"].compare(oss.str()) != 0, - "Test failed:attr1[\"P1x\"].compare(std::string(p2[0]))!=0"); - oss.str(""); - oss << p2[1]; - otbControlConditionTestMacro(attr1["P1y"].compare(oss.str()) != 0, - "Test failed:attr1[\"P1y\"].compare(std::string(p2[1]))!=0"); - oss.str(""); - oss << p3[0]; - otbControlConditionTestMacro(attr1["P2x"].compare(oss.str()) != 0, - "Test failed:attr1[\"P2x\"].compare(std::string(p3[0]))!=0"); - oss.str(""); - oss << p3[1]; - otbControlConditionTestMacro(attr1["P2y"].compare(oss.str()) != 0, - "Test failed:attr1[\"P2y\"].compare(std::string(p3[1]))!=0"); - - otbControlConditionTestMacro(attr1["Compacity"].compare(std::string(argv[3])) != 0, - "Test failed: vertex1->GetAttributesMap()[\"Compacity\"]!=std::string(argv[2])"); - // attributes vector get test - RCC8VertexType::Pointer vertex2 = RCC8VertexType::New(); - vertex2->SetAttributesMap(attr1); - otbControlConditionTestMacro(vertex1->GetSegmentationLevel() != vertex2->GetSegmentationLevel(), - "Test failed: vertex1->GetSegmentationLevel()!=vertex2->GetSegmentationLevel()"); - otbControlConditionTestMacro(vertex1->GetSegmentationType() != vertex2->GetSegmentationType(), - "Test failed: vertex1->GetSegmentationType()!=vertex2->GetSegmentationType()"); - - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(0) != p1, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(0)!=p1"); - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(1) != p2, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(1)!=p2"); - otbControlConditionTestMacro(vertex2->GetPath()->GetVertexList()->GetElement(2) != p3, - "Test failed:vertex2->GetPath()->GetVertexList()->GetElement(2)!=p3"); - otbControlConditionTestMacro(vertex1->GetCompacity() != vertex2->GetCompacity(), - "Test failed: vertex1->GetCompacity()!=vertex2->GetCompacity()"); - - return EXIT_SUCCESS; -} diff --git a/Modules/Core/Metadata/include/otbBandName.h b/Modules/Radiometry/Indices/include/otbBandName.h similarity index 83% rename from Modules/Core/Metadata/include/otbBandName.h rename to Modules/Radiometry/Indices/include/otbBandName.h index 6bd25a144e5ac7a0506694035e591195a478e92c..118086139976cff411152658b054e26c59e93a44 100644 --- a/Modules/Core/Metadata/include/otbBandName.h +++ b/Modules/Radiometry/Indices/include/otbBandName.h @@ -27,11 +27,30 @@ namespace BandName { /** -* Provides a way to identify bands when passing the parameters -* to the radiometric functors.* -*/ -enum BandName {BLUE, GREEN, RED, NIR, MIR}; -enum LandsatTMBandNames {TM1, TM2, TM3, TM4, TM5, TM60, TM61, TM62, TM7}; + * Provides a way to identify bands when passing the parameters + * to the radiometric functors.* + */ +enum class CommonBandNames +{ + BLUE, + GREEN, + RED, + NIR, + MIR, + MAX +}; +enum LandsatTMBandNames +{ + TM1, + TM2, + TM3, + TM4, + TM5, + TM60, + TM61, + TM62, + TM7 +}; // Note for landsat equivalence // http://landsat.gsfc.nasa.gov/news/news-archive/sci_0017.html @@ -57,8 +76,8 @@ enum LandsatTMBandNames {TM1, TM2, TM3, TM4, TM5, TM60, TM61, TM62, TM7}; // 6 10.40-12.50 microm Thermal IR // 7 2.08-2.35 microm Mid-IR -} +} // namespace BandName -} +} // namespace otb #endif diff --git a/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h index ac8fff8d7e364ae00790595caaaeadada28ce211..426548fd5fc40aedf09bed790d64ccb4e2431d08 100644 --- a/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h +++ b/Modules/Radiometry/Indices/include/otbBuiltUpIndicesFunctor.h @@ -21,161 +21,12 @@ #ifndef otbBuiltUpIndicesFunctor_h #define otbBuiltUpIndicesFunctor_h -#include "otbVegetationIndicesFunctor.h" -#include <string> +#include "otbRadiometricIndex.h" namespace otb { namespace Functor { -/** - * \class TM4AndTM5IndexBase - * \brief Base class for TM4 And TM5 channels of Land Sat - * (equivalent to Red and NIR of SPOT5) - * - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TOutput> -class TM4AndTM5IndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const TM4AndTM5IndexBase&) const - { - return true; - } - //operator == - bool operator ==(const TM4AndTM5IndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) const - { - return this->Evaluate(inputVector[m_TM4Index - 1], static_cast<TInput2>(inputVector[m_TM5Index - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& tm4, const TInput2& tm5) const - { - return this->Evaluate(tm4, tm5); - } - /// Constructor - TM4AndTM5IndexBase() : m_TM4Index(4), m_TM5Index(5) {} - /// Desctructor - virtual ~TM4AndTM5IndexBase() {} - - /// Set TM4 Index - void SetIndex1(unsigned int channel) - { - m_TM4Index = channel; - } - /// Get TM4 Index - unsigned int GetIndex1() const - { - return m_TM4Index; - } - /// Set TM5 Index - void SetIndex2(unsigned int channel) - { - m_TM5Index = channel; - } - /// Get TM5 Index - unsigned int GetIndex2() const - { - return m_TM5Index; - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_TM4Index = channel; - } - if (band == BandName::NIR) - { - m_TM5Index = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_TM4Index; - } - if (band == BandName::NIR) - { - return m_TM5Index; - } - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& tm4, const TInput2& tm5) const = 0; - -private: - unsigned int m_TM4Index; - unsigned int m_TM5Index; -}; - -/** \class NDBI - * \brief This functor computes the Normalized Difference Built Up Index (NDBI) - * - * [Zha 2003] - * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInput1, class TInput2, class TOutput> -class NDBI : public TM4AndTM5IndexBase<TInput1, TInput2, TOutput> -{ -public: - /** Return the index name */ - std::string GetName() const override - { - return "NDBI"; - } - - /// Constructor - NDBI() {} - /// Desctructor - ~NDBI() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& pTM4, const TInput2& pTM5) const override - { - double dTM4 = static_cast<double>(pTM4); - double dTM5 = static_cast<double>(pTM5); - if (dTM5 + dTM4 == 0) - { - return static_cast<TOutput>(0.); - } - - return (static_cast<TOutput>((dTM5 - dTM4) / (dTM5 + dTM4))); - } -}; - /** \class ISU * \brief This functor computes the Index surfaces built (ISU) * @@ -186,56 +37,29 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class ISU : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class ISU : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + ISU() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "ISU"; } - /// Constructor - ISU() : m_A(100.), m_B(25.) {} - /// Desctructor - ~ISU() override {} - - /** Set/Get A correction */ - void SetA(const double pA) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_A = pA; - } - double GetA(void) const - { - return (m_A); - } - /** Set/Get B correction */ - void SetB(const double pB) - { - m_B = pB; - } - double GetB(void) const - { - return (m_B); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& pRed, const TInput2& pNIR) const override - { - double dRed = static_cast<double>(pRed); - double dNIR = static_cast<double>(pNIR); - if (dNIR == 0) - { + if (nir == 0) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>(m_A - (m_B * dRed) / (dNIR))); + return (static_cast<TOutput>(A - (B * red) / nir)); } -private: - double m_A; - double m_B; + static constexpr double A = 100.; + static constexpr double B = 25.; }; } // namespace Functor diff --git a/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h b/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h new file mode 100644 index 0000000000000000000000000000000000000000..f7b8503f4a189540b5b5e721b9aecf7f3786578b --- /dev/null +++ b/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbIndicesStackFunctor_h +#define otbIndicesStackFunctor_h + +#include <vector> +#include <stdexcept> +#include "itkVariableLengthVector.h" + +namespace otb +{ + +namespace Functor +{ +/** + * \class IndicesStackFunctor + * \brief A class to compute a stack of radiometric indices + * + * This functor can be built from a vector of TIndice*. its operator() + * will apply each functor of this vector to the input pixel, and + * return a VariableLengthVector containing the list resulting + * values. It can be used with otb::FunctorImageFilter + * + * \sa FunctorImageFilter + * + * \ingroup OTBIndices + */ +template <typename TIndice> +class IndicesStackFunctor +{ +public: + /// Read input / output types from TIndice + using IndiceType = TIndice; + using PixelType = typename IndiceType::PixelType; + // Output will be a VariableLengthVector of values return by + // radiometric indices + using OutputType = itk::VariableLengthVector<typename IndiceType::OutputType>; + + /** + * \param indices A std::vector<IndiceType*> for indices to compute + * the indice stack + * \throw std::runtime_error if indices is empty + */ + IndicesStackFunctor(const std::vector<IndiceType*>& indices) : m_Indices(std::move(indices)) + { + if (indices.empty()) + { + throw std::runtime_error("Can not build IndicesStackFunctor from an empty list of indices."); + } + } + + /** + * \param input A itk::VariableLengthVector<TInput> holding the + * pixel values for each band + * \return A VariableLengthVector<TInput::OutputType> holding all + * the indices values + */ + void operator()(OutputType& out, const PixelType& in) const + { + size_t idx = 0; + for (auto indice : m_Indices) + { + out[idx] = (*indice)(in); + ++idx; + } + } + /** + * \return the size of the indices list (to be used by FunctorImgeFilter) + */ + size_t OutputSize(...) const + { + return m_Indices.size(); + } + +private: + /// The list of indices to use + std::vector<IndiceType*> m_Indices; +}; + +} // End namespace Functor + +} // End namespace otb + +#endif diff --git a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h index 8dfa9cb4649682049b04f36f20fe789c739724de..aeb68d40248b1d9ae364638a060f0e60fd327b48 100644 --- a/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h +++ b/Modules/Radiometry/Indices/include/otbLandsatTMIndices.h @@ -22,8 +22,8 @@ #define otbLandsatTMIndices_h #include "otbMath.h" -#include "itkVariableLengthVector.h" #include "otbBandName.h" +#include "itkVariableLengthVector.h" #include "otbFuzzyVariable.h" #include <vector> #include <algorithm> diff --git a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h b/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h deleted file mode 100644 index 58120ad259a7666af506d883193f75299d85735a..0000000000000000000000000000000000000000 --- a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNDVIDataNodeFeatureFunction_h -#define otbNDVIDataNodeFeatureFunction_h - -#include "otbDataNodeImageFunction.h" - -#include "otbVegetationIndicesFunctor.h" -#include "otbPolyLineImageConstIterator.h" - -namespace otb -{ -/** \class NDVIDataNodeFeatureFunction - * \brief Compute a NDVI based feature alongside a - * datanode. - * - * This function compute a feature alongside a datanode. - * The feature is (NDVI >= threshold) per cent along the - * tested datanode. - * - * \ingroup Functions - * \sa DataNodeImageFunction - * \sa SpectralAngleDataNodeFeatureFunction - * - * \ingroup OTBIndices - */ - -template < -class TImage, -class TCoordRep = double, -class TPrecision = double -> -class ITK_EXPORT NDVIDataNodeFeatureFunction : - public DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> -{ -public: - /** Standard class typedefs. */ - typedef NDVIDataNodeFeatureFunction Self; - typedef DataNodeImageFunction<TImage, std::vector<TPrecision>, TCoordRep, TPrecision> - Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Method for creation through the object factory. */ - itkNewMacro(Self); - - /** Run-time type information (and related methods). */ - itkTypeMacro(NDVIDataNodeFeatureFunction, DataNodeImageFunction); - - /** Some typedefs. */ - typedef typename Superclass::DataNodeType DataNodeType; - typedef typename DataNodeType::LineType LineType; - - typedef TImage InputImageType; - typedef typename InputImageType::ConstPointer InputImageConstPointer; - typedef typename InputImageType::PixelType PixelType; - typedef typename InputImageType::InternalPixelType ScalarRealType; - typedef typename InputImageType::IndexType IndexType; - typedef typename InputImageType::IndexValueType IndexValueType; - - typedef TCoordRep CoordRepType; - - typedef TPrecision PrecisionType; - - typedef PolyLineImageConstIterator<InputImageType, LineType> - ImageLineIteratorType; - - typedef Functor::NDVI<ScalarRealType, ScalarRealType, PrecisionType> - NDVIFunctorType; - - typedef std::vector<PrecisionType> OutputType; - - OutputType Evaluate( const DataNodeType& node ) const override; - - /** Set/Get methods */ - itkGetConstMacro(NDVIThreshold, PrecisionType); - itkSetMacro(NDVIThreshold, PrecisionType); - - //TODO replace by metadata parsing - unsigned int GetREDChannelIndex() const - { - return m_NDVIFunctor.GetRedIndex()+1; - } - - void SetREDChannelIndex(unsigned int id) - { - m_NDVIFunctor.SetRedIndex(id-1); - } - - unsigned int GetNIRChannelIndex() const - { - return m_NDVIFunctor.GetNIRIndex()+1; - } - - void SetNIRChannelIndex(unsigned int id) - { - m_NDVIFunctor.SetNIRIndex(id-1); - } - -protected: - NDVIDataNodeFeatureFunction(); - ~NDVIDataNodeFeatureFunction() override {} - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - NDVIDataNodeFeatureFunction(const Self&) = delete; - void operator=(const Self&) = delete; - - /** NDVI Threshold & Functor */ - PrecisionType m_NDVIThreshold; - NDVIFunctorType m_NDVIFunctor; -}; - -} -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNDVIDataNodeFeatureFunction.hxx" -#endif - -#endif diff --git a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx b/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx deleted file mode 100644 index 910bc13c1f3baf276218f7af94ceb33a9fc0edb7..0000000000000000000000000000000000000000 --- a/Modules/Radiometry/Indices/include/otbNDVIDataNodeFeatureFunction.hxx +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNDVIDataNodeFeatureFunction_hxx -#define otbNDVIDataNodeFeatureFunction_hxx - -#include "otbNDVIDataNodeFeatureFunction.h" - -namespace otb -{ - -/** - * Constructor - */ -template <class TImage, class TCoordRep, class TPrecision> -NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::NDVIDataNodeFeatureFunction() -{ - m_NDVIThreshold = 0.3; //Advised for QuickBird images - this->SetREDChannelIndex(3); //for QuickBird images - this->SetNIRChannelIndex(4); //for QuickBird images -} - -/** - * Standard "PrintSelf" method - */ -template <class TImage, class TCoordRep, class TPrecision> -void -NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::PrintSelf( - std::ostream& os, - itk::Indent indent) const -{ - Superclass::PrintSelf( os, indent ); - os << indent << "NDVI Threshold: " << m_NDVIThreshold << std::endl; - os << indent << "RED Channel Index: " << this->GetREDChannelIndex() << std::endl; - os << indent << "NIR Channel Index: " << this->GetNIRChannelIndex() << std::endl; -} - - -template <class TImage, class TCoordRep, class TPrecision> -typename NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::OutputType - NDVIDataNodeFeatureFunction<TImage, TCoordRep, TPrecision> -::Evaluate( const DataNodeType& node ) const -{ - if(!((this->GetREDChannelIndex() <= this->GetInputImage()->GetNumberOfComponentsPerPixel()) - && (this->GetNIRChannelIndex() <= this->GetInputImage()->GetNumberOfComponentsPerPixel()) - && (this->GetREDChannelIndex() > 0) - && (this->GetNIRChannelIndex() > 0))) - { - itkExceptionMacro(<< "Invalid RED or NIR Channel Index"); - } - - const typename ImageLineIteratorType::PathType* path; - - switch (node.GetNodeType()) - { - case FEATURE_POINT: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - case FEATURE_LINE: - { - path = node.GetLine(); - break; - } - case FEATURE_POLYGON: - { - path = node.GetPolygonExteriorRing(); - break; - } - default: - { - itkExceptionMacro(<< "This DataNode type is not handle yet"); - break; - } - } - - ImageLineIteratorType lineIt(this->GetInputImage(), path); - lineIt.GoToBegin(); - - double nbValidPixel=0.; - double nbVisitedPixel=0.; - - while(!lineIt.IsAtEnd()) - { - if(this->IsInsideBuffer(lineIt.GetIndex())) - { - PixelType pixel = this->GetInputImage()->GetPixel(lineIt.GetIndex()); - if(m_NDVIFunctor(pixel [this->GetREDChannelIndex() - 1], - pixel [this->GetNIRChannelIndex() - 1]) >= this->GetNDVIThreshold()) - { - nbValidPixel += 1; - } - nbVisitedPixel += 1; - } - ++lineIt; - } - - OutputType output; - - if(nbVisitedPixel == 0) - { - //std::cout << "nbValidPixel: " << nbValidPixel << "nbVisitedPixel" << nbVisitedPixel << std::endl; - //itkExceptionMacro(<< "The DataNode and the Support Image are disjointed"); - output.push_back(static_cast<PrecisionType>(0.)); - } - else - { - output.push_back(static_cast<PrecisionType>(nbValidPixel/nbVisitedPixel)); - } - - output.push_back(static_cast<PrecisionType>(nbValidPixel)); - output.push_back(static_cast<PrecisionType>(nbVisitedPixel)); - - return output; -} - - -} // end namespace otb - -#endif diff --git a/Modules/Radiometry/Indices/include/otbRadiometricIndex.h b/Modules/Radiometry/Indices/include/otbRadiometricIndex.h new file mode 100644 index 0000000000000000000000000000000000000000..54179e85ed6314ada62ca18c4de27a94e3a2a8e3 --- /dev/null +++ b/Modules/Radiometry/Indices/include/otbRadiometricIndex.h @@ -0,0 +1,220 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbRadiometricIndex_h +#define otbRadiometricIndex_h + +#include "itkVariableLengthVector.h" +#include "otbBandName.h" +#include <array> +#include <set> +#include <string> +#include <map> +#include <stdexcept> + +using namespace otb::BandName; + +namespace otb +{ +namespace Functor +{ +/** + * \class RadiometricIndex + * \brief Base class for all radiometric indices + * + * This class is the base class for all radiometric indices. + * + * It offers services to: + * - Indicate which band are required among CommonBandNames enum + * - Set indices of each required band + * - Compute the indice response to a pixel by subclassing the pure + * virtual operator() + * + * This class is designed for performance on the critical path. For + * best performances use the Value() method when implementing + * operator() to avoid branches. + * + * \ingroup OTBIndices + */ +template <typename TInput, typename TOutput> +class RadiometricIndex +{ +public: + /// Types for input/output + using InputType = TInput; + using PixelType = itk::VariableLengthVector<InputType>; + using OutputType = TOutput; + + /// Enum Among which bands are used + using BandNameType = CommonBandNames; + + /// The number of bands, derived from the Enum MAX value + static constexpr size_t NumberOfBands = static_cast<size_t>(BandNameType::MAX); + + static constexpr double Epsilon = 0.0000001; + + // Necessary to be used as an abstract base class + virtual ~RadiometricIndex() = default; + + /** + * \param requiredBands the set<CommonBandNames> of required bands + * \throw runtime_error if requiredBands contains CommonBandNames::MAX + */ + RadiometricIndex(const std::set<BandNameType>& requiredBands) : m_RequiredBands(), m_BandIndices() + { + if (requiredBands.find(BandNameType::MAX) != requiredBands.end()) + { + throw std::runtime_error("TBandNameEnum::MAX can not be used as a required band"); + } + + // Fill the required bands array + m_RequiredBands.fill(false); + m_BandIndices.fill(0); + + for (auto b : requiredBands) + { + m_RequiredBands[static_cast<size_t>(b)] = true; + } + } + + /** + * \return a set<CommandBandName> containing the required bands for + * this indice. + */ + std::set<BandNameType> GetRequiredBands() const + { + std::set<BandNameType> resp; + for (size_t i = 0; i < NumberOfBands; ++i) + { + if (m_RequiredBands[i]) + { + resp.insert(static_cast<BandNameType>(i)); + } + } + + return resp; + } + + /** + * \param band The band to set (value in CommandBandName) + * \param index The index of the band to set (starts at 1 for first band) + * \throw runtime_error if band is CommandBandName::MAX + */ + void SetBandIndex(BandNameType band, size_t index) + { + if (band == BandNameType::MAX) + { + throw std::runtime_error("Can not set index for CommandBandName::MAX"); + } + m_BandIndices[static_cast<size_t>(band)] = index; + } + + /** + * \param indicesMap a std::map<CommandBandName,size_t> containing all + * bands indices to set (starts at 1 for first band) + * \throw runtime_error if indicesMap contains CommandBandName::MAX + */ + void SetBandsIndices(const std::map<BandNameType, size_t>& indicesMap) + { + for (auto it : indicesMap) + { + SetBandIndex(it.first, it.second); + } + } + + /** + * \param band The band for which to retrieve indice + * \return The indices of the band + * \throw runtime_error if band is CommandBandName::MAX + */ + size_t GetBandIndex(BandNameType band) const + { + if (band == BandNameType::MAX) + { + throw std::runtime_error("Can not get index for CommandBandName::MAX"); + } + return m_BandIndices[static_cast<size_t>(band)]; + } + + /** + * Astract method which will compute the radiometric indice + * \param input A itk::VariableLengthVector<TInput> holding the + * pixel values for each band + * \return The indice value as TOutput (starts at 1 for first band) + */ + virtual TOutput operator()(const itk::VariableLengthVector<TInput>& input) const = 0; + +protected: + /** + * Helper method to retrieve index for band name. With respect to + * the public method, this method will not throw an exception if + * CommandBandName::MAX is used as a parameter. Since it is meant for + * internal use in the critical path and not for client code, it + * will only assert that band is not CommandBandName::MAX in debug + * mode. + * + * \param band The band for which to retrieve indice + * \return The indices of the band + */ + size_t UncheckedBandIndex(BandNameType band) const + { + assert(band != BandNameType::MAX && "Can not retrieve index for band CommandBandName::MAX"); + return m_BandIndices[static_cast<size_t>(band)]; + } + + /** + * Helper method to parse input itk::VariableLengthVector<TInput> + * and get the corresponding band value. + * For instance: + * \snippet auto red = this->Value(CommonBandNamess::RED,input); + * + * As this function is on the critical performance path, no checks + * are made to see wether this band is really required for this + * indice. However an assertion will be raised in debug mode. + * + * \param band The band for which to retrieve the value + * \param input A itk::VariableLengthVector<TInput> holding the + * pixel values for each band + * \return The value of the band as double + * + */ + double Value(BandNameType band, const itk::VariableLengthVector<TInput>& input) const + { + assert(m_RequiredBands[static_cast<size_t>(band)] && "Retrieving value for a band that is not in the required bands list"); + return static_cast<double>(input[UncheckedBandIndex(band) - 1]); + } + +private: + // Explicitely disable default constructor + RadiometricIndex() = delete; + + /// An array storing the required status for each band + using RequiredBandsContainer = std::array<bool, NumberOfBands>; + RequiredBandsContainer m_RequiredBands; + + /// An array storing the indice for each band + using BandIndicesContainer = std::array<size_t, NumberOfBands>; + BandIndicesContainer m_BandIndices; +}; + +} // namespace Functor +} // End namespace otb + +#endif diff --git a/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h index 1f8ee072431c31fbcd476db730c772ca2e80fec1..aaedbc7c0efe62610a54a97817c87e52ff26dd1d 100644 --- a/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h +++ b/Modules/Radiometry/Indices/include/otbSoilIndicesFunctor.h @@ -22,255 +22,14 @@ #define otbSoilIndicesFunctor_h #include "otbMath.h" -#include "itkVariableLengthVector.h" -#include "otbBandName.h" -#include <string> +#include "otbRadiometricIndex.h" namespace otb { namespace Functor { -/** - * \class GAndRIndexBase - * - * \brief Base class for Green And Red channels of Spot Images - * XS1 corresponds to the green channel - * XS2 corresponds to the red channel - * XS3 corresponds to the Nir channel - * XS4 corresponds to the Mir channel (for Spot 4 & 5) - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * - * \ingroup Radiometry - * - * \ingroup OTBIndices -*/ -template<class TInput1, class TInput2, class TOutput> -class GAndRIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const GAndRIndexBase&) const - { - return true; - } - //operator == - bool operator ==(const GAndRIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) const - { - return this->Evaluate(inputVector[m_GreenIndex - 1], static_cast<TInput2>(inputVector[m_RedIndex - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& g, const TInput2& r) const - { - return this->Evaluate(g, r); - } - /// Constructor - GAndRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_GreenIndex(1), m_RedIndex(2) {} - /// Desctructor - virtual ~GAndRIndexBase() {} - - /// Set Green Index - void SetGreenIndex(unsigned int channel) - { - m_GreenIndex = channel; - } - /// Get Green Index - unsigned int GetGreenIndex() const - { - return m_GreenIndex; - } - /// Set Red Index - void SetRedIndex(unsigned int channel) - { - m_RedIndex = channel; - } - /// Get Red Index - unsigned int GetRedIndex() const - { - return m_RedIndex; - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::GREEN) - { - m_GreenIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; - } - if (band == BandName::GREEN) - { - return m_GreenIndex; - } - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& g, const TInput2& r) const = 0; - double m_EpsilonToBeConsideredAsZero; - -private: - unsigned int m_GreenIndex; - unsigned int m_RedIndex; -}; - -/** - * \class GAndRAndNirIndexBase - * \brief Base class for Green And Red And NIR channels of Spot Images - * - * - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TInput3, class TOutput> -class GAndRAndNirIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const GAndRAndNirIndexBase&) const - { - return true; - } - //operator == - bool operator ==(const GAndRAndNirIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) const - { - return this->Evaluate(static_cast<TInput1>(inputVector[m_GreenIndex - 1]), - static_cast<TInput2>(inputVector[m_RedIndex - 1]), - static_cast<TInput3>(inputVector[m_NIRIndex - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& g, const TInput2& r, const TInput2& nir) const - { - return this->Evaluate(g, r, nir); - } - /// Constructor - GAndRAndNirIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_GreenIndex(1), m_RedIndex(2), m_NIRIndex(3) {} - /// Desctructor - virtual ~GAndRAndNirIndexBase() {} - - /// Set Green Index - void SetGreenIndex(unsigned int channel) - { - m_GreenIndex = channel; - } - /// Get Green Index - unsigned int GetGreenIndex() const - { - return m_GreenIndex; - } - /// Set Red Index - void SetRedIndex(unsigned int channel) - { - m_RedIndex = channel; - } - /// Get Red Index - unsigned int GetRedIndex() const - { - return m_RedIndex; - } - /// Set Nir Index - void SetNIRIndex(unsigned int channel) - { - m_NIRIndex = channel; - } - /// Get Nir Index - unsigned int GetNIRIndex() const - { - return m_NIRIndex; - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::GREEN) - { - m_GreenIndex = channel; - } - if (band == BandName::NIR) - { - m_NIRIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; - } - if (band == BandName::GREEN) - { - return m_GreenIndex; - } - if (band == BandName::NIR) - { - return m_NIRIndex; - } - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& g, const TInput2& r, const TInput2& nir) const = 0; - - double m_EpsilonToBeConsideredAsZero; - -private: - unsigned int m_GreenIndex; - unsigned int m_RedIndex; - unsigned int m_NIRIndex; -}; - -/** \class IR - * \brief This functor computes the Redness Index (IR) +/** \class RI + * \brief This functor computes the Redness Index (RI) * * [Pouget et al., "Caracteristiques spectrales des surfaces sableuses * de la region cotiere nord-ouest de l'Egypte: application aux donnees @@ -283,36 +42,29 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class IR : public GAndRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class RI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + RI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN}) { - return "IR"; } - /// Constructor - IR() {} - /// Desctructor - ~IR() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dGreen = static_cast<double>(pGreen); - double dRed = static_cast<double>(pRed); - if (std::abs(dGreen) < this->m_EpsilonToBeConsideredAsZero) - { + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); + + if (std::abs(green) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return static_cast<TOutput>(dRed * dRed / (dGreen * dGreen * dGreen)); + return static_cast<TOutput>(red * red / (green * green * green)); } }; -/** \class IC +/** \class CI * \brief This functor computes the Color Index (IC) * * [Pouget et al., "Caracteristiques spectrales des surfaces sableuses @@ -326,37 +78,30 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class IC : public GAndRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class CI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + CI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN}) { - return "IC"; } - /// Constructor - IC() {} - /// Desctructor - ~IC() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dGreen = static_cast<double>(pGreen); - double dRed = static_cast<double>(pRed); - if (std::abs(dGreen + dRed) < this->m_EpsilonToBeConsideredAsZero) - { + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); + + if (std::abs(green + red) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>((dRed - dGreen) / (dRed + dGreen))); + return (static_cast<TOutput>((red - green) / (red + green))); } }; -/** \class IB - * \brief This functor computes the Brilliance Index (IB) +/** \class BI + * \brief This functor computes the Brilliance Index (BI) * * [ ] * @@ -365,33 +110,25 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class IB : public GAndRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class BI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + BI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN}) { - return "IB"; } - /// Constructor - IB() {} - /// Desctructor - ~IB() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dGreen = static_cast<double>(pGreen); - double dRed = static_cast<double>(pRed); + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); - return (static_cast<TOutput>(std::sqrt((dRed * dRed + dGreen * dGreen) / 2.))); + return (static_cast<TOutput>(std::sqrt((red * red + green * green) / 2.))); } }; -/** \class IB2 - * \brief This functor computes the Brilliance Index (IB2) +/** \class BI2 + * \brief This functor computes the Brilliance Index (BI2) * * [ ] * @@ -400,29 +137,21 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TInput3, class TOutput> -class IB2 : public GAndRAndNirIndexBase<TInput1, TInput2, TInput3, TOutput> +template <class TInput, class TOutput> +class BI2 : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + BI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN, CommonBandNames::NIR}) { - return "IB2"; } - /// Constructor - IB2() {} - /// Desctructor - ~IB2() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& pGreen, const TInput2& pRed, const TInput2& pNir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dGreen = static_cast<double>(pGreen); - double dRed = static_cast<double>(pRed); - double dNir = static_cast<double>(pNir); + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); - return (static_cast<TOutput>(std::sqrt((dRed * dRed + dGreen * dGreen + dNir * dNir) / 3.))); + return (static_cast<TOutput>(std::sqrt((red * red + green * green + nir * nir) / 3.))); } }; diff --git a/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h index 7131e2cdc08cf575a0070e846b02ae172b0c516d..63bc7299527ad45a5ab829f6a69d53f6cab3ec94 100644 --- a/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h +++ b/Modules/Radiometry/Indices/include/otbVegetationIndicesFunctor.h @@ -22,383 +22,13 @@ #define otbVegetationIndicesFunctor_h #include "otbMath.h" -#include "itkVariableLengthVector.h" -#include "otbBandName.h" -#include <string> +#include "otbRadiometricIndex.h" namespace otb { namespace Functor { - -/** - * \class RAndNIRIndexBase - * \brief Base class for R And NIR based Index - * - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TOutput> -class RAndNIRIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const RAndNIRIndexBase&) const - { - return true; - } - //operator == - bool operator ==(const RAndNIRIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) const - { - return this->Evaluate(inputVector[m_RedIndex - 1], static_cast<TInput2>(inputVector[m_NIRIndex - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& r, const TInput2& nir) const - { - return this->Evaluate(r, nir); - } - /// Constructor - RAndNIRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_NIRIndex(4) {} - /// Desctructor - virtual ~RAndNIRIndexBase() {} - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::NIR) - { - m_NIRIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; - } - if (band == BandName::NIR) - { - return m_NIRIndex; - } - } - - /// Set Red Index - void SetRedIndex(unsigned int channel) - { - m_RedIndex = channel; - } - /// Get Red Index - unsigned int GetRedIndex() const - { - return m_RedIndex; - } - /// Set NIR Index - void SetNIRIndex(unsigned int channel) - { - m_NIRIndex = channel; - } - /// Get NIR Index - unsigned int GetNIRIndex() const - { - return m_NIRIndex; - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& r, const TInput2& nir) const = 0; - double m_EpsilonToBeConsideredAsZero; - -private: - unsigned int m_RedIndex; - unsigned int m_NIRIndex; -}; - -/** - * \class RAndBAndNIRIndexBase - * \brief base class for R, B And NIR based Index - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TInput3, class TOutput> -class RAndBAndNIRIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const RAndBAndNIRIndexBase&) const - { - return true; - } - - //operator == - bool operator ==(const RAndBAndNIRIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) - { - return this->Evaluate(inputVector[m_RedIndex - 1], - static_cast<TInput2>(inputVector[m_BlueIndex - 1]), - static_cast<TInput3>(inputVector[m_NIRIndex - 1])); - } - // Binary operator - inline TOutput operator ()(const TInput1& r, const TInput2& b, const TInput2& nir) - { - return this->Evaluate(r, b, nir); - } - /// Constructor - RAndBAndNIRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_BlueIndex(1), m_NIRIndex(4) {} - /// Desctructor - virtual ~RAndBAndNIRIndexBase() {} - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::BLUE) - { - m_BlueIndex = channel; - } - if (band == BandName::NIR) - { - m_NIRIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; - } - if (band == BandName::BLUE) - { - return m_BlueIndex; - } - if (band == BandName::NIR) - { - return m_NIRIndex; - } - } - - /// Set Red Index - void SetRedIndex(unsigned int channel) - { - m_RedIndex = channel; - } - /// Get Red Index - unsigned int GetRedIndex() const - { - return m_RedIndex; - } - /// Set Blue Index - void SetBlueIndex(unsigned int channel) - { - m_BlueIndex = channel; - } - /// Get Blue Index - unsigned int GetBlueIndex() const - { - return m_BlueIndex; - } - - /// Set NIR Index - void SetNIRIndex(unsigned int channel) - { - m_NIRIndex = channel; - } - /// Get NIR Index - unsigned int GetNIRIndex() const - { - return m_NIRIndex; - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const = 0; - double m_EpsilonToBeConsideredAsZero; - -private: - unsigned int m_RedIndex; - unsigned int m_BlueIndex; - unsigned int m_NIRIndex; -}; - -/** - * \class RAndGAndNIRIndexBase - * \brief base class for R, G And NIR based Index - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TInput3, class TOutput> -class RAndGAndNIRIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const RAndGAndNIRIndexBase&) const - { - return true; - } - //operator == - bool operator ==(const RAndGAndNIRIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) - { - return this->Evaluate(inputVector[m_RedIndex - 1], - static_cast<TInput2>(inputVector[m_GreenIndex - 1]), - static_cast<TInput3>(inputVector[m_NIRIndex - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& r, const TInput2& g, const TInput2& nir) - { - return this->Evaluate(r, g, nir); - } - /// Constructor - RAndGAndNIRIndexBase() : m_EpsilonToBeConsideredAsZero(0.0000001), m_RedIndex(3), m_GreenIndex(2), m_NIRIndex(4) {} - /// Desctructor - virtual ~RAndGAndNIRIndexBase() {} - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::GREEN) - { - m_GreenIndex = channel; - } - if (band == BandName::NIR) - { - m_NIRIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; - } - if (band == BandName::GREEN) - { - return m_GreenIndex; - } - if (band == BandName::NIR) - { - return m_NIRIndex; - } - } - - /// Set Red Index - void SetRedIndex(unsigned int channel) - { - m_RedIndex = channel; - } - /// Get Red Index - unsigned int GetRedIndex() const - { - return m_RedIndex; - } - /// Set Green Index - void SetGreenIndex(unsigned int channel) - { - m_GreenIndex = channel; - } - /// Get Green Index - unsigned int GetGreenIndex() const - { - return m_GreenIndex; - } - - /// Set NIR Index - void SetNIRIndex(unsigned int channel) - { - m_NIRIndex = channel; - } - /// Get NIR Index - unsigned int GetNIRIndex() const - { - return m_NIRIndex; - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& r, const TInput2& g, const TInput3& nir) const = 0; - double m_EpsilonToBeConsideredAsZero; - -private: - unsigned int m_RedIndex; - unsigned int m_GreenIndex; - unsigned int m_NIRIndex; -}; - /** \class NDVI * \brief This functor computes the Normalized Difference Vegetation Index (NDVI) * @@ -409,33 +39,31 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class NDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class NDVI : public RadiometricIndex<TInput, TOutput> { public: + NDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) + { + } - /** Return the index name */ - std::string GetName() const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return "NDVI"; + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + return static_cast<TOutput>(Compute(red, nir)); } - /// Constructor - NDVI() {} - /// Desctructor - ~NDVI() override {} - // Operator on r and nir single pixel values -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + // This static compute will be used in indices derived from NDVI + static double Compute(const double& red, const double& nir) { - double dr = static_cast<double>(r); - double dnir = static_cast<double>(nir); - if (std::abs(dnir + dr) < this->m_EpsilonToBeConsideredAsZero) - { - return static_cast<TOutput>(0.); + if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + return 0.; } - return (static_cast<TOutput>((dnir - dr) / (dnir + dr))); + return (nir - red) / (nir + red); } }; @@ -449,29 +77,24 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class RVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class RVI : public RadiometricIndex<TInput, TOutput> { public: - - /** Return the index name */ - std::string GetName() const override + RVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "RVI"; } - RVI() {} - ~RVI() override {} -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dr = static_cast<double>(r); - double dnir = static_cast<double>(nir); - if (std::abs(dr) < this->m_EpsilonToBeConsideredAsZero) - { + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + if (std::abs(red) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>(dnir / dr)); + return (static_cast<TOutput>(nir / red)); } }; @@ -484,57 +107,31 @@ protected: * C. L. Wiegand, A. J. Richardson, D. E. Escobar, and A. H. Gerbermann, * "Vegetation Indices in Crop Assessments", REMOTE SENS. ENVIRON. 35:105-119 (1991) * - * \ingroup Functor2 + * \ingroup Functor * \ingroup Radiometry * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class PVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class PVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + PVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "PVI"; } - PVI() : m_A(0.90893), m_B(7.46216), m_Coeff(0.74) {} - ~PVI() override {} - /** Set/Get A and B parameters */ - void SetA(const double A) - { - m_A = A; - m_Coeff = 1. / (std::sqrt(m_A * m_A + 1.)); - } - double GetA(void) const - { - return (m_A); - } - void SetB(const double B) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_B = B; - } - double GetB(void) const - { - return (m_B); - } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); - return (static_cast<TOutput>((dnir - m_A * dr - m_B) * m_Coeff)); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -private: + return (static_cast<TOutput>((nir - A * red - B) * C)); + } /** A and B parameters */ - double m_A; - double m_B; - /** Denominator, pre-calculed when the A variable is set */ - double m_Coeff; - + static constexpr double A = 0.90893; + static constexpr double B = 7.46216; + static constexpr double C = 9.74; }; /** \class SAVI @@ -547,48 +144,28 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class SAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class SAVI : public RadiometricIndex<TInput, TOutput> { public: - - /** Return the index name */ - std::string GetName() const override + SAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "SAVI"; } - SAVI() : m_L(0.5) {} - ~SAVI() override {} - - /** Set/Get L correction */ - void SetL(const double L) - { - m_L = L; - } - double GetL(void) const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return (m_L); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); - double denominator = dnir + dr + m_L; - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { + if (std::abs(nir + red + L) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>(((dnir - dr) * (1 + m_L)) / denominator)); + return (static_cast<TOutput>(((nir - red) * (1 + L)) / (nir + red + L))); } -private: - /** L correction */ - double m_L; - + static constexpr double L = 0.5; }; /** \class TSAVI @@ -601,68 +178,33 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class TSAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class TSAVI : public RadiometricIndex<TInput, TOutput> { public: - - /** Return the index name */ - std::string GetName() const override + TSAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "TSAVI"; } - TSAVI() : m_A(0.7), m_S(0.9), m_X(0.08) {} - ~TSAVI() override {} - - /** Set/Get S and A parameters */ - void SetS(const double S) - { - m_S = S; - } - double GetS(void) const - { - return (m_S); - } - void SetA(const double A) - { - m_A = A; - } - double GetA(void) const - { - return (m_A); - } - /** Set/Get X parameter */ - void SetX(const double X) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_X = X; - } - double GetX(void) const - { - return (m_X); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); - double denominator = m_A * dnir + dr + m_X * (1. + m_A * m_A); - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { + double denominator = A * nir + red + X * (1. + A * A); + + if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>((m_A * (dnir - m_A * dr - m_S)) / denominator)); + return (static_cast<TOutput>((A * (nir - A * red - S)) / denominator)); } -private: - /** A and S parameters */ - double m_A; - double m_S; + static constexpr double A = 0.7; + static constexpr double S = 0.9; /** X parameter */ - double m_X; - + static constexpr double X = 0.08; }; /** \class WDVI @@ -675,41 +217,30 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class WDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class WDVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + /// Constructor + WDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "WDVI"; } - /// Constructor - WDVI() : m_S(0.4) {} - /// Desctructor - ~WDVI() override {} - // Operator on r and nir single pixel values -/** Set/Get Slop of soil line */ - void SetS(const double s) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_S = s; + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + return static_cast<TOutput>(Compute(red, nir)); } - double GetS(void) const + + static double Compute(const double& red, const double& nir) { - return (m_S); + return (nir - S * red); } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dr = static_cast<double>(r); - double dnir = static_cast<double>(nir); - return (dnir - m_S * dr); - } -private: /** Slope of soil line */ - double m_S; + static constexpr double S = 0.4; }; /** \class MSAVI @@ -723,69 +254,37 @@ private: * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class MSAVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class MSAVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + MSAVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "MSAVI"; } - typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType; - typedef SAVI<TInput1, TInput2, TOutput> SAVIFunctorType; - typedef WDVI<TInput1, TInput2, TOutput> WDVIFunctorType; - MSAVI() : m_S(0.4) - { - m_WDVIfunctor.SetS(m_S); - } - ~MSAVI() override {} -/** Set/Get Slop of soil line */ - void SetS(const double s) - { - m_S = s; - m_WDVIfunctor.SetS(m_S); - } - double GetS(void) const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return (m_S); - } - NDVIFunctorType GetNDVI(void) const - { - return (m_NDVIfunctor); - } - WDVIFunctorType GetWDVI(void) const - { - return (m_WDVIfunctor); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); + double ndvi = NDVI<TInput, TOutput>::Compute(red, nir); + double wdvi = WDVI<TInput, TOutput>::Compute(red, nir); - double dNDVI = this->GetNDVI() (r, nir); - double dWDVI = this->GetWDVI() (r, nir); - double dL = 1 - 2 * m_S * dNDVI * dWDVI; + double L = 1 - 2 * S * ndvi * wdvi; - double denominator = dnir + dr + dL; + double denominator = nir + red + L; - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { + if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>(((dnir - dr) * (1 + dL)) / denominator)); + return (static_cast<TOutput>(((nir - red) * (1 + L)) / denominator)); } private: /** Slope of soil line */ - double m_S; - NDVIFunctorType m_NDVIfunctor; - WDVIFunctorType m_WDVIfunctor; - + static constexpr double S = 0.4; }; /** \class MSAVI2 @@ -798,30 +297,25 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class MSAVI2 : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class MSAVI2 : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + MSAVI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "MSAVI2"; } - MSAVI2() {} - ~MSAVI2() override {} - -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); - double sqrt_value = (2 * dnir + 1) * (2 * dnir + 1) - 8 * (dnir - dr); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + double sqrt_value = (2 * nir + 1) * (2 * nir + 1) - 8 * (nir - red); if (sqrt_value < 0.) { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>((2 * dnir + 1 - std::sqrt(sqrt_value)) / 2.)); + return (static_cast<TOutput>((2 * nir + 1 - std::sqrt(sqrt_value)) / 2.)); } }; @@ -836,44 +330,39 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class GEMI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class GEMI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + GEMI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "GEMI"; } - GEMI() {} - ~GEMI() override {} - -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dnir = static_cast<double>(nir); - double dr = static_cast<double>(r); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); - double dnu; - double dnumerateur_nu; - double ddenominateur_nu = dnir + dr + 0.5; - if (std::abs(ddenominateur_nu) < this->m_EpsilonToBeConsideredAsZero) - { - dnu = 0; + double nu; + double num_nu; + double denom_nu = nir + red + 0.5; + + if (std::abs(denom_nu) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + nu = 0; } else { - dnumerateur_nu = 2 * (dnir * dnir - dr * dr) + 1.5 * dnir + 0.5 * dr; - dnu = dnumerateur_nu / ddenominateur_nu; + num_nu = 2 * (nir * nir - red * red) + 1.5 * nir + 0.5 * red; + nu = num_nu / denom_nu; } - double ddenominateur_GEMI = 1 - dr; - if (std::abs(ddenominateur_GEMI) < this->m_EpsilonToBeConsideredAsZero) + double denom_GEMI = 1 - red; + if (std::abs(denom_GEMI) < RadiometricIndex<TInput, TOutput>::Epsilon) { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>((dnu * (1 - 0.25 * dnu) - (dr - 0.125)) / ddenominateur_GEMI)); + return (static_cast<TOutput>((nu * (1 - 0.25 * nu) - (red - 0.125)) / denom_GEMI)); } }; @@ -890,87 +379,54 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TInput3, class TOutput> -class AVI : public RAndGAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput> +template <class TInput, class TOutput> +class AVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + AVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::GREEN, CommonBandNames::RED, CommonBandNames::NIR}) { - return "AVI"; } - AVI() : m_LambdaG(560.), m_LambdaR(660.), m_LambdaNir(830.) {} - ~AVI() override {} -/** Set/Get Lambda red parameter*/ - void SetLambdaR(const double lr) - { - m_LambdaR = lr; - } - double GetLambdaR(void) const - { - return (m_LambdaR); - } -/** Set/Get Lambda green parameter */ - void SetLambdaG(const double lg) - { - m_LambdaG = lg; - } - double GetLambdaG(void) const - { - return (m_LambdaG); - } -/** Set/Get Lambda red parameter */ - void SetLambdaNir(const double lnir) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_LambdaNir = lnir; - } - double GetLambdaNir(void) const - { - return (m_LambdaNir); - } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& g, const TInput3& nir) const override - { - double dr = static_cast<double>(r); - double dg = static_cast<double>(g); - double dnir = static_cast<double>(nir); + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); - double dfact1 = (m_LambdaNir - m_LambdaR) / m_LambdaR; - double dfact2 = (m_LambdaR - m_LambdaG) / m_LambdaR; + constexpr double dfact1 = (LambdaNir - LambdaR) / LambdaR; + constexpr double dfact2 = (LambdaR - LambdaG) / LambdaR; double dterm1; double dterm2; - if (std::abs(dnir - dr) < this->m_EpsilonToBeConsideredAsZero) - { + if (std::abs(nir - red) < RadiometricIndex<TInput, TOutput>::Epsilon) + { dterm1 = 0; } else { - dterm1 = std::atan(dfact1 / (dnir - dr)); + dterm1 = std::atan(dfact1 / (nir - red)); } - if (std::abs(dg - dr) < this->m_EpsilonToBeConsideredAsZero) + if (std::abs(green - red) < RadiometricIndex<TInput, TOutput>::Epsilon) { dterm2 = 0; } else { - dterm2 = std::atan(dfact2 / (dg - dr)); + dterm2 = std::atan(dfact2 / (green - red)); } return static_cast<TOutput>(dterm1 + dterm2); } -private: /** Central wavelength of the green channel (=Lambda1) */ - double m_LambdaG; + static constexpr double LambdaG = 560; /** Central wavelength of the red channel (=Lambda2) */ - double m_LambdaR; + static constexpr double LambdaR = 660; /** Central wavelength of the nir channel (=Lambda3) */ - double m_LambdaNir; + static constexpr double LambdaNir = 830; }; /** \class ARVI @@ -985,134 +441,31 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TInput3, class TOutput> -class ARVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput> -{ -public: - /** Return the index name */ - std::string GetName() const override - { - return "ARVI"; - } - - ARVI() : m_Gamma(0.5) {} - ~ARVI() override {} - - /** Set/Get Gamma parameter */ - void SetGamma(const double gamma) - { - m_Gamma = gamma; - } - double GetGamma(void) const - { - return (m_Gamma); - } - -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override - { - double dr = static_cast<double>(r); - double db = static_cast<double>(b); - double dnir = static_cast<double>(nir); - double RHOrb = dr - m_Gamma * (db - dr); - double denominator = dnir + RHOrb; - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { - return static_cast<TOutput>(0.); - } - return (static_cast<TOutput>((dnir - RHOrb) / denominator)); - } - -private: - - /** Gamma parameter */ - double m_Gamma; -}; - -/** \class TSARVI - * \brief This functor computes the Transformed Soil Atmospherical Resistant Vegetation Index (TSARVI) - * - * [Yoram J. Kaufman and Didier Tanre, 1992] - * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInput1, class TInput2, class TInput3, class TOutput> -class TSARVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput> +template <class TInput, class TOutput> +class ARVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + ARVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::BLUE, CommonBandNames::RED, CommonBandNames::NIR}) { - return "TSARVI"; } - TSARVI() : m_A(0.0), m_B(0.0), m_X(0.08), m_Gamma(0.5) {} - ~TSARVI() override {} - - /** Set/Get A and B parameters */ - void SetA(const double A) - { - m_A = A; - } - double GetA(void) const - { - return (m_A); - } - void SetB(const double B) - { - m_B = B; - } - double GetB(void) const - { - return (m_B); - } - /** Set/Get X parameter */ - void SetX(const double X) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - m_X = X; - } - double GetX(void) const - { - return (m_X); - } - /** Set/Get the gamma parameter */ - void SetGamma(const double gamma) - { - m_Gamma = gamma; - } - double GetGamma(void) const - { - return (m_Gamma); - } + auto blue = this->Value(CommonBandNames::BLUE, input); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override - { - double dr = static_cast<double>(r); - double db = static_cast<double>(b); - double dnir = static_cast<double>(nir); - double dRB = dr - m_Gamma * (db - dr); - double denominator = dRB + m_A * dnir - m_A * m_B + m_X * (1. + m_A * m_A); - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { + double RHOrb = red - Gamma * (blue - red); + double denominator = nir + RHOrb; + if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } - return (static_cast<TOutput>((m_A * (dnir - m_A * dRB - m_B)) / denominator)); + return (static_cast<TOutput>((nir - RHOrb) / denominator)); } -private: - - /** A and B parameters */ - double m_A; - double m_B; - /** X parameter */ - double m_X; /** Gamma parameter */ - double m_Gamma; - + static constexpr double Gamma = 0.5; }; /** \class EVI @@ -1127,81 +480,39 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TInput3, class TOutput> -class EVI : public RAndBAndNIRIndexBase<TInput1, TInput2, TInput3, TOutput> +template <class TInput, class TOutput> +class EVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + EVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::BLUE, CommonBandNames::RED, CommonBandNames::NIR}) { - return "EVI"; } - EVI() : m_G(2.5), m_C1(6.0), m_C2(7.5), m_L(1.0) {} - ~EVI() override {} -/** Set/Get G parameter */ - void SetG(const double g) - { - m_G = g; - } - double GetG(void) const - { - return (m_G); - } - /** Set/Get C1 parameter */ - void SetC1(const double c1) - { - m_C1 = c1; - } - double GetC1(void) const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return (m_C1); - } - /** Set/Get C2 parameter */ - void SetC2(const double c2) - { - m_C2 = c2; - } - double GetC2(void) const - { - return (m_C2); - } - /** Set/Get L parameter */ - void SetL(const double l) - { - m_L = l; - } - double GetL(void) const - { - return (m_L); - } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& b, const TInput3& nir) const override - { - double dr = static_cast<double>(r); - double db = static_cast<double>(b); - double dnir = static_cast<double>(nir); - double denominator = dnir + m_C1 * dr - m_C2 * db + m_L; - if (std::abs(denominator) < this->m_EpsilonToBeConsideredAsZero) - { + auto blue = this->Value(CommonBandNames::BLUE, input); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + double denominator = nir + C1 * red - C2 * blue + L; + if (std::abs(denominator) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return (static_cast<TOutput>(0.)); } - return (static_cast<TOutput>(m_G * (dnir - dr) / denominator)); + return (static_cast<TOutput>(G * (nir - red) / denominator)); } -private: - /** Gain factor */ - double m_G; + static constexpr double G = 2.5; /** Coefficient of the aerosol resistance term */ - double m_C1; + static constexpr double C1 = 6.0; /** Coefficient of the aerosol resistance term */ - double m_C2; + static constexpr double C2 = 7.5; /** Canopy background adjustment */ - double m_L; + static constexpr double L = 1.0; }; /** \class IPVI @@ -1214,31 +525,26 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class IPVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class IPVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + IPVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "IPVI"; } - IPVI() {} - ~IPVI() override {} - -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dr = static_cast<double>(r); - double dnir = static_cast<double>(nir); - if (std::abs(dnir + dr) < this->m_EpsilonToBeConsideredAsZero) - { + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon) + { return static_cast<TOutput>(0.); } else { - return (static_cast<TOutput>(dnir / (dnir + dr))); + return (static_cast<TOutput>(nir / (nir + red))); } } }; @@ -1253,40 +559,30 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class TNDVI : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class TNDVI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + TNDVI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - return "TNDVI"; } - typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType; - TNDVI() {} - ~TNDVI() override {} - - NDVIFunctorType GetNDVI(void) const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return (m_NDVIfunctor); - } + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override - { - double dval = this->GetNDVI() (r, nir) + 0.5; - if (dval < 0) - { + double val = NDVI<TInput, TOutput>::Compute(red, nir) + 0.5; + + if (val < 0) + { return (static_cast<TOutput>(0)); } else { - return (static_cast<TOutput>(std::sqrt(dval))); + return (static_cast<TOutput>(std::sqrt(val))); } } -private: - NDVIFunctorType m_NDVIfunctor; }; /** \class LAIFromNDVILogarithmic @@ -1305,69 +601,62 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class LAIFromNDVILogarithmic : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class LAIFromNDVILogarithmic : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + LAIFromNDVILogarithmic() + : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}), m_NdviSoil(0.1), m_NdviInf(0.89), m_ExtinctionCoefficient(0.71) { - return "LAIFromNDVILogarithmic"; } - typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType; - LAIFromNDVILogarithmic() : m_NdviSoil(0.10), m_NdviInf(0.89), m_ExtinctionCoefficient(0.71) {} - ~LAIFromNDVILogarithmic() override {} - - NDVIFunctorType GetNDVI(void) const - { - return (m_NDVIfunctor); - } - - void SetNdviSoil(const double val) + void SetNdviSoil(const double& val) { m_NdviSoil = val; } - double GetNdviSoil(void) const + + const double& GetNdviSoil() const { - return (m_NdviSoil); + return m_NdviSoil; } - void SetNdviInf(const double val) + void SetNdviInf(const double& val) { m_NdviInf = val; } - double GetNdviInf(void) const + + const double& GetNdviInf() const { - return (m_NdviInf); + return m_NdviInf; } - void SetExtinctionCoefficient(const double val) + void SetExtinctionCoefficient(const double& val) { m_ExtinctionCoefficient = val; } - double GetExtinctionCoefficient(void) const + + const double& GetExtionctionCoefficient() const { - return (m_ExtinctionCoefficient); + return m_ExtinctionCoefficient; } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - double dval = this->GetNDVI() (r, nir); - if (dval < 0) - { + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + double val = NDVI<TInput, TOutput>::Compute(red, nir); + + if (val < 0) + { return (static_cast<TOutput>(0)); } else { - return (static_cast<TOutput>( - -(1.0/m_ExtinctionCoefficient)*std::log((dval- m_NdviInf)/(m_NdviSoil-m_NdviInf)) - )); + return static_cast<TOutput>(-(1.0 / m_ExtinctionCoefficient) * std::log((val - m_NdviInf) / (m_NdviSoil - m_NdviInf))); } } -private: - NDVIFunctorType m_NDVIfunctor; + double m_NdviSoil; double m_NdviInf; double m_ExtinctionCoefficient; @@ -1391,50 +680,42 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class LAIFromReflectancesLinear : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class LAIFromReflectancesLinear : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override - { - return "LAIFromReflectancesLinear"; - } - - typedef NDVI<TInput1, TInput2, TOutput> NDVIFunctorType; - LAIFromReflectancesLinear() : m_RedCoef(-17.91), m_NirCoef(12.26) {} - ~LAIFromReflectancesLinear() override {} - - NDVIFunctorType GetReflectances(void) const + LAIFromReflectancesLinear() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}), m_RedCoef(-17.91), m_NirCoef(12.26) { - return (m_NDVIfunctor); } - void SetRedCoef(const double val) + void SetRedCoef(const double& val) { m_RedCoef = val; } - double GetRedCoef(void) const + + const double& GetRedCoef() const { - return (m_RedCoef); + return m_RedCoef; } - void SetNirCoef(const double val) + void SetNirCoef(const double& val) { m_NirCoef = val; } - double GetNirCoef(void) const + + const double& GetNirCoef() const { - return (m_NirCoef); + return m_NirCoef; } -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return (static_cast<TOutput>(m_RedCoef*r+m_NirCoef*nir)); + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); + + return (static_cast<TOutput>(m_RedCoef * red + m_NirCoef * nir)); } -private: - NDVIFunctorType m_NDVIfunctor; + double m_RedCoef; double m_NirCoef; }; @@ -1459,40 +740,29 @@ private: */ - template <class TInput1, class TInput2, class TOutput> - class LAIFromNDVIFormosat2Functor : public RAndNIRIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class LAIFromNDVIFormosat2Functor : public RadiometricIndex<TInput, TOutput> +{ +public: + LAIFromNDVIFormosat2Functor() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::NIR}) { - public: + } - /** Return the index name */ - std::string GetName() const override - { - return "LAIFromNDVIFormosat2Functor"; - } + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override + { + auto red = this->Value(CommonBandNames::RED, input); + auto nir = this->Value(CommonBandNames::NIR, input); - /// Constructor - LAIFromNDVIFormosat2Functor() {} - /// Desctructor - ~LAIFromNDVIFormosat2Functor() override {} - // Operator on r and nir single pixel values - protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& nir) const override + if (std::abs(nir + red) < RadiometricIndex<TInput, TOutput>::Epsilon) { - double a = 0.1519; - double b = 3.9443; - double c = 0.13; - - double dr = static_cast<double>(r); - double dnir = static_cast<double>(nir); - if (std::abs(dnir + dr) < this->m_EpsilonToBeConsideredAsZero) - { - return static_cast<TOutput>(0.); - } - - return static_cast<TOutput>(a*(std::exp(static_cast<double>(dnir-dr)/static_cast<double>(dr+dnir)*b)-std::exp(c*b))); - }; - + return static_cast<TOutput>(0.); + } + return static_cast<TOutput>(A * (std::exp((nir - red) / (red + nir) * B) - std::exp(C * B))); + } + static constexpr double A = 0.1519; + static constexpr double B = 3.9443; + static constexpr double C = 0.13; }; diff --git a/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h b/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h index e68d884d721fbdbe9fe4cbf67b2f4c034c8e66c3..19acf0fb19bd6681451935869625f2b1267d0665 100644 --- a/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h +++ b/Modules/Radiometry/Indices/include/otbWaterIndicesFunctor.h @@ -22,168 +22,12 @@ #define otbWaterIndicesFunctor_h #include "otbMath.h" -#include "itkVariableLengthVector.h" -#include "otbSqrtSpectralAngleFunctor.h" -#include "otbBandName.h" -#include <string> +#include "otbRadiometricIndex.h" namespace otb { namespace Functor { -/** - * \class WaterIndexBase - * \brief Base class - * - * Implement operators for UnaryFunctorImageFilter templated with a - * VectorImage and BinaryFunctorImageFilter templated with single - * images. - * Subclasses should NOT overload operators, they must re-implement - * the Evaluate() method. - * - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template<class TInput1, class TInput2, class TOutput> -class WaterIndexBase -{ -public: - /// Vector pixel type used to support both vector images and multiple - /// input images - typedef itk::VariableLengthVector<TInput1> InputVectorType; - - //operators != - bool operator !=(const WaterIndexBase&) const - { - return true; - } - //operator == - bool operator ==(const WaterIndexBase& other) const - { - return !(*this != other); - } - - // Operator on vector pixel type - inline TOutput operator ()(const InputVectorType& inputVector) const - { - return this->Evaluate(inputVector[m_Index1 - 1], static_cast<TInput2>(inputVector[m_Index2 - 1])); - } - - // Binary operator - inline TOutput operator ()(const TInput1& id1, const TInput2& id2) const - { - return this->Evaluate(id1, id2); - } - /// Constructor - WaterIndexBase() {} - /// Desctructor - virtual ~WaterIndexBase() {} - - /// Set Index 1 - void SetIndex1(unsigned int channel) - { - m_Index1 = channel; - } - /// Get Index 1 - unsigned int GetIndex1() const - { - return m_Index1; - } - /// Set Index 2 - void SetIndex2(unsigned int channel) - { - m_Index2 = channel; - } - /// Get Index 2 - unsigned int GetIndex2() const - { - return m_Index2; - } - - /** Return the index name */ - virtual std::string GetName() const = 0; - -protected: - // This method must be reimplemented in subclasses to actually - // compute the index value - virtual TOutput Evaluate(const TInput1& id1, const TInput2& id2) const = 0; - -private: - unsigned int m_Index1; - unsigned int m_Index2; -}; - -/** \class WaterIndexFunctor - * \brief This functor will be used for most of water index functors. - * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInput1, class TInput2, class TOutput> -class WaterIndexFunctor : public WaterIndexBase<TInput1, TInput2, TOutput> -{ -public: - /** Return the index name */ - std::string GetName() const override - { - return "WaterIndexFunctor"; - } - - WaterIndexFunctor() {} - ~WaterIndexFunctor() override {} -protected: - inline TOutput Evaluate(const TInput1& id1, const TInput2& id2) const override - { - double dindex1 = static_cast<double>(id1); - double dindex2 = static_cast<double>(id2); - double ddenom = dindex1 + dindex2; - if (ddenom == 0) - { - return static_cast<TOutput>(0.); - } - return (static_cast<TOutput>((dindex1 - dindex2) / ddenom)); - } -}; - -/** \class SRWI - * \brief This functor computes the Simple Ratio Water Index (SRWI) - * \brief For MODIS bands 860 & 1240 - * - * [Zarco-Tejada 2001] - * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInput1, class TInput2, class TOutput> -class SRWI : public WaterIndexBase<TInput1, TInput2, TOutput> -{ -public: - /** Return the index name */ - virtual std::string GetName() const - { - return "SRWI"; - } - - SRWI() {} - virtual ~SRWI() {} -protected: - inline TOutput Evaluate(const TInput1& rho860, const TInput2& rho1240) const - { - double drho860 = static_cast<double>(rho860); - double drho1240 = static_cast<double>(rho1240); - if (drho1240 == 0) - { - return static_cast<TOutput>(0.); - } - return (static_cast<TOutput>(drho860 / drho1240)); - } -}; - /** \class NDWI * \brief This functor computes the Normalized Difference Water Index (NDWI) * \brief Also called : @@ -198,79 +42,26 @@ protected: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class NDWI : public WaterIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class NDWI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + NDWI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::NIR, CommonBandNames::MIR}) { - return "NDWI"; } - typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType; - /// Constructor - NDWI() {} - /// Desctructor - ~NDWI() override {} - WIFunctorType GetWIFunctor(void) const - { - return (m_WIFunctor); - } - /// Set Index NIR - void SetNIRIndex(unsigned int channel) - { - this->SetIndex1(channel); - } - /// Get Index NIR - unsigned int GetNIRIndex() const - { - return this->GetIndex1(); - } - /// Set Index MIR - void SetMIRIndex(unsigned int channel) - { - this->SetIndex2(channel); - } - /// Get Index MIR - unsigned int GetMIRIndex() const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return this->GetIndex2(); - } + auto mir = this->Value(CommonBandNames::MIR, input); + auto nir = this->Value(CommonBandNames::NIR, input); - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::NIR) - { - this->SetIndex1(channel); - } - if (band == BandName::MIR) - { - this->SetIndex2(channel); - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::NIR) - { - return this->GetIndex1(); + if (std::abs(nir + mir) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + return 0.; } - if (band == BandName::MIR) - { - return this->GetIndex2(); - } - } -protected: - inline TOutput Evaluate(const TInput1& nir, const TInput2& mir) const override - { - return (static_cast<TOutput>(GetWIFunctor() (nir, mir))); + return (nir - mir) / (nir + mir); } -private: - // Water Index Classic Functor - WIFunctorType m_WIFunctor; }; /** \class NDWI2 @@ -283,79 +74,26 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class NDWI2 : public WaterIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class NDWI2 : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - std::string GetName() const override + NDWI2() : RadiometricIndex<TInput, TOutput>({CommonBandNames::NIR, CommonBandNames::GREEN}) { - return "NDWI2"; } - typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType; - /// Constructor - NDWI2() {} - /// Desctructor - ~NDWI2() override {} - WIFunctorType GetWIFunctor(void) const - { - return (m_WIFunctor); - } - /// Set Index G - void SetGIndex(unsigned int channel) - { - this->SetIndex1(channel); - } - /// Get Index G - unsigned int GetGIndex() const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return this->GetIndex1(); - } - /// Set Index NIR - void SetNIRIndex(unsigned int channel) - { - this->SetIndex2(channel); - } - /// Get Index NIR - unsigned int GetNIRIndex() const - { - return this->GetIndex2(); - } + auto green = this->Value(CommonBandNames::GREEN, input); + auto nir = this->Value(CommonBandNames::NIR, input); - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::GREEN) - { - this->SetIndex1(channel); - } - if (band == BandName::NIR) - { - this->SetIndex2(channel); + if (std::abs(nir + green) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + return 0.; } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::GREEN) - { - return this->GetIndex1(); - } - if (band == BandName::NIR) - { - return this->GetIndex2(); - } - } -protected: - inline TOutput Evaluate(const TInput1& g, const TInput2& nir) const override - { - return (static_cast<TOutput>(GetWIFunctor() (g, nir))); + return (green - nir) / (green + nir); } -private: - // Water Index Classic Functor - WIFunctorType m_WIFunctor; }; /** \class MNDWI @@ -363,88 +101,7 @@ private: * * [Xu & al., 2006 ] * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInput1, class TInput2, class TOutput> -class MNDWI : public WaterIndexBase<TInput1, TInput2, TOutput> -{ -public: - /** Return the index name */ - virtual std::string GetName() const - { - return "MNDWI"; - } - - typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType; - /// Constructor - MNDWI() {} - /// Desctructor - virtual ~MNDWI() {} - WIFunctorType GetWIFunctor(void) const - { - return (m_WIFunctor); - } - /// Set Index G - void SetGIndex(unsigned int channel) - { - this->SetIndex1(channel); - } - /// Get Index G - unsigned int GetGIndex() const - { - return this->GetIndex1(); - } - /// Set Index MIR - void SetMIRIndex(unsigned int channel) - { - this->SetIndex2(channel); - } - /// Get Index MIR - unsigned int GetMIRIndex() const - { - return this->GetIndex2(); - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::GREEN) - { - this->SetIndex1(channel); - } - if (band == BandName::MIR) - { - this->SetIndex2(channel); - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::GREEN) - { - return this->GetIndex1(); - } - if (band == BandName::MIR) - { - return this->GetIndex2(); - } - } - -protected: - inline TOutput Evaluate(const TInput1& g, const TInput2& mir) const - { - return (static_cast<TOutput>(GetWIFunctor() (g, mir))); - } -private: - // Water Index Classic Functor - WIFunctorType m_WIFunctor; -}; - -/** \class NDPI - * \brief This functor computes the Normalized Difference Pond Index (NDPI) + * Similar to Normalized Difference Pond Index (NDPI) * * [J.P Lacaux & al., 2006 ] * @@ -453,79 +110,26 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class NDPI : public WaterIndexBase<TInput1, TInput2, TOutput> +template <class TInput, class TOutput> +class MNDWI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - virtual std::string GetName() const + MNDWI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::MIR, CommonBandNames::GREEN}) { - return "NDPI"; } - typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType; - /// Constructor - NDPI() {} - /// Desctructor - virtual ~NDPI() {} - WIFunctorType GetWIFunctor(void) const - { - return (m_WIFunctor); - } - /// Set Index MIR - void SetMIRIndex(unsigned int channel) - { - this->SetIndex1(channel); - } - /// Get Index MIR - unsigned int GetMIRIndex() const - { - return this->GetIndex1(); - } - /// Set Index G - void SetGIndex(unsigned int channel) - { - this->SetIndex2(channel); - } - /// Get Index G - unsigned int GetGIndex() const + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - return this->GetIndex2(); - } + auto green = this->Value(CommonBandNames::GREEN, input); + auto mir = this->Value(CommonBandNames::MIR, input); - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::MIR) - { - this->SetIndex1(channel); - } - if (band == BandName::GREEN) - { - this->SetIndex2(channel); - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::MIR) - { - return this->GetIndex1(); - } - if (band == BandName::GREEN) - { - return this->GetIndex2(); + if (std::abs(mir + green) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + return 0.; } - } -protected: - inline TOutput Evaluate(const TInput1& mir, const TInput2& g) const - { - return (static_cast<TOutput>(GetWIFunctor() (mir, g))); + return (green - mir) / (green + mir); } -private: - // Water Index Classic Functor - WIFunctorType m_WIFunctor; }; /** \class NDTI @@ -538,221 +142,26 @@ private: * * \ingroup OTBIndices */ -template <class TInput1, class TInput2, class TOutput> -class NDTI : public WaterIndexBase<TInput1, TInput2, TOutput> -{ -public: - /** Return the index name */ - virtual std::string GetName() const - { - return "NDTI"; - } - - typedef WaterIndexFunctor<TInput1, TInput2, TOutput> WIFunctorType; - /// Constructor - NDTI() {} - /// Desctructor - virtual ~NDTI() {} - WIFunctorType GetWIFunctor(void) const - { - return (m_WIFunctor); - } - // FIXME why now using Red and Green fully spelled as everywhere - //else ??? - /// Set Index R - void SetRIndex(unsigned int channel) - { - this->SetIndex1(channel); - } - /// Get Index R - unsigned int GetRIndex() const - { - return this->GetIndex1(); - } - /// Set Index G - void SetGIndex(unsigned int channel) - { - this->SetIndex2(channel); - } - /// Get Index G - unsigned int GetGIndex() const - { - return this->GetIndex2(); - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - this->SetIndex1(channel); - } - if (band == BandName::GREEN) - { - this->SetIndex2(channel); - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return this->GetIndex1(); - } - if (band == BandName::GREEN) - { - return this->GetIndex2(); - } - } - -protected: - inline TOutput Evaluate(const TInput1& r, const TInput2& g) const - { - return (static_cast<TOutput>(GetWIFunctor() (r, g))); - } -private: - // Water Index Classic Functor - WIFunctorType m_WIFunctor; -}; - -/** \class WaterSqrtSpectralAngleFunctor - * \brief This functor uses a spectral angle with a particular reference pixel. - * - * - * \ingroup Functor - * \ingroup Radiometry - * - * \ingroup OTBIndices - */ -template <class TInputVectorPixel, class TOutputPixel> -class WaterSqrtSpectralAngleFunctor : public SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> +template <class TInput, class TOutput> +class NDTI : public RadiometricIndex<TInput, TOutput> { public: - /** Return the index name */ - virtual std::string GetName() const + NDTI() : RadiometricIndex<TInput, TOutput>({CommonBandNames::RED, CommonBandNames::GREEN}) { - return "WaterSqrtSpectralAngleFunctor"; - } - typedef WaterSqrtSpectralAngleFunctor Self; - typedef SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> Superclass; - typedef TInputVectorPixel InputVectorPixelType; - WaterSqrtSpectralAngleFunctor() - { - - //Set the channels indices - m_BlueIndex = 0; - m_GreenIndex = 1; - m_RedIndex = 2; - m_NIRIndex = 3; - - //Set reference water value - InputVectorPixelType reference; - reference.SetSize(4); - reference[0] = 136.0; reference[1] = 132.0; reference[2] = 47.0; reference[3] = 24.0; - this->SetReferenceWaterPixel(reference); } - ~WaterSqrtSpectralAngleFunctor() override {} - /** Set Reference Pixel */ - void SetReferenceWaterPixel(InputVectorPixelType ref) + TOutput operator()(const itk::VariableLengthVector<TInput>& input) const override { - if (ref.GetSize() != 4) - { - } - InputVectorPixelType reference; - reference.SetSize(4); - reference[m_BlueIndex] = ref[0]; reference[m_GreenIndex] = ref[1]; reference[m_RedIndex] = ref[2]; - reference[m_NIRIndex] = ref[3]; - this->SetReferencePixel(reference); - - } + auto green = this->Value(CommonBandNames::GREEN, input); + auto red = this->Value(CommonBandNames::RED, input); - /** Getters and setters */ - void SetBlueChannel(unsigned int channel) - { - m_BlueIndex = channel; - } - unsigned int GetBlueChannel() const - { - return m_BlueIndex; - } - void SetGreenChannel(unsigned int channel) - { - m_GreenIndex = channel; - } - unsigned int GetGreenChannel() const - { - return m_GreenIndex; - } - void SetRedChannel(unsigned int channel) - { - m_RedIndex = channel; - } - unsigned int GetRedChannel() const - { - return m_RedIndex; - } - void SetNIRChannel(unsigned int channel) - { - m_NIRIndex = channel; - } - unsigned int GetNIRChannel() const - { - return m_NIRIndex; - } - - /** Set index, generic method */ - void SetIndex(BandName::BandName band, unsigned int channel) - { - if (band == BandName::RED) - { - m_RedIndex = channel; - } - if (band == BandName::GREEN) - { - m_GreenIndex = channel; - } - if (band == BandName::BLUE) - { - m_BlueIndex = channel; - } - if (band == BandName::NIR) - { - m_NIRIndex = channel; - } - } - /** Get index, generic method */ - unsigned int GetIndex(BandName::BandName band) const - { - if (band == BandName::RED) - { - return m_RedIndex; + if (std::abs(red + green) < RadiometricIndex<TInput, TOutput>::Epsilon) + { + return 0.; } - if (band == BandName::GREEN) - { - return m_GreenIndex; - } - if (band == BandName::BLUE) - { - return m_BlueIndex; - } - if (band == BandName::NIR) - { - return m_NIRIndex; - } - } -protected: - inline TOutputPixel Evaluate(const TInputVectorPixel& inPix) const override - { - return static_cast<TOutputPixel>(Superclass::Evaluate(inPix)); + return (red - green) / (green + red); } - - /** Channels */ - int m_BlueIndex; - int m_GreenIndex; - int m_RedIndex; - int m_NIRIndex; }; } // namespace Functor diff --git a/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h b/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h index 0ac02c7d6fec990ecbf17b7f981dad2e00603300..adbe0dee543242d0156ac2aafb22444f32b52c60 100644 --- a/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h +++ b/Modules/Radiometry/Indices/include/otbWaterSqrtSpectralAngleImageFilter.h @@ -21,12 +21,116 @@ #ifndef otbWaterSqrtSpectralAngleImageFilter_h #define otbWaterSqrtSpectralAngleImageFilter_h -#include "otbWaterIndicesFunctor.h" +#include "otbSqrtSpectralAngleFunctor.h" #include "itkUnaryFunctorImageFilter.h" namespace otb { +namespace Functor +{ +/** \class WaterSqrtSpectralAngleFunctor + * \brief This functor uses a spectral angle with a particular reference pixel. + * + * + * \ingroup Functor + * \ingroup Radiometry + * + * \ingroup OTBIndices + */ +template <class TInputVectorPixel, class TOutputPixel> +class WaterSqrtSpectralAngleFunctor : public SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> +{ +public: + typedef WaterSqrtSpectralAngleFunctor Self; + typedef SqrtSpectralAngleFunctor<TInputVectorPixel, TOutputPixel> Superclass; + typedef TInputVectorPixel InputVectorPixelType; + WaterSqrtSpectralAngleFunctor() + { + + // Set the channels indices + m_BlueIndex = 0; + m_GreenIndex = 1; + m_RedIndex = 2; + m_NIRIndex = 3; + + // Set reference water value + InputVectorPixelType reference; + reference.SetSize(4); + reference[0] = 136.0; + reference[1] = 132.0; + reference[2] = 47.0; + reference[3] = 24.0; + this->SetReferenceWaterPixel(reference); + } + ~WaterSqrtSpectralAngleFunctor() override + { + } + + /** Set Reference Pixel */ + void SetReferenceWaterPixel(InputVectorPixelType ref) + { + if (ref.GetSize() != 4) + { + } + InputVectorPixelType reference; + reference.SetSize(4); + reference[m_BlueIndex] = ref[0]; + reference[m_GreenIndex] = ref[1]; + reference[m_RedIndex] = ref[2]; + reference[m_NIRIndex] = ref[3]; + this->SetReferencePixel(reference); + } + + /** Getters and setters */ + void SetBlueChannel(unsigned int channel) + { + m_BlueIndex = channel; + } + unsigned int GetBlueChannel() const + { + return m_BlueIndex; + } + void SetGreenChannel(unsigned int channel) + { + m_GreenIndex = channel; + } + unsigned int GetGreenChannel() const + { + return m_GreenIndex; + } + void SetRedChannel(unsigned int channel) + { + m_RedIndex = channel; + } + unsigned int GetRedChannel() const + { + return m_RedIndex; + } + void SetNIRChannel(unsigned int channel) + { + m_NIRIndex = channel; + } + unsigned int GetNIRChannel() const + { + return m_NIRIndex; + } + +protected: + inline TOutputPixel Evaluate(const TInputVectorPixel& inPix) const override + { + return static_cast<TOutputPixel>(Superclass::Evaluate(inPix)); + } + + /** Channels */ + int m_BlueIndex; + int m_GreenIndex; + int m_RedIndex; + int m_NIRIndex; +}; +} // End namespace Functor + + /** \class WaterSqrtSpectralAngleImageFilter * \brief Compute a radiometric water indice * @@ -46,7 +150,6 @@ namespace otb * * \ingroup OTBIndices */ - template <class TInputVectorImage, class TOutputImage, class TFunction = Functor::WaterSqrtSpectralAngleFunctor < typename TInputVectorImage::PixelType, diff --git a/Modules/Radiometry/Indices/test/CMakeLists.txt b/Modules/Radiometry/Indices/test/CMakeLists.txt index 3e5c8354670345f66bd113cf0c312d76dbcc88c9..1424624291fd33d8f96baac6b64d02de0418e5e8 100644 --- a/Modules/Radiometry/Indices/test/CMakeLists.txt +++ b/Modules/Radiometry/Indices/test/CMakeLists.txt @@ -22,13 +22,11 @@ otb_module_test() set(OTBIndicesTests otbIndicesTestDriver.cxx -otbNDVIDataNodeFeatureFunction.cxx +otbRadiometricIndicesTest.cxx otbLandsatTMIndexNDSITest.cxx otbLandsatTMIndexBIOTest.cxx -otbLAIFromReflectancesLinearFunctorTest.cxx otbLandsatTMIndexMIR2Test.cxx otbLandsatTMIndexNDVITest.cxx -otbLAIFromNDVILogarithmicFunctorTest.cxx otbLandsatTMIndexVisTest.cxx otbWaterSqrtSpectralAngleImageFilter.cxx otbLandsatTMIndexBrightTest.cxx @@ -53,31 +51,6 @@ otb_module_target_label(otbIndicesTestDriver) # Tests Declaration -otb_add_test(NAME bfTvNDVIDataNodeFeatureFunction_Polygon COMMAND otbIndicesTestDriver - --compare-ogr ${EPSILON_3} - ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp - ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp - otbNDVIDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_BUILDINGS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Polygon.shp - 0 - ) - -otb_add_test(NAME bfTvNDVIDataNodeFeatureFunction_Line COMMAND otbIndicesTestDriver - --compare-ogr ${EPSILON_9} - ${BASELINE_FILES}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp - ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp - otbNDVIDataNodeFeatureFunction - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE_ROADS.shp - ${INPUTDATA}/Dempster-Shafer/ROI_QB_TOULOUSE.TIF - ${INPUTDATA}/DEM/srtm_directory - ${TEMP}/bfTvNDVIDataNodeFeatureFunctionOutput_Line.shp - 0 - ) - - otb_add_test(NAME raTvLandsatTMIndexNDSITest COMMAND otbIndicesTestDriver otbLandsatTMIndexNDSI 3 #TM1 @@ -102,14 +75,6 @@ otb_add_test(NAME raTvLandsatTMIndexBIOTest COMMAND otbIndicesTestDriver 21 #TM7 ) -otb_add_test(NAME raTvLAIFromReflectancesLinearFunctorTest COMMAND otbIndicesTestDriver - otbLAIFromReflectancesLinear - 3 # red - 4 # nir - -18 # red coef - 13 # nir coef - ) - otb_add_test(NAME raTvLandsatTMIndexMIR2Test COMMAND otbIndicesTestDriver otbLandsatTMIndexMIR2 3 #TM1 @@ -134,16 +99,6 @@ otb_add_test(NAME raTvLandsatTMIndexNDVITest COMMAND otbIndicesTestDriver 21 #TM7 ) - -otb_add_test(NAME raTvLAIFromNDVILogarithmicFunctorTest COMMAND otbIndicesTestDriver - otbLAIFromNDVILogarithmic - 3 # red - 4 # nir - 0.12 # ndvi soil - 0.91 # ndvi infinity - 0.70 # extinction coefficient - ) - otb_add_test(NAME raTvLandsatTMIndexVisTest COMMAND otbIndicesTestDriver otbLandsatTMIndexVis 3 #TM1 @@ -340,3 +295,21 @@ otb_add_test(NAME raTvLandsatTMThickCloudTest COMMAND otbIndicesTestDriver ${TEMP}/raTvLandsatTMThickCloudTest_cloudImage.tif ) + +otb_add_test(NAME raTvRadiometricIndexBaseClassTest COMMAND otbIndicesTestDriver + otbRadiometricIndexTest) + +otb_add_test(NAME raTvVegetationIndicesTest COMMAND otbIndicesTestDriver + otbVegetationIndicesTest) + +otb_add_test(NAME raTvWaterIndicesTest COMMAND otbIndicesTestDriver + otbWaterIndicesTest) + +otb_add_test(NAME raTvBuiltUpIndicesTest COMMAND otbIndicesTestDriver + otbBuiltUpIndicesTest) + +otb_add_test(NAME raTvSoilIndicesTest COMMAND otbIndicesTestDriver + otbSoilIndicesTest) + +otb_add_test(NAME raTvIndicesStackFunctorTest COMMAND otbIndicesTestDriver + otbIndicesStackFunctorTest) diff --git a/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx b/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx index d0b41d61e7d623c2690731cbc478ddb24253cdb8..111d5c05d0978f86930a277975e37ebd58393533 100644 --- a/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx +++ b/Modules/Radiometry/Indices/test/otbIndicesTestDriver.cxx @@ -22,13 +22,10 @@ void RegisterTests() { - REGISTER_TEST(otbNDVIDataNodeFeatureFunction); REGISTER_TEST(otbLandsatTMIndexNDSI); REGISTER_TEST(otbLandsatTMIndexBIO); - REGISTER_TEST(otbLAIFromReflectancesLinear); REGISTER_TEST(otbLandsatTMIndexMIR2); REGISTER_TEST(otbLandsatTMIndexNDVI); - REGISTER_TEST(otbLAIFromNDVILogarithmic); REGISTER_TEST(otbLandsatTMIndexVis); REGISTER_TEST(otbWaterSqrtSpectralAngleImageFilter); REGISTER_TEST(otbLandsatTMIndexBright); @@ -46,4 +43,10 @@ void RegisterTests() REGISTER_TEST(otbLandsatTMKernelSpectralRulesWithImage); REGISTER_TEST(otbLandsatTMIndexNDBSI); REGISTER_TEST(otbLandsatTMThickCloudTest); + REGISTER_TEST(otbVegetationIndicesTest); + REGISTER_TEST(otbWaterIndicesTest); + REGISTER_TEST(otbBuiltUpIndicesTest); + REGISTER_TEST(otbSoilIndicesTest); + REGISTER_TEST(otbRadiometricIndexTest); + REGISTER_TEST(otbIndicesStackFunctorTest); } diff --git a/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx b/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx deleted file mode 100644 index 09a2f5ff71f4393797077b67c485e3b3777e5a45..0000000000000000000000000000000000000000 --- a/Modules/Radiometry/Indices/test/otbLAIFromNDVILogarithmicFunctorTest.cxx +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbVegetationIndicesFunctor.h" - -int otbLAIFromNDVILogarithmic(int itkNotUsed(argc), char * argv[]) -{ - typedef double PixelType; - - typedef otb::Functor::LAIFromNDVILogarithmic<PixelType, PixelType, PixelType> FunctorType; - - FunctorType laiFunct = FunctorType(); - - double redValue = (::atof(argv[1])); - double nirValue = (::atof(argv[2])); - double ndviSoil(::atof(argv[3])); - double ndviInf(::atof(argv[4])); - double extCoef(::atof(argv[5])); - - double ndvi = (nirValue-redValue)/(nirValue+redValue); - double goodResult = -1/extCoef*std::log((ndvi-ndviInf)/(ndviSoil-ndviInf)); - - laiFunct.SetNdviInf(ndviInf); - laiFunct.SetNdviSoil(ndviSoil); - laiFunct.SetExtinctionCoefficient(extCoef); - - laiFunct.SetRedIndex(1); - laiFunct.SetNIRIndex(2); - - itk::VariableLengthVector<PixelType> pixel; - pixel.Reserve(2); - pixel[0] = redValue; - pixel[1] = nirValue; - - double result = laiFunct(pixel); - - if( result!=goodResult ) return EXIT_FAILURE; - - return EXIT_SUCCESS; -} diff --git a/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx b/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx deleted file mode 100644 index 388b36a054b9054d3b362c29e148ee2bbd01e81f..0000000000000000000000000000000000000000 --- a/Modules/Radiometry/Indices/test/otbLAIFromReflectancesLinearFunctorTest.cxx +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "otbVegetationIndicesFunctor.h" - -int otbLAIFromReflectancesLinear(int itkNotUsed(argc), char * argv[]) -{ - typedef double PixelType; - - typedef otb::Functor::LAIFromReflectancesLinear<PixelType, PixelType, PixelType> FunctorType; - - FunctorType laiFunct = FunctorType(); - - double redValue = (::atof(argv[1])); - double nirValue = (::atof(argv[2])); - double redCoef(::atof(argv[3])); - double nirCoef(::atof(argv[4])); - - double goodResult = redCoef*redValue+nirCoef*nirValue; - - laiFunct.SetRedCoef(redCoef); - laiFunct.SetNirCoef(nirCoef); - - laiFunct.SetRedIndex(1); - laiFunct.SetNIRIndex(2); - - itk::VariableLengthVector<PixelType> pixel; - pixel.Reserve(2); - pixel[0] = redValue; - pixel[1] = nirValue; - - double result = laiFunct(pixel); - - if( result!=goodResult ) return EXIT_FAILURE; - - return EXIT_SUCCESS; -} diff --git a/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx b/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx deleted file mode 100644 index 18289e76d7a4468aa04fa1057adca4764c42013c..0000000000000000000000000000000000000000 --- a/Modules/Radiometry/Indices/test/otbNDVIDataNodeFeatureFunction.cxx +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - - -#include "otbNDVIDataNodeFeatureFunction.h" - -#include "otbVectorImage.h" -#include "otbImageFileReader.h" -#include "otbVectorData.h" -#include "otbVectorDataFileReader.h" -#include "otbVectorDataIntoImageProjectionFilter.h" -#include "otbVectorDataFileWriter.h" -#include "itkPreOrderTreeIterator.h" - - -int otbNDVIDataNodeFeatureFunction(int itkNotUsed(argc), char* argv[]) -{ - const char * inputVD = argv[1]; - const char * inputImg = argv[2]; - const char * DEMDir = argv[3]; - const char * outputVD = argv[4]; - int DisplayWarnings = atoi(argv[5]); - - typedef double CoordRepType; - typedef double PrecisionType; - typedef otb::VectorImage<PrecisionType> ImageType; - typedef otb::ImageFileReader<ImageType> ImageReaderType; - typedef otb::VectorData<CoordRepType, 2, PrecisionType> - VectorDataType; - typedef VectorDataType::DataNodeType DataNodeType; - typedef otb::VectorDataFileReader<VectorDataType> VectorDataReaderType; - typedef otb::VectorDataIntoImageProjectionFilter<VectorDataType, ImageType> - VectorDataReProjFilter; - typedef otb::VectorDataFileWriter<VectorDataType> VectorDataWriterType; - typedef itk::PreOrderTreeIterator<VectorDataType::DataTreeType> - TreeIteratorType; - - typedef otb::NDVIDataNodeFeatureFunction<ImageType, CoordRepType, PrecisionType> - NDVIDataNodeFeaturefunctionType; - typedef NDVIDataNodeFeaturefunctionType::OutputType - NDVIFeatureOutputType; - - ImageReaderType::Pointer imgReader = ImageReaderType::New(); - VectorDataReaderType::Pointer vdReader = VectorDataReaderType::New(); - VectorDataReProjFilter::Pointer vdReProjFilter = VectorDataReProjFilter::New(); - VectorDataWriterType::Pointer vdWriter = VectorDataWriterType::New(); - NDVIDataNodeFeaturefunctionType::Pointer NDVIFeatureFunction = NDVIDataNodeFeaturefunctionType::New(); - - if (!DisplayWarnings) - { - imgReader->SetGlobalWarningDisplay(0); - } - - otb::DEMHandler::Instance()->OpenDEMDirectory(DEMDir); - - vdReader->SetFileName(inputVD); - vdReader->Update(); - - imgReader->SetFileName(inputImg); - imgReader->UpdateOutputInformation(); - imgReader->Update(); //Needed to set m_EndIndex, m_StartIndex in otbDataNodeImageFunction - - vdReProjFilter->SetInputImage(imgReader->GetOutput()); - vdReProjFilter->SetInputVectorData(vdReader->GetOutput()); - vdReProjFilter->SetUseOutputSpacingAndOriginFromImage(true); - vdReProjFilter->Update(); -/* - std::cout<< "vdReProjFilter->GetOutput()->Size(): " - << vdReProjFilter->GetOutput()->Size() << std::endl; -*/ - NDVIFeatureFunction->SetREDChannelIndex(3); - NDVIFeatureFunction->SetNIRChannelIndex(4); - NDVIFeatureFunction->SetNDVIThreshold(0.047); - NDVIFeatureFunction->SetInputImage(imgReader->GetOutput()); - - // Output - VectorDataType::Pointer outVD = VectorDataType::New(); - // Retrieving root node - DataNodeType::Pointer root = outVD->GetDataTree()->GetRoot()->Get(); - // Create the document node - DataNodeType::Pointer document = DataNodeType::New(); - document->SetNodeType(otb::DOCUMENT); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(document, root); - // Create the folder node - DataNodeType::Pointer folder = DataNodeType::New(); - folder->SetNodeType(otb::FOLDER); - // Adding the layer to the data tree - outVD->GetDataTree()->Add(folder, document); - - TreeIteratorType itVector(vdReProjFilter->GetOutput()->GetDataTree()); - itVector.GoToBegin(); - while (!itVector.IsAtEnd()) - { - if (itVector.Get()->IsLineFeature() || itVector.Get()->IsPolygonFeature()) - { - const DataNodeType::Pointer currentGeometry = itVector.Get(); - NDVIFeatureOutputType currentResult; - currentResult = NDVIFeatureFunction->Evaluate(*(currentGeometry.GetPointer())); - currentGeometry->SetFieldAsDouble("NDVI", (double)(currentResult[0])); - outVD->GetDataTree()->Add(currentGeometry, folder); - } - ++itVector; - } - - vdWriter->SetInput(outVD); - vdWriter->SetFileName(outputVD); - vdWriter->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx b/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx new file mode 100644 index 0000000000000000000000000000000000000000..58f76ed98817ba7a2f33e291eb85f31a6e5edccd --- /dev/null +++ b/Modules/Radiometry/Indices/test/otbRadiometricIndicesTest.cxx @@ -0,0 +1,279 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "otbVegetationIndicesFunctor.h" +#include "otbWaterIndicesFunctor.h" +#include "otbBuiltUpIndicesFunctor.h" +#include "otbSoilIndicesFunctor.h" +#include "otbIndicesStackFunctor.h" + +#include <iomanip> + +template <typename T> +itk::VariableLengthVector<T> build_pixel(const std::initializer_list<T>& il) +{ + itk::VariableLengthVector<T> res(il.size()); + size_t idx = 0; + + for (auto v : il) + { + res[idx] = v; + ++idx; + } + return res; +} + +template <class TIndice> +bool CheckResult(const std::string& testName, std::map<typename TIndice::BandNameType, size_t> bandMap, + const std::initializer_list<typename TIndice::InputType>& input, const typename TIndice::OutputType& expected) +{ + TIndice indice; + + indice.SetBandsIndices(bandMap); + + auto pixel = build_pixel(input); + + typename TIndice::OutputType v = indice(pixel); + + if (std::abs(expected - v) > TIndice::Epsilon) + { + std::cerr << std::setprecision(10); + std::cerr << testName << "\t- failed: expected " << expected << ", got " << v << std::endl; + return false; + } + else + { + return true; + } +} + + +using namespace otb::Functor; + +int otbVegetationIndicesTest(int, char ** const) +{ + + const std::map<CommonBandNames, size_t> bandMap = { + {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}}; + + // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result) + bool res = CheckResult<NDVI<int, double>>("ndvi_null ", bandMap, {0, 0, 0, 0}, 0.); + res = res & CheckResult<NDVI<int, double>>("ndvi_pixel", bandMap, {0, 0, 1, 2}, 0.3333333); + res = res & CheckResult<RVI<int, double>>("rvi_null", bandMap, {0, 0, 0, 0}, 0.); + res = res & CheckResult<RVI<int, double>>("rvi_pixel", bandMap, {0, 0, 2, 1}, 0.5); + res = res & CheckResult<PVI<int, double>>("pvi_pixel", bandMap, {0, 0, 1, 2}, -62.0544166); + res = res & CheckResult<SAVI<double, double>>("savi_null", bandMap, {0, 0, 0, -0.5}, 0.); + res = res & CheckResult<SAVI<int, double>>("savi_pixel", bandMap, {0, 0, 1, 2}, 0.42857142857); + res = res & CheckResult<TSAVI<double, double>>("tsavi_null", bandMap, {0, 0, -0.1192, 0.}, 0.); + res = res & CheckResult<TSAVI<int, double>>("tsavi_pixel", bandMap, {0, 0, 1, 2}, 0.1111463957); + res = res & CheckResult<WDVI<int, double>>("wdvi_pixel", bandMap, {0, 0, 1, 2}, 1.6); + res = res & CheckResult<MSAVI<int, double>>("msavi_pixel", bandMap, {0, 0, 1, 2}, 0.4402985075); + res = res & CheckResult<MSAVI2<int, double>>("msavi2_pixel", bandMap, {0, 0, 1, 2}, 0.4384471872); + res = res & CheckResult<GEMI<int, double>>("gemi_pixel", bandMap, {1, 4, 3, 2}, 2.0625); + res = res & CheckResult<AVI<int, double>>("avi_pixel", bandMap, {0, 0, 1, 2}, 0.1017245527); + res = res & CheckResult<ARVI<int, double>>("arvi_pixel", bandMap, {0, 0, 1, 2}, 0.1428571429); + res = res & CheckResult<EVI<int, double>>("evi_pixel", bandMap, {0, 0, 1, 2}, 0.2777777778); + res = res & CheckResult<IPVI<int, double>>("ipvi_pixel", bandMap, {0, 0, 1, 2}, 0.6666666667); + res = res & CheckResult<LAIFromNDVILogarithmic<int, double>>("lailog_pixel", bandMap, {0, 0, 1, 2}, 0.4930511672); + res = res & CheckResult<LAIFromReflectancesLinear<int, double>>("lailog_pixel", bandMap, {0, 0, 1, 2}, 6.61); + res = res & CheckResult<LAIFromNDVIFormosat2Functor<int, double>>("laifrom_pixel", bandMap, {0, 0, 1, 2}, 0.3120010659); + + if (res) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} + +int otbWaterIndicesTest(int, char ** const) +{ + const std::map<CommonBandNames, size_t> bandMap = { + {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}}; + + // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result) + bool res = CheckResult<NDWI<int, double>>("ndwi_null ", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<NDWI<int, double>>("ndwi_pixel", bandMap, {1, 2, 3, 4, 5}, -0.1111111111); + res = res & CheckResult<NDWI2<int, double>>("ndwi2_null", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<NDWI2<int, double>>("ndwi2_pixel", bandMap, {1, 2, 3, 4, 5}, -0.3333333333); + res = res & CheckResult<MNDWI<int, double>>("mndwi_null", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<MNDWI<int, double>>("mndwi_pixel", bandMap, {1, 2, 3, 4, 5}, -0.4285714286); + res = res & CheckResult<NDTI<int, double>>("ndti_null", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<NDTI<int, double>>("ndti_pixel", bandMap, {1, 2, 3, 4, 5}, 0.2); + + if (res) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} + +int otbSoilIndicesTest(int, char ** const) +{ + const std::map<CommonBandNames, size_t> bandMap = { + {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}}; + + // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result) + bool res = CheckResult<CI<int, double>>("ci_null ", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<CI<int, double>>("ci_pixel", bandMap, {1, 2, 3, 4, 5}, 0.2); + res = res & CheckResult<BI<int, double>>("bi_pixel", bandMap, {1, 2, 3, 4, 5}, 2.549509757); + res = res & CheckResult<BI2<int, double>>("bi2_pixel", bandMap, {1, 2, 3, 4, 5}, 3.109126351); + + if (res) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} + +int otbBuiltUpIndicesTest(int, char ** const) +{ + const std::map<CommonBandNames, size_t> bandMap = { + {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}}; + + // Syntax: CheckResult<Indice Class>("test_name",bandMap,{red_value,nir_value},expected_result) + bool res = CheckResult<ISU<int, double>>("isu_null", bandMap, {0, 0, 0, 0, 0}, 0.); + res = res & CheckResult<ISU<int, double>>("isu_pixel", bandMap, {1, 2, 3, 4, 5}, 81.25); + + if (res) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} + + +int otbRadiometricIndexTest(int, char ** const) +{ + auto ndvi = NDVI<double, double>(); + + auto requiredBands = ndvi.GetRequiredBands(); + + bool success = true; + + if (requiredBands.size() != 2 || requiredBands.find(CommonBandNames::RED) == requiredBands.end() || + requiredBands.find(CommonBandNames::NIR) == requiredBands.end()) + { + std::cerr << "Required bands is not {RED,NIR} for NDVI" << std::endl; + success = false; + } + + ndvi.SetBandIndex(CommonBandNames::RED, 10); + + if (ndvi.GetBandIndex(CommonBandNames::RED) != 10) + { + std::cerr << "Could not Set/Get band index properly" << std::endl; + success = false; + } + + const std::map<CommonBandNames, size_t> bandMap = {{CommonBandNames::RED, 100}, {CommonBandNames::NIR, 200}}; + + ndvi.SetBandsIndices(bandMap); + + if (ndvi.GetBandIndex(CommonBandNames::RED) != 100 || ndvi.GetBandIndex(CommonBandNames::NIR) != 200) + { + std::cerr << "Could not set all band indices at once with SetBandIndices" << std::endl; + success = false; + } + + try + { + ndvi.SetBandIndex(CommonBandNames::MAX, 1); + std::cerr << "Calling SetBandIndices with ::MAX should raise a runtime_error exception." << std::endl; + success = false; + } + catch (const std::runtime_error& e) + { + } + + if (success) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} + +int otbIndicesStackFunctorTest(int, char ** const) +{ + using IndicesType = RadiometricIndex<double, int>; + using StackFunctorType = IndicesStackFunctor<IndicesType>; + + auto ndvi = NDVI<double, int>(); + auto ndwi = NDWI<double, int>(); + + std::vector<IndicesType*> indices = {&ndvi, &ndwi}; + + auto stack = StackFunctorType(indices); + + bool success = true; + + if (stack.OutputSize() != 2) + { + std::cerr << "Size of output pixel for stack functor should be 2" << std::endl; + success = false; + } + + const std::map<CommonBandNames, size_t> bandMap = { + {CommonBandNames::BLUE, 1}, {CommonBandNames::GREEN, 2}, {CommonBandNames::RED, 3}, {CommonBandNames::NIR, 4}, {CommonBandNames::MIR, 5}}; + + ndvi.SetBandsIndices(bandMap); + ndwi.SetBandsIndices(bandMap); + + StackFunctorType::OutputType out(2); + + auto in = build_pixel<double>({1, 2, 3, 4, 5}); + + stack(out, in); + + if (out[0] != ndvi(in)) + { + std::cerr << "First output band should correspond to ndvi" << std::endl; + success = false; + } + + if (out[1] != ndwi(in)) + { + std::cerr << "Second output band should correspond to ndwi" << std::endl; + success = false; + } + + if (success) + { + return EXIT_SUCCESS; + } + else + { + return EXIT_FAILURE; + } +} diff --git a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h index ec0ef3d8264028aaa656959abc693b19f4eec0ae..ea82717f97b18260a1b5e281937b879903607081 100644 --- a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h +++ b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.h @@ -52,47 +52,46 @@ namespace otb * * \ingroup OTBSimulation */ - template <class TReduceSpectralResponse , class TFunction = Functor::NDVI< typename TReduceSpectralResponse::ValuePrecisionType, typename TReduceSpectralResponse::ValuePrecisionType, - typename TReduceSpectralResponse::ValuePrecisionType > > - class ReduceSpectralResponseClassifierRAndNIR - : public itk::DataObject - { - //friend class - public: - /** Standard class typedefs */ - typedef ReduceSpectralResponseClassifierRAndNIR Self; - typedef itk::DataObject Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Template parameters typedef */ - typedef TReduceSpectralResponse InputReduceSpectralResponseType; - typedef TFunction FunctorType; - typedef typename TReduceSpectralResponse::Pointer InputReduceSpectralResponsePointerType; - typedef typename InputReduceSpectralResponseType::ValuePrecisionType ValuePrecisionType; - - - /** Standard macros */ - itkNewMacro(Self); - itkTypeMacro(ReduceSpectralResponseClassifierRAndNIR, DataObject); - - itkGetConstObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType); - itkSetObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType); - - itkGetConstMacro(RBandNumber, unsigned int); - itkSetMacro(RBandNumber, unsigned int); - - itkGetConstMacro(NIRBandNumber, unsigned int); - itkSetMacro(NIRBandNumber, unsigned int); - - /** Get the functor object. The functor is returned by reference. - * (Functors do not have to derive from itk::LightObject, so they do - * not necessarily have a reference count. So we cannot return a - * SmartPointer.) */ - FunctorType& GetFunctor() - { - return m_Functor; - }; +template <class TReduceSpectralResponse, + class TFunction = Functor::NDVI<typename TReduceSpectralResponse::ValuePrecisionType, typename TReduceSpectralResponse::ValuePrecisionType>> +class ReduceSpectralResponseClassifierRAndNIR : public itk::DataObject +{ + // friend class +public: + /** Standard class typedefs */ + typedef ReduceSpectralResponseClassifierRAndNIR Self; + typedef itk::DataObject Superclass; + typedef itk::SmartPointer<Self> Pointer; + typedef itk::SmartPointer<const Self> ConstPointer; + + /** Template parameters typedef */ + typedef TReduceSpectralResponse InputReduceSpectralResponseType; + typedef TFunction FunctorType; + typedef typename TReduceSpectralResponse::Pointer InputReduceSpectralResponsePointerType; + typedef typename InputReduceSpectralResponseType::ValuePrecisionType ValuePrecisionType; + + + /** Standard macros */ + itkNewMacro(Self); + itkTypeMacro(ReduceSpectralResponseClassifierRAndNIR, DataObject); + + itkGetConstObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType); + itkSetObjectMacro(InputReduceSpectralResponse, InputReduceSpectralResponseType); + + itkGetConstMacro(RBandNumber, unsigned int); + itkSetMacro(RBandNumber, unsigned int); + + itkGetConstMacro(NIRBandNumber, unsigned int); + itkSetMacro(NIRBandNumber, unsigned int); + + /** Get the functor object. The functor is returned by reference. + * (Functors do not have to derive from itk::LightObject, so they do + * not necessarily have a reference count. So we cannot return a + * SmartPointer.) */ + FunctorType& GetFunctor() + { + return m_Functor; + }; /** Set the functor object. This replaces the current Functor with a * copy of the specified Functor. This allows the user to specify a diff --git a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx index 4d97fb2b292b4d8f62359b9497f19f4908de680c..bd43ed41d45b7c073210ead4443c3b1643dc35a2 100644 --- a/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx +++ b/Modules/Radiometry/Simulation/include/otbReduceSpectralResponseClassifierRAndNIR.hxx @@ -50,7 +50,13 @@ namespace otb ReduceSpectralResponseClassifierRAndNIR<TReduceSpectralResponse , TFunction> ::operator()() { - return m_Functor((*m_InputReduceSpectralResponse)(m_RBandNumber), (*m_InputReduceSpectralResponse)(m_NIRBandNumber)); + itk::VariableLengthVector<ValuePrecisionType> sr(2); + sr[0]=(*m_InputReduceSpectralResponse)(m_RBandNumber); + sr[1]=(*m_InputReduceSpectralResponse)(m_NIRBandNumber); + m_Functor.SetBandIndex(CommonBandNames::RED,1); + m_Functor.SetBandIndex(CommonBandNames::NIR,2); + + return m_Functor(sr); } diff --git a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx index 87fda203e2af13b01998c836307f0376f3199b7d..a0e0d61e169419bdc67eabee18589f0353b4f44f 100644 --- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx +++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseClassifierRAndNIR.cxx @@ -45,7 +45,7 @@ int otbReduceSpectralResponseClassifierRAndNIR(int argc, char * argv[]) typedef otb::ReduceSpectralResponse < ResponseType, SatRSRType> ReduceResponseType; typedef ReduceResponseType::Pointer ReduceResponseTypePointerType; - typedef otb::Functor::NDVI<double, double, double > TFunctionType; + typedef otb::Functor::NDVI<double, double> TFunctionType; typedef otb::ReduceSpectralResponseClassifierRAndNIR <ReduceResponseType, TFunctionType> ReduceSpectralResponseClassifierRAndNIRType; typedef ReduceSpectralResponseClassifierRAndNIRType::Pointer ReduceSpectralResponseClassifierRAndNIRPointerType; diff --git a/Modules/Registration/DisplacementField/CMakeLists.txt b/Modules/Registration/DisplacementField/CMakeLists.txt deleted file mode 100644 index a8ad1a8e38bf22af2290f918ff38056abee5ba93..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/CMakeLists.txt +++ /dev/null @@ -1,22 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -project(OTBDisplacementField) -otb_module_impl() diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h deleted file mode 100644 index 1e219346e5c7c37c4a32ea87b7dd0937d75325f1..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.h +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBSplinesInterpolateDisplacementFieldGenerator_h -#define otbBSplinesInterpolateDisplacementFieldGenerator_h - -#include "otbPointSetToDisplacementFieldGenerator.h" - -namespace otb -{ -/** \class BSplinesInterpolateDisplacementFieldGenerator - * \brief This filters encapsulate the itk::DisplacementFieldSource to produce a BSpline interpolation of the point in point set whose metric values are - * sufficient. - * \sa itk::DisplacementFieldSource - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT BSplinesInterpolateDisplacementFieldGenerator - : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef BSplinesInterpolateDisplacementFieldGenerator Self; - typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(BSplinesInterpolateDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::PointType PointType; - typedef typename Superclass::IndexVectorType IndexVectorType; - typedef typename Superclass::DistanceVectorType DistanceVectorType; - -protected: - /** Constructor */ - BSplinesInterpolateDisplacementFieldGenerator() {}; - /** Destructor */ - ~BSplinesInterpolateDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - -private: - BSplinesInterpolateDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbBSplinesInterpolateDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx deleted file mode 100644 index 7b12fa7a1881970099fb35781b039856a397d18c..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBSplinesInterpolateDisplacementFieldGenerator_hxx -#define otbBSplinesInterpolateDisplacementFieldGenerator_hxx - -#include "otbBSplinesInterpolateDisplacementFieldGenerator.h" -// Disabling deprecation warning if on visual -#ifdef _MSC_VER -#pragma warning(push) -#pragma warning(disable:4996) -#endif -#include "itkLandmarkDisplacementFieldSource.h" -// Enabling remaining deprecation warning -#ifdef _MSC_VER -#pragma warning(pop) -#endif -#include "otbMacro.h" -#include "otbImage.h" -#include "itkImageRegionIterator.h" - -namespace otb -{ -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - typedef itk::Vector<ValueType, 2> VectorType; - typedef otb::Image<VectorType, DisplacementFieldType::ImageDimension> ImageType; - typedef itk::LandmarkDisplacementFieldSource<ImageType> DisplacementFieldSourceType; - typedef typename DisplacementFieldSourceType::LandmarkContainer LandmarkContainerType; - typedef typename DisplacementFieldSourceType::LandmarkPointType LandmarkPointType; - typedef typename PointSetType::PointsContainer PointsContainer; - typedef typename PointsContainer::ConstIterator PointsIterator; - typedef typename PointSetType::PointDataContainer PointDataContainer; - typedef typename PointDataContainer::ConstIterator PointDataIterator; - - typename LandmarkContainerType::Pointer sourceLandmarks = LandmarkContainerType::New(); - typename LandmarkContainerType::Pointer targetLandmarks = LandmarkContainerType::New(); - LandmarkPointType sourcePoint; - LandmarkPointType targetPoint; - - PointsIterator pointIterator = this->GetPointSet()->GetPoints()->Begin(); - PointsIterator end = this->GetPointSet()->GetPoints()->End(); - unsigned int pointId = 0; - - PointDataIterator pointDataIterator = this->GetPointSet()->GetPointData()->Begin(); - - while (pointIterator != end) - { - typename PointDataContainer::Element valueAndDisplacements = pointDataIterator.Value(); - - if (std::abs(valueAndDisplacements[0]) >= this->GetMetricThreshold()) - { - typename PointSetType::PointType p = pointIterator.Value(); // access the point - sourcePoint[0] = p[0]; - sourcePoint[1] = p[1]; - targetPoint[0] = p[0] - valueAndDisplacements[1]; - targetPoint[1] = p[1] - valueAndDisplacements[2]; - otbMsgDebugMacro( - << "Adding landmark " << pointId << ", source point: " << sourcePoint << ", targetpoint: " << targetPoint); - sourceLandmarks->InsertElement(pointId, sourcePoint); - targetLandmarks->InsertElement(pointId, targetPoint); - ++pointId; - } - ++pointIterator; - ++pointDataIterator; - } - - typename DisplacementFieldSourceType::Pointer deformer = DisplacementFieldSourceType::New(); - deformer->SetOutputSpacing(this->GetOutputSpacing()); - deformer->SetOutputOrigin(this->GetOutputOrigin()); - deformer->SetOutputRegion(outputPtr->GetRequestedRegion()); - deformer->SetSourceLandmarks(sourceLandmarks.GetPointer()); - deformer->SetTargetLandmarks(targetLandmarks.GetPointer()); - - deformer->Update(); - outputPtr->Allocate(); - PixelType defaultPixel; - defaultPixel.SetSize(2); - defaultPixel.Fill(this->GetDefaultValue()); - outputPtr->FillBuffer(defaultPixel); - typedef itk::ImageRegionIterator<ImageType> ImageIteratorType; - typedef itk::ImageRegionIterator<DisplacementFieldType> OutputIteratorType; - - ImageIteratorType inIt(deformer->GetOutput(), outputPtr->GetRequestedRegion()); - OutputIteratorType outIt(outputPtr, outputPtr->GetRequestedRegion()); - int i = 0; - // Casting otb::Image<itt::Vector<ValueType, 2>, 2> to otb::VectorImage<ValueType, 2> - for (inIt.GoToBegin(), outIt.GoToBegin(); (!inIt.IsAtEnd()) && (!outIt.IsAtEnd()); ++inIt, ++outIt, ++i) - { - typename ImageType::PixelType inPixel; - inPixel = inIt.Get(); - PixelType outPixel; - outPixel.SetSize(2); - outPixel[0] = -inPixel[0]; - outPixel[1] = -inPixel[1]; - outIt.Set(outPixel); - } -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h deleted file mode 100644 index 6528f55931f87ffab35c48cd7c806495ed13caba..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.h +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBSplinesInterpolateTransformDisplacementFieldGenerator_h -#define otbBSplinesInterpolateTransformDisplacementFieldGenerator_h - -#include "otbPointSetWithTransformToDisplacementFieldGenerator.h" -#include "itkUnaryFunctorImageFilter.h" -#include "itkBSplineScatteredDataPointSetToImageFilter.h" -#include "itkBSplineControlPointImageFunction.h" -#include "otbImage.h" -#include "otbMath.h" -#include <complex> - -namespace otb -{ -/** \class BSplinesInterpolateTransformDisplacementFieldGenerator - * \brief This class generate the displacement field by using spline interpolation on the parameters of the transform. - * - * Spline interpolation of non regularly scattered data is provided - * by the itk::BSplineScatteredDataPointSetToImageFilter. It allows interpolation using any spline order and implements a multi-level approach. - * - * This filter is used for each parameter. One can also specify the indices of the angular parameters. Angular parameters are first - * converted to complex exponential, the interpolated and converted back to the angular space. This is done to avoid interpolating angular discontinuities, - * which is a non-sense. - * - * \sa itk::BSplineScatteredDataPointSetToImageFilter - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT BSplinesInterpolateTransformDisplacementFieldGenerator - : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef BSplinesInterpolateTransformDisplacementFieldGenerator Self; - typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(BSplinesInterpolateTransformDisplacementFieldGenerator, PointSetWithTransformsToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::PointType PointType; - typedef typename Superclass::IndexVectorType IndexVectorType; - typedef typename Superclass::DistanceVectorType DistanceVectorType; - typedef typename Superclass::ParametersType ParametersType; - - /** Filters definition */ - typedef itk::Vector<ValueType, 2> PointSetDataType; - typedef otb::Image<PointSetDataType, DisplacementFieldType::ImageDimension> InternalImageType; - typedef itk::PointSet<PointSetDataType, PointSetType::PointDimension> InternalPointSetType; - typedef itk::BSplineScatteredDataPointSetToImageFilter<InternalPointSetType, InternalImageType> - SPlineInterpolateFilterType; - typedef typename SPlineInterpolateFilterType::Pointer SPlineInterpolateFilterPointerType; - typedef itk::BSplineControlPointImageFunction<InternalImageType> BSplinerType; - - /** - * Add an angular parameter. Angular parameters are transformed by complex exponential during interpolation so as to avoid discontinuity. - * \param index The index of the angular parameter. - */ - void AddAngularParameter(unsigned int index); - /** - * Remove an angular parameter. - * \param index The index of the angular parameter. - */ - void RemoveAngularParameter(unsigned int index); - - itkSetMacro(SplineOrder, unsigned int); - itkGetMacro(SplineOrder, unsigned int); - itkSetMacro(NumberOfControlPoints, unsigned int); - itkGetMacro(NumberOfControlPoints, unsigned int); - itkSetMacro(NumberOfLevels, unsigned int); - itkGetMacro(NumberOfLevels, unsigned int); - -protected: - /** Constructor */ - BSplinesInterpolateTransformDisplacementFieldGenerator(); - /** Destructor */ - ~BSplinesInterpolateTransformDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - - void GenerateOutputInformation() override; - - /** - * Test whether a parameter is angular or not. - * \param index The index of the parameter to test. - */ - bool IsAngular(unsigned int index); - -private: - BSplinesInterpolateTransformDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - IndexVectorType m_AngularParameters; - - unsigned int m_SplineOrder; - unsigned int m_NumberOfControlPoints; - unsigned int m_NumberOfLevels; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx deleted file mode 100644 index 6d370825ef6140eead474b2ea98f6cd8f1ae2677..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbBSplinesInterpolateTransformDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbBSplinesInterpolateTransformDisplacementFieldGenerator_hxx -#define otbBSplinesInterpolateTransformDisplacementFieldGenerator_hxx - -#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.h" -#include "itkLandmarkDisplacementFieldSource.h" -#include "otbObjectList.h" -#include "otbMacro.h" - -namespace otb -{ -template <class TPointSet, class TDisplacementField> -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::BSplinesInterpolateTransformDisplacementFieldGenerator() -{ - m_SplineOrder = 3; - m_NumberOfControlPoints = 4; - m_NumberOfLevels = 6; -} - -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateOutputInformation() -{ - Superclass::GenerateOutputInformation(); - this->GetOutput()->SetNumberOfComponentsPerPixel(2); -} - -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - - // Default displacement field - PixelType defaultValue(2); - defaultValue.Fill(this->GetDefaultValue()); - outputPtr->Allocate(); - outputPtr->FillBuffer(defaultValue); - - typedef otb::ObjectList<BSplinerType> SPlineInterpolatorListType; - typedef typename PointSetType::PointsContainer::ConstIterator PointSetIteratorType; - - // Initialization of the splines interpolator - typename SPlineInterpolatorListType::Pointer splineIntList = SPlineInterpolatorListType::New(); - - for (unsigned int paramIndex = 0; paramIndex < this->GetTransform()->GetNumberOfParameters(); ++paramIndex) - { - // Create a new interpolator - splineIntList->PushBack(BSplinerType::New()); - // Create a new point set - typename InternalPointSetType::Pointer tmpPointSet = InternalPointSetType::New(); - tmpPointSet->Initialize(); - unsigned int pointDataCounter = 0; - for (PointSetIteratorType it = this->GetPointSet()->GetPoints()->Begin(); - it != this->GetPointSet()->GetPoints()->End(); - ++it) - { - if (std::abs(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[0]) >= this->GetMetricThreshold()) - { - typename InternalPointSetType::PixelType V(0.0); - - if (!IsAngular(paramIndex)) - { - V[0] = this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex + 3]; - V[1] = this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex + 3]; - } - else - { - V[0] = - static_cast<ValueType>(std::cos(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex - + 3])); - V[1] = - static_cast<ValueType>(std::sin(this->GetPointSet()->GetPointData()->GetElement(pointDataCounter)[paramIndex - + 3])); - } - unsigned long nbPoints = tmpPointSet->GetNumberOfPoints(); - tmpPointSet->SetPoint(nbPoints, it.Value()); - tmpPointSet->SetPointData(nbPoints, V); - } - ++pointDataCounter; - } - - SPlineInterpolateFilterPointerType splineFilter = SPlineInterpolateFilterType::New(); - - // Set the interpolator parameters - splineFilter->SetInput(tmpPointSet); - splineFilter->SetSplineOrder(m_SplineOrder); - typename SPlineInterpolateFilterType::ArrayType ncps; - ncps.Fill(m_NumberOfControlPoints); - splineFilter->SetNumberOfControlPoints(ncps); - splineFilter->SetNumberOfLevels(m_NumberOfLevels); - // splineFilter->SetGenerateOutputImage(false); - - // Define the parametric domain. - splineFilter->SetOrigin(this->GetOutput()->GetOrigin()); - splineFilter->SetSpacing(this->GetOutput()->GetSpacing()); - splineFilter->SetSize(this->GetOutput()->GetLargestPossibleRegion().GetSize()); - splineFilter->Update(); - - // Image function - splineIntList->Back()->SetSplineOrder( splineFilter->GetSplineOrder() ); - splineIntList->Back()->SetSize( splineFilter->GetSize() ); - splineIntList->Back()->SetSpacing( splineFilter->GetSpacing() ); - splineIntList->Back()->SetOrigin( splineFilter->GetOrigin() ); - splineIntList->Back()->SetInputImage( static_cast<const InternalImageType*>(splineFilter->GetPhiLattice().GetPointer()) ); - } - - // Interpolation - typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType; - IteratorType outIt(outputPtr, outputPtr->GetRequestedRegion()); - - // main loop - for (outIt.GoToBegin(); !outIt.IsAtEnd(); ++outIt) - { - // Index of the pixel - IndexType index = outIt.GetIndex(); - // parameters vector - ParametersType params(this->GetTransform()->GetNumberOfParameters()); - // we iterate over the number of parameters of the transform - for (unsigned int paramIndex = 0; paramIndex < this->GetTransform()->GetNumberOfParameters(); ++paramIndex) - { - typename InternalPointSetType::PointType p; - this->GetOutput()->TransformIndexToPhysicalPoint(index, p); - typename InternalPointSetType::PixelType V(0.0); - // For each parameter we use the associated spline interpolator - if (!IsAngular(paramIndex)) - { - V = splineIntList->GetNthElement(paramIndex)->EvaluateAtParametricPoint(p); - params[paramIndex] = V[0]; - } - else - { - V = splineIntList->GetNthElement(paramIndex)->EvaluateAtParametricPoint(p); - params[paramIndex] = std::atan2(V[1], V[0]); - } - // We then compute the target point using the transform - this->GetTransform()->SetParameters(params); - PointType sourcePoint, targetPoint; - outputPtr->TransformIndexToPhysicalPoint(index, sourcePoint); - targetPoint = this->GetTransform()->TransformPoint(sourcePoint); - - // And the displacement - PixelType pixel; - pixel.SetSize(2); - pixel[0] = static_cast<ValueType>(targetPoint[0] - sourcePoint[0]); - pixel[1] = static_cast<ValueType>(targetPoint[1] - sourcePoint[1]); - outIt.Set(pixel); - } - } -} -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::AddAngularParameter(unsigned int index) -{ - m_AngularParameters.push_back(index); -} -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::RemoveAngularParameter(unsigned int index) -{ - m_AngularParameters.erase(index); -} -template <class TPointSet, class TDisplacementField> -bool -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::IsAngular(unsigned int index) -{ - bool resp = std::binary_search(m_AngularParameters.begin(), m_AngularParameters.end(), index); - return resp; -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -BSplinesInterpolateTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h deleted file mode 100644 index ab4f9d62f4f0a5f0d59b208bf584d7a7050619e9..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_h -#define otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_h - -#include "otbPointSetToDisplacementFieldGenerator.h" - -namespace otb -{ -/** \class NNearestPointsLinearInterpolateDisplacementFieldGenerator - * \brief This class generate the displacement field by performing a linear interpolation of the displacement induced by the n nearest point. - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT NNearestPointsLinearInterpolateDisplacementFieldGenerator - : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef NNearestPointsLinearInterpolateDisplacementFieldGenerator Self; - typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NNearestPointsLinearInterpolateDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::PointType PointType; - typedef typename Superclass::IndexVectorType IndexVectorType; - typedef typename Superclass::DistanceVectorType DistanceVectorType; - - itkSetMacro(NumberOfPoints, unsigned int); - itkGetMacro(NumberOfPoints, unsigned int); - -protected: - /** Constructor */ - NNearestPointsLinearInterpolateDisplacementFieldGenerator() {}; - /** Destructor */ - ~NNearestPointsLinearInterpolateDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - -private: - NNearestPointsLinearInterpolateDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - unsigned int m_NumberOfPoints; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx deleted file mode 100644 index 873bca0b2efbf8f4588c634043bba2b004c5b534..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_hxx -#define otbNNearestPointsLinearInterpolateDisplacementFieldGenerator_hxx - -#define EPSILON 1e-15 - -#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "otbMacro.h" - -namespace otb -{ -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -NNearestPointsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - PixelType defaultValue(2); - defaultValue.Fill(this->GetDefaultValue()); - outputPtr->Allocate(); - outputPtr->FillBuffer(defaultValue); - - typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType; - IteratorType it(outputPtr, outputPtr->GetRequestedRegion()); - - for (it.GoToBegin(); !it.IsAtEnd(); ++it) - { - IndexType index = it.GetIndex(); - IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), m_NumberOfPoints); - PixelType pixel(2); - double xdisplacement, ydisplacement, normalization; - xdisplacement = 0; - ydisplacement = 0; - normalization = 0; - - for (typename IndexVectorType::iterator indexIt = indexVector.begin(); indexIt != indexVector.end(); ++indexIt) - { - PointType point; - point[0] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[0]); - point[1] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[1]); - double distance = this->EuclideanDistanceMetric(index, point); - if (distance < EPSILON) - { - distance = EPSILON; - } - xdisplacement += this->GetPointSet()->GetPointData()->GetElement((*indexIt))[1] / distance; - ydisplacement += this->GetPointSet()->GetPointData()->GetElement((*indexIt))[2] / distance; - normalization += 1 / distance; - } - - if (normalization > 0) - { - pixel[0] = static_cast<ValueType>(xdisplacement / normalization); - pixel[1] = static_cast<ValueType>(ydisplacement / normalization); - } - else - { - pixel = defaultValue; - } - it.Set(pixel); - } -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -NNearestPointsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h deleted file mode 100644 index 7ab027e0135ab84a80c67be3c8c76117d9283aa4..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_h -#define otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_h - -#include "otbPointSetWithTransformToDisplacementFieldGenerator.h" - -namespace otb -{ -/** \class NNearestTransformsLinearInterpolateDisplacementFieldGenerator - * \brief generate the displacement field by performing a linear interpolation - * - * This class generate the displacement field by performing a linear interpolation of - * the displacements from the transforms induced by the n nearest points. - * - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT NNearestTransformsLinearInterpolateDisplacementFieldGenerator - : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef NNearestTransformsLinearInterpolateDisplacementFieldGenerator Self; - typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NNearestTransformsLinearInterpolateDisplacementFieldGenerator, - PointSetWithTransformsToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::PointType PointType; - typedef typename Superclass::IndexVectorType IndexVectorType; - typedef typename Superclass::DistanceVectorType DistanceVectorType; - typedef typename Superclass::TransformType TransformType; - typedef typename TransformType::ParametersType ParametersType; - - itkSetMacro(NumberOfPoints, unsigned int); - itkGetMacro(NumberOfPoints, unsigned int); - -protected: - /** Constructor */ - NNearestTransformsLinearInterpolateDisplacementFieldGenerator() {}; - /** Destructor */ - ~NNearestTransformsLinearInterpolateDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - -private: - NNearestTransformsLinearInterpolateDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - unsigned int m_NumberOfPoints; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx deleted file mode 100644 index dabb7ab6ded475512374a0794b65724fffb3b42b..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_hxx -#define otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator_hxx - -#define EPSILON 1e-15 - -#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "otbMacro.h" - -namespace otb -{ -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -NNearestTransformsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - PixelType defaultValue(2); - defaultValue.Fill(this->GetDefaultValue()); - outputPtr->Allocate(); - outputPtr->FillBuffer(defaultValue); - - typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType; - IteratorType it(outputPtr, outputPtr->GetRequestedRegion()); - - for (it.GoToBegin(); !it.IsAtEnd(); ++it) - { - IndexType index = it.GetIndex(); - IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), m_NumberOfPoints); - PixelType pixel(2); - double xdisplacement, ydisplacement, normalization; - xdisplacement = 0; - ydisplacement = 0; - normalization = 0; - - for (typename IndexVectorType::iterator indexIt = indexVector.begin(); indexIt != indexVector.end(); ++indexIt) - { - PointType point; - point[0] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[0]); - point[1] = static_cast<double>(this->GetPointSet()->GetPoints()->GetElement(*indexIt)[1]); - double distance = this->EuclideanDistanceMetric(index, point); - if (distance < EPSILON) - { - distance = EPSILON; - } - - ParametersType params(this->GetTransform()->GetNumberOfParameters()); - for (unsigned int i = 0; i < this->GetTransform()->GetNumberOfParameters(); ++i) - { - params[i] = this->GetPointSet()->GetPointData()->GetElement((*indexIt))[i + 3]; - } - this->GetTransform()->SetParameters(params); - PointType sourcePoint, targetPoint; - - outputPtr->TransformIndexToPhysicalPoint(it.GetIndex(), sourcePoint); - targetPoint = this->GetTransform()->TransformPoint(sourcePoint); - xdisplacement += (targetPoint[0] - sourcePoint[0]) / distance; - ydisplacement += (targetPoint[1] - sourcePoint[1]) / distance; - normalization += 1 / distance; - } - - if (normalization > 0) - { - pixel[0] = static_cast<ValueType>(xdisplacement / normalization); - pixel[1] = static_cast<ValueType>(ydisplacement / normalization); - } - else - { - pixel = defaultValue; - } - it.Set(pixel); - } -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -NNearestTransformsLinearInterpolateDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h deleted file mode 100644 index 158e21b2c13b79a65d8a1217ae3f75134c8da972..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNearestPointDisplacementFieldGenerator_h -#define otbNearestPointDisplacementFieldGenerator_h - -#include "otbPointSetToDisplacementFieldGenerator.h" - -namespace otb -{ -/** \class NearestPointDisplacementFieldGenerator - * \brief This class implements the simplest way to displacement field generation using a point set. - * In each pixel location, the displacement is considered to be the displacement of the nearest seed point in the point set. - * - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT NearestPointDisplacementFieldGenerator - : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef NearestPointDisplacementFieldGenerator Self; - typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NearestPointDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::IndexVectorType IndexVectorType; - -protected: - /** Constructor */ - NearestPointDisplacementFieldGenerator() {}; - /** Destructor */ - ~NearestPointDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - -private: - NearestPointDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNearestPointDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx deleted file mode 100644 index f7194ec39aa8364311fcd003859497361bece1f7..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNearestPointDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNearestPointDisplacementFieldGenerator_hxx -#define otbNearestPointDisplacementFieldGenerator_hxx - -#include "otbNearestPointDisplacementFieldGenerator.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "otbMacro.h" - -namespace otb -{ -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -NearestPointDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - PixelType defaultValue(2); - defaultValue.Fill(this->GetDefaultValue()); - outputPtr->Allocate(); - outputPtr->FillBuffer(defaultValue); - - typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType; - IteratorType it(outputPtr, outputPtr->GetRequestedRegion()); - - for (it.GoToBegin(); !it.IsAtEnd(); ++it) - { - IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), 1); - PixelType p(2); - if (indexVector.size() >= 1) - { - p[0] = static_cast<ValueType>(this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[1]); - p[1] = static_cast<ValueType>(this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[2]); - } - else - { - p = defaultValue; - } - it.Set(p); - } -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -NearestPointDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h deleted file mode 100644 index 6f4f907802a1b67017396b41c3674e74b95043a0..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNearestTransformDisplacementFieldGenerator_h -#define otbNearestTransformDisplacementFieldGenerator_h - -#include "otbPointSetWithTransformToDisplacementFieldGenerator.h" - -namespace otb -{ -/** \class NearestTransformDisplacementFieldGenerator - * \brief This class implements displacement field generation by taking into account the local transform of the - * nearest point in pointset. - * - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT NearestTransformDisplacementFieldGenerator - : public PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef NearestTransformDisplacementFieldGenerator Self; - typedef PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(NearestTransformDisplacementFieldGenerator, PointSetWithTransformToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef typename Superclass::PointSetType PointSetType; - typedef typename Superclass::PointSetPointerType PointSetPointerType; - typedef typename Superclass::DisplacementFieldType DisplacementFieldType; - typedef typename Superclass::DisplacementFieldPointerType DisplacementFieldPointerType; - typedef typename Superclass::IndexType IndexType; - typedef typename Superclass::PointType PointType; - typedef typename DisplacementFieldType::PixelType PixelType; - typedef typename Superclass::ValueType ValueType; - typedef typename Superclass::IndexVectorType IndexVectorType; - typedef typename Superclass::TransformType TransformType; - typedef typename TransformType::ParametersType ParametersType; - -protected: - /** Constructor */ - NearestTransformDisplacementFieldGenerator() {}; - /** Destructor */ - ~NearestTransformDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Main computation method */ - void GenerateData() override; - -private: - NearestTransformDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbNearestTransformDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx deleted file mode 100644 index e43b4fe7da8daf535e3650bb663fa69b4893f56b..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbNearestTransformDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbNearestTransformDisplacementFieldGenerator_hxx -#define otbNearestTransformDisplacementFieldGenerator_hxx - -#include "otbNearestTransformDisplacementFieldGenerator.h" -#include "itkImageRegionIteratorWithIndex.h" -#include "otbMacro.h" - -namespace otb -{ -/** Main computation method */ -template <class TPointSet, class TDisplacementField> -void -NearestTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateData(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - PixelType defaultValue(2); - defaultValue.Fill(this->GetDefaultValue()); - outputPtr->Allocate(); - outputPtr->FillBuffer(defaultValue); - - typedef itk::ImageRegionIteratorWithIndex<DisplacementFieldType> IteratorType; - IteratorType it(outputPtr, outputPtr->GetRequestedRegion()); - - for (it.GoToBegin(); !it.IsAtEnd(); ++it) - { - IndexVectorType indexVector = this->GenerateNearestValidPointsPointSet(it.GetIndex(), 1); - PixelType pixel(2); - if (indexVector.size() >= 1) - { - ParametersType params(this->GetTransform()->GetNumberOfParameters()); - for (unsigned int i = 0; i < this->GetTransform()->GetNumberOfParameters(); ++i) - { - params[i] = this->GetPointSet()->GetPointData()->GetElement(indexVector[0])[i + 3]; - } - this->GetTransform()->SetParameters(params); - PointType sourcePoint, targetPoint; - - outputPtr->TransformIndexToPhysicalPoint(it.GetIndex(), sourcePoint); - targetPoint = this->GetTransform()->TransformPoint(sourcePoint); - pixel[0] = static_cast<ValueType>(targetPoint[0] - sourcePoint[0]); - pixel[1] = static_cast<ValueType>(targetPoint[1] - sourcePoint[1]); - } - else - { - pixel = defaultValue; - } - it.Set(pixel); - } -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -NearestTransformDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h deleted file mode 100644 index 9624d8ebe16f1af7108870cfe13f54f3da8c2cd3..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.h +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPointSetToDisplacementFieldGenerator_h -#define otbPointSetToDisplacementFieldGenerator_h - -#include "itkImageSource.h" - -namespace otb -{ -namespace Functor -{ -/** \class DistanceComparisonFunctor - * \brief This functor is used in nearest neighborhood sorting. - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -class DistanceComparisonFunctor -{ -public: - DistanceComparisonFunctor() {} - virtual ~DistanceComparisonFunctor() {} - typedef std::vector<double> DistanceVectorType; - - void SetDistanceVector(DistanceVectorType& vec) - { - m_DistanceVector = vec; - } - DistanceVectorType GetDistanceVector(void) - { - return m_DistanceVector; - } - inline bool operator ()(const unsigned int a1, const unsigned int a2) - { - return m_DistanceVector[a1] < m_DistanceVector[a2]; - } - -private: - DistanceVectorType m_DistanceVector; -}; -} -/** \class PointSetToDisplacementFieldGenerator - * \brief Base class for filters generating a displacement field from a point set enriched with displacement and local transform information. - * The output of the filters deriving from this base class can be passed to the itk::WarpImageFilter for image resampling. - * \sa DisparityMapEstimationMethod - * \sa itk::WarpImageFilter - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT PointSetToDisplacementFieldGenerator - : public itk::ImageSource<TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef PointSetToDisplacementFieldGenerator Self; - typedef itk::ImageSource<TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(PointSetToDisplacementFieldGenerator, ImageSource); - - /** Template parameters typedefs */ - typedef TPointSet PointSetType; - typedef typename PointSetType::Pointer PointSetPointerType; - - typedef TDisplacementField DisplacementFieldType; - typedef typename DisplacementFieldType::Pointer DisplacementFieldPointerType; - typedef typename DisplacementFieldType::IndexType IndexType; - typedef typename DisplacementFieldType::SizeType SizeType; - typedef typename DisplacementFieldType::SpacingType SpacingType; - typedef typename DisplacementFieldType::PointType PointType; - typedef typename DisplacementFieldType::InternalPixelType ValueType; - - /** More typedefs */ - typedef std::vector<double> DistanceVectorType; - typedef std::vector<unsigned int> IndexVectorType; - - /** - * Set the pointset containing the disparity. - * \param pointset The pointset containing the disparity. - */ - void SetPointSet(const TPointSet * pointset); - /** - * Get the pointset containing the disparity. - * \return The pointset containing the disparity. - */ - const TPointSet * GetPointSet(void); - - itkSetMacro(MetricThreshold, double); - itkGetMacro(MetricThreshold, double); - itkSetMacro(DefaultValue, ValueType); - itkGetMacro(DefaultValue, ValueType); - itkSetMacro(OutputSize, SizeType); - itkGetConstReferenceMacro(OutputSize, SizeType); - itkSetMacro(OutputSpacing, SpacingType); - itkGetConstReferenceMacro(OutputSpacing, SpacingType); - itkSetMacro(OutputOrigin, PointType); - itkGetConstReferenceMacro(OutputOrigin, PointType); - -protected: - /** Constructor */ - PointSetToDisplacementFieldGenerator(); - /** Destructor */ - ~PointSetToDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - /** Generate output information */ - void GenerateOutputInformation(void) override; - /** - * Generate the n nearest valid point in point set, where a valid point has a sufficient metric value. - * \param index The index of the pixel to compute. - * \param n The number of nearest point to seek. - * \return A vector containing the index of the nearest point from nearest to most far. - */ - IndexVectorType GenerateNearestValidPointsPointSet(IndexType index, unsigned int n = 1); - - /** Euclidean distance of point to index */ - double EuclideanDistanceMetric(IndexType index, PointType p); - -private: - PointSetToDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - /** - * The threshold of metric value. - */ - double m_MetricThreshold; - /** The output size */ - SizeType m_OutputSize; - /** The output spacing. */ - SpacingType m_OutputSpacing; - /** The output origin */ - PointType m_OutputOrigin; - /** Default value */ - ValueType m_DefaultValue; -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbPointSetToDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx deleted file mode 100644 index f0b69603156bf68220c8bb698ea2bcfabcd894c3..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbPointSetToDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPointSetToDisplacementFieldGenerator_hxx -#define otbPointSetToDisplacementFieldGenerator_hxx - -#include "otbPointSetToDisplacementFieldGenerator.h" -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPointSet, class TDisplacementField> -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PointSetToDisplacementFieldGenerator() -{ - this->SetNumberOfRequiredInputs(1); - m_MetricThreshold = 0.; - m_OutputSize.Fill(100); - m_OutputSpacing.Fill(1.); - m_OutputOrigin.Fill(0.); - m_DefaultValue = 0; -// m_NearestPoints = PointSetType::New(); -} -/** - * Set the pointset containing the disparity. - * \param pointset The pointset containing the disparity. - */ -template <class TPointSet, class TDisplacementField> -void -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::SetPointSet(const TPointSet * pointset) -{ - this->itk::ProcessObject::SetNthInput(0, const_cast<PointSetType *>(pointset)); -} -/** - * Get the pointset containing the disparity. - * \return The pointset containing the disparity. - */ -template <class TPointSet, class TDisplacementField> -const TPointSet * -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GetPointSet(void) -{ - return static_cast<const PointSetType *>(this->itk::ProcessObject::GetInput(0)); -} -/** Generate output information */ -template <class TPointSet, class TDisplacementField> -void -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateOutputInformation(void) -{ - DisplacementFieldPointerType outputPtr = this->GetOutput(); - typename DisplacementFieldType::RegionType largest; - largest.SetSize(m_OutputSize); - IndexType index; - index.Fill(0); - largest.SetIndex(index); - outputPtr->SetRegions(largest); - outputPtr->SetSignedSpacing(m_OutputSpacing); - outputPtr->SetOrigin(m_OutputOrigin); - // Force the displacement field to have vector pixel of size 2. - outputPtr->SetNumberOfComponentsPerPixel(2); -} -/** - * Generate the n nearest point in point set - * \param index The index of the pixel to compute. - * \param n The number of nearest point to seek. - * \return A vector containing the index of the nearest point from nearest to most far. - */ -template <class TPointSet, class TDisplacementField> -typename PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::IndexVectorType -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::GenerateNearestValidPointsPointSet(IndexType index, unsigned int n) -{ - typedef Functor::DistanceComparisonFunctor ComparisonFunctorType; - DistanceVectorType distanceVector; - IndexVectorType indexVector; - IndexVectorType sortVector; - unsigned int i = 0; - unsigned int j = 0; - - typedef typename PointSetType::PointsContainer::ConstIterator PointSetIteratorType; - - PointSetIteratorType it = this->GetPointSet()->GetPoints()->Begin(); - for (; it != this->GetPointSet()->GetPoints()->End(); ++it) - { - PointType p; - p[0] = it.Value()[0]; - p[1] = it.Value()[1]; - if (std::abs(this->GetPointSet()->GetPointData()->GetElement(j)[0]) >= m_MetricThreshold) - { - - distanceVector.push_back(EuclideanDistanceMetric(index, p)); - sortVector.push_back(i); - indexVector.push_back(j); - ++i; - } - ++j; - } - - ComparisonFunctorType comp; - comp.SetDistanceVector(distanceVector); - sort(sortVector.begin(), sortVector.end(), comp); - - // building output vector - unsigned int nbElements = (n < indexVector.size() ? n : indexVector.size()); - IndexVectorType output; - for (i = 0; i < nbElements; ++i) - { - output.push_back(indexVector[sortVector[i]]); - } - return output; -} - -template <class TPointSet, class TDisplacementField> -double -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::EuclideanDistanceMetric(IndexType index, PointType p) -{ - PointType pprime; - // our point are expressed in index and not in physical coordinates - //this->GetOutput()->TransformIndexToPhysicalPoint(index, pprime); - return std::sqrt(std::pow(index[0] - p[0], 2) + std::pow(index[1] - p[1], 2)); -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h deleted file mode 100644 index a947bb82cd939c29420ed9d917118a23558af2e6..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPointSetWithTransformToDisplacementFieldGenerator_h -#define otbPointSetWithTransformToDisplacementFieldGenerator_h - -#include "otbPointSetToDisplacementFieldGenerator.h" -#include "itkTransform.h" - -namespace otb -{ -/** \class PointSetWithTransformToDisplacementFieldGenerator - * \brief Base class for filters generating a displacement field from a point set enriched with local transform information. - * - * The output of the filters deriving from this base class can be passed to the itk::WarpImageFilter for image resampling. - * - * \sa DisparityMapEstimationMethod - * \sa itk::WarpImageFilter - * - * \ingroup DisparityMap - * - * \ingroup OTBDisplacementField - */ -template <class TPointSet, class TDisplacementField> -class ITK_EXPORT PointSetWithTransformToDisplacementFieldGenerator - : public PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> -{ -public: - /** Standard typedefs */ - typedef PointSetWithTransformToDisplacementFieldGenerator Self; - typedef PointSetToDisplacementFieldGenerator<TPointSet, TDisplacementField> Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Type macro */ - itkNewMacro(Self); - - /** Creation through object factory macro */ - itkTypeMacro(PointSetWithTransformToDisplacementFieldGenerator, PointSetToDisplacementFieldGenerator); - - /** Template parameters typedefs */ - typedef TPointSet PointSetType; - typedef typename PointSetType::Pointer PointSetPointerType; - - typedef TDisplacementField DisplacementFieldType; - typedef typename DisplacementFieldType::Pointer DisplacementFieldPointerType; - typedef typename DisplacementFieldType::IndexType IndexType; - typedef typename DisplacementFieldType::SizeType SizeType; - typedef typename DisplacementFieldType::SpacingType SpacingType; - typedef typename DisplacementFieldType::PointType PointType; - typedef typename DisplacementFieldType::InternalPixelType ValueType; - - /** More typedefs */ - typedef typename Superclass::DistanceVectorType DistanceVectorType; - typedef typename Superclass::IndexVectorType IndexVectorType; - - /** Transform typedefs */ - typedef itk::Transform<double, 2, 2> TransformType; - typedef typename TransformType::Pointer TransformPointerType; - typedef typename TransformType::ParametersType ParametersType; - - /** Set/Get the Transform. */ - itkSetObjectMacro(Transform, TransformType); - itkGetObjectMacro(Transform, TransformType); - -protected: - /** Constructor */ - PointSetWithTransformToDisplacementFieldGenerator(); - /** Destructor */ - ~PointSetWithTransformToDisplacementFieldGenerator() override {} - /**PrintSelf method */ - void PrintSelf(std::ostream& os, itk::Indent indent) const override; - -private: - PointSetWithTransformToDisplacementFieldGenerator(const Self &) = delete; - void operator =(const Self&) = delete; - - /** - * The transform used for local registration. - */ - TransformPointerType m_Transform; - -}; -} // End namespace otb -#ifndef OTB_MANUAL_INSTANTIATION -#include "otbPointSetWithTransformToDisplacementFieldGenerator.hxx" -#endif - -#endif diff --git a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx b/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx deleted file mode 100644 index 8cd221644a2d657e8127facbe434b852e4df869a..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/include/otbPointSetWithTransformToDisplacementFieldGenerator.hxx +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbPointSetWithTransformToDisplacementFieldGenerator_hxx -#define otbPointSetWithTransformToDisplacementFieldGenerator_hxx - -#include "otbPointSetWithTransformToDisplacementFieldGenerator.h" - -#include "otbMacro.h" - -namespace otb -{ -/** - * Constructor - */ -template <class TPointSet, class TDisplacementField> -PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PointSetWithTransformToDisplacementFieldGenerator() -{ - m_Transform = nullptr; // has to be provided by the user -} -/** - * PrintSelf Method - */ -template <class TPointSet, class TDisplacementField> -void -PointSetWithTransformToDisplacementFieldGenerator<TPointSet, TDisplacementField> -::PrintSelf(std::ostream& os, itk::Indent indent) const -{ - Superclass::PrintSelf(os, indent); -} -} // End namespace otb -#endif diff --git a/Modules/Registration/DisplacementField/otb-module.cmake b/Modules/Registration/DisplacementField/otb-module.cmake deleted file mode 100644 index b8efc64ea38e78fa5dbe0f82615e2abb88f26e59..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/otb-module.cmake +++ /dev/null @@ -1,41 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -set(DOCUMENTATION "This module contains filters that generate a deformation -field by using some interpolation criterion on the deformation values from the point -set. Several interpolation methods are available (Nearest neighbours, linear, -BSpline). The class otb::StereorectificationDisplacementFieldSource is specialized -in generating a deformation field between two images in epipolar geometry -(horizontal shifts).") - -otb_module(OTBDisplacementField - DEPENDS - OTBCommon - OTBITK - OTBImageBase - OTBObjectList - - TEST_DEPENDS - OTBImageIO - OTBTestKernel - - DESCRIPTION - "${DOCUMENTATION}" -) diff --git a/Modules/Registration/DisplacementField/test/CMakeLists.txt b/Modules/Registration/DisplacementField/test/CMakeLists.txt deleted file mode 100644 index 440c6b130cf207b956ef74153868428e58bf8bbe..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/CMakeLists.txt +++ /dev/null @@ -1,88 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -otb_module_test() - -set(OTBDisplacementFieldTests -otbDisplacementFieldTestDriver.cxx -otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx -otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx -otbNearestTransformDisplacementFieldGenerator.cxx -otbNearestPointDisplacementFieldGenerator.cxx -otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx -otbBSplinesInterpolateDisplacementFieldGenerator.cxx -) - -add_executable(otbDisplacementFieldTestDriver ${OTBDisplacementFieldTests}) -target_link_libraries(otbDisplacementFieldTestDriver ${OTBDisplacementField-Test_LIBRARIES}) -otb_module_target_label(otbDisplacementFieldTestDriver) - -# Tests Declaration - -otb_add_test(NAME dmTvNNearestTransformsLinearInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - --compare-image ${EPSILON_10} - ${BASELINE}/dmTvNNearestTransformsLinearInterpolateDeformationField.tif - ${TEMP}/dmTvNNearestTransformsLinearInterpolateDisplacementField.tif - otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator - ${TEMP}/dmTvNNearestTransformsLinearInterpolateDisplacementField.tif - ) - -otb_add_test(NAME dmTvNNearestPointsLinearInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - --compare-image ${EPSILON_10} - ${BASELINE}/dmTvNNearestPointsLinearInterpolateDeformationField.tif - ${TEMP}/dmTvNNearestPointsLinearInterpolateDisplacementField.tif - otbNNearestPointsLinearInterpolateDisplacementFieldGenerator - ${TEMP}/dmTvNNearestPointsLinearInterpolateDisplacementField.tif - ) - - - -otb_add_test(NAME dmTvNearestTransformDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - --compare-image ${EPSILON_10} - ${BASELINE}/dmTvNearestTransformDeformationField.tif - ${TEMP}/dmTvNearestTransformDisplacementField.tif - otbNearestTransformDisplacementFieldGenerator - ${TEMP}/dmTvNearestTransformDisplacementField.tif - ) - -otb_add_test(NAME dmTvNearestPointDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - --compare-image ${EPSILON_10} - ${BASELINE}/dmTvNearestPointDeformationField.tif - ${TEMP}/dmTvNearestPointDisplacementField.tif - otbNearestPointDisplacementFieldGenerator - ${TEMP}/dmTvNearestPointDisplacementField.tif - ) - -#otb_add_test(NAME dmTvBSplinesInterpolateTransformDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - #--compare-image ${EPSILON_4} - #${BASELINE}/dmTvBSplinesInterpolateTransformDeformationFieldGenerator.tif - #${TEMP}/dmTvBSplinesInterpolateTransformDisplacementFieldGenerator.tif - #otbBSplinesInterpolateTransformDisplacementFieldGenerator - #${TEMP}/dmTvBSplinesInterpolateTransformDisplacementFieldGenerator.tif - #) - -otb_add_test(NAME dmTvBSplinesInterpolateDisplacementFieldGenerator COMMAND otbDisplacementFieldTestDriver - --compare-image ${EPSILON_10} - ${BASELINE}/dmTvBSplinesInterpolateDeformationField.tif - ${TEMP}/dmTvBSplinesInterpolateDisplacementField.tif - otbBSplinesInterpolateDisplacementFieldGenerator - ${TEMP}/dmTvBSplinesInterpolateDisplacementField.tif - ) - diff --git a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx deleted file mode 100644 index 9135073f0ccdadbf018d1f7b2761f1fd91b5d66b..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbBSplinesInterpolateDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" - -int otbBSplinesInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::BSplinesInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(3), pd2(3), pd3(3), pd4(3), pd5(3); - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - - pd1[0] = 0.95; - pd1[1] = 10; - pd1[2] = -5; - pd2[0] = 0.98; - pd2[1] = 2; - pd2[2] = 5; - pd3[0] = 0.5; - pd3[1] = 20; - pd3[2] = -20; - pd4[0] = 0.91; - pd4[1] = 15; - pd4[2] = -5; - pd5[0] = 0.91; - pd5[1] = 5; - pd5[2] = 5; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetPointSet(ps); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx deleted file mode 100644 index df178d762b61e25893f176f9aa175645280ed5a3..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbBSplinesInterpolateTransformDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbBSplinesInterpolateTransformDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" -#include "itkEuler2DTransform.h" - -int otbBSplinesInterpolateTransformDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::BSplinesInterpolateTransformDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef itk::Euler2DTransform<double> TransformType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(6), pd2(6), pd3(6), pd4(6), pd5(6); - itk::Point<double, 2> center; - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - center.Fill(50); - - pd1[0] = 0.95; - pd1[1] = 0; - pd1[2] = 0; - pd1[3] = 0.03925; - pd1[4] = 5; - pd1[5] = 5; - pd2[0] = 0.98; - pd2[1] = 0; - pd2[2] = 0; - pd2[3] = -0.03925; - pd2[4] = 5; - pd2[5] = -5; - pd3[0] = 0.5; - pd3[1] = 0; - pd3[2] = 0; - pd3[3] = 0; - pd3[4] = 0; - pd3[5] = 0; - pd4[0] = 0.91; - pd4[1] = 0; - pd4[2] = 0; - pd4[3] = 0.03925; - pd4[4] = -5; - pd4[5] = 5; - pd5[0] = 0.91; - pd5[1] = 0; - pd5[2] = 0; - pd5[3] = -0.03925; - pd5[4] = -5; - pd5[5] = -5; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - TransformType::Pointer transform = TransformType::New(); - transform->SetCenter(center); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetPointSet(ps); - filter->SetTransform(transform); - filter->AddAngularParameter(0); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx b/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx deleted file mode 100644 index 86d6641fce1b1b594048f20c2648a2e95eabdb88..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbDisplacementFieldTestDriver.cxx +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbTestMain.h" - -void RegisterTests() -{ - REGISTER_TEST(otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator); - REGISTER_TEST(otbNNearestPointsLinearInterpolateDisplacementFieldGenerator); - REGISTER_TEST(otbNearestTransformDisplacementFieldGenerator); - REGISTER_TEST(otbNearestPointDisplacementFieldGenerator); - REGISTER_TEST(otbBSplinesInterpolateTransformDisplacementFieldGenerator); - REGISTER_TEST(otbBSplinesInterpolateDisplacementFieldGenerator); -} diff --git a/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx deleted file mode 100644 index b487435899319e9d6562802fe539a35a6240d0b4..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbNNearestPointsLinearInterpolateDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" - -int otbNNearestPointsLinearInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::NNearestPointsLinearInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(3), pd2(3), pd3(3), pd4(3), pd5(3); - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - - pd1[0] = 0.95; - pd1[1] = 10; - pd1[2] = -5; - pd2[0] = 0.98; - pd2[1] = 2; - pd2[2] = 5; - pd3[0] = 0.5; - pd3[1] = 20; - pd3[2] = -20; - pd4[0] = 0.91; - pd4[1] = 15; - pd4[2] = -5; - pd5[0] = 0.91; - pd5[1] = 5; - pd5[2] = 5; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetNumberOfPoints(5); - filter->SetPointSet(ps); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx deleted file mode 100644 index fb3b638d83fb61f46aef76faa7204e906c5404f0..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" -#include "itkEuler2DTransform.h" - -int otbNNearestTransformsLinearInterpolateDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::NNearestTransformsLinearInterpolateDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef itk::Euler2DTransform<double> TransformType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(6), pd2(6), pd3(6), pd4(6), pd5(6); - itk::Point<double, 2> center; - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - center.Fill(50); - - pd1[0] = 0.95; - pd1[1] = 0; - pd1[2] = 0; - pd1[3] = 5; - pd1[4] = 5; - pd1[5] = 0.001769; - pd2[0] = 0.98; - pd2[1] = 0; - pd2[2] = 0; - pd2[3] = -5; - pd2[4] = 5; - pd2[5] = -0.001769; - pd3[0] = 0.5; - pd3[1] = 0; - pd3[2] = 0; - pd3[3] = 0; - pd3[4] = 0; - pd3[5] = 0; - pd4[0] = 0.91; - pd4[1] = 0; - pd4[2] = 0; - pd4[3] = 5; - pd4[4] = -5; - pd4[5] = 0.001769; - pd5[0] = 0.91; - pd5[1] = 0; - pd5[2] = 0; - pd5[3] = -5; - pd5[4] = -5; - pd5[5] = -0.001769; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - TransformType::Pointer transform = TransformType::New(); - transform->SetCenter(center); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetNumberOfPoints(5); - filter->SetPointSet(ps); - filter->SetTransform(transform); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx deleted file mode 100644 index b6de1e79ab945896a66ffd7b1ccf2685351a0d6e..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbNearestPointDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbNearestPointDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" - -int otbNearestPointDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::NearestPointDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(3), pd2(3), pd3(3), pd4(3), pd5(3); - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - - pd1[0] = 0.95; - pd1[1] = 10; - pd1[2] = -5; - pd2[0] = 0.98; - pd2[1] = 2; - pd2[2] = 5; - pd3[0] = 0.5; - pd3[1] = 20; - pd3[2] = -20; - pd4[0] = 0.91; - pd4[1] = 15; - pd4[2] = -5; - pd5[0] = 0.91; - pd5[1] = 5; - pd5[2] = 5; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetPointSet(ps); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx b/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx deleted file mode 100644 index abf2463501a6ac807d68850cdf9b8c0e6748a21f..0000000000000000000000000000000000000000 --- a/Modules/Registration/DisplacementField/test/otbNearestTransformDisplacementFieldGenerator.cxx +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "itkMacro.h" -#include "itkPointSet.h" -#include "otbVectorImage.h" -#include "otbNearestTransformDisplacementFieldGenerator.h" -#include "otbImageFileWriter.h" -#include "itkEuler2DTransform.h" - -int otbNearestTransformDisplacementFieldGenerator(int itkNotUsed(argc), char * argv[]) -{ - const unsigned int Dimension = 2; - const char * outfname = argv[1]; - typedef double PixelType; - typedef otb::VectorImage<PixelType, Dimension> ImageType; - typedef itk::Array<double> ParamType; - typedef itk::PointSet<ParamType, Dimension> PointSetType; - typedef PointSetType::PointType PointType; - typedef otb::NearestTransformDisplacementFieldGenerator<PointSetType, ImageType> FilterType; - typedef otb::ImageFileWriter<ImageType> WriterType; - typedef itk::Euler2DTransform<double> TransformType; - - ImageType::SizeType size; - size.Fill(100); - double thresh = 0.9; - - // Preparing point set - PointSetType::Pointer ps = PointSetType::New(); - PointType p1, p2, p3, p4, p5; - ParamType pd1(6), pd2(6), pd3(6), pd4(6), pd5(6); - itk::Point<double, 2> center; - - p1[0] = 10; - p1[1] = 10; - p2[0] = 75; - p2[1] = 10; - p3[0] = 50; - p3[1] = 50; - p4[0] = 10; - p4[1] = 60; - p5[0] = 85; - p5[1] = 70; - center.Fill(50); - - pd1[0] = 0.95; - pd1[1] = 0; - pd1[2] = 0; - pd1[3] = 5; - pd1[4] = 5; - pd1[5] = 0.001769; - pd2[0] = 0.98; - pd2[1] = 0; - pd2[2] = 0; - pd2[3] = -5; - pd2[4] = 5; - pd2[5] = -0.001769; - pd3[0] = 0.5; - pd3[1] = 0; - pd3[2] = 0; - pd3[3] = 0; - pd3[4] = 0; - pd3[5] = 0; - pd4[0] = 0.91; - pd4[1] = 0; - pd4[2] = 0; - pd4[3] = 5; - pd4[4] = -5; - pd4[5] = 0.001769; - pd5[0] = 0.91; - pd5[1] = 0; - pd5[2] = 0; - pd5[3] = -5; - pd5[4] = -5; - pd5[5] = -0.001769; - - ps->SetPoint(0, p1); - ps->SetPointData(0, pd1); - ps->SetPoint(1, p2); - ps->SetPointData(1, pd2); - ps->SetPoint(2, p3); - ps->SetPointData(2, pd3); - ps->SetPoint(3, p4); - ps->SetPointData(3, pd4); - ps->SetPoint(4, p5); - ps->SetPointData(4, pd5); - - TransformType::Pointer transform = TransformType::New(); - transform->SetCenter(center); - - // Instantiating object - FilterType::Pointer filter = FilterType::New(); - filter->SetOutputSize(size); - filter->SetMetricThreshold(thresh); - filter->SetPointSet(ps); - filter->SetTransform(transform); - - WriterType::Pointer writer = WriterType::New(); - writer->SetInput(filter->GetOutput()); - writer->SetFileName(outfname); - writer->Update(); - - return EXIT_SUCCESS; -} diff --git a/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx b/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx index 7e8df6ab358066e14723bad5b162ad9778b56751..2263ed97cee6e57e9401b288077f538329408093 100644 --- a/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx +++ b/Modules/Registration/Stereo/test/otbMulti3DMapToDEMFilter.cxx @@ -98,12 +98,10 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[]) for(unsigned int i=0; i<mapSize; i++) { multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput()); - // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist()); multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput()); } //set output parameters - // multiFilter->SetOutputParametersFrom3DMap(); VectorImageType::IndexType start; start[0] = atoi(argv[argc-9]); start[1] = atoi(argv[argc-8]); @@ -132,7 +130,6 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[]) WriterType::Pointer writer = WriterType::New(); multiFilter->SetNumberOfThreads(atoi(argv[argc-11])); - //multiFilter->Update(); writer->SetInput(multiFilter->GetOutput()); @@ -141,153 +138,6 @@ int otbMulti3DMapToDEMFilterEPSG(int argc, char* argv[]) writer->Update(); return EXIT_SUCCESS; - - /* - if (argc != 12) - { - std::cout << argv[0] << - " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>" - << std::endl; - - return EXIT_FAILURE; - } - - typedef otb::VectorImage<double, 2> VectorImageType; - typedef otb::ImageFileReader<VectorImageType> ReaderType; - typedef otb::ImageFileWriter<VectorImageType> WriterType; - typedef otb::UtmInverseProjection UtmMapProjectionType; - typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType; - - //Allocate pointer - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); - UtmMapProjectionType::Pointer utmMapProjection = UtmMapProjectionType::New(); - - // Set parameters ... - reader->SetFileName(argv[1]); - writer->SetFileName(argv[2]); - - reader->GenerateOutputInformation(); - std::cout << reader->GetOutput() << std::endl; - - orthoRectifFilter->SetInput(reader->GetOutput()); - - VectorImageType::IndexType start; - start[0] = 0; - start[1] = 0; - orthoRectifFilter->SetOutputStartIndex(start); - - VectorImageType::SizeType size; - size[0] = atoi(argv[5]); // X size - size[1] = atoi(argv[6]); //Y size - orthoRectifFilter->SetOutputSize(size); - - VectorImageType::SpacingType spacing; - spacing[0] = atof(argv[7]); - spacing[1] = atof(argv[8]); - orthoRectifFilter->SetOutputSpacing(spacing); - - VectorImageType::PointType origin; - origin[0] = strtod(argv[3], NULL); //Origin easting - origin[1] = strtod(argv[4], NULL); //Origin northing - orthoRectifFilter->SetOutputOrigin(origin); - - utmMapProjection->SetZone(atoi(argv[9])); - utmMapProjection->SetHemisphere(argv[10][0]); - orthoRectifFilter->SetMapProjection(utmMapProjection); - - // Deformation Field spacing - VectorImageType::SpacingType gridSpacing; - gridSpacing[0] = atof(argv[11]); - gridSpacing[1] = -atof(argv[11]); - orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing); - - VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); - no_data.Fill(0); - orthoRectifFilter->SetEdgePaddingValue(no_data); - - writer->SetInput(orthoRectifFilter->GetOutput()); - writer->SetNumberOfDivisionsTiledStreaming(4); - writer->Update(); - - return EXIT_SUCCESS; */ - - - - - /* - if (argc != 12) - { - std::cout << argv[0] << - " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>" - << std::endl; - - return EXIT_FAILURE; - } - - typedef otb::VectorImage<double, 2> VectorImageType; - typedef otb::ImageFileReader<VectorImageType> ReaderType; - typedef otb::ImageFileWriter<VectorImageType> WriterType; - typedef otb::UtmInverseProjection UtmMapProjectionType; - typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType; - - //Allocate pointer - ReaderType::Pointer reader = ReaderType::New(); - WriterType::Pointer writer = WriterType::New(); - - OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); - UtmMapProjectionType::Pointer utmMapProjection = UtmMapProjectionType::New(); - - // Set parameters ... - reader->SetFileName(argv[1]); - writer->SetFileName(argv[2]); - - reader->GenerateOutputInformation(); - std::cout << reader->GetOutput() << std::endl; - - orthoRectifFilter->SetInput(reader->GetOutput()); - - VectorImageType::IndexType start; - start[0] = 0; - start[1] = 0; - orthoRectifFilter->SetOutputStartIndex(start); - - VectorImageType::SizeType size; - size[0] = atoi(argv[5]); // X size - size[1] = atoi(argv[6]); //Y size - orthoRectifFilter->SetOutputSize(size); - - VectorImageType::SpacingType spacing; - spacing[0] = atof(argv[7]); - spacing[1] = atof(argv[8]); - orthoRectifFilter->SetOutputSpacing(spacing); - - VectorImageType::PointType origin; - origin[0] = strtod(argv[3], NULL); //Origin easting - origin[1] = strtod(argv[4], NULL); //Origin northing - orthoRectifFilter->SetOutputOrigin(origin); - - utmMapProjection->SetZone(atoi(argv[9])); - utmMapProjection->SetHemisphere(argv[10][0]); - orthoRectifFilter->SetMapProjection(utmMapProjection); - - // Deformation Field spacing - VectorImageType::SpacingType gridSpacing; - gridSpacing[0] = atof(argv[11]); - gridSpacing[1] = -atof(argv[11]); - orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing); - - VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); - no_data.Fill(0); - orthoRectifFilter->SetEdgePaddingValue(no_data); - - writer->SetInput(orthoRectifFilter->GetOutput()); - writer->SetNumberOfDivisionsTiledStreaming(4); - writer->Update(); - - return EXIT_SUCCESS; */ } int otbMulti3DMapToDEMFilterManual(int argc, char* argv[]) @@ -354,12 +204,10 @@ multiFilter->SetCellFusionMode(fusionMode); for(unsigned int i=0; i<mapSize; i++) { multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput()); - // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist()); multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput()); } //set output parameters -//multiFilter->SetOutputParametersFrom3DMap(); VectorImageType::IndexType start; start[0] = atoi(argv[argc-7]); start[1] = atoi(argv[argc-8]); @@ -385,7 +233,6 @@ multiFilter->SetOutputOrigin(origin); WriterType::Pointer writer = WriterType::New(); multiFilter->SetNumberOfThreads(atoi(argv[argc-10])); -//multiFilter->Update(); writer->SetInput(multiFilter->GetOutput()); @@ -395,79 +242,6 @@ writer->Update(); return EXIT_SUCCESS; - -/* -if (argc != 12) - { - std::cout << argv[0] << - " <input filename> <output filename> <origin easting> <origin northing> <x size> <y size> <x spacing> <y spacing> <UTM zone> <UTM hemisphere>" - << std::endl; - - return EXIT_FAILURE; - } - -typedef otb::VectorImage<double, 2> VectorImageType; -typedef otb::ImageFileReader<VectorImageType> ReaderType; -typedef otb::ImageFileWriter<VectorImageType> WriterType; -typedef otb::UtmInverseProjection UtmMapProjectionType; -typedef otb::OrthoRectificationFilter<VectorImageType, VectorImageType, UtmMapProjectionType> OrthoRectifFilterType; - -//Allocate pointer -ReaderType::Pointer reader = ReaderType::New(); -WriterType::Pointer writer = WriterType::New(); - -OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); -UtmMapProjectionType::Pointer utmMapProjection = UtmMapProjectionType::New(); - -// Set parameters ... -reader->SetFileName(argv[1]); -writer->SetFileName(argv[2]); - -reader->GenerateOutputInformation(); -std::cout << reader->GetOutput() << std::endl; - -orthoRectifFilter->SetInput(reader->GetOutput()); - -VectorImageType::IndexType start; -start[0] = 0; -start[1] = 0; -orthoRectifFilter->SetOutputStartIndex(start); - -VectorImageType::SizeType size; -size[0] = atoi(argv[5]); // X size -size[1] = atoi(argv[6]); //Y size -orthoRectifFilter->SetOutputSize(size); - -VectorImageType::SpacingType spacing; -spacing[0] = atof(argv[7]); -spacing[1] = atof(argv[8]); -orthoRectifFilter->SetOutputSpacing(spacing); - -VectorImageType::PointType origin; -origin[0] = strtod(argv[3], NULL); //Origin easting -origin[1] = strtod(argv[4], NULL); //Origin northing -orthoRectifFilter->SetOutputOrigin(origin); - -utmMapProjection->SetZone(atoi(argv[9])); -utmMapProjection->SetHemisphere(argv[10][0]); -orthoRectifFilter->SetMapProjection(utmMapProjection); - -// Deformation Field spacing -VectorImageType::SpacingType gridSpacing; -gridSpacing[0] = atof(argv[11]); -gridSpacing[1] = -atof(argv[11]); -orthoRectifFilter->SetDeformationFieldSpacing(gridSpacing); - -VectorImageType::PixelType no_data(reader->GetOutput()->GetNumberOfComponentsPerPixel()); -no_data.Fill(0); -orthoRectifFilter->SetEdgePaddingValue(no_data); - -writer->SetInput(orthoRectifFilter->GetOutput()); -writer->SetNumberOfDivisionsTiledStreaming(4); -writer->Update(); - -return EXIT_SUCCESS; */ - } @@ -529,7 +303,7 @@ int otbMulti3DMapToDEMFilter(int argc, char* argv[]) for(unsigned int i=0; i<mapSize; i++) { multiFilter->Set3DMapInput(i,mapReaderList->GetNthElement(i)->GetOutput()); - // multiFilter->SetMapKeywordList(i,mapReaderList->GetNthElement(i)->GetOutput()->GetImageKeywordlist()); + multiFilter->SetMaskInput(i,maskReaderList->GetNthElement(i)->GetOutput()); } multiFilter->SetOutputParametersFrom3DMap(); @@ -537,7 +311,6 @@ int otbMulti3DMapToDEMFilter(int argc, char* argv[]) WriterType::Pointer writer = WriterType::New(); multiFilter->SetNumberOfThreads(atoi(argv[argc-2])); - //multiFilter->Update(); writer->SetInput(multiFilter->GetOutput()); diff --git a/Modules/Segmentation/Conversion/test/CMakeLists.txt b/Modules/Segmentation/Conversion/test/CMakeLists.txt index 363687e5c3cd789d24cdeaa9b26b594e2f56513d..b704bd6275d83837200861e7448c820f89dda0ac 100644 --- a/Modules/Segmentation/Conversion/test/CMakeLists.txt +++ b/Modules/Segmentation/Conversion/test/CMakeLists.txt @@ -195,19 +195,11 @@ otb_add_test(NAME bfTvVectorDataRasterizeFilterSHP COMMAND otbConversionTestDriv #4 25 0.1 100 #) -otb_add_test(NAME obTvLabelMapToVectorDataFilter2 COMMAND otbConversionTestDriver - --compare-ogr ${NOTOL} - ${BASELINE_FILES}/obTvLabelMapToVectorDataFilter.shp - ${TEMP}/obTvLabelMapToVectorDataFilter2.shp - otbLabelMapToVectorDataFilter - ${INPUTDATA}/rcc8_mire5.png - ${TEMP}/obTvLabelMapToVectorDataFilter2.shp) - otb_add_test(NAME obTvLabelMapToVectorDataFilter COMMAND otbConversionTestDriver --compare-ogr ${NOTOL} ${BASELINE_FILES}/obTvLabelMapToVectorDataFilter.shp ${TEMP}/obTvLabelMapToVectorDataFilter.shp otbLabelMapToVectorDataFilter - ${INPUTDATA}/rcc8_mire1.png + ${INPUTDATA}/labelImage_UnsignedChar.tif ${TEMP}/obTvLabelMapToVectorDataFilter.shp) diff --git a/Modules/Segmentation/Metrics/test/CMakeLists.txt b/Modules/Segmentation/Metrics/test/CMakeLists.txt index 1b286013d0ad582630ea14378ed22f38afca90aa..63f104f6ca630af3b11dd5fb2bc1333a70caad3c 100644 --- a/Modules/Segmentation/Metrics/test/CMakeLists.txt +++ b/Modules/Segmentation/Metrics/test/CMakeLists.txt @@ -47,8 +47,8 @@ otb_add_test(NAME obTvHooverMatrixFilter COMMAND otbMetricsTestDriver ${BASELINE_FILES}/obTvHooverMatrixFilter.txt ${TEMP}/obTvHooverMatrixFilter.txt otbHooverMatrixFilter - ${INPUTDATA}/Seg1InputForRCC8Graph.tif - ${INPUTDATA}/Seg2InputForRCC8Graph.tif + ${INPUTDATA}/labelImage_UnsignedChar.tif + ${INPUTDATA}/labelImage_UnsignedChar.tif ${TEMP}/obTvHooverMatrixFilter.txt ) diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h index 458213a22aa04a63a47064c59030aedf6441e07c..570c6cd0ea1e29a0c77b90fa3019ae9245204711 100644 --- a/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h +++ b/Modules/Segmentation/MorphologicalProfiles/include/otbClosingOpeningMorphologicalFilter.h @@ -39,8 +39,7 @@ namespace otb * of composition of the two basic morphological operation, the filtered details are dark * on a brighter background. * - * \sa ClosingOpeningMorphologicalFilter, - * MorphologicalPyramidAnalysisFilter + * \sa ClosingOpeningMorphologicalFilter * * \ingroup OTBMorphologicalProfiles */ diff --git a/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h b/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h index df47e1bd469765126ecabfb15e4a2a15163bf1a0..3a329241c20a8bfa13ad8771b3edb46c6d9b4d73 100644 --- a/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h +++ b/Modules/Segmentation/MorphologicalProfiles/include/otbOpeningClosingMorphologicalFilter.h @@ -39,8 +39,7 @@ namespace otb * of composition of the two basic morphological operation, the filtered details are dark * on a brighter background. * - * \sa ClosingOpeningMorphologicalFilter, - * MorphologicalPyramidAnalyseFilter + * \sa ClosingOpeningMorphologicalFilter * * \ingroup OTBMorphologicalProfiles */ diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp index e57304fb7751a2ff0e330741cc179a2cb75c81d9..40aebcad27a6c1d6f3c9cbd86fee36a47b0b1c48 100644 --- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp +++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSarSensorModel.cpp @@ -1058,29 +1058,39 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT theAzimuthTimeOffset = count > 0 ? cumulAzimuthTime / count : DurationType(0); - // Then, fix the range time - count=0; + // Patch_locS1 : do not fix the range time + // This fix takes GCPs as inputs to calculate an offset in range dimension. + // However for recent S1 products (after March 2017 with IPF >= 2.82), GCPs contain wrong values + // for lat/lon coordinates => the range time offset is wrong and shift the localization. + // To avoid wrong offset, fixRangeTimeWithGCPs is always set to false + bool fixRangeTimeWithGCPs = false; + + if (fixRangeTimeWithGCPs) + { + // Then, fix the range time + count=0; - for(std::vector<GCPRecordType>::const_iterator gcpIt = theGCPRecords.begin(); gcpIt!=theGCPRecords.end();++gcpIt) - { - ossimDpt estimatedImPt; - TimeType estimatedAzimuthTime; - double estimatedRangeTime; + for(std::vector<GCPRecordType>::const_iterator gcpIt = theGCPRecords.begin(); gcpIt!=theGCPRecords.end();++gcpIt) + { + ossimDpt estimatedImPt; + TimeType estimatedAzimuthTime; + double estimatedRangeTime; - ossimEcefPoint sensorPos; - ossimEcefVector sensorVel; + ossimEcefPoint sensorPos; + ossimEcefVector sensorVel; - // Estimate times - const bool s1 = this->worldToAzimuthRangeTime(gcpIt->worldPt,estimatedAzimuthTime,estimatedRangeTime, sensorPos, sensorVel); + // Estimate times + const bool s1 = this->worldToAzimuthRangeTime(gcpIt->worldPt,estimatedAzimuthTime,estimatedRangeTime, sensorPos, sensorVel); - if(s1) - { - cumulRangeTime+=-estimatedRangeTime+gcpIt->slantRangeTime; - ++count; - } - } + if(s1) + { + cumulRangeTime+=-estimatedRangeTime+gcpIt->slantRangeTime; + ++count; + } + } - theRangeTimeOffset = count > 0 ? cumulRangeTime/count : 0; + theRangeTimeOffset = count > 0 ? cumulRangeTime/count : 0; + } } void get( @@ -1268,7 +1278,6 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT for (std::size_t idx=0 ; idx!=nbCoords ; ++idx) { const int pos = s_printf(prefix_, "%s[%d].", sr_gr_prefix.c_str(), idx); - assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix_)); std::string prefix(prefix_, pos); ossimSarSensorModel::CoordinateConversionRecordType coordRecord; @@ -1301,7 +1310,6 @@ bool ossimSarSensorModel::worldToAzimuthRangeTime(const ossimGpt& worldPt, TimeT for (std::size_t idx=0 ; idx!=conversionRecords.size() ; ++idx) { const int pos = s_printf(prefix_, "%s[%d].", sr_gr_prefix.c_str(), idx); - assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix_)); std::string prefix(prefix_, pos); diff --git a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp index 8f428aacada11d02b5b9f4557d96f1c635d13eec..3832701fe39a34a17079a43d8ff1a38a85aa6877 100644 --- a/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp +++ b/Modules/ThirdParty/OssimPlugins/src/ossim/ossimSentinel1Model.cpp @@ -1114,7 +1114,7 @@ namespace ossimplugins for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode, ++idx) { int pos = s_printf(prefix, "%s[%d].", sr_gr_prefix.c_str(), idx); - assert(pos >= sizeof(SR_PREFIX)+4 && pos < sizeof(prefix)); + assert(pos >= SR_PREFIX.size()+4 && pos < sizeof(prefix)); addMandatory(theProductKwl, prefix + keyAzimuthTime,**itNode, attAzimuthTime); addMandatory(theProductKwl, prefix + rg0_xpath, **itNode, rg0_xpath); @@ -1153,7 +1153,7 @@ namespace ossimplugins for(std::vector<ossimRefPtr<ossimXmlNode> >::iterator itNode = xnodes.begin(); itNode!=xnodes.end();++itNode,++idx) { int pos = s_printf(prefix, "%s[%d].", GCP_PREFIX.c_str(), idx); - assert(pos >= sizeof(SR_PREFIX)+4 && pos < 1024); + assert(pos >= GCP_PREFIX.size()+4 && pos < sizeof(prefix)); #if defined(USE_BOOST_TIME) const TimeType azimuthTime = getTimeFromFirstNode(**itNode, attAzimuthTime); add(theProductKwl, prefix, attAzimuthTime, azimuthTime); diff --git a/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h b/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h index 133e9f76bca633ee3477f0278e7bd54c702c704b..8d3cf2e07d7c007a1e14927c0cde0739769d6af8 100644 --- a/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h +++ b/Modules/Visualization/Mapla/include/mvdMaplaMainWindow.h @@ -143,8 +143,7 @@ protected slots: /** */ - void OnApplicationToLaunchSelected( const QString & name, - const QString & doc ); + void OnApplicationToLaunchSelected( const QString & name ); /** */ diff --git a/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx index 8dea17a2341712d65d5b903259255db9ecfe2b5f..d4fba7efebd1ab03852d7d01d0aa731bd5b61308 100644 --- a/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx +++ b/Modules/Visualization/Mapla/src/mvdMaplaMainWindow.cxx @@ -153,10 +153,10 @@ MaplaMainWindow QObject::connect( m_ApplicationsToolBoxController->GetWidget(), - SIGNAL( ApplicationToLaunchSelected( const QString &, const QString & ) ), + SIGNAL( ApplicationToLaunchSelected( const QString & ) ), // to: this, - SLOT( OnApplicationToLaunchSelected(const QString &, const QString & ) ) + SLOT( OnApplicationToLaunchSelected(const QString & ) ) ); #endif @@ -215,8 +215,7 @@ MaplaMainWindow /*****************************************************************************/ void MaplaMainWindow -::OnApplicationToLaunchSelected( const QString & appName, - const QString & ) +::OnApplicationToLaunchSelected( const QString & appName ) { #ifdef OTB_USE_QT diff --git a/Modules/Visualization/Monteverdi/include/mvdMainWindow.h b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h index e3341bf12f61862b9a76cba5a8b68ecb3d881fa5..87a8a5d7c74ef9dfa22fdc2a567e6aa2b0889b6c 100644 --- a/Modules/Visualization/Monteverdi/include/mvdMainWindow.h +++ b/Modules/Visualization/Monteverdi/include/mvdMainWindow.h @@ -221,7 +221,7 @@ protected slots: /** */ #if defined( OTB_USE_QT ) && USE_OTB_APPS - void OnApplicationToLaunchSelected( const QString & appName, const QString & docName ); + void OnApplicationToLaunchSelected( const QString & appName ); #endif // defined( OTB_USE_QT ) && USE_OTB_APPS /** */ diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx index bc26e07f5895a108c5fe37dfa81407d5f3fd2190..9f0fe908368819f0479be97b75de93697d1bfdc2 100644 --- a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx +++ b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx @@ -1372,56 +1372,6 @@ MainWindow { assert( e!=NULL ); - { - // - // List OTB-application widgets. - typedef QList< mvd::Wrapper::QtWidgetView * > QtWidgetViewList; - - QtWidgetViewList c( findChildren< mvd::Wrapper::QtWidgetView * >() ); - - QStringList names; - - // - // Find out which OTB-applications are running. - for( QtWidgetViewList::iterator it( c.begin() ); - it!=c.end(); - ++ it ) - { - assert( *it ); - - if( !( *it )->IsClosable() ) - { - assert( ( *it )->GetModel()->GetApplication() ); - - // qDebug() << "OTB-application:" << ( *it )->GetApplication()->GetDocName(); - - names.push_back( ( *it )->GetModel()->GetApplication()->GetDocName() ); - } - } - - // - // If some OTB-application is running, display warning, names and - // prevent to close. - if( !names.isEmpty() ) - { - QMessageBox::warning( - this, - tr( "Warning!" ), - tr( - PROJECT_NAME - " cannot exit while some OTB-application is running!\n\n" - "Please wait for following OTB-applicatio(s) to exit:\n- %1" - ) - .arg( names.join( "\n- " ) ) - ); - - e->ignore(); - - return; - } - } - - { assert( I18nCoreApplication::Instance()!=NULL ); assert( I18nCoreApplication::Instance()->GetModel()== @@ -1703,9 +1653,9 @@ MainWindow // # Step 2 : setup connections QObject::connect( appWidget, - SIGNAL( ApplicationToLaunchSelected(const QString &, const QString &) ), + &mvd::ApplicationsToolBox::ApplicationToLaunchSelected, this, - SLOT( OnApplicationToLaunchSelected(const QString &, const QString &) ) + &mvd::MainWindow::OnApplicationToLaunchSelected ); // # Step 3 : connect close slots @@ -2174,8 +2124,7 @@ MainWindow void MainWindow -::OnApplicationToLaunchSelected( const QString & appName, - const QString & /**docName*/ ) +::OnApplicationToLaunchSelected( const QString & appName ) { assert( Application::ConstInstance()!=NULL ); assert( Application::ConstInstance()->GetOTBApplicationsModel()!=NULL ); diff --git a/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h b/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h index 05333bd3be94de4d1b56f1250595bbe071aa50f8..cf52e363b9dd479dcb19aba87d71826f5065b873 100644 --- a/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h +++ b/Modules/Visualization/MonteverdiCore/include/mvdApplicationsBrowser.h @@ -138,8 +138,7 @@ public slots: // // Signals. signals: - void AvailableApplicationsTagsChanged(const ApplicationsTagContainer &, - const ApplicationDocNameToNameMap &); + void AvailableApplicationsTagsChanged(const ApplicationsTagContainer &); /*-[ PROTECTED SECTION ]---------------------------------------------------*/ @@ -164,8 +163,6 @@ private: std::string m_AutoLoadPath; - ApplicationDocNameToNameMap m_DocNameToNameMap; - /*-[ PRIVATE SLOTS SECTION ]-----------------------------------------------*/ // diff --git a/Modules/Visualization/MonteverdiCore/include/mvdTypes.h b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h index ceaaa467fc4e66e89e4af93e9a916e8ef9b9f039..e8241127f31a273139d23b3898dc294a1b46b838 100644 --- a/Modules/Visualization/MonteverdiCore/include/mvdTypes.h +++ b/Modules/Visualization/MonteverdiCore/include/mvdTypes.h @@ -234,10 +234,6 @@ struct PixelInfo /*******************************************************************************/ /* Type definitions for wrapped applications */ -/** - */ -typedef std::map< std::string, std::string > ApplicationDocNameToNameMap; - /** */ typedef std::map< std::string, StringVector > ApplicationsTagContainer; diff --git a/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx b/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx index a52e15badb719402a695fa58dbff066a90294665..82ed1fa7b73a5a9ad4bdc19f3872f358101da382 100644 --- a/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx +++ b/Modules/Visualization/MonteverdiCore/src/mvdApplicationsBrowser.cxx @@ -143,10 +143,6 @@ ApplicationsBrowser // get tags StringVector vtags( application->GetDocTags() ); - // - // fill the OTBApps 'docName <-> name' map - m_DocNameToNameMap[ application->GetDocName() ] = appName; - return vtags; } @@ -155,10 +151,6 @@ void ApplicationsBrowser ::SearchAvailableApplicationsTags() { - // - // clear previously filled map - m_DocNameToNameMap.clear(); - // // get all the applications in the search path StringVector vapp( GetAvailableApplications() ); @@ -216,7 +208,7 @@ ApplicationsBrowser // // emit a signal with the ApplicationsTagContainer as // parameter - emit AvailableApplicationsTagsChanged(outputContainer, m_DocNameToNameMap); + emit AvailableApplicationsTagsChanged(outputContainer); } /*******************************************************************************/ diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h index 378e76108c3abb7f40d031bf23bef5fd2f94fcb4..2d58061ed4eb36ab42cc460e65d639898badb32a 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationLauncher.h @@ -62,7 +62,7 @@ public: otb::Wrapper::Application::Pointer PrepareApplication(const QString& appName, bool isStandalone = false) const; - otb::Wrapper::QtMainWindow* NewOtbApplicationWindow(const QString& appName, bool isStandalone = false, QWidget* p = nullptr, Qt::WindowFlags = 0) const; + otb::Wrapper::QtMainWindow* NewOtbApplicationWindow(const QString& appName, bool isStandalone = false, QWidget* p = nullptr) const; }; } // namespace mvd diff --git a/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h index 3d666d6ed56a0072604b5054462698687170c7f5..736caf9a900d78d316476e5b017500e7bf817f63 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdApplicationsToolBox.h @@ -109,8 +109,7 @@ public: // // Public SLOTS. public slots: - void OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer& appsTags, - const ApplicationDocNameToNameMap& docNameToNameMap); + void OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer& appsTags); void OnSearchBoxChanged( const QString & search ); void OnAlgorithmTreeDoubleClick( QTreeWidgetItem * item , int column ); @@ -119,7 +118,7 @@ public slots: // // Signals. signals: - void ApplicationToLaunchSelected(const QString &, const QString &); + void ApplicationToLaunchSelected(const QString &); /*-[ PROTECTED SECTION ]---------------------------------------------------*/ @@ -153,12 +152,6 @@ private: bool IsSearchTextMatchAnyAlgorithm( const QString & tagName, const QString & search ); - /** - * \brief Helper method to get the DocName of an application from an - * application name - */ - QString GetApplicationDocNameByApplicationName( const QString & appName ); - // // Private attributes. @@ -173,11 +166,6 @@ private: */ ApplicationsTagContainer m_AppTags; - /** - * \brief map storing applications docName and appName association - */ - ApplicationDocNameToNameMap m_AppsDocNameToNameMap; - /** * \brief text to search in the widget tree */ diff --git a/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h b/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h index 1db4b7fd90b8d4ae6ad5a05a556f006fd669fdfa..71d68131811bd8a51d0bbc1f05c11ff579e02075 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdPixelDescriptionWidget.h @@ -150,11 +150,6 @@ private: // */ // ApplicationsTagContainer m_AppTags; - // /** - // * \brief map storing applications docName and appName association - // */ - // ApplicationDocNameToNameMap m_AppsDocNameToNameMap; - /** * \brief text to search in the widget tree */ diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h index 313f8f1537af75ef500d0bff91a93d1b94bd204f..c7143258d95e0c5b4f2e8e95c59c6ff9edfbaef8 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h @@ -49,12 +49,10 @@ #include "otbWrapperQtWidgetInputFilenameListParameter.h" #include "otbWrapperQtWidgetInputImageParameter.h" #include "otbWrapperQtWidgetInputImageListParameter.h" -#include "otbWrapperQtWidgetInputProcessXMLParameter.h" #include "otbWrapperQtWidgetInputVectorDataParameter.h" #include "otbWrapperQtWidgetInputVectorDataListParameter.h" #include "otbWrapperQtWidgetOutputFilenameParameter.h" #include "otbWrapperQtWidgetOutputImageParameter.h" -#include "otbWrapperQtWidgetOutputProcessXMLParameter.h" #include "otbWrapperQtWidgetOutputVectorDataParameter.h" #include "otbWrapperQtWidgetParameterFactory.h" #include "otbWrapperQtWidgetListEditWidget.h" @@ -90,7 +88,7 @@ namespace Wrapper */ template< typename W > void -SetupForFilenameDrop( W* widget, const char* text =NULL ); +SetupForFilenameDrop( W* widget ); /** */ @@ -225,21 +223,6 @@ public: inline result_type operator () ( argument_type widget ) const; }; -/** - * \class InputProcessXMLInitializer - * - * \ingroup OTBMonteverdiGUI - * - * \brief WIP. - */ -class InputProcessXMLInitializer : public std::unary_function< - otb::Wrapper::QtWidgetInputProcessXMLParameter *, - void > -{ -public: - inline result_type operator () ( argument_type widget ) const; -}; - /** * \class OutputImageInitializer * @@ -293,22 +276,6 @@ public: inline result_type operator () ( argument_type widget ) const; }; -/** - * \class OutputProcessXMLInitializer - * - * \ingroup OTBMonteverdiGUI - * - * \brief WIP. - */ -class OutputProcessXMLInitializer : public std::unary_function< - otb::Wrapper::QtWidgetOutputProcessXMLParameter *, - void - > -{ -public: - inline result_type operator () ( argument_type widget ) const; -}; - /** * \class ToolTipInitializer * @@ -376,7 +343,7 @@ FileSelectionInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -387,7 +354,7 @@ InputImageInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -409,7 +376,7 @@ InputFilenameInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -431,7 +398,7 @@ InputVectorDataInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -445,17 +412,6 @@ InputVectorDataListInitializer // Drop support is done by ParameterListInitializer } -/*****************************************************************************/ -inline -InputProcessXMLInitializer::result_type -InputProcessXMLInitializer -::operator () ( argument_type widget ) const -{ - assert( widget!=NULL ); - - SetupForFilenameDrop( widget, "You can drop filename here." ); -} - /*****************************************************************************/ inline ToolTipInitializer::result_type @@ -494,7 +450,7 @@ OutputImageInitializer if( m_Prefix.isEmpty() ) { - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -518,7 +474,7 @@ OutputVectorDataInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -534,7 +490,7 @@ OutputFilenameInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -542,25 +498,6 @@ OutputFilenameInitializer SetupOutputFilename( widget ); } -/*****************************************************************************/ -inline -OutputProcessXMLInitializer::result_type -OutputProcessXMLInitializer -::operator () ( argument_type widget ) const -{ - assert( widget!=NULL ); - - SetupForFilenameDrop( widget, "You can drop filename here." ); - - assert( qApp!=NULL ); - assert( !qApp->arguments().empty() ); - - // MANTIS-1103 - // { - // SetupOutputFilename( widget ); - // } -} - /*****************************************************************************/ inline ParameterListInitializer::result_type @@ -592,7 +529,7 @@ ParameterListInitializer /*****************************************************************************/ template< typename W > void -SetupForFilenameDrop( W* widget, const char* text ) +SetupForFilenameDrop( W* widget ) { assert( widget!=NULL ); @@ -602,15 +539,12 @@ SetupForFilenameDrop( W* widget, const char* text ) // Setup widget. bool signalsBlocked = lineEdit->blockSignals( true ); { - if( text!=NULL ) - { lineEdit->setPlaceholderText( QCoreApplication::translate( "mvd::Wrapper::QtWidgetView", - text + "You can drop a file here" ) ); - } // lineEdit->setReadOnly( true ); diff --git a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h index 146c4c250d0682939f48d03327d329cde971f7e6..931a561b2d9c358e6e6ecea635bcde0d8d78dad5 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetView.h @@ -64,18 +64,10 @@ namespace Wrapper class OTBMonteverdiGUI_EXPORT QtWidgetView : public otb::Wrapper::QtWidgetView { - /*-[ QOBJECT SECTION ]-----------------------------------------------------*/ - Q_OBJECT - /*-[ PUBLIC SECTION ]------------------------------------------------------*/ - -// -// Public methods. public: - /** - */ static char const * const OBJECT_NAME; /** \brief Constructor. */ @@ -86,30 +78,18 @@ public: /** \brief Destructor. */ ~QtWidgetView() override; -protected: + bool BeforeExecuteButtonClicked() override; +protected: QWidget* CreateInputWidgets() override; -protected slots: - - /** extend the behaviour of base class OnExecButtonClicked */ - void OnExecButtonClicked() override; - - /** modify the behaviour of base class OnExceptionRaised - */ - void OnExceptionRaised( QString what ) override; - private: QtWidgetView(const QtWidgetView&) = delete; void operator=(const QtWidgetView&) = delete; - /** - */ void SetupParameterWidgets( QWidget* widget ); - /** - */ void SetupFileSelectionWidget( QWidget * ); private slots: @@ -119,12 +99,8 @@ private slots: // image filename{s} set by the user in this OTB application (if any). void OnApplicationExecutionDone( int ); - /** - */ inline void OnFileSelectionWidgetAdded0( QWidget * ); - /** - */ inline void OnFileSelectionWidgetAdded1( QWidget * ); }; @@ -132,16 +108,12 @@ private slots: } // end namespace 'mvd' -/*****************************************************************************/ -/* INLINE SECTION */ - namespace mvd { namespace Wrapper { -/*******************************************************************************/ inline void QtWidgetView @@ -150,7 +122,6 @@ QtWidgetView SetupFileSelectionWidget( widget ); } -/*******************************************************************************/ inline void QtWidgetView diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx index 61a40b9e6996dbddaabc9c9b12d4121d54244da3..b3ef6b7baf8217938c4edebc1e13e0aa1b4b4d0a 100644 --- a/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx +++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationLauncher.cxx @@ -179,12 +179,7 @@ ApplicationLauncher } -otb::Wrapper::QtMainWindow* -ApplicationLauncher -::NewOtbApplicationWindow( const QString & appName, - bool isStandalone, - QWidget* parent, - Qt::WindowFlags flags ) const +otb::Wrapper::QtMainWindow* ApplicationLauncher ::NewOtbApplicationWindow(const QString& appName, bool isStandalone, QWidget* parent) const { // Setup the otb application auto otbApp = PrepareApplication(appName, isStandalone); @@ -194,7 +189,7 @@ ApplicationLauncher gui->CreateGui(); // Make the application window - auto window = new ::otb::Wrapper::QtMainWindow(otbApp, gui, parent, flags | Qt::Window); + auto window = new ::otb::Wrapper::QtMainWindow(otbApp, gui, parent); return window; } diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx index 24e6d71aadbae11277eddc76ce815ff09890e49d..d3b8403e563dcbe9f95c5db9f0686edb3c214ceb 100644 --- a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx +++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.cxx @@ -59,7 +59,6 @@ namespace mvd enum COLUMN { COLUMN_NAME = 0, - COLUMN_TITLE, // COLUMN_COUNT, }; @@ -86,7 +85,6 @@ ApplicationsToolBox QWidget( p, flags ), m_UI( new mvd::Ui::ApplicationsToolBox() ), m_AppTags(), - m_AppsDocNameToNameMap(), m_SearchText() { m_UI->setupUi( this ); @@ -201,17 +199,10 @@ ApplicationsToolBox // get current app name QString name( itApps->c_str() ); - // get current app DocName - QString title( - GetApplicationDocNameByApplicationName( name ) - ); - assert( !name.isEmpty() ); - assert( !title.isEmpty() ); - // does the current algorithm DocName match the search text + // does the current algorithm name match the search text if ( m_SearchText.isEmpty() || - title.contains( search, Qt::CaseInsensitive ) || name.contains( search, Qt::CaseInsensitive ) ) { // @@ -220,10 +211,6 @@ ApplicationsToolBox new QTreeWidgetItem( cmainItem, ITEM_TYPE_APPLICATION ); secItem->setText( COLUMN_NAME, name ); - secItem->setText( COLUMN_TITLE, title ); - - secItem->setToolTip( COLUMN_NAME, title ); - secItem->setIcon( COLUMN_NAME, QIcon( ":/icons/process" ) ); } } @@ -234,7 +221,6 @@ ApplicationsToolBox m_UI->m_AlgorithmsTree->expandAll(); m_UI->m_AlgorithmsTree->resizeColumnToContents( COLUMN_NAME ); - m_UI->m_AlgorithmsTree->resizeColumnToContents( COLUMN_TITLE ); } /*******************************************************************************/ @@ -258,11 +244,11 @@ ApplicationsToolBox { QString name( FromStdString( *itApps ) ); - if( name.contains( search, Qt::CaseInsensitive ) || - GetApplicationDocNameByApplicationName( name ) - .contains( search, Qt::CaseInsensitive ) ) + if( name.contains( search, Qt::CaseInsensitive ) ) + { return true; } + } return false; } @@ -274,36 +260,7 @@ ApplicationsToolBox { assert( !appName.isEmpty() ); - emit ApplicationToLaunchSelected( - appName, - GetApplicationDocNameByApplicationName( appName ) - ); -} - -/*******************************************************************************/ -QString -ApplicationsToolBox -::GetApplicationDocNameByApplicationName( const QString & appName ) -{ - QString docName(""); - - // find the pair corresponding to the tagName - ApplicationDocNameToNameMap::const_iterator itDocNames = m_AppsDocNameToNameMap.begin(); - - while( itDocNames != m_AppsDocNameToNameMap.end() ) - { - // retrieve the appName in the map - if ( appName == QString( (*itDocNames).second.c_str() ) ) - { - // - // return the relative docName - return QString ( (*itDocNames).first.c_str() ); - } - - ++itDocNames; - } - - return docName; + emit ApplicationToLaunchSelected(appName); } /*******************************************************************************/ @@ -311,15 +268,11 @@ ApplicationsToolBox /*******************************************************************************/ void ApplicationsToolBox -::OnAvailableApplicationsTagsChanged(const ApplicationsTagContainer& appsTags, - const ApplicationDocNameToNameMap& docNameToNameMap) +::OnAvailableApplicationsTagsChanged(const ApplicationsTagContainer& appsTags) { // rememeber the map m_AppTags = appsTags; - // remember the OTB applications docName <-> Name association - m_AppsDocNameToNameMap = docNameToNameMap; - // fill the tree with the application FillTreeUsingTags(); } @@ -342,8 +295,6 @@ void ApplicationsToolBox ::OnAlgorithmTreeDoubleClick( QTreeWidgetItem * item , int column ) { - // qDebug() << item << column; - if( item->type()!=ITEM_TYPE_APPLICATION ) return; @@ -352,32 +303,6 @@ ApplicationsToolBox if( text.isEmpty() ) return; - switch( column ) - { - case COLUMN_NAME: - break; - - case COLUMN_TITLE: - { - ApplicationDocNameToNameMap::const_iterator it( - m_AppsDocNameToNameMap.find( - ToStdString( text ) - ) - ); - - assert( it!=m_AppsDocNameToNameMap.end() ); - - assert( it->second.empty() ); - - text = FromStdString( it->second ); - } - break; - - default: - assert( false && "Unexpected enum value." ); - break; - } - LaunchApplication( text ); } diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui index bc95dd74053e246b3a655e546237932c72dda149..68b0c3a97e20efa884ca972b15732a977af89189 100644 --- a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui +++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBox.ui @@ -23,7 +23,16 @@ <locale language="C" country="AnyCountry"/> </property> <layout class="QGridLayout" name="gridLayout"> - <property name="margin"> + <property name="leftMargin"> + <number>3</number> + </property> + <property name="topMargin"> + <number>3</number> + </property> + <property name="rightMargin"> + <number>3</number> + </property> + <property name="bottomMargin"> <number>3</number> </property> <property name="spacing"> @@ -40,6 +49,9 @@ <property name="headerHidden"> <bool>false</bool> </property> + <property name="columnCount"> + <number>1</number> + </property> <attribute name="headerVisible"> <bool>true</bool> </attribute> @@ -51,11 +63,6 @@ <string>Name</string> </property> </column> - <column> - <property name="text"> - <string>Title</string> - </property> - </column> </widget> </item> </layout> diff --git a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx index 6d6e75e9742035ba3ff7c7d72a1893fc0f87e1b0..9cd449469a4498ad3eda0cbe7e81f2f03b1ac556 100644 --- a/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx +++ b/Modules/Visualization/MonteverdiGui/src/mvdApplicationsToolBoxController.cxx @@ -92,14 +92,10 @@ ApplicationsToolBoxController // // connections QObject::connect( - appModel->GetBrowser(), - SIGNAL( - AvailableApplicationsTagsChanged( const ApplicationsTagContainer&, - const ApplicationDocNameToNameMap& ) ), + appModel->GetBrowser(), + SIGNAL( AvailableApplicationsTagsChanged( const ApplicationsTagContainer&) ), widget, - SLOT( - OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer&, - const ApplicationDocNameToNameMap& ) ) + SLOT( OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer& ) ) ); } @@ -121,14 +117,9 @@ ApplicationsToolBoxController // disconnect app browser QObject::disconnect( appModel->GetBrowser(), - SIGNAL( - AvailableApplicationsTagsChanged( const ApplicationsTagContainer&, - const ApplicationDocNameToNameMap& ) ), + SIGNAL( AvailableApplicationsTagsChanged(const ApplicationsTagContainer&) ), widget, - SLOT( - OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer&, - const ApplicationDocNameToNameMap& ) ) - ); + SLOT( OnAvailableApplicationsTagsChanged( const ApplicationsTagContainer& ) )); } /*******************************************************************************/ diff --git a/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx index 53c723bc811bc7fba33e89e8d032f9c74df110bc..77bdbd9dc6c5c519f1c85d06778739abdb555964 100644 --- a/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx +++ b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx @@ -116,13 +116,6 @@ char const * const QtWidgetView ::OBJECT_NAME = "mvd::Wrapper::QtWidgetView"; -/*****************************************************************************/ -/* STATIC IMPLEMENTATION SECTION */ - - -/*****************************************************************************/ -/* CLASS IMPLEMENTATION SECTION */ -/*****************************************************************************/ QtWidgetView ::QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp, QWidget* p, @@ -131,10 +124,6 @@ QtWidgetView { setObjectName( QtWidgetView::OBJECT_NAME ); - m_IconPathDone = std::string("<img src=\":/icons/done\" width=\"16\" height=\"16\" />"); - m_IconPathFailed = std::string("<img src=\":/icons/failed\" width=\"16\" height=\"16\" />"); - - // // need to be connected to the end of a process QObject::connect( GetModel(), @@ -158,10 +147,7 @@ QtWidgetView { QWidget * widget = otb::Wrapper::QtWidgetView::CreateInputWidgets(); - otb::Wrapper::QtWidgetParameterBase *paramWidget = - widget->findChild<otb::Wrapper::QtWidgetParameterBase*>(); - - SetupParameterWidgets(paramWidget); + SetupParameterWidgets(widget); return widget; } @@ -177,7 +163,6 @@ QtWidgetView //SetupWidget( widget, InputFilenameListInitializer() ); SetupWidget( widget, InputImageInitializer() ); //SetupWidget( widget, InputImageListInitializer() ); - SetupWidget( widget, InputProcessXMLInitializer() ); SetupWidget( widget, InputVectorDataInitializer() ); //SetupWidget( widget, InputVectorDataListInitializer() ); SetupWidget( widget, ParameterListInitializer() ); @@ -186,7 +171,6 @@ QtWidgetView #endif SetupWidget( widget, OutputFilenameInitializer() ); - SetupWidget( widget, OutputProcessXMLInitializer() ); SetupWidget( widget, @@ -211,197 +195,90 @@ QtWidgetView initialize( qobject_cast< FileSelectionInitializer::argument_type >( widget ) ); } -/*******************************************************************************/ -/* SLOTS */ -/*******************************************************************************/ -void -QtWidgetView -::OnExecButtonClicked() +bool QtWidgetView::BeforeExecuteButtonClicked() { - if ( !IsRunning() ) + assert(GetModel() != NULL); + assert(GetModel()->GetApplication() != NULL); + assert(I18nCoreApplication::Instance() != NULL); + + // Get layer-stack, if any + StackedLayerModel* layerStack = I18nCoreApplication::Instance()->GetModel<StackedLayerModel>(); + + otb::Wrapper::Application::Pointer otbApp(GetModel()->GetApplication()); + + // Check output parameters of OTB-application + StringVector paramKeys(otbApp->GetParametersKeys()); + QStringList filenames1; + + KeyLayerAccumulator::KeyLayerPairList layers; + + for (StringVector::const_iterator it(paramKeys.begin()); it != paramKeys.end(); ++it) + { + if (otbApp->IsParameterEnabled(*it, true) && otbApp->HasValue(*it)) { - assert( GetModel()!=NULL ); - assert( GetModel()->GetApplication()!=NULL ); - - - assert( I18nCoreApplication::Instance()!=NULL ); - - // - // Get layer-stack, if any. - StackedLayerModel * layerStack = - I18nCoreApplication::Instance()->GetModel< StackedLayerModel >(); - - otb::Wrapper::Application::Pointer otbApp( GetModel()->GetApplication() ); - - // - // Check output parameters of OTB-application. - StringVector paramKeys( otbApp->GetParametersKeys() ); - QStringList filenames1; - - KeyLayerAccumulator::KeyLayerPairList layers; - QStringList filenames2; - - for( StringVector::const_iterator it( paramKeys.begin() ); - it!=paramKeys.end(); - ++it ) + otb::Wrapper::Parameter::Pointer param(otbApp->GetParameterByKey(*it)); + assert(!param.IsNull()); + + std::string filename; + + switch (otbApp->GetParameterType(*it)) { - if( otbApp->IsParameterEnabled( *it, true ) && - otbApp->HasValue( *it ) ) - { - otb::Wrapper::Parameter::Pointer param( otbApp->GetParameterByKey( *it ) ); - assert( !param.IsNull() ); - - // qDebug() - // << it->c_str() << ": type" << otbApp->GetParameterType( *it ); - - // const char* filename = NULL; - std::string filename; - - switch( otbApp->GetParameterType( *it ) ) - { - case otb::Wrapper::ParameterType_OutputFilename: - filename = - otb::DynamicCast< otb::Wrapper::OutputFilenameParameter >( param ) - ->GetValue(); - break; - // - // FILENAME. - // - // IMAGE. - case otb::Wrapper::ParameterType_OutputImage: - filename = - otb::DynamicCast< otb::Wrapper::OutputImageParameter >( param ) - ->GetFileName(); - break; - // - // VECTOR-DATA. - case otb::Wrapper::ParameterType_OutputVectorData: - filename = - otb::DynamicCast< otb::Wrapper::OutputVectorDataParameter >( param ) - ->GetFileName(); - break; - // - // NONE. - default: - break; + case otb::Wrapper::ParameterType_OutputFilename: + filename = otb::DynamicCast<otb::Wrapper::OutputFilenameParameter>(param)->GetValue(); + break; + + case otb::Wrapper::ParameterType_OutputImage: + filename = otb::DynamicCast<otb::Wrapper::OutputImageParameter>(param)->GetFileName(); + break; + + case otb::Wrapper::ParameterType_OutputVectorData: + filename = otb::DynamicCast<otb::Wrapper::OutputVectorDataParameter>(param)->GetFileName(); + break; + + default: + break; + } + + if (QFileInfo(filename.c_str()).exists()) + filenames1.push_back(filename.c_str()); + + if (layerStack != NULL) + { + KeyLayerAccumulator accumulator(std::for_each(layerStack->Begin(), layerStack->End(), KeyLayerAccumulator(filename, layers))); + } } - - if( QFileInfo( filename.c_str() ).exists() ) - filenames1.push_back( filename.c_str() ); - - if( layerStack!=NULL ) + } + + { + QString message; + + if (filenames1.size() == 1) { - KeyLayerAccumulator accumulator( - std::for_each( - layerStack->Begin(), - layerStack->End(), KeyLayerAccumulator( filename, layers ) - ) - ); - - if( accumulator.GetCount()>0 ) - filenames2.push_back( filename.c_str() ); + message = tr("Are you sure you want to overwrite file '%1'?").arg(filenames1.front()); } - } - } - + else if (filenames1.size() > 1) { - QString message; - - if( filenames1.size()==1 ) - { - // qDebug() - // << it->c_str() << ":" << QString( filename.c_str() ); - - message = - tr( "Are you sure you want to overwrite file '%1'?" ) - .arg( filenames1.front() ); - } - else if( filenames1.size()>1 ) - { - message = - tr( "Following files will be overwritten. Are you sure you want to continue?\n- %1" ) - .arg( filenames1.join( "\n- " ) ); - } - - if( !message.isEmpty() ) - { - QMessageBox::StandardButton button = - QMessageBox::question( - this, - PROJECT_NAME, - message, - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No - ); - - if( button==QMessageBox::No ) - return; - } + message = tr("Following files will be overwritten. Are you sure you want to continue?\n- %1").arg(filenames1.join("\n- ")); } - + + if (!message.isEmpty()) { - QString message; - - if( filenames2.size()==1 ) - { - // qDebug() - // << it->c_str() << ":" << QString( filename.c_str() ); - - message = - tr( "File '%1' is being viewed in " PROJECT_NAME " and will be concurrently overwritten by running this %2. File will be removed from layer-stack before running %2 and reloaded after.\n\nDo you want to continue?" ) - .arg( filenames2.front() ) - .arg( otbApp->GetDocName() ); - } - else if( filenames2.size()>1 ) - { - message = - tr( "Following files are being viewed in " PROJECT_NAME " and will be concurrently overwritter by running %2. Files will be removed from layer-stack before running %2. Do you want to continue?\n- %1" ) - .arg( filenames2.join( "\n- " ) ) - .arg( otbApp->GetDocName() ); - } - - if( !message.isEmpty() ) - { - QMessageBox::StandardButton button = - QMessageBox::question( - this, - PROJECT_NAME, - message, - QMessageBox::Yes | QMessageBox::No, - QMessageBox::No - ); - - if( button==QMessageBox::No ) - return; - - while( !layers.empty() ) - { - layerStack->Delete( layers.front().first ); - - layers.pop_front(); - } - } + QMessageBox::StandardButton button = QMessageBox::question(this, PROJECT_NAME, message, QMessageBox::Yes | QMessageBox::No, QMessageBox::No); + + if (button == QMessageBox::No) + return false; } } - otb::Wrapper::QtWidgetView::OnExecButtonClicked(); -} + // Delete from layer stack the images that will be overwritten and reloaded + while (!layers.empty()) + { + layerStack->Delete(layers.front().first); -/*******************************************************************************/ -void -QtWidgetView -::OnExceptionRaised( QString what ) -{ - qWarning() << what; + layers.pop_front(); + } -#if defined( OTB_DEBUG ) - QMessageBox::warning( - this, - PROJECT_NAME, - what, - QMessageBox::Ok - ); -#endif + return true; } /*******************************************************************************/ @@ -429,18 +306,6 @@ QtWidgetView return; } - /* - // Removed as per MVDX-259. - QMessageBox::information( - this, - PROJECT_NAME, - tr( "'%1' has succeeded.\n" - "Result(s) will be imported as dataset(s).\n") - .arg( otbApp->GetName() ), - QMessageBox::Ok - ); - */ - CountType count = 0; // diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h index 3baadd6f0f747b5f640b284fd3bd6a7aeab79254..738949669131df03fec89abd2318c0330a470fff 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h @@ -102,11 +102,8 @@ public: /** Check if the application has been initialized */ bool IsInitialized() const; - virtual void SetHaveInXML(bool); - virtual bool GetHaveInXML() const; - - virtual void SetHaveOutXML(bool); - virtual bool GetHaveOutXML() const; + void LoadParametersFromXML(const std::string& filename); + void SaveParametersToXML(const std::string& filename); /** Update the value of parameters for which no user value has been provided */ void UpdateParameters(); @@ -210,12 +207,6 @@ public: /* Returns the description of a parameter */ std::vector<std::string> GetChoiceNames(std::string paramKey); - /* Is the application ready to be executed : All the mandatory - * parameters have to be set - */ - /* Set the Parameter value and Update the UserFlag. used by xml parameter - */ - /* Set an integer value * * Can be called for types : @@ -652,10 +643,6 @@ public: std::string GetProgressDescription() const; - /** Doc element accessors. */ - virtual void SetDocName(const std::string&); - virtual const char* GetDocName() const; - virtual void SetDocLongDescription(const std::string&); virtual const char* GetDocLongDescription() const; @@ -673,6 +660,9 @@ public: void AddDocTag(const std::string&); + /** return wether the application has the "deprecated tag or not */ + bool IsDeprecated(); + DocExampleStructure::Pointer GetDocExample(); unsigned int GetNumberOfExamples(); std::string GetExampleComment(unsigned int id); @@ -690,9 +680,6 @@ public: */ std::vector< std::pair<std::string, std::string> > GetOutputParametersSumUp(); - /** If need to force readxml more than once in application */ - void ForceInXMLParseFlag(); - double GetLastExecutionTiming() const; virtual void SetDocLink(const std::string & link); @@ -816,16 +803,6 @@ protected: * by default seed initialization is based on time value*/ void AddRANDParameter(std::string paramKey, std::string paramName, unsigned int defaultValue); - void AddInXMLParameter() - { - GetParameterList()->AddInXMLParameter(); - } - - void AddOutXMLParameter() - { - GetParameterList()->AddOutXMLParameter(); - } - /** Remove the items added to the ListWidget */ void ClearChoices(std::string key); @@ -896,8 +873,6 @@ private: std::set<itk::ProcessObject::Pointer> m_Filters; - /** Long name of the application (that can be displayed...) */ - std::string m_DocName; /** Long and precise application description . */ std::string m_DocLongDescription; /** Doc example structure. Use GetDocExample() to access it */ @@ -916,11 +891,6 @@ private: /** Chrono to measure execution time */ otb::Stopwatch m_Chrono; - //rashad:: controls adding of -xml parameter. set to true by default - bool m_HaveInXML; - bool m_HaveOutXML; - bool m_IsInXMLParsed; - /** Flag is true when executing DoInit, DoUpdateParameters or DoExecute */ bool m_IsInPrivateDo; diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h deleted file mode 100644 index d4db58283c9294ef3b7dc1de2d841134f539823a..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputProcessXMLParameter.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbWrapperInputProcessXMLParameter_h -#define otbWrapperInputProcessXMLParameter_h -#include "otbWrapperApplication.h" -#include "otb_tinyxml.h" -#include <sstream> -#include <string> - -namespace otb -{ -namespace Wrapper -{ - -/** \class InputProcessXMLParameter - * \brief This class represent a xml filename parameter for the wrapper framework to load otb application. - * - * \ingroup OTBApplicationEngine - */ -class OTBApplicationEngine_EXPORT InputProcessXMLParameter - : public Parameter -{ -public: - /** Standard class typedef */ - typedef InputProcessXMLParameter Self; - typedef Parameter Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Defining ::New() static method */ - itkNewMacro(Self); - - /** RTTI support */ - itkTypeMacro(InputProcessXMLParameter, Parameter); - - itkGetStringMacro(FileName); - - bool HasValue() const override - { - if(m_FileName.empty()) - return false; - else - return true; - } - - virtual ParameterType GetType() const override - { - return ParameterType_InputProcessXML; - } - - std::string ToString() const override - { - return GetFileName(); - } - - void FromString(const std::string& value) override - { - SetFileName(value); - } - - // Get Value - //TODO otbGetObjectMemberMacro(StringParam, Value , std::string); - - bool SetFileName(std::string value); - - // Set Value - virtual void SetValue(const std::string value); - - ImagePixelType GetPixelTypeFromString(std::string pixTypeAsString); - - ParameterType GetParameterType(const Parameter* param) const; - - const std::string GetChildNodeTextOf(TiXmlElement *parentElement, std::string key); - - int Read(Application::Pointer application); - - void otbAppLogInfo(Application::Pointer app, std::string info); - -/* copied from Utilities/tinyXMLlib/tinyxml.cpp. Must have a FIX inside tinyxml.cpp */ - FILE* TiXmlFOpen( const char* filename, const char* mode ); - -protected: - - InputProcessXMLParameter(); - - /** Destructor */ - ~InputProcessXMLParameter() override; - -private: - - std::string m_FileName; - - InputProcessXMLParameter(const InputProcessXMLParameter &) = delete; - void operator =(const InputProcessXMLParameter&) = delete; - - -}; // End class Parameter - -} // End namespace Wrapper -} // End namespace otb - -#endif diff --git a/Modules/OBIA/RCC8/include/otbRCC8Value.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputXML.h similarity index 54% rename from Modules/OBIA/RCC8/include/otbRCC8Value.h rename to Modules/Wrappers/ApplicationEngine/include/otbWrapperInputXML.h index 24bc9c96c1039c35daae218c76ebe8fe233ffee6..ab33810d116f884b4a9b6f9d929df7fe2c4d5cf1 100644 --- a/Modules/OBIA/RCC8/include/otbRCC8Value.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputXML.h @@ -18,23 +18,30 @@ * limitations under the License. */ -#ifndef otbRCC8Value_h -#define otbRCC8Value_h +#ifndef otbWrapperInputXML_h +#define otbWrapperInputXML_h + +#include "otbWrapperApplication.h" +#include "otb_tinyxml.h" +#include <sstream> +#include <string> namespace otb { -// Coding enum system to represent the RCC8 relation values. -typedef enum - { - OTB_RCC8_DC, - OTB_RCC8_EC, - OTB_RCC8_PO, - OTB_RCC8_TPP, - OTB_RCC8_TPPI, - OTB_RCC8_NTPP, - OTB_RCC8_NTPPI, - OTB_RCC8_EQ - } -RCC8Value; +namespace Wrapper +{ +namespace XML +{ + +OTBApplicationEngine_EXPORT const std::string GetChildNodeTextOf(TiXmlElement* parentElement, std::string key); + +OTBApplicationEngine_EXPORT int Read(const std::string& filename, Application::Pointer application); + +/* copied from Utilities/tinyXMLlib/tinyxml.cpp. Must have a FIX inside tinyxml.cpp */ +OTBApplicationEngine_EXPORT FILE* TiXmlFOpen(const char* filename, const char* mode); + +} // namespace XML +} // End namespace Wrapper } // End namespace otb + #endif diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h deleted file mode 100644 index 5b19add53105b36ef412e459231f76179d7c4396..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbWrapperOutputProcessXMLParameter_h -#define otbWrapperOutputProcessXMLParameter_h -#include "otbWrapperApplication.h" -#include "otb_tinyxml.h" -#include <string> - -namespace otb -{ -namespace Wrapper -{ - -/** \class OutputProcessXMLParameter - * \brief This class represent a xml filename parameter for the wrapper framework to save otb application. - * - * \ingroup OTBApplicationEngine - */ -class OTBApplicationEngine_EXPORT OutputProcessXMLParameter - : public Parameter -{ -public: - /** Standard class typedef */ - typedef OutputProcessXMLParameter Self; - typedef Parameter Superclass; - typedef itk::SmartPointer<Self> Pointer; - typedef itk::SmartPointer<const Self> ConstPointer; - - /** Defining ::New() static method */ - itkNewMacro(Self); - - /** RTTI support */ - itkTypeMacro(OutputProcessXMLParameter, Parameter); - - itkGetStringMacro(FileName); - - // Set FileName - void SetFileName(std::string value) - { - this->SetValue(value); - } - - // Set Value - virtual void SetValue(const std::string value) - { - itkDebugMacro("setting member m_FileName to " << value); - this->m_FileName = value; - SetActive(true); - this->Modified(); - } - - bool HasValue() const override - { - if(m_FileName.empty()) - return false; - else - return true; - } - - void ClearValue() override - { - m_FileName = ""; - } - - virtual ParameterType GetType() const override - { - return ParameterType_OutputProcessXML; - } - - std::string ToString() const override - { - return GetFileName(); - } - - void FromString(const std::string& value) override - { - SetValue(value); - } - - TiXmlElement* AddChildNodeTo(TiXmlElement* parent, std::string name, std::string value=""); - - std::string pixelTypeToString(ImagePixelType pixType); - - ParameterType GetParameterType(const Parameter* param) const; - - void Write(Application::Pointer application); - - TiXmlElement* ParseApplication(Application::Pointer app); - -protected: - - OutputProcessXMLParameter(); - - /** Destructor */ - ~OutputProcessXMLParameter() override; - -private: - - /** Recursive function to parse a group parameter */ - void ParseGroup(const std::string& group); - - std::string m_FileName; - - /** Temporary storage of the XML node to fill (internal) */ - TiXmlElement* m_Node; - - /** Temporary pointer to the application to parse (internal) */ - Application::Pointer m_Appli; - - OutputProcessXMLParameter(const OutputProcessXMLParameter &) = delete; - void operator =(const OutputProcessXMLParameter&) = delete; - - -}; // End class Parameter - -} // End namespace Wrapper -} // End namespace otb - -#endif diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputXML.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputXML.h new file mode 100644 index 0000000000000000000000000000000000000000..31e666b264690d9341251436007f783b980d827c --- /dev/null +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputXML.h @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) + * + * This file is part of Orfeo Toolbox + * + * https://www.orfeo-toolbox.org/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef otbWrapperOutputXML_h +#define otbWrapperOutputXML_h + +#include "otbWrapperApplication.h" +#include "otb_tinyxml.h" +#include <string> + +namespace otb +{ +namespace Wrapper +{ +namespace XML +{ + +OTBApplicationEngine_EXPORT TiXmlElement* AddChildNodeTo(TiXmlElement* parent, std::string name, std::string value = ""); + +OTBApplicationEngine_EXPORT std::string pixelTypeToString(ImagePixelType pixType); + +OTBApplicationEngine_EXPORT void Write(const std::string& filename, Application::Pointer application); + +OTBApplicationEngine_EXPORT TiXmlElement* ParseApplication(Application::Pointer app); + +OTBApplicationEngine_EXPORT std::string MakeCommandLine(otb::Wrapper::Application::Pointer application); + +/** Recursive function to parse a group parameter */ +OTBApplicationEngine_EXPORT void ParseGroup(Application::Pointer app, TiXmlElement* n_App, const std::string& group); + +} // namespace XML +} // End namespace Wrapper +} // End namespace otb + +#endif diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h index 5883ea352d279f495da859f7d40968df3d6f6f5c..53f4b5fac1784bd2a1bec6f9f046b0cbec0e5812 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameterGroup.h @@ -73,11 +73,6 @@ public: Parameter::Pointer GetParameterByKey(std::string name, bool follow=true); - /** rashad: Add xml parameters eg: -inxml -outxml */ - void AddInXMLParameter(); - - void AddOutXMLParameter(); - void Clear() { m_ParameterList.clear(); diff --git a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt index fb220c564fbe628d9e9469f6f3f438352caa6454..a3f78c16fe606361e4fe0005840d65d320ce2a89 100644 --- a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt +++ b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt @@ -23,7 +23,8 @@ set( OTBApplicationEngine_SRC otbWrapperInputVectorDataListParameter.cxx otbWrapperListViewParameter.cxx otbWrapperParameterGroup.cxx - otbWrapperOutputProcessXMLParameter.cxx + otbWrapperInputXML.cxx + otbWrapperOutputXML.cxx otbWrapperInputImageListParameter.cxx otbWrapperElevationParametersHandler.cxx otbWrapperInputFilenameListParameter.cxx @@ -44,7 +45,6 @@ set( OTBApplicationEngine_SRC otbWrapperDocExampleStructure.cxx otbWrapperInputVectorDataParameter.cxx otbWrapperOutputVectorDataParameter.cxx - otbWrapperInputProcessXMLParameter.cxx otbWrapperMapProjectionParametersHandler.cxx otbWrapperApplication.cxx otbWrapperChoiceParameter.cxx diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx index 4297ae946d62476a88847a9974cd5aff72526fb3..0e2127a04f912a0d69c933918d9f3b67edecf6d1 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx @@ -25,14 +25,14 @@ #include "otbWrapperInputFilenameParameter.h" #include "otbWrapperInputFilenameListParameter.h" #include "otbWrapperOutputFilenameParameter.h" -#include "otbWrapperOutputProcessXMLParameter.h" #include "otbWrapperInputVectorDataParameter.h" #include "otbWrapperInputVectorDataListParameter.h" #include "otbWrapperOutputVectorDataParameter.h" #include "otbWrapperNumericalParameter.h" #include "otbWrapperStringListParameter.h" #include "otbWrapperInputImageListParameter.h" -#include "otbWrapperInputProcessXMLParameter.h" +#include "otbWrapperInputXML.h" +#include "otbWrapperOutputXML.h" #include "otbWrapperProxyParameter.h" #include "otbWrapperParameterKey.h" #include "otbWrapperBoolParameter.h" @@ -169,39 +169,6 @@ const char* Application::GetDescription() const return m_Description.c_str(); } -void Application::SetHaveInXML(bool haveInXML) -{ - m_HaveInXML = haveInXML; - this->Modified(); -} - -bool Application::GetHaveInXML() const -{ - return m_HaveInXML; -} - -void Application::SetHaveOutXML(bool haveOutXML) -{ - m_HaveOutXML = haveOutXML; - this->Modified(); -} - -bool Application::GetHaveOutXML() const -{ - return m_HaveOutXML; -} - -void Application::SetDocName(const std::string& value) -{ - m_DocName = value; - this->Modified(); -} - -const char* Application::GetDocName() const -{ - return m_DocName.c_str(); -} - void Application::SetDocLongDescription(const std::string& value) { m_DocLongDescription = value; @@ -267,6 +234,11 @@ void Application::AddDocTag(const std::string & tag) } } +bool Application::IsDeprecated() +{ + return std::find(m_DocTags.begin(), m_DocTags.end(), Tags::Deprecated) != m_DocTags.end(); +} + DocExampleStructure::Pointer Application::GetDocExample() { if (!IsInitialized()) @@ -331,11 +303,6 @@ std::string Application::GetHtmlExample() return GetDocExample()->GenerateHtmlExample(); } -void Application::ForceInXMLParseFlag() -{ - m_IsInXMLParsed = false; -} - void Application::SetDocLink(const std::string & link) { if (m_Doclink.compare(link) != 0) @@ -361,16 +328,12 @@ Application::Application() m_Description(""), m_Logger(otb::Logger::New()), m_ProgressSourceDescription(""), - m_DocName(""), m_DocLongDescription(""), m_DocAuthors(""), m_DocLimitations(""), m_DocSeeAlso(""), m_DocTags(), m_Doclink(""), - m_HaveInXML(true), - m_HaveOutXML(true), - m_IsInXMLParsed(false), m_IsInPrivateDo(false) { // Don't call Init from the constructor, since it calls a virtual method ! @@ -473,21 +436,9 @@ void Application::Init() { m_DocExample = DocExampleStructure::New(); m_ParameterList = ParameterGroup::New(); - //reset inXML parse checker in case if reinit-ing - m_IsInXMLParsed = false; m_IsInPrivateDo = true; this->DoInit(); m_IsInPrivateDo = false; - - //rashad: global parameters. now used only for inxml and outxml - if(this->GetHaveInXML()) - { - AddInXMLParameter(); - } - if(this->GetHaveOutXML()) - { - AddOutXMLParameter(); - } } template <typename T> @@ -501,25 +452,18 @@ T* downcast_check(Parameter* param) return down; } +void Application::LoadParametersFromXML(const std::string& filename) +{ + otb::Wrapper::XML::Read(filename, this); +} + +void Application::SaveParametersToXML(const std::string& filename) +{ + otb::Wrapper::XML::Write(filename, this); +} + void Application::UpdateParameters() { - //read application from xml only once m_IsInXMLParsed is in charge of it. - std::string inXMLKey = "inxml"; - if (m_HaveInXML && !m_IsInXMLParsed) - { - if ( GetParameterType(inXMLKey) == ParameterType_InputProcessXML && - IsParameterEnabled(inXMLKey) && HasValue(inXMLKey) ) - { - Parameter* param = GetParameterByKey(inXMLKey); - InputProcessXMLParameter* inXMLParam = dynamic_cast<InputProcessXMLParameter*>(param); - if(inXMLParam!=nullptr) - { - // switch on 'm_IsInXMLParsed' before Read() to avoid cyclic calls - m_IsInXMLParsed = true; - inXMLParam->Read(this); - } - } - } m_IsInPrivateDo = true; this->DoUpdateParameters(); m_IsInPrivateDo = false; @@ -858,17 +802,6 @@ int Application::ExecuteAndWriteOutput() outputParam->Write(); } } - //xml writer parameter - else if (m_HaveOutXML && GetParameterType(key) == ParameterType_OutputProcessXML - && IsParameterEnabled(key) && HasValue(key) ) - { - Parameter* param = GetParameterByKey(key); - OutputProcessXMLParameter* outXMLParam = dynamic_cast<OutputProcessXMLParameter*>(param); - if(outXMLParam!=nullptr) - { - outXMLParam->Write(this); - } - } } } diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputXML.cxx similarity index 64% rename from Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx rename to Modules/Wrappers/ApplicationEngine/src/otbWrapperInputXML.cxx index 44b76c6540c673a1680f9612973cd028a8220aef..47da2827ba952865020038f75873b5a0e1b8dae2 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputProcessXMLParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputXML.cxx @@ -18,7 +18,7 @@ * limitations under the License. */ -#include "otbWrapperInputProcessXMLParameter.h" +#include "otbWrapperInputXML.h" #include "otbWrapperChoiceParameter.h" #include "otbWrapperListViewParameter.h" @@ -41,51 +41,10 @@ namespace otb { namespace Wrapper { -InputProcessXMLParameter::InputProcessXMLParameter() +namespace XML { - this->SetKey("inxml"); - this->SetName("Load parameters from XML"); - this->SetDescription("Load application parameters from an XML file."); - this->SetMandatory(false); - this->SetActive(false); - this->SetRole(Role_Input); -} - -InputProcessXMLParameter::~InputProcessXMLParameter() -{ - -} - -bool -InputProcessXMLParameter::SetFileName(std::string value) -{ - // Check if the filename is not empty - if(!value.empty()) - { - // Check that the right extension is given : expected .xml - if (itksys::SystemTools::GetFilenameLastExtension(value) == ".xml") - { - if (itksys::SystemTools::FileExists(value,true)) - { - this->SetValue(value); - return true; - } - } - } - return false; -} - -void -InputProcessXMLParameter::SetValue(const std::string value) -{ - itkDebugMacro("setting member m_FileName to " << value); - this->m_FileName = value; - SetActive(true); - this->Modified(); -} -ImagePixelType -InputProcessXMLParameter::GetPixelTypeFromString(std::string strType) +ImagePixelType GetPixelTypeFromString(std::string strType) { if(strType == "uint8") { @@ -124,29 +83,7 @@ InputProcessXMLParameter::GetPixelTypeFromString(std::string strType) } } -void -InputProcessXMLParameter::otbAppLogInfo(Application::Pointer app, std::string info) -{ - app->GetLogger()->Write(itk::LoggerBase::INFO, info ); -} - -/* copied from Utilities/tinyXMLlib/tinyxml.cpp. Must have a FIX inside tinyxml.cpp */ -FILE* -InputProcessXMLParameter::TiXmlFOpen( const char* filename, const char* mode ) -{ -#if defined(_MSC_VER) && (_MSC_VER >= 1400 ) - FILE* fp = 0; - errno_t err = fopen_s( &fp, filename, mode ); - if ( !err && fp ) - return fp; - return 0; - #else - return fopen( filename, mode ); - #endif -} - -const std::string -InputProcessXMLParameter::GetChildNodeTextOf(TiXmlElement *parentElement, std::string key) +const std::string GetChildNodeTextOf(TiXmlElement* parentElement, std::string key) { std::string value=""; @@ -174,22 +111,15 @@ InputProcessXMLParameter::GetChildNodeTextOf(TiXmlElement *parentElement, std::s return value; } -int -InputProcessXMLParameter::Read(Application::Pointer this_) +int Read(const std::string& filename, Application::Pointer this_) { // Open the xml file TiXmlDocument doc; - //Use itksys::SystemTools::FOpen() and close it below because - //TiXmlDocument::TiXmlFileOpen( ) is not exposed from tinyXML library. Even - //though its available in the TiXmlDocument::SaveFile(). - FILE* fp = itksys::SystemTools::Fopen(m_FileName, "rb"); - - if (!doc.LoadFile(fp , TIXML_ENCODING_UTF8)) - { - fclose(fp); - itkExceptionMacro(<< "Can't open file " << m_FileName); - } + if (!doc.LoadFile(filename , TIXML_ENCODING_UTF8)) + { + itkGenericExceptionMacro(<< "Can't open file " << filename); + } TiXmlHandle handle(&doc); @@ -198,23 +128,15 @@ InputProcessXMLParameter::Read(Application::Pointer this_) if(!n_OTB) { - std::string info = "Input XML file " + std::string(this->GetFileName()) + " is invalid."; - //this->otbAppLogInfo(app,info); + std::string info = "Input XML file " + filename + " is invalid."; } std::string otb_Version; otb_Version = GetChildNodeTextOf(n_OTB,"version"); if(otb_Version != OTB_VERSION_STRING) - otbMsgDebugMacro( << "Input XML was generated with a different version of OTB (" << - otb_Version << ") and current version is OTB (" << OTB_VERSION_STRING << ")" ); - - /* - std::string otb_Version, otb_Build, otb_Platform; - otb_Version = this_->GetChildNodeTextOf(n_OTB,"version"); - otb_Build = GetChildNodeTextOf(n_OTB, "build"); - otb_Platform = this_->GetChildNodeTextOf(n_OTB, "platform"); - */ + otbGenericMsgDebugMacro(<< "Input XML was generated with a different version of OTB (" << otb_Version << ") and current version is OTB (" + << OTB_VERSION_STRING << ")"); int ret = 0; @@ -222,46 +144,11 @@ InputProcessXMLParameter::Read(Application::Pointer this_) std::string app_Name; app_Name = GetChildNodeTextOf(n_AppNode, "name"); - /* - AddMetaData("appname", app_Name); - - app_Descr = this_->GetChildNodeTextOf(n_AppNode, "descr"); - AddMetaData("appdescr", app_Descr); - - TiXmlElement* n_Doc = n_AppNode->FirstChildElement("doc"); - - std::string doc_Name, doc_Descr, doc_Author, doc_Limitation, doc_SeeAlso; - - doc_Name = this_->GetChildNodeTextOf(n_Doc, "name"); - AddMetaData("docname", doc_Name); - - doc_Descr = this_->GetChildNodeTextOf(n_Doc, "longdescr"); - AddMetaData("doclongdescr", doc_Descr); - - doc_Author = this_->GetChildNodeTextOf(n_Doc, "authors"); - AddMetaData("docauthors", doc_Author); - - doc_Limitation = this_->GetChildNodeTextOf(n_Doc, "limitations"); - AddMetaData("doclimitations", doc_Limitation); - - doc_SeeAlso = this_->GetChildNodeTextOf(n_Doc, "seealso"); - AddMetaData("docseealso", doc_SeeAlso); - */ - if(this_->GetName() != app_Name) - { - //hopefully shouldn't reach here ... - /* - std::string message = "Input XML was generated for a different application( " - + app_Name + ") while application loaded is:" + this_->GetName(); - */ - itkWarningMacro( << "Input XML was generated for a different application( " << - app_Name << ") while application loaded is:" <<this_->GetName()); - - fclose(fp); - return -1; - } + { + itkGenericExceptionMacro(<< "Input XML was generated for a different application( " << app_Name << ") while application loaded is:" << this_->GetName()); + } ParameterGroup::Pointer paramGroup = this_->GetParameterList(); @@ -279,15 +166,6 @@ InputProcessXMLParameter::Read(Application::Pointer this_) Parameter* param = this_->GetParameterByKey(key); - // std::cout - // << "'" << paramName << "'\t" - // << key << "\t" - // << typeAsString << "\t" - // << type << "\t" - // << ParameterType_OutputImage << "\t" - // << param->HasUserValue() << "\t" - // << value << std::endl; - param->SetUserValue(true); param->SetActive(true); @@ -402,9 +280,6 @@ InputProcessXMLParameter::Read(Application::Pointer this_) } else if (type == ParameterType_StringList || type == ParameterType_ListView) { - if(values.empty()) - itkWarningMacro(<< key << " has null values"); - this_->SetParameterStringList(key, values); } @@ -415,12 +290,11 @@ InputProcessXMLParameter::Read(Application::Pointer this_) ret = 0; //resetting return to zero, we don't use it anyway for now. - fclose(fp); - return ret; } +} // namespace XML } //end namespace wrapper } //end namespace otb diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputXML.cxx similarity index 71% rename from Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx rename to Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputXML.cxx index eaaf8c7c302f9085282eaa1169465477d8a50bbd..38ff7eba0a0d0a2aa7cf0278797dee61df936d6b 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputXML.cxx @@ -18,7 +18,7 @@ * limitations under the License. */ -#include "otbWrapperOutputProcessXMLParameter.h" +#include "otbWrapperOutputXML.h" #include "otbWrapperChoiceParameter.h" #include "otbWrapperListViewParameter.h" @@ -40,25 +40,10 @@ namespace otb { namespace Wrapper { -OutputProcessXMLParameter::OutputProcessXMLParameter() - : m_Node(nullptr) - , m_Appli() +namespace XML { - this->SetKey("outxml"); - this->SetName("Save parameters to XML"); - this->SetDescription("Save application parameters to an XML file."); - this->SetMandatory(false); - this->SetActive(false); - this->SetRole(Role_Output); -} - -OutputProcessXMLParameter::~OutputProcessXMLParameter() -{ - -} -std::string -OutputProcessXMLParameter::pixelTypeToString(ImagePixelType pixType) +std::string pixelTypeToString(ImagePixelType pixType) { std::string type; @@ -108,7 +93,7 @@ OutputProcessXMLParameter::pixelTypeToString(ImagePixelType pixType) return type; } -TiXmlElement* OutputProcessXMLParameter::AddChildNodeTo(TiXmlElement *parent, std::string name, std::string value) +TiXmlElement* AddChildNodeTo(TiXmlElement* parent, std::string name, std::string value) { TiXmlElement * n_Node = new TiXmlElement( name.c_str() ); parent->LinkEndChild( n_Node ); @@ -120,18 +105,16 @@ TiXmlElement* OutputProcessXMLParameter::AddChildNodeTo(TiXmlElement *parent, st return n_Node; } -void -OutputProcessXMLParameter::Write(Application::Pointer app) +void Write(const std::string& filename, Application::Pointer app) { // Check if the filename is not empty - if(m_FileName.empty()) - itkExceptionMacro("The XML output FileName is empty, please set the filename via the method SetFileName"); + if (filename.empty()) + itkGenericExceptionMacro("The XML output FileName is empty, please set the filename via the method SetFileName"); // Check that the right extension is given : expected .xml */ - if (itksys::SystemTools::GetFilenameLastExtension(m_FileName) != ".xml") - { - itkExceptionMacro(<<itksys::SystemTools::GetFilenameLastExtension(m_FileName) - <<" is a wrong Extension FileName : Expected .xml"); + if (itksys::SystemTools::GetFilenameLastExtension(filename) != ".xml") + { + itkGenericExceptionMacro(<< itksys::SystemTools::GetFilenameLastExtension(filename) << " is a wrong Extension FileName : Expected .xml"); } // start creating XML file @@ -152,15 +135,12 @@ OutputProcessXMLParameter::Write(Application::Pointer app) n_OTB->LinkEndChild(n_App); // Finally, write xml contents to file - doc.SaveFile( m_FileName.c_str() ); + doc.SaveFile(filename.c_str()); } -TiXmlElement* -OutputProcessXMLParameter::ParseApplication(Application::Pointer app) +TiXmlElement* ParseApplication(Application::Pointer app) { - m_Appli = app; - TiXmlElement * n_App = new TiXmlElement("application"); - m_Node = n_App; + TiXmlElement* n_App = new TiXmlElement("application"); AddChildNodeTo(n_App, "name", app->GetName()); AddChildNodeTo(n_App, "descr", app->GetDescription()); @@ -168,7 +148,6 @@ OutputProcessXMLParameter::ParseApplication(Application::Pointer app) TiXmlElement *n_AppDoc; n_AppDoc = AddChildNodeTo(n_App, "doc"); - AddChildNodeTo(n_AppDoc, "name", app->GetDocName()); AddChildNodeTo(n_AppDoc, "longdescr", app->GetDocLongDescription()); AddChildNodeTo(n_AppDoc, "authors", app->GetDocAuthors()); AddChildNodeTo(n_AppDoc, "limitations", app->GetDocLimitations()); @@ -185,19 +164,14 @@ OutputProcessXMLParameter::ParseApplication(Application::Pointer app) } // recursive call to ParseGroup(), starting with "" (i.e. GetParameterList()) - this->ParseGroup(std::string("")); - - // reset temporary members - m_Appli = nullptr; - m_Node = nullptr; - return n_App; + ParseGroup(app, n_App, std::string("")); + return n_App; } -void -OutputProcessXMLParameter::ParseGroup(const std::string& group) +void ParseGroup(Application::Pointer app, TiXmlElement* n_App, const std::string& group) { std::string prefix(group); - ParameterGroup::Pointer paramGroup = m_Appli->GetParameterList(); + ParameterGroup::Pointer paramGroup = app->GetParameterList(); if (!group.empty()) { prefix += '.'; @@ -209,7 +183,7 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) } else { - itkExceptionMacro("Function ParseGroup() expected a group parameter for key "<<group); + itkGenericExceptionMacro("Function ParseGroup() expected a group parameter for key " << group); } } @@ -221,20 +195,18 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) std::string key = prefix + *it; Parameter *param = paramGroup->GetParameterByKey(*it); std::string paramName = param->GetName(); - ParameterType type = m_Appli->GetParameterType(key); + ParameterType type = app->GetParameterType(key); std::string typeAsString = paramGroup->GetParameterTypeAsString(type); // if param is a Group, inspect this group with a recursive call if (type == ParameterType_Group) { - this->ParseGroup(key); + ParseGroup(app, n_App, key); } else { - bool paramExists = m_Appli->HasUserValue(key) && - m_Appli->IsParameterEnabled(key) && - m_Appli->GetParameterRole(key) == Role_Input; - if ( type == ParameterType_OutputProcessXML ) + bool paramExists = app->HasUserValue(key) && app->IsParameterEnabled(key) && app->GetParameterRole(key) == Role_Input; + if (type == ParameterType_OutputProcessXML) { paramExists = false; } @@ -265,18 +237,18 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) type == ParameterType_InputVectorDataList || type == ParameterType_StringList || type == ParameterType_ListView ) { - values = m_Appli->GetParameterStringList(key); - hasValueList = true; + values = app->GetParameterStringList(key); + hasValueList = true; } else if (type == ParameterType_Int || type == ParameterType_Radius || type == ParameterType_RAM ) { - value = m_Appli->GetParameterAsString(key); + value = app->GetParameterAsString(key); } else if(type == ParameterType_Float) { std::ostringstream oss; oss << std::setprecision(std::numeric_limits<float>::digits10+1); - oss << m_Appli->GetParameterFloat( key ); + oss << app->GetParameterFloat(key); value = oss.str(); } else if ( type == ParameterType_String || type == ParameterType_InputFilename || @@ -285,12 +257,12 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) type == ParameterType_OutputVectorData || type == ParameterType_OutputFilename || type == ParameterType_Bool) { - value = m_Appli->GetParameterString(key); + value = app->GetParameterString(key); } else if(key == "rand") { std::ostringstream strm; - strm << m_Appli->GetParameterInt("rand"); + strm << app->GetParameterInt("rand"); value = strm.str(); } else if (type == ParameterType_InputProcessXML) @@ -352,20 +324,90 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) AddChildNodeTo(n_Values, "value",*strIt); } } - m_Node->LinkEndChild(n_Parameter); + n_App->LinkEndChild(n_Parameter); } // dig into Choice parameter if (type == ParameterType_Choice) { std::string choiceGroup(key); choiceGroup += '.'; - choiceGroup += m_Appli->GetParameterString(key); - this->ParseGroup(choiceGroup); + choiceGroup += app->GetParameterString(key); + ParseGroup(app, n_App, choiceGroup); + } + } + } +} + +std::string MakeCommandLine(Application::Pointer application) +{ + TiXmlElement* XMLAppElement = ParseApplication(application); + + // Create command line from the XML document + TiXmlElement * pName, *pParam; + std::ostringstream cmdLine; + + cmdLine << ""; + + if (XMLAppElement) + { + pName = XMLAppElement->FirstChildElement("name"); + + cmdLine << "otbcli_" << pName->GetText(); +#ifdef _WIN32 + cmdLine << ".bat"; +#endif + cmdLine << " "; + + // Parse application parameters + pParam = XMLAppElement->FirstChildElement("parameter"); + + while (pParam) + { + // Get parameter key + cmdLine << "-"; + cmdLine << pParam->FirstChildElement("key")->GetText(); + cmdLine << " "; + + // Some parameters can have multiple values. Test it and handle this + // specific case + TiXmlElement* values = pParam->FirstChildElement("values"); + + if (values) + { + // Loop over value + TiXmlElement* pValue = values->FirstChildElement("value"); + while (pValue) + { + cmdLine << pValue->GetText(); + cmdLine << " "; + + pValue = pValue->NextSiblingElement(); // iteration over multiple values } } + else + { + // Get parameter value + cmdLine << pParam->FirstChildElement("value")->GetText(); + cmdLine << " "; + + // In case of OutputImageparameter we need to report output pixel type + TiXmlElement* pPixType = pParam->FirstChildElement("pixtype"); + + if (pPixType) + { + cmdLine << pPixType->GetText(); + cmdLine << " "; + } + } + + pParam = pParam->NextSiblingElement(); // iteration over parameters } + } + + return cmdLine.str(); } -} //end namespace wrapper +} // namespace XML +} // namespace Wrapper } //end namespace otb diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx index 3a8ec354b5328750e5dfaa7381002ddabe23cab6..5cb7932941d31e8c22b699c3cde7aee3254e1656 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperParameterGroup.cxx @@ -25,7 +25,6 @@ #include "otbWrapperInputFilenameParameter.h" #include "otbWrapperInputFilenameListParameter.h" #include "otbWrapperOutputFilenameParameter.h" -#include "otbWrapperOutputProcessXMLParameter.h" #include "otbWrapperInputImageParameter.h" #include "otbWrapperInputVectorDataParameter.h" #include "otbWrapperOutputImageParameter.h" @@ -34,7 +33,6 @@ #include "otbWrapperStringListParameter.h" #include "otbWrapperInputImageListParameter.h" #include "otbWrapperInputVectorDataListParameter.h" -#include "otbWrapperInputProcessXMLParameter.h" #include "otbWrapperParameterKey.h" #include "otbWrapperProxyParameter.h" #include "otbWrapperBoolParameter.h" @@ -163,46 +161,6 @@ ParameterGroup::ClearChoices(std::string paramKey) } } -void ParameterGroup::AddOutXMLParameter() -{ - Parameter::Pointer tmpParam; - tmpParam = OutputProcessXMLParameter::New(); -// const std::string key = tmpParam->GetKey(); -// const std::string descr = tmpParam->GetDescription(); -const std::string defaultXMLFileName = std::string(GetName()) + ".xml"; - tmpParam->SetActive(false); - AddParameter(tmpParam); - - tmpParam = nullptr; - /* - AddParameter(ParameterType_OutputProcessXML, key, descr); - SetParameterDescription(key, descr); - MandatoryOff(key); - //SetParameterString(key, defaultXMLFileName); - DisableParameter(key); - */ -} - -void ParameterGroup::AddInXMLParameter() -{ - Parameter::Pointer tmpParam; - tmpParam = InputProcessXMLParameter::New(); -// const std::string key = tmpParam->GetKey(); -// const std::string descr = tmpParam->GetDescription(); - const std::string defaultXMLFileName = std::string(GetName()) + ".xml"; - tmpParam->SetActive(false); - AddParameter(tmpParam); - - tmpParam = nullptr; - /* - AddParameter(ParameterType_InputProcessXML, key, descr); - SetParameterDescription(key, descr); - MandatoryOff(key); - //SetParameterString(key, defaultXMLFileName); - DisableParameter(key); -*/ -} - /** Get the choices made in the QListWidget */ std::vector<int> ParameterGroup::GetSelectedItems(std::string paramKey) @@ -369,16 +327,6 @@ ParameterGroup::AddParameter(ParameterType type, std::string paramKey, std::stri newParam = RAMParameter::New(); } break; - case ParameterType_OutputProcessXML: - { - newParam = OutputProcessXMLParameter::New(); - } - break; - case ParameterType_InputProcessXML: - { - newParam = InputProcessXMLParameter::New(); - } - break; case ParameterType_Bool: { newParam = BoolParameter::New(); diff --git a/Modules/Wrappers/ApplicationEngine/test/otbWrapperApplicationDocTests.cxx b/Modules/Wrappers/ApplicationEngine/test/otbWrapperApplicationDocTests.cxx index d0e8a44ec3a961814221b70046e2861625ba89a1..795f3386c407ab13a268ed5fdffe3447195fbbe1 100644 --- a/Modules/Wrappers/ApplicationEngine/test/otbWrapperApplicationDocTests.cxx +++ b/Modules/Wrappers/ApplicationEngine/test/otbWrapperApplicationDocTests.cxx @@ -53,11 +53,6 @@ int otbWrapperApplicationDocTest(int argc, char* argv[]) std::cout<<"Missing Name."<<std::endl; isOK = false; } - if( std::string(app->GetDocName()) == "" ) - { - std::cout<<"Missing Doc Name."<<std::endl; - isOK = false; - } if( std::string(app->GetDescription()) == "" ) { std::cout<<"Missing Description."<<std::endl; diff --git a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h index 9e097a67cfafd11f96efc38867ea37e4b643d62b..e6a26418b2af0f7664a3eb338cd1fa45744c1da9 100644 --- a/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h +++ b/Modules/Wrappers/CommandLine/include/otbWrapperCommandLineLauncher.h @@ -112,9 +112,6 @@ public: /** Create and display the help of the application */ void DisplayHelp(bool longHelp=false); - /** Create and display the long help of the application */ - void DisplayLongHelp(); - /** Performs specific action for testing environment */ void LoadTestEnv(); diff --git a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx index 816e56d81fc7ea3f9c9f178198cc999eea1e6cb7..e456eabf88b97b5a3f03217358983eef9c1b394d 100644 --- a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx +++ b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx @@ -28,221 +28,6 @@ #include "otbMPIConfig.h" #endif -const std::string GetChildNodeTextOf(TiXmlElement *parentElement, std::string key); -std::string PrepareExpressionFromXML(std::string filename); -std::vector<std::string> PrepareVectorExpressionFromXML(std::string filename); -std::string CleanWord(const std::string & word); - - -std::string PrepareExpressionFromXML(std::string filename) -{ - std::string expression; - - if(filename.empty()) - { - std::cerr <<"Input XML Filename is empty" << std::endl; - return expression; - } - std::string ext = filename.substr(filename.size()-4,filename.size()); - if(ext != ".xml" ) - std::cerr << ext << " is a wrong extension: Expected .xml " << __FILE__ << std::endl; - - // Open the xml file - TiXmlDocument doc; - - //Use itksys::SystemTools::FOpen() and close it below because - //TiXmlDocument::TiXmlFileOpen( ) is not exposed from tinyXML library. Even - //though its available in the TiXmlDocument::SaveFile(). - FILE* fp = itksys::SystemTools::Fopen(filename, "rb"); - - if (!doc.LoadFile(fp , TIXML_ENCODING_UTF8)) - { - std::cerr << "Can't open file " << filename << std::endl; - fclose(fp); - exit(1); - - } - - TiXmlHandle handle(&doc); - - TiXmlElement *n_OTB; - n_OTB = handle.FirstChild("OTB").Element(); - - if(!n_OTB) - { - std::string info = "Input XML file " + filename + " is invalid."; - std::cerr << info << std::endl; - fclose(fp); - exit(1); - } - - TiXmlElement *n_AppNode = n_OTB->FirstChildElement("application"); - - std::string moduleName; - moduleName = GetChildNodeTextOf(n_AppNode, "name"); - /* - AddMetaData("appname", app_Name); - - app_Descr = this_->GetChildNodeTextOf(n_AppNode, "descr"); - AddMetaData("appdescr", app_Descr); - - TiXmlElement* n_Doc = n_AppNode->FirstChildElement("doc"); - - std::string doc_Name, doc_Descr, doc_Author, doc_Limitation, doc_SeeAlso; - - doc_Name = this_->GetChildNodeTextOf(n_Doc, "name"); - AddMetaData("docname", doc_Name); - - doc_Descr = this_->GetChildNodeTextOf(n_Doc, "longdescr"); - AddMetaData("doclongdescr", doc_Descr); - - doc_Author = this_->GetChildNodeTextOf(n_Doc, "authors"); - AddMetaData("docauthors", doc_Author); - - doc_Limitation = this_->GetChildNodeTextOf(n_Doc, "limitations"); - AddMetaData("doclimitations", doc_Limitation); - - doc_SeeAlso = this_->GetChildNodeTextOf(n_Doc, "seealso"); - AddMetaData("docseealso", doc_SeeAlso); - */ - - expression.append(moduleName); - - for( TiXmlElement* n_Parameter = n_AppNode->FirstChildElement("parameter"); n_Parameter != nullptr; - n_Parameter = n_Parameter->NextSiblingElement() ) - { - std::string key="-"; - key.append(GetChildNodeTextOf(n_Parameter, "key")); - - TiXmlElement* n_Values = nullptr; - n_Values = n_Parameter->FirstChildElement("values"); - if(n_Values) - { - std::string values; - for(TiXmlElement* n_Value = n_Values->FirstChildElement("value"); n_Value != nullptr; - n_Value = n_Value->NextSiblingElement()) - { - values.append(n_Value->GetText()); - values.append(" "); - } - values = values.substr(0,values.size()-1); - expression.append(" "); - expression.append(key); - expression.append(" "); - expression.append(values); - } - else - { - std::string value; - value = GetChildNodeTextOf(n_Parameter, "value"); - - expression.append(" "); - expression.append(key); - expression.append(" "); - expression.append(value); - - std::string type = GetChildNodeTextOf(n_Parameter, "type"); - if (type == "OutputImage") - { - std::string t = GetChildNodeTextOf(n_Parameter, "pixtype"); - expression.append(" "); - expression.append(t); - } - } - } - - fclose(fp); - - return expression; -} - -std::vector<std::string> PrepareVectorExpressionFromXML(std::string filename) -{ - std::vector<std::string> expression; - - if(filename.empty()) - { - std::cerr <<"Input XML Filename is empty" << std::endl; - return expression; - } - std::string ext = filename.substr(filename.size()-4,filename.size()); - if(ext != ".xml" ) - std::cerr << ext << " is a wrong extension: Expected .xml " << __FILE__ << std::endl; - - // Open the xml file - TiXmlDocument doc; - - //Use itksys::SystemTools::FOpen() and close it below because - //TiXmlDocument::TiXmlFileOpen( ) is not exposed from tinyXML library. Even - //though its available in the TiXmlDocument::SaveFile(). - FILE* fp = itksys::SystemTools::Fopen(filename, "rb"); - - if (!doc.LoadFile(fp , TIXML_ENCODING_UTF8)) - { - std::cerr << "Can't open file " << filename << std::endl; - fclose(fp); - exit(1); - - } - - TiXmlHandle handle(&doc); - - TiXmlElement *n_OTB; - n_OTB = handle.FirstChild("OTB").Element(); - - if(!n_OTB) - { - std::string info = "Input XML file " + filename + " is invalid."; - std::cerr << info << std::endl; - fclose(fp); - exit(1); - } - - TiXmlElement *n_AppNode = n_OTB->FirstChildElement("application"); - - std::string moduleName; - moduleName = GetChildNodeTextOf(n_AppNode, "name"); - - expression.push_back(CleanWord(moduleName)); - - for( TiXmlElement* n_Parameter = n_AppNode->FirstChildElement("parameter"); n_Parameter != nullptr; - n_Parameter = n_Parameter->NextSiblingElement() ) - { - std::string key="-"; - key.append(GetChildNodeTextOf(n_Parameter, "key")); - expression.push_back(CleanWord(key)); - - TiXmlElement* n_Values = nullptr; - n_Values = n_Parameter->FirstChildElement("values"); - if(n_Values) - { - std::string values; - for(TiXmlElement* n_Value = n_Values->FirstChildElement("value"); n_Value != nullptr; - n_Value = n_Value->NextSiblingElement()) - { - expression.push_back(CleanWord(n_Value->GetText())); - } - } - else - { - std::string value; - value = GetChildNodeTextOf(n_Parameter, "value"); - expression.push_back(CleanWord(value)); - - std::string type = GetChildNodeTextOf(n_Parameter, "type"); - if (type == "OutputImage") - { - std::string t = GetChildNodeTextOf(n_Parameter, "pixtype"); - expression.push_back(CleanWord(t)); - } - } - } - - fclose(fp); - - return expression; -} - std::string CleanWord(const std::string & word) { std::string res(""); @@ -272,26 +57,18 @@ int main(int argc, char* argv[]) std::vector<std::string> vexp; - std::string exp; - if (strcmp(argv[1], "-inxml") == 0) - { - vexp = PrepareVectorExpressionFromXML(argv[2]); - } - else + // Construct the string expression + for (int i = 1; i < argc; i++) + { + std::string strarg(argv[i]); + std::string cleanArg = CleanWord(strarg); + if (cleanArg.empty()) { - // Construct the string expression - for (int i = 1; i < argc; i++) - { - std::string strarg(argv[i]); - std::string cleanArg = CleanWord(strarg); - if (cleanArg.empty()) - { - // Empty argument ! - continue; - } - vexp.push_back(cleanArg); - } + // Empty argument! + continue; } + vexp.push_back(cleanArg); + } if (vexp.empty()) { @@ -317,31 +94,3 @@ int main(int argc, char* argv[]) #endif return success ? EXIT_SUCCESS : EXIT_FAILURE; } - -const std::string GetChildNodeTextOf(TiXmlElement *parentElement, std::string key) -{ - std::string value=""; - - if(parentElement) - { - TiXmlElement* childElement = nullptr; - childElement = parentElement->FirstChildElement(key.c_str()); - - //same as childElement->GetText() does but that call is failing if there is - //no such node. - //but the below code works and is a replacement for GetText() - if(childElement) - { - const TiXmlNode* child = childElement->FirstChild(); - if ( child ) - { - const TiXmlText* childText = child->ToText(); - if ( childText ) - { - value = childText->Value(); - } - } - } - } - return value; -} diff --git a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx index b5ef08d6acaf9814579046f6a50a0db917dac063..728d349b0ca37684df34c2aeb86322eebd2afd45 100644 --- a/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx +++ b/Modules/Wrappers/CommandLine/src/otbWrapperCommandLineLauncher.cxx @@ -31,7 +31,6 @@ #include "otbWrapperOutputVectorDataParameter.h" #include "otbWrapperNumericalParameter.h" #include "otbWrapperListViewParameter.h" -#include "otbWrapperOutputProcessXMLParameter.h" #include "otbWrapperAddProcessToWatchEvent.h" // List value parameter @@ -137,19 +136,27 @@ bool CommandLineLauncher::Execute() bool CommandLineLauncher::ExecuteAndWriteOutputNoCatch() { - if (this->BeforeExecute() == false) - { - return false; - } - if( m_Application->ExecuteAndWriteOutput() == 0 ) - { - this->DisplayOutputParameters(); - } - else - { - return false; - } - return true; + if (this->BeforeExecute() == false) + { + return false; + } + + if (m_Application->ExecuteAndWriteOutput() != 0) + { + return false; + } + + this->DisplayOutputParameters(); + + // After execution, write parameters to the xml file if requested + const char* attrib = "-outxml"; + if (m_Parser->IsAttributExists(attrib, m_VExpression)) + { + std::vector<std::string> outXMLValues = m_Parser->GetAttribut(attrib, m_VExpression); + m_Application->SaveParametersToXML(outXMLValues[0]); + } + + return true; } bool CommandLineLauncher::ExecuteAndWriteOutput() @@ -282,7 +289,12 @@ bool CommandLineLauncher::BeforeExecute() return false; } - return true; + if (m_Application->IsDeprecated()) + { + m_Application->GetLogger()->Warning("This application is deprecated and will be removed in a future OTB release.\n"); + } + + return true; } bool CommandLineLauncher::LoadPath() @@ -358,22 +370,16 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters() itkExceptionMacro("No application loaded"); } - /* Check for inxml parameter. If exists Update all Parameters from xml and - * check for user defined parameters for overriding those from XML - */ - const char *inXMLKey = "inxml"; - const char *attrib = "-inxml"; - const bool paramInXMLExists(m_Parser->IsAttributExists(attrib, m_VExpression)); - if(paramInXMLExists) + // Read parameters from xml file if provided + const char* attrib = "-inxml"; + if (m_Parser->IsAttributExists(attrib, m_VExpression)) { - std::vector<std::string> inXMLValues; - inXMLValues = m_Parser->GetAttribut(attrib, m_VExpression); - m_Application->SetParameterString(inXMLKey, inXMLValues[0]); - m_Application->UpdateParameters(); + std::vector<std::string> inXMLValues = m_Parser->GetAttribut(attrib, m_VExpression); + m_Application->LoadParametersFromXML(inXMLValues[0]); } - // Check for the progress report parameter - if (m_Parser->IsAttributExists("-progress", m_VExpression) == true) + // Check for the progress report parameter + if (m_Parser->IsAttributExists("-progress", m_VExpression) == true) { std::vector<std::string> val = m_Parser->GetAttribut("-progress", m_VExpression); if (val.size() == 1 && (val[0] == "1" || val[0] == "true")) @@ -429,21 +435,10 @@ CommandLineLauncher::ParamResultType CommandLineLauncher::LoadParameters() // Multiple values parameters m_Application->SetParameterStringList(paramKey, values); } - else if (type == ParameterType_Choice || - type == ParameterType_Float || - type == ParameterType_Int || - type == ParameterType_Radius || - type == ParameterType_Directory || - type == ParameterType_String || - type == ParameterType_InputFilename || - type == ParameterType_OutputFilename || - type == ParameterType_InputImage || - type == ParameterType_OutputImage || - type == ParameterType_InputVectorData || - type == ParameterType_OutputVectorData || - type == ParameterType_RAM || - type == ParameterType_OutputProcessXML || - type == ParameterType_Bool) // || type == ParameterType_InputProcessXML) + else if (type == ParameterType_Choice || type == ParameterType_Float || type == ParameterType_Int || type == ParameterType_Radius || + type == ParameterType_Directory || type == ParameterType_String || type == ParameterType_InputFilename || + type == ParameterType_OutputFilename || type == ParameterType_InputImage || type == ParameterType_OutputImage || + type == ParameterType_InputVectorData || type == ParameterType_OutputVectorData || type == ParameterType_RAM || type == ParameterType_Bool) { // Single value parameter m_Application->SetParameterString(paramKey, values[0]); @@ -582,7 +577,13 @@ void CommandLineLauncher::LinkWatchers(itk::Object * itkNotUsed(caller), const i void CommandLineLauncher::DisplayHelp(bool longHelp) { std::cerr<<std::endl; - std::cerr << "This is the "<<m_Application->GetDocName() << " ("<<m_Application->GetName()<<") application, version " << OTB_VERSION_STRING <<std::endl<<std::endl; + std::cerr << "This is the " << m_Application->GetName() << " application, version " << OTB_VERSION_STRING << std::endl << std::endl; + + if (m_Application->IsDeprecated()) + { + std::cerr << "WARNING: This application is deprecated, it will be removed in a future OTB release." << std::endl; + std::cerr << std::endl; + } std::cerr << m_Application->GetDescription() << std::endl; @@ -718,9 +719,9 @@ std::string CommandLineLauncher::DisplayParameterHelp(const Parameter::Pointer & { oss << "<float> "; } - else if (type == ParameterType_InputFilename || type == ParameterType_OutputFilename ||type == ParameterType_Directory || type == ParameterType_InputImage || type == ParameterType_OutputProcessXML || type == ParameterType_InputProcessXML || - type == ParameterType_InputVectorData || type == ParameterType_OutputVectorData || type == ParameterType_String || - type == ParameterType_Choice || (type == ParameterType_ListView && singleSelectionForListView)) + else if (type == ParameterType_InputFilename || type == ParameterType_OutputFilename || type == ParameterType_Directory || + type == ParameterType_InputImage || type == ParameterType_InputVectorData || type == ParameterType_OutputVectorData || + type == ParameterType_String || type == ParameterType_Choice || (type == ParameterType_ListView && singleSelectionForListView)) { oss << "<string> "; } @@ -894,6 +895,8 @@ bool CommandLineLauncher::CheckKeyValidity(std::string& refKey) appKeyList.push_back("progress"); appKeyList.push_back("testenv"); appKeyList.push_back("version"); + appKeyList.push_back("inxml"); + appKeyList.push_back("outxml"); // Check if each key in the expression exists in the application for (unsigned int i = 0; i < expKeyList.size(); i++) diff --git a/Modules/Wrappers/QGIS/src/otbQgisDescriptor.cxx b/Modules/Wrappers/QGIS/src/otbQgisDescriptor.cxx index 6d757472971fe66922b22cc70c550dc4f6bc764a..609a8e658750f459382830d6c818eee13315ab2f 100644 --- a/Modules/Wrappers/QGIS/src/otbQgisDescriptor.cxx +++ b/Modules/Wrappers/QGIS/src/otbQgisDescriptor.cxx @@ -131,13 +131,10 @@ int main(int argc, char* argv[]) const ParameterType type = appli->GetParameterType(name); const std::string description = appli->GetParameterName(name); if ( type == ParameterType_Group || - type == ParameterType_OutputProcessXML || - type == ParameterType_InputProcessXML || type == ParameterType_RAM || param->GetRole() == Role_Output ) { // group parameter cannot have any value. - // outxml and inxml parameters are not relevant for QGIS and is considered a bit noisy // ram is added by qgis-otb processing provider plugin as an advanced parameter for all apps // parameter role cannot be of type Role_Output continue; diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h deleted file mode 100644 index dbd5e4a45b737abfc47564fd951623c03f2e628b..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetInputProcessXMLParameter.h +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbWrapperQtWidgetInputProcessXMLParameter_h -#define otbWrapperQtWidgetInputProcessXMLParameter_h - -#include <QtWidgets> -#include "otbWrapperInputProcessXMLParameter.h" -#include "otbWrapperQtWidgetParameterBase.h" - - -namespace otb -{ -namespace Wrapper -{ - -/** \class QtWidgetInputProcessXMLParameter - * \brief - * - * \ingroup OTBQtWidget - */ -class OTBQtWidget_EXPORT QtWidgetInputProcessXMLParameter : public QtWidgetParameterBase -{ - Q_OBJECT -public: - QtWidgetInputProcessXMLParameter(InputProcessXMLParameter*, QtWidgetModel*, QWidget*); - ~QtWidgetInputProcessXMLParameter() override; - - const QLineEdit* GetInput() const; - QLineEdit* GetInput(); - -protected slots: - void SetFileName( const QString& value ); - void SelectFile(); - -private: - QtWidgetInputProcessXMLParameter(const QtWidgetInputProcessXMLParameter&) = delete; - void operator=(const QtWidgetInputProcessXMLParameter&) = delete; - - void DoCreateWidget() override; - - void DoUpdateGUI() override; - - - InputProcessXMLParameter::Pointer m_XMLParam; - - QHBoxLayout * m_HLayout; - QLineEdit* m_Input; - QPushButton * m_Button; -}; - - -} -} - -#endif diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h index 6e0a005b1f9d3cd8dba6276b40da9e9fd29c2e8d..0bd6704b59175cf80e237f95503d4b5a463781ad 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h @@ -22,12 +22,19 @@ #define otbWrapperQtWidgetMainWindow_h #include <QMainWindow> + #include "OTBQtWidgetExport.h" #include "otbWrapperApplication.h" +namespace Ui +{ +class AppMainWindow; +} + class QAction; class QMenu; +class QPlainTextEdit; namespace otb { @@ -41,16 +48,28 @@ class OTBQtWidget_EXPORT QtMainWindow : public QMainWindow Q_OBJECT public: - QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent = nullptr, Qt::WindowFlags flags = Qt::WindowFlags()); + QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent = nullptr); + ~QtMainWindow(); + + otb::Wrapper::QtWidgetView* Gui() const; + + void closeEvent(QCloseEvent* event) override; - QtWidgetView* Gui() const; +signals: + void ExecuteAndWriteOutput(); + void Stop(); public slots: void UnhandledException(QString message); + void UpdateMessageAfterApplicationReady(bool val); + void UpdateMessageAfterExecution(int status); + void on_executeButton_clicked(); + void CopyCommandLine(); + void LoadFromXML(); + void SaveToXML(); private: - QMenu* helpMenu; - QAction* helpAction; + ::Ui::AppMainWindow* ui; QtWidgetView* gui; }; diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h index fa4c8ffe9216fdfb2bd5a4e82f66335ccc6edb16..dc6ec0b88dc32a476caf52a7781b9ce32d5bb418 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetModel.h @@ -37,17 +37,16 @@ class OTBQtWidget_EXPORT AppliThread : public QThread Q_OBJECT public: - AppliThread(Application* app) - { - m_Application = app; + AppliThread(Application::Pointer app) : m_Application(app) + { } ~AppliThread() override; - void Execute() + /** Ask the running application to stop */ + void Stop() { - // Call the signal start to begin running the program - start(); + m_Application->Stop(); } signals: @@ -66,13 +65,6 @@ signals: */ void ExceptionRaised( QString what ); -public slots: - /** Ask the running application to stop */ - void Stop() - { - m_Application->Stop(); - } - protected: void run() override; @@ -107,6 +99,10 @@ public: return m_LogOutput; } + bool IsRunning() const; + + void Stop(); + /** Logger warning message sender */ void SendLogWARNING( const std::string & mes ); /** Logger info message sender */ @@ -114,13 +110,6 @@ public: /** Logger debug message sender */ void SendLogDEBUG( const std::string & mes ); - /** Used by inxml when forcing xml parse flag to update widget data via UpdateGui */ - void UpdateAllWidgets() - { - GetApplication()->ForceInXMLParseFlag(); - emit UpdateGui(); - } - signals: void SetApplicationReady(bool); @@ -144,8 +133,6 @@ signals: void UpdateGui(); - void Stop(); - public slots: /** * \brief Slots called every time one of the widget needs to be @@ -168,19 +155,18 @@ private slots: */ void OnApplicationExecutionDone( int status ); - void TimerDone(); - private: QtWidgetModel(const QtWidgetModel&) = delete; void operator=(const QtWidgetModel&) = delete; - Application::Pointer m_Application; - QtLogOutput::Pointer m_LogOutput; + AppliThread* m_taskAppli; + bool m_IsRunning; - QTimer *m_Timer; +public: + Application::Pointer m_Application; }; diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h deleted file mode 100644 index 5896481a4d4fe39cf9bfd96c5cd26c147cf36ef7..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetOutputProcessXMLParameter.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbWrapperQtWidgetOutputProcessXMLParameter_h -#define otbWrapperQtWidgetOutputProcessXMLParameter_h - -#include <QtWidgets> -#include "otbWrapperOutputProcessXMLParameter.h" -#include "otbWrapperQtWidgetParameterBase.h" - - -namespace otb -{ -namespace Wrapper -{ - -/** \class QtWidgetOutputProcessXMLParameter - * \brief - * - * \ingroup OTBQtWidget - */ -class OTBQtWidget_EXPORT QtWidgetOutputProcessXMLParameter : public QtWidgetParameterBase -{ - Q_OBJECT -public: - QtWidgetOutputProcessXMLParameter(OutputProcessXMLParameter*, QtWidgetModel*, QWidget*); - ~QtWidgetOutputProcessXMLParameter() override; - - const QLineEdit* GetInput() const; - QLineEdit* GetInput(); - -public slots: - void SetFileName( const QString& value ); - -protected slots: - void SelectFile(); - -private: - QtWidgetOutputProcessXMLParameter(const QtWidgetOutputProcessXMLParameter&) = delete; - void operator=(const QtWidgetOutputProcessXMLParameter&) = delete; - - void DoCreateWidget() override; - - void DoUpdateGUI() override; - - - OutputProcessXMLParameter::Pointer m_XMLParam; - - QHBoxLayout * m_HLayout; - QLineEdit* m_Input; - QPushButton * m_Button; -}; - - -} -} - -#endif diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h index a84acb452ddb484f934f8c7d4f6275f312a36f95..3eb77f9f800174904918eb1cc00473d216c60abf 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetParameterGroup.h @@ -24,8 +24,8 @@ #include <QtWidgets> #include "otbWrapperParameterGroup.h" #include "otbWrapperQtWidgetParameterBase.h" -#include "otbWrapperInputProcessXMLParameter.h" -#include "otbWrapperOutputProcessXMLParameter.h" +#include "otbWrapperInputXML.h" +#include "otbWrapperOutputXML.h" namespace otb { diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h deleted file mode 100644 index a8a46382f27497d7449980724ea9fe1c69fcda29..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetProgressReport.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef otbWrapperQtWidgetProgressReport_h -#define otbWrapperQtWidgetProgressReport_h - -#include <QtWidgets> -#include "otbWrapperQtWidgetModel.h" -#include "itkQtProgressBar.h" -#include "itkProcessObject.h" -#include <string> - - -namespace otb -{ -namespace Wrapper -{ - -/** \class QtWidgetProgressReport - * \brief Create a widget reporting the progress of the application - * process. - * - * \ingroup OTBQtWidget - */ -class OTBQtWidget_EXPORT QtWidgetProgressReport : public QWidget -{ - Q_OBJECT -public: - QtWidgetProgressReport(QtWidgetModel * model, QWidget * parent); - ~QtWidgetProgressReport() override; - - void SetApplication(Application::Pointer app); - - typedef itk::MemberCommand< QtWidgetProgressReport > AddProcessCommandType; - - void ProcessEvent( itk::Object * caller, const itk::EventObject & event ); - - std::string GetCurrentDescription() - { - return m_CurrentDescription; - } - -/* - itk::ProcessObject* GetCurrentProcess() - { - return m_CurrentProcess; - } - - QtWidgetModel * GetModel() - { - m_Model; - } - - QVBoxLayout * GetLayout() - { - return m_Layout; - } -*/ -public slots: - void RemoveLayout(); - /*virtual */void ReportProcess(); - - signals: - void AddNewProcessToReport(); - -private: - QtWidgetProgressReport(const QtWidgetProgressReport&) = delete; - void operator=(const QtWidgetProgressReport&) = delete; - - Application::Pointer m_Application; - QtWidgetModel * m_Model; - QVBoxLayout * m_Layout; - - AddProcessCommandType::Pointer m_AddProcessCommand; - itk::ProcessObject* m_CurrentProcess; - std::string m_CurrentDescription; -}; - -} -} - -#endif diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h index 47b6c1a1504e075dd61c7a892addca54f10306f2..9bfc7be1dfc8b65f20c78624cbd487da93336a62 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetSimpleProgressReport.h @@ -39,14 +39,14 @@ namespace Wrapper * * \ingroup OTBQtWidget */ -class OTBQtWidget_EXPORT QtWidgetSimpleProgressReport : public QWidget +class OTBQtWidget_EXPORT QtWidgetSimpleProgressReport : public itk::QtProgressBar { Q_OBJECT public: - QtWidgetSimpleProgressReport(QtWidgetModel * model, QWidget * parent); + QtWidgetSimpleProgressReport(QWidget* parent); ~QtWidgetSimpleProgressReport() override; - void SetApplication(Application::Pointer app); + void SetModel(QtWidgetModel* model); typedef itk::MemberCommand< QtWidgetSimpleProgressReport > AddProcessCommandType; @@ -56,25 +56,17 @@ public slots: void Init(); void ReportProcess(); - signals: +signals: void AddNewProcessToReport(); + void SetText(QString); private: QtWidgetSimpleProgressReport(const QtWidgetSimpleProgressReport&) = delete; - void operator=(const QtWidgetSimpleProgressReport&); //purposely not - //implemented - - Application::Pointer m_Application; - QtWidgetModel * m_Model; - QVBoxLayout * m_Layout; + void operator=(const QtWidgetSimpleProgressReport&) = delete; AddProcessCommandType::Pointer m_AddProcessCommand; itk::ProcessObject* m_CurrentProcess; std::string m_CurrentDescription; - - itk::QtProgressBar * m_Bar; - QLabel * m_Label; - }; } diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h index 1ec99d5aae5e40497b4690b5d2c8f872d406b675..96b8d4f6ccd4eb370f09f041c7423cab144b0396 100644 --- a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h +++ b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetView.h @@ -44,10 +44,6 @@ class OTBQtWidget_EXPORT QtWidgetView : { Q_OBJECT - Q_PROPERTY( bool isClosable - READ IsClosable - WRITE SetClosable ); - public: static char const * const OBJECT_NAME; @@ -66,12 +62,15 @@ public: /** \brief Model Accessor */ QtWidgetModel* GetModel() const; - bool IsClosable() const; + virtual bool BeforeExecuteButtonClicked() + { + return true; + } - void UnhandledException(QString message); + void Disable(); + void Enable(); signals: - void QuitSignal(); void ExecuteAndWriteOutput(); void Stop(); void OTBApplicationOutputImageChanged( const QString &, const QString &); @@ -83,24 +82,12 @@ protected: virtual QWidget* CreateInputWidgets(); - // QWidget overloads. - void closeEvent( QCloseEvent * event ) override; - -protected: - - /** Html section for 'Done' icon */ - std::string m_IconPathDone; - - /** Html section for 'Failed' icon */ - std::string m_IconPathFailed; - protected slots: - virtual void OnExecButtonClicked(); + virtual void OnExecButtonClicked() + { + } - virtual void OnExceptionRaised( QString what ); - -// Private methods. private: QtWidgetView(const QtWidgetView&) = delete; @@ -108,29 +95,10 @@ private: QWidget* CreateFooter(); -// Private attributes. private: - otb::Wrapper::QtWidgetModel* m_Model; - QPushButton* m_ExecButton; - QPushButton* m_QuitButton; - QShortcut* m_QuitShortcut; - QLabel* m_Message; - QTextEdit *m_LogText; - QTabWidget *m_TabWidget; - - bool m_IsClosable : 1; bool m_IsRunning; - -private slots: - void UpdateMessageAfterExecution(int status); - void UpdateMessageAfterApplicationReady(bool val); - - void OnProgressReportBegin(); - void OnProgressReportEnd( int status ); - void SetClosable( bool ); - }; } // end namespace 'Wrapper' diff --git a/Modules/Wrappers/QtWidget/src/CMakeLists.txt b/Modules/Wrappers/QtWidget/src/CMakeLists.txt index 94c61a93f8d95baa51b31df9fb62679260197c3d..461bd06209a5bc418ae79972b7e221efe0c55bc1 100644 --- a/Modules/Wrappers/QtWidget/src/CMakeLists.txt +++ b/Modules/Wrappers/QtWidget/src/CMakeLists.txt @@ -24,7 +24,6 @@ set(OTBQtWidget_SRC otbWrapperQtWidgetParameterLabel.cxx otbWrapperQtWidgetView.cxx otbWrapperQtWidgetMainWindow.cxx - otbWrapperQtWidgetInputProcessXMLParameter.cxx otbWrapperQtWidgetIntParameter.cxx otbWrapperQtWidgetInputVectorDataListParameter.cxx otbWrapperQtWidgetSimpleProgressReport.cxx @@ -44,8 +43,6 @@ set(OTBQtWidget_SRC otbWrapperQtWidgetParameterGroup.cxx otbWrapperQtWidgetInputFilenameListParameter.cxx otbWrapperQtWidgetRAMParameter.cxx - otbWrapperQtWidgetProgressReport.cxx - otbWrapperQtWidgetOutputProcessXMLParameter.cxx otbWrapperQtWidgetParameterBase.cxx otbWrapperQtWidgetInputImageParameter.cxx otbWrapperQtWidgetStringListParameter.cxx @@ -71,15 +68,12 @@ set(OTBQtWidget_MOC_HDR ../include/otbWrapperQtWidgetInputVectorDataParameter.h ../include/otbWrapperQtWidgetOutputImageParameter.h ../include/otbWrapperQtWidgetOutputVectorDataParameter.h - ../include/otbWrapperQtWidgetOutputProcessXMLParameter.h - ../include/otbWrapperQtWidgetInputProcessXMLParameter.h ../include/otbWrapperQtWidgetParameterGroup.h ../include/otbWrapperQtWidgetParameterLabel.h ../include/otbWrapperQtWidgetParameterBase.h ../include/otbWrapperQtWidgetModel.h ../include/otbWrapperQtWidgetView.h ../include/otbWrapperQtWidgetMainWindow.h - ../include/otbWrapperQtWidgetProgressReport.h ../include/otbWrapperQtWidgetListViewParameter.h ../include/otbQtFileSelectionWidget.h ../include/otbQtStringSelectionWidget.h @@ -101,6 +95,7 @@ set(OTBQtWidget_MOC_HDR set( OTBQtWidget_FORMS otbWrapperQtWidgetListEditWidget.ui + appmainwindow.ui ) set( OTBQtWidget_RESOURCES diff --git a/Modules/Wrappers/QtWidget/src/appmainwindow.ui b/Modules/Wrappers/QtWidget/src/appmainwindow.ui new file mode 100644 index 0000000000000000000000000000000000000000..1a2408b89cc9fbbe307a8cdb128f779dfdf517cd --- /dev/null +++ b/Modules/Wrappers/QtWidget/src/appmainwindow.ui @@ -0,0 +1,243 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AppMainWindow</class> + <widget class="QMainWindow" name="AppMainWindow"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>900</width> + <height>600</height> + </rect> + </property> + <property name="windowTitle"> + <string>MainWindow</string> + </property> + <property name="windowIcon"> + <iconset resource="otbWrapperQtWidgetIcons.qrc"> + <normaloff>:/Utilities/Data/Icons/monteverdi-48x48.png</normaloff>:/Utilities/Data/Icons/monteverdi-48x48.png</iconset> + </property> + <widget class="QWidget" name="centralwidget"> + <layout class="QVBoxLayout" name="verticalLayout"> + <property name="spacing"> + <number>16</number> + </property> + <property name="leftMargin"> + <number>16</number> + </property> + <property name="topMargin"> + <number>12</number> + </property> + <property name="rightMargin"> + <number>16</number> + </property> + <property name="bottomMargin"> + <number>12</number> + </property> + <item> + <widget class="QTabWidget" name="tabWidget"> + <property name="currentIndex"> + <number>0</number> + </property> + <widget class="QWidget" name="tab1"> + <attribute name="title"> + <string>Parameters</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <property name="spacing"> + <number>16</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QScrollArea" name="scrollArea"> + <property name="frameShape"> + <enum>QFrame::NoFrame</enum> + </property> + <property name="widgetResizable"> + <bool>true</bool> + </property> + <widget class="QWidget" name="scrollAreaWidgetContents"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>864</width> + <height>425</height> + </rect> + </property> + <layout class="QHBoxLayout" name="horizontalLayout_2"> + <property name="spacing"> + <number>16</number> + </property> + </layout> + </widget> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="tab2"> + <attribute name="title"> + <string>Log</string> + </attribute> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <property name="spacing"> + <number>16</number> + </property> + <property name="leftMargin"> + <number>0</number> + </property> + <property name="topMargin"> + <number>0</number> + </property> + <property name="rightMargin"> + <number>0</number> + </property> + <property name="bottomMargin"> + <number>0</number> + </property> + <item> + <widget class="QPlainTextEdit" name="plainTextEdit"> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + </layout> + </widget> + </widget> + </item> + <item alignment="Qt::AlignHCenter|Qt::AlignVCenter"> + <widget class="QLabel" name="deprecation"> + <property name="text"> + <string>Deprecation status</string> + </property> + </widget> + </item> + <item> + <widget class="QLabel" name="message"> + <property name="text"> + <string>Status text</string> + </property> + <property name="wordWrap"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="spacing"> + <number>16</number> + </property> + <property name="sizeConstraint"> + <enum>QLayout::SetDefaultConstraint</enum> + </property> + <item> + <widget class="otb::Wrapper::QtWidgetSimpleProgressReport" name="progressBar"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="value"> + <number>0</number> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="executeButton"> + <property name="text"> + <string>Execute</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + <widget class="QMenuBar" name="menubar"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>900</width> + <height>22</height> + </rect> + </property> + <widget class="QMenu" name="menuApplication"> + <property name="title"> + <string>Application</string> + </property> + <addaction name="separator"/> + <addaction name="actionCopy_command_line"/> + <addaction name="actionLoad_from_XML"/> + <addaction name="actionSave_to_XML"/> + <addaction name="separator"/> + <addaction name="actionQuit"/> + </widget> + <widget class="QMenu" name="menuHelp"> + <property name="title"> + <string>Help</string> + </property> + <addaction name="actionDocumentation"/> + </widget> + <addaction name="menuApplication"/> + <addaction name="menuHelp"/> + </widget> + <widget class="QStatusBar" name="statusBar"> + <property name="styleSheet"> + <string notr="true">color: rgb(85, 87, 83);</string> + </property> + </widget> + <action name="actionDocumentation"> + <property name="text"> + <string>Documentation</string> + </property> + <property name="shortcut"> + <string>F1</string> + </property> + </action> + <action name="actionQuit"> + <property name="text"> + <string>Quit</string> + </property> + <property name="shortcut"> + <string>Ctrl+Q</string> + </property> + </action> + <action name="actionCopy_command_line"> + <property name="text"> + <string>Copy command line to clipboard</string> + </property> + </action> + <action name="actionLoad_from_XML"> + <property name="text"> + <string>Load from XML</string> + </property> + </action> + <action name="actionSave_to_XML"> + <property name="text"> + <string>Save to XML</string> + </property> + </action> + </widget> + <customwidgets> + <customwidget> + <class>otb::Wrapper::QtWidgetSimpleProgressReport</class> + <extends>QProgressBar</extends> + <header>otbWrapperQtWidgetSimpleProgressReport.h</header> + </customwidget> + </customwidgets> + <resources> + <include location="otbWrapperQtWidgetIcons.qrc"/> + </resources> + <connections/> +</ui> diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc index 60701a70320c2449e328d4cc1d3d907e79a5f4b4..6762620b11e830eb51ee174e56f891a3386c408e 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetIcons.qrc @@ -2,5 +2,6 @@ <qresource> <file>../../../../Utilities/Data/Icons/mIconClearText.png</file> <file>../../../../Utilities/Data/Icons/mIconClearTextHover.png</file> + <file>../../../../Utilities/Data/Icons/monteverdi-48x48.png</file> </qresource> </RCC> diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx deleted file mode 100644 index fdd95d1135ec9ebe62d2ccfe179a963dd28ab488..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetInputProcessXMLParameter.cxx +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbWrapperQtWidgetInputProcessXMLParameter.h" - - -#include <otbQtAdapters.h> - - -namespace otb -{ -namespace Wrapper -{ - -QtWidgetInputProcessXMLParameter::QtWidgetInputProcessXMLParameter(InputProcessXMLParameter* param, QtWidgetModel* m, QWidget * parent) -: QtWidgetParameterBase(param, m, parent), - m_XMLParam(param) -{ -} - -QtWidgetInputProcessXMLParameter::~QtWidgetInputProcessXMLParameter() -{ -} - -const QLineEdit* -QtWidgetInputProcessXMLParameter -::GetInput() const -{ - return m_Input; -} - -QLineEdit* -QtWidgetInputProcessXMLParameter -::GetInput() -{ - return m_Input; -} - -void QtWidgetInputProcessXMLParameter::DoUpdateGUI() -{ - if (m_XMLParam->HasUserValue()) - { - // Update the lineEdit - QString text( - QFile::decodeName( m_XMLParam->GetFileName() ) - ); - - if (text != m_Input->text()) - m_Input->setText(text); - } -} - -void QtWidgetInputProcessXMLParameter::DoCreateWidget() -{ - // Set up input text edit - m_HLayout = new QHBoxLayout; - m_HLayout->setSpacing(0); - m_HLayout->setContentsMargins(0, 0, 0, 0); - m_Input = new QLineEdit(this); - m_Input->setToolTip( - QString::fromStdString( m_XMLParam->GetDescription() ) - ); - connect( m_Input, &QLineEdit::textChanged, this, &QtWidgetInputProcessXMLParameter::SetFileName ); - connect( m_Input, &QLineEdit::textChanged, GetModel(), &QtWidgetModel::NotifyUpdate ); - - m_HLayout->addWidget(m_Input); - - // Set up input text edit - m_Button = new QPushButton(this); - m_Button->setText("..."); - m_Button->setToolTip("Select file..."); - m_Button->setMaximumWidth(m_Button->width()); - connect( m_Button, &QPushButton::clicked, this, &QtWidgetInputProcessXMLParameter::SelectFile ); - m_HLayout->addWidget(m_Button); - - this->setLayout(m_HLayout); -} - - -void -QtWidgetInputProcessXMLParameter -::SelectFile() -{ - assert( m_Input!=NULL ); - - QString filename( - otb::GetOpenFilename( - this, - QString(), - m_Input->text(), - tr( "XML File (*.xml)" ), - NULL, - QFileDialog::ReadOnly - ) - ); - - if( filename.isEmpty() ) - return; - - m_Input->setText( filename ); -} - - -void QtWidgetInputProcessXMLParameter::SetFileName(const QString& value) -{ - // load xml file name - if( m_XMLParam->SetFileName( - QFile::encodeName( value ).constData() ) ) - { - // notify of value change - QString key( m_XMLParam->GetKey() ); - emit ParameterChanged(key); - GetModel()->GetApplication()->ForceInXMLParseFlag(); - } -} - -} - -} diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx index 736a3d8fdbcf847f532fa1fd3ac277ba8326f39c..1dd3dae0c592c43c685ac47ddcd33ef6fcd26ceb 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetListViewParameter.cxx @@ -120,7 +120,6 @@ void QtWidgetListViewParameter::DoCreateWidget() m_VLayout = new QHBoxLayout; m_VLayout->setContentsMargins(0, 0, 0, 0); m_VLayout->addWidget(m_ListView); - m_ListView->setMaximumSize(m_ListView->width() , 4* m_LineHeight); m_VLayout->activate(); this->setLayout(m_VLayout); @@ -144,6 +143,9 @@ void QtWidgetListViewParameter::SelectedItems() // make sure parameter is enabled m_ListViewParam->SetActive(true); m_ListViewParam->SetUserValue(true); + + // Call the application DoUpdateParameters, then all widgets' DoUpdateGUI (including this one) + this->GetModel()->NotifyUpdate(); } } diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx index d185a8b9a9cc3689c0edf67394901f77036ef509..40cd64b48a3f6064280007b6706dc2989c4bd629 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx @@ -19,46 +19,180 @@ */ #include "otbWrapperQtWidgetMainWindow.h" +#include "otbWrapperOutputXML.h" #include <QtWidgets> + #include "otbWrapperQtWidgetView.h" +#include "ui_appmainwindow.h" + namespace otb { namespace Wrapper { -QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent, Qt::WindowFlags flags) : - QMainWindow(parent, flags), - gui(gui) +QtMainWindow::QtMainWindow(Application::Pointer app, QtWidgetView* gui, QWidget* parent) : QMainWindow(parent), ui(new Ui::AppMainWindow), gui(gui) { - this->setWindowIcon(QIcon(":/otb_small.png")); - this->setWindowTitle(QString(app->GetDocName()).append(" - ").append(OTB_VERSION_STRING)); + ui->setupUi(this); + + // Setup the "View command line" widget + this->setWindowTitle(QString(app->GetName()).append(" - OTB ").append(OTB_VERSION_STRING)); // Set the given application view widget gui->setParent(this); - this->setCentralWidget(gui); - - // Connect the View "Quit" signal, to the mainWindow close slot - connect(gui, &QtWidgetView::QuitSignal, this, &QMainWindow::close); - - // Setup the help menu - QMenu* helpMenu = this->menuBar()->addMenu(tr("&Help")); - helpAction = new QAction(tr("&Documentation"), this); - helpAction->setShortcuts(QKeySequence::HelpContents); - helpMenu->addAction(helpAction); - const std::string url = std::string("https://www.orfeo-toolbox.org/CookBook/Applications/app_") + app->GetName() + std::string(".html"); - QObject::connect(helpAction, &QAction::triggered, this, [=] { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); }); + ui->scrollArea->setWidget(gui); + + // Connect menu buttons + const auto url = std::string("https://www.orfeo-toolbox.org/CookBook/Applications/app_") + app->GetName() + std::string(".html"); + connect(ui->actionDocumentation, &QAction::triggered, this, [=] { QDesktopServices::openUrl(QUrl(QString::fromStdString(url))); }); + + connect(ui->actionCopy_command_line, &QAction::triggered, this, &QtMainWindow::CopyCommandLine); + connect(ui->actionLoad_from_XML, &QAction::triggered, this, &QtMainWindow::LoadFromXML); + connect(ui->actionSave_to_XML, &QAction::triggered, this, &QtMainWindow::SaveToXML); + connect(ui->actionQuit, &QAction::triggered, this, &QMainWindow::close); + + // Setup execute / cancel button + ui->executeButton->setDefault(true); + ui->executeButton->setEnabled(false); + ui->executeButton->setText(QObject::tr("Execute")); + + connect(gui->GetModel(), &QtWidgetModel::SetApplicationReady, ui->executeButton, &QPushButton::setEnabled); + connect(this, &QtMainWindow::ExecuteAndWriteOutput, gui->GetModel(), &QtWidgetModel::ExecuteAndWriteOutputSlot); + + connect(gui->GetModel(), &QtWidgetModel::SetApplicationReady, this, &QtMainWindow::UpdateMessageAfterApplicationReady); + connect(gui->GetModel(), &QtWidgetModel::SetProgressReportDone, this, &QtMainWindow::UpdateMessageAfterExecution); + + connect(gui->GetModel(), &QtWidgetModel::ExceptionRaised, [&] { ui->tabWidget->setCurrentIndex(1); }); + + // Status bar and message default text + ui->statusBar->showMessage(tr("Select parameters")); + ui->message->setText(""); + + // Setup the progress bar to observe the model + ui->progressBar->SetModel(gui->GetModel()); + + // Fill and display the deprecation status label if needed, or hide it. + if (app->IsDeprecated()) + { + ui->deprecation->setVisible(true); + ui->deprecation->setText("<font color='#E65100'>This application is deprecated and will be removed in a future release.</font>"); + } + else + { + ui->deprecation->setVisible(false); + ui->deprecation->setText(""); + } + + // Connect application progress text to the QLabel + connect(ui->progressBar, &QtWidgetSimpleProgressReport::SetText, ui->message, &QLabel::setText); + + // Connect log output to the textEdit area + connect(gui->GetModel()->GetLogOutput(), &QtLogOutput::NewContentLog, ui->plainTextEdit, &QPlainTextEdit::appendPlainText); +} + +void QtMainWindow::UpdateMessageAfterApplicationReady(bool val) +{ + if (!gui->GetModel()->IsRunning()) + { + if (val == true) + { + ui->statusBar->showMessage(tr("Ready to run")); + } + else + { + ui->statusBar->showMessage(tr("Select parameters")); + } + } +} + +void QtMainWindow::UpdateMessageAfterExecution(int status) +{ + if (status >= 0) + { + ui->statusBar->showMessage(tr("Done")); + } + else + { + ui->statusBar->showMessage(tr("Failed!")); + } + ui->executeButton->setText(tr("Execute")); + gui->Enable(); +} + +void QtMainWindow::on_executeButton_clicked() +{ + if (gui->GetModel()->IsRunning()) + { + ui->statusBar->showMessage(tr("Cancelling...")); + gui->GetModel()->Stop(); + } + else + { + if (gui->BeforeExecuteButtonClicked()) + { + gui->Disable(); + ui->statusBar->showMessage(tr("Running...")); + ui->executeButton->setText(tr("Cancel")); + emit ExecuteAndWriteOutput(); + } + } +} + +void QtMainWindow::CopyCommandLine() +{ + // Get command line + std::string cmdLine = otb::Wrapper::XML::MakeCommandLine(gui->GetModel()->m_Application); + + // Copy it to clipboard + QClipboard* clipboard = QGuiApplication::clipboard(); + clipboard->setText(QString::fromStdString(cmdLine)); + + // Also show it in the log + gui->GetModel()->SendLogINFO(cmdLine); +} + +void QtMainWindow::LoadFromXML() +{ + QString filename = QFileDialog::getOpenFileName(this, tr("Load from XML"), "", tr("XML files (*.xml);;All files (*)")); + + if (!filename.isNull()) + { + gui->GetModel()->m_Application->LoadParametersFromXML(filename.toStdString()); + gui->GetModel()->UpdateGui(); + } } -QtWidgetView* QtMainWindow::Gui() const +void QtMainWindow::SaveToXML() +{ + QString filename = QFileDialog::getSaveFileName(this, tr("Save to XML"), "", tr("XML files (*.xml);;All files (*)")); + + if (!filename.isNull()) + { + gui->GetModel()->m_Application->SaveParametersToXML(filename.toStdString()); + } +} + +QtMainWindow::~QtMainWindow() +{ + delete ui; +} + +otb::Wrapper::QtWidgetView* QtMainWindow::Gui() const { return gui; } void QtMainWindow::UnhandledException(QString message) { - gui->UnhandledException(message); + ui->plainTextEdit->appendPlainText(message); + ui->tabWidget->setCurrentIndex(1); +} + +void QtMainWindow::closeEvent(QCloseEvent* event) +{ + gui->GetModel()->Stop(); + QMainWindow::closeEvent(event); } } // namespace Wrapper diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx index 6803a555110064cfcb0199661c6280313618b32b..9047819d649166b1e25ba2f0e6ca9953dd8c7e7f 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx @@ -21,7 +21,7 @@ #include "otbWrapperQtWidgetModel.h" //Use to create command line from the application parameters -#include "otbWrapperOutputProcessXMLParameter.h" +#include "otbWrapperOutputXML.h" using std::string; @@ -31,11 +31,7 @@ namespace otb namespace Wrapper { -QtWidgetModel -::QtWidgetModel(Application* app) : - m_Application(app), - m_LogOutput(), - m_IsRunning(false) +QtWidgetModel ::QtWidgetModel(Application* app) : m_LogOutput(), m_taskAppli(nullptr), m_IsRunning(false), m_Application(app) { // Init only if not already done if(!m_Application->IsInitialized()) @@ -47,23 +43,19 @@ QtWidgetModel // Attach log output to the Application logger m_Application->GetLogger()->AddLogOutput(m_LogOutput); - - m_Timer = new QTimer(this); - m_Timer->setSingleShot(true); - m_Timer->setInterval(1000); - QObject::connect( m_Timer, &QTimer::timeout, this, &QtWidgetModel::TimerDone ); } QtWidgetModel::~QtWidgetModel() { - if (m_Timer) - delete m_Timer; + delete m_taskAppli; } void QtWidgetModel ::NotifyUpdate() { + assert(!m_IsRunning && "Cannot update parameters while application is running."); + // Update the parameters try { @@ -118,108 +110,39 @@ QtWidgetModel emit SetApplicationReady(false); m_IsRunning = true; - //Buld corresponding command line and display to the Log tab - - //Build XML DOM from m_application - OutputProcessXMLParameter::Pointer outXMLParam = OutputProcessXMLParameter::New(); - - TiXmlElement* XMLAppElement = outXMLParam->ParseApplication(m_Application); - - //Create command line from the XML document - TiXmlElement * pName, *pParam; - std::ostringstream cmdLine; - - cmdLine << ""; - - if(XMLAppElement) - { - pName = XMLAppElement->FirstChildElement("name"); - - cmdLine << "otbcli_" << pName->GetText(); -#ifdef _WIN32 - cmdLine << ".bat"; -#endif - cmdLine << " "; - - //Parse application parameters - pParam = XMLAppElement->FirstChildElement("parameter"); - - while(pParam) - { - //Get parameter key - cmdLine << "-"; - cmdLine << pParam->FirstChildElement("key")->GetText(); - cmdLine << " "; - - //Some parameters can have multiple values. Test it and handle this - //specific case - TiXmlElement * values = pParam->FirstChildElement("values"); - - if (values) - { - //Loop over value - TiXmlElement * pValue = values->FirstChildElement("value"); - while(pValue) - { - cmdLine << pValue->GetText(); - cmdLine << " "; - - pValue = pValue->NextSiblingElement(); // iteration over multiple values - } - } - else - { - //Get parameter value - cmdLine << pParam->FirstChildElement("value")->GetText(); - cmdLine << " "; - - //In case of OutputImageparameter we need to report output pixel type - TiXmlElement * pPixType = pParam->FirstChildElement("pixtype"); - - if (pPixType) - { - cmdLine << pPixType->GetText(); - cmdLine << " "; - } - } - - pParam = pParam->NextSiblingElement(); // iteration over parameters - } - - //Insert a new line character at the end of the command line - cmdLine << std::endl; - - //Report the command line string to the application logger - m_Application->GetLogger()->Write(itk::LoggerBase::INFO, cmdLine.str()); - } - // launch the output image writing - AppliThread *taskAppli = new AppliThread( m_Application ); - - QObject::connect( taskAppli, &AppliThread::ExceptionRaised, - this, &QtWidgetModel::ExceptionRaised ); + delete m_taskAppli; + m_taskAppli = new AppliThread(m_Application); - QObject::connect( taskAppli, &AppliThread::ApplicationExecutionDone, - this, &QtWidgetModel::OnApplicationExecutionDone ); + QObject::connect(m_taskAppli, &AppliThread::ExceptionRaised, this, &QtWidgetModel::ExceptionRaised); - QObject::connect( taskAppli, &AppliThread::finished, - taskAppli, &AppliThread::deleteLater ); - - QObject::connect( this, &QtWidgetModel::Stop, - taskAppli, &AppliThread::Stop ); + QObject::connect(m_taskAppli, &AppliThread::ApplicationExecutionDone, this, &QtWidgetModel::OnApplicationExecutionDone); // Tell the Progress Reporter to begin emit SetProgressReportBegin(); - taskAppli->Execute(); + // Run the application + m_taskAppli->start(); emit SetApplicationReady(true); } +void QtWidgetModel::Stop() +{ + if (m_taskAppli && m_IsRunning) + { + m_taskAppli->Stop(); + m_taskAppli->wait(); + m_IsRunning = false; + } +} + void QtWidgetModel ::OnApplicationExecutionDone( int status ) { + m_IsRunning = false; + // For the progressReport to close the Progress widget // and the GUI to update message emit SetProgressReportDone( status ); @@ -230,18 +153,6 @@ QtWidgetModel oss << "Execution took "<< m_Application->GetLastExecutionTiming() << " sec"; SendLogINFO(oss.str()); } - - // start timer - m_Timer->start(); -} - -void -QtWidgetModel -::TimerDone() -{ - m_IsRunning = false; - // Require GUI update. - NotifyUpdate(); } void @@ -333,6 +244,10 @@ AppliThread emit ApplicationExecutionDone( result ); } +bool QtWidgetModel::IsRunning() const +{ + return m_IsRunning; +} } } diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx deleted file mode 100644 index 42418fb5f174fabaf7aaeb4f4142581b67eafbc3..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetOutputProcessXMLParameter.cxx +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "otbWrapperQtWidgetOutputProcessXMLParameter.h" - -#include <otbQtAdapters.h> - -namespace otb -{ -namespace Wrapper -{ - -QtWidgetOutputProcessXMLParameter::QtWidgetOutputProcessXMLParameter(OutputProcessXMLParameter* param, QtWidgetModel* m, QWidget * parent) -: QtWidgetParameterBase(param, m, parent), - m_XMLParam(param) -{ -} - -QtWidgetOutputProcessXMLParameter::~QtWidgetOutputProcessXMLParameter() -{ -} - -const QLineEdit* -QtWidgetOutputProcessXMLParameter -::GetInput() const -{ - return m_Input; -} - -QLineEdit* -QtWidgetOutputProcessXMLParameter -::GetInput() -{ - return m_Input; -} - -void QtWidgetOutputProcessXMLParameter::DoUpdateGUI() -{ - // Update the lineEdit - QString text( - QFile::decodeName( m_XMLParam->GetFileName() ) - ); -; - if (text != m_Input->text()) - m_Input->setText(text); -} - -void QtWidgetOutputProcessXMLParameter::DoCreateWidget() -{ - // Set up input text edit - m_HLayout = new QHBoxLayout; - m_HLayout->setSpacing(0); - m_HLayout->setContentsMargins(0, 0, 0, 0); - m_Input = new QLineEdit(this); - m_Input->setToolTip( - QString::fromStdString( m_XMLParam->GetDescription() ) - ); - connect( m_Input, &QLineEdit::textChanged, this, &QtWidgetOutputProcessXMLParameter::SetFileName ); - connect( m_Input, &QLineEdit::textChanged, GetModel(), &QtWidgetModel::NotifyUpdate ); - - m_HLayout->addWidget(m_Input); - - // Set up input text edit - m_Button = new QPushButton(this); - m_Button->setText("..."); - m_Button->setToolTip("Select file..."); - m_Button->setMaximumWidth(m_Button->width()); - connect( m_Button, &QPushButton::clicked, this, &QtWidgetOutputProcessXMLParameter::SelectFile ); - m_HLayout->addWidget(m_Button); - - this->setLayout(m_HLayout); -} - - -void -QtWidgetOutputProcessXMLParameter -::SelectFile() -{ - assert( m_Input!=NULL ); - - QString filename( - otb::GetSaveFilename( - this, - QString(), - m_Input->text(), - tr( "XML File (*.xml)" ), - NULL ) - ); - - if( filename.isEmpty() ) - return; - - m_Input->setText( filename ); -} - - -void QtWidgetOutputProcessXMLParameter::SetFileName(const QString& value) -{ - // save xml file name - m_XMLParam->SetValue( - QFile::encodeName( value ).constData() - ); - - // notify of value change - QString key( m_XMLParam->GetKey() ); - emit ParameterChanged(key); - - -} - -} -} diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterFactory.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterFactory.cxx index 2f382da98d8ba177b763b3264fae37c5a239f378..2b2ae79bd1add2aee3f4f376ff7d22168626ca09 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterFactory.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterFactory.cxx @@ -33,14 +33,12 @@ #include "otbWrapperQtWidgetInputFilenameListParameter.h" #include "otbWrapperQtWidgetInputImageParameter.h" #include "otbWrapperQtWidgetInputImageListParameter.h" -#include "otbWrapperQtWidgetInputProcessXMLParameter.h" #include "otbWrapperQtWidgetInputVectorDataListParameter.h" #include "otbWrapperQtWidgetInputVectorDataParameter.h" #include "otbWrapperQtWidgetListViewParameter.h" #include "otbWrapperQtWidgetModel.h" #include "otbWrapperQtWidgetOutputFilenameParameter.h" #include "otbWrapperQtWidgetOutputImageParameter.h" -#include "otbWrapperQtWidgetOutputProcessXMLParameter.h" #include "otbWrapperQtWidgetOutputVectorDataParameter.h" #include "otbWrapperQtWidgetParameterBase.h" #include "otbWrapperQtWidgetParameterGroup.h" @@ -121,8 +119,6 @@ QtWidgetParameterFactory::CreateQtWidget( Parameter* param, QtWidgetModel* model CREATEWIDGET(BoolParameter, QtWidgetBoolParameter) CREATEWIDGET(ParameterGroup, QtWidgetParameterGroup) CREATEWIDGET(RAMParameter, QtWidgetRAMParameter) - CREATEWIDGET(OutputProcessXMLParameter, QtWidgetOutputProcessXMLParameter) - CREATEWIDGET(InputProcessXMLParameter, QtWidgetInputProcessXMLParameter) #undef CREATEWIDGET if (widget) diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx index 61c72aa250beeeffbc613e8f2beec7728dbfe7ef..7faea2ce2294065ac3a3b9d331891c9585e4451e 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx @@ -50,8 +50,7 @@ void QtWidgetParameterGroup::DoCreateWidget() { // a GridLayout with two columns : parameter label / parameter widget QGridLayout *gridLayout = new QGridLayout; - gridLayout->setSpacing(1); - gridLayout->setContentsMargins(0, 0, 0, 0); + this->setLayout(gridLayout); unsigned int nbParams = m_ParamList->GetNumberOfParameters(); for (unsigned int i = 0; i < nbParams; ++i) @@ -63,15 +62,9 @@ void QtWidgetParameterGroup::DoCreateWidget() { ParameterGroup* paramAsGroup = dynamic_cast<ParameterGroup*>(param); ChoiceParameter* paramAsChoice = dynamic_cast<ChoiceParameter*>(param); - OutputProcessXMLParameter* paramAsInXML = dynamic_cast<OutputProcessXMLParameter*>(param); - InputProcessXMLParameter* paramAsOutXML = dynamic_cast<InputProcessXMLParameter*>(param); - - bool paramIsXML = false; - if(paramAsInXML != nullptr || paramAsOutXML != nullptr) - paramIsXML = true; - if (paramAsGroup == nullptr && paramAsChoice == nullptr && !paramIsXML) - { + if (paramAsGroup == nullptr && paramAsChoice == nullptr) + { // Label (col 1) QWidget* label = new QtWidgetParameterLabel( rawParam , this); gridLayout->addWidget(label, i, 1); @@ -139,8 +132,6 @@ void QtWidgetParameterGroup::DoCreateWidget() } } } - - this->setLayout(gridLayout); } diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx deleted file mode 100644 index 4e958f82b2078727d204d1363c27a7579d2717ed..0000000000000000000000000000000000000000 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetProgressReport.cxx +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) - * - * This file is part of Orfeo Toolbox - * - * https://www.orfeo-toolbox.org/ - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - - -#include "otbWrapperQtWidgetProgressReport.h" -#include "otbWrapperOutputImageParameter.h" -#include "itksys/SystemTools.hxx" - -#include "otbWrapperAddProcessToWatchEvent.h" - -namespace otb -{ -namespace Wrapper -{ - -QtWidgetProgressReport::QtWidgetProgressReport(QtWidgetModel * model, QWidget * parent) - : QWidget(parent) - , m_CurrentProcess() -{ - m_Model = model; - connect(model, &QtWidgetModel::SetProgressReportBegin, this, &QtWidgetProgressReport::show ); - connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetProgressReport::close ); - connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetProgressReport::RemoveLayout ); - connect(this, &QtWidgetProgressReport::AddNewProcessToReport, this, &QtWidgetProgressReport::ReportProcess ); - - m_Layout = new QVBoxLayout; - this->setLayout(m_Layout); - - m_AddProcessCommand = AddProcessCommandType::New(); - m_AddProcessCommand->SetCallbackFunction( this, &QtWidgetProgressReport::ProcessEvent ); - - this->show(); -} - -QtWidgetProgressReport::~QtWidgetProgressReport() -{ -} - -void QtWidgetProgressReport::SetApplication(Application::Pointer app) -{ - m_Application = app; - m_Application->AddObserver( AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer() ); -} - -void -QtWidgetProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller), - const itk::EventObject & ev ) -{ - if( typeid( otb::Wrapper::AddProcessToWatchEvent ) == typeid( ev ) ) - { - const AddProcessToWatchEvent* eventToWatch = dynamic_cast< const AddProcessToWatchEvent*> ( &ev ); - - if(eventToWatch) - { - m_CurrentProcess = eventToWatch->GetProcess(); - m_CurrentDescription = eventToWatch->GetProcessDescription(); - emit AddNewProcessToReport(); - } - } -} - -void QtWidgetProgressReport::ReportProcess ( ) -{ - // Build the widget containing the QtProgressBar for the current - // process - - // Create a itk::QtProgressBar, observing the event ProgressEvent - itk::QtProgressBar * bar = new itk::QtProgressBar(this); - connect( bar, &itk::QtProgressBar::SetValueChanged, bar, &itk::QtProgressBar::setValue ); - connect( m_Model, &QtWidgetModel::SetProgressReportDone, bar, &itk::QtProgressBar::reset ); - bar->Observe(m_CurrentProcess); - - // label - QLabel *label = new QLabel(QString(m_CurrentDescription.c_str()), this); - - // Build the layout and store the pointers - m_Layout->addWidget(label); - m_Layout->addWidget(bar); -} - -void QtWidgetProgressReport::RemoveLayout() -{ - // Remove the children of the layout (progress bar widgets) - QLayoutItem *child; - while ((child = this->layout()->takeAt(0)) != nullptr) - { - delete child->widget(); - delete child; - } -} - -} -} diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx index 8df23531e7646587a7bf1e726cf701c365197936..19fffe036460e8a2425103319d84855328a780f2 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSimpleProgressReport.cxx @@ -30,44 +30,29 @@ namespace otb namespace Wrapper { -QtWidgetSimpleProgressReport::QtWidgetSimpleProgressReport(QtWidgetModel * model, QWidget * parent) - : QWidget(parent) - , m_CurrentProcess() +QtWidgetSimpleProgressReport::QtWidgetSimpleProgressReport(QWidget* parent) : itk::QtProgressBar(parent), m_CurrentProcess() +{ +} + +void QtWidgetSimpleProgressReport::SetModel(QtWidgetModel* model) { - m_Model = model; connect(model, &QtWidgetModel::SetProgressReportBegin, this, &QtWidgetSimpleProgressReport::show ); connect(model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetSimpleProgressReport::Init ); connect(this, &QtWidgetSimpleProgressReport::AddNewProcessToReport, this, &QtWidgetSimpleProgressReport::ReportProcess ); - m_Layout = new QVBoxLayout; - this->setLayout(m_Layout); - m_AddProcessCommand = AddProcessCommandType::New(); m_AddProcessCommand->SetCallbackFunction( this, &QtWidgetSimpleProgressReport::ProcessEvent ); - m_Bar = new itk::QtProgressBar(this); - - m_Label = new QLabel("No process", this); - m_Label->setWordWrap(true); - connect( m_Bar, &itk::QtProgressBar::SetValueChanged, m_Bar, &itk::QtProgressBar::setValue ); - connect( m_Model, &QtWidgetModel::SetProgressReportDone, m_Bar, &itk::QtProgressBar::reset ); + connect(this, &itk::QtProgressBar::SetValueChanged, this, &itk::QtProgressBar::setValue); + connect(model, &QtWidgetModel::SetProgressReportDone, this, &itk::QtProgressBar::reset); - m_Layout->addWidget(m_Label); - m_Layout->addWidget(m_Bar); - - this->show(); + model->GetApplication()->AddObserver(AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer()); } QtWidgetSimpleProgressReport::~QtWidgetSimpleProgressReport() { } -void QtWidgetSimpleProgressReport::SetApplication(Application::Pointer app) -{ - m_Application = app; - m_Application->AddObserver( AddProcessToWatchEvent(), m_AddProcessCommand.GetPointer() ); -} - void QtWidgetSimpleProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller), const itk::EventObject & event2 ) @@ -87,15 +72,14 @@ QtWidgetSimpleProgressReport::ProcessEvent( itk::Object * itkNotUsed(caller), void QtWidgetSimpleProgressReport::ReportProcess() { - m_Bar->Observe(m_CurrentProcess); - m_Label->setText(QString(m_CurrentDescription.c_str())); + this->Observe(m_CurrentProcess); + emit SetText(QString::fromStdString(m_CurrentDescription)); } - void QtWidgetSimpleProgressReport::Init() { - m_Bar->setValue(0); - m_Label->setText("No process"); + this->setValue(0); + emit SetText(QString("")); } } diff --git a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx index 6b84fa510c85722a183a0a1ed7ab71f0236cea69..e72a1b4dd4df05fecabe758550aa155212d53d5d 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetView.cxx @@ -20,8 +20,6 @@ #include "otbWrapperQtWidgetView.h" -#include <functional> - #include "otbWrapperQtWidgetParameterGroup.h" #include "otbWrapperQtWidgetParameterFactory.h" #include "otbWrapperOutputFilenameParameter.h" @@ -54,36 +52,11 @@ QtWidgetView::QtWidgetView( const otb::Wrapper::Application::Pointer & otbApp, QWidget* parent, Qt::WindowFlags flags ) : QWidget( parent, flags ), - m_IconPathDone(""), - m_IconPathFailed(""), m_Model( NULL ), - m_ExecButton( NULL ), - m_QuitButton( NULL ), - m_Message( NULL ), - m_LogText( NULL ), - m_TabWidget( NULL ), - m_IsClosable( true ), m_IsRunning(false) { setObjectName( QtWidgetView::OBJECT_NAME ); - m_Model = new otb::Wrapper::QtWidgetModel( otbApp ); - m_QuitShortcut = new QShortcut(QKeySequence("Ctrl+Q"), this); - - QObject::connect( - m_Model, &QtWidgetModel::SetProgressReportBegin, - this, &QtWidgetView::OnProgressReportBegin - ); - - QObject::connect( - m_Model, &QtWidgetModel::SetProgressReportDone, - this, &QtWidgetView::OnProgressReportEnd - ); - - QObject::connect( - m_Model, &QtWidgetModel::ExceptionRaised, - this, &QtWidgetView::OnExceptionRaised - ); } QtWidgetView::~QtWidgetView() @@ -94,172 +67,14 @@ QtWidgetView::~QtWidgetView() void QtWidgetView::CreateGui() { - // Create a VBoxLayout with the header, the input widgets, and the footer QVBoxLayout *mainLayout = new QVBoxLayout; - m_TabWidget = new QTabWidget(this); - - m_TabWidget->addTab(CreateInputWidgets(), tr("Parameters")); - m_LogText = new QTextEdit(this); - connect( m_Model->GetLogOutput(), &QtLogOutput::NewContentLog, m_LogText, &QTextEdit::append ); - m_TabWidget->addTab(m_LogText, tr("Logs")); - mainLayout->addWidget(m_TabWidget); - - m_Message = new QLabel("<center><font color=\"#FF0000\">"+tr("Select parameters")+"</font></center>", this); - connect( m_Model, &QtWidgetModel::SetApplicationReady, this, &QtWidgetView::UpdateMessageAfterApplicationReady ); - connect( m_Model, &QtWidgetModel::SetProgressReportDone, this, &QtWidgetView::UpdateMessageAfterExecution ); - mainLayout->addWidget(m_Message); - - otb::Wrapper::QtWidgetSimpleProgressReport * progressReport = new otb::Wrapper::QtWidgetSimpleProgressReport(m_Model, this); - progressReport->SetApplication(m_Model->GetApplication()); - - QWidget* footer = CreateFooter(); - - QHBoxLayout *footLayout = new QHBoxLayout; - footLayout->addWidget(progressReport); - footLayout->addWidget(footer); - mainLayout->addLayout(footLayout); - - footLayout->setAlignment(footer, Qt::AlignBottom); - - QGroupBox *mainGroup = new QGroupBox(this); - mainGroup->setLayout(mainLayout); - - QVBoxLayout *finalLayout = new QVBoxLayout; - finalLayout->addWidget(mainGroup); - - // Make the final layout to the widget - this->setLayout(finalLayout); -} - -void QtWidgetView::UpdateMessageAfterExecution(int status) -{ - if (status >= 0) - { - m_Message->setText("<center>"+QString(m_IconPathDone.c_str())+ - "<font color=\"#00A000\">"+tr("Done")+"</font></center>"); - } - else - { - m_Message->setText("<center>"+QString(m_IconPathFailed.c_str())+ - "<font color=\"#FF0000\">"+tr("Failed")+"</font></center>"); - } - m_ExecButton->setText(QObject::tr("Execute")); - m_IsRunning = false; -} - -void QtWidgetView::UpdateMessageAfterApplicationReady( bool val ) -{ - if(!m_IsRunning) - { - if(val == true) - m_Message->setText("<center><font color=\"#00A000\">"+tr("Ready to run")+"</font></center>"); - else - m_Message->setText("<center><font color=\"#FF0000\">"+tr("Select parameters")+"</font></center>"); - } + this->setLayout(mainLayout); + mainLayout->addWidget(CreateInputWidgets()); } QWidget* QtWidgetView::CreateInputWidgets() { - QScrollArea *scrollArea = new QScrollArea(this); - - scrollArea->setWidget( otb::Wrapper::QtWidgetParameterFactory::CreateQtWidget( - m_Model->GetApplication()->GetParameterList(), - m_Model, - this)); - scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - scrollArea->setWidgetResizable(true); - - return scrollArea; -} - - -QWidget* QtWidgetView::CreateFooter() -{ - // an HLayout with two buttons : Execute and Quit - QGroupBox *footerGroup = new QGroupBox(this); - QHBoxLayout *footerLayout = new QHBoxLayout; - - m_ExecButton = new QPushButton(footerGroup); - m_ExecButton->setDefault(true); - m_ExecButton->setEnabled(false); - m_ExecButton->setText(QObject::tr("Execute")); - connect( m_Model, &QtWidgetModel::SetApplicationReady, m_ExecButton, &QPushButton::setEnabled ); - connect( m_ExecButton, &QPushButton::clicked, this, &QtWidgetView::OnExecButtonClicked ); - connect( this, &QtWidgetView::ExecuteAndWriteOutput, m_Model, &QtWidgetModel::ExecuteAndWriteOutputSlot ); - connect( this, &QtWidgetView::Stop, m_Model, &QtWidgetModel::Stop ); - - m_QuitButton = new QPushButton(footerGroup); - m_QuitButton->setText(QObject::tr("Quit")); - connect(m_QuitButton, &QPushButton::clicked, this, &QtWidgetView::close ); - - // Add Ctrl-Q shortcut to quit - connect( m_QuitShortcut, &QShortcut::activated, this, &QtWidgetView::close ); - - // Put the buttons on the right - footerLayout->addStretch(); - footerLayout->addWidget(m_ExecButton); - footerLayout->addWidget(m_QuitButton); - - footerGroup->setLayout(footerLayout); - - return footerGroup; -} - -void QtWidgetView::closeEvent( QCloseEvent * e ) -{ - assert( e!=NULL ); - - if( !IsClosable() ) - { - assert( GetModel()->GetApplication() ); - - QMessageBox::warning( - this, - tr( "Warning!" ), - tr( "OTB-Application '%1' cannot be closed while running!") - .arg( GetModel()->GetApplication()->GetDocName() ) - ); - - e->ignore(); - - return; - } - - QWidget::closeEvent( e ); - - emit QuitSignal(); - - deleteLater(); -} - -void -QtWidgetView -::OnExecButtonClicked() -{ - if (m_IsRunning) - { - m_Message->setText("<center><font color=\"#FF0000\">"+tr("Cancelling")+"...</font></center>"); - emit Stop(); - } - else - { - m_IsRunning = true; - m_Message->setText("<center><font color=\"#FF0000\">"+tr("Running")+"</font></center>"); - m_ExecButton->setText(QObject::tr("Cancel")); - emit ExecuteAndWriteOutput(); - } -} - -void QtWidgetView::UnhandledException(QString message) -{ - this->OnExceptionRaised(message); - m_LogText->append(message); -} - -void QtWidgetView::OnExceptionRaised( QString /*message*/) -{ - m_TabWidget->setCurrentIndex(1); + return otb::Wrapper::QtWidgetParameterFactory::CreateQtWidget(m_Model->GetApplication()->GetParameterList(), m_Model, this); } bool QtWidgetView::IsRunning() const @@ -272,29 +87,26 @@ QtWidgetModel* QtWidgetView::GetModel() const return m_Model; } -bool QtWidgetView::IsClosable() const -{ - return m_IsClosable; -} - -void QtWidgetView::SetClosable( bool enabled ) -{ - m_IsClosable = enabled; - - setEnabled( true ); - - if( m_QuitButton!=NULL ) - m_QuitButton->setEnabled( m_IsClosable ); -} - -void QtWidgetView::OnProgressReportBegin() +void QtWidgetView::Disable() { - SetClosable( false ); + // Disable all widgets to make sure parameters are not updated when the application is running in another thread + for (QWidget* w : this->findChildren<QWidget*>()) + { + w->setEnabled(false); + } + this->setEnabled(false); } -void QtWidgetView::OnProgressReportEnd( int ) +void QtWidgetView::Enable() { - SetClosable( true ); + // Reset all widgets of the view to their previous enabled state + this->setEnabled(true); + for (QWidget* w : this->findChildren<QWidget*>()) + { + w->setEnabled(true); + } + // Resync widgets enabled state with parameter enabled flag + this->GetModel()->NotifyUpdate(); } } // end of namespace Wrapper diff --git a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx index 9477a89fa6ec0bf8c2139daa17d47bcba11fbd9f..8f566438d7d6d898e44435460c72dcb2afa85da3 100644 --- a/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx +++ b/Modules/Wrappers/QtWidget/test/otbWrapperQtWidgetShowWidget.cxx @@ -25,7 +25,6 @@ #include "otbQtApplication.h" #include "otbWrapperApplicationRegistry.h" #include "otbWrapperQtWidgetView.h" -#include "otbWrapperQtWidgetProgressReport.h" #include "itksys/SystemTools.hxx" @@ -33,7 +32,6 @@ using otb::Wrapper::Application; using otb::Wrapper::ApplicationRegistry; using otb::Wrapper::QtApplication; using otb::Wrapper::QtWidgetView; -using otb::Wrapper::QtWidgetProgressReport; struct static_finalizer @@ -113,19 +111,6 @@ otbWrapperQtWidgetShowWidget( int argc, char* argv[] ) ); layout->addWidget( qwv ); - - // Create OTB-Application progress-report. - // - // SAT: QWidget should be created without parent when adding - // into QLayout (because QLayout will take ownership of the - // reference-counted pointer) but OTB API doesn't defined default nullptr - // value such as in Qt. - QtWidgetProgressReport * qwpr = - new QtWidgetProgressReport( qwv->GetModel(), widget ); - - qwpr->SetApplication( otb_application ); - - layout->addWidget( qwpr ); } widget->setLayout( layout ); } diff --git a/Modules/Wrappers/SWIG/src/otbApplication.i b/Modules/Wrappers/SWIG/src/otbApplication.i index 896016f85cd3f57816980e21b683ee351abf3cc2..fbfcdb06a6edf8a272cb0d4b15d5eff2eb1461f2 100644 --- a/Modules/Wrappers/SWIG/src/otbApplication.i +++ b/Modules/Wrappers/SWIG/src/otbApplication.i @@ -95,8 +95,6 @@ namespace Wrapper ParameterType_Group, ParameterType_ListView, ParameterType_RAM, - ParameterType_OutputProcessXML, - ParameterType_InputProcessXML, ParameterType_Bool } ParameterType; @@ -219,12 +217,16 @@ public: int Execute(); int ExecuteAndWriteOutput(); + void LoadParametersFromXML(const std::string& filename); + void SaveParametersToXML(const std::string& filename); + #if SWIGPYTHON Logger* GetLogger(); #endif unsigned long itk::Object::AddObserver(const EventObject & event, Command * command); + bool IsDeprecated(); #if SWIGPYTHON %extend @@ -312,8 +314,6 @@ public: void FreeRessources(); - itkSetStringMacro(DocName); - itkGetStringMacro(DocName); itkSetStringMacro(DocLongDescription); itkGetStringMacro(DocLongDescription); itkSetStringMacro(DocAuthors); @@ -574,17 +574,12 @@ class ApplicationProxy(object): %pythoncode { - def __str__(self): - s = self.GetDocName() - def GetParameterTypeAsString(self, parameter_type): return { - ParameterType_InputProcessXML : 'ParameterType_InputProcessXML', ParameterType_String : 'ParameterType_String', ParameterType_InputFilename : 'ParameterType_InputFilename', ParameterType_OutputImage : 'ParameterType_OutputImage', ParameterType_OutputVectorData : 'ParameterType_OutputVectorData', - ParameterType_OutputProcessXML : 'ParameterType_OutputProcessXML', ParameterType_OutputFilename : 'ParameterType_OutputFilename', ParameterType_Directory : 'ParameterType_Directory', ParameterType_InputImage : 'ParameterType_InputImage', @@ -604,7 +599,7 @@ class ApplicationProxy(object): }.get(parameter_type, 'ParameterType_UNKNOWN') def __str__(self): - s = self.GetDocName() + s = self.GetName() s += '\n' s += self.GetDocLongDescription() return s @@ -615,10 +610,10 @@ class ApplicationProxy(object): def SetParameterValue(self, paramKey, value): paramType = self.GetParameterType(paramKey) - if paramType in [ParameterType_InputProcessXML, ParameterType_RAM, + if paramType in [ParameterType_RAM, ParameterType_String, ParameterType_InputFilename, ParameterType_OutputImage, ParameterType_OutputVectorData, - ParameterType_OutputProcessXML, ParameterType_OutputFilename, + ParameterType_OutputFilename, ParameterType_Directory, ParameterType_InputImage, ParameterType_InputVectorData]: return self.SetParameterString(paramKey, value) @@ -649,10 +644,10 @@ class ApplicationProxy(object): def GetParameterValue(self, paramKey): paramType = self.GetParameterType(paramKey) - if paramType in [ParameterType_InputProcessXML, + if paramType in [ ParameterType_String, ParameterType_InputFilename, ParameterType_OutputImage, ParameterType_OutputVectorData, - ParameterType_OutputProcessXML, ParameterType_OutputFilename, + ParameterType_OutputFilename, ParameterType_Directory, ParameterType_InputImage, ParameterType_InputVectorData]: return self.GetParameterString(paramKey) @@ -906,6 +901,8 @@ public: application = _otbApplication.Registry_CreateApplicationWithoutLogger(name) if application is not None: application.SetupLogger() + if application.IsDeprecated(): + application.GetLogger().Warning("This application is deprecated and will be removed in a future OTB release") return application } #else diff --git a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i index 4bd7852b2ee7540e8cacb172ecbca7ba2d376ffa..748c8bfef4820b6bd9a04c6d19d8c57f61ca7a84 100644 --- a/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i +++ b/Modules/Wrappers/SWIG/src/otbPythonLogOutput.i @@ -72,6 +72,15 @@ public: virtual void AddLogOutput(itkLogOutput *output); static Logger * Instance(); void ResetOutputs(); + + // Wrap message methods so we can print stuff from Python + void Debug(std::string const & message); + void Info(std::string const & message); + void Warning(std::string const & message); + void Critical(std::string const & message); + void Error(std::string const & message); + void Fatal(std::string const & message); + protected: Logger(); virtual ~Logger(); diff --git a/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py b/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py index be223358df88ffa2f417a5c8c320f87b7120400f..70207aaf49acc0655e6213e8e3f3431a45a6944e 100644 --- a/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py +++ b/Modules/Wrappers/SWIG/test/python/PythonInXMLTest.py @@ -26,10 +26,10 @@ # def test(otb, argv): - app = otb.Registry.CreateApplication('BandMath') + app = otb.Registry.CreateApplication('BandMath') - app.SetParameterString("inxml", argv[1]) - app.UpdateParameters() + app.LoadParametersFromXML(argv[1]) + #app.UpdateParameters() - app.SetParameterString("out" , argv[-1]) - app.ExecuteAndWriteOutput() + app.SetParameterString("out" , argv[-1]) + app.ExecuteAndWriteOutput() diff --git a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py index d1c0fa45a5e840fe3e1ff3482e39a35f99b29dd3..ea6203a0545a537a4f60bc7a556fd69d947b21d6 100644 --- a/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py +++ b/Modules/Wrappers/SWIG/test/python/PythonNewStyleParametersTest.py @@ -98,14 +98,6 @@ def test(otb, argv): app.SetParameterString('outputs.mode', 'orthofit') cm_assert(app.OUTPUTS.MODE, 'orthofit') - #14 - inputxml parameter set - app.INXML = argv[3] - cm_assert(app.GetParameterString('inxml'), argv[3]) - - #15 - outputxml parameter get - app.SetParameterString('outxml', 'output.xml') - cm_assert("output.xml", app.OUTXML) - #16 - parameter float get app.SetParameterFloat('elev.default', 5.0) cm_assert(5.0, app.ELEV.DEFAULT) diff --git a/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py b/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py index dcbe45c4a52514521ed50a4ae34df24a5c141e23..dca30937e29c676d209b719fd43750e1547824b3 100644 --- a/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py +++ b/Modules/Wrappers/SWIG/test/python/PythonOutXMLTest.py @@ -26,17 +26,16 @@ # def test(otb, argv): - imagelist = argv[1:-2] - exp = "cos(im1b1)+im2b1*im3b1-im3b2+ndvi(im3b3, im3b4)" - out = argv[-2] - outxml = argv[-1] - app = otb.Registry.CreateApplication('BandMath') - app.SetParameterStringList("il", imagelist, True) - app.SetParameterString("out", out, True) - app.SetParameterString("exp", exp, True) - app.SetParameterString("outxml", outxml, True) - app.UpdateParameters() -#for paramKey in app.GetParametersKeys(): - #app.GetParameterValue(paramKey) - #print app.HasUserValue(paramKey) - app.ExecuteAndWriteOutput() + imagelist = argv[1:-2] + exp = "cos(im1b1)+im2b1*im3b1-im3b2+ndvi(im3b3, im3b4)" + out = argv[-2] + outxml = argv[-1] + + app = otb.Registry.CreateApplication('BandMath') + app.SetParameterStringList("il", imagelist, True) + app.SetParameterString("out", out, True) + app.SetParameterString("exp", exp, True) + + app.SaveParametersToXML(outxml) + + app.ExecuteAndWriteOutput() diff --git a/NOTICE b/NOTICE index 10cc07d9a347054e581a312b95d868cd410b35ea..ece9fc15b3d6f6a430463bfdde6512cb794595ee 100644 --- a/NOTICE +++ b/NOTICE @@ -334,20 +334,6 @@ binaries: http://www.boost.org/LICENSE_1_0.txt -* CMake/UseJava.cmake - Copyright 2010-2011 Andreas schneider <asn@redhat.com> - Copyright 2010 Ben Boeckel <ben.boeckel@kitware.com> - BSD 3-Clause license - https://opensource.org/licenses/BSD-3-Clause - - -* CMake/UseJavaClassFilelist.cmake -* CMake/UseJavaSymlinks.cmake - Copyright 2010-2011 Andreas schneider <asn@redhat.com> - BSD 3-Clause license - https://opensource.org/licenses/BSD-3-Clause - - * CMake/UseSWIGLocal.cmake Copyright 2004-2009 Kitware, Inc. Copyright 2009 Mathieu Malaterre <mathieu.malaterre@gmail.com> diff --git a/Packaging/CMakeLists.txt b/Packaging/CMakeLists.txt index ca735ac2a31163959094441a3163fc86f3f2a9d3..18b1b9fc8b6526fc428792bf663d1a974a771ee9 100644 --- a/Packaging/CMakeLists.txt +++ b/Packaging/CMakeLists.txt @@ -136,7 +136,6 @@ include(cleanup_package) include(install_include_dirs) include(install_importlibs) include(install_python_bindings) -include(install_java_bindings) include(install_share_dirs) include(install_cmake_files) include(install_qtdev_files) diff --git a/Packaging/install_java_bindings.cmake b/Packaging/install_java_bindings.cmake deleted file mode 100644 index 0c9d9358b042a3f16f7f8b1c2441ff8f421ca41e..0000000000000000000000000000000000000000 --- a/Packaging/install_java_bindings.cmake +++ /dev/null @@ -1,27 +0,0 @@ -# -# Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) -# -# This file is part of Orfeo Toolbox -# -# https://www.orfeo-toolbox.org/ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -function(install_java_bindings) - if(HAVE_JAVA) - install(FILES ${SUPERBUILD_INSTALL_DIR}/lib/otb/java/org.otb.application.jar - DESTINATION ${PKG_STAGE_DIR}/lib/java - ) - endif() -endfunction() diff --git a/SuperBuild/CMake/External_otb.cmake b/SuperBuild/CMake/External_otb.cmake index 556ff87310f79077eb82dfa548106c40c9cf9cd9..d27d88196847396ba6037414ff4f47413b09bf0a 100644 --- a/SuperBuild/CMake/External_otb.cmake +++ b/SuperBuild/CMake/External_otb.cmake @@ -79,7 +79,7 @@ if(OTB_USE_MUPARSERX) ADD_SUPERBUILD_CMAKE_VAR(OTB MUPARSERX_LIBRARY) endif() -if(OTB_WRAP_PYTHON OR OTB_WRAP_JAVA) +if(OTB_WRAP_PYTHON) ADD_SUPERBUILD_CMAKE_VAR(OTB SWIG_EXECUTABLE) ADDTO_DEPENDENCIES_IF_NOT_SYSTEM(OTB SWIG) endif() @@ -207,7 +207,6 @@ ExternalProject_Add(OTB -DOTB_USE_OPENMP:BOOL=${OTB_USE_OPENMP} -DOTB_USE_GSL:BOOL=${OTB_USE_GSL} -DOTB_WRAP_PYTHON:BOOL=${OTB_WRAP_PYTHON} - -DOTB_WRAP_JAVA:BOOL=${OTB_WRAP_JAVA} -DOTB_USE_MPI:BOOL=${OTB_USE_MPI} -DOTB_USE_SPTW:BOOL=${OTB_USE_SPTW} -DPYTHON_EXECUTABLE:PATH=${PYTHON_EXECUTABLE} diff --git a/SuperBuild/CMakeLists.txt b/SuperBuild/CMakeLists.txt index 27f42a751b0c8966d6775369645e9c39a43b6b80..4eaa0f1c4a6a6666564b20a23d582338053dfd00 100644 --- a/SuperBuild/CMakeLists.txt +++ b/SuperBuild/CMakeLists.txt @@ -18,8 +18,6 @@ # limitations under the License. # -## COMMMENT to dirty superbuild artifact. TAG: 1. - cmake_minimum_required(VERSION 3.3.0) project(OTB-SuperBuild) @@ -352,7 +350,6 @@ find_path(OTB_DATA_ROOT README-OTB-Data # SWIG Wrapping option(OTB_WRAP_PYTHON "Enable python wrappers for OTB applications (requires SWIG)" ON) -option(OTB_WRAP_JAVA "Enable java wrappers for OTB applications (requires SWIG)" OFF) configure_file(${CMAKE_SOURCE_DIR}/CMake/CTestCustom.cmake.in ${CMAKE_BINARY_DIR}/CTestCustom.cmake @ONLY)