diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 78abd2944953322db73aae08520a65dd18d39af1..f0de6bfcd81f02792a9521b220cd7a30a5695ac2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -5,11 +5,12 @@ # But Git fails to manage efficiently numerous LFS data. # We have to use directly git-lfs wrapping commands to have an # efficient cloning step. -# Furthermore, Git-LFS and Gitlab sufer a bug preventing usage of +# Furthermore, Git-LFS and Gitlab sufer a bug preventing usage of # GIT_STRATEGY=fetch (https://gitlab.com/gitlab-org/gitlab-runner/issues/3318) variables: - BUILD_IMAGE_REGISTRY: $CI_REGISTRY/gbonnefille/otb-build-env + BUILD_IMAGE_REGISTRY: $CI_REGISTRY/orfeotoolbox/otb-build-env + GIT_CLONE_PATH: $CI_BUILDS_DIR/otb DOCKER_DRIVER: overlay2 GIT_DEPTH: "3" # Disable automatic checkout to let us fetch LFS before @@ -29,6 +30,8 @@ after_script: - python3 CI/cdash_handler.py $CI_COMMIT_SHA $CI_PROJECT_ID $CI_PROJECT_DIR $K8S_SECRET_CDASH stages: + - precheck + - prepare - build .general: @@ -38,36 +41,92 @@ stages: - runner_system_failure - stuck_or_timeout_failure -native-build: +fast-build: extends: .general - only: [merge_requests] - stage: build - image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native:18.04 + only: [merge_requests, branches] + stage: precheck + image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native-develop:latest + before_script: + - export GIT_LFS_SKIP_SMUDGE=1 + - git checkout $CI_COMMIT_REF_NAME + - python3 CI/check_twin_pipelines.py script: - - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-gcc + - ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-fast + - ccache -s -debian-build: +.common-build: extends: .general only: [merge_requests] stage: build + dependencies: [] + +debian-build: + extends: .common-build image: $BUILD_IMAGE_REGISTRY/otb-debian-native:unstable script: - - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-unstable-gcc + - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=debian-unstable-gcc -.common-build: +ubuntu-llvm: + extends: .common-build + image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-native:18.04 + script: + - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm + artifacts: + paths: + - build/CookBook-*-html.tar.gz + - build/Documentation/Cookbook/latex/CookBook-*.pdf + - build/Documentation/Doxygen/OTB-Doxygen-*.tar.bz2 + +.common-prepare: extends: .general - stage: build - image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-shark:18.04 + only: [merge_requests] + stage: prepare + before_script: +# This override the previous before_script + - git checkout $CI_COMMIT_REF_NAME +# We are now doing the git-lfs install +# This is done after the checkout so we avoid downloading Data +# But we need it to upload the archive + - git-lfs install + - git config --global user.email "otbbot@orfeo-toolbox.org" + - git config --global user.name "otbbot" + - eval $(ssh-agent -s) + - ssh-add <(echo "$K8S_SECRET_SSH") +# This is for debug, we are checking the owner of the ssh key + - ssh -o StrictHostKeyChecking=no -T git@gitlab.orfeo-toolbox.org + after_script: + - echo "Nothing to do for after_script" + artifacts: + expire_in: 24 hrs + paths: + # This recovers logs from superbuild build + - build/*/*/*/*.log + - sb_branch.txt + +ubuntu-superbuild-prepare: + extends: .common-prepare + image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-base:18.04 script: - - ctest -VV -S CI/main_ci.cmake -DIMAGE_NAME:string=ubuntu-18.04-llvm-shark + - ctest -V -S CI/prepare_superbuild.cmake -DIMAGE_NAME:string=otb-ubuntu-superbuild-base +centos-superbuild-prepare: + extends: .common-prepare + image: $BUILD_IMAGE_REGISTRY/otb-centos-superbuild-base:6.6 + script: + - ctest -V -S CI/prepare_superbuild.cmake -DIMAGE_NAME:string=otb-centos-superbuild-base -# This is needed to have only one pipeline in a merge request context -ubuntu-llvm: - only: [merge_requests] +ubuntu-superbuild-build: extends: .common-build + image: $BUILD_IMAGE_REGISTRY/otb-ubuntu-superbuild-base:18.04 + script: + - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=otb-ubuntu-superbuild-base + dependencies: + - ubuntu-superbuild-prepare -ubuntu-llvm-wip: - except: [merge_requests] +centos-superbuild-build: extends: .common-build - + image: $BUILD_IMAGE_REGISTRY/otb-centos-superbuild-base:6.6 + script: + - xvfb-run -a -n 1 -s "-screen 0 1024x768x24 -dpi 96" ctest -V -S CI/main_superbuild.cmake -DIMAGE_NAME:string=otb-centos-superbuild-base + dependencies: + - centos-superbuild-prepare diff --git a/.gitlab/merge_request_templates/request_for_changes.md b/.gitlab/merge_request_templates/request_for_changes.md index 31bf9cb52c20e5b67e82be1158a46b7bbd7ca268..79acdadae838587114d6aa593ddcf0a78a8ef3bd 100644 --- a/.gitlab/merge_request_templates/request_for_changes.md +++ b/.gitlab/merge_request_templates/request_for_changes.md @@ -45,3 +45,4 @@ The copyright owner is *COPYRIGHT OWNER (OR OWNER'S AGENT)* and has signed the O - The feature branch is (reasonably) up-to-date with the base branch - Dashboard is green - Copyright owner has signed the ORFEO ToolBox Contributor License Agreement +- Optionally, run `git diff develop... -U0 --no-color | clang-format-diff.py -p1 -i` on latest changes and commit diff --git a/CI/cdash_handler.py b/CI/cdash_handler.py index 72a4f46c64e57b4a7c5835f99cee8a836d244a66..7a19d5a87f870f785565319d0dcd24dc47de6df4 100644 --- a/CI/cdash_handler.py +++ b/CI/cdash_handler.py @@ -26,6 +26,7 @@ import re import unittest import sys import json +import time trace = False @@ -168,7 +169,7 @@ class Handler: if key == "project": project = value if ( site == "" or stamp == "" or name == "" or project == ""): - print( "Not enougth argument given for buildid request \ + print( "Missing argument for buildid request \ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".") return buildid_api = "/api/v1/getbuildid.php?" @@ -176,11 +177,18 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".") full_url = self.url + buildid_api + buildid_params if trace: print("full_url: "+full_url) - response = urllib.request.urlopen(full_url).read().decode() - if trace: - print ( "response: " + response ) + nb_try = 6 build_id_regex = re.compile( "<buildid>([0-9]+)</buildid>" ) - buildid = build_id_regex.search( response ) + while nb_try: + response = urllib.request.urlopen(full_url).read().decode() + if trace: + print ( "response: " + response ) + buildid = build_id_regex.search( response ) + nb_try -= 1 + if buildid or (nb_try == 0): + break + print("No build id, retry ...") + time.sleep(60) if buildid: self.buildid = buildid.group(1) if trace: @@ -198,7 +206,7 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".") if ( buildid == "" ): buildid = self.buildid if ( buildid == "" ): - print( "Not enougth argument given to build url") + print( "Missing argument to build url") return build_url = self.url build_url +="/buildSummary.php?" @@ -212,7 +220,7 @@ site:"+site+", stamp:"+stamp+", name:"+name+", project:"+project+".") if ( buildid == "" ): buildid = self.buildid if ( buildid == "" ): - print( "Not enougth argument given to build Status") + print( "Missing argument to build Status") return full_url = self.url + "/api/v1/buildSummary.php?buildid=" + buildid response = urllib.request.urlopen(full_url).read().decode() @@ -251,10 +259,13 @@ if __name__ == "__main__": handler.GetSite() handler.GetName() handler.GetStamp() - handler.GetBuildId() - # handler.buildid="1" - cdash_url = handler.GetBuildUrl() - ( state , error ) = handler.GetBuildStatus() + if handler.GetBuildId() is None: + cdash_url = "https://cdash.orfeo-toolbox.org" + state = 'failed' + error = "Failed to get build id" + else: + cdash_url = handler.GetBuildUrl() + ( state , error ) = handler.GetBuildStatus() if trace: print ( "cdash_url is: " + cdash_url ) gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/" diff --git a/CI/check_twin_pipelines.py b/CI/check_twin_pipelines.py new file mode 100644 index 0000000000000000000000000000000000000000..d2a6113924677266de8cf30f8d35debc8ee2c3ea --- /dev/null +++ b/CI/check_twin_pipelines.py @@ -0,0 +1,88 @@ +# +# 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. +# + +import os +import urllib.request +import urllib.parse +import json +import re +import time + +""" +Send a request to Gitlab and return the answer +The request parameter is added after `project/:id/` +WARNING: when data is given, the request will be a POST +Otherwise, it is a GET +""" +def GitlabRequest(request, project=53, data=None, token=''): + gitlab_url = "https://gitlab.orfeo-toolbox.org/api/v4/projects/" + gitlab_url+= str(project) + '/' + request + params = None + myHeader = {} + if not data is None: + params = urllib.parse.urlencode(data).encode('ascii') + if token: + myHeader = {'PRIVATE-TOKEN':token} + gitlab_request = urllib.request.Request(gitlab_url, data=params, headers=myHeader) + res = urllib.request.urlopen(gitlab_request) + return json.loads(res.read().decode()) + +""" +Check needed environment parameters +""" +def CheckEnvParameters(params): + for p in params: + if not p in os.environ.keys(): + print("Missing environment variable '"+p+"'") + return False + return True + +""" +Check for any duplicated twin pipeline and cancel it +""" +if __name__ == "__main__": + if not CheckEnvParameters(['CI_COMMIT_SHA']): + sys.exit(1) + env = os.environ + 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']): + sys.exit(1) + mrInfo = GitlabRequest('merge_requests/'+env['CI_MERGE_REQUEST_IID'],token=env['K8S_SECRET_TWIN_PIPELINE']) + 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']) + 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']) + 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']) + diff --git a/CI/configure_option.cmake b/CI/configure_options.cmake similarity index 92% rename from CI/configure_option.cmake rename to CI/configure_options.cmake index 7cc9b319fa96eec436a3454d916c7e7c2eb35d21..d0b41c6adc0fe7546fecfbb698a5710cf849755d 100644 --- a/CI/configure_option.cmake +++ b/CI/configure_options.cmake @@ -19,13 +19,13 @@ # # This script is a prototype for the future CI, it may evolve rapidly in a near future -#This file set the following variable : +#This file set the following variable : # * otb_build_project_option # * otb_use_option # * otb_wrap_option # * CONFIGURE_OPTIONS -set (otb_build_project_option +set (otb_build_project_option "BUILD_COOKBOOK:BOOL=OFF BUILD_EXAMPLES:BOOL=ON BUILD_SHARED_LIBS:BOOL=ON @@ -40,7 +40,7 @@ OTB_USE_GLUT:BOOL=ON OTB_USE_GSL:BOOL=ON OTB_USE_LIBKML:BOOL=ON OTB_USE_LIBSVM:BOOL=ON -OTB_USE_MPI:BOOL=ON +OTB_USE_MPI:BOOL=OFF OTB_USE_MUPARSER:BOOL=ON OTB_USE_MUPARSERX:BOOL=ON OTB_USE_OPENCV:BOOL=ON @@ -51,12 +51,12 @@ OTB_USE_QWT:BOOL=ON OTB_USE_SHARK:BOOL=ON OTB_USE_SIFTFAST:BOOL=ON OTB_USE_SPTW:BOOL=ON -OTB_USE_SSE_FLAGS:BOOL=ON") +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_PYTHON3:BOOL=ON") +OTB_WRAP_PYTHON:BOOL=ON") set (otb_data_option "OTB_DATA_USE_LARGEINPUT:BOOL=OFF diff --git a/CI/macros.cmake b/CI/macros.cmake new file mode 100644 index 0000000000000000000000000000000000000000..544daca845fd1b0d8fe36d746cd698fa09ce3a76 --- /dev/null +++ b/CI/macros.cmake @@ -0,0 +1,53 @@ +# +# 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 script is for the superbuild build on the CI platform + +# Find the build name and CI profile +macro( set_dash_build_name ) + set(ci_profile wip) + + set(ci_mr_source "$ENV{CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}") + set(ci_mr_target "$ENV{CI_MERGE_REQUEST_TARGET_BRANCH_NAME}") + set(ci_mr_iid "$ENV{CI_MERGE_REQUEST_IID}") + + set(ci_pipeline_id "$ENV{CI_PIPELINE_ID}") + set(ci_job_id "$ENV{CI_JOB_ID}") + + set(ci_ref_name "$ENV{CI_COMMIT_REF_NAME}") + + set (CTEST_BUILD_NAME ${ci_short_sha}) + + if(ci_mr_source AND ci_mr_target AND ci_mr_iid) + set (CTEST_BUILD_NAME "${ci_mr_source} (MR ${ci_mr_iid}) P-${ci_pipeline_id}") + set(ci_profile mr) + + elseif(ci_ref_name) + set (CTEST_BUILD_NAME "${ci_ref_name} P-${ci_pipeline_id}") + + if("${ci_ref_name}" STREQUAL "develop") + set(ci_profile develop) + + elseif("${ci_ref_name}" MATCHES "^release-[0-9]+\\.[0-9]+\$") + set(ci_profile release) + endif() + + endif() + +endmacro() diff --git a/CI/main_ci.cmake b/CI/main_ci.cmake index dc6c7ea1a344e35db661493435bb47c4ae207950..052fae88822b9b6d4d20b435f55bfb1090990b33 100644 --- a/CI/main_ci.cmake +++ b/CI/main_ci.cmake @@ -18,6 +18,8 @@ # limitations under the License. # +include( "${CMAKE_CURRENT_LIST_DIR}/macros.cmake" ) + # This script is a prototype for the future CI, it may evolve rapidly in a near future get_filename_component(OTB_SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR} DIRECTORY) set (ENV{LANG} "C") # Only ascii output @@ -26,33 +28,49 @@ set (ENV{LANG} "C") # Only ascii output set (CTEST_BUILD_CONFIGURATION "Release") set (CTEST_CMAKE_GENERATOR "Ninja") +# detect short sha +if(NOT DEFINED ENV{CI_COMMIT_SHORT_SHA}) + execute_process(COMMAND git log -1 --pretty=format:%h + WORKING_DIRECTORY ${OTB_SOURCE_DIR} + OUTPUT_VARIABLE ci_short_sha) +else() + set(ci_short_sha "$ENV{CI_COMMIT_SHORT_SHA}") +endif() + # Find the build name and CI profile -set(ci_profile wip) -set(ci_mr_source "$ENV{CI_MERGE_REQUEST_SOURCE_BRANCH_NAME}") -set(ci_mr_target "$ENV{CI_MERGE_REQUEST_TARGET_BRANCH_NAME}") -set(ci_mr_iid "$ENV{CI_MERGE_REQUEST_IID}") -set(ci_ref_name "$ENV{CI_COMMIT_REF_NAME}") -set (CTEST_BUILD_NAME "$ENV{CI_COMMIT_SHORT_SHA}") -if(ci_mr_source AND ci_mr_target AND ci_mr_iid) - set (CTEST_BUILD_NAME "${ci_mr_source} (MR ${ci_mr_iid})") - set(ci_profile mr) -elseif(ci_ref_name) - set (CTEST_BUILD_NAME "${ci_ref_name}") - if("${ci_ref_name}" STREQUAL "develop") - set(ci_profile develop) - elseif("${ci_ref_name}" MATCHES "^release-[0-9]+\\.[0-9]+\$") - set(ci_profile release) +set_dash_build_name() + +# set pipelines to enable documentation +set(ci_cookbook_profiles mr develop release) +set(ci_doxygen_profiles mr develop release) +list(FIND ci_cookbook_profiles ${ci_profile} ci_do_cookbook) +list(FIND ci_doxygen_profiles ${ci_profile} ci_do_doxygen) + +# Detect site +if(NOT DEFINED IMAGE_NAME) + if(DEFINED ENV{IMAGE_NAME}) + set(IMAGE_NAME $ENV{IMAGE_NAME}) endif() endif() - -#Warning, this variable is used in cdash_status.py. If change from -# ${IMAGE_NAME} to something else do not forget to change it. set (CTEST_SITE "${IMAGE_NAME}") +# Detect "skip testing" +if(DEFINED ENV{CI_SKIP_TESTING}) + set(ci_skip_testing 1) +endif() + # Directory variable set (CTEST_SOURCE_DIRECTORY "${OTB_SOURCE_DIR}") -set (CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/") -set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/") +if(BUILD_DIR) + set (CTEST_BINARY_DIRECTORY "${BUILD_DIR}") +else() + set (CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/") +endif() +if(INSTALL_DIR) + set (CTEST_INSTALL_DIRECTORY "${INSTALL_DIR}") +else() + set (CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/") +endif() set (PROJECT_SOURCE_DIR "${OTB_SOURCE_DIR}") # Ctest command value @@ -64,8 +82,9 @@ set (OTB_LARGEINPUT_ROOT "") # todo 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) @@ -76,7 +95,7 @@ find_program(CTEST_GIT_COMMAND NAMES git git.cmd) # End of configuration -ctest_start (Experimental TRACK Experimental) +ctest_start (Experimental TRACK CI_Build) ctest_update() @@ -88,6 +107,7 @@ ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" ) if ( NOT _configure_rv EQUAL 0 ) + # stop processing here ctest_submit() message( FATAL_ERROR "An error occurs during ctest_configure.") endif() @@ -98,19 +118,30 @@ ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" ) if ( NOT _build_rv EQUAL 0 ) - ctest_submit() message( SEND_ERROR "An error occurs during ctest_build.") endif() -# Uncomment when ready for test -# ctest_test(PARALLEL_LEVEL 8 -# RETURN_VALUE _test_rv -# CAPTURE_CMAKE_ERROR _test_error -# ) +if(ci_skip_testing) + message(STATUS "Skip testing") + set(_test_rv 0) +else() + ctest_test(PARALLEL_LEVEL 8 + RETURN_VALUE _test_rv + CAPTURE_CMAKE_ERROR _test_error + ) +endif() -# if ( NOT _test_rv EQUAL 0 ) -# ctest_submit() -# message( SEND_ERROR "An error occurs during ctest_test.") -# endif() +if ( NOT _test_rv EQUAL 0 ) + message( SEND_ERROR "An error occurs during ctest_test.") +endif() ctest_submit() + +if(ENABLE_DOXYGEN) + # compile doxygen + ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" + TARGET Documentation + RETURN_VALUE _doxy_rv + CAPTURE_CMAKE_ERROR _doxy_error + ) +endif() diff --git a/CI/main_superbuild.cmake b/CI/main_superbuild.cmake new file mode 100644 index 0000000000000000000000000000000000000000..a7ba0f96d7049eb6b10d4227acd33ff6d886f594 --- /dev/null +++ b/CI/main_superbuild.cmake @@ -0,0 +1,172 @@ +# +# 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 script is a prototype for the future CI, it may evolve rapidly in a near future + +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) + +########################################################################### +########################################################################### +# Download xkd +########################################################################### +########################################################################### + +# How to get md5sum: +# * concatenate all source files in one +# * add configure result from previous job ${OTB_SOURCE_DIR}/build/CMakeCache.txt +########################### + +file(READ "${OTB_SOURCE_DIR}/sb_branch.txt" BRANCH_NAME) + +#################################### + + +# git clone $REPOSITORY_URL --branch $BRANCH_NAME --depth 1 superbuild-artifact +############################################################################### +set ( REMOTE "https://gitlab.orfeo-toolbox.org/gbonnefille/superbuild-artifact.git") +# set ( BRANCH_NAME "${IMAGE_NAME}/${SB_MD5}") + +# Look for a GIT command-line client. +find_program(CTEST_GIT_COMMAND NAMES git git.cmd) + +# FIXME: Replace ${GIT} variable with $[CTEST_GIT_COMMAND}" +set( GIT "${CTEST_GIT_COMMAND}" ) + +execute_process( + COMMAND ${GIT} "clone" "${REMOTE}" "--branch" "${BRANCH_NAME}" + "--depth" "1" "superbuild-artifact" + WORKING_DIRECTORY ${OTB_SOURCE_DIR} + RESULT_VARIABLE clone_res + OUTPUT_VARIABLE clone_out + ERROR_VARIABLE clone_err + ) + +if ( DEBUG ) + message( "Clone") + message( "clone_res = ${clone_res}" ) + message( "clone_out = ${clone_out}" ) + message( "clone_err = ${clone_err}" ) +endif() + +if (clone_res) + message( SEND_ERROR "Problem in retreiving the archive") + return() +endif() + +set (CMAKE_COMMAND "cmake") +execute_process( + COMMAND ${CMAKE_COMMAND} "-E" "tar" "xf" + "${OTB_SOURCE_DIR}/superbuild-artifact/SuperBuild_Install.tar" + WORKING_DIRECTORY ${OTB_SOURCE_DIR} + ) + +set( XDK_PATH "${OTB_SOURCE_DIR}/xdk") + +if ( DEBUG ) + if ( EXISTS "${XDK_PATH}") + message("Xdk folder exists at ${XDK_PATH}") + else() + message("Something went wrong no folder in ${XDK_PATH}") + endif() +endif() + +########################################################################### +########################################################################### +# Building OTB +########################################################################### +########################################################################### + +set ( CTEST_BUILD_CONFIGURATION "Release" ) +set ( CTEST_CMAKE_GENERATOR "Unix Makefiles" ) +set ( CTEST_BUILD_FLAGS "-j8" ) +set ( CTEST_SITE "${IMAGE_NAME}" ) + +# Find the build name and CI profile +set_dash_build_name() + +# Directory variable +set ( CTEST_SOURCE_DIRECTORY "${OTB_SOURCE_DIR}" ) +set ( CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/" ) +set ( CTEST_INSTALL_DIRECTORY "${OTB_SOURCE_DIR}/install/" ) +set ( PROJECT_SOURCE_DIR "${OTB_SOURCE_DIR}" ) + +set (CONFIGURE_OPTIONS "") +include ( "${CMAKE_CURRENT_LIST_DIR}/configure_options.cmake" ) +# SuperBuild case : one more configure option +set ( CONFIGURE_OPTIONS + "${CONFIGURE_OPTIONS}-DCMAKE_PREFIX_PATH=${XDK_PATH};") + +# Hack because there is no more superbuild available (LIBKML) +set ( CONFIGURE_OPTIONS + "${CONFIGURE_OPTIONS}-DOTB_USE_LIBKML:BOOL=OFF;" ) + +# FIX ME this part might platform dependent +set( GDAL_DATA "${XDK_PATH}/share/gdal" ) +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} +") +# 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) + +ctest_start (Experimental TRACK CI_Build) + +ctest_update() + +ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" + SOURCE "${OTB_SOURCE_DIR}" + OPTIONS "${CONFIGURE_OPTIONS}" + RETURN_VALUE _configure_rv + CAPTURE_CMAKE_ERROR _configure_error + ) + +if ( NOT _configure_rv EQUAL 0 ) + ctest_submit() + message( FATAL_ERROR "An error occurs during ctest_configure.") +endif() + +ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" + RETURN_VALUE _build_rv + CAPTURE_CMAKE_ERROR _build_error + ) + +if ( NOT _build_rv EQUAL 0 ) + message( SEND_ERROR "An error occurs during ctest_build.") +endif() + +# Uncomment when ready for test +ctest_test(PARALLEL_LEVEL 8 + RETURN_VALUE _test_rv + CAPTURE_CMAKE_ERROR _test_error + ) + +if ( NOT _test_rv EQUAL 0 ) + message( WARNING "Some tests have failed.") +endif() + +ctest_submit() diff --git a/CI/prepare_superbuild.cmake b/CI/prepare_superbuild.cmake new file mode 100644 index 0000000000000000000000000000000000000000..47eec850c1c19af099f0e61ae02b01216a57195e --- /dev/null +++ b/CI/prepare_superbuild.cmake @@ -0,0 +1,344 @@ +# +# 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 script is for the superbuild build on the CI platform + +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) + +set ( DEBUG "1" ) + +set ( SUPERBUILD_SOURCE_DIR "${OTB_SOURCE_DIR}/SuperBuild" ) + +set ( CTEST_BUILD_CONFIGURATION "Release" ) +set ( CTEST_CMAKE_GENERATOR "Unix Makefiles" ) +set ( PROJECT_SOURCE_DIR "${SUPERBUILD_SOURCE_DIR}" ) +set ( CTEST_SOURCE_DIRECTORY "${SUPERBUILD_SOURCE_DIR}" ) +set ( CTEST_BINARY_DIRECTORY "${OTB_SOURCE_DIR}/build/" ) +set ( CTEST_SITE "${IMAGE_NAME}" ) + + +# Find the build name and CI profile +set_dash_build_name() + +# We need a directory independent from user +# in CI the architecture is /builds/user/otb +# So we will go in /builds/ +# 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 "${OTB_SOURCE_DIR}/xdk/") + +# HACK +# This is needed because when using return() function ctest is trying +# to run the CTEST_COMMAND. And we need it to not produce an error +set (CTEST_COMMAND "echo \"Exit\"") # HACK FIX ME +set (CMAKE_COMMAND "cmake") + +######################################################################## +######################################################################## +# Build process +######################################################################## +######################################################################## + +# Look for a GIT command-line client. +find_program(CTEST_GIT_COMMAND NAMES git git.cmd) + +# FIXME: Replace ${GIT} variable with $[CTEST_GIT_COMMAND}" +set( GIT "${CTEST_GIT_COMMAND}" ) + +# Sources are already checked out : do nothing for update +set(CTEST_GIT_UPDATE_CUSTOM echo No update) + +ctest_start (Experimental TRACK CI_Prepare) + +ctest_update( SOURCE "${OTB_SOURCE_DIR}" ) + +set(CTEST_BUILD_FLAGS "-j16") + +set ( SB_CONFIGURE_OPTIONS "") +include( "${CMAKE_CURRENT_LIST_DIR}/sb_configure_options.cmake" ) + +ctest_configure(BUILD "${CTEST_BINARY_DIRECTORY}" + SOURCE "${SUPERBUILD_SOURCE_DIR}" + OPTIONS "${SB_CONFIGURE_OPTIONS}" + RETURN_VALUE _configure_rv + CAPTURE_CMAKE_ERROR _configure_error + ) + +if ( NOT _configure_rv EQUAL 0 ) + ctest_submit() + message( SEND_ERROR "An error occurs during ctest_configure. Dependencies might be buggy.") + return() +endif() + +######################################################################## +######################################################################## +# Check process +######################################################################## +######################################################################## +# Once that we have configure our build we can check if it exists a +# corresponding SB on superbuild-artifact + +# How to get md5sum: +# * concatenate all source files in one +# * add configure result : CMakeCache.txt +#################################### +file( GLOB_RECURSE sb_file_list "${OTB_SOURCE_DIR}/SuperBuild/*") +set( SB_TXT "${OTB_SOURCE_DIR}/full_sb.txt") +foreach(sb_file ${sb_file_list}) + file(READ ${sb_file} CONTENTS) + file(APPEND ${SB_TXT} "${sb_file}${CONTENTS}") +endforeach(sb_file) +file(READ "${CTEST_BINARY_DIRECTORY}/CMakeCache.txt" CMAKE_ORIG) +file(APPEND ${SB_TXT} "CMakeCache.txt${CMAKE_ORIG}") +file ( MD5 "${SB_TXT}" SB_MD5) +message ( "SB_MD5 = ${SB_MD5}" ) +file (REMOVE ${SB_TXT}) + +#################################### + +# checkout part +# we look for the right branch +# Branch name cannot have a ":" +# git ls-remote $REMOTE $BRANCH_NAME +#################################### +file ( WRITE "${OTB_SOURCE_DIR}/sb_branch.txt" "${IMAGE_NAME}/${SB_MD5}") +message( "Checking out git for existence of archive") +set ( REMOTE "https://gitlab.orfeo-toolbox.org/gbonnefille/superbuild-artifact/") +set ( BRANCH_NAME "${IMAGE_NAME}/${SB_MD5}") + +execute_process( + COMMAND ${GIT} "ls-remote" "${REMOTE}" "${BRANCH_NAME}" + OUTPUT_VARIABLE IS_SB_BUILD + ) +if ( IS_SB_BUILD ) + message( "Superbuild is already build for ${IMAGE_NAME} with sources as ${SB_MD5}") + return() +else() + message( "No build available, this job will build and push OTB_DEPENDS") +endif() +#################################### +# Back to build + +ctest_build(BUILD "${CTEST_BINARY_DIRECTORY}" + TARGET "OTB_DEPENDS" + RETURN_VALUE _build_rv + NUMBER_ERRORS _build_nb_err + CAPTURE_CMAKE_ERROR _build_error + ) + +if ( DEBUG ) + message( "Status for build:" ) + message("_build_rv=${_build_rv}") + message("_build_nb_err=${_build_nb_err}") + message("_build_error=${_build_error}") +endif() + +if ( ( NOT ${_build_nb_err} EQUAL 0 ) OR ( ${_build_error} EQUAL -1 )) + ctest_submit() + message( FATAL_ERROR "An error occurs during ctest_build.") +endif() + +ctest_submit() + +######################################################################## +######################################################################## +# Git process +######################################################################## +######################################################################## + +# WE PUSH ONLY IF BUILD SUCCEED +# The image used will be passed to this script. +# TODO verify that images does not have forbidden char in there name +# 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 + +# 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. +set( REPOSITORY_GIT_URL "git@gitlab.orfeo-toolbox.org:gbonnefille/superbuild-artifact.git") +# We clone master to have a basic configuration, mainly a correct .gitattribute +# git clone $REMOTE --branch master --depth 1 superbuild-artifact +execute_process( + COMMAND ${GIT} "clone" "${REPOSITORY_GIT_URL}" + "--branch" "master" "--depth" "1" "superbuild-artifact" + 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 +# -F /dev/null so the agent is not taking a default file ~/.ssh/.. +execute_process( + COMMAND ${GIT} "config" "core.sshCommand" + "ssh -o StrictHostKeyChecking=no" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE ssh_res + OUTPUT_VARIABLE ssh_out + ERROR_VARIABLE ssh_err + ) + +if ( DEBUG ) + message( "Step 1: ssh") + message( "ssh_res = ${ssh_res}" ) + message( "ssh_out = ${ssh_out}" ) + message( "ssh_err = ${ssh_err}" ) +endif() + +execute_process( + COMMAND ${GIT} "config" "user.mail" "otbbot@orfeo-toolbox.org" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE mail_res + OUTPUT_VARIABLE mail_out + ERROR_VARIABLE mail_err + ) + +if ( DEBUG ) + message( "Step 2: mail") + message( "mail_res = ${mail_res}" ) + message( "mail_out = ${mail_out}" ) + message( "mail_err = ${mail_err}" ) +endif() + +execute_process( + COMMAND ${GIT} "config" "user.name" "otbbot" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE name_res + OUTPUT_VARIABLE name_out + ERROR_VARIABLE name_err + ) + +if ( DEBUG ) + message( "Step 3: name") + message( "name_res = ${name_res}" ) + message( "name_out = ${name_out}" ) + message( "name_err = ${name_err}" ) +endif() + +# create a branche +execute_process( + COMMAND ${GIT} "checkout" "-b" "${BRANCH_NAME}" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE co_res + OUTPUT_VARIABLE co_out + ERROR_VARIABLE co_err + ) + +if ( DEBUG ) + message( "Step 4: check-o") + message( "co_res = ${co_res}" ) + message( "co_out = ${co_out}" ) + message( "co_err = ${co_err}" ) +endif() + +set ( SB_TAR_NAME "SuperBuild_Install.tar" ) + +# 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_ARTIFACT_GIT}/${SB_TAR_NAME}" + -- "${CTEST_INSTALL_DIRECTORY}" + WORKING_DIRECTORY ${OTB_SOURCE_DIR} + ) + + +# In a near futur it might be nice to clean up the mess we made... + +if ( DEBUG ) + if (EXISTS "${SB_ARTIFACT_GIT}/${SB_TAR_NAME}") + message("Tar file exists in superbuild_artefact at: ${SB_ARTIFACT_GIT}/${SB_TAR_NAME}") + else() + message("Tar file does not exist") + endif() +endif() + +# add the file +execute_process( + COMMAND ${GIT} "add" "${SB_TAR_NAME}" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE add_res + OUTPUT_VARIABLE add_out + ERROR_VARIABLE add_err + ) + +if ( DEBUG ) + message( "Step 5: add") + message( "add_res = ${add_res}" ) + message( "add_out = ${add_out}" ) + message( "add_err = ${add_err}" ) +endif() + + +# commit +# We need the author because otherwise the mail is wrong +# In our case if toto is deploying a key in superbuild-artifact repo +# the the mail will be toto's +execute_process( + COMMAND ${GIT} "commit" "--author=\"otbbot <otbbot@orfeo-toolbox.org>\"" + "-m" "\"New Superbuild for ${SB_MD5} on ${IMAGE_NAME}\"" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE com_res + OUTPUT_VARIABLE com_out + ERROR_VARIABLE com_err + ) + +if ( DEBUG ) + message( "Step 6: com") + message( "com_res = ${com_res}" ) + message( "com_out = ${com_out}" ) + message( "com_err = ${com_err}" ) +endif() + + +# This part is just for debug +if ( DEBUG ) + execute_process( + COMMAND ${GIT} "log" "-1" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE log_res + OUTPUT_VARIABLE log_out + ERROR_VARIABLE log_err + ) + + message( "Step 6bis: log") + message( "log_res = ${log_res}" ) + message( "log_out = ${log_out}" ) + message( "log_err = ${log_err}" ) +endif() + +# push +# we should be able to do a simple : git push origin $BRANCH_NAME +execute_process( + COMMAND ${GIT} "push" "${REPOSITORY_GIT_URL}" "${BRANCH_NAME}" + WORKING_DIRECTORY ${SB_ARTIFACT_GIT} + RESULT_VARIABLE push_res + OUTPUT_VARIABLE push_out + ERROR_VARIABLE push_err + ) + +if ( DEBUG ) + message( "Step 7: push") + message( "push_res = ${push_res}" ) + message( "push_out = ${push_out}" ) + message( "push_err = ${push_err}" ) +endif() diff --git a/Modules/Feature/SeamCarving/test/CMakeLists.txt b/CI/sb_configure_options.cmake similarity index 57% rename from Modules/Feature/SeamCarving/test/CMakeLists.txt rename to CI/sb_configure_options.cmake index f8775d775c5a1ca807d63b5504e0a58401cae263..7b1b1e2e9deb0e7d7780b43edd31425f8c1be895 100644 --- a/Modules/Feature/SeamCarving/test/CMakeLists.txt +++ b/CI/sb_configure_options.cmake @@ -17,16 +17,24 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# For know OTB_DEPENDS is build with default value -otb_module_test() +set ( cmake_configure_option +"CMAKE_BUILD_TYPE=${CTEST_BUILD_CONFIGURATION} +CMAKE_INSTALL_PREFIX:PATH=${CTEST_INSTALL_DIRECTORY}") -set(OTBSeamCarvingTests -otbSeamCarvingTestDriver.cxx -) +set ( temporary_option +"OTB_USE_LIBKML=OFF +OTB_USE_MPI=OFF") -add_executable(otbSeamCarvingTestDriver ${OTBSeamCarvingTests}) -target_link_libraries(otbSeamCarvingTestDriver ${OTBSeamCarving-Test_LIBRARIES}) -otb_module_target_label(otbSeamCarvingTestDriver) +set(concat_options +"${cmake_configure_option} +${temporary_option} +") -# Tests Declaration +#Transform the previous string in list +string (REPLACE "\n" ";" sb_options ${concat_options}) +foreach(item ${sb_options}) + set( SB_CONFIGURE_OPTIONS "${SB_CONFIGURE_OPTIONS}-D${item};") +endforeach(item) diff --git a/CI/ubuntu-18.04-gcc-shark.cmake b/CI/ubuntu-18.04-fast.cmake similarity index 61% rename from CI/ubuntu-18.04-gcc-shark.cmake rename to CI/ubuntu-18.04-fast.cmake index b9ef2642b4890d8be17aabb164727bb70add5120..5ba38ec80c18fcf420f77160b528c6555ee1d84e 100644 --- a/CI/ubuntu-18.04-gcc-shark.cmake +++ b/CI/ubuntu-18.04-fast.cmake @@ -18,7 +18,18 @@ # limitations under the License. # -# Configuration options for ubuntu-18.04-gcc-shark-3.1.4 +# Configuration options for ubuntu-18.04-fast set(site_option -"opencv_INCLUDE_DIR:PATH=/usr/include") +"opencv_INCLUDE_DIR:PATH=/usr/include +CMAKE_C_COMPILER:STRING=clang +CMAKE_CXX_COMPILER:STRING=clang++ +CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld +CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld +CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld +CMAKE_C_COMPILER_LAUNCHER:STRING=ccache +CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache +OTB_USE_SHARK:BOOL=OFF +BUILD_EXAMPLES:BOOL=OFF") + +set(ci_skip_testing ON) diff --git a/CI/ubuntu-18.04-llvm-shark.cmake b/CI/ubuntu-18.04-llvm-nodoc.cmake similarity index 89% rename from CI/ubuntu-18.04-llvm-shark.cmake rename to CI/ubuntu-18.04-llvm-nodoc.cmake index af3b0283f2b122c7796d6eca61f4892fac11117f..27ab15d0cd7e0e9c9a7802f2831baf5ef5e5f180 100644 --- a/CI/ubuntu-18.04-llvm-shark.cmake +++ b/CI/ubuntu-18.04-llvm-nodoc.cmake @@ -18,7 +18,7 @@ # limitations under the License. # -# Configuration options for ubuntu-18.04-llvm-shark-3.1.4 +# Configuration options for ubuntu-18.04-llvm-nodoc set(site_option "opencv_INCLUDE_DIR:PATH=/usr/include @@ -28,4 +28,5 @@ CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld CMAKE_C_COMPILER_LAUNCHER:STRING=ccache -CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache") +CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache +OTB_USE_SHARK:BOOL=OFF") diff --git a/CI/ubuntu-18.04-llvm.cmake b/CI/ubuntu-18.04-llvm.cmake index a92364f2b45d82176aa65d3d112753055421aef1..9b838da433a06cff9f26281578ad56c0b20c52ec 100644 --- a/CI/ubuntu-18.04-llvm.cmake +++ b/CI/ubuntu-18.04-llvm.cmake @@ -22,9 +22,34 @@ set(site_option "opencv_INCLUDE_DIR:PATH=/usr/include -OTB_USE_SHARK:BOOL=OFF CMAKE_C_COMPILER:STRING=clang CMAKE_CXX_COMPILER:STRING=clang++ CMAKE_EXE_LINKER_FLAGS:STRING=-fuse-ld=lld CMAKE_MODULE_LINKER_FLAGS:STRING=-fuse-ld=lld -CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld") +CMAKE_SHARED_LINKER_FLAGS:STRING=-fuse-ld=lld +CMAKE_C_COMPILER_LAUNCHER:STRING=ccache +CMAKE_CXX_COMPILER_LAUNCHER:STRING=ccache +OTB_USE_SHARK:BOOL=OFF") + +if(NOT ${ci_do_cookbook} EQUAL -1) + set(site_option +"${site_option} +BUILD_COOKBOOK:BOOL=ON") +endif() + +if(NOT ${ci_do_doxygen} EQUAL -1) + set(site_option +"${site_option} +BUILD_DOCUMENTATION:BOOL=ON +OTB_DOXYGEN_ITK_TAGFILE:FILEPATH=${CTEST_BINARY_DIRECTORY}/InsightDoxygenDocTag-4.13.0 +OTB_DOXYGEN_ITK_DOXYGEN_URL:STRING=\"https://itk.org/Doxygen413/html\" +") + set (ENABLE_DOXYGEN ON) + # The ITK doxygen tag file needs to be patched before being used for OTB + # See otb-devutils/Scripts/tagfile_fix.py + message(STATUS "Get resources for Doxygen build ...") + execute_process(COMMAND wget https://www.orfeo-toolbox.org/packages/archives/Doxygen/InsightDoxygenDocTag-4.13.0.gz + WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY}) + execute_process(COMMAND gzip -d InsightDoxygenDocTag-4.13.0.gz + WORKING_DIRECTORY ${CTEST_BINARY_DIRECTORY}) +endif() diff --git a/CMake/OTBModuleTest.cmake b/CMake/OTBModuleTest.cmake index 97e21fbf0d80cb69fb10e02072a650e66b9e936c..c1402718ece7ecb92c2aabc0b581f16e7c679aa3 100644 --- a/CMake/OTBModuleTest.cmake +++ b/CMake/OTBModuleTest.cmake @@ -224,7 +224,7 @@ endfunction() function(otb_add_test_mpi) set( _OPTIONS_ARGS ) set( _ONE_VALUE_ARGS NAME NBPROCS COMMAND) - set( _MULTI_VALUE_ARGS ) + set( _MULTI_VALUE_ARGS EXTRA_OPT) cmake_parse_arguments( TEST_MPI "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} ) # Test nb procs @@ -235,6 +235,6 @@ function(otb_add_test_mpi) foreach(arg IN LISTS TEST_MPI_UNPARSED_ARGUMENTS) list(APPEND ARGS ${arg}) endforeach() - set (test_parameters -np ${TEST_MPI_NBPROCS} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS}) + set (test_parameters -n ${TEST_MPI_NBPROCS} ${OTB_MPIEXEC_OPT} ${TEST_MPI_EXTRA_OPT} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS}) otb_add_test(NAME ${TEST_MPI_NAME} COMMAND ${MPIEXEC} ${test_parameters}) endfunction() diff --git a/CMake/OTBStandaloneModuleMacros.cmake b/CMake/OTBStandaloneModuleMacros.cmake index 54e3ada505601f2a0d17559aa80daf61eec71352..e877a15ceb405951e27bddf2e55f914b5ad2d980 100644 --- a/CMake/OTBStandaloneModuleMacros.cmake +++ b/CMake/OTBStandaloneModuleMacros.cmake @@ -101,7 +101,7 @@ endmacro() function(otb_add_test_mpi) set( _OPTIONS_ARGS ) set( _ONE_VALUE_ARGS NAME NBPROCS COMMAND) - set( _MULTI_VALUE_ARGS ) + set( _MULTI_VALUE_ARGS EXTRA_OPT) cmake_parse_arguments( TEST_MPI "${_OPTIONS_ARGS}" "${_ONE_VALUE_ARGS}" "${_MULTI_VALUE_ARGS}" ${ARGN} ) # Test nb procs @@ -112,7 +112,7 @@ function(otb_add_test_mpi) foreach(arg IN LISTS TEST_MPI_UNPARSED_ARGUMENTS) list(APPEND ARGS ${arg}) endforeach() - set (test_parameters -np ${TEST_MPI_NBPROCS} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS}) + set (test_parameters -n ${TEST_MPI_NBPROCS} ${OTB_MPIEXEC_OPT} ${TEST_MPI_EXTRA_OPT} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TEST_MPI_COMMAND} ${ARGS}) otb_add_test(NAME ${TEST_MPI_NAME} COMMAND ${MPIEXEC} ${test_parameters}) endfunction() 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/apTvClTrainRegressionTest_monovar.2.txt b/Data/Baseline/OTB-Applications/Files/apTvClTrainRegressionTest_monovar.2.txt new file mode 100644 index 0000000000000000000000000000000000000000..da64925e95b925035b8027d2c8ccfd3655d23970 --- /dev/null +++ b/Data/Baseline/OTB-Applications/Files/apTvClTrainRegressionTest_monovar.2.txt @@ -0,0 +1 @@ +io.mse: 0.02761062607 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/Files/clDT_ModelQB1.1.dt b/Data/Baseline/OTB-Applications/Files/clDT_ModelQB1.1.dt new file mode 100644 index 0000000000000000000000000000000000000000..14e83e643867a596baa6b98ae1966dfb8ad58a67 --- /dev/null +++ b/Data/Baseline/OTB-Applications/Files/clDT_ModelQB1.1.dt @@ -0,0 +1,57 @@ +%YAML:1.0 +--- +opencv_ml_dtree: + format: 3 + is_classifier: 1 + var_all: 5 + var_count: 4 + ord_var_count: 4 + cat_var_count: 1 + training_params: + use_surrogates: 0 + max_categories: 10 + regression_accuracy: 9.9999997764825821e-03 + max_depth: 10 + min_sample_count: 10 + cross_validation_folds: 0 + global_var_idx: 1 + var_idx: [ 0, 1, 2, 3 ] + var_type: [ 0, 0, 0, 0, 1 ] + cat_ofs: [ 0, 0, 0, 0, 0, 0, 0, 0 ] + class_labels: [ 1, 2, 3, 4 ] + missing_subst: [ 0., 0., 0., 0., 0. ] + nodes: + - + depth: 0 + value: 1. + norm_class_idx: 0 + splits: + - { var:0, quality:86., le:-8.9000031352043152e-02 } + - + depth: 1 + value: 1. + norm_class_idx: 0 + splits: + - { var:3, quality:86., le:-1.3876452445983887e+00 } + - + depth: 2 + value: 1. + norm_class_idx: 0 + - + depth: 2 + value: 3. + norm_class_idx: 2 + - + depth: 1 + value: 2. + norm_class_idx: 1 + splits: + - { var:1, quality:86., le:3.4949243068695068e-01 } + - + depth: 2 + value: 2. + norm_class_idx: 1 + - + depth: 2 + value: 4. + norm_class_idx: 3 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/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif new file mode 100644 index 0000000000000000000000000000000000000000..a55d2a4fdc0eb3fac06b9f324bafe52905567f78 --- /dev/null +++ b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.3.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d45e82154f7f148836f952c6a492d30b40c420f612370002b062eb790601c3ab +size 4004576 diff --git a/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif new file mode 100644 index 0000000000000000000000000000000000000000..9697dbe2512ad89ad861fc054a56f2fbb3302e23 --- /dev/null +++ b/Data/Baseline/OTB/Images/bfTvVectorDataRasterizeFilter_OutputSHP.4.tif @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a86632ee6283bc1c03fce842b011fb29d5106d08d21567157e0b4bf6391bd7b +size 4004576 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/Classification/apTvClLabeledVector.dbf b/Data/Input/Classification/apTvClLabeledVector.dbf index 8c9c8fa2e9adc2038102e6bbfe03e0e7f47d4ba4..99d7d94a0bc953330ba371b27922c4d0cb7788f6 100644 --- a/Data/Input/Classification/apTvClLabeledVector.dbf +++ b/Data/Input/Classification/apTvClLabeledVector.dbf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c32639ad40e2cb8d439b0cb5961f0bce1b5bbfd258d13caa2a71392d54605cb4 -size 608145 +oid sha256:a22e6012765efaa5104afc6586b8c8e051294c9e9947f4f4ad25cf6d7cd67f09 +size 608146 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 1fdf53d44841712fcb7f221dfc5618bd4c6cc47c..8cd9ab8ed70e204d915e32c25ebb4944f52b4a9b 100755 --- a/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py +++ b/Documentation/Cookbook/Scripts/otbGenerateWrappersRstDoc.py @@ -426,7 +426,7 @@ def GenerateRstForApplications(rst_dir): tagFile.write("\tapp_" + appName + "\n") # Write application rst - with open(rst_dir + '/Applications/app_' + appName + '.rst', 'w') as appFile: + with open(rst_dir + '/Applications/app_' + appName + '.rst', 'w',encoding='utf-8') as appFile: appFile.write(render_application(appName, appNames)) if __name__ == "__main__": 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/CompilingOTBFromSource.rst b/Documentation/Cookbook/rst/CompilingOTBFromSource.rst index 7961cc02b4c01a66b884a02cc678759f70bc5a34..84dccaaf529465b0f31124b78401f8e5f0e3c593 100644 --- a/Documentation/Cookbook/rst/CompilingOTBFromSource.rst +++ b/Documentation/Cookbook/rst/CompilingOTBFromSource.rst @@ -23,7 +23,6 @@ majority) are optional and can be activated or not during the build process: .. table:: External libraries used in OTB - :widths: 50 20 30 :align: center +------------------------------------------------------------------+-----------------------+--------------------------+ 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/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/HarrisExample.cxx b/Examples/FeatureExtraction/HarrisExample.cxx index 62cc413105b759a9e7b22a0b26c95e0d051af1ff..cde2e254a38da5c1a3523b52918909e5ea6a8e43 100644 --- a/Examples/FeatureExtraction/HarrisExample.cxx +++ b/Examples/FeatureExtraction/HarrisExample.cxx @@ -19,7 +19,7 @@ */ -#include "itkMacro.h" +#include "otbMacro.h" #include "otbImage.h" #include "otbImageFileReader.h" @@ -166,7 +166,7 @@ int main(int argc, char* argv[]) { typedef OutputPointSetType::PointType OutputPointType; OutputPointType pCoordinate = (itList.Value()); - std::cout << pCoordinate << std::endl; + otbLogMacro(Debug, << pCoordinate); ++itList; } 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/Hyperspectral/HyperspectralUnmixingExample.cxx b/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx index 228e4d7386159a4a3f1ece1660fcdea882f5706e..e45218c390298e7cf84f31a29fec2b9575340f57 100644 --- a/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx +++ b/Examples/Hyperspectral/HyperspectralUnmixingExample.cxx @@ -44,6 +44,8 @@ #include "otbVcaImageFilter.h" #include "otbUnConstrainedLeastSquareImageFilter.h" +#include "itkMersenneTwisterRandomVariateGenerator.h" + int main(int argc, char* argv[]) { if (argc != 7) @@ -71,6 +73,10 @@ int main(int argc, char* argv[]) typedef otb::VectorRescaleIntensityImageFilter<ImageType, ImageType> RescalerType; typedef otb::VectorImageToMatrixImageFilter<ImageType> VectorImageToMatrixImageFilterType; + // We set the seed of the random number generator. + + itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()->SetSeed(121212); + // We instantiate now the image reader and we set the image file name. ReaderType::Pointer reader = ReaderType::New(); 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/Projections/test/CMakeLists.txt b/Examples/Projections/test/CMakeLists.txt index a65749b842bdbf900b8117f201700c3b70a60c50..5cd898e29184e612e87d43477cd79effbd0a6c24 100644 --- a/Examples/Projections/test/CMakeLists.txt +++ b/Examples/Projections/test/CMakeLists.txt @@ -66,7 +66,7 @@ otb_add_test(NAME prTeVectorDataProjectionExampleTest COMMAND ${OTB_TEST_DRIVER} ) otb_add_test(NAME prTeGeometriesProjectionTest COMMAND ${OTB_TEST_DRIVER} - --compare-ogr ${NOTOL} + --compare-ogr ${EPSILON_7} ${BASELINE}/geometriesProjectionExample.shp ${TEMP}/geometriesProjectionExample.shp Execute $<TARGET_FILE:GeometriesProjectionExample> 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/Simulation/ProsailModel.cxx b/Examples/Simulation/ProsailModel.cxx index 33ed31b2daa108ad31df4f60caac91edac2f0488..42e06f71691e029c1f55ba3199b175c9f5cd04ee 100644 --- a/Examples/Simulation/ProsailModel.cxx +++ b/Examples/Simulation/ProsailModel.cxx @@ -34,7 +34,7 @@ #include "otbSailModel.h" #include "otbProspectModel.h" - +#include "otbMacro.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" @@ -151,13 +151,12 @@ int main(int argc, char* argv[]) for (unsigned int i = 0; i < sail->GetViewingReflectance()->Size(); ++i) { - std::cout << "wavelength : "; - std::cout << sail->GetViewingReflectance()->GetResponse()[i].first; - std::cout << ". Viewing reflectance "; - std::cout << sail->GetViewingReflectance()->GetResponse()[i].second; - std::cout << ". Hemispherical reflectance "; - std::cout << sail->GetHemisphericalReflectance()->GetResponse()[i].second; - std::cout << std::endl; + otbLogMacro(Debug, << "wavelength : " + << sail->GetViewingReflectance()->GetResponse()[i].first + << ". Viewing reflectance " + << sail->GetViewingReflectance()->GetResponse()[i].second + << ". Hemispherical reflectance " + << sail->GetHemisphericalReflectance()->GetResponse()[i].second); } std::ofstream outputFile(OutputName, std::ios::out); 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/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx index 6de34b30ed9b51edcab3f751057f4370855ee418..84b2ee18a43f2631fa8d3fc6269c103d6546b8d9 100644 --- a/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx +++ b/Modules/Adapters/OSSIMAdapters/src/otbImageKeywordlist.cxx @@ -19,6 +19,7 @@ */ #include "otbImageKeywordlist.h" +#include "otbConfigurationManager.h" #include <cassert> @@ -38,6 +39,7 @@ #include "ossim/ossimTileMapModel.h" #include "ossim/projection/ossimProjectionFactoryRegistry.h" #include "ossim/projection/ossimRpcModel.h" +#include "ossim/base/ossimNotify.h" #pragma GCC diagnostic pop #else #include "ossim/base/ossimKeywordlist.h" @@ -47,6 +49,7 @@ #include "ossim/ossimTileMapModel.h" #include "ossim/projection/ossimProjectionFactoryRegistry.h" #include "ossim/projection/ossimRpcModel.h" +#include "ossim/base/ossimNotify.h" #endif #include "otbSensorModelAdapter.h" @@ -228,6 +231,15 @@ ReadGeometryFromImage(const std::string& filename, bool checkRpcTag) ossimKeywordlist geom_kwl; // = new ossimKeywordlist(); ImageKeywordlist otb_kwl; + // Save Ossim notify flags + ossimPushNotifyFlags(); + + // Except for DEBUG logger level, only fatal errors of OSSIM should be seen + if(otb::ConfigurationManager::GetLoggerLevel() < itk::LoggerBase::DEBUG) + { + ossimSetNotifyFlag(ossimNotifyFlags_FATAL); + } + /****************************************************/ /* First try : test the OSSIM plugins factory */ /****************************************************/ @@ -313,6 +325,9 @@ ReadGeometryFromImage(const std::string& filename, bool checkRpcTag) // which uses ossimSensorModelFactory and ossimPluginProjectionFactory internally, // thus by-passing the need for a valid ossimImageHandler. + // Restore Ossim notify flags + ossimPopNotifyFlags(); + return otb_kwl; } diff --git a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx index 27316187ac7ff5f1d7434c654b9f03026871dac2..eebdacb42da3f3f3ad5bd03f42b89669a03fba3a 100644 --- a/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx +++ b/Modules/Adapters/OSSIMAdapters/src/otbSensorModelAdapter.cxx @@ -37,6 +37,8 @@ #include "ossim/projection/ossimRpcProjection.h" #include "ossim/ossimPluginProjectionFactory.h" #include "ossim/base/ossimTieGptSet.h" +#include "ossim/projection/ossimRpcSolver.h" +#include "ossim/imaging/ossimImageGeometry.h" #pragma GCC diagnostic pop #else @@ -46,6 +48,8 @@ #include "ossim/projection/ossimRpcProjection.h" #include "ossim/ossimPluginProjectionFactory.h" #include "ossim/base/ossimTieGptSet.h" +#include "ossim/projection/ossimRpcSolver.h" +#include "ossim/imaging/ossimImageGeometry.h" #endif @@ -221,8 +225,36 @@ double SensorModelAdapter::Optimize() } else if (simpleRpcModel != nullptr) { - // Call optimize fit - precision = simpleRpcModel->optimizeFit(*m_TiePoints); + ossimRefPtr<ossimRpcSolver> rpcSolver = new ossimRpcSolver(false, false); + + std::vector<ossimDpt> imagePoints; + std::vector<ossimGpt> groundPoints; + m_TiePoints->getSlaveMasterPoints(imagePoints, groundPoints); + rpcSolver->solveCoefficients(imagePoints, groundPoints); + +#if OTB_OSSIM_VERSION < 20200 + ossimRefPtr<ossimRpcProjection> rpcProjection = dynamic_cast<ossimRpcProjection*>(rpcSolver->createRpcProjection()->getProjection()); +#else + ossimRefPtr<ossimRpcModel> rpcProjection = rpcSolver->getRpcModel(); +#endif + + if (!rpcProjection) + { + itkExceptionMacro(<< "Optimize(): Failed to solve RPC!"); + } + + ossimKeywordlist geom; + rpcProjection->saveState(geom); +#if OTB_OSSIM_VERSION < 20200 + simpleRpcModel->loadState(geom); +#else + // we have to convert simpleRpcModel into an ossimRpcModel + delete m_SensorModel; + m_SensorModel = new ossimRpcModel; + m_SensorModel->loadState(geom); +#endif + + precision = std::pow(rpcSolver->getRmsError(), 2); } } @@ -238,6 +270,18 @@ bool SensorModelAdapter::ReadGeomFile(const std::string & infile) m_SensorModel = ossimSensorModelFactory::instance()->createProjection(geom); + // search for ossimRpcProjection (not in ossimSensorModelFactory since OSSIM 2) + const char * typeValue = geom.find(0, "type"); + if (m_SensorModel == nullptr && strcmp(typeValue, "ossimRpcProjection") == 0) + { + m_SensorModel = new ossimRpcProjection; + if (!m_SensorModel->loadState(geom)) + { + delete m_SensorModel; + m_SensorModel = nullptr; + } + } + if (m_SensorModel == nullptr) { m_SensorModel = ossimplugins::ossimPluginProjectionFactory::instance()->createProjection(geom); diff --git a/Modules/Applications/AppClassification/app/CMakeLists.txt b/Modules/Applications/AppClassification/app/CMakeLists.txt index b646618959248fab615337a300a67a254f1337b5..50ac00ea1619c068da99774d0010ee532a5b7fd1 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 @@ -75,11 +70,6 @@ otb_create_application( SOURCES otbPredictRegression.cxx LINK_LIBRARIES ${${otb-module}_LIBRARIES}) -otb_create_application( - NAME DSFuzzyModelEstimation - SOURCES otbDSFuzzyModelEstimation.cxx - LINK_LIBRARIES ${${otb-module}_LIBRARIES}) - otb_create_application( NAME ClassificationMapRegularization SOURCES otbClassificationMapRegularization.cxx @@ -95,11 +85,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/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/otbKMeansClassification.cxx b/Modules/Applications/AppClassification/app/otbKMeansClassification.cxx index bcb546e03d11118b8e5c98a29d1cc7dbd824873e..d1c7fcd52f0e88e315536ec6afc7343f1ca9d5bd 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: @@ -495,9 +464,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/otbPolygonClassStatistics.cxx b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx index 95e3314e115ac5254d08d6320207b4e1a80f43fe..bbfb99010e2df503fc561fad3ba528b8b3904151 100644 --- a/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx +++ b/Modules/Applications/AppClassification/app/otbPolygonClassStatistics.cxx @@ -54,7 +54,7 @@ public: /** Filters typedef */ typedef otb::OGRDataToClassStatisticsFilter<FloatVectorImageType,UInt8ImageType> FilterType; - + typedef otb::StatisticsXMLFileWriter<FloatVectorImageType::PixelType> StatWriterType; typedef otb::GeometriesSet GeometriesType; @@ -64,7 +64,6 @@ public: private: PolygonClassStatistics() { - } void DoInit() override @@ -98,17 +97,17 @@ private: AddParameter(ParameterType_InputImage, "mask", "Input validity mask"); SetParameterDescription("mask", "Validity mask (only pixels corresponding to a mask value greater than 0 will be used for statistics)"); MandatoryOff("mask"); - + AddParameter(ParameterType_InputFilename, "vec", "Input vectors"); SetParameterDescription("vec","Input geometries to analyze"); - + AddParameter(ParameterType_OutputFilename, "out", "Output XML statistics file"); SetParameterDescription("out","Output file to store statistics (XML format)"); AddParameter(ParameterType_ListView, "field", "Field Name"); SetParameterDescription("field","Name of the field carrying the class name in the input vectors."); SetListViewSingleSelectionMode("field",true); - + AddParameter(ParameterType_Int, "layer", "Layer Index"); SetParameterDescription("layer", "Layer index to read in the input vector file."); MandatoryOff("layer"); @@ -138,16 +137,16 @@ private: ogr::Feature feature = layer.ogr().GetNextFeature(); ClearChoices("field"); - + for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++) { std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef(); key = item; std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum); std::transform(key.begin(), end, key.begin(), tolower); - + OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType(); - + if(fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64) { std::string tmpKey="field."+key.substr(0, end - key.begin()); @@ -159,7 +158,7 @@ private: // Check that the extension of the output parameter is XML (mandatory for // StatisticsXMLFileWriter) // Check it here to trigger the error before polygons analysis - + if ( HasValue("out") ) { // Store filename extension @@ -175,46 +174,39 @@ private: void DoExecute() override { - otb::ogr::DataSource::Pointer vectors = - otb::ogr::DataSource::New(this->GetParameterString("vec")); + otb::ogr::DataSource::Pointer vectors = otb::ogr::DataSource::New(this->GetParameterString("vec")); - // Retrieve the field name - std::vector<int> selectedCFieldIdx = GetSelectedItems("field"); + // Retrieve the field name + std::vector<int> selectedCFieldIdx = GetSelectedItems("field"); - if(selectedCFieldIdx.empty()) + if (selectedCFieldIdx.empty()) { otbAppLogFATAL(<<"No field has been selected for data labelling!"); } - std::vector<std::string> cFieldNames = GetChoiceNames("field"); - std::string fieldName = cFieldNames[selectedCFieldIdx.front()]; - - otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev"); - - // Reproject geometries - FloatVectorImageType::Pointer inputImg = this->GetParameterImage("in"); - std::string imageProjectionRef = inputImg->GetProjectionRef(); - FloatVectorImageType::ImageKeywordlistType imageKwl = - inputImg->GetImageKeywordlist(); - std::string vectorProjectionRef = - vectors->GetLayer(GetParameterInt("layer")).GetProjectionRef(); - - otb::ogr::DataSource::Pointer reprojVector = vectors; - GeometriesType::Pointer inputGeomSet; - ProjectionFilterType::Pointer geometriesProjFilter; - GeometriesType::Pointer outputGeomSet; - const OGRSpatialReference imgOGRSref = - OGRSpatialReference( imageProjectionRef.c_str() ); - const OGRSpatialReference vectorOGRSref = - OGRSpatialReference( vectorProjectionRef.c_str() ); - bool doReproj = true; - // don't reproject for these cases - if ( vectorProjectionRef.empty() - || ( imgOGRSref.IsSame( &vectorOGRSref ) ) - || ( imageProjectionRef.empty() && imageKwl.GetSize() == 0) ) - doReproj = false; - - if (doReproj) + std::vector<std::string> cFieldNames = GetChoiceNames("field"); + std::string fieldName = cFieldNames[selectedCFieldIdx.front()]; + + otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this, "elev"); + + // Reproject geometries + FloatVectorImageType::Pointer inputImg = this->GetParameterImage("in"); + std::string imageProjectionRef = inputImg->GetProjectionRef(); + FloatVectorImageType::ImageKeywordlistType imageKwl = inputImg->GetImageKeywordlist(); + std::string vectorProjectionRef = vectors->GetLayer(GetParameterInt("layer")).GetProjectionRef(); + + otb::ogr::DataSource::Pointer reprojVector = vectors; + GeometriesType::Pointer inputGeomSet; + ProjectionFilterType::Pointer geometriesProjFilter; + GeometriesType::Pointer outputGeomSet; + const OGRSpatialReference imgOGRSref = OGRSpatialReference(imageProjectionRef.c_str()); + const OGRSpatialReference vectorOGRSref = OGRSpatialReference(vectorProjectionRef.c_str()); + bool doReproj = true; + // don't reproject for these cases + if (vectorProjectionRef.empty() || (imgOGRSref.IsSame(&vectorOGRSref)) || (imageProjectionRef.empty() && imageKwl.GetSize() == 0)) + doReproj = false; + + if (doReproj) { inputGeomSet = GeometriesType::New(vectors); reprojVector = otb::ogr::DataSource::New(); @@ -236,7 +228,7 @@ private: filter->SetInput(this->GetParameterImage("in")); if (IsParameterEnabled("mask") && HasValue("mask")) { - filter->SetMask(this->GetParameterImage<UInt8ImageType>("mask")); + filter->SetMask(this->GetParameterUInt8Image("mask")); } filter->SetOGRData(reprojVector); filter->SetFieldName(fieldName); @@ -245,10 +237,10 @@ private: AddProcess(filter->GetStreamer(),"Analyze polygons..."); filter->Update(); - + FilterType::ClassCountMapType &classCount = filter->GetClassCountOutput()->Get(); FilterType::PolygonSizeMapType &polySize = filter->GetPolygonSizeOutput()->Get(); - + StatWriterType::Pointer statWriter = StatWriterType::New(); statWriter->SetFileName(this->GetParameterString("out")); statWriter->AddInputMap<FilterType::ClassCountMapType>("samplesPerClass",classCount); diff --git a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx index a4f8b1fc33a73f4e1a2f123dafd8498238f3f984..959f3c129d0c32c3f77343f249c0b18e022232de 100644 --- a/Modules/Applications/AppClassification/app/otbSampleSelection.cxx +++ b/Modules/Applications/AppClassification/app/otbSampleSelection.cxx @@ -63,7 +63,7 @@ public: UInt8ImageType, otb::RandomSampler> RandomSamplerType; typedef otb::SamplingRateCalculator RateCalculatorType; - + typedef std::map<std::string, unsigned long> ClassCountMapType; typedef RateCalculatorType::MapRateType MapRateType; typedef itk::VariableLengthVector<float> MeasurementType; @@ -87,40 +87,41 @@ private: // 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 " - "class). \n\nFirst of all, the geometries must be analyzed by the PolygonClassStatistics application " - "to compute statistics about the geometries, which are summarized in an xml file. " - "\nThen, this xml file must be given as input to this application (parameter instats).\n\n" - "The input support image and the input training vectors shall be given in " - "parameters 'in' and 'vec' respectively. Only the sampling grid (origin, size, spacing)" - "will be read in the input image.\n" - "There are several strategies to select samples (parameter strategy) : \n\n" - " - smallest (default) : select the same number of sample in each class" - " so that the smallest one is fully sampled.\n" - " - constant : select the same number of samples N in each class" - " (with N below or equal to the size of the smallest class).\n" - " - byclass : set the required number for each class manually, with an input CSV file" - " (first column is class name, second one is the required samples number).\n\n" - " - percent: set a target global percentage of samples to use. Class proportions will be respected. \n\n" - " - total: set a target total number of samples to use. Class proportions will be respected. \n\n" - "There is also a choice on the sampling type to performs : \n\n" - " - periodic : select samples uniformly distributed\n" - " - random : select samples randomly distributed\n\n" - "Once the strategy and type are selected, the application outputs samples positions" - "(parameter out).\n\n" - - "The other parameters to look at are : \n\n" - " - layer : index specifying from which layer to pick geometries.\n" - " - field : set the field name containing the class.\n" - " - mask : an optional raster mask can be used to discard samples.\n" - " - outrates : allows outputting a CSV file that summarizes the sampling rates for each class.\n" - - "\nAs with the PolygonClassStatistics application, different types of geometry are supported : " - "polygons, lines, points. \nThe behavior of this application is different for each type of geometry : \n\n" - " - polygon: select points whose center is inside the polygon\n" - " - lines : select points intersecting the line\n" - " - points : select closest point to the provided point"); + SetDocLongDescription( + "The application selects a set of samples from geometries " + "intended for training (they should have a field giving the associated " + "class). \n\nFirst of all, the geometries must be analyzed by the PolygonClassStatistics application " + "to compute statistics about the geometries, which are summarized in an xml file. " + "\nThen, this xml file must be given as input to this application (parameter instats).\n\n" + "The input support image and the input training vectors shall be given in " + "parameters 'in' and 'vec' respectively. Only the sampling grid (origin, size, spacing)" + "will be read in the input image.\n" + "There are several strategies to select samples (parameter strategy) : \n\n" + " - smallest (default) : select the same number of sample in each class" + " so that the smallest one is fully sampled.\n" + " - constant : select the same number of samples N in each class" + " (with N below or equal to the size of the smallest class).\n" + " - byclass : set the required number for each class manually, with an input CSV file" + " (first column is class name, second one is the required samples number).\n\n" + " - percent: set a target global percentage of samples to use. Class proportions will be respected. \n\n" + " - total: set a target total number of samples to use. Class proportions will be respected. \n\n" + "There is also a choice on the sampling type to performs : \n\n" + " - periodic : select samples uniformly distributed\n" + " - random : select samples randomly distributed\n\n" + "Once the strategy and type are selected, the application outputs samples positions" + "(parameter out).\n\n" + + "The other parameters to look at are : \n\n" + " - layer : index specifying from which layer to pick geometries.\n" + " - field : set the field name containing the class.\n" + " - mask : an optional raster mask can be used to discard samples.\n" + " - outrates : allows outputting a CSV file that summarizes the sampling rates for each class.\n" + + "\nAs with the PolygonClassStatistics application, different types of geometry are supported : " + "polygons, lines, points. \nThe behavior of this application is different for each type of geometry : \n\n" + " - polygon: select points whose center is inside the polygon\n" + " - lines : select points intersecting the line\n" + " - points : select closest point to the provided point"); SetDocLimitations("None"); SetDocAuthors("OTB-Team"); SetDocSeeAlso(" "); @@ -192,7 +193,7 @@ private: SetParameterDescription("strategy.total.v","The number of samples to generate"); SetMinimumParameterIntValue("strategy.total.v",1); SetDefaultParameterInt("strategy.total.v",1000); - + AddChoice("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled"); SetParameterDescription("strategy.smallest","Set same number of samples for all classes, with the smallest class fully sampled"); @@ -238,16 +239,16 @@ private: ogr::Feature feature = layer.ogr().GetNextFeature(); ClearChoices("field"); - + for(int iField=0; iField<feature.ogr().GetFieldCount(); iField++) { std::string key, item = feature.ogr().GetFieldDefnRef(iField)->GetNameRef(); key = item; std::string::iterator end = std::remove_if(key.begin(),key.end(),IsNotAlphaNum); std::transform(key.begin(), end, key.begin(), tolower); - + OGRFieldType fieldType = feature.ogr().GetFieldDefnRef(iField)->GetType(); - + if(fieldType == OFTString || fieldType == OFTInteger || fieldType == OFTInteger64) { std::string tmpKey="field."+key.substr(0, end - key.begin()); @@ -266,27 +267,26 @@ private: // Get field name std::vector<int> selectedCFieldIdx = GetSelectedItems("field"); - + if(selectedCFieldIdx.empty()) { otbAppLogFATAL(<<"No field has been selected for data labelling!"); } - - std::vector<std::string> cFieldNames = GetChoiceNames("field"); - std::string fieldName = cFieldNames[selectedCFieldIdx.front()]; - - m_ReaderStat->SetFileName(this->GetParameterString("instats")); - ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass"); - m_RateCalculator->SetClassCount(classCount); - - switch (this->GetParameterInt("strategy")) + + std::vector<std::string> cFieldNames = GetChoiceNames("field"); + std::string fieldName = cFieldNames[selectedCFieldIdx.front()]; + + m_ReaderStat->SetFileName(this->GetParameterString("instats")); + ClassCountMapType classCount = m_ReaderStat->GetStatisticMapByName<ClassCountMapType>("samplesPerClass"); + m_RateCalculator->SetClassCount(classCount); + + switch (this->GetParameterInt("strategy")) { // byclass case 0: { otbAppLogINFO("Sampling strategy : set number of samples for each class"); - ClassCountMapType requiredCount = - otb::SamplingRateCalculator::ReadRequiredSamples(this->GetParameterString("strategy.byclass.in")); + ClassCountMapType requiredCount = otb::SamplingRateCalculator::ReadRequiredSamples(this->GetParameterString("strategy.byclass.in")); m_RateCalculator->SetNbOfSamplesByClass(requiredCount); } break; @@ -330,12 +330,12 @@ private: otbAppLogFATAL("Strategy mode unknown :"<<this->GetParameterString("strategy")); break; } - + if (IsParameterEnabled("outrates") && HasValue("outrates")) { m_RateCalculator->Write(this->GetParameterString("outrates")); } - + MapRateType rates = m_RateCalculator->GetRatesByClass(); std::ostringstream oss; oss << " className requiredSamples totalSamples rate" << std::endl; @@ -376,16 +376,14 @@ private: ProjectionFilterType::Pointer geometriesProjFilter; GeometriesType::Pointer outputGeomSet; bool doReproj = true; - const OGRSpatialReference imgOGRSref = - OGRSpatialReference( imageProjectionRef.c_str() ); - const OGRSpatialReference vectorOGRSref = - OGRSpatialReference( vectorProjectionRef.c_str() ); + const OGRSpatialReference imgOGRSref = OGRSpatialReference(imageProjectionRef.c_str()); + const OGRSpatialReference vectorOGRSref = OGRSpatialReference(vectorProjectionRef.c_str()); // don't reproject for these cases if ( vectorProjectionRef.empty() || ( imgOGRSref.IsSame( &vectorOGRSref ) ) || ( imageProjectionRef.empty() && imageKwl.GetSize() == 0) ) doReproj = false; - + if (doReproj) { inputGeomSet = GeometriesType::New(vectors); @@ -407,7 +405,7 @@ private: // Create output dataset for sample positions otb::ogr::DataSource::Pointer outputSamples = otb::ogr::DataSource::New(this->GetParameterString("out"),otb::ogr::DataSource::Modes::Overwrite); - + switch (this->GetParameterInt("sampler")) { // periodic @@ -426,7 +424,7 @@ private: periodicFilt->SetSamplerParameters(param); if (IsParameterEnabled("mask") && HasValue("mask")) { - periodicFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask")); + periodicFilt->SetMask(this->GetParameterUInt8Image("mask")); } periodicFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram")); AddProcess(periodicFilt->GetStreamer(),"Selecting positions with periodic sampler..."); @@ -444,7 +442,7 @@ private: randomFilt->SetLayerIndex(this->GetParameterInt("layer")); if (IsParameterEnabled("mask") && HasValue("mask")) { - randomFilt->SetMask(this->GetParameterImage<UInt8ImageType>("mask")); + randomFilt->SetMask(this->GetParameterUInt8Image("mask")); } randomFilt->GetStreamer()->SetAutomaticTiledStreaming(this->GetParameterInt("ram")); AddProcess(randomFilt->GetStreamer(),"Selecting positions with random sampler..."); 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/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/test/CMakeLists.txt b/Modules/Applications/AppClassification/test/CMakeLists.txt index 9d40b00dd166e3d5230b30cb62792ebceb8ad6a9..2379deb501c3c6233fb1a1a6b34e8fe99a78c6e0 100644 --- a/Modules/Applications/AppClassification/test/CMakeLists.txt +++ b/Modules/Applications/AppClassification/test/CMakeLists.txt @@ -179,6 +179,9 @@ foreach(classifier ${classifierList}) VALID ${valid} ) + set_tests_properties(apTvClTrainMethod${classifier}ImagesClassifierQB1 PROPERTIES + RESOURCE_LOCK ${INPUTDATA}/Classification/VectorData_${${lclassifier}_input}QB1_utm31n${vector_input_format}) + if(${_classifier_has_baseline} EQUAL -1) set(valid ${ascii_confmat_comparison} ${ascii_ref_path}/${OUTCONFMATFILE} ${TEMP}/${OUTCONFMATFILE}) else() @@ -560,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 @@ -670,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} @@ -678,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 @@ -766,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 @@ -850,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 diff --git a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx index 561131caab6a86f6d21c50695838fb4ba0821fe2..4cd2b5f917dfdf22963006931c5bcd91b583bee8 100644 --- a/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx +++ b/Modules/Applications/AppImageUtils/app/otbManageNoData.cxx @@ -50,7 +50,7 @@ public: /** Filters typedef */ typedef otb::ImageToNoDataMaskFilter<FloatVectorImageType,UInt8ImageType> FilterType; typedef otb::ChangeNoDataValueFilter<FloatVectorImageType,FloatVectorImageType> ChangeNoDataFilterType; - + typedef otb::ImageList<FloatImageType> ImageListType; typedef otb::VectorImageToImageListFilter<FloatVectorImageType,ImageListType> VectorToListFilterType; typedef otb::ImageListToVectorImageFilter<ImageListType,FloatVectorImageType> ListToVectorFilterType; @@ -81,12 +81,12 @@ private: AddParameter(ParameterType_Bool,"usenan", "Consider NaN as no-data"); SetParameterDescription("usenan","If active, the application will consider NaN as no-data values as well"); - + AddParameter(ParameterType_Choice,"mode","No-data handling mode"); SetParameterDescription("mode","Allows choosing between different no-data handling options"); AddChoice("mode.buildmask","Build a no-data Mask"); - + AddParameter(ParameterType_Float,"mode.buildmask.inv","Inside Value"); SetParameterDescription("mode.buildmask.inv","Value given in the output mask to pixels that are not no data pixels"); SetDefaultParameterInt("mode.buildmask.inv",1); @@ -132,7 +132,7 @@ private: void DoExecute() override { FloatVectorImageType::Pointer inputPtr = this->GetParameterImage("in"); - + m_Filter = FilterType::New(); m_Filter->SetInsideValue(this->GetParameterFloat("mode.buildmask.inv")); m_Filter->SetOutsideValue(this->GetParameterFloat("mode.buildmask.outv")); @@ -146,7 +146,7 @@ private: std::vector<double> newNoData(inputPtr->GetNumberOfComponentsPerPixel(),GetParameterFloat("mode.changevalue.newv")); m_ChangeNoDataFilter->SetNewNoDataValues(newNoData); - + if(GetParameterString("mode") == "buildmask") { SetParameterOutputImage("out",m_Filter->GetOutput()); @@ -158,7 +158,7 @@ private: else if (GetParameterString("mode") == "apply") { m_MaskFilters.clear(); - UInt8ImageType::Pointer maskPtr = this->GetParameterImage<UInt8ImageType>("mode.apply.mask"); + UInt8ImageType::Pointer maskPtr = this->GetParameterUInt8Image("mode.apply.mask"); unsigned int nbBands = inputPtr->GetNumberOfComponentsPerPixel(); itk::MetaDataDictionary &dict = inputPtr->GetMetaDataDictionary(); std::vector<bool> flags; @@ -221,4 +221,3 @@ private: } OTB_APPLICATION_EXPORT(otb::Wrapper::ManageNoData) - diff --git a/Modules/Applications/AppImageUtils/test/CMakeLists.txt b/Modules/Applications/AppImageUtils/test/CMakeLists.txt index 182db8fca0cb7815d17a54ffd4cb56aa00211cdc..0e3ed23abab8aa8a3d47d71e9e0c1fd5d28a079d 100644 --- a/Modules/Applications/AppImageUtils/test/CMakeLists.txt +++ b/Modules/Applications/AppImageUtils/test/CMakeLists.txt @@ -44,7 +44,7 @@ otb_test_application(NAME apTvUtDynamicConvertBasic otb_test_application(NAME apTuUtDynamicConvertExtendedFilename_writer APP DynamicConvert OPTIONS -in ${INPUTDATA}/ToulouseExtract_WithGeom.tif - -out ${TEMP}/apTvUtGeomExtendedFilename.tif?&gdal:co:TILED=YES&writegeom=false + -out ${TEMP}/apTvUtNoGeomExtendedFilename.tif?&gdal:co:TILED=YES&writegeom=false ) otb_test_application(NAME apTvUtDynamicConvertExtendedFilename_readerGEOM diff --git a/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx b/Modules/Applications/AppIndices/app/otbRadiometricIndices.cxx index 4d13ff7279378f64dcc20f7e5175b5e005900751..082106fd43fca3df6e443e7cea0009cfc873cd8e 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; }; @@ -153,46 +94,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 +152,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/AppProjection/app/otbGenerateRPCSensorModel.cxx b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx index 36ff3a27e097f3791324f94f9aad7cab588518cf..e604e8e4b656317f9c8eb2d2233aefe4b5e54e6b 100644 --- a/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx +++ b/Modules/Applications/AppProjection/app/otbGenerateRPCSensorModel.cxx @@ -140,7 +140,7 @@ private: iss >> x >> y >> lon >> lat; z = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(lon,lat); - otbAppLogINFO("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat); + otbAppLogDEBUG("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat); Point2DType p1; Point3DType p2; diff --git a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx index 4d3b243cf57f2137d2317f3299659702e7fd0d29..6c1346b288e1423a6bd5e2748c0bff2606c57195 100644 --- a/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx +++ b/Modules/Applications/AppProjection/app/otbRefineSensorModel.cxx @@ -118,9 +118,12 @@ private: otb::SensorModelAdapter::Pointer sm_ref = otb::SensorModelAdapter::New(); // Read the geom file - sm->ReadGeomFile(GetParameterString("ingeom")); + bool isRead = sm->ReadGeomFile(GetParameterString("ingeom")); sm_ref->ReadGeomFile(GetParameterString("ingeom")); + if (!isRead) + otbAppLogFATAL("Can't read the input geom file!"); + // Setup the DEM Handler otb::Wrapper::ElevationParametersHandler::SetupDEMHandlerFromElevationParameters(this,"elev"); @@ -156,7 +159,7 @@ private: z = otb::DEMHandler::Instance()->GetHeightAboveEllipsoid(lon,lat); - otbAppLogINFO("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat); + otbAppLogDEBUG("Adding tie point x="<<x<<", y="<<y<<", z="<<z<<", lon="<<lon<<", lat="<<lat); sm->AddTiePoint(x,y,z,lon,lat); @@ -210,6 +213,7 @@ private: ofs<<"#ref_lon ref_lat elevation predicted_lon predicted_lat predicted_elev x_error_ref(meters) y_error_ref(meters) global_error_ref(meters) x_error(meters) y_error(meters) global_error(meters)"<<std::endl; } + size_t validPoints=0; for(TiePointsType::const_iterator it = tiepoints.begin(); it!=tiepoints.end(); ++it) { @@ -217,6 +221,22 @@ private: sm->ForwardTransformPoint(it->first[0],it->first[1],it->first[2],tmpPoint[0],tmpPoint[1],tmpPoint[2]); sm_ref->ForwardTransformPoint(it->first[0],it->first[1],it->first[2],tmpPoint_ref[0],tmpPoint_ref[1],tmpPoint_ref[2]); + if (!(std::isfinite(tmpPoint[0]) && + std::isfinite(tmpPoint[1]) && + std::isfinite(tmpPoint[2]))) + { + otbAppLogWARNING("Can't project tie point at ["<<it->first[0]<<","<<it->first[1]<<","<<it->first[2]<<"] with optimized model!"); + continue; + } + + if (!(std::isfinite(tmpPoint_ref[0]) && + std::isfinite(tmpPoint_ref[1]) && + std::isfinite(tmpPoint_ref[2]))) + { + otbAppLogWARNING("Can't project tie point at ["<<it->first[0]<<","<<it->first[1]<<","<<it->first[2]<<"] with original model!"); + continue; + } + tmpPoint = rsTransform->TransformPoint(tmpPoint); tmpPoint_ref = rsTransform->TransformPoint(tmpPoint_ref); @@ -257,29 +277,34 @@ private: meanx_ref += xerror_ref; meany_ref += yerror_ref; + validPoints++; + } + if (!validPoints) + { + otbAppLogFATAL("No valid points to compute RMSE !"); } - rmse/=tiepoints.size(); + rmse/=validPoints; - rmsex/=tiepoints.size(); + rmsex/=validPoints; - rmsey/=tiepoints.size(); + rmsey/=validPoints; - meanx/=tiepoints.size(); - meany/=tiepoints.size(); + meanx/=validPoints; + meany/=validPoints; - rmse_ref/=tiepoints.size(); + rmse_ref/=validPoints; - rmsex_ref/=tiepoints.size(); + rmsex_ref/=validPoints; - rmsey_ref/=tiepoints.size(); + rmsey_ref/=validPoints; - meanx_ref/=tiepoints.size(); - meany_ref/=tiepoints.size(); + meanx_ref/=validPoints; + meany_ref/=validPoints; double stdevx = std::sqrt(rmsex - meanx * meanx); diff --git a/Modules/Applications/AppProjection/test/CMakeLists.txt b/Modules/Applications/AppProjection/test/CMakeLists.txt index 7672754ad00584ffbc094193154d58f52e1fecdd..28b843b2157b84c32720f2a218302b9e36942f2b 100644 --- a/Modules/Applications/AppProjection/test/CMakeLists.txt +++ b/Modules/Applications/AppProjection/test/CMakeLists.txt @@ -151,6 +151,14 @@ otb_test_application(NAME apTvPrConvertCartoToGeoPoint #----------- GenerateRPCSensorModel TESTS ---------------- +# Remove baseline for OSSIM >= 2.2, as ossimRPCProjection.optimizeFit() is broken +set(VALID_CONDITION) +if(OTB_OSSIM_VERSION LESS 20200) +set(VALID_CONDITION + VALID --compare-ascii ${EPSILON_3} + ${BASELINE_FILES}/apTvPrGenerateRPCSensorModelGeomOutput.geom + ${TEMP}/apTvPrGenerateRPCSensorModelGeomOutput.geom) +endif() otb_test_application(NAME apTvPrGenerateRPCSensorModel APP GenerateRPCSensorModel OPTIONS -inpoints ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500_in_tie_points.txt @@ -160,9 +168,7 @@ otb_test_application(NAME apTvPrGenerateRPCSensorModel -map utm -map.utm.zone 31 -map.utm.northhem 1 -elev.dem ${INPUTDATA}/DEM/srtm_directory -elev.geoid ${INPUTDATA}/DEM/egm96.grd - VALID --compare-ascii ${EPSILON_3} - ${BASELINE_FILES}/apTvPrGenerateRPCSensorModelGeomOutput.geom - ${TEMP}/apTvPrGenerateRPCSensorModelGeomOutput.geom) + ${VALID_CONDITION}) #----------- GridBasedImageResampling TESTS ---------------- @@ -281,17 +287,24 @@ otb_test_application(NAME apTvPrRefineSensorModel -elev.geoid ${INPUTDATA}/DEM/egm96.grd VALID --compare-ascii 0.1 ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput.geom - ${TEMP}/apTvPrRefineSensorModelGeomOutput.geom) + ${TEMP}/apTvPrRefineSensorModelGeomOutput.geom + --ignore-lines-with 1 support_data.) + +# Remove baseline for OSSIM >= 2, as ossimRPCProjection.optimizeFit() is broken +set(VALID_CONDITION) +if(OTB_OSSIM_VERSION LESS 20200) +set(VALID_CONDITION + VALID --compare-ascii 0.1 + ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput2.geom + ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom) +endif() - otb_test_application(NAME apTvPrRefineSensorModel2 APP RefineSensorModel OPTIONS -ingeom ${INPUTDATA}/s1a-iw-grd-vh-20150210t060009-20150210t060034-004557-0059a3-002.geom -inpoints ${INPUTDATA}/pts_idV5.txt -outgeom ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom - VALID --compare-ascii 0.1 - ${BASELINE_FILES}/apTvPrRefineSensorModelGeomOutput2.geom - ${TEMP}/apTvPrRefineSensorModelGeomOutput2.geom) + ${VALID_CONDITION}) @@ -330,7 +343,8 @@ otb_test_application(NAME apTvPrConvertSensorToGeoPoint TESTENVOPTIONS ${TEMP}/apTvPrConvertSensorToGeoPoint.txt VALID --compare-ascii ${EPSILON_7} ${BASELINE_FILES}/apTvPrConvertSensorToGeoPoint.txt - ${TEMP}/apTvPrConvertSensorToGeoPoint.txt) + ${TEMP}/apTvPrConvertSensorToGeoPoint.txt + --ignore-lines-with 2 town country) #----------- Superimpose TESTS ---------------- diff --git a/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt b/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt index 9f5b23cdeeca105cd7fe4205cc13441ca2b5bc04..56ed2b28b458a3aa7c4ec61797481798cae4beb6 100644 --- a/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt +++ b/Modules/Applications/AppSARPolarMatrixConvert/test/CMakeLists.txt @@ -95,7 +95,7 @@ otb_test_application(NAME apTvSARPolarMatrixConvertRecLinCovToRecCirCov OPTIONS -inc ${BASELINE}/saTvSinclairImageFilter_SinclairToReciprocalCovariance.tif -conv mlinearcovariancetocircularcovariance - -outc ${TEMP}/apTvSARPolarMatrixConvertRecCovToRecCoh.tif + -outc ${TEMP}/apTvSARPolarMatrixConvertRecLinCovToRecCirCov.tif ) diff --git a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx index 8f09d36adf5f74b938dfe1e838e49aa8fbf233a5..bc414d0f2081c4d6d9a7951ea079b24318838cea 100644 --- a/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx +++ b/Modules/Applications/AppSegmentation/app/otbLargeScaleMeanShift.cxx @@ -33,7 +33,7 @@ namespace Wrapper * * This application gathers the 4 steps of the large-scale MeanShift * segmentation framework. - * + * */ class LargeScaleMeanShift : public CompositeApplication { @@ -191,13 +191,11 @@ private: if (IsParameterEnabled("mode.vector.imfield") && HasValue("mode.vector.imfield")) { - GetInternalApplication("vectorization")->SetParameterInputImage("in", - GetParameterImage<ImageBaseType>("mode.vector.imfield")); + GetInternalApplication("vectorization")->SetParameterInputImage("in", GetParameterImageBase("mode.vector.imfield")); } else { - GetInternalApplication("vectorization")->SetParameterInputImage("in", - GetParameterImage<ImageBaseType>("in")); + GetInternalApplication("vectorization")->SetParameterInputImage("in", GetParameterImageBase("in")); } GetInternalApplication("vectorization")->SetParameterString("inseg", tmpFilenames[2]); 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/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx b/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx index d2298e5796960dd4276c47642cbe6adbe485150e..dbaf3ddfbb271f928bb0676b358a7d7ff6ca7930 100644 --- a/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx +++ b/Modules/Feature/Textures/test/otbScalarImageToHigherOrderTexturesFilter.cxx @@ -22,6 +22,7 @@ #include "otbImage.h" #include "otbImageFileReader.h" #include "itkExtractImageFilter.h" +#include "otbMacro.h" const unsigned int Dimension = 2; typedef float PixelType; @@ -128,9 +129,9 @@ int ValidateAt( ImageType* inputImage, std::vector<ImageType::Pointer> computeRe PixelType output = computeResults[i]->GetPixel(idx); PixelType reference = featuresMeans[i]; - std::cout << "index : " << idx << std::endl; - std::cout << "compute : " << output << std::endl; - std::cout << "ref : " << reference << std::endl; + otbLogMacro(Debug, << "index = " << idx + << " ; compute = " << output + << " ; ref = " << reference); if (reference != output) { diff --git a/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx b/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx index 74899c7f2d3ddf750b6c1ec7307493188b8fd5f5..2bc307aa9575d4f86ca476d0da6e5bcaeff35baa 100644 --- a/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx +++ b/Modules/Filtering/Contrast/test/otbComputeGainLutFilter.cxx @@ -23,6 +23,7 @@ #include "otbImageFileWriter.h" #include "otbImageFileReader.h" #include "otbComputeGainLutFilter.h" +#include "otbMacro.h" int otbComputeGainLutFilter(int itkNotUsed(argc), char * argv []) { @@ -62,7 +63,7 @@ int otbComputeGainLutFilter(int itkNotUsed(argc), char * argv []) writer->Update(); auto index = computeGainLut->GetOutput()->GetLargestPossibleRegion().GetIndex(); - std::cout<<computeGainLut->GetOutput()->GetPixel( index )<<std::endl; + otbLogMacro(Debug, <<computeGainLut->GetOutput()->GetPixel( index )); return EXIT_SUCCESS; } 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/otbImageToEdgePathFilter.cxx b/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx index 450d33c2779751a006ba73c2da10f26232724c07..688bd0fca736b92ca78a9acc4f90c4d90550df8b 100644 --- a/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx +++ b/Modules/Filtering/Path/test/otbImageToEdgePathFilter.cxx @@ -25,6 +25,7 @@ #include "otbImage.h" #include "otbImageFileReader.h" #include "otbImageFileWriter.h" +#include "otbMacro.h" int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[]) { @@ -54,7 +55,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[]) pathFilter->Update(); - std::cout << " pathFilter = " << pathFilter << std::endl; + otbLogMacro(Debug, << " pathFilter = " << pathFilter); PathType * outputPath = pathFilter->GetOutput(); @@ -67,7 +68,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[]) VertexListTypePointer ptrVertexList = outputPath->GetVertexList(); - std::cout << "Size : " << ptrVertexList->Size() << std::endl; + otbLogMacro(Info, << "Size : " << ptrVertexList->Size()); // Initialize Output Image ImageType::Pointer outputImage = ImageType::New(); @@ -80,7 +81,7 @@ int otbImageToEdgePathFilter(int itkNotUsed(argc), char * argv[]) for (unsigned int cpt = 0; cpt < ptrVertexList->Size(); ++cpt) { - std::cout << " Point " << cpt << " : " << ptrVertexList->GetElement(cpt) << std::endl; + otbLogMacro(Debug, << " Point " << cpt << " : " << ptrVertexList->GetElement(cpt)); IndexType pos; pos[0] = static_cast<unsigned long>(ptrVertexList->GetElement(cpt)[0]); pos[1] = static_cast<unsigned long>(ptrVertexList->GetElement(cpt)[1]); diff --git a/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx b/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx index 23165541122163dbed43f788be8a5d86e2e35766..eaa39a949918925e2c6112d569676b53d9752c36 100644 --- a/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx +++ b/Modules/Filtering/Path/test/otbPathListToHistogramGenerator.cxx @@ -21,7 +21,7 @@ -#include "itkMacro.h" +#include "otbMacro.h" #include "itkPolyLineParametricPath.h" #include "otbOrientationPathFunction.h" #include "otbPathListToHistogramGenerator.h" @@ -78,17 +78,16 @@ int otbPathListToHistogramGenerator(int itkNotUsed(argc), char * argv[]) const HistogramType * histogram = histogramGenerator->GetOutput(); const unsigned int histogramSize = histogram->Size(); - std::cout << "Histogram size " << histogramSize << std::endl; + otbLogMacro(Info, << "Histogram size " << histogramSize); for (unsigned int bin = 0; bin < histogramSize; bin++) { if (histogram->GetFrequency(bin, 0) != NbOfPointsPerHistogram) { - std::cout << "Error in histogram value !" << std::endl; + otbLogMacro(Warning, << "Error in histogram value !"); return EXIT_FAILURE; } - std::cout << "bin = " << bin << " frequency = "; - std::cout << histogram->GetFrequency(bin, 0) << std::endl; + otbLogMacro(Debug, << "bin = " << bin << " frequency = " << histogram->GetFrequency(bin, 0)); } return EXIT_SUCCESS; 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 ce356198437339a0c7cceb404ff537d1125a6ffd..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 @@ -112,7 +110,6 @@ foreach( file ${GEOMGCP} ) 1 # imgTol ${current_geotol} # geoTol 0 # create baseline (argv[7]) - 1 # mode verbose 1 # 0 : no keyword check 1 : check needed keywords ) endforeach() @@ -157,7 +154,6 @@ foreach( file ${GEOMGCP} ) 1 # imgTol 1 # geoTol 0 # create baseline (argv[7]) - 1 # mode verbose 0 # 0 : no keyword check 1 : check needed keywords ) endforeach() @@ -190,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" @@ -305,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) @@ -315,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} @@ -338,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 @@ -585,29 +581,10 @@ 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) +endif() otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_WithDEM COMMAND otbProjectionTestDriver otbGCPsToRPCSensorModelImageFilterCheckRpcModel ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif @@ -712,9 +689,13 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_Wit 2450 2350 1.43238 43.6063 144.66 2450 2400 1.43239 43.6051 144.932 2450 2450 1.43239 43.6038 136.794 - err=10 # Tolerance in meters, the first goal of this test + ${VALID_CONDITION} # Tolerance in meters, the first goal of this test ) +set(VALID_CONDITION err=20) +if(OTB_OSSIM_VERSION LESS 20200) +set(VALID_CONDITION err=10) +endif() otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_WithoutDEM COMMAND otbProjectionTestDriver otbGCPsToRPCSensorModelImageFilterCheckRpcModel ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif @@ -819,7 +800,7 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageCheckInputGcpPointsProjection_Wit 2450 2350 1.43238 43.6059 0 2450 2400 1.43238 43.6047 0 2450 2450 1.43239 43.6034 0 - err=10 # Tolerance in meters, the first goal of this test + ${VALID_CONDITION} # Tolerance in meters, the first goal of this test ) otb_add_test(NAME prTvGeographicalDistance COMMAND otbProjectionTestDriver @@ -846,10 +827,15 @@ otb_add_test(NAME prTvTileImageFilterGenericRSTransformTest_LASVEGAS_DIMAPv1 COM LARGEINPUT{PLEIADES/LASVEGAS_JP2_DIMAPv1_PRIMARY_PMS_lossless_12bits/IMGPHR_PHR1A_SENSOR_20120217_IPU_20120217_5374-001_V1/IMG_R3C1.JP2} ) -otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProjectionTestDriver +set(VALID_CONDITION) +if(OTB_OSSIM_VERSION LESS 20200) +set(VALID_CONDITION --compare-image ${EPSILON_4} ${BASELINE}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif - ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif + ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif) +endif() +otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProjectionTestDriver + ${VALID_CONDITION} otbGCPsToRPCSensorModelImageFilterAndOrtho ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif ${TEMP}/otbGCPsToRPCSensorModelImageFilterAndOrthoOutput.tif @@ -968,10 +954,15 @@ otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterAndOrtho COMMAND otbProject #LARGEINPUT{VECTOR/MidiPyrenees/roads.shp} #) -otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterWithoutDEM COMMAND otbProjectionTestDriver +set(VALID_CONDITION) +if(OTB_OSSIM_VERSION LESS 20200) +set(VALID_CONDITION --compare-ascii ${EPSILON_4} ${BASELINE_FILES}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt - ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt + ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt) +endif() +otb_add_test(NAME prTvGCPsToRPCSensorModelImageFilterWithoutDEM COMMAND otbProjectionTestDriver + ${VALID_CONDITION} otbGCPsToRPCSensorModelImageFilterWithoutDEM ${INPUTDATA}/QB_TOULOUSE_MUL_Extract_500_500.tif ${TEMP}/otbGCPsToRPCSensorModelImageFilterWithoutDEMOutput.txt @@ -1193,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 8ebb1678fd04526694eb59bc4604f4368985f38c..f9eb115fcf556b9104b6b157d4fa0425e3ebd0a1 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterAndOrtho.cxx @@ -21,8 +21,8 @@ #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[]) { @@ -46,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); @@ -58,7 +57,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) unsigned int nbGCPs = (argc - 11) / 5; - std::cout << "Receiving " << nbGCPs << " from command line." << std::endl; + otbLogMacro(Info, << "Receiving " << nbGCPs << " from command line."); for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId) { @@ -71,7 +70,7 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) geoPoint[1] = atof(argv[14 + 5 * gcpId]); geoPoint[2] = atof(argv[15 + 5 * gcpId]); - std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl; + otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint); rpcEstimator->AddGCP(sensorPoint, geoPoint); } @@ -82,17 +81,14 @@ int otbGCPsToRPCSensorModelImageFilterAndOrtho(int argc, char* argv[]) std::cout.setf(std::ios::fixed, std::ios::floatfield); std::cout.precision(10); - std::cout << rpcEstimator->GetOutput()->GetImageKeywordlist() << std::endl; - std::cout << "Residual ground error: " << rpcEstimator->GetRMSGroundError() << std::endl; + otbLogMacro(Debug, << rpcEstimator->GetOutput()->GetImageKeywordlist()); + otbLogMacro(Info, << "Residual ground error: " << rpcEstimator->GetRMSGroundError()); // Orthorectify the output image WriterType::Pointer writer = WriterType::New(); OrthoRectifFilterType::Pointer orthoRectifFilter = OrthoRectifFilterType::New(); - - MapProjectionType::Pointer utmMapProjection = MapProjectionType::New(); - orthoRectifFilter->SetInput(rpcEstimator->GetOutput()); ImageType::IndexType start; @@ -115,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/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx index 23c60827eba42ff34561c4e951813694ee8928d4..a7f96117e0790366160dace88340ecdc6e7fb131 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterCheckRpcModel.cxx @@ -23,6 +23,7 @@ #include "otbGCPsToRPCSensorModelImageFilter.h" #include "otbGenericRSTransform.h" #include "otbGeographicalDistance.h" +#include "otbMacro.h" #include <string> int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) @@ -62,7 +63,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) rpcEstimator->SetInput(reader->GetOutput()); unsigned int nbGCPs = nbPoints / 5; - std::cout << "Receiving " << nbPoints << " from command line." << std::endl; + otbLogMacro(Info, << "Receiving " << nbPoints << " from command line."); for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId) { @@ -75,7 +76,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) geoPoint[1] = std::stof(argv[ 6 + gcpId * 5]); geoPoint[2] = std::stof(argv[ 7 + gcpId * 5]); - std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl; + otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint); rpcEstimator->AddGCP(sensorPoint, geoPoint); } @@ -91,7 +92,7 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) GenericRSTransformType::Pointer grsTrasnform = GenericRSTransformType::New(); grsTrasnform->SetInputKeywordList(rpcEstimator->GetKeywordlist()); - std::cout<<rpcEstimator->GetKeywordlist()<<std::endl; + otbLogMacro(Debug, <<rpcEstimator->GetKeywordlist()); grsTrasnform->SetOutputProjectionRef("EPSG:4326"); // Set the DEM Directory @@ -126,11 +127,9 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) // Search for nans if ( vnl_math_isnan(transformedPoint2D[0]) || vnl_math_isnan(transformedPoint2D[1]) ) { - std::cout << "Reference : "<< geoPoint - <<" --> Result of the reprojection using the estimated RpcModel "<< transformedPoint2D - << std::endl; - std::cout<<"The result of the projection is nan, there is a problem with the estimated RpcModel " - << std::endl<<std::endl; + otbLogMacro(Warning, << "Reference : "<< geoPoint + <<" --> Result of the reprojection using the estimated RpcModel "<< transformedPoint2D); + otbLogMacro(Warning, <<"The result of the projection is nan, there is a problem with the estimated RpcModel"); isErrorDetected = true; } @@ -138,14 +137,13 @@ int otbGCPsToRPCSensorModelImageFilterCheckRpcModel(int argc, char * argv[]) double residual = geoDistance->Evaluate(geoPoint, transformedPoint2D); if( residual > tol ) { - std::cout << "Reference : "<< geoPoint - <<" --> Result of the reprojection using the estimated RpcModel " - << transformedPoint2D - << std::endl - << " Residual ["<< residual << "] is higher than the tolerance [" - << tol - <<"], there is a problem with the estimated RpcModel" - <<std::endl<<std::endl; + otbLogMacro(Warning, << "Reference : "<< geoPoint + <<" --> Result of the reprojection using the estimated RpcModel " + << transformedPoint2D + << std::endl + << " Residual ["<< residual << "] is higher than the tolerance [" + << tol + <<"], there is a problem with the estimated RpcModel"); isErrorDetected = true; } } diff --git a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx index 454efe2bec765317ade7baf261d3bb1307ee97a2..e09549e06e51570fefb2b134a627680dc53f5c50 100644 --- a/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx +++ b/Modules/Filtering/Projection/test/otbGCPsToRPCSensorModelImageFilterWithoutDEM.cxx @@ -53,7 +53,7 @@ int otbGCPsToRPCSensorModelImageFilterWithoutDEM(int argc, char* argv[]) unsigned int nbGCPs = (argc - 3) / 5; - std::cout << "Receiving " << nbGCPs << " from command line." << std::endl; + otbLogMacro(Info, << "Receiving " << nbGCPs << " from command line."); for (unsigned int gcpId = 0; gcpId < nbGCPs; ++gcpId) { @@ -66,7 +66,7 @@ int otbGCPsToRPCSensorModelImageFilterWithoutDEM(int argc, char* argv[]) geoPoint[1] = atof(argv[6 + 5 * gcpId]); geoPoint[2] = atof(argv[7 + 5 * gcpId]); - std::cout << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint << std::endl; + otbLogMacro(Debug, << "Adding GCP sensor: " << sensorPoint << " <-> geo: " << geoPoint); rpcEstimator->AddGCP(sensorPoint, geoPoint); } 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/otbSensorModel.cxx b/Modules/Filtering/Projection/test/otbSensorModel.cxx index f6b3c0454a7fd69a42806915eb216a7a3e15f59b..d64e315160dfb4cf90e58649f357cd48a02de6cb 100644 --- a/Modules/Filtering/Projection/test/otbSensorModel.cxx +++ b/Modules/Filtering/Projection/test/otbSensorModel.cxx @@ -34,6 +34,7 @@ #include "itkEuclideanDistanceMetric.h" #include "otbGeographicalDistance.h" #include "otbGenericRSTransform.h" +#include "otbMacro.h" #if defined(__GNUC__) || defined(__clang__) #pragma GCC diagnostic push @@ -65,7 +66,7 @@ int produceGCP(char * outputgcpfilename, const otb::ImageKeywordlist& kwlist, bo forwardSensorModel->SetImageGeometry(kwlist); if( forwardSensorModel->IsValidSensorModel() == false ) { - std::cout<<"Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!"<<std::endl; + otbLogMacro(Warning, <<"Invalid Model pointer m_Model == NULL!\n The ossim keywordlist is invalid!"); return EXIT_FAILURE; } @@ -155,11 +156,11 @@ bool provideGCP(char * gcpfilename, pointsContainerType& imgPt, geo3dPointsConta int otbSensorModel(int argc, char* argv[]) { - if (argc != 10) + if (argc != 9) { std::cout << argv[0] << " <input geom filename> <input gcp filename> <output gcp filename> " - <<" <needed keywords> <imgTol> <geoTol> <writeBaseline> <modeVerbose> <only check needed keywords>" << std::endl; + <<" <needed keywords> <imgTol> <geoTol> <writeBaseline> <only check needed keywords>" << std::endl; return EXIT_FAILURE; } @@ -171,8 +172,7 @@ int otbSensorModel(int argc, char* argv[]) double imgTol = atof(argv[5]); double geoTol = atof(argv[6]); int writeBaseline = atoi(argv[7]); - int modeVerbose = atoi(argv[8]); - bool checkNeededKw = atoi(argv[9]); + bool checkNeededKw = atoi(argv[8]); // ------------------- // Some instantiations @@ -370,21 +370,18 @@ int otbSensorModel(int argc, char* argv[]) geoPointOSSIM[1] = ossimGPoint.lat; // Just for debug purpose - if (modeVerbose) - { - std::cout << ">>>>>>>>>>>>>> ---------------------" << std::endl; - std::cout << ">>>>>>>>>>>>>>" << geomfilename << std::endl; - std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) - << "Image to geo (Inverse/Forward SensorModel): " << imagePoint << " -> " << geoPoint << "\n"; - std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) - << "Geo to image (Inverse/Forward SensorModel): " << geoPoint << " -> " << reversedImagePoint << "\n"; - std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) - << "Image to geo (GenericRSTransform): " << imagePoint << " -> " << geoPointGRS << "\n"; - std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) - << "Geo to image (GenericRSTransform): " << geoPointGRS << " -> " << reversedImagePointGRS << "\n"; - std::cout << ">>>>>>>>>>>>>>" << std::setprecision(15) - << "Image to geo (OSSIM): " << imagePoint << " -> " << geoPointOSSIM << "\n"; - } + otbLogMacro(Debug, << "------------------------------------------------"); + otbLogMacro(Debug, << geomfilename); + otbLogMacro(Debug, << std::setprecision(15) + << "Image to geo (Inverse/Forward SensorModel): " << imagePoint << " -> " << geoPoint); + otbLogMacro(Debug, << std::setprecision(15) + << "Geo to image (Inverse/Forward SensorModel): " << geoPoint << " -> " << reversedImagePoint); + otbLogMacro(Debug, << std::setprecision(15) + << "Image to geo (GenericRSTransform): " << imagePoint << " -> " << geoPointGRS); + otbLogMacro(Debug, << std::setprecision(15) + << "Geo to image (GenericRSTransform): " << geoPointGRS << " -> " << reversedImagePointGRS); + otbLogMacro(Debug, << std::setprecision(15) + << "Image to geo (OSSIM): " << imagePoint << " -> " << geoPointOSSIM); // 3. Results should be plausible (no NaN and no clearly out of bound results) @@ -477,12 +474,9 @@ int otbSensorModel(int argc, char* argv[]) double dist6 = geoDistance->Evaluate(geoPointGRS, geoPointGCP); double dist7 = geoDistance->Evaluate(geoPointOSSIM, geoPointGCP); - if (modeVerbose) - { - std::cout << ">>>>>>>>>>>>>>" << "Forward SensorModel VS GCP : " << dist5 << std::endl; - std::cout << ">>>>>>>>>>>>>>" << "GenericRSTransform VS GCP : " << dist6 << std::endl; - std::cout << ">>>>>>>>>>>>>>" << "OSSIM VS GCP : " << dist7 << std::endl; - } + otbLogMacro(Debug, << "Forward SensorModel VS GCP : " << dist5); + otbLogMacro(Debug, << "GenericRSTransform VS GCP : " << dist6); + otbLogMacro(Debug, << "OSSIM VS GCP : " << dist7); if (dist5>geoTol) { 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/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx b/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx index 704e8eff1809e13aee0570b76f312c4a0b4720ce..193ed93eca16281259824f9d3699212698633ef0 100644 --- a/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx +++ b/Modules/Filtering/Wavelet/include/otbWaveletOperatorBase.hxx @@ -156,14 +156,9 @@ void WaveletOperatorBase<TMotherWaveletOperator, TPixel, VDimension, TAllocator> ::ReduceFilterLength(CoefficientVector& coeff) { - const unsigned int length = coeff.size(); - assert(length >= 2); - CoefficientVector newFilter(length - 2); - for (unsigned int i = 0; i < newFilter.size(); ++i) - { - newFilter[i] = coeff[i + 1]; - } - coeff = newFilter; + assert(coeff.size() >= 2); + coeff.pop_back(); + coeff.erase(coeff.begin()); } } // end of namespace otb diff --git a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx index f0bd16acb33d5cc824933eaa9ac7610c331f3ca7..3f4d9771db9bfe0bbe1125a6380389af162f139b 100644 --- a/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx +++ b/Modules/IO/IOGDAL/src/otbOGRIOHelper.cxx @@ -772,7 +772,9 @@ unsigned int OGRIOHelper if (std::string(key) != "FID") { // Edit the value of the field and add it to the current feature - ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str()); + int fIndex = ogrFeature->GetFieldIndex(key); + if (fIndex >= 0) + ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str()); } } @@ -826,7 +828,9 @@ unsigned int OGRIOHelper // Get the key of the Nth OGRFieldRefn const char * key = kwl.GetNthField(i).first->GetNameRef(); // Edit the value of the field and add it to the current feature - ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str()); + int fIndex = ogrFeature->GetFieldIndex(key); + if (fIndex >= 0) + ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str()); } // ogrFeature->SetField("Name", dataNode->GetNodeId()); @@ -911,7 +915,9 @@ unsigned int OGRIOHelper // Get the key of the Nth OGRFieldRefn const char * key = kwl.GetNthField(i).first->GetNameRef(); // Edit the value of the field and add it to the current feature - ogrFeature->SetField(ogrFeature->GetFieldIndex(key) , kwl.GetFieldAsString(key).c_str()); + int fIndex = ogrFeature->GetFieldIndex(key); + if (fIndex >= 0) + ogrFeature->SetField(fIndex , kwl.GetFieldAsString(key).c_str()); } ogrFeature->SetGeometry(ogrPolygon); diff --git a/Modules/IO/ImageIO/include/otbImageFileReader.hxx b/Modules/IO/ImageIO/include/otbImageFileReader.hxx index 09c7e0cae81c623443aeb33566093047a2a67c7c..4d39b7cd1797e35930be419fbf797291b0469b47 100644 --- a/Modules/IO/ImageIO/include/otbImageFileReader.hxx +++ b/Modules/IO/ImageIO/include/otbImageFileReader.hxx @@ -445,7 +445,7 @@ ImageFileReader<TOutputImage, ConvertPixelTraits> } if (otb_kwl.Empty()) { - otbLogMacro(Info,<< "No kwl metadata found in file "<<lFileNameOssimKeywordlist); + otbLogMacro(Debug,<< "No kwl metadata found in file "<<lFileNameOssimKeywordlist); } } } diff --git a/Modules/IO/ImageIO/test/CMakeLists.txt b/Modules/IO/ImageIO/test/CMakeLists.txt index 04d68c8293cc8e29b00c957863e6abd96f45a694..6fd2e7e6fd5957f9e91e724b67f27283bedf190b 100644 --- a/Modules/IO/ImageIO/test/CMakeLists.txt +++ b/Modules/IO/ImageIO/test/CMakeLists.txt @@ -1352,6 +1352,7 @@ otb_add_test(NAME ioTvCompoundMetadataReaderTest --compare-ascii ${EPSILON_9} ${INPUTDATA}/QB_Toulouse_SensorModel_labelImage.geom ${TEMP}/ioTvCompoundMetadataReaderTest.geom + --ignore-lines-with 1 support_data. otbWriteGeomFile ${INPUTDATA}/QB_Toulouse_combo.vrt ${TEMP}/ioTvCompoundMetadataReaderTest.tif) diff --git a/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx b/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx index aa59af502ce74303a5a8cac74c854015a591abca..2cd546a6f7988116852a3e79f010a347cf6a92b7 100644 --- a/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx +++ b/Modules/IO/ImageIO/test/otbComplexImageManipulationTest.cxx @@ -68,11 +68,11 @@ bool IsEqual(itk::VariableLengthVector<TInternalPixel> output, itk::VariableLeng template<class TIndex, class TPixel> bool TestCompare(TIndex idx, TPixel output, TPixel expected) { - std::cout << "PIXEL " << idx << " --> " + otbLogMacro(Debug, << "PIXEL " << idx << " --> " << "OUTPUT = " << output << " || " << "EXPECTED = " << expected - << std::endl; + << std::endl); if (!IsEqual(output, expected)) { diff --git a/Modules/IO/TestKernel/include/otbTestHelper.h b/Modules/IO/TestKernel/include/otbTestHelper.h index 19f7207d04124dfbcf45934772687910e021baad..a99b106e1b4b4a32f0d934aca60e3887713b73fd 100644 --- a/Modules/IO/TestKernel/include/otbTestHelper.h +++ b/Modules/IO/TestKernel/include/otbTestHelper.h @@ -60,38 +60,45 @@ public: typedef std::vector<std::string> StringList; typedef StringList::const_iterator StringListIt; + typedef std::vector<double> EpsilonList; + typedef EpsilonList::const_iterator EpsilonListIt; + TestHelper(); ~TestHelper() override; int RegressionTestAllImages(const StringList& baselineFilenamesImage, - const StringList& testFilenamesImage); + const StringList& testFilenamesImage, + const EpsilonList& epsilons); int RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData, - const StringList& testFilenamesMetaData); + const StringList& testFilenamesMetaData, + const EpsilonList& epsilons); int RegressionTestAllAscii(const StringList& baselineFilenamesAscii, const StringList& testFilenamesAscii, + const EpsilonList& epsilons, const StringList& ignoredLines); int RegressionTestAllDiff(const StringList& baselineFilenamesAscii, const StringList& testFilenamesAscii, + const EpsilonList& epsilons, const StringList& ignoredLines); int RegressionTestAllBinary(const StringList& baselineFilenamesBinary, const StringList& testFilenamesBinary); int RegressionTestAllOgr(const StringList& baselineFilenamesOgr, - const StringList& testFilenamesOgr); + const StringList& testFilenamesOgr, + const EpsilonList& epsilons); itkSetMacro(ReportErrors, bool); itkBooleanMacro(ReportErrors); itkSetMacro(IgnoreLineOrder, bool); itkBooleanMacro(IgnoreLineOrder); - itkSetMacro(ToleranceDiffValue, double); - itkSetMacro(Epsilon, double); itkSetMacro(EpsilonBoundaryChecking, double); + itkSetMacro(ToleranceRatio, double); private: @@ -157,8 +164,7 @@ private: static void DumpOGRFeature(FILE* fileid, OGRFeature* feature, char** papszOptions = nullptr); static void DumpOGRGeometry(FILE* fileid, OGRGeometry* geometry, const char * pszPrefix, char** papszOptions = nullptr); - double m_ToleranceDiffValue; - double m_Epsilon; + double m_ToleranceRatio; double m_EpsilonBoundaryChecking; bool m_ReportErrors; bool m_IgnoreLineOrder; diff --git a/Modules/IO/TestKernel/include/otbTestMain.h b/Modules/IO/TestKernel/include/otbTestMain.h index 40696ad53934f22e1864e316565cda2f79b7ae3e..d0d988393af1207beb29467ae5919191f17432e2 100644 --- a/Modules/IO/TestKernel/include/otbTestMain.h +++ b/Modules/IO/TestKernel/include/otbTestMain.h @@ -69,6 +69,25 @@ void LoadTestEnv() itk::Statistics::MersenneTwisterRandomVariateGenerator::GetInstance()->SetSeed(121212); } +/** CheckOption, utility function to test the presence of a given token + * in the argument list. The function also checks if there are at least 'min' + * arguments left to parse the token (token included) */ +bool CheckOption(char* arg,const char* token,int ac, int min) +{ + if( strcmp(arg, token) == 0 ) + { + if (min < ac) + { + return true; + } + else + { + std::cerr << "Can't parse token '"<<token<< "', need at least "<<min-1<<" arguments after.\n"; + } + } + return false; +} + int main(int ac, char* av[]) { #ifdef OTB_USE_MPI @@ -76,10 +95,13 @@ int main(int ac, char* av[]) #endif bool lFlagRegression(false); - double lToleranceDiffValue(0); - double lEpsilon(0); + std::vector<double> toleranceDiffValues; + std::vector<double> toleranceOgrValues; + std::vector<double> toleranceMetaValues; + std::vector<double> toleranceAsciiValues; bool lIgnoreOrder(false); double epsilonBoundary(0.0); + double lToleranceRatio(0.0); typedef otb::TestHelper::StringList StringList; StringList baselineFilenamesBinary; @@ -125,185 +147,176 @@ int main(int ac, char* av[]) } else { - if (strcmp(av[1], "--with-threads") == 0) - { - int numThreads = atoi(av[2]); - itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThreads); - av += 2; - ac -= 2; - } - else if (strcmp(av[1], "--without-threads") == 0) - { - itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1); - av += 1; - ac -= 1; - } - if (strcmp(av[1], "--ignore-order") == 0) - { - lIgnoreOrder = true; - av += 1; - ac -= 1; - } - if (strcmp(av[1], "--epsilon-boundary") == 0) - { - epsilonBoundary = atof(av[2]); - av += 2; - ac -= 2; - } - if (strcmp(av[1], "--compare-image") == 0) - { - lFlagRegression = true; - lToleranceDiffValue = (double) (::atof(av[2])); - baselineFilenamesImage.reserve(1); - testFilenamesImage.reserve(1); - baselineFilenamesImage.push_back(av[3]); - testFilenamesImage.push_back(av[4]); - av += 4; - ac -= 4; - } - else if (strcmp(av[1], "--compare-n-images") == 0) + int ac0 = ac+1; + while (strncmp(av[1], "--", 2) == 0 && ac0 > ac) { - lFlagRegression = true; - lToleranceDiffValue = (double) (::atof(av[2])); - // Number of comparisons to do - unsigned int nbComparisons = (unsigned int) (::atoi(av[3])); - baselineFilenamesImage.reserve(nbComparisons); - testFilenamesImage.reserve(nbComparisons); - // Retrieve all the file names - for (unsigned int i = 0; i < nbComparisons; ++i) + ac0 = ac; + if (CheckOption(av[1],"--with-threads", ac, 2)) { - baselineFilenamesImage.push_back(av[4 + 2 * i]); - testFilenamesImage.push_back(av[5 + 2 * i]); + int numThreads = atoi(av[2]); + itk::MultiThreader::SetGlobalDefaultNumberOfThreads(numThreads); + av += 2; + ac -= 2; } - av += 3 + 2 * nbComparisons; - ac -= 3 + 2 * nbComparisons; - } - else if (strcmp(av[1], "--compare-binary") == 0) - { - lFlagRegression = true; - baselineFilenamesBinary.reserve(1); - testFilenamesBinary.reserve(1); - baselineFilenamesBinary.push_back(av[2]); - testFilenamesBinary.push_back(av[3]); - av += 3; - ac -= 3; - } - else if (strcmp(av[1], "--compare-n-binary") == 0) - { - lFlagRegression = true; - unsigned int nbComparisons = (unsigned int) (::atoi(av[2])); - baselineFilenamesBinary.reserve(nbComparisons); - testFilenamesBinary.reserve(nbComparisons); - // Retrieve all the file names - for (unsigned int i = 0; i < nbComparisons; ++i) + else if (CheckOption(av[1], "--without-threads",ac, 1)) { - baselineFilenamesBinary.push_back(av[3 + 2 * i]); - testFilenamesBinary.push_back(av[4 + 2 * i]); + itk::MultiThreader::SetGlobalDefaultNumberOfThreads(1); + av += 1; + ac -= 1; } - av += 2 + 2 * nbComparisons; - ac -= 2 + 2 * nbComparisons; - } - /************************************************************************/ - // COMPARE ASCII - else if (strcmp(av[1], "--compare-ascii") == 0) - { - lFlagRegression = true; - lEpsilon = (double) (::atof(av[2])); - baselineFilenamesAscii.reserve(1); - testFilenamesAscii.reserve(1); - baselineFilenamesAscii.push_back(av[3]); - testFilenamesAscii.push_back(av[4]); - av += 4; - ac -= 4; - - if (ac > 1) + else if (CheckOption(av[1], "--ignore-order", ac, 1)) + { + lIgnoreOrder = true; + av += 1; + ac -= 1; + } + else if (CheckOption(av[1], "--epsilon-boundary", ac, 2)) { - if (strcmp(av[1], "--ignore-lines-with") == 0) + epsilonBoundary = atof(av[2]); + av += 2; + ac -= 2; + } + else if (CheckOption(av[1], "--compare-image", ac, 4)) + { + lFlagRegression = true; + toleranceDiffValues.push_back((double) (::atof(av[2]))); + baselineFilenamesImage.push_back(av[3]); + testFilenamesImage.push_back(av[4]); + av += 4; + ac -= 4; + } + else if (CheckOption(av[1], "--compare-n-images", ac, 3)) + { + lFlagRegression = true; + // Number of comparisons to do + unsigned int nbComparisons = (unsigned int) (::atoi(av[3])); + double tol = (double) (::atof(av[2])); + toleranceDiffValues.reserve(toleranceDiffValues.size() + nbComparisons); + baselineFilenamesImage.reserve(baselineFilenamesImage.size() + nbComparisons); + testFilenamesImage.reserve(testFilenamesImage.size() + nbComparisons); + // Retrieve all the file names + for (unsigned int i = 0; i < nbComparisons; ++i) { - unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2])); - for (unsigned int i = 0; i < nbIgnoredLines; ++i) - { - ignoredLines.push_back(av[3 + i]); - } - av += 2 + nbIgnoredLines; - ac -= 2 + nbIgnoredLines; + toleranceDiffValues.push_back(tol); + baselineFilenamesImage.push_back(av[4 + 2 * i]); + testFilenamesImage.push_back(av[5 + 2 * i]); } + av += 3 + 2 * nbComparisons; + ac -= 3 + 2 * nbComparisons; } - } - /************************************************************************/ - else if (strcmp(av[1], "--compare-n-ascii") == 0) - { - lFlagRegression = true; - lEpsilon = (double) (::atof(av[2])); - // Number of comparisons to do - unsigned int nbComparisons = (unsigned int) (::atoi(av[3])); - baselineFilenamesAscii.reserve(nbComparisons); - testFilenamesAscii.reserve(nbComparisons); - // Retrieve all the file names - for (unsigned int i = 0; i < nbComparisons; ++i) + else if (CheckOption(av[1], "--compare-binary", ac, 3)) { - baselineFilenamesAscii.push_back(av[4 + 2 * i]); - testFilenamesAscii.push_back(av[5 + 2 * i]); + lFlagRegression = true; + baselineFilenamesBinary.reserve(1); + testFilenamesBinary.reserve(1); + baselineFilenamesBinary.push_back(av[2]); + testFilenamesBinary.push_back(av[3]); + av += 3; + ac -= 3; } - av += 3 + 2 * nbComparisons; - ac -= 3 + 2 * nbComparisons; - - if (ac > 1) + else if (CheckOption(av[1], "--compare-n-binary", ac, 2)) { - if (strcmp(av[1], "--ignore-lines-with") == 0) + lFlagRegression = true; + unsigned int nbComparisons = (unsigned int) (::atoi(av[2])); + baselineFilenamesBinary.reserve(nbComparisons); + testFilenamesBinary.reserve(nbComparisons); + // Retrieve all the file names + for (unsigned int i = 0; i < nbComparisons; ++i) { - unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2])); - for (unsigned int i = 0; i < nbIgnoredLines; ++i) - { - ignoredLines.push_back(av[3 + i]); - } - av += 2 + nbIgnoredLines; - ac -= 2 + nbIgnoredLines; + baselineFilenamesBinary.push_back(av[3 + 2 * i]); + testFilenamesBinary.push_back(av[4 + 2 * i]); } + av += 2 + 2 * nbComparisons; + ac -= 2 + 2 * nbComparisons; } + /************************************************************************/ + // COMPARE ASCII + else if (CheckOption(av[1], "--compare-ascii", ac, 4)) + { + lFlagRegression = true; + toleranceAsciiValues.push_back((double) (::atof(av[2]))); + baselineFilenamesAscii.push_back(av[3]); + testFilenamesAscii.push_back(av[4]); + av += 4; + ac -= 4; + } + else if (CheckOption(av[1], "--compare-n-ascii", ac, 3)) + { + lFlagRegression = true; + double tol = (double) (::atof(av[2])); + // Number of comparisons to do + unsigned int nbComparisons = (unsigned int) (::atoi(av[3])); + baselineFilenamesAscii.reserve(baselineFilenamesAscii.size() + nbComparisons); + testFilenamesAscii.reserve(testFilenamesAscii.size() + nbComparisons); + // Retrieve all the file names + for (unsigned int i = 0; i < nbComparisons; ++i) + { + toleranceAsciiValues.push_back(tol); + baselineFilenamesAscii.push_back(av[4 + 2 * i]); + testFilenamesAscii.push_back(av[5 + 2 * i]); + } + av += 3 + 2 * nbComparisons; + ac -= 3 + 2 * nbComparisons; + } + else if (CheckOption(av[1], "--ignore-lines-with", ac, 2)) + { + unsigned int nbIgnoredLines = (unsigned int) (::atoi(av[2])); + for (unsigned int i = 0; i < nbIgnoredLines; ++i) + { + ignoredLines.push_back(av[3 + i]); + } + av += 2 + nbIgnoredLines; + ac -= 2 + nbIgnoredLines; + } + /************************************************************************/ + else if (CheckOption(av[1], "--compare-metadata", ac, 4)) + { + lFlagRegression = true; + toleranceMetaValues.push_back((double) (::atof(av[2]))); + baselineFilenamesMetaData.push_back(av[3]); + testFilenamesMetaData.push_back(av[4]); + av += 4; + ac -= 4; + } + else if (CheckOption(av[1], "--compare-ogr", ac, 4)) + { + lFlagRegression = true; + toleranceOgrValues.push_back((double) (::atof(av[2]))); + baselineFilenamesOgr.push_back(av[3]); + testFilenamesOgr.push_back(av[4]); + av += 4; + ac -= 4; + } + else if (CheckOption(av[1], "--tolerance-ratio", ac, 2)) + { + lToleranceRatio = (double) (::atof(av[2])); + av += 2; + ac -= 2; + } + } // end while - } - else if (strcmp(av[1], "--compare-metadata") == 0) - { - lFlagRegression = true; - lToleranceDiffValue = (double) (::atof(av[2])); - baselineFilenamesMetaData.reserve(1); - testFilenamesMetaData.reserve(1); - baselineFilenamesMetaData.push_back(av[3]); - testFilenamesMetaData.push_back(av[4]); - av += 4; - ac -= 4; - } - - else if (strcmp(av[1], "--compare-ogr") == 0) + // Check there is one argument left for the test + if (ac >= 2) { - lFlagRegression = true; - lToleranceDiffValue = (double) (::atof(av[2])); - baselineFilenamesOgr.reserve(1); - testFilenamesOgr.reserve(1); - baselineFilenamesOgr.push_back(av[3]); - testFilenamesOgr.push_back(av[4]); - av += 4; - ac -= 4; + testToRun = av[1]; } - testToRun = av[1]; } otb::ConfigurationManager::InitOpenMPThreads(); std::map<std::string, MainFuncPointer>::iterator j = StringToTestFunctionMap.find(testToRun); + int result = EXIT_SUCCESS; // If the test doesn't exists if ( j == StringToTestFunctionMap.end() ) { PrintAvailableTests(); - std::cerr << "Failure: " << testToRun << ": no test identified " << testToRun << "\n"; - return -1; + std::cerr << "Failure: no test identified for '" << testToRun << "'\n"; + result = -1; } else { otb::Logger::Instance()->LogSetupInformation(); MainFuncPointer f = j->second; - int result; try { // Invoke the test's "main" function. @@ -326,24 +339,29 @@ int main(int ac, char* av[]) result = EXIT_FAILURE; } + bool checkBaseline = true; if (result != EXIT_SUCCESS) { - return -1; + checkBaseline = false; + result = -1; } - - result = EXIT_SUCCESS; #ifdef OTB_USE_MPI - otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance(); - if (mpiConfig->GetMyRank() == 0) - { + if (otb::MPIConfig::Instance()->GetMyRank() != 0) + { + checkBaseline = false; + } #endif + + if (checkBaseline) + { std::cout << " -> Test EXIT SUCCESS." << std::endl; if (lFlagRegression == false) { std::cout << "------------- No control baseline tests -------------" << std::endl; - return result; } + else + { try { @@ -351,8 +369,7 @@ int main(int ac, char* av[]) // Make a list of possible baselines testHelper->SetIgnoreLineOrder(lIgnoreOrder); - testHelper->SetToleranceDiffValue(lToleranceDiffValue); // What's the difference - testHelper->SetEpsilon(lEpsilon); // maybe we should consolidate... + testHelper->SetToleranceRatio(lToleranceRatio); if (epsilonBoundary != 0.0) { testHelper->SetEpsilonBoundaryChecking(epsilonBoundary); @@ -361,21 +378,20 @@ int main(int ac, char* av[]) // Non regression test for images if ((baselineFilenamesImage.size() > 0) && (testFilenamesImage.size() > 0)) { - result += testHelper->RegressionTestAllImages(baselineFilenamesImage, testFilenamesImage); + result += testHelper->RegressionTestAllImages(baselineFilenamesImage, testFilenamesImage, toleranceDiffValues); } /***********************************************************************************/ // Non-regression test for metadata. if ((baselineFilenamesMetaData.size() > 0) && (testFilenamesMetaData.size() > 0)) { - result += testHelper->RegressionTestAllMetaData(baselineFilenamesMetaData, testFilenamesMetaData); + result += testHelper->RegressionTestAllMetaData(baselineFilenamesMetaData, testFilenamesMetaData, toleranceMetaValues); } - /***********************************************************************************/ // Non regression test for ascii files if ((baselineFilenamesAscii.size() > 0) && (testFilenamesAscii.size() > 0)) { //result += testHelper->RegressionTestAllAscii(baselineFilenamesAscii, testFilenamesAscii, ignoredLines); - result += testHelper->RegressionTestAllDiff(baselineFilenamesAscii, testFilenamesAscii, ignoredLines); + result += testHelper->RegressionTestAllDiff(baselineFilenamesAscii, testFilenamesAscii, toleranceAsciiValues, ignoredLines); } /******************************************************************************/ // Non regression test for binary files @@ -387,42 +403,44 @@ int main(int ac, char* av[]) // Non regression test for OGR files if ((baselineFilenamesOgr.size() > 0) && (testFilenamesOgr.size() > 0)) { - result += testHelper->RegressionTestAllOgr(baselineFilenamesOgr, testFilenamesOgr); + result += testHelper->RegressionTestAllOgr(baselineFilenamesOgr, testFilenamesOgr, toleranceOgrValues); } - + std::cout << "------------- End control baseline tests -------------" << std::endl; } catch (itk::ExceptionObject& e) { std::cerr << "otbTestMain 'control baseline test': ITK Exception thrown:" << std::endl; std::cerr << e.GetFile() << ":" << e.GetLine() << ":" << std::endl; std::cerr << e.GetDescription() << std::endl; - return -1; + result = -1; } catch (std::bad_alloc& err) { std::cerr << "otbTestMain 'control baseline test': Exception bad_alloc thrown: " << std::endl; std::cerr << (char*) err.what() << std::endl; - return -1; + result = -1; } catch (const std::exception& e) { std::cerr << "otbTestMain 'control baseline test': std::exception thrown:" << std::endl; std::cerr << e.what() << std::endl; - return -1; + result = -1; } catch (...) { std::cerr << "otbTestMain 'control baseline test': Unknown exception thrown !" << std::endl; - return -1; + result = -1; } - std::cout << "------------- End control baseline tests -------------" << std::endl; + + } // if there is a baseline control + + } // if checkBaseline + } // if test function exists #ifdef OTB_USE_MPI - otb::MPIConfig::Instance()->terminate(); - } + otb::MPIConfig::Instance()->terminate(); #endif - return result; - } + return result; } #endif diff --git a/Modules/IO/TestKernel/src/otbTestDriver.cxx b/Modules/IO/TestKernel/src/otbTestDriver.cxx index 3cc8444bbef895fb40132d9a125899a8e2cc1fa3..930c1910b4ea1311fbb60faa47bbf0e29845e533 100644 --- a/Modules/IO/TestKernel/src/otbTestDriver.cxx +++ b/Modules/IO/TestKernel/src/otbTestDriver.cxx @@ -200,6 +200,7 @@ int Execute(int argc, char * argv[]) itksysProcess_Execute(process); itksysProcess_WaitForExit(process, nullptr); int retCode = itksysProcess_GetExitValue(process); + itksysProcess_Delete(process); return retCode; } diff --git a/Modules/IO/TestKernel/src/otbTestHelper.cxx b/Modules/IO/TestKernel/src/otbTestHelper.cxx index 69079360ccebd6cad29b10118713af8e88d2daf4..af7f6aa58d4ef96437508649fc20db2c3cdc42d7 100644 --- a/Modules/IO/TestKernel/src/otbTestHelper.cxx +++ b/Modules/IO/TestKernel/src/otbTestHelper.cxx @@ -106,16 +106,19 @@ void TestHelper::CheckValueTolerance(const char *comment, double ref, double tes } int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage, - const StringList& testFilenamesImage) + const StringList& testFilenamesImage, + const EpsilonList& epsilons) { int result = 0; StringListIt itbaselineFilenames = baselineFilenamesImage.begin(); StringListIt itTestFilenames = testFilenamesImage.begin(); + EpsilonListIt itEpsilon = epsilons.begin(); int cpt(1); // For each couple of baseline and test file, do the comparison for (; (itbaselineFilenames != baselineFilenamesImage.end()) - && (itTestFilenames != testFilenamesImage.end()); - ++itbaselineFilenames, ++itTestFilenames) + && (itTestFilenames != testFilenamesImage.end()) + && (itEpsilon != epsilons.end()); + ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon) { std::string baselineFilenameImage = (*itbaselineFilenames); std::string testFilenameImage = (*itTestFilenames); @@ -131,7 +134,7 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage this->ReportErrorsOff(); baseline->second = this->RegressionTestImage(cpt, testFilenameImage.c_str(), (baseline->first).c_str(), - m_ToleranceDiffValue); + *itEpsilon); multiResult = baseline->second; ++baseline; @@ -143,7 +146,7 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage baseline->second = this->RegressionTestImage(cpt, testFilenameImage.c_str(), (baseline->first).c_str(), - m_ToleranceDiffValue); + *itEpsilon); } ++cpt; result += multiResult; @@ -152,16 +155,19 @@ int TestHelper::RegressionTestAllImages(const StringList& baselineFilenamesImage } int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMetaData, - const StringList& testFilenamesMetaData) + const StringList& testFilenamesMetaData, + const EpsilonList& epsilons) { int result = 0; // Creates iterators on baseline filenames vector and test filenames vector StringListIt itbaselineFilenames = baselineFilenamesMetaData.begin(); StringListIt itTestFilenames = testFilenamesMetaData.begin(); + EpsilonListIt itEpsilon = epsilons.begin(); // For each couple of baseline and test file, do the comparison for (; (itbaselineFilenames != baselineFilenamesMetaData.end()) - && (itTestFilenames != testFilenamesMetaData.end()); - ++itbaselineFilenames, ++itTestFilenames) + && (itTestFilenames != testFilenamesMetaData.end()) + && (itEpsilon != epsilons.end()); + ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon) { std::string baselineFilenameImage = (*itbaselineFilenames); std::string testFilenameImage = (*itTestFilenames); @@ -177,7 +183,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet this->ReportErrorsOff(); baseline->second = this->RegressionTestMetaData(testFilenameImage.c_str(), (baseline->first).c_str(), - m_ToleranceDiffValue); + *itEpsilon); multiResult = baseline->second; ++baseline; @@ -189,7 +195,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet baseline->second = this->RegressionTestMetaData(testFilenameImage.c_str(), (baseline->first).c_str(), - m_ToleranceDiffValue); + *itEpsilon); } result += multiResult; } @@ -198,6 +204,7 @@ int TestHelper::RegressionTestAllMetaData(const StringList& baselineFilenamesMet int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, const StringList& testFilenamesAscii, + const EpsilonList& epsilons, const StringList& ignoredLines) { int result = 0; @@ -205,6 +212,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, StringListIt itbaselineFilenames = baselineFilenamesAscii.begin(); StringListIt itTestFilenames = testFilenamesAscii.begin(); StringListIt itIgnoredLines = ignoredLines.begin(); + EpsilonListIt itEpsilon = epsilons.begin(); // Warning message if (ignoredLines.size() > 0) @@ -219,8 +227,9 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, // For each couple of baseline and test file, do the comparison for (; (itbaselineFilenames != baselineFilenamesAscii.end()) - && (itTestFilenames != testFilenamesAscii.end()); - ++itbaselineFilenames, ++itTestFilenames) + && (itTestFilenames != testFilenamesAscii.end()) + && (itEpsilon != epsilons.end()); + ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon) { std::string baselineFilenameAscii = (*itbaselineFilenames); std::string testFilenameAscii = (*itTestFilenames); @@ -237,7 +246,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, this->ReportErrorsOff(); baseline->second = this->RegressionTestAsciiFile(testFilenameAscii.c_str(), (baseline->first).c_str(), - m_Epsilon, + *itEpsilon, ignoredLines); multiResult = baseline->second; @@ -250,7 +259,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, baseline->second = this->RegressionTestAsciiFile(testFilenameAscii.c_str(), (baseline->first).c_str(), - m_Epsilon, + *itEpsilon, ignoredLines); } result += multiResult; @@ -261,6 +270,7 @@ int TestHelper::RegressionTestAllAscii(const StringList& baselineFilenamesAscii, int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii, const StringList& testFilenamesAscii, + const EpsilonList& epsilons, const StringList& ignoredLines) { int result = 0; @@ -268,6 +278,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii, StringListIt itbaselineFilenames = baselineFilenamesAscii.begin(); StringListIt itTestFilenames = testFilenamesAscii.begin(); StringListIt itIgnoredLines = ignoredLines.begin(); + EpsilonListIt itEpsilon = epsilons.begin(); // Warning message if (ignoredLines.size() > 0) @@ -282,8 +293,9 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii, // For each couple of baseline and test file, do the comparison for (; (itbaselineFilenames != baselineFilenamesAscii.end()) - && (itTestFilenames != testFilenamesAscii.end()); - ++itbaselineFilenames, ++itTestFilenames) + && (itTestFilenames != testFilenamesAscii.end()) + && (itEpsilon != epsilons.end()); + ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon) { std::string baselineFilenameAscii = (*itbaselineFilenames); std::string testFilenameAscii = (*itTestFilenames); @@ -300,7 +312,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii, this->ReportErrorsOff(); baseline->second = this->RegressionTestDiffFile(testFilenameAscii.c_str(), (baseline->first).c_str(), - m_Epsilon, + *itEpsilon, ignoredLines); multiResult = baseline->second; @@ -313,7 +325,7 @@ int TestHelper::RegressionTestAllDiff(const StringList& baselineFilenamesAscii, baseline->second = this->RegressionTestDiffFile(testFilenameAscii.c_str(), (baseline->first).c_str(), - m_Epsilon, + *itEpsilon, ignoredLines); } result += multiResult; @@ -369,16 +381,19 @@ int TestHelper::RegressionTestAllBinary(const StringList& baselineFilenamesBinar } int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr, - const StringList& testFilenamesOgr) + const StringList& testFilenamesOgr, + const EpsilonList& epsilons) { int result = 0; // Creates iterators on baseline filenames vector and test filenames vector StringListIt itbaselineFilenames = baselineFilenamesOgr.begin(); StringListIt itTestFilenames = testFilenamesOgr.begin(); + EpsilonListIt itEpsilon = epsilons.begin(); // For each couple of baseline and test file, do the comparison for (; (itbaselineFilenames != baselineFilenamesOgr.end()) - && (itTestFilenames != testFilenamesOgr.end()); - ++itbaselineFilenames, ++itTestFilenames) + && (itTestFilenames != testFilenamesOgr.end()) + && (itEpsilon != epsilons.end()); + ++itbaselineFilenames, ++itTestFilenames, ++itEpsilon) { std::string baselineFilenameOgr = (*itbaselineFilenames); std::string testFilenameOgr = (*itTestFilenames); @@ -394,8 +409,8 @@ int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr, std::cout << "Testing non-regression on OGR file: " << (baseline->first) << std::endl; this->ReportErrorsOff(); baseline->second = this->RegressionTestOgrFile(testFilenameOgr.c_str(), - (baseline->first).c_str(), - m_ToleranceDiffValue); + (baseline->first).c_str(), + *itEpsilon); multiResult = baseline->second; ++baseline; @@ -407,7 +422,7 @@ int TestHelper::RegressionTestAllOgr(const StringList& baselineFilenamesOgr, baseline->second = this->RegressionTestOgrFile(testFilenameOgr.c_str(), (baseline->first).c_str(), - m_ToleranceDiffValue); + *itEpsilon); } result += multiResult; } @@ -1326,6 +1341,12 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons ImageType::PixelType status = diff->GetTotalDifference(); unsigned long numberOfPixelsWithDifferences = diff->GetNumberOfPixelsWithDifferences(); + int ret = 0; + if ((status.GetSquaredNorm() > 0) && + ((double) numberOfPixelsWithDifferences > m_ToleranceRatio*baselineSize[0]*baselineSize[1])) + { + ret = 1; + } //Write only one this message if (m_ReportErrors == 0) @@ -1335,7 +1356,7 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons << status << " for " << numberOfPixelsWithDifferences << " pixel(s)."); } // if there are discrepencies, create an diff image - if (status.GetSquaredNorm() > 0 && m_ReportErrors) + if (ret && m_ReportErrors) { typedef otb::PrintableImageFilter<ImageType> RescaleType; typedef otb::ImageFileWriter<RescaleType::OutputImageType> WriterType; @@ -1479,7 +1500,7 @@ int TestHelper::RegressionTestImage(int cpt, const char *testImageFilename, cons std::cout << "</DartMeasurement>" << std::endl; } } - return (status.GetSquaredNorm() > 0) ? 1 : 0; + return ret; } int TestHelper::RegressionTestMetaData(const char *testImageFilename, const char *baselineImageFilename, @@ -2643,8 +2664,7 @@ void TestHelper::ogrReportOnLayer(OGRLayer * ref_poLayer, } TestHelper::TestHelper() : - m_ToleranceDiffValue(0), - m_Epsilon(0), + m_ToleranceRatio(0), m_EpsilonBoundaryChecking(1.0e-30), m_ReportErrors(false), m_IgnoreLineOrder(false), 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/otbConfusionMatrixToMassOfBeliefTest.cxx b/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx index 16b6aba2c91b5e00ed7ecef33418d17bf549322e..e13f12d3dcb5c5b21eaa3a37d0a3ea255413ac2c 100644 --- a/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx +++ b/Modules/Learning/DempsterShafer/test/otbConfusionMatrixToMassOfBeliefTest.cxx @@ -18,7 +18,7 @@ * limitations under the License. */ -#include "itkMacro.h" +#include "otbMacro.h" #include <iostream> #include "otbConfusionMatrixToMassOfBelief.h" diff --git a/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx b/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx index de6790003dd25767c5623f4e5dfb075ca9213b74..2c27a36d124845e896cd27b8b7ab4ca0256ab9ff 100644 --- a/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx +++ b/Modules/Learning/DempsterShafer/test/otbDempsterShaferFusionTests.cxx @@ -22,6 +22,7 @@ #include "otbMassOfBelief.h" #include "otbJointMassOfBeliefFilter.h" #include "otbConfusionMatrixToMassOfBelief.h" +#include "otbMacro.h" #include <fstream> @@ -337,11 +338,12 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] // Vector containing the Mass of Belief of the universe for each classifier vectorUniverseMOBs.push_back(mobUniverseClk); - std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl; + otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = "); + std::ostringstream oss; for (unsigned int itLabel = 0; itLabel < nbClassesClk; ++itLabel) { IntLabelPixelType classLabel = mapOfIndicesClk[itLabel]; - std::cout << "[" << classLabel << "] "; + oss << "[" << classLabel << "] "; // If the current classLabel has already been added to the universe if (universe.count(classLabel) > 0) @@ -353,29 +355,26 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] universe[classLabel] = 1; } } - std::cout << std::endl << confMatClk << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << oss.str()); + otbLogMacro(Debug, << confMatClk); for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk) { - std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl; + otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second); } - std::cout << "*******************************************************************************" << std::endl; + otbLogMacro(Debug, << "*******************************************************************************"); } // Number of classes in the universe unsigned int nbClasses = universe.size(); - std::cout << "universe:" << std::endl; + otbLogMacro(Info, << "universe:"); for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse) { - std::cout << "Class Label " << itUniverse->first; - std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl; + otbLogMacro(Info, << "Class Label " << itUniverse->first + << " present in " << itUniverse->second << " classifier(s)"); } - std::cout << std::endl; - - /* ***************************************************************************************** */ /* ************************ RESULTS OF THE CLASSIFICATION OF PIXEL X *********************** */ @@ -415,9 +414,8 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] mLabelSetClk = vectorMapMOBs[itClk][classLabelk]; mLabelSetClk_ = 1 - mLabelSetClk - mUniverseClk; - std::cout << "classifiedPixelX[" << itClk << "] = " << classLabelk; - std::cout << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk; - std::cout << std::endl; + otbLogMacro(Debug, << "classifiedPixelX[" << itClk << "] = " << classLabelk + << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk); // The first time the label {Ai} is found in classifiedPixelX if (mapJointMassesStepI.count(classLabelk) == 0) @@ -443,9 +441,6 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] mapJointMassesUniverseStepI[classLabelk] = mUniverseClkNew; } - std::cout << "*******************************************************************************" << std::endl; - std::cout << std::endl; - /* ***************************************************************************************** */ /* *************************************** DS STEP #2 ************************************** */ /* ***************************************************************************************** */ @@ -464,10 +459,9 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] B = B * (1 - mLabelSetClk); C = C * mLabelSetClk_; - std::cout << "****************************************" << std::endl; - std::cout << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk << std::endl; - std::cout << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_ << std::endl; - std::cout << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk << std::endl; + otbLogMacro(Debug, << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk); + otbLogMacro(Debug, << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_); + otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk); } unsigned int nbClkGroupsStepI = mapJointMassesStepI.size(); @@ -483,13 +477,9 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "nbClasses = " << nbClasses << std::endl; - std::cout << "nbClassifiers = " << nbClassifiers << std::endl; - std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; + otbLogMacro(Info, << "nbClasses = " << nbClasses); + otbLogMacro(Info, << "nbClassifiers = " << nbClassifiers); + otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI); // Calculation of the Belief function of each singleton {Ai} and {Ai_} SingleClassLabelMassMapType mapBelStepII, mapBelStepII_; @@ -536,9 +526,6 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] addBelLabelSetClk += belLabelSetClk; } - std::cout << "****************************************************************************" << std::endl; - - /* ***************************************************************************************** */ /* ************************************ DECISION PROCESS *********************************** */ /* ***************************************************************************************** */ @@ -580,9 +567,8 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] mapBelStepII_[classLabelk] = addBelLabelSetClk; } - std::cout << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk] << std::endl; - std::cout << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk] << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk]); + otbLogMacro(Info, << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk]); } // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is undefinedValue @@ -595,20 +581,12 @@ int otbDempsterShaferFusionOptRecConfMatTest(int itkNotUsed(argc), char * argv[] } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** - - - // OPTIMIZED RECURSIVE DS FUSION int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) @@ -640,7 +618,7 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) mapLabelSets[vectorAllLabels[it]] = labelSet; } - std::cout << "universe = " << universe << std::endl; + otbLogMacro(Info, << "universe = " << universe); //********************************************************************** //************** RESULTS OF THE CLASSIFICATION OF PIXEL X ************** @@ -691,7 +669,7 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) for (unsigned int it = 0; it < classifiedPixelX.size(); ++it) { - std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl; + otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]); } //********************************************************************** @@ -882,11 +860,9 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) B = B * (1 - mLabelSetClk); C = C * mLabelSetClk_; - std::cout << "****************************************" << std::endl; - std::cout << "mapJointMassesStepI[" << labelSetClk << "] = " << mLabelSetClk << std::endl; - std::cout << "mapJointMassesStepI_[" << labelSetClk << "] = " << mLabelSetClk_ << std::endl; - std::cout << "mapJointMassesUniverseStepI[" << labelSetClk << "] = " << mapJointMassesUniverseStepI[labelSetClk] - << std::endl; + otbLogMacro(Debug, << "mapJointMassesStepI[" << labelSetClk << "] = " << mLabelSetClk); + otbLogMacro(Debug, << "mapJointMassesStepI_[" << labelSetClk << "] = " << mLabelSetClk_); + otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << labelSetClk << "] = " << mapJointMassesUniverseStepI[labelSetClk]); } unsigned int nbClkGroupsStepI = mapJointMassesStepI.size(); @@ -902,11 +878,9 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "nbClasses = " << nbClasses << std::endl; - std::cout << "nbClassifiers = " << classifiedPixelX .size() << std::endl; - std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl; + otbLogMacro(Info, << "nbClasses = " << nbClasses); + otbLogMacro(Info, << "nbClassifiers = " << classifiedPixelX .size()); + otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI); // Calculation of the Belief function of each singleton {Ai} and {Ai_} @@ -954,8 +928,6 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) addBelLabelSetClk = addBelLabelSetClk + belLabelSetClk; } - std::cout << "****************************************************************************" << std::endl; - // The decision for the DS Fusion is made with the MAXIMAL Belief function: // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj})) @@ -992,9 +964,8 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) mapBelStepII_[labelSetClk] = addBelLabelSetClk; } - std::cout << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk] << std::endl; - std::cout << "Bel(NOT_" << labelSetClk << ") = " << mapBelStepII_[labelSetClk] << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk]); + otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = " << mapBelStepII_[labelSetClk]); } // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is the UNION of all the candidates {Ai} @@ -1008,10 +979,8 @@ int otbDempsterShaferFusionOptRecTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } @@ -1045,7 +1014,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) mapLabelSets[vectorAllLabels[it]] = labelSet; } - std::cout << "universe = " << universe << std::endl; + otbLogMacro(Info, << "universe = " << universe); //********************************************************************** //************** RESULTS OF THE CLASSIFICATION OF PIXEL X ************** @@ -1063,7 +1032,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) for (unsigned int it = 0; it < classifiedPixelX.size(); ++it) { - std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl; + otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]); } //********************************************************************** @@ -1184,14 +1153,9 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) itMapJMOBFilters->second->Update(); mapJMOBFStepI[itMapJMOBFilters->first] = itMapJMOBFilters->second->GetOutput(); - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassClkFilterStepI[" << itMapJMOBFilters->first << "] = " << itMapJMOBFilters->second - << std::endl; + otbLogMacro(Debug, << "jointMassClkFilterStepI[" << itMapJMOBFilters->first << "] = " << itMapJMOBFilters->second); } - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; - //********************************************************************** //***************************** DS STEP #2 ***************************** //********************************************************************** @@ -1213,8 +1177,7 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) B = B * (1 - mLabelSetClk); C = C * mLabelSetClk_; - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassOfBeliefStepI[" << itMapJMOBF->first << "] = " << itMapJMOBF->second << std::endl; + otbLogMacro(Debug, << "jointMassOfBeliefStepI[" << itMapJMOBF->first << "] = " << itMapJMOBF->second); } unsigned int nbClkGroupsStepI = mapJMOBFStepI.size(); @@ -1278,9 +1241,6 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) addBelLabelSetClk = addBelLabelSetClk + belLabelSetClk; } - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; - // The decision for the DS Fusion is made with the MAXIMAL Belief function: // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj})) @@ -1319,10 +1279,8 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) mapBelStepII[labelSetClk_] = addBelLabelSetClk; } - std::cout << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk] << std::endl; - std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " << mapBelStepII[labelSetClk_] - << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << mapBelStepII[labelSetClk]); + otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " << mapBelStepII[labelSetClk_]); } // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is the UNION of all the candidates {Ai} @@ -1336,10 +1294,8 @@ int otbDempsterShaferFusionOptTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } @@ -1372,7 +1328,7 @@ int otbDempsterShaferFusionTest(int argc, char * argv[]) mapLabelSets[vectorAllLabels[it]] = labelSet; } - std::cout << "universe = " << universe << std::endl; + otbLogMacro(Info, << "universe = " << universe); //********************************************************************** //************** RESULTS OF THE CLASSIFICATION OF PIXEL X ************** @@ -1390,7 +1346,7 @@ int otbDempsterShaferFusionTest(int argc, char * argv[]) for (unsigned int it = 0; it < classifiedPixelX.size(); ++it) { - std::cout << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it] << std::endl; + otbLogMacro(Debug, << "classifiedPixelX[" << it << "] = " << classifiedPixelX[it]); } //********************************************************************** @@ -1490,13 +1446,8 @@ int otbDempsterShaferFusionTest(int argc, char * argv[]) jointMassClkFilter->Update(); MassOfBeliefFunctionType::Pointer jointMass = jointMassClkFilter->GetOutput(); - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassClkFilter = " << jointMassClkFilter << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassOfBelief = " << jointMass << std::endl; - std::cout << "****************************************************************************" << std::endl; + otbLogMacro(Debug, << "jointMassClkFilter = " << jointMassClkFilter); + otbLogMacro(Debug, << "jointMassOfBelief = " << jointMass); // The decision for the DS Fusion is made with the MAXIMAL Belief function: // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj})) @@ -1523,10 +1474,9 @@ int otbDempsterShaferFusionTest(int argc, char * argv[]) } } - std::cout << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk) << std::endl; - std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " - << jointMass->GetBelief(labelSetClk_) << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk)); + otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " + << jointMass->GetBelief(labelSetClk_)); } //If the DS VOTED LABEL is NOT unique @@ -1539,28 +1489,13 @@ int otbDempsterShaferFusionTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } - - - - - -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** - - // OPTIMIZED RECURSIVE DS FUSION FROM CONFUSION MATRIX FILES int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) { @@ -1658,11 +1593,12 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) // Vector containing the Mass of Belief of the universe for each classifier vectorUniverseMOBs.push_back(mobUniverseClk); - std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl; + otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = "); + std::ostringstream oss; for (itMapOfClassesClk = mapOfClassesClk.begin(); itMapOfClassesClk != mapOfClassesClk.end(); ++itMapOfClassesClk) { IntLabelPixelType classLabel = itMapOfClassesClk->first; - std::cout << "[" << classLabel << "] "; + oss << "[" << classLabel << "] "; // If the current classLabel has already been added to the universe if (universe.count(classLabel) > 0) @@ -1674,29 +1610,24 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) universe[classLabel] = 1; } } - std::cout << std::endl << confMatClk << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << oss.str()); + otbLogMacro(Debug, << confMatClk); for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk) { - std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl; + otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second); } - - std::cout << "*******************************************************************************" << std::endl; } // Number of classes in the universe unsigned int nbClasses = universe.size(); - std::cout << "universe:" << std::endl; + otbLogMacro(Info, << "universe:"); for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse) { - std::cout << "Class Label " << itUniverse->first; - std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl; + otbLogMacro(Info, << "Class Label " << itUniverse->first + << " present in " << itUniverse->second << " classifier(s)"); } - std::cout << std::endl; - - /* ***************************************************************************************** */ /* ************************ RESULTS OF THE CLASSIFICATION OF PIXEL X *********************** */ @@ -1740,9 +1671,8 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) mLabelSetClk = vectorMapMOBs[itClk][classLabelk]; mLabelSetClk_ = 1 - mLabelSetClk - mUniverseClk; - std::cout << "classifiedPixelX[" << itClk << "] = " << classLabelk; - std::cout << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk; - std::cout << std::endl; + otbLogMacro(Debug, << "classifiedPixelX[" << itClk << "] = " << classLabelk + << "; MassOfBelief_Cl_" << itClk << "[" << classLabelk << "] = " << mLabelSetClk); // The first time the label {Ai} is found in classifiedPixelX if (mapJointMassesStepI.count(classLabelk) == 0) @@ -1768,9 +1698,6 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) mapJointMassesUniverseStepI[classLabelk] = mUniverseClkNew; } - std::cout << "*******************************************************************************" << std::endl; - std::cout << std::endl; - /* ***************************************************************************************** */ /* *************************************** DS STEP #2 ************************************** */ /* ***************************************************************************************** */ @@ -1789,10 +1716,9 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) B = B * (1 - mLabelSetClk); C = C * mLabelSetClk_; - std::cout << "****************************************" << std::endl; - std::cout << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk << std::endl; - std::cout << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_ << std::endl; - std::cout << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk << std::endl; + otbLogMacro(Debug, << "mapJointMassesStepI[" << classLabelk << "] = " << mLabelSetClk); + otbLogMacro(Debug, << "mapJointMassesStepI_[" << classLabelk << "] = " << mLabelSetClk_); + otbLogMacro(Debug, << "mapJointMassesUniverseStepI[" << classLabelk << "] = " << mUniverseClk); } unsigned int nbClkGroupsStepI = mapJointMassesStepI.size(); @@ -1808,13 +1734,9 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "nbClasses = " << nbClasses << std::endl; - std::cout << "nbClassifiers = " << nbClassifiers << std::endl; - std::cout << "nbClkGroupsStepI = " << nbClkGroupsStepI << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "****************************************************************************" << std::endl; + otbLogMacro(Info, << "nbClasses = " << nbClasses); + otbLogMacro(Info, << "nbClassifiers = " << nbClassifiers); + otbLogMacro(Info, << "nbClkGroupsStepI = " << nbClkGroupsStepI); // Calculation of the Belief function of each singleton {Ai} and {Ai_} SingleClassLabelMassMapType mapBelStepII, mapBelStepII_; @@ -1861,9 +1783,6 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) addBelLabelSetClk += belLabelSetClk; } - std::cout << "****************************************************************************" << std::endl; - - /* ***************************************************************************************** */ /* ************************************ DECISION PROCESS *********************************** */ /* ***************************************************************************************** */ @@ -1905,9 +1824,8 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) mapBelStepII_[classLabelk] = addBelLabelSetClk; } - std::cout << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk] << std::endl; - std::cout << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk] << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << "Bel(" << classLabelk << ") = " << mapBelStepII[classLabelk]); + otbLogMacro(Debug, << "Bel(NOT_" << classLabelk << ") = " << mapBelStepII_[classLabelk]); } // If the DS VOTED LABEL is NOT unique, the result of the DS Fusion is undefinedValue @@ -1920,24 +1838,13 @@ int otbDempsterShaferFusionOptRecConfMatFileTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } - - -// ******************************************************************************************************** -// ******************************************************************************************************** -// ******************************************************************************************************** - - - - // NOT OPTIMIZED DS FUSION FROM CONFUSION MATRIX FILES int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) { @@ -2036,11 +1943,12 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) // Vector containing the Mass of Belief of the universe for each classifier vectorUniverseMOBs.push_back(mobUniverseClk); - std::cout << "confusion matrix[Cl_" << itClk << "] = " << std::endl; + otbLogMacro(Debug, << "confusion matrix[Cl_" << itClk << "] = "); + std::ostringstream oss; for (itMapOfClassesClk = mapOfClassesClk.begin(); itMapOfClassesClk != mapOfClassesClk.end(); ++itMapOfClassesClk) { IntLabelPixelType classLabel = itMapOfClassesClk->first; - std::cout << "[" << classLabel << "] "; + oss << "[" << classLabel << "] "; // If the current classLabel has already been added to the universe if (universe.count(classLabel) > 0) @@ -2052,15 +1960,13 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) universe[classLabel] = 1; } } - std::cout << std::endl << confMatClk << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << oss.str()); + otbLogMacro(Debug, << confMatClk); for (itMapMOBClk = mapMOBClk.begin(); itMapMOBClk != mapMOBClk.end(); ++itMapMOBClk) { - std::cout << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second << std::endl; + otbLogMacro(Debug, << "mapMOBCl_" << itClk << "[" << itMapMOBClk->first << "] = " << itMapMOBClk->second); } - - std::cout << "*******************************************************************************" << std::endl; } // Number of classes in the universe @@ -2072,19 +1978,16 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) IntLabelSetMapType mapLabelSets; IntLabelSetMapType::iterator itMapLabelSets; - std::cout << "universe:" << std::endl; + otbLogMacro(Debug, << "universe:"); for (itUniverse = universe.begin(); itUniverse != universe.end(); ++itUniverse) { - std::cout << "Class Label " << itUniverse->first; - std::cout << " present in " << itUniverse->second << " classifier(s)" << std::endl; + otbLogMacro(Debug, << "Class Label " << itUniverse->first + << " present in " << itUniverse->second << " classifier(s)"); universeSet.insert(itUniverse->first); labelSet.clear(); labelSet.insert(itUniverse->first); mapLabelSets[itUniverse->first] = labelSet; } - std::cout << std::endl; - - // Vector containing the std::maps of masses of ALL the singleton sets for each classifier k IntMassMapType mClk; @@ -2160,13 +2063,8 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) jointMassClkFilter->Update(); IntMassOfBeliefFunctionType::Pointer jointMass = jointMassClkFilter->GetOutput(); - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassClkFilter = " << jointMassClkFilter << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << std::endl; - std::cout << "****************************************************************************" << std::endl; - std::cout << "jointMassOfBelief = " << jointMass << std::endl; - std::cout << "****************************************************************************" << std::endl; + otbLogMacro(Debug, << "jointMassClkFilter = " << jointMassClkFilter); + otbLogMacro(Debug, << "jointMassOfBelief = " << jointMass); // The decision for the DS Fusion is made with the MAXIMAL Belief function: // {Ai} is chosen if Bel({Ai}) = MAX(Bel({Aj})) @@ -2193,10 +2091,9 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) } } - std::cout << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk) << std::endl; - std::cout << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " - << jointMass->GetBelief(labelSetClk_) << std::endl; - std::cout << std::endl; + otbLogMacro(Debug, << "Bel(" << labelSetClk << ") = " << jointMass->GetBelief(labelSetClk)); + otbLogMacro(Debug, << "Bel(NOT_" << labelSetClk << ") = Bel(" << labelSetClk_ << ") = " + << jointMass->GetBelief(labelSetClk_)); } //If the DS VOTED LABEL is NOT unique @@ -2209,10 +2106,8 @@ int otbDempsterShaferFusionConfMatFileTest(int argc, char * argv[]) } } - std::cout << "****************************************************************************" << std::endl; - std::cout << "fusedDSLabelSet = " << fusedDSLabelSet << std::endl; - std::cout << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk << std::endl; - std::cout << std::endl; + otbLogMacro(Info, << "fusedDSLabelSet = " << fusedDSLabelSet); + otbLogMacro(Info, << "fusedDSBelLabelSetClk = " << fusedDSBelLabelSetClk); return EXIT_SUCCESS; } 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/otbMassOfBelief.cxx b/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx index 209186c5da9d474ee8fcc91500a69a6bab5bbf09..23f076e55afd23989afa9b0a6f7df041bb10bdd2 100644 --- a/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx +++ b/Modules/Learning/DempsterShafer/test/otbMassOfBelief.cxx @@ -21,6 +21,7 @@ #include "otbMassOfBelief.h" +#include "otbMacro.h" typedef otb::MassOfBelief<std::string> MassOfBeliefFunctionType; @@ -44,56 +45,60 @@ int otbMassOfBelief(int itkNotUsed(argc), char* itkNotUsed(argv)[]) massFunction->SetMass(set2, 0.3); massFunction->SetMass(set4, 0.1); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); - std::cout<<"Removing mass from set "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, set4); - std::cout<<std::endl; + std::ostringstream oss; + MassOfBeliefFunctionType::PrintLabelSet(oss, set4); + otbLogMacro(Info, << "Removing mass from set " << oss.str()); massFunction->RemoveMass(set4); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); - std::cout<<"Estimating uncertainty "<<std::endl; + otbLogMacro(Info, <<"Estimating uncertainty"); massFunction->EstimateUncertainty(); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); + + oss.str(std::string()); + oss << "Removing mass "; + MassOfBeliefFunctionType::PrintLabelSet(oss, set2); + oss << " and adding mass "; + MassOfBeliefFunctionType::PrintLabelSet(oss, set3); + otbLogMacro(Info, << oss.str()); - std::cout<<"Removing mass "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, set2); - std::cout<<" and adding mass "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3); - std::cout<<std::endl; massFunction->RemoveMass(set2); massFunction->SetMass(set3, 0.6); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); - std::cout<<"Normalizing masses "<<std::endl; + otbLogMacro(Info, <<"Normalizing masses "); massFunction->Normalize(); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); + + oss.str(std::string()); + MassOfBeliefFunctionType::PrintLabelSet(oss, set3); + otbLogMacro(Info, <<"Belief of "<< oss.str() + << " is "<< massFunction->GetBelief(set3)); - std::cout<<"Belief of "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3); - std::cout<<" is "<<massFunction->GetBelief(set3)<<std::endl; - - std::cout<<"Plausibility of "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, set3); - std::cout<<" is "<<massFunction->GetPlausibility(set3)<<std::endl; + oss.str(std::string()); + MassOfBeliefFunctionType::PrintLabelSet(oss, set3); + otbLogMacro(Info, <<"Plausibility of " << oss.str() + << " is " << massFunction->GetPlausibility(set3)); MassOfBeliefFunctionType::LabelSetType otherSet; otherSet.insert("cat"); otherSet.insert("dog"); otherSet.insert("bird"); - std::cout<<"Initializing with power set from universal set "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, otherSet); - std::cout<<std::endl; - + oss.str(std::string()); + MassOfBeliefFunctionType::PrintLabelSet(oss, otherSet); + otbLogMacro(Info, <<"Initializing with power set from universal set "<< oss.str()); + massFunction->InitializePowerSetMasses(otherSet); - std::cout<<massFunction<<std::endl; + otbLogMacro(Debug, <<massFunction); return EXIT_SUCCESS; } diff --git a/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx b/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx index b39e2b5e0a8025c69dc99b77adf1c5c13af0fd3b..4ea8993fee118e879e9d976e6d2322297ca99548 100644 --- a/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx +++ b/Modules/Learning/DempsterShafer/test/otbMassOfBeliefDSApplied.cxx @@ -24,6 +24,7 @@ #include "otbFuzzyVariable.h" #include "otbJointMassOfBeliefFilter.h" +#include "otbMacro.h" typedef float PrecisionType; @@ -90,27 +91,23 @@ int otbMassOfBeliefDSApplied(int itkNotUsed(argc), char* argv[]) jointMassFilter->Update(); jointMass = jointMassFilter->GetOutput(); - std::cout<<mass1<<std::endl; + otbLogMacro(Debug,<< "Mass 1:" <<mass1); - std::cout<<mass2<<std::endl; + otbLogMacro(Debug,<< "Mass 2:"<<mass2); - std::cout << jointMass << std::endl; - - std::cout << "Considered Hypothesis : "; - MassOfBeliefFunctionType::PrintLabelSet(std::cout, Hyp); - std::cout << std::endl; + otbLogMacro(Debug,<< "Joint mass :" << jointMass); + + std::ostringstream oss; + MassOfBeliefFunctionType::PrintLabelSet(oss, Hyp); + otbLogMacro(Info, << "Considered Hypothesis : " << oss.str()); - std::cout << "Belief(Hyp) : " - << jointMass->GetBelief(Hyp) - << " - Plausibility(Hyp) : " - << jointMass->GetPlausibility(Hyp) - << " - Score(Hyp) : " - << (jointMass->GetBelief(Hyp) + jointMass->GetPlausibility(Hyp))/2.0 - << std::endl; + otbLogMacro(Info, << "Belief(Hyp) : " << jointMass->GetBelief(Hyp)); + otbLogMacro(Info, << "Plausibility(Hyp) : " << jointMass->GetPlausibility(Hyp)); + otbLogMacro(Info, << "Score(Hyp) : " << (jointMass->GetBelief(Hyp) + jointMass->GetPlausibility(Hyp))/2.0); if (jointMass->GetBelief(Hyp) > jointMass->GetPlausibility(Hyp)) { - std::cout << "Belief > Plausibility" << std::endl; + otbLogMacro(Warning, << "Belief > Plausibility"); return EXIT_FAILURE; } else 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/LearningBase/include/otbMachineLearningModel.hxx b/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx index 543453f5b9cae8f25ce88d244c2dfde2c9662693..392857b02bc6106fd3f474b0c4e169f186bca266 100644 --- a/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx +++ b/Modules/Learning/LearningBase/include/otbMachineLearningModel.hxx @@ -144,10 +144,13 @@ MachineLearningModel<TInputValue,TOutputValue,TConfidenceValue> { assert(input != nullptr); assert(targets != nullptr); - - assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size."); - assert(((quality==nullptr)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list"); - assert((proba==nullptr)||(input->Size()==proba->Size())&&"Proba sample list and target label list do not have the same size."); + + assert(input->Size() == targets->Size() + && "Input sample list and target label list do not have the same size."); + assert(((quality == nullptr) || (quality->Size() == input->Size())) + && "Quality samples list is not null and does not have the same size as input samples list"); + assert(((proba == nullptr) || (input->Size() == proba->Size())) + && "Proba sample list and target label list do not have the same size."); if(startIndex+size>input->Size()) { diff --git a/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx b/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx index c393293300a13191943abd41fd4ce474a262b3dd..c11ee59e541a0a3068111155cbe20d02b5847fbf 100644 --- a/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx +++ b/Modules/Learning/LearningBase/test/otbSharkUtilsTests.cxx @@ -25,8 +25,8 @@ int otbSharkNormalizeLabels(int itkNotUsed(argc), char* itkNotUsed(argv) []) { std::vector<unsigned int> inLabels = {2, 2, 3, 20, 1}; - std::vector<unsigned int> expectedDictionary = {2, 3, 20, 1}; - std::vector<unsigned int> expectedLabels = {0, 0, 1, 2, 3}; + std::vector<unsigned int> expectedDictionary = {1, 2, 3, 20}; + std::vector<unsigned int> expectedLabels = {1, 1, 2, 3, 0}; auto newLabels = inLabels; std::vector<unsigned int> labelDict; diff --git a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx index cd5c2a6a7ae16064cc346f1010414e231c2f3e8a..b59e079182e4ac3ea894c203ee7c6350159bdebb 100644 --- a/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx +++ b/Modules/Learning/Supervised/include/otbSharkRandomForestsMachineLearningModel.hxx @@ -53,6 +53,7 @@ SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue> this->m_IsRegressionSupported = false; this->m_IsDoPredictBatchMultiThreaded = true; this->m_NormalizeClassLabels = true; + this->m_ComputeMargin = false; } @@ -167,9 +168,12 @@ SharkRandomForestsMachineLearningModel<TInputValue,TOutputValue> assert(input != nullptr); assert(targets != nullptr); - assert(input->Size()==targets->Size()&&"Input sample list and target label list do not have the same size."); - assert(((quality==nullptr)||(quality->Size()==input->Size()))&&"Quality samples list is not null and does not have the same size as input samples list"); - assert((proba==nullptr)||(input->Size()==proba->Size())&&"Proba sample list and target label list do not have the same size."); + assert(input->Size() == targets->Size() + && "Input sample list and target label list do not have the same size."); + assert(((quality == nullptr) || (quality->Size() == input->Size())) + && "Quality samples list is not null and does not have the same size as input samples list"); + assert(((proba == nullptr) || (input->Size() == proba->Size())) + && "Proba sample list and target label list do not have the same size."); if(startIndex+size>input->Size()) { diff --git a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx index df5cd21a5d24db67c8dac1c16d94f352f4e2cfe9..60f48c6e73daf1fa419d4a6e6e6418d4c8a03dee 100644 --- a/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx +++ b/Modules/Learning/Supervised/test/otbTrainMachineLearningModel.cxx @@ -22,6 +22,9 @@ #include <fstream> #include <string> #include <algorithm> +#include <chrono> + +#include "otbMacro.h" #include <otbMachineLearningModel.h> #include "otbConfusionMatrixCalculator.h" @@ -48,10 +51,28 @@ typedef MachineLearningModelRegressionType::TargetListSampleType TargetListSampl typedef otb::ConfusionMatrixCalculator<TargetListSampleType, TargetListSampleType> ConfusionMatrixCalculatorType; -#ifdef OTB_USE_LIBSVM -#include "otbLibSVMMachineLearningModel.h" +float GetConfusionMatrixResults(TargetListSampleType::Pointer predicted, TargetListSampleType::Pointer ref) +{ + ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); + cmCalculator->SetProducedLabels(predicted); + cmCalculator->SetReferenceLabels(ref); + cmCalculator->Compute(); -int otbLibSVMMachineLearningModel(int argc, char * argv[]) + otbLogMacro(Debug, << "Confusion matrix:\n" << cmCalculator->GetConfusionMatrix()); + otbLogMacro(Info, << "Kappa: "<< cmCalculator->GetKappaIndex()); + otbLogMacro(Debug, << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy()); + + return cmCalculator->GetKappaIndex(); +} + +template <class TModel> +void SetupModel(TModel* /*model*/) +{ + // do nothing by default +} + +template <class TModel> +int otbGenericMachineLearningModel(int argc, char * argv[]) { if (argc != 3) { @@ -59,69 +80,50 @@ int otbLibSVMMachineLearningModel(int argc, char * argv[]) std::cout<<"Usage : sample file, output file "<<std::endl; return EXIT_FAILURE; } - - - typedef otb::LibSVMMachineLearningModel<InputValueType, TargetValueType> SVMType; InputListSampleType::Pointer samples = InputListSampleType::New(); TargetListSampleType::Pointer labels = TargetListSampleType::New(); - if (!otb::ReadDataFile(argv[1], samples, labels)) { std::cout << "Failed to read samples file " << argv[1] << std::endl; return EXIT_FAILURE; } - SVMType::Pointer classifier = SVMType::New(); + typename TModel::Pointer classifier = TModel::New(); classifier->SetInputListSample(samples); classifier->SetTargetListSample(labels); + SetupModel<TModel>(classifier); classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout << "Confusion matrix: " << std::endl; - std::cout << cmCalculator->GetConfusionMatrix() << std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy() << std::endl; - classifier->Save(argv[2]); + TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); + const float kappa = GetConfusionMatrixResults(predicted, labels); - //Load Model to new LibSVM - SVMType::Pointer classifierLoad = SVMType::New(); - + typename TModel::Pointer classifierLoad = TModel::New(); classifierLoad->Load(argv[2]); + auto start = std::chrono::system_clock::now(); + otbLogMacro(Debug, << "Predict loaded"); TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); + using TimeT = std::chrono::milliseconds; + auto duration = std::chrono::duration_cast< TimeT> + (std::chrono::system_clock::now() - start); + auto elapsed = duration.count(); + otbLogMacro(Debug, << "PredictBatch took " << elapsed << " ms"); + const float kappaLoad = GetConfusionMatrixResults(predictedLoad, labels); - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; + return (std::abs(kappaLoad - kappa) < 0.00000001 ? EXIT_SUCCESS : EXIT_FAILURE); +} +// -------------------------- LibSVM ------------------------------------------- +#ifdef OTB_USE_LIBSVM +#include "otbLibSVMMachineLearningModel.h" - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } +using LibSVMType = otb::LibSVMMachineLearningModel<InputValueType, TargetValueType>; +int otbLibSVMMachineLearningModel(int argc, char * argv[]) +{ + return otbGenericMachineLearningModel<LibSVMType>(argc,argv); } #endif +// -------------------------- OpenCV ------------------------------------------- #ifdef OTB_USE_OPENCV #include "otbSVMMachineLearningModel.h" #include "otbKNearestNeighborsMachineLearningModel.h" @@ -132,75 +134,10 @@ int otbLibSVMMachineLearningModel(int argc, char * argv[]) #include "otbDecisionTreeMachineLearningModel.h" #include "otbKNearestNeighborsMachineLearningModel.h" - +using SVMType = otb::SVMMachineLearningModel<InputValueType, TargetValueType>; int otbSVMMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::SVMMachineLearningModel<InputValueType, TargetValueType> SVMType; - - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } - - SVMType::Pointer classifier = SVMType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - classifier->Save(argv[2]); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - //Load Model to new SVM - SVMType::Pointer classifierLoad = SVMType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<SVMType>(argc,argv); } int otbSVMMachineLearningRegressionModel(int argc, char * argv[]) @@ -272,570 +209,93 @@ int otbSVMMachineLearningRegressionModel(int argc, char * argv[]) } } - +using KNearestNeighborsType = otb::KNearestNeighborsMachineLearningModel<InputValueType,TargetValueType>; int otbKNearestNeighborsMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file"<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::KNearestNeighborsMachineLearningModel<InputValueType,TargetValueType> KNearestNeighborsType; - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } - - KNearestNeighborsType::Pointer classifier = KNearestNeighborsType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->Train(); - //write the model - classifier->Save(argv[2]); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - - //Load Model to new KNN - KNearestNeighborsType::Pointer classifierLoad = KNearestNeighborsType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<KNearestNeighborsType>(argc,argv); } - +using RandomForestType = otb::RandomForestsMachineLearningModel<InputValueType,TargetValueType>; int otbRandomForestsMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::RandomForestsMachineLearningModel<InputValueType,TargetValueType> RandomForestType; - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<RandomForestType>(argc,argv); +} +template <> +void SetupModel(RandomForestType* model) +{ std::vector<float> priors(26,1.); - - - RandomForestType::Pointer classifier = RandomForestType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - - //set parameters - classifier->SetPriors(priors); - // classifier->SetMaxNumberOfTrees(30); - // classifier->SetMaxDepth(30); - // classifier->SetMaxNumberOfCategories(30); - // classifier->SetMaxNumberOfVariables(4); - - classifier->Train(); - classifier->Save(argv[2]); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - //Load Model to new RF - RandomForestType::Pointer classifierLoad = RandomForestType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + model->SetPriors(priors); } - +using BoostType = otb::BoostMachineLearningModel<InputValueType, TargetValueType>; int otbBoostMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::BoostMachineLearningModel<InputValueType, TargetValueType> BoostType; - - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<BoostType>(argc,argv); +} +template <> +void SetupModel(BoostType *model) +{ // Since otb::BoostMachineLearningModel ONLY handles 2-class classifications, then the // labels are split into 2 subsets: even (label = 1) and odd (label = 3) labels + TargetListSampleType::Pointer labels = model->GetTargetListSample(); TargetSampleType currentLabel; for (unsigned itLabel = 0; itLabel < labels->Size(); ++itLabel) { currentLabel = labels->GetMeasurementVector(itLabel); labels->SetMeasurementVector(itLabel, (2 * (currentLabel[0] % 2)) + 1); } - - BoostType::Pointer classifier = BoostType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - classifier->Save(argv[2]); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - //Load Model to new Boost model - BoostType::Pointer classifierLoad = BoostType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + model->SetTargetListSample(labels); } - +using ANNType = otb::NeuralNetworkMachineLearningModel<InputValueType, TargetValueType>; int otbANNMachineLearningModel(int argc, char * argv[]) { - if (argc != 3) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - - typedef otb::NeuralNetworkMachineLearningModel<InputValueType, TargetValueType> ANNType; - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if (!otb::ReadDataFile(argv[1], samples, labels)) - { - std::cout << "Failed to read samples file " << argv[1] << std::endl; - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<ANNType>(argc,argv); +} +template <> +void SetupModel(ANNType* model) +{ std::vector<unsigned int> layerSizes; layerSizes.push_back(16); layerSizes.push_back(100); layerSizes.push_back(100); layerSizes.push_back(26); - - ANNType::Pointer classifier = ANNType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->SetLayerSizes(layerSizes); - /*classifier->SetTrainMethod(CvANN_MLP_TrainParams::RPROP); - classifier->SetRegPropDW0(0.1); - classifier->SetRegPropDWMin(0.1); - classifier->SetTermCriteriaType(CV_TERMCRIT_ITER); - classifier->SetMaxIter(300); - classifier->SetEpsilon(0.01); */ - classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout << "Confusion matrix: " << std::endl; - std::cout << cmCalculator->GetConfusionMatrix() << std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout << "Overall Accuracy: " << cmCalculator->GetOverallAccuracy() << std::endl; - - classifier->Save(argv[2]); - - //Load Model to new ANN - ANNType::Pointer classifierLoad = ANNType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + model->SetLayerSizes(layerSizes); } - +using NormalBayesType = otb::NormalBayesMachineLearningModel<InputValueType, TargetValueType>; int otbNormalBayesMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::NormalBayesMachineLearningModel<InputValueType, TargetValueType> NormalBayesType; - - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } - - NormalBayesType::Pointer classifier = NormalBayesType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - classifier->Save(argv[2]); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - //Load Model to new Normal Bayes - NormalBayesType::Pointer classifierLoad = NormalBayesType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<NormalBayesType>(argc,argv); } - +using DecisionTreeType = otb::DecisionTreeMachineLearningModel<InputValueType, TargetValueType>; int otbDecisionTreeMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::DecisionTreeMachineLearningModel<InputValueType, TargetValueType> DecisionTreeType; - - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } - - DecisionTreeType::Pointer classifier = DecisionTreeType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->Train(); - - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - classifier->Save(argv[2]); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - //Load Model to new Decision Tree - DecisionTreeType::Pointer classifierLoad = DecisionTreeType::New(); - - classifierLoad->Load(argv[2]); - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } + return otbGenericMachineLearningModel<DecisionTreeType>(argc,argv); } - #endif +// -------------------------- Shark -------------------------------------------- #ifdef OTB_USE_SHARK -#include <chrono> // If shark is on, then we are using c++11 - #include "otbSharkRandomForestsMachineLearningModel.h" +using SharkRandomForestType = otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType>; int otbSharkRFMachineLearningModel(int argc, char * argv[]) { - if (argc != 3 ) - { - std::cout<<"Wrong number of arguments "<<std::endl; - std::cout<<"Usage : sample file, output file "<<std::endl; - return EXIT_FAILURE; - } - - typedef otb::SharkRandomForestsMachineLearningModel<InputValueType,TargetValueType> RandomForestType; - InputListSampleType::Pointer samples = InputListSampleType::New(); - TargetListSampleType::Pointer labels = TargetListSampleType::New(); - - if(!otb::ReadDataFile(argv[1],samples,labels)) - { - std::cout<<"Failed to read samples file "<<argv[1]<<std::endl; - return EXIT_FAILURE; - } - - - RandomForestType::Pointer classifier = RandomForestType::New(); - classifier->SetInputListSample(samples); - classifier->SetTargetListSample(labels); - classifier->SetRegressionMode(false); - classifier->SetNumberOfTrees(100); - classifier->SetMTry(0); - classifier->SetNodeSize(25); - classifier->SetOobRatio(0.3); - std::cout << "Train\n"; - classifier->Train(); - std::cout << "Save\n"; - classifier->Save(argv[2]); - - std::cout << "Predict\n"; - TargetListSampleType::Pointer predicted = classifier->PredictBatch(samples, NULL); - - ConfusionMatrixCalculatorType::Pointer cmCalculator = ConfusionMatrixCalculatorType::New(); - - cmCalculator->SetProducedLabels(predicted); - cmCalculator->SetReferenceLabels(labels); - cmCalculator->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculator->GetConfusionMatrix()<<std::endl; - const float kappaIdx = cmCalculator->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdx<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculator->GetOverallAccuracy()<<std::endl; - - // //Predict single samples. Written for benchmarking purposes, but - // too long for regression testing - // std::cout << "Predict single samples\n"; - // auto sIt = samples->Begin(); - // auto lIt = labels->Begin(); - // auto start = std::chrono::system_clock::now(); - // for(; sIt != samples->End(); ++sIt, ++lIt) - // { - // classifier->Predict(sIt.GetMeasurementVector())[0]; - // } - // auto duration = std::chrono::duration_cast< TimeT> - // (std::chrono::system_clock::now() - start); - // auto elapsed = duration.count(); - // std::cout << "Predict took " << elapsed << " ms\n"; - // std::cout << "Single sample OA = " << oa << '\n'; -//Load Model to new RF - RandomForestType::Pointer classifierLoad = RandomForestType::New(); - - std::cout << "Load\n"; - classifierLoad->Load(argv[2]); - auto start = std::chrono::system_clock::now(); - std::cout << "Predict loaded\n"; - TargetListSampleType::Pointer predictedLoad = classifierLoad->PredictBatch(samples, NULL); - using TimeT = std::chrono::milliseconds; - auto duration = std::chrono::duration_cast< TimeT> - (std::chrono::system_clock::now() - start); - auto elapsed = duration.count(); - std::cout << "PredictBatch took " << elapsed << " ms\n"; - ConfusionMatrixCalculatorType::Pointer cmCalculatorLoad = ConfusionMatrixCalculatorType::New(); - - cmCalculatorLoad->SetProducedLabels(predictedLoad); - cmCalculatorLoad->SetReferenceLabels(labels); - cmCalculatorLoad->Compute(); - - std::cout<<"Confusion matrix: "<<std::endl; - std::cout<<cmCalculatorLoad->GetConfusionMatrix()<<std::endl; - const float kappaIdxLoad = cmCalculatorLoad->GetKappaIndex(); - std::cout<<"Kappa: "<<kappaIdxLoad<<std::endl; - std::cout<<"Overall Accuracy: "<<cmCalculatorLoad->GetOverallAccuracy()<<std::endl; - - - if ( std::abs(kappaIdxLoad - kappaIdx) < 0.00000001) - { - return EXIT_SUCCESS; - } - else - { - return EXIT_FAILURE; - } - - return EXIT_SUCCESS; + return otbGenericMachineLearningModel<SharkRandomForestType>(argc,argv); } - +template <> +void SetupModel(SharkRandomForestType* model) +{ + model->SetRegressionMode(false); + model->SetNumberOfTrees(100); + model->SetMTry(0); + model->SetNodeSize(25); + model->SetOobRatio(0.3); +} #endif 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/otbRCC8Value.h b/Modules/OBIA/RCC8/include/otbRCC8Value.h deleted file mode 100644 index 24bc9c96c1039c35daae218c76ebe8fe233ffee6..0000000000000000000000000000000000000000 --- a/Modules/OBIA/RCC8/include/otbRCC8Value.h +++ /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. - */ - -#ifndef otbRCC8Value_h -#define otbRCC8Value_h - -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; -} // 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..257f66a84dc7a581a14ad2e1133c2aedf142a7f2 --- /dev/null +++ b/Modules/Radiometry/Indices/include/otbIndicesStackFunctor.h @@ -0,0 +1,101 @@ +/* + * 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> + +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..15cdba6cade2b34deeda96c9ac8df401d7652992 --- /dev/null +++ b/Modules/Radiometry/Indices/include/otbRadiometricIndex.h @@ -0,0 +1,217 @@ +/* + * 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; + + /** + * \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/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx b/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx index c70da18dfa09004c57facbcc8a9fa3a8cecb319d..0b099fbd35c0481504aaa2835f3c923e907a9339 100644 --- a/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx +++ b/Modules/Radiometry/OpticalCalibration/test/otbSurfaceAdjacencyEffectCorrectionSchemeFilter.cxx @@ -26,6 +26,7 @@ #include "otbImageFileWriter.h" #include "otbAtmosphericCorrectionParameters.h" #include "otbAtmosphericRadiativeTerms.h" +#include "otbMacro.h" #include <fstream> #include <iostream> @@ -150,9 +151,9 @@ int otbSurfaceAdjacencyEffectCorrectionSchemeFilter(int itkNotUsed(argc), char * { value = atof(line.c_str()); vect.push_back(value); - std::cout << "value " << value << std::endl; + otbLogMacro(Debug, << "value " << value); } - std::cout << "vec size " << vect.size()<< std::endl; + otbLogMacro(Debug, << "vec size " << vect.size()); fin2.close(); functionValues->SetFilterFunctionValues(vect); functionValues->SetMinSpectralValue(minSpectralValue); 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/otbReduceSpectralResponse.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx index b5e61e7a7056980e76a758d5adabf0463d28cf86..154ee53f4a9d599310e92ea39f5585b70c50d0db 100644 --- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx +++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponse.cxx @@ -66,14 +66,13 @@ int otbReduceSpectralResponse(int argc, char * argv[]) myReduceResponse->SetReflectanceMode(reflectanceMode); myReduceResponse->CalculateResponse(); /** Print the Reduce SR*/ - std::cout << myReduceResponse << std::endl; + otbLogMacro(Debug, << myReduceResponse); if (argc == 6) { char * outputName = argv[5]; std::ofstream outputFile(outputName, std::ios::out); outputFile << myReduceResponse << std::endl; } - else std::cout << myReduceResponse << std::endl; return EXIT_SUCCESS; } 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/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx index b62fad816de6dc073338364c29c483ac41a6b2aa..7a707f714090b4f7d3592cd03ea7ea614ad2905a 100644 --- a/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx +++ b/Modules/Radiometry/Simulation/test/otbReduceSpectralResponseSVMClassifier.cxx @@ -19,7 +19,7 @@ */ - +#include "otbMacro.h" #include "otbSatelliteRSR.h" #include "otbReduceSpectralResponse.h" @@ -89,7 +89,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) for (unsigned int i = 0; i < dirSR.size(); ++i) //for each class (directory) { - std::cout << "dirSR[" << i << "] : " << dirSR[i] << std::endl; + otbLogMacro(Info, << "dirSR[" << i << "] : " << dirSR[i]); std::string fileExp = dirSR[i]; // Find all .txt file in the directory @@ -97,7 +97,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) itksys::Glob glob; if ( glob.FindFiles( fileExp ) == false ) { - std::cout<<"No .txt file found in "<<dirSR[i]<<"."<<std::endl; + otbLogMacro(Warning,<<"No .txt file found in "<<dirSR[i]<<"."); return EXIT_FAILURE; } @@ -122,14 +122,14 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) //add to global training files and testing files for (unsigned int k = 0; k < testing.size(); ++k) { - std::cout << "testing[" << k << "] : " << testing[k] << std::endl; + otbLogMacro(Debug, << "testing[" << k << "] : " << testing[k]); testingFiles.push_back(testing[k]); testingGTClasses.push_back(i); } for (unsigned int l = 0; l < training.size(); ++l) { - std::cout << "training[" << l << "] : " << training[l] << std::endl; + otbLogMacro(Debug, << "training[" << l << "] : " << training[l]); trainingFiles.push_back(training[l]); trainingClasses.push_back(i); //class is the directory number } @@ -141,7 +141,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) for (unsigned int i = 0; i < trainingFiles.size(); ++i) { ResponsePointerType spectralResponse = ResponseType::New(); - std::cout << "training file : " << trainingFiles[i] << std::endl; + otbLogMacro(Debug, << "training file : " << trainingFiles[i]); spectralResponse->Load(trainingFiles[i], 100.0); //Compute Reduce Spectral Response @@ -156,17 +156,19 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) SampleType sample; TrainingSampleType trainingSample; sample.SetSize(reduceResponse->GetReduceResponse()->Size()); - std::cout << "reduce response : ["; + std::ostringstream oss; + oss << "reduce response : ["; for (unsigned int j = 0; j < reduceResponse->GetReduceResponse()->Size(); ++j) { sample[j] = reduceResponse->GetReduceResponse()->GetResponse()[j].second; - std::cout << reduceResponse->GetReduceResponse()->GetResponse()[j].second << " "; + oss << reduceResponse->GetReduceResponse()->GetResponse()[j].second << " "; } - std::cout << "]" << std::endl; + oss << "]"; + otbLogMacro(Debug, << oss.str()); sampleList->SetMeasurementVectorSize(nbBand); sampleList->PushBack(sample); trainingSample = trainingClasses[i]; - std::cout << "training class : " << trainingSample << std::endl; + otbLogMacro(Debug, << "training class : " << trainingSample); trainingList->PushBack(trainingSample); } @@ -191,7 +193,7 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) for (unsigned int i = 0; i < testingFiles.size(); ++i) { ResponsePointerType spectralResponse = ResponseType::New(); - std::cout << "testing file : " << testingFiles[i] << std::endl; + otbLogMacro(Debug, << "testing file : " << testingFiles[i]); spectralResponse->Load(testingFiles[i], 100.0); //Compute Reduce Spectral Response @@ -222,12 +224,12 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) TrainingSampleListType::ConstIterator it = classifierListLabel->Begin(); while (it != classifierListLabel->End()) { - std::cout << "class : " << it.GetMeasurementVector()[0] << std::endl; + otbLogMacro(Debug, << "class : " << it.GetMeasurementVector()[0]); ++it; } for (unsigned int i = 0; i < testingFiles.size(); ++i) { - std::cout << "ground truth class : " << testingGTClasses[i] << std::endl; + otbLogMacro(Debug, << "ground truth class : " << testingGTClasses[i]); } //Compute confusion matrix @@ -236,9 +238,8 @@ int otbReduceSpectralResponseSVMClassifier(int argc, char * argv[]) confMatCalc->SetProducedLabels(classifierListLabel); confMatCalc->Compute(); - std::cout << std::endl; - std::cout << "Confusion matrix: " << std::endl << confMatCalc->GetConfusionMatrix() << std::endl << std::endl; - std::cout << "Kappa Index: " << std::endl << confMatCalc->GetKappaIndex() << std::endl << std::endl; + otbLogMacro(Info, << "Confusion matrix: " << std::endl << confMatCalc->GetConfusionMatrix()); + otbLogMacro(Info, << "Kappa Index: " << std::endl << confMatCalc->GetKappaIndex()); return EXIT_SUCCESS; } diff --git a/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx b/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx index 4fe40bf15f1301572a47391d9f85b45964c7f2a1..fb5b72baec1387016eef0cd863dd5b92dc592f78 100644 --- a/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx +++ b/Modules/Radiometry/Simulation/test/otbSatelliteRSR.cxx @@ -44,13 +44,8 @@ int otbSatelliteRSR(int argc, char * argv[]) unsigned int NumBand = atoi(argv[4]); double lambda = atof(argv[3]); - std::cout << myResponse <<std::endl; - std::cout << "RSR("<<lambda<<","<< NumBand <<")= " << (*myResponse)(lambda, NumBand) << std::endl; -// for(unsigned int i=0; i<myResponse->GetRSR()[NumBand]->GetResponse().size(); ++i) -// { -// std::cout << "RSR("<<myResponse->GetRSR()[NumBand]->GetResponse()[i]->first<<","<< NumBand <<")= " << myResponse->GetRSR()[NumBand]->GetResponse()[i]->second << std::endl; -// } - + otbLogMacro(Debug, << myResponse); + otbLogMacro(Info, << "RSR("<<lambda<<","<< NumBand <<")= " << (*myResponse)(lambda, NumBand)); return EXIT_SUCCESS; } diff --git a/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx b/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx index cd1413d226f1b33a6e344ba2eb2a4b6a54402cd8..e0aaa4e94c446c310e18688dc977df90799f5b57 100644 --- a/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx +++ b/Modules/Radiometry/Simulation/test/otbSpectralResponse.cxx @@ -45,7 +45,7 @@ int otbSpectralResponse(int argc, char * argv[]) ImageType::Pointer image = ImageType::New(); myResponse->GetImage(image); - std::cout<<myResponse<<std::endl; - std::cout << "SpectResponse("<<lambda<<")= " << (*myResponse)(lambda) << std::endl; + otbLogMacro(Debug, << myResponse); + otbLogMacro(Info, << "SpectResponse("<<lambda<<")= " << (*myResponse)(lambda)); return EXIT_SUCCESS; } 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/Remote/temporal-gapfilling.remote.cmake b/Modules/Remote/temporal-gapfilling.remote.cmake index 0939185711b629f2a54a2648ab9935c1759d20b2..6e7b1f77e7fa8e49fab0e3e141729f5083af4c62 100644 --- a/Modules/Remote/temporal-gapfilling.remote.cmake +++ b/Modules/Remote/temporal-gapfilling.remote.cmake @@ -26,6 +26,5 @@ A more detailed description can be found on the project website: https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling " GIT_REPOSITORY https://gitlab.orfeo-toolbox.org/jinglada/temporalgapfilling.git - # Commit on develop branch which includes patches for Windows support - GIT_TAG 9d97764f0411de1a32dd5e0a90bdcdd8adfa049f + GIT_TAG master ) diff --git a/Modules/Segmentation/Conversion/test/CMakeLists.txt b/Modules/Segmentation/Conversion/test/CMakeLists.txt index fa65b73233189ee8f31ceda1981f381a827f8e7a..b704bd6275d83837200861e7448c820f89dda0ac 100644 --- a/Modules/Segmentation/Conversion/test/CMakeLists.txt +++ b/Modules/Segmentation/Conversion/test/CMakeLists.txt @@ -128,6 +128,7 @@ otb_add_test(NAME bfTvVectorDataRasterizeFilterSHP COMMAND otbConversionTestDriv --compare-image 0.0001 ${BASELINE}/bfTvVectorDataRasterizeFilter_OutputSHP.tif ${TEMP}/bfTvVectorDataRasterizeFilter_OutputSHP.tif + --tolerance-ratio 0.01 otbVectorDataRasterizeFilter ${INPUTDATA}/QB_Toulouse_Ortho_XS.tif ${INPUTDATA}/Capitole-Shadows.shp @@ -194,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/MPI/otb-module-init.cmake b/Modules/ThirdParty/MPI/otb-module-init.cmake index 6d4f3673db59cee99a7ac83d0e0ae6a0483276cd..39665d6ad48fe54fdc175fca64c45c0529dbe738 100644 --- a/Modules/ThirdParty/MPI/otb-module-init.cmake +++ b/Modules/ThirdParty/MPI/otb-module-init.cmake @@ -19,3 +19,5 @@ # find_package ( MPI REQUIRED ) + +set(OTB_MPIEXEC_OPT "" CACHE STRING "Additional options for mpiexec tests") 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/ThirdParty/Shark/include/otbSharkUtils.h b/Modules/ThirdParty/Shark/include/otbSharkUtils.h index da56981943b33203ea3f2d5cc442d3bd737395e3..4ab8c0fdfe62e2f8a97638271354f684ea6b9f87 100644 --- a/Modules/ThirdParty/Shark/include/otbSharkUtils.h +++ b/Modules/ThirdParty/Shark/include/otbSharkUtils.h @@ -135,13 +135,18 @@ template <class T> void ListSampleToSharkVector(const T * listSample, std::vecto } /** Shark assumes that labels are 0 ... (nbClasses-1). This function modifies the labels contained in the input vector and returns a vector with size = nbClasses which allows the translation from the normalised labels to the new ones oldLabel = dictionary[newLabel]. +When we want to generate the image containing the probability for each class, we need to ensure that the probabilities are in the correct order wrt the incoming labels. We therefore sort the labels before building the encoding. */ template <typename T> void NormalizeLabelsAndGetDictionary(std::vector<T>& labels, std::vector<T>& dictionary) { + std::vector<T> sorted_labels = labels; + std::sort(std::begin(sorted_labels), std::end(sorted_labels)); + auto last = std::unique(std::begin(sorted_labels), std::end(sorted_labels)); + sorted_labels.erase(last, std::end(sorted_labels)); std::unordered_map<T, T> dictMap; T labelCount{0}; - for(const auto& l : labels) + for(const auto& l : sorted_labels) { if(dictMap.find(l)==dictMap.end()) dictMap.insert({l, labelCount++}); diff --git a/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx b/Modules/Visualization/Monteverdi/src/mvdMainWindow.cxx index bc26e07f5895a108c5fe37dfa81407d5f3fd2190..35070d00b1d89ea7befc6c61d6253681905d1c8b 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()== 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/mvdQtWidgetParameterInitializers.h b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h index 313f8f1537af75ef500d0bff91a93d1b94bd204f..1be6f7514f2db902f0194de47ce26f78e8ac99a2 100644 --- a/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h +++ b/Modules/Visualization/MonteverdiGui/include/mvdQtWidgetParameterInitializers.h @@ -90,7 +90,7 @@ namespace Wrapper */ template< typename W > void -SetupForFilenameDrop( W* widget, const char* text =NULL ); +SetupForFilenameDrop( W* widget ); /** */ @@ -376,7 +376,7 @@ FileSelectionInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -387,7 +387,7 @@ InputImageInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -409,7 +409,7 @@ InputFilenameInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -431,7 +431,7 @@ InputVectorDataInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -453,7 +453,7 @@ InputProcessXMLInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); } /*****************************************************************************/ @@ -494,7 +494,7 @@ OutputImageInitializer if( m_Prefix.isEmpty() ) { - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -518,7 +518,7 @@ OutputVectorDataInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -534,7 +534,7 @@ OutputFilenameInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -550,7 +550,7 @@ OutputProcessXMLInitializer { assert( widget!=NULL ); - SetupForFilenameDrop( widget, "You can drop filename here." ); + SetupForFilenameDrop( widget ); assert( qApp!=NULL ); assert( !qApp->arguments().empty() ); @@ -592,7 +592,7 @@ ParameterListInitializer /*****************************************************************************/ template< typename W > void -SetupForFilenameDrop( W* widget, const char* text ) +SetupForFilenameDrop( W* widget ) { assert( widget!=NULL ); @@ -602,15 +602,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/mvdQtWidgetView.cxx b/Modules/Visualization/MonteverdiGui/src/mvdQtWidgetView.cxx index 53c723bc811bc7fba33e89e8d032f9c74df110bc..d074c1aae4c92205f06daacdc0420222233930dc 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; } @@ -211,197 +197,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 +308,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 d53f70c266f4b9e8f59aa68ee033ba2fd384dfb8..3baadd6f0f747b5f640b284fd3bd6a7aeab79254 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.h @@ -765,13 +765,13 @@ public: void SetParameterImageBase(const std::string & key, ImageBaseType* img, unsigned int idx = 0); /** - Register all ProcessObject that are linked to parameters : + Register all ProcessObject that are linked to parameters : \li ParameterType_OutputImage \li ParameterType_OutputVectorData - Those ProcessObjects are stored in the m_Filters set and are deleted at the + Those ProcessObjects are stored in the m_Filters set and are deleted at the end of ExecuteAndWriteOutput (if there are only held by the set) - This method can be called just before the end of a DoExecute in a derived + This method can be called just before the end of a DoExecute in a derived class of Application. */ void RegisterPipeline(); @@ -850,21 +850,7 @@ protected: * \li ParameterType_InputImage */ template <class TImageType> - TImageType* GetParameterImage(std::string parameter) - { - typename TImageType::Pointer ret; - Parameter* param = GetParameterByKey(parameter); - InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param); - if (paramDown) - { - return paramDown->GetImage<TImageType>(); - } - else - { - itkExceptionMacro(<<parameter << " parameter can't be casted to ImageType"); - return nullptr; - } - } + TImageType* GetParameterImage(std::string parameter); /** Declare a parameter as having an automatic value */ void AutomaticValueOn(std::string paramKey); @@ -878,16 +864,7 @@ protected: * \li ParameterType_OutputImage */ template <class TImageType> - void SetParameterOutputImage(std::string parameter, TImageType* value) - { - Parameter* param = GetParameterByKey(parameter); - - if (dynamic_cast<OutputImageParameter*>(param)) - { - OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param); - paramDown->SetValue(value); - } - } + void SetParameterOutputImage(std::string parameter, TImageType* value); private: /* Implement this method to add parameters */ @@ -963,9 +940,90 @@ private: } //end namespace otb -//#ifndef OTB_MANUAL_INSTANTIATION -//#include "otbWrapperApplication.hxx" -//#endif +#ifndef OTB_MANUAL_INSTANTIATION +#include "otbWrapperApplication.hxx" +#endif + + +namespace otb +{ +namespace Wrapper +{ + +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8VectorImageType* Application::GetParameterImage<UInt8VectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE Int16VectorImageType* Application::GetParameterImage<Int16VectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt16VectorImageType* Application::GetParameterImage<UInt16VectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE Int32VectorImageType* Application::GetParameterImage<Int32VectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt32VectorImageType* Application::GetParameterImage<UInt32VectorImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE FloatVectorImageType* Application::GetParameterImage<FloatVectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE DoubleVectorImageType* Application::GetParameterImage<DoubleVectorImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt16VectorImageType* Application::GetParameterImage<ComplexInt16VectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt32VectorImageType* Application::GetParameterImage<ComplexInt32VectorImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexFloatVectorImageType* Application::GetParameterImage<ComplexFloatVectorImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexDoubleVectorImageType* Application::GetParameterImage<ComplexDoubleVectorImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8RGBImageType* Application::GetParameterImage<UInt8RGBImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8RGBAImageType* Application::GetParameterImage<UInt8RGBAImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt8ImageType* Application::GetParameterImage<UInt8ImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE Int16ImageType* Application::GetParameterImage<Int16ImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt16ImageType* Application::GetParameterImage<UInt16ImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE Int32ImageType* Application::GetParameterImage<Int32ImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE UInt32ImageType* Application::GetParameterImage<UInt32ImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE FloatImageType* Application::GetParameterImage<FloatImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE DoubleImageType* Application::GetParameterImage<DoubleImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt16ImageType* Application::GetParameterImage<ComplexInt16ImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexInt32ImageType* Application::GetParameterImage<ComplexInt32ImageType>(std::string); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexFloatImageType* Application::GetParameterImage<ComplexFloatImageType>(std::string); +extern template OTBApplicationEngine_EXPORT_TEMPLATE ComplexDoubleImageType* Application::GetParameterImage<ComplexDoubleImageType>(std::string); + +// + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8VectorImageType>(std::string, UInt8VectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int16VectorImageType>(std::string, Int16VectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt16VectorImageType>(std::string, UInt16VectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int32VectorImageType>(std::string, Int32VectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt32VectorImageType>(std::string, UInt32VectorImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<FloatVectorImageType>(std::string, FloatVectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<DoubleVectorImageType>(std::string, DoubleVectorImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16VectorImageType>(std::string, + ComplexInt16VectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32VectorImageType>(std::string, + ComplexInt32VectorImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatVectorImageType>(std::string, + ComplexFloatVectorImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleVectorImageType>(std::string, + ComplexDoubleVectorImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBImageType>(std::string, UInt8RGBImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBAImageType>(std::string, UInt8RGBAImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt8ImageType>(std::string, UInt8ImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int16ImageType>(std::string, Int16ImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt16ImageType>(std::string, UInt16ImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<Int32ImageType>(std::string, Int32ImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<UInt32ImageType>(std::string, UInt32ImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<FloatImageType>(std::string, FloatImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<DoubleImageType>(std::string, DoubleImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16ImageType>(std::string, ComplexInt16ImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32ImageType>(std::string, ComplexInt32ImageType*); + +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatImageType>(std::string, ComplexFloatImageType*); +extern template OTBApplicationEngine_EXPORT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleImageType>(std::string, ComplexDoubleImageType*); + +} // namespace Wrapper +} // namespace otb #endif // otbWrapperApplication_h_ diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx new file mode 100644 index 0000000000000000000000000000000000000000..33330cd2418fa7c81e506806d6a43b3d9d583f23 --- /dev/null +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperApplication.hxx @@ -0,0 +1,76 @@ +/* + * 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 otbWrapperApplication_hxx +#define otbWrapperApplication_hxx + + +#include "otbWrapperApplication.h" + + +namespace otb +{ + + +namespace Wrapper +{ + + +template <class TImageType> +TImageType* +Application +::GetParameterImage(std::string parameter) + +{ + typename TImageType::Pointer ret; + Parameter* param = GetParameterByKey(parameter); + InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param); + if (paramDown) + { + return paramDown->GetImage<TImageType>(); + } + else + { + itkExceptionMacro(<<parameter << " parameter can't be casted to ImageType"); + return nullptr; + } +} + + +template <class TImageType> +void +Application +::SetParameterOutputImage(std::string parameter, TImageType* value) +{ + Parameter* param = GetParameterByKey(parameter); + + if (dynamic_cast<OutputImageParameter*>(param)) + { + OutputImageParameter* paramDown = dynamic_cast<OutputImageParameter*>(param); + paramDown->SetValue(value); + } +} + + +} // End namespace Wrapper + +} // End namespace otb + +#endif diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h new file mode 100644 index 0000000000000000000000000000000000000000..0e975d7adc2fea303e776ad7202cda5e7852f689 --- /dev/null +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperCastImage.h @@ -0,0 +1,153 @@ +/* + * 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 otbWrapperCastimage_h +#define otbWrapperCastimage_h + + +#include "otbClampImageFilter.h" + +#include "OTBApplicationEngineExport.h" + +#include "otbWrapperTypes.h" + + +namespace otb +{ +namespace Wrapper +{ +namespace details +{ + +/** \class CastImage + * \brief Helper class (private) which casts and clamps input-image type into + * output-image type. + * + * \ingroup OTBApplicationEngine + */ +template <typename TOutputImage, typename TInputImage> +struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage +{ + /** Input clamping */ + using InputClampImageFilter = ClampImageFilter<TInputImage, DoubleVectorImageType>; + + /** Output clamping */ + using OutputClampImageFilter = ClampImageFilter<DoubleVectorImageType, TOutputImage>; + + + /** Constructor. */ + CastImage(TInputImage* in) : icif(InputClampImageFilter::New()), ocif(OutputClampImageFilter::New()), out(ocif->GetOutput()) + { + assert(in); + + icif->SetInput(in); + + ocif->SetInput(icif->GetOutput()); + } + + /** Input-image clamp filter. */ + typename InputClampImageFilter::Pointer icif; + + /** Output-image clamp filter. */ + typename OutputClampImageFilter::Pointer ocif; + + /** Output image. */ + TOutputImage* out; +}; + + +/** \class CastImage + * \brief Partial template specialization which optimizes processing + * pipeline when input-image is DoubleVectorImageType. + * + * \ingroup OTBApplicationEngine + */ +template <typename TOutputImage> +struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<TOutputImage, DoubleVectorImageType> +{ + /** Output clamping */ + using OutputClampImageFilter = ClampImageFilter<DoubleVectorImageType, TOutputImage>; + + + /** Constructor. */ + CastImage(DoubleVectorImageType* in) : ocif(OutputClampImageFilter::New()), out(ocif->GetOutput()) + { + assert(in); + + ocif->SetInput(in); + } + + /** Input-image clamp filter. */ + itk::ProcessObject::Pointer icif; + + /** Output-image clamp filter. */ + typename OutputClampImageFilter::Pointer ocif; + + /** Output image. */ + TOutputImage* out; +}; + + +/** \class CastImage + * \brief Template specialization which optimizes the processing + * pipeline when input-image and output-image types are identical. + * + * \ingroup OTBApplicationEngine + */ +template <typename T> +struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<T, T> +{ + CastImage(T* in) : out(in) + { + assert(in); + } + + itk::ProcessObject::Pointer icif; + itk::ProcessObject::Pointer ocif; + T* out; +}; + + +/** \class CastImage + * \brief Template specialization which optimizes the processing + * pipeline when input-image and output-image types are identical. + * + * \ingroup OTBApplicationEngine + */ +template <> +struct OTBApplicationEngine_EXPORT_TEMPLATE CastImage<DoubleVectorImageType, DoubleVectorImageType> +{ + CastImage(DoubleVectorImageType* in) : out(in) + { + assert(in); + } + + itk::ProcessObject::Pointer icif; + itk::ProcessObject::Pointer ocif; + DoubleVectorImageType* out; +}; + +} // namespace details. + +} // namespace Wrapper + +} // namespace otb + +#endif diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h index 80aefb371880dc53c0272de0496152b26f0c7a79..a49e4c2bfb477da878372e778b3174755361d5d3 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.h @@ -21,9 +21,13 @@ #ifndef otbWrapperInputImageParameter_h #define otbWrapperInputImageParameter_h + #include "otbImageFileReader.h" -#include "itkImageBase.h" +#include "otbClampImageFilter.h" #include "otbWrapperParameter.h" + +#include "itkImageBase.h" + #include <string> namespace otb @@ -56,27 +60,28 @@ public: itkGetConstReferenceMacro( FileName, std::string ); - /** Get the input image as FloatVectorImageType. */ - FloatVectorImageType* GetImage(); + /** Get input-image as ImageBaseType. */ + ImageBaseType const* GetImage() const; + ImageBaseType* GetImage(); /** Get the input image as XXXImageType */ - UInt8ImageType* GetUInt8Image(); + UInt8ImageType* GetUInt8Image(); UInt16ImageType* GetUInt16Image(); - Int16ImageType* GetInt16Image(); + Int16ImageType* GetInt16Image(); UInt32ImageType* GetUInt32Image(); - Int32ImageType* GetInt32Image(); - FloatImageType* GetFloatImage(); + Int32ImageType* GetInt32Image(); + FloatImageType* GetFloatImage(); DoubleImageType* GetDoubleImage(); - UInt8VectorImageType* GetUInt8VectorImage(); + UInt8VectorImageType* GetUInt8VectorImage(); UInt16VectorImageType* GetUInt16VectorImage(); - Int16VectorImageType* GetInt16VectorImage(); + Int16VectorImageType* GetInt16VectorImage(); UInt32VectorImageType* GetUInt32VectorImage(); - Int32VectorImageType* GetInt32VectorImage(); - FloatVectorImageType* GetFloatVectorImage(); + Int32VectorImageType* GetInt32VectorImage(); + FloatVectorImageType* GetFloatVectorImage(); DoubleVectorImageType* GetDoubleVectorImage(); - UInt8RGBImageType* GetUInt8RGBImage(); + UInt8RGBImageType* GetUInt8RGBImage(); UInt8RGBAImageType* GetUInt8RGBAImage(); // Complex image @@ -94,12 +99,8 @@ public: template <class TImageType> TImageType* GetImage(); - /** Set a FloatVectorImageType image.*/ - void SetImage(FloatVectorImageType* image); - /** Set a templated image.*/ - template <class TImageType> - void SetImage(TImageType* image); + void SetImage(ImageBaseType* image); /** Generic cast method that will be specified for each image type. */ @@ -120,48 +121,30 @@ protected: /** Destructor */ ~InputImageParameter() override; - ImageBaseType::Pointer m_Image; - std::string m_FileName; - - /** Readers typedefs */ - - typedef otb::ImageFileReader<UInt8ImageType> UInt8ReaderType; - typedef otb::ImageFileReader<Int16ImageType> Int16ReaderType; - typedef otb::ImageFileReader<UInt16ImageType> UInt16ReaderType; - typedef otb::ImageFileReader<Int32ImageType> Int32ReaderType; - typedef otb::ImageFileReader<UInt32ImageType> UInt32ReaderType; - typedef otb::ImageFileReader<FloatImageType> FloatReaderType; - typedef otb::ImageFileReader<DoubleImageType> DoubleReaderType; - - typedef otb::ImageFileReader<UInt8VectorImageType> UInt8VectorReaderType; - typedef otb::ImageFileReader<Int16VectorImageType> Int16VectorReaderType; - typedef otb::ImageFileReader<UInt16VectorImageType> UInt16VectorReaderType; - typedef otb::ImageFileReader<Int32VectorImageType> Int32VectorReaderType; - typedef otb::ImageFileReader<UInt32VectorImageType> UInt32VectorReaderType; - typedef otb::ImageFileReader<FloatVectorImageType> FloatVectorReaderType; - typedef otb::ImageFileReader<DoubleVectorImageType> DoubleVectorReaderType; +private: + InputImageParameter(const Parameter&) = delete; + void operator=(const Parameter&) = delete; + std::string m_FileName; + itk::ProcessObject::Pointer m_Reader; - typedef otb::ImageFileReader<UInt8RGBImageType> UInt8RGBReaderType; - typedef otb::ImageFileReader<UInt8RGBAImageType> UInt8RGBAReaderType; + ImageBaseType::Pointer m_Image; - // Complex - typedef otb::ImageFileReader<ComplexInt16ImageType> ComplexInt16ReaderType; - typedef otb::ImageFileReader<ComplexInt32ImageType> ComplexInt32ReaderType; - typedef otb::ImageFileReader<ComplexFloatImageType> ComplexFloatReaderType; - typedef otb::ImageFileReader<ComplexDoubleImageType> ComplexDoubleReaderType; + itk::ProcessObject::Pointer m_InputCaster; + itk::ProcessObject::Pointer m_OutputCaster; - typedef otb::ImageFileReader<ComplexInt16VectorImageType> ComplexInt16VectorReaderType; - typedef otb::ImageFileReader<ComplexInt32VectorImageType> ComplexInt32VectorReaderType; - typedef otb::ImageFileReader<ComplexFloatVectorImageType> ComplexFloatVectorReaderType; - typedef otb::ImageFileReader<ComplexDoubleVectorImageType> ComplexDoubleVectorReaderType; +private: + /** */ + template <typename T> + using InputClampImageFilter = ClampImageFilter<T, otb::Wrapper::DoubleVectorImageType>; - itk::ProcessObject::Pointer m_Reader; - itk::ProcessObject::Pointer m_Caster; + /** */ + template <typename T> + using OutputClampImageFilter = ClampImageFilter<otb::Wrapper::DoubleVectorImageType, T>; -private: - InputImageParameter(const Parameter &) = delete; - void operator =(const Parameter&) = delete; + /** */ + template <typename TOutputImage, typename TInputImage> + TOutputImage* Cast(TInputImage*); /** Store the loaded image filename */ std::string m_PreviousFileName; diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx index eb0f507910c6baf093bcb2297784fa6bad00f35c..37ffbd7efae807466a60d05f708ea29ac271c49f 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperInputImageParameter.hxx @@ -23,7 +23,7 @@ #include "otbWrapperInputImageParameter.h" -#include "otbClampImageFilter.h" +#include "otbWrapperCastImage.h" namespace otb { @@ -31,7 +31,70 @@ namespace Wrapper { -#define INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION 0 +#define CLAMP_IMAGE_IF( Out, In, image_base ) \ + { \ + In * in_image = dynamic_cast< In * >( image_base ); \ + \ + if( in_image ) \ + return Cast< Out, In >( in_image ); \ + } + +#define CLAMP_IMAGE_BASE( T, image_base ) \ + { \ + CLAMP_IMAGE_IF( T, UInt8VectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, Int16VectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, UInt16VectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, Int32VectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, UInt32VectorImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, FloatVectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, DoubleVectorImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, ComplexInt16VectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, ComplexInt32VectorImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, ComplexFloatVectorImageType, image_base ); \ + CLAMP_IMAGE_IF( T, ComplexDoubleVectorImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, UInt8RGBImageType, image_base ); \ + CLAMP_IMAGE_IF( T, UInt8RGBAImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, UInt8ImageType, image_base ); \ + CLAMP_IMAGE_IF( T, Int16ImageType, image_base ); \ + CLAMP_IMAGE_IF( T, UInt16ImageType, image_base ); \ + CLAMP_IMAGE_IF( T, Int32ImageType, image_base ); \ + CLAMP_IMAGE_IF( T, UInt32ImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, FloatImageType, image_base ); \ + CLAMP_IMAGE_IF( T, DoubleImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, ComplexInt16ImageType, image_base ); \ + CLAMP_IMAGE_IF( T, ComplexInt32ImageType, image_base ); \ + \ + CLAMP_IMAGE_IF( T, ComplexFloatImageType, image_base ); \ + CLAMP_IMAGE_IF( T, ComplexDoubleImageType, image_base ); \ + \ + return nullptr; \ + } + + +template< typename TOutputImage, + typename TInputImage > +TOutputImage * +InputImageParameter +::Cast( TInputImage * image ) +{ + details::CastImage< TOutputImage, TInputImage > clamp( image ); + + if( clamp.ocif ) + clamp.ocif->UpdateOutputInformation(); + + m_InputCaster = clamp.icif; + m_OutputCaster = clamp.ocif; + + return clamp.out; +} + template <class TImageType> TImageType* @@ -68,10 +131,6 @@ InputImageParameter::GetImage() } else { -#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION - return dynamic_cast< TImageType* >( m_Image.GetPointer() ); - -#else // INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION // In this case, the reader and the image should already be there if (m_Image.IsNull()) { @@ -89,7 +148,6 @@ InputImageParameter::GetImage() itkExceptionMacro("Cannot ask a different image type"); } } -#endif // INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION } } @@ -98,119 +156,10 @@ InputImageParameter::GetImage() //////////////////////// Image case: if (m_Image.IsNull()) { -#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION - itkExceptionMacro("No input image or filename detected..."); -#else return nullptr; -#endif } else - { - if (dynamic_cast<UInt8ImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt8ImageType, TImageType> (); - } - else if (dynamic_cast<Int16ImageType*> (m_Image.GetPointer())) - { - return CastImage<Int16ImageType, TImageType> (); - } - else if (dynamic_cast<UInt16ImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt16ImageType, TImageType> (); - } - else if (dynamic_cast<Int32ImageType*> (m_Image.GetPointer())) - { - return CastImage<Int32ImageType, TImageType> (); - } - else if (dynamic_cast<UInt32ImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt32ImageType, TImageType> (); - } - else if (dynamic_cast<FloatImageType*> (m_Image.GetPointer())) - { - return CastImage<FloatImageType, TImageType> (); - } - else if (dynamic_cast<DoubleImageType*> (m_Image.GetPointer())) - { - return CastImage<DoubleImageType, TImageType> (); - } - else if (dynamic_cast<ComplexInt16ImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexInt16ImageType, TImageType>(); - } - else if (dynamic_cast<ComplexInt32ImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexInt32ImageType, TImageType>(); - } - else if (dynamic_cast<ComplexFloatImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexFloatImageType, TImageType>(); - } - else if (dynamic_cast<ComplexDoubleImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexDoubleImageType, TImageType>(); - } - else if (dynamic_cast<UInt8VectorImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt8VectorImageType, TImageType> (); - } - else if (dynamic_cast<Int16VectorImageType*> (m_Image.GetPointer())) - { - return CastImage<Int16VectorImageType, TImageType> (); - } - else if (dynamic_cast<UInt16VectorImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt16VectorImageType, TImageType> (); - } - else if (dynamic_cast<Int32VectorImageType*> (m_Image.GetPointer())) - { - return CastImage<Int32VectorImageType, TImageType> (); - } - else if (dynamic_cast<UInt32VectorImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt32VectorImageType, TImageType> (); - } - else if (dynamic_cast<FloatVectorImageType*> (m_Image.GetPointer())) - { - return CastImage<FloatVectorImageType, TImageType> (); - } - else if (dynamic_cast<DoubleVectorImageType*> (m_Image.GetPointer())) - { - return CastImage<DoubleVectorImageType, TImageType> (); - } - else if (dynamic_cast<UInt8RGBAImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt8RGBAImageType, TImageType> (); - } - else if (dynamic_cast<UInt8RGBImageType*> (m_Image.GetPointer())) - { - return CastImage<UInt8RGBImageType, TImageType> (); - } - else if (dynamic_cast<ComplexInt16VectorImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexInt16VectorImageType, TImageType>(); - } - else if (dynamic_cast<ComplexInt32VectorImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexInt32VectorImageType, TImageType>(); - } - else if (dynamic_cast<ComplexFloatVectorImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexFloatVectorImageType, TImageType>(); - } - else if (dynamic_cast<ComplexDoubleVectorImageType*>(m_Image.GetPointer())) - { - return CastImage<ComplexDoubleVectorImageType, TImageType>(); - } - else - { -#if INPUT_IMAGE_PARAMETER_GET_IMAGE_EXCEPTION - itkExceptionMacro("Unknown image type"); -#else - return nullptr; -#endif - } - } + CLAMP_IMAGE_BASE( TImageType, m_Image.GetPointer() ); } } @@ -221,41 +170,6 @@ ImageBaseType* InputImageParameter::GetImage<ImageBaseType>(); -template <class TInputImage, class TOutputImage> -TOutputImage* -InputImageParameter::CastImage() -{ - if ( dynamic_cast<TOutputImage*> (m_Image.GetPointer()) ) - { - return dynamic_cast<TOutputImage*> (m_Image.GetPointer()); - } - else - { - TInputImage* realInputImage = dynamic_cast<TInputImage*>(m_Image.GetPointer()); - - typedef ClampImageFilter<TInputImage, TOutputImage> CasterType; - typename CasterType::Pointer caster = CasterType::New(); - - caster->SetInput(realInputImage); - caster->UpdateOutputInformation(); - - m_Image = caster->GetOutput(); - m_Caster = caster; - - return caster->GetOutput(); - } - // itkExceptionMacro("Cast from "<<typeid(TInputImage).name()<<" to "<<typeid(TOutputImage).name()<<" not authorized."); -} - -template <class TInputImage> -void -InputImageParameter::SetImage(TInputImage* image) -{ - m_UseFilename = false; - m_Image = image; -} - - } // End namespace Wrapper } // End namespace otb diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h index 5a454d57bae108501f0822770616775ed914034e..ec7a1a8f859118d6d63c12872476647fe54b062d 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputImageParameter.h @@ -27,6 +27,7 @@ #include "otbImageFileWriter.h" #include <string> + namespace otb { namespace Wrapper @@ -126,36 +127,34 @@ protected: /** Destructor */ ~OutputImageParameter() override; - template <class TInput> - int SwitchInput(TInput *img); - - //FloatVectorImageType::Pointer m_Image; - ImageBaseType::Pointer m_Image; - std::string m_FileName; - ImagePixelType m_PixelType; - ImagePixelType m_DefaultPixelType; - private: OutputImageParameter(const Parameter &) = delete; void operator =(const Parameter&) = delete; - unsigned int m_RAMValue; + /** Switch TInputImage according to expected output type. */ + template <typename TInputImage> + void SwitchInput(TInputImage*); + + /** */ + template <typename TOutputImage, typename TInputImage> + void ClampAndWriteVectorImage(TInputImage*); - itk::ProcessObject::Pointer m_Caster; + // FloatVectorImageType::Pointer m_Image; + ImageBaseType::Pointer m_Image; + + itk::ProcessObject::Pointer m_InputCaster; + itk::ProcessObject::Pointer m_OutputCaster; itk::ProcessObject::Pointer m_Writer; -}; // End class OutputImage Parameter + std::string m_FileName; -// Declare specialisation for UInt8RGBAImageType -template <> -int -OutputImageParameter::SwitchInput(UInt8RGBAImageType *img); + ImagePixelType m_PixelType; + ImagePixelType m_DefaultPixelType; -// Declare specialisation for UInt8RGBImageType -template <> -int -OutputImageParameter::SwitchInput(UInt8RGBImageType *img); + unsigned int m_RAMValue; + +}; // End class OutputImage Parameter } // End namespace Wrapper } // End namespace otb diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h index 5b19add53105b36ef412e459231f76179d7c4396..136489e96ba1cfc9acfff1d4a29f89ed9083d471 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperOutputProcessXMLParameter.h @@ -105,6 +105,8 @@ public: TiXmlElement* ParseApplication(Application::Pointer app); + static std::string MakeCommandLine(otb::Wrapper::Application::Pointer application); + protected: OutputProcessXMLParameter(); diff --git a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h index 0a93e62995f0dba21b7f35d89457d963d29b9c7e..6ab769e5eca20ac6d8c7b575680e32ca0b0de784 100644 --- a/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h +++ b/Modules/Wrappers/ApplicationEngine/include/otbWrapperParameter.h @@ -21,13 +21,18 @@ #ifndef otbWrapperParameter_h #define otbWrapperParameter_h -#include "otbMacro.h" -#include "itkObjectFactory.h" -#include "otbWrapperTypes.h" #include "OTBApplicationEngineExport.h" +#include "otbMacro.h" +#include "otbWrapperTypes.h" + + +#include <itkObjectFactory.h> + + #include <string> + namespace otb { namespace Wrapper @@ -65,11 +70,11 @@ public: /** Set/get the parameter key */ virtual void SetKey(const std::string&); virtual const char* GetKey() const; - + /** Set the parameter Active flag */ virtual void SetActive(bool flag); bool GetActive(bool recurseParents = false) const; - + /** Set the parameter Mandatory flag */ virtual void SetMandatory(bool flag); virtual bool GetMandatory() const; @@ -78,19 +83,19 @@ public: /** Set the parameter AutomaticValue flag (which is the opposite of UserValue)*/ virtual void SetAutomaticValue(bool flag); - + /** Get the parameter AutomaticValue flag */ virtual bool GetAutomaticValue() const; - + /** Toogle ON the parameter AutomaticValue flag */ void AutomaticValueOn(); - + /** Toogle OFF the parameter AutomaticValue flag */ void AutomaticValueOff(); /** Set the user access level */ virtual void SetUserLevel(const UserLevel level); - + /** Get the user access level */ virtual UserLevel GetUserLevel() const; @@ -104,7 +109,7 @@ public: * nothing */ virtual void Reset(); - + virtual bool HasValue() const = 0; virtual bool HasUserValue() const; diff --git a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt index 6f0b8809cb026b1b4143277ac45e41c4d9d62529..fb220c564fbe628d9e9469f6f3f438352caa6454 100644 --- a/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt +++ b/Modules/Wrappers/ApplicationEngine/src/CMakeLists.txt @@ -1,3 +1,4 @@ + # # Copyright (C) 2005-2019 Centre National d'Etudes Spatiales (CNES) # @@ -57,6 +58,7 @@ set( OTBApplicationEngine_SRC otbWrapperBoolParameter.cxx otbWrapperMetaDataHelper.cxx otbWrapperParameter.cxx + otbWrapperCastImage.cxx otbWrapperTypes.cxx ) diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx index 8c0d624ae5e2f79bf323b3c41d3821d0ad38a5b3..4297ae946d62476a88847a9974cd5aff72526fb3 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperApplication.cxx @@ -71,6 +71,80 @@ ExceptionObject(file, line, message, loc) namespace Wrapper { + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8VectorImageType* Application::GetParameterImage<UInt8VectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int16VectorImageType* Application::GetParameterImage<Int16VectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt16VectorImageType* Application::GetParameterImage<UInt16VectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int32VectorImageType* Application::GetParameterImage<Int32VectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt32VectorImageType* Application::GetParameterImage<UInt32VectorImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE FloatVectorImageType* Application::GetParameterImage<FloatVectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE DoubleVectorImageType* Application::GetParameterImage<DoubleVectorImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt16VectorImageType* Application::GetParameterImage<ComplexInt16VectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt32VectorImageType* Application::GetParameterImage<ComplexInt32VectorImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexFloatVectorImageType* Application::GetParameterImage<ComplexFloatVectorImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexDoubleVectorImageType* Application::GetParameterImage<ComplexDoubleVectorImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8RGBImageType* Application::GetParameterImage<UInt8RGBImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8RGBAImageType* Application::GetParameterImage<UInt8RGBAImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt8ImageType* Application::GetParameterImage<UInt8ImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int16ImageType* Application::GetParameterImage<Int16ImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt16ImageType* Application::GetParameterImage<UInt16ImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE Int32ImageType* Application::GetParameterImage<Int32ImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE UInt32ImageType* Application::GetParameterImage<UInt32ImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE FloatImageType* Application::GetParameterImage<FloatImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE DoubleImageType* Application::GetParameterImage<DoubleImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt16ImageType* Application::GetParameterImage<ComplexInt16ImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexInt32ImageType* Application::GetParameterImage<ComplexInt32ImageType>(std::string); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexFloatImageType* Application::GetParameterImage<ComplexFloatImageType>(std::string); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE ComplexDoubleImageType* Application::GetParameterImage<ComplexDoubleImageType>(std::string); + +// + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8VectorImageType>(std::string, UInt8VectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int16VectorImageType>(std::string, Int16VectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt16VectorImageType>(std::string, UInt16VectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int32VectorImageType>(std::string, Int32VectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt32VectorImageType>(std::string, UInt32VectorImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<FloatVectorImageType>(std::string, FloatVectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<DoubleVectorImageType>(std::string, DoubleVectorImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16VectorImageType>(std::string, + ComplexInt16VectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32VectorImageType>(std::string, + ComplexInt32VectorImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatVectorImageType>(std::string, + ComplexFloatVectorImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleVectorImageType>(std::string, + ComplexDoubleVectorImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBImageType>(std::string, UInt8RGBImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8RGBAImageType>(std::string, UInt8RGBAImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt8ImageType>(std::string, UInt8ImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int16ImageType>(std::string, Int16ImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt16ImageType>(std::string, UInt16ImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<Int32ImageType>(std::string, Int32ImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<UInt32ImageType>(std::string, UInt32ImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<FloatImageType>(std::string, FloatImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<DoubleImageType>(std::string, DoubleImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt16ImageType>(std::string, ComplexInt16ImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexInt32ImageType>(std::string, ComplexInt32ImageType*); + +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexFloatImageType>(std::string, ComplexFloatImageType*); +template OTBApplicationEngine_EXPORT_EXPLICIT_TEMPLATE void Application::SetParameterOutputImage<ComplexDoubleImageType>(std::string, ComplexDoubleImageType*); + + void Application::SetName( const std::string & name ) { m_Name = name; @@ -466,8 +540,7 @@ Application::RegisterPipeline() if ( GetParameterType(key) == ParameterType_OutputImage ) { Parameter* param = GetParameterByKey(key); - OutputImageParameter * outP = - dynamic_cast< OutputImageParameter * >( param ); + OutputImageParameter* outP = dynamic_cast<OutputImageParameter*>(param); itk::ImageBase< 2 > * outData = outP->GetValue(); if ( outData ) dataStack.push(outData); @@ -475,8 +548,7 @@ Application::RegisterPipeline() else if ( GetParameterType(key) == ParameterType_OutputVectorData ) { Parameter* param = GetParameterByKey(key); - OutputVectorDataParameter * outP = - dynamic_cast< OutputVectorDataParameter * >( param ); + OutputVectorDataParameter* outP = dynamic_cast<OutputVectorDataParameter*>(param); VectorDataType * outData = outP->GetValue(); if ( outData ) dataStack.push(outData); @@ -484,8 +556,7 @@ Application::RegisterPipeline() else if ( GetParameterType(key) == ParameterType_InputImage ) { Parameter* param = GetParameterByKey(key); - InputImageParameter * inP = - dynamic_cast< InputImageParameter * >( param ); + InputImageParameter* inP = dynamic_cast<InputImageParameter*>(param); if ( !inP->HasValue() ) continue; ImageBaseType * inData = inP->GetImage< ImageBaseType >(); @@ -495,13 +566,12 @@ Application::RegisterPipeline() else if ( GetParameterType(key) == ParameterType_InputImageList ) { Parameter * param = GetParameterByKey(key); - InputImageListParameter * inP = - dynamic_cast< InputImageListParameter * > ( param ); + InputImageListParameter* inP = dynamic_cast<InputImageListParameter*>(param); if ( !inP->HasValue() ) continue; const FloatVectorImageListType * list = inP->GetImageList(); - for ( auto it = list->Begin() ; it != list->End() ; ++it ) - { + for (auto it = list->Begin(); it != list->End(); ++it) + { FloatVectorImageType * inData = it.Get().GetPointer(); if ( inData && !inputData.count(inData) ) inputData.insert(inData); @@ -546,10 +616,9 @@ Application::RegisterPipeline() // if current is a list push every of its members in datastack if ( dynamic_cast< DataObjectListInterface *> (current) ) { - DataObjectListInterface * list = - dynamic_cast< DataObjectListInterface *> (current); - int length = list->Size(); - for ( int i = 0 ; i < length ; i++ ) + DataObjectListInterface* list = dynamic_cast<DataObjectListInterface*>(current); + int length = list->Size(); + for (int i = 0; i < length; i++) { itk::DataObject * newData = list->GetNthDataObject(i); if ( !current || inputData.count( current ) ) @@ -627,10 +696,9 @@ void Application::FreeRessources() // If input is a list if ( dynamic_cast< DataObjectListInterface *> (data.GetPointer()) ) { - DataObjectListInterface * list = - dynamic_cast< DataObjectListInterface *> (data.GetPointer()); - int length = list->Size(); - for ( int i = 0 ; i < length ; i++ ) + DataObjectListInterface* list = dynamic_cast<DataObjectListInterface*>(data.GetPointer()); + int length = list->Size(); + for (int i = 0; i < length; i++) { itk::DataObject * newData = list->GetNthDataObject(i); if ( !newData || dataSet.count( newData ) ) @@ -693,7 +761,7 @@ int Application::Execute() m_IsInPrivateDo = true; this->DoExecute(); m_IsInPrivateDo = false; - + // Ensure that all output image parameter have called UpdateOutputInformation() for (auto it = paramList.begin(); it != paramList.end(); ++it) { @@ -806,7 +874,7 @@ int Application::ExecuteAndWriteOutput() this->AfterExecuteAndWriteOutputs(); m_Chrono.Stop(); - + FreeRessources(); m_Filters.clear(); return status; @@ -1513,7 +1581,7 @@ Application::SetParameterImageBase(const std::string & key, ImageBaseType* img, if (dynamic_cast<InputImageParameter*>(param)) { InputImageParameter* paramDown = dynamic_cast<InputImageParameter*>(param); - paramDown->SetImage<ImageBaseType>(img); + paramDown->SetImage(img); } else if (dynamic_cast<InputImageListParameter*>(param)) { diff --git a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx similarity index 93% rename from Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx rename to Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx index fb60f6825789081e61c2b52bad4e851b9758170f..347954c65e2bc783195d69db17d8a7619f42a0c1 100644 --- a/Modules/Feature/SeamCarving/test/otbSeamCarvingTestDriver.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperCastImage.cxx @@ -18,8 +18,4 @@ * limitations under the License. */ -#include "otbTestMain.h" - -void RegisterTests() -{ -} +#include "otbWrapperCastImage.h" diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx index 65d6d6780585ceaa9bb696d18dbbc1da3b39f6dd..6959aba4ff523f3d14717e52babe45c43efae7b7 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperInputImageParameter.cxx @@ -24,6 +24,7 @@ #include "otbWrapperInputImageParameterMacros.h" #include "otb_boost_string_header.h" + namespace otb { @@ -62,12 +63,18 @@ InputImageParameter::SetFromFileName(const std::string& filename) } -FloatVectorImageType* -InputImageParameter::GetImage() +ImageBaseType* InputImageParameter ::GetImage() +{ + return m_Image.GetPointer(); +} + + +ImageBaseType const* InputImageParameter ::GetImage() const { - return this->GetImage<FloatVectorImageType>(); + return m_Image.GetPointer(); } + template <> ImageBaseType* InputImageParameter::GetImage<ImageBaseType>() @@ -81,21 +88,18 @@ InputImageParameter::GetImage<ImageBaseType>() otbGetImageMacro(UInt8RGBImage); otbGetImageMacro(UInt8RGBAImage); -void -InputImageParameter::SetImage(FloatVectorImageType* image) + +void InputImageParameter ::SetImage(ImageBaseType* image) { m_UseFilename = false; - this->SetImage<FloatVectorImageType>( image ); + m_Image = image; } bool InputImageParameter::HasValue() const { - if( m_FileName.empty() && m_Image.IsNull() ) - return false; - else - return true; + return !m_FileName.empty() || !m_Image.IsNull(); } void @@ -104,7 +108,8 @@ InputImageParameter { m_Image = nullptr; m_Reader = nullptr; - m_Caster = nullptr; + m_InputCaster = nullptr; + m_OutputCaster = nullptr; m_FileName = ""; m_PreviousFileName=""; m_UseFilename = true; diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx index 7dcd30d0bfebe934c618c9a9ea43fc6d6e65b191..39b36a355b29517de756b0193206a053434fff36 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputImageParameter.cxx @@ -19,35 +19,54 @@ */ #include "otbWrapperOutputImageParameter.h" + #include "otbClampImageFilter.h" #include "otbImageIOFactory.h" -#include "itksys/SystemTools.hxx" +#include "otbWrapperCastImage.h" #ifdef OTB_USE_MPI - #include "otbMPIConfig.h" #include "otbMPIVrtWriter.h" - #ifdef OTB_USE_SPTW #include "otbSimpleParallelTiffWriter.h" #endif - #endif +#include "itksys/SystemTools.hxx" + + +#define CAST_IMAGE_BASE(T, image_base) \ + { \ + T* img = dynamic_cast<T*>(image_base); \ + \ + if (img) \ + { \ + SwitchInput<T>(img); \ + \ + return; \ + } \ + } + + namespace otb { namespace Wrapper { -OutputImageParameter::OutputImageParameter() - : m_PixelType(ImagePixelType_float), - m_DefaultPixelType(ImagePixelType_float), - m_RAMValue(0), - m_Caster(nullptr), - m_Writer(nullptr) + +// Declare specialisation for UInt8RGBAImageType +template <> +void OutputImageParameter::SwitchInput(UInt8RGBAImageType*); + +// Declare specialisation for UInt8RGBImageType +template <> +void OutputImageParameter::SwitchInput(UInt8RGBImageType*); + + +OutputImageParameter::OutputImageParameter() : m_PixelType(ImagePixelType_float), m_DefaultPixelType(ImagePixelType_float), m_RAMValue(0) { - this->SetName("Output Image"); - this->SetKey("out"); + SetName("Output Image"); + SetKey("out"); } @@ -57,6 +76,9 @@ OutputImageParameter::~OutputImageParameter() std::string OutputImageParameter::ConvertPixelTypeToString(ImagePixelType type) { + // TODO: Could be replaced by constant static string array e.g.: + // return PIXEL_TYPE_NAME[ type ]; + std::string ret; switch(type) { @@ -122,6 +144,9 @@ std::string OutputImageParameter::ConvertPixelTypeToString(ImagePixelType type) bool OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePixelType &type) { + // TODO: Could be replaced std::find_if() in constant static string + // array (see ::ConvertPixelTypeToString(). + if (value == "uint8") type = ImagePixelType_uint8; else if (value == "int16") @@ -149,278 +174,207 @@ OutputImageParameter::ConvertStringToPixelType(const std::string &value, ImagePi return true; } -void OutputImageParameter::InitializeWriters() + +void OutputImageParameter ::InitializeWriters() { - ImageBaseType* imgBase = m_Image.GetPointer(); - // Guess the image type - std::string className(m_Image->GetNameOfClass()); - if (className == "VectorImage") - { - UInt8VectorImageType* imgUInt8 = dynamic_cast<UInt8VectorImageType*>(imgBase); - if (imgUInt8 && SwitchInput(imgUInt8)) return; + ImageBaseType* image = m_Image.GetPointer(); - Int16VectorImageType* imgInt16 = dynamic_cast<Int16VectorImageType*>(imgBase); - if (imgInt16 && SwitchInput(imgInt16)) return; + CAST_IMAGE_BASE(UInt8VectorImageType, image); + CAST_IMAGE_BASE(Int16VectorImageType, image); + CAST_IMAGE_BASE(UInt16VectorImageType, image); + CAST_IMAGE_BASE(Int32VectorImageType, image); + CAST_IMAGE_BASE(UInt32VectorImageType, image); - UInt16VectorImageType* imgUInt16 = dynamic_cast<UInt16VectorImageType*>(imgBase); - if (imgUInt16 && SwitchInput(imgUInt16)) return; + CAST_IMAGE_BASE(FloatVectorImageType, image); + CAST_IMAGE_BASE(DoubleVectorImageType, image); - Int32VectorImageType* imgInt32 = dynamic_cast<Int32VectorImageType*>(imgBase); - if (imgInt32 && SwitchInput(imgInt32)) return; + CAST_IMAGE_BASE(ComplexInt16VectorImageType, image); + CAST_IMAGE_BASE(ComplexInt32VectorImageType, image); + CAST_IMAGE_BASE(ComplexFloatVectorImageType, image); + CAST_IMAGE_BASE(ComplexDoubleVectorImageType, image); - UInt32VectorImageType* imgUInt32 = dynamic_cast<UInt32VectorImageType*>(imgBase); - if (imgUInt32 && SwitchInput(imgUInt32)) return; + CAST_IMAGE_BASE(UInt8ImageType, image); + CAST_IMAGE_BASE(Int16ImageType, image); + CAST_IMAGE_BASE(UInt16ImageType, image); + CAST_IMAGE_BASE(Int32ImageType, image); + CAST_IMAGE_BASE(UInt32ImageType, image); - FloatVectorImageType* imgFloat = dynamic_cast<FloatVectorImageType*>(imgBase); - if (imgFloat && SwitchInput(imgFloat)) return; + CAST_IMAGE_BASE(FloatImageType, image); + CAST_IMAGE_BASE(DoubleImageType, image); - DoubleVectorImageType* imgDouble = dynamic_cast<DoubleVectorImageType*>(imgBase); - if (imgDouble && SwitchInput(imgDouble)) return; + CAST_IMAGE_BASE(ComplexInt16ImageType, image); + CAST_IMAGE_BASE(ComplexInt32ImageType, image); + CAST_IMAGE_BASE(ComplexFloatImageType, image); + CAST_IMAGE_BASE(ComplexDoubleImageType, image); - ComplexInt16VectorImageType* imgCInt16 = dynamic_cast<ComplexInt16VectorImageType*>(imgBase); - if (imgCInt16 && SwitchInput(imgCInt16)) return; + CAST_IMAGE_BASE(UInt8RGBImageType, image); + CAST_IMAGE_BASE(UInt8RGBAImageType, image); - ComplexInt32VectorImageType* imgCInt32 = dynamic_cast<ComplexInt32VectorImageType*>(imgBase); - if (imgCInt32 && SwitchInput(imgCInt32)) return; + itkExceptionMacro("Unknown image-base type."); +} - ComplexFloatVectorImageType* imgCFloat = dynamic_cast<ComplexFloatVectorImageType*>(imgBase); - if (imgCFloat && SwitchInput(imgCFloat)) return; - ComplexDoubleVectorImageType* imgCDouble = dynamic_cast<ComplexDoubleVectorImageType*>(imgBase); - if (imgCDouble && SwitchInput(imgCDouble)) return; - } - else - { - UInt8ImageType* imgUInt8 = dynamic_cast<UInt8ImageType*>(imgBase); - if (imgUInt8 && SwitchInput(imgUInt8)) return; +template <typename TOutputImage, typename TInputImage> +void OutputImageParameter ::ClampAndWriteVectorImage(TInputImage* in) +{ + assert(in); + assert(!m_FileName.empty()); - Int16ImageType* imgInt16 = dynamic_cast<Int16ImageType*>(imgBase); - if (imgInt16 && SwitchInput(imgInt16)) return; + // Use metaprogramming to choose optimized pipeline. + details::CastImage<TOutputImage, TInputImage> clamp(in); - UInt16ImageType* imgUInt16 = dynamic_cast<UInt16ImageType*>(imgBase); - if (imgUInt16 && SwitchInput(imgUInt16)) return; - Int32ImageType* imgInt32 = dynamic_cast<Int32ImageType*>(imgBase); - if (imgInt32 && SwitchInput(imgInt32)) return; +#ifdef OTB_USE_MPI - UInt32ImageType* imgUInt32 = dynamic_cast<UInt32ImageType*>(imgBase); - if (imgUInt32 && SwitchInput(imgUInt32)) return; + otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance(); - FloatImageType* imgFloat = dynamic_cast<FloatImageType*>(imgBase); - if (imgFloat && SwitchInput(imgFloat)) return; + if (mpiConfig->GetNbProcs() > 1) + { + std::string extension = itksys::SystemTools::GetFilenameExtension(m_FileName); - DoubleImageType* imgDouble = dynamic_cast<DoubleImageType*>(imgBase); - if (imgDouble && SwitchInput(imgDouble)) return; + if (extension == ".vrt") + { + // Use the MPIVrtWriter - ComplexInt16ImageType* imgCInt16 = dynamic_cast<ComplexInt16ImageType*>(imgBase); - if (imgCInt16 && SwitchInput(imgCInt16)) return; + auto vrtWriter = otb::MPIVrtWriter<TOutputImage>::New(); - ComplexInt32ImageType* imgCInt32 = dynamic_cast<ComplexInt32ImageType*>(imgBase); - if (imgCInt32 && SwitchInput(imgCInt32)) return; + vrtWriter->SetInput(clamp.out); + vrtWriter->SetFileName(m_FileName); + vrtWriter->SetAvailableRAM(m_RAMValue); - ComplexFloatImageType* imgCFloat = dynamic_cast<ComplexFloatImageType*>(imgBase); - if (imgCFloat && SwitchInput(imgCFloat)) return; + // Change internal state only when everything has been setup + // without raising exception. - ComplexDoubleImageType* imgCDouble = dynamic_cast<ComplexDoubleImageType*>(imgBase); - if (imgCDouble && SwitchInput(imgCDouble)) return; + m_InputCaster = clamp.icif; + m_OutputCaster = clamp.ocif; - UInt8RGBImageType* imgRGB = dynamic_cast<UInt8RGBImageType*>(imgBase); - if (imgRGB && SwitchInput(imgRGB)) return; + m_Writer = vrtWriter; - UInt8RGBAImageType* imgRGBA = dynamic_cast<UInt8RGBAImageType*>(imgBase); - if (imgRGBA && SwitchInput(imgRGBA)) return; + return; } - itkExceptionMacro("Unknown image type"); -} - +#ifdef OTB_USE_SPTW -template <typename TInput, typename TOutput> -std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> -ClampAndWriteVectorImage( TInput * in , - const std::string & filename , - const unsigned int & ramValue ) -{ - std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> ret; - typedef ClampImageFilter < TInput , TOutput > ClampFilterType; - typename ClampFilterType::Pointer clampFilter ( ClampFilterType::New() ); + else if (extension == ".tif") + { + // Use simple parallel tiff writer - clampFilter->SetInput( in); - ret.first = clampFilter.GetPointer(); - - bool useStandardWriter = true; + auto sptWriter = otb::SimpleParallelTiffWriter<TOutputImage>::New(); - #ifdef OTB_USE_MPI + sptWriter->SetFileName(m_FileName); + sptWriter->SetInput(clamp.out); + sptWriter->GetStreamingManager()->SetDefaultRAM(m_RAMValue); - otb::MPIConfig::Pointer mpiConfig = otb::MPIConfig::Instance(); + // Change internal state only when everything has been setup + // without raising exception. - if (mpiConfig->GetNbProcs() > 1) - { - useStandardWriter = false; + m_InputCaster = clamp.icif; + m_OutputCaster = clamp.ocif; - // Get file extension - std::string extension = itksys::SystemTools::GetFilenameExtension(filename); + m_Writer = sptWriter; - if(extension == ".vrt") - { - // Use the MPIVrtWriter - typedef otb::MPIVrtWriter<TOutput> VRTWriterType; + return; + } - typename VRTWriterType::Pointer vrtWriter = VRTWriterType::New(); - vrtWriter->SetInput(clampFilter->GetOutput()); - vrtWriter->SetFileName(filename); - vrtWriter->SetAvailableRAM(ramValue); - ret.second = vrtWriter.GetPointer(); - } - #ifdef OTB_USE_SPTW - else if (extension == ".tif") - { - // Use simple parallel tiff writer - typedef otb::SimpleParallelTiffWriter<TOutput> SPTWriterType; +#endif // OTB_USE_SPTW - typename SPTWriterType::Pointer sptWriter = SPTWriterType::New(); - sptWriter->SetFileName(filename); - sptWriter->SetInput(clampFilter->GetOutput()); - sptWriter->GetStreamingManager()->SetDefaultRAM(ramValue); - ret.second = sptWriter.GetPointer(); - } - - #endif else { - itkGenericExceptionMacro("File format "<<extension<<" not supported for parallel writing with MPI. Supported formats are .vrt and .tif. Extended filenames are not supported."); + itkGenericExceptionMacro("File format " << extension + << " not supported for parallel writing with MPI. Supported formats are " + ".vrt and .tif. Extended filenames are not supported."); } - - } - - #endif - - if(useStandardWriter) - { - typename otb::ImageFileWriter<TOutput>::Pointer writer = - otb::ImageFileWriter<TOutput>::New(); - writer->SetFileName( filename ); - writer->SetInput(clampFilter->GetOutput()); - writer->GetStreamingManager()->SetDefaultRAM(ramValue); - ret.second = writer.GetPointer(); } - return ret; +#endif // OTB_USE_MPI + + // + // Use default OTB writer. + + auto writer = otb::ImageFileWriter<TOutputImage>::New(); + + writer->SetFileName(m_FileName); + writer->SetInput(clamp.out); + writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); + + // Change internal state only when everything has been setup + // without raising exception. + + m_InputCaster = clamp.icif; + m_OutputCaster = clamp.ocif; + + m_Writer = writer; } -template <class TInput> -int -OutputImageParameter::SwitchInput(TInput *img) + +template <typename TInputImage> +void OutputImageParameter ::SwitchInput(TInputImage* image) { - if (! img) return 0; + assert(image); - std::pair<itk::ProcessObject::Pointer,itk::ProcessObject::Pointer> ret; - switch(m_PixelType ) - { - case ImagePixelType_uint8: - { - ret = ClampAndWriteVectorImage< TInput , UInt8VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + switch (m_PixelType) + { + case ImagePixelType_uint8: + ClampAndWriteVectorImage<UInt8VectorImageType>(image); break; - } - case ImagePixelType_int16: - { - ret = ClampAndWriteVectorImage< TInput , Int16VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_int16: + ClampAndWriteVectorImage<Int16VectorImageType>(image); break; - } - case ImagePixelType_uint16: - { - ret = ClampAndWriteVectorImage< TInput , UInt16VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_uint16: + ClampAndWriteVectorImage<UInt16VectorImageType>(image); break; - } - case ImagePixelType_int32: - { - ret = ClampAndWriteVectorImage< TInput , Int32VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_int32: + + ClampAndWriteVectorImage<Int32VectorImageType>(image); break; - } - case ImagePixelType_uint32: - { - ret = ClampAndWriteVectorImage< TInput , UInt32VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_uint32: + ClampAndWriteVectorImage<UInt32VectorImageType>(image); break; - } - case ImagePixelType_float: - { - ret = ClampAndWriteVectorImage< TInput , FloatVectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_float: + ClampAndWriteVectorImage<FloatVectorImageType>(image); break; - } - case ImagePixelType_double: - { - ret = ClampAndWriteVectorImage< TInput , DoubleVectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_double: + ClampAndWriteVectorImage<DoubleVectorImageType>(image); break; - } - case ImagePixelType_cint16: - { - ret = ClampAndWriteVectorImage < TInput , ComplexInt16VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_cint16: + ClampAndWriteVectorImage<ComplexInt16VectorImageType>(image); break; - } - case ImagePixelType_cint32: - { - ret = ClampAndWriteVectorImage < TInput , ComplexInt32VectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_cint32: + ClampAndWriteVectorImage<ComplexInt32VectorImageType>(image); break; - } - case ImagePixelType_cfloat: - { - ret = ClampAndWriteVectorImage < TInput , ComplexFloatVectorImageType > ( - img , - m_FileName , - m_RAMValue ); + + case ImagePixelType_cfloat: + ClampAndWriteVectorImage<ComplexFloatVectorImageType>(image); break; - } + case ImagePixelType_cdouble: - { - ret = ClampAndWriteVectorImage < TInput , ComplexDoubleVectorImageType > ( - img , - m_FileName , - m_RAMValue ); - break; - } + ClampAndWriteVectorImage<ComplexDoubleVectorImageType>(image); + break; + default: + assert(false && "Unexpected image-type."); break; } - // Save the caster and writer - m_Caster = ret.first; - m_Writer = ret.second; - return 1; } + void OutputImageParameter::Write() { m_Writer->Update(); // Clean internal filters - m_Caster = nullptr; + m_InputCaster = nullptr; + m_OutputCaster = nullptr; + m_Writer = nullptr; } @@ -444,11 +398,9 @@ OutputImageParameter::SetValue(ImageBaseType* image) SetActive(true); } -bool -OutputImageParameter::HasValue() const +bool OutputImageParameter ::HasValue() const { - std::string filename(this->GetFileName()); - return !filename.empty(); + return !m_FileName.empty(); } std::string @@ -493,43 +445,38 @@ OutputImageParameter::CheckFileName(bool fixMissingExtension) } // Specialization for UInt8RGBAImageType + template <> -int -OutputImageParameter::SwitchInput(UInt8RGBAImageType *img) +void OutputImageParameter ::SwitchInput(UInt8RGBAImageType* img) { - if (! img) return 0; - if( m_PixelType == ImagePixelType_uint8 ) - { - typename otb::ImageFileWriter<UInt8RGBAImageType>::Pointer writer = - otb::ImageFileWriter<UInt8RGBAImageType>::New(); - writer->SetFileName( this->GetFileName() ); - writer->SetInput(img); - writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); - m_Writer = writer.GetPointer(); - } - else - itkExceptionMacro("Unknown PixelType for RGBA Image. Only uint8 is supported."); - return 1; + assert(img); + + if (m_PixelType != ImagePixelType_uint8) + itkExceptionMacro("Unknown PixelType for RGBA Image. Only uint8 is supported."); + + auto writer = otb::ImageFileWriter<UInt8RGBAImageType>::New(); + + writer->SetFileName(GetFileName()); + writer->SetInput(img); + writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); + + m_Writer = writer; } // Specialization for UInt8RGBImageType template <> -int -OutputImageParameter::SwitchInput(UInt8RGBImageType *img) +void OutputImageParameter ::SwitchInput(UInt8RGBImageType* img) { - if (! img) return 0; - if( m_PixelType == ImagePixelType_uint8 ) - { - typename otb::ImageFileWriter<UInt8RGBImageType>::Pointer writer = - otb::ImageFileWriter<UInt8RGBImageType>::New(); - writer->SetFileName( this->GetFileName() ); - writer->SetInput(img); - writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); - m_Writer = writer.GetPointer(); - } - else - itkExceptionMacro("Unknown PixelType for RGB Image. Only uint8 is supported."); - return 1; + if (m_PixelType != ImagePixelType_uint8) + itkExceptionMacro("Unknown PixelType for RGB Image. Only uint8 is supported."); + + auto writer = otb::ImageFileWriter<UInt8RGBImageType>::New(); + + writer->SetFileName(GetFileName()); + writer->SetInput(img); + writer->GetStreamingManager()->SetDefaultRAM(m_RAMValue); + + m_Writer = writer; } void OutputImageParameter::SetFileName (const char* filename) diff --git a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx index eaaf8c7c302f9085282eaa1169465477d8a50bbd..3b020d798980c922f491e80c263fd7590a93743c 100644 --- a/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx +++ b/Modules/Wrappers/ApplicationEngine/src/otbWrapperOutputProcessXMLParameter.cxx @@ -366,6 +366,77 @@ OutputProcessXMLParameter::ParseGroup(const std::string& group) } } +std::string OutputProcessXMLParameter::MakeCommandLine(Application::Pointer application) +{ + OutputProcessXMLParameter::Pointer outXMLParam = OutputProcessXMLParameter::New(); + TiXmlElement* XMLAppElement = outXMLParam->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 } //end namespace otb diff --git a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx index 8cdca28487f797c1b6962edf031eeb623fea8c77..816e56d81fc7ea3f9c9f178198cc999eea1e6cb7 100644 --- a/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx +++ b/Modules/Wrappers/CommandLine/src/otbApplicationLauncherCommandLine.cxx @@ -264,12 +264,6 @@ void ShowUsage(char* argv[]) int main(int argc, char* argv[]) { - #ifdef OTB_USE_MPI - otb::MPIConfig::Instance()->Init(argc,argv); - #endif - - otb::ConfigurationManager::InitOpenMPThreads(); - if (argc < 2) { ShowUsage(argv); @@ -299,15 +293,22 @@ int main(int argc, char* argv[]) } } - typedef otb::Wrapper::CommandLineLauncher LauncherType; - LauncherType::Pointer launcher = LauncherType::New(); - if (vexp.empty()) { ShowUsage(argv); return EXIT_FAILURE; } + #ifdef OTB_USE_MPI + if (std::find(vexp.begin(), vexp.end(), "-testenv") == vexp.end() ) + otb::MPIConfig::Instance()->Init(argc,argv); + #endif + + otb::ConfigurationManager::InitOpenMPThreads(); + + typedef otb::Wrapper::CommandLineLauncher LauncherType; + LauncherType::Pointer launcher = LauncherType::New(); + bool success = launcher->Load(vexp) && launcher->ExecuteAndWriteOutput(); // shutdown MPI after application finished diff --git a/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h b/Modules/Wrappers/QtWidget/include/otbWrapperQtWidgetMainWindow.h index 6e0a005b1f9d3cd8dba6276b40da9e9fd29c2e8d..70d922b8116411a6201c0cb9569d74534153ee34 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,26 @@ 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(); 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..13dffe9fe1078859117eb80c4ae90bdb1be445e4 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 */ @@ -144,8 +140,6 @@ signals: void UpdateGui(); - void Stop(); - public slots: /** * \brief Slots called every time one of the widget needs to be @@ -168,19 +162,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/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..41fc9f1b190b29da9d7272d41f245b0c06d1a863 100644 --- a/Modules/Wrappers/QtWidget/src/CMakeLists.txt +++ b/Modules/Wrappers/QtWidget/src/CMakeLists.txt @@ -44,7 +44,6 @@ set(OTBQtWidget_SRC otbWrapperQtWidgetParameterGroup.cxx otbWrapperQtWidgetInputFilenameListParameter.cxx otbWrapperQtWidgetRAMParameter.cxx - otbWrapperQtWidgetProgressReport.cxx otbWrapperQtWidgetOutputProcessXMLParameter.cxx otbWrapperQtWidgetParameterBase.cxx otbWrapperQtWidgetInputImageParameter.cxx @@ -79,7 +78,6 @@ set(OTBQtWidget_MOC_HDR ../include/otbWrapperQtWidgetModel.h ../include/otbWrapperQtWidgetView.h ../include/otbWrapperQtWidgetMainWindow.h - ../include/otbWrapperQtWidgetProgressReport.h ../include/otbWrapperQtWidgetListViewParameter.h ../include/otbQtFileSelectionWidget.h ../include/otbQtStringSelectionWidget.h @@ -101,6 +99,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..c376f1984f3cec0518739bf1dd22fe3b6fb4f4be --- /dev/null +++ b/Modules/Wrappers/QtWidget/src/appmainwindow.ui @@ -0,0 +1,268 @@ +<?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> + <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="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="actionAboutOTB"> + <property name="text"> + <string>About</string> + </property> + </action> + <action name="actionAbout"> + <property name="text"> + <string>About</string> + </property> + </action> + <action name="actionView_log"> + <property name="text"> + <string>View log</string> + </property> + </action> + <action name="actionLoad_parameters"> + <property name="text"> + <string>Load parameters</string> + </property> + </action> + <action name="actionSave_parameters"> + <property name="text"> + <string>Save parameters</string> + </property> + </action> + <action name="actionQuit"> + <property name="text"> + <string>Quit</string> + </property> + <property name="shortcut"> + <string>Ctrl+Q</string> + </property> + </action> + <action name="actionReset_parameters"> + <property name="text"> + <string>Reset parameters</string> + </property> + </action> + <action name="actionReset"> + <property name="text"> + <string>Reset All</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> + <action name="actionCopy_command_line"> + <property name="text"> + <string>Copy command line to clipboard</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/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..93c3f459e2e43b49d43e879a84e3f83ccfa30345 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetMainWindow.cxx @@ -21,44 +21,143 @@ #include "otbWrapperQtWidgetMainWindow.h" #include <QtWidgets> + #include "otbWrapperQtWidgetView.h" +#include "otbWrapperQtWidgetOutputProcessXMLParameter.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 + connect(ui->actionQuit, &QAction::triggered, this, &QMainWindow::close); + 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); + + // 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()); + + // 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); } -QtWidgetView* QtMainWindow::Gui() const +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 = OutputProcessXMLParameter::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); +} + +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..dc0e9278dd532fed974eb1c8adc900e9fc5fd32b 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetModel.cxx @@ -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/otbWrapperQtWidgetParameterGroup.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetParameterGroup.cxx index 61c72aa250beeeffbc613e8f2beec7728dbfe7ef..5aadbca9ef2e90ef9261442586dc71882302a225 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) @@ -139,8 +138,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/otbWrapperQtWidgetSpinBoxes.cxx b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx index 4af61804517d82518ce13d78ec021a86b044fee5..9984222ae6a1fd7240dc544e2d9a811d15e245ce 100644 --- a/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx +++ b/Modules/Wrappers/QtWidget/src/otbWrapperQtWidgetSpinBoxes.cxx @@ -103,7 +103,8 @@ void QtWidgetSpinBox::SetValueNoSignal(int value) int QtWidgetSpinBox::valueFromText(const QString &text) const { bool ok; - int result = QLocale::system().toInt(text, &ok); + // Force C locale because OTB gui is not i18n + int result = QLocale::c().toInt(text, &ok); if (ok) { return result; @@ -162,7 +163,8 @@ void QtWidgetDoubleSpinBox::SetValueNoSignal(double value) double QtWidgetDoubleSpinBox::valueFromText(const QString &text) const { bool ok; - double result = QLocale::system().toDouble(text, &ok); + // Force C locale because OTB gui is not i18n + double result = QLocale::c().toDouble(text, &ok); if (ok) { return result; @@ -180,7 +182,9 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const // which leads to ugly trailing zeros for small values (e.g 1.50000) // We use std::ostringstream because QString::arg formatting support is too limited std::ostringstream oss; - oss.imbue(std::locale("")); // use system's locale for formatting + + // Force C locale because OTB gui is not i18n + oss.imbue(std::locale::classic()); // Set precision to the number of decimal digits that can be represented without change. // Use float precision because OTB parameter is float @@ -190,9 +194,8 @@ QString QtWidgetDoubleSpinBox::textFromValue(double value) const // Add a trailing dot if the number is integer, // so that int and float parameters are more visually different. - // For now this is done for all locales, even though not all locales use this - // convention for formatting decimals... - const char dot = std::use_facet<std::numpunct<char>>(std::locale("")).decimal_point(); + // This is an ok convention as long as we stay in C or english locale + const char dot = std::use_facet<std::numpunct<char>>(std::locale::classic()).decimal_point(); if (oss.str().find(dot) == std::string::npos) { oss << dot; 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/Utilities/Doxygen/mcdoc.py b/Utilities/Doxygen/mcdoc.py index b380dd153f6754bab1ab9142b9b18951945a9d78..0242dcfbea1c0a6d15ea142891f96cec738c871c 100644 --- a/Utilities/Doxygen/mcdoc.py +++ b/Utilities/Doxygen/mcdoc.py @@ -70,7 +70,7 @@ def setGroup( fname, group ): def checkGroup( fname, group ): # sys.stderr.write("Checking"+ fname + "\n") - f = open( fname, "r" ) + f = open( fname, "r", encoding='utf-8') # load everything in memory fcontent = f.read() f.close()