cars 1.0.0rc2__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cars might be problematic. Click here for more details.
- cars/__init__.py +86 -0
- cars/applications/__init__.py +40 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +597 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +278 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
- cars/applications/dsm_merging/__init__.py +28 -0
- cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
- cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
- cars/applications/grid_correction/__init__.py +30 -0
- cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
- cars/applications/grid_correction/grid_correction_app.py +557 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +639 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +760 -0
- cars/applications/resampling/resampling_algo.py +590 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sensors_subsampling/__init__.py +32 -0
- cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
- cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
- cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
- cars/applications/sparse_matching/sift_app.py +724 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +750 -0
- cars/cars.py +179 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1544 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +250 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +728 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/memory_tools.py +47 -0
- cars/orchestrator/orchestrator.py +755 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +1088 -0
- cars/pipelines/filling/__init__.py +26 -0
- cars/pipelines/filling/filling.py +981 -0
- cars/pipelines/formatting/__init__.py +26 -0
- cars/pipelines/formatting/formatting.py +186 -0
- cars/pipelines/merging/__init__.py +26 -0
- cars/pipelines/merging/merging.py +439 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +256 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
- cars/pipelines/parameters/application_parameters.py +72 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +349 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +438 -0
- cars/pipelines/parameters/sensor_inputs.py +859 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +38 -0
- cars/pipelines/pipeline_template.py +135 -0
- cars/pipelines/subsampling/__init__.py +26 -0
- cars/pipelines/subsampling/subsampling.py +358 -0
- cars/pipelines/surface_modeling/__init__.py +26 -0
- cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
- cars/pipelines/tie_points/__init__.py +26 -0
- cars/pipelines/tie_points/tie_points.py +536 -0
- cars/starter.py +167 -0
- cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
- cars-1.0.0rc2.dist-info/METADATA +289 -0
- cars-1.0.0rc2.dist-info/RECORD +225 -0
- cars-1.0.0rc2.dist-info/WHEEL +4 -0
- cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
- cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
- cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
this module contains the abstract grid generation application class.
|
|
23
|
+
"""
|
|
24
|
+
import logging
|
|
25
|
+
from abc import ABCMeta, abstractmethod
|
|
26
|
+
from typing import Dict
|
|
27
|
+
|
|
28
|
+
from cars.applications.application import Application
|
|
29
|
+
from cars.applications.application_template import ApplicationTemplate
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@Application.register("grid_generation")
|
|
33
|
+
class GridGeneration(ApplicationTemplate, metaclass=ABCMeta):
|
|
34
|
+
"""
|
|
35
|
+
AbstractGridGeneration
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
available_applications: Dict = {}
|
|
39
|
+
default_application = "epipolar"
|
|
40
|
+
|
|
41
|
+
def __new__(cls, conf=None): # pylint: disable=W0613
|
|
42
|
+
"""
|
|
43
|
+
Return the required application
|
|
44
|
+
:raises:
|
|
45
|
+
- KeyError when the required application is not registered
|
|
46
|
+
|
|
47
|
+
:param conf: configuration for grid generation
|
|
48
|
+
:return: a application_to_use object
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
grid_method = cls.default_application
|
|
52
|
+
|
|
53
|
+
if bool(conf) is False or "method" not in conf:
|
|
54
|
+
logging.info(
|
|
55
|
+
"Grid generation method not specified, default "
|
|
56
|
+
" {} is used".format(grid_method)
|
|
57
|
+
)
|
|
58
|
+
else:
|
|
59
|
+
grid_method = conf.get("method", cls.default_application)
|
|
60
|
+
|
|
61
|
+
if grid_method not in cls.available_applications:
|
|
62
|
+
logging.error(
|
|
63
|
+
"No GridGeneration application named {} registered".format(
|
|
64
|
+
grid_method
|
|
65
|
+
)
|
|
66
|
+
)
|
|
67
|
+
raise KeyError(
|
|
68
|
+
"No GridGeneration application named {} registered".format(
|
|
69
|
+
grid_method
|
|
70
|
+
)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
logging.info(
|
|
74
|
+
"The GridGeneration({}) application will be used".format(
|
|
75
|
+
grid_method
|
|
76
|
+
)
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return super(GridGeneration, cls).__new__(
|
|
80
|
+
cls.available_applications[grid_method]
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def __init_subclass__(cls, short_name, **kwargs): # pylint: disable=E0302
|
|
84
|
+
super().__init_subclass__(**kwargs)
|
|
85
|
+
cls.available_applications[short_name] = cls
|
|
86
|
+
|
|
87
|
+
def __init__(self, conf=None):
|
|
88
|
+
"""
|
|
89
|
+
Init function of GridGeneration
|
|
90
|
+
|
|
91
|
+
:param conf: configuration
|
|
92
|
+
:return: an application_to_use object
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
super().__init__(conf=conf)
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def get_save_grids(self):
|
|
99
|
+
"""
|
|
100
|
+
Get whether the grid will be saved
|
|
101
|
+
|
|
102
|
+
:return: true is grid saving is activated
|
|
103
|
+
:rtype: bool
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
@abstractmethod
|
|
107
|
+
def run( # pylint: disable=too-many-positional-arguments
|
|
108
|
+
self,
|
|
109
|
+
image_left,
|
|
110
|
+
image_right,
|
|
111
|
+
orchestrator=None,
|
|
112
|
+
pair_folder=None,
|
|
113
|
+
srtm_dir=None,
|
|
114
|
+
default_alt=None,
|
|
115
|
+
geoid_path=None,
|
|
116
|
+
pair_key="PAIR_0",
|
|
117
|
+
):
|
|
118
|
+
"""
|
|
119
|
+
Run EpipolarGridGeneration application
|
|
120
|
+
|
|
121
|
+
Create left and right grid CarsDataset filled with xarray.Dataset ,
|
|
122
|
+
corresponding to left and right epipolar grids.
|
|
123
|
+
|
|
124
|
+
:param image_left: left image
|
|
125
|
+
:type image_left: dict
|
|
126
|
+
:param image_right: right image
|
|
127
|
+
:type image_right: dict
|
|
128
|
+
:param pair_folder: folder used for current pair
|
|
129
|
+
:type pair_folder: str
|
|
130
|
+
:param orchestrator: orchestrator used
|
|
131
|
+
:param srtm_dir: srtm directory
|
|
132
|
+
:type srtm_dir: str
|
|
133
|
+
:param default_alt: default altitude
|
|
134
|
+
:type default_alt: float
|
|
135
|
+
:param geoid_path: geoid path
|
|
136
|
+
:type geoid_path: str
|
|
137
|
+
:param pair_key: pair configuration id
|
|
138
|
+
:type pair_key: str
|
|
139
|
+
|
|
140
|
+
:return: left grid, right grid
|
|
141
|
+
:rtype: Tuple(CarsDataset, CarsDataset)
|
|
142
|
+
"""
|
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# coding: utf8
|
|
3
|
+
#
|
|
4
|
+
# Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
|
|
5
|
+
#
|
|
6
|
+
# This file is part of CARS
|
|
7
|
+
# (see https://github.com/CNES/cars).
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
"""
|
|
22
|
+
this module contains the epipolar grid generation application class.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
# Standard imports
|
|
26
|
+
import logging
|
|
27
|
+
import os
|
|
28
|
+
|
|
29
|
+
# Third party imports
|
|
30
|
+
from json_checker import And, Checker
|
|
31
|
+
|
|
32
|
+
import cars.orchestrator.orchestrator as ocht
|
|
33
|
+
from cars.applications import application_constants
|
|
34
|
+
from cars.applications.grid_generation import (
|
|
35
|
+
grid_generation_algo,
|
|
36
|
+
)
|
|
37
|
+
from cars.applications.grid_generation import (
|
|
38
|
+
grid_generation_constants as grid_constants,
|
|
39
|
+
)
|
|
40
|
+
from cars.applications.grid_generation.abstract_grid_generation_app import (
|
|
41
|
+
GridGeneration,
|
|
42
|
+
)
|
|
43
|
+
from cars.core import projection
|
|
44
|
+
|
|
45
|
+
# CARS imports
|
|
46
|
+
from cars.core.utils import safe_makedirs
|
|
47
|
+
from cars.orchestrator.cluster.log_wrapper import cars_profile
|
|
48
|
+
from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class EpipolarGridGeneration(GridGeneration, short_name="epipolar"):
|
|
52
|
+
"""
|
|
53
|
+
EpipolarGridGeneration
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, conf=None):
|
|
57
|
+
"""
|
|
58
|
+
Init function of EpipolarGridGeneration
|
|
59
|
+
|
|
60
|
+
:param conf: configuration for grid generation
|
|
61
|
+
:return: a application_to_use object
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
super().__init__(conf=conf)
|
|
65
|
+
|
|
66
|
+
# check conf
|
|
67
|
+
self.used_method = self.used_config["method"]
|
|
68
|
+
self.epi_step = self.used_config["epi_step"]
|
|
69
|
+
# Saving files
|
|
70
|
+
self.save_intermediate_data = self.used_config["save_intermediate_data"]
|
|
71
|
+
|
|
72
|
+
# Init orchestrator
|
|
73
|
+
self.orchestrator = None
|
|
74
|
+
|
|
75
|
+
def check_conf(self, conf):
|
|
76
|
+
"""
|
|
77
|
+
Check configuration
|
|
78
|
+
|
|
79
|
+
:param conf: configuration to check
|
|
80
|
+
:type conf: dict
|
|
81
|
+
|
|
82
|
+
:return: overloaded configuration
|
|
83
|
+
:rtype: dict
|
|
84
|
+
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
# Init conf
|
|
88
|
+
if conf is not None:
|
|
89
|
+
overloaded_conf = conf.copy()
|
|
90
|
+
else:
|
|
91
|
+
conf = {}
|
|
92
|
+
overloaded_conf = {}
|
|
93
|
+
|
|
94
|
+
# Overload conf
|
|
95
|
+
overloaded_conf["method"] = conf.get("method", "epipolar")
|
|
96
|
+
overloaded_conf["epi_step"] = conf.get("epi_step", 30)
|
|
97
|
+
overloaded_conf["save_intermediate_data"] = conf.get(
|
|
98
|
+
"save_intermediate_data", False
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
grid_generation_schema = {
|
|
102
|
+
"method": str,
|
|
103
|
+
"epi_step": And(int, lambda x: x > 0),
|
|
104
|
+
"save_intermediate_data": bool,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
# Check conf
|
|
108
|
+
checker = Checker(grid_generation_schema)
|
|
109
|
+
checker.validate(overloaded_conf)
|
|
110
|
+
|
|
111
|
+
return overloaded_conf
|
|
112
|
+
|
|
113
|
+
def get_save_grids(self):
|
|
114
|
+
"""
|
|
115
|
+
Get whether the grid will be saved
|
|
116
|
+
|
|
117
|
+
:return: true is grid saving is activated
|
|
118
|
+
:rtype: bool
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
return self.save_intermediate_data
|
|
122
|
+
|
|
123
|
+
@cars_profile(name="Epi Grid Generation")
|
|
124
|
+
def run( # pylint: disable=too-many-positional-arguments
|
|
125
|
+
self,
|
|
126
|
+
image_left,
|
|
127
|
+
image_right,
|
|
128
|
+
geometry_plugin,
|
|
129
|
+
orchestrator=None,
|
|
130
|
+
pair_folder=None,
|
|
131
|
+
pair_key="PAIR_0",
|
|
132
|
+
):
|
|
133
|
+
"""
|
|
134
|
+
Run EpipolarGridGeneration application
|
|
135
|
+
|
|
136
|
+
Create left and right grid files,
|
|
137
|
+
corresponding to left and right epipolar grids.
|
|
138
|
+
The returned dicts contain all the attributes of the grid & their path
|
|
139
|
+
|
|
140
|
+
:param image_left: left image. Dict Must contain keys : \
|
|
141
|
+
"image", "texture", "geomodel","no_data", "mask". Paths must be
|
|
142
|
+
absolutes
|
|
143
|
+
:type image_left: dict
|
|
144
|
+
:param image_right: right image. Dict Must contain keys :\
|
|
145
|
+
"image", "texture", "geomodel","no_data", "mask". Paths must be
|
|
146
|
+
absolutes
|
|
147
|
+
:type image_right: dict
|
|
148
|
+
:param geometry_plugin: geometry plugin to use
|
|
149
|
+
:type geometry_plugin: AbstractGeometry
|
|
150
|
+
:param pair_folder: folder used for current pair
|
|
151
|
+
:type pair_folder: str
|
|
152
|
+
:param orchestrator: orchestrator used
|
|
153
|
+
:param pair_key: pair configuration id
|
|
154
|
+
:type pair_key: str
|
|
155
|
+
|
|
156
|
+
:return: left grid, right grid. Each grid dict contains :
|
|
157
|
+
- Attributes containing: "grid_spacing", "grid_origin", \
|
|
158
|
+
"epipolar_size_x", epipolar_size_y", "epipolar_origin_x", \
|
|
159
|
+
"epipolar_origin_y","epipolar_spacing_x", \
|
|
160
|
+
"epipolar_spacing", "disp_to_alt_ratio", "path"
|
|
161
|
+
|
|
162
|
+
:rtype: Tuple(dict, dict)
|
|
163
|
+
"""
|
|
164
|
+
|
|
165
|
+
# Default orchestrator
|
|
166
|
+
if orchestrator is None:
|
|
167
|
+
# Create default sequential orchestrator for current application
|
|
168
|
+
# be awere, no out_json will be shared between orchestrators
|
|
169
|
+
# No files saved
|
|
170
|
+
self.orchestrator = ocht.Orchestrator(
|
|
171
|
+
orchestrator_conf={"mode": "sequential"}
|
|
172
|
+
)
|
|
173
|
+
else:
|
|
174
|
+
self.orchestrator = orchestrator
|
|
175
|
+
|
|
176
|
+
sensor1 = image_left[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
|
|
177
|
+
sensor2 = image_right[sens_cst.INPUT_IMG]["bands"]["b0"]["path"]
|
|
178
|
+
geomodel1 = image_left[sens_cst.INPUT_GEO_MODEL]
|
|
179
|
+
geomodel2 = image_right[sens_cst.INPUT_GEO_MODEL]
|
|
180
|
+
|
|
181
|
+
# Get satellites angles from ground: Azimuth to north, Elevation angle
|
|
182
|
+
try:
|
|
183
|
+
(
|
|
184
|
+
left_az,
|
|
185
|
+
left_elev_angle,
|
|
186
|
+
right_az,
|
|
187
|
+
right_elev_angle,
|
|
188
|
+
convergence_angle,
|
|
189
|
+
) = projection.get_ground_angles(
|
|
190
|
+
sensor1, sensor2, geomodel1, geomodel2, geometry_plugin
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
logging.info(
|
|
194
|
+
"Left satellite acquisition angles: "
|
|
195
|
+
"Azimuth angle: {:.1f} degrees, "
|
|
196
|
+
"Elevation angle: {:.1f} degrees".format(
|
|
197
|
+
left_az, left_elev_angle
|
|
198
|
+
)
|
|
199
|
+
)
|
|
200
|
+
|
|
201
|
+
logging.info(
|
|
202
|
+
"Right satellite acquisition angles: "
|
|
203
|
+
"Azimuth angle: {:.1f} degrees, "
|
|
204
|
+
"Elevation angle: {:.1f} degrees".format(
|
|
205
|
+
right_az, right_elev_angle
|
|
206
|
+
)
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
logging.info(
|
|
210
|
+
"Stereo satellite convergence angle from ground: "
|
|
211
|
+
"{:.1f} degrees".format(convergence_angle)
|
|
212
|
+
)
|
|
213
|
+
except Exception as exc:
|
|
214
|
+
logging.error(
|
|
215
|
+
"Error in Angles information retrieval: {}".format(exc)
|
|
216
|
+
)
|
|
217
|
+
(
|
|
218
|
+
left_az,
|
|
219
|
+
left_elev_angle,
|
|
220
|
+
right_az,
|
|
221
|
+
right_elev_angle,
|
|
222
|
+
convergence_angle,
|
|
223
|
+
) = (
|
|
224
|
+
None,
|
|
225
|
+
None,
|
|
226
|
+
None,
|
|
227
|
+
None,
|
|
228
|
+
None,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
# Generate rectification grids
|
|
232
|
+
(
|
|
233
|
+
grid1,
|
|
234
|
+
grid2,
|
|
235
|
+
grid_origin,
|
|
236
|
+
grid_spacing,
|
|
237
|
+
epipolar_size,
|
|
238
|
+
disp_to_alt_ratio,
|
|
239
|
+
) = grid_generation_algo.generate_epipolar_grids(
|
|
240
|
+
sensor1,
|
|
241
|
+
sensor2,
|
|
242
|
+
geomodel1,
|
|
243
|
+
geomodel2,
|
|
244
|
+
geometry_plugin,
|
|
245
|
+
self.epi_step,
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
# Create CarsDataset
|
|
249
|
+
grid_left = {
|
|
250
|
+
"grid_spacing": grid_spacing,
|
|
251
|
+
"grid_origin": grid_origin,
|
|
252
|
+
"epipolar_size_x": epipolar_size[0],
|
|
253
|
+
"epipolar_size_y": epipolar_size[1],
|
|
254
|
+
"epipolar_origin_x": grid_origin[0],
|
|
255
|
+
"epipolar_origin_y": grid_origin[1],
|
|
256
|
+
"epipolar_spacing_x": grid_spacing[0],
|
|
257
|
+
"epipolar_spacing": grid_spacing[1],
|
|
258
|
+
"disp_to_alt_ratio": disp_to_alt_ratio,
|
|
259
|
+
"epipolar_step": self.epi_step,
|
|
260
|
+
"path": None,
|
|
261
|
+
}
|
|
262
|
+
grid_right = grid_left.copy()
|
|
263
|
+
|
|
264
|
+
grid_origin = grid_left["grid_origin"]
|
|
265
|
+
grid_spacing = grid_left["grid_spacing"]
|
|
266
|
+
|
|
267
|
+
if self.save_intermediate_data:
|
|
268
|
+
left_grid_path = os.path.join(pair_folder, "left_epi_grid.tif")
|
|
269
|
+
right_grid_path = os.path.join(pair_folder, "right_epi_grid.tif")
|
|
270
|
+
safe_makedirs(pair_folder)
|
|
271
|
+
else:
|
|
272
|
+
if pair_folder is None:
|
|
273
|
+
tmp_folder = os.path.join(self.orchestrator.out_dir, "tmp")
|
|
274
|
+
else:
|
|
275
|
+
tmp_folder = os.path.join(pair_folder, "tmp")
|
|
276
|
+
safe_makedirs(tmp_folder)
|
|
277
|
+
self.orchestrator.add_to_clean(tmp_folder)
|
|
278
|
+
left_grid_path = os.path.join(tmp_folder, "left_epi_grid.tif")
|
|
279
|
+
right_grid_path = os.path.join(tmp_folder, "right_epi_grid.tif")
|
|
280
|
+
|
|
281
|
+
grid_generation_algo.write_grid(
|
|
282
|
+
grid1, left_grid_path, grid_origin, grid_spacing
|
|
283
|
+
)
|
|
284
|
+
grid_generation_algo.write_grid(
|
|
285
|
+
grid2, right_grid_path, grid_origin, grid_spacing
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
grid_left["path"] = left_grid_path
|
|
289
|
+
grid_right["path"] = right_grid_path
|
|
290
|
+
|
|
291
|
+
# Add infos to orchestrator.out_json
|
|
292
|
+
updating_dict = {
|
|
293
|
+
application_constants.APPLICATION_TAG: {
|
|
294
|
+
grid_constants.GRID_GENERATION_RUN_TAG: {
|
|
295
|
+
pair_key: {
|
|
296
|
+
grid_constants.EPIPOLAR_SIZE_X_TAG: epipolar_size[0],
|
|
297
|
+
grid_constants.EPIPOLAR_SIZE_Y_TAG: epipolar_size[1],
|
|
298
|
+
grid_constants.EPIPOLAR_ORIGIN_X_TAG: grid_origin[0],
|
|
299
|
+
grid_constants.EPIPOLAR_ORIGIN_Y_TAG: grid_origin[1],
|
|
300
|
+
grid_constants.EPIPOLAR_SPACING_X_TAG: grid_spacing[0],
|
|
301
|
+
grid_constants.EPIPOLAR_SPACING_Y_TAG: grid_spacing[1],
|
|
302
|
+
grid_constants.DISP_TO_ALT_RATIO_TAG: disp_to_alt_ratio,
|
|
303
|
+
grid_constants.LEFT_AZIMUTH_ANGLE_TAG: left_az,
|
|
304
|
+
grid_constants.LEFT_ELEVATION_ANGLE_TAG: (
|
|
305
|
+
left_elev_angle
|
|
306
|
+
),
|
|
307
|
+
grid_constants.RIGHT_AZIMUTH_ANGLE_TAG: right_az,
|
|
308
|
+
grid_constants.RIGHT_ELEVATION_ANGLE_TAG: (
|
|
309
|
+
right_elev_angle
|
|
310
|
+
),
|
|
311
|
+
grid_constants.CONVERGENCE_ANGLE_TAG: convergence_angle,
|
|
312
|
+
},
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
self.orchestrator.update_out_info(updating_dict)
|
|
317
|
+
|
|
318
|
+
logging.info(
|
|
319
|
+
"Size of epipolar images: {}x{} pixels".format(
|
|
320
|
+
epipolar_size[0], epipolar_size[1]
|
|
321
|
+
)
|
|
322
|
+
)
|
|
323
|
+
logging.info(
|
|
324
|
+
"Disparity to altitude factor: {} m/pixel".format(disp_to_alt_ratio)
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
return grid_left, grid_right
|