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.

Files changed (225) hide show
  1. cars/__init__.py +86 -0
  2. cars/applications/__init__.py +40 -0
  3. cars/applications/application.py +117 -0
  4. cars/applications/application_constants.py +29 -0
  5. cars/applications/application_template.py +146 -0
  6. cars/applications/auxiliary_filling/__init__.py +29 -0
  7. cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
  10. cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
  11. cars/applications/dem_generation/__init__.py +30 -0
  12. cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
  13. cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
  14. cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
  15. cars/applications/dem_generation/bulldozer_memory.py +55 -0
  16. cars/applications/dem_generation/dem_generation_algo.py +107 -0
  17. cars/applications/dem_generation/dem_generation_constants.py +32 -0
  18. cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
  19. cars/applications/dense_match_filling/__init__.py +30 -0
  20. cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
  21. cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
  22. cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
  23. cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
  24. cars/applications/dense_match_filling/zero_padding_app.py +302 -0
  25. cars/applications/dense_matching/__init__.py +30 -0
  26. cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
  27. cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
  31. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  32. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  33. cars/applications/dense_matching/cpp/meson.build +9 -0
  34. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  35. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  36. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  37. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  38. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  39. cars/applications/dense_matching/disparity_grid_algo.py +597 -0
  40. cars/applications/dense_matching/loaders/__init__.py +23 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  46. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  47. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  48. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  49. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  50. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  51. cars/applications/dsm_filling/__init__.py +32 -0
  52. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  53. cars/applications/dsm_filling/border_interpolation_app.py +278 -0
  54. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  55. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  56. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  57. cars/applications/dsm_merging/__init__.py +28 -0
  58. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  59. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  60. cars/applications/grid_correction/__init__.py +30 -0
  61. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  62. cars/applications/grid_correction/grid_correction_app.py +557 -0
  63. cars/applications/grid_generation/__init__.py +30 -0
  64. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  65. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  66. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  67. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  68. cars/applications/grid_generation/transform_grid.py +88 -0
  69. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  70. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  71. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  72. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  73. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  74. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  76. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  77. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  78. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  79. cars/applications/rasterization/__init__.py +30 -0
  80. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  81. cars/applications/rasterization/rasterization_algo.py +534 -0
  82. cars/applications/rasterization/rasterization_constants.py +38 -0
  83. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  84. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  85. cars/applications/resampling/__init__.py +28 -0
  86. cars/applications/resampling/abstract_resampling_app.py +187 -0
  87. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  88. cars/applications/resampling/resampling_algo.py +590 -0
  89. cars/applications/resampling/resampling_constants.py +36 -0
  90. cars/applications/resampling/resampling_wrappers.py +309 -0
  91. cars/applications/sensors_subsampling/__init__.py +32 -0
  92. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  93. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  94. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  95. cars/applications/sparse_matching/__init__.py +30 -0
  96. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  97. cars/applications/sparse_matching/sift_app.py +724 -0
  98. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  99. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  100. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  101. cars/applications/triangulation/__init__.py +32 -0
  102. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  103. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  104. cars/applications/triangulation/pc_transform.py +552 -0
  105. cars/applications/triangulation/triangulation_algo.py +371 -0
  106. cars/applications/triangulation/triangulation_constants.py +38 -0
  107. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  108. cars/bundleadjustment.py +750 -0
  109. cars/cars.py +179 -0
  110. cars/conf/__init__.py +23 -0
  111. cars/conf/geoid/egm96.grd +0 -0
  112. cars/conf/geoid/egm96.grd.hdr +15 -0
  113. cars/conf/input_parameters.py +156 -0
  114. cars/conf/mask_cst.py +35 -0
  115. cars/core/__init__.py +23 -0
  116. cars/core/cars_logging.py +402 -0
  117. cars/core/constants.py +191 -0
  118. cars/core/constants_disparity.py +50 -0
  119. cars/core/datasets.py +140 -0
  120. cars/core/geometry/__init__.py +27 -0
  121. cars/core/geometry/abstract_geometry.py +1119 -0
  122. cars/core/geometry/shareloc_geometry.py +598 -0
  123. cars/core/inputs.py +568 -0
  124. cars/core/outputs.py +176 -0
  125. cars/core/preprocessing.py +722 -0
  126. cars/core/projection.py +843 -0
  127. cars/core/roi_tools.py +215 -0
  128. cars/core/tiling.py +774 -0
  129. cars/core/utils.py +164 -0
  130. cars/data_structures/__init__.py +23 -0
  131. cars/data_structures/cars_dataset.py +1544 -0
  132. cars/data_structures/cars_dict.py +74 -0
  133. cars/data_structures/corresponding_tiles_tools.py +186 -0
  134. cars/data_structures/dataframe_converter.py +185 -0
  135. cars/data_structures/format_transformation.py +297 -0
  136. cars/devibrate.py +689 -0
  137. cars/extractroi.py +264 -0
  138. cars/orchestrator/__init__.py +23 -0
  139. cars/orchestrator/achievement_tracker.py +125 -0
  140. cars/orchestrator/cluster/__init__.py +37 -0
  141. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  142. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  143. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  144. cars/orchestrator/cluster/dask_config/README.md +94 -0
  145. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  146. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  147. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  152. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  153. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  154. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  155. cars/orchestrator/cluster/log_wrapper.py +728 -0
  156. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  160. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  162. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  163. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  164. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  165. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  166. cars/orchestrator/memory_tools.py +47 -0
  167. cars/orchestrator/orchestrator.py +755 -0
  168. cars/orchestrator/orchestrator_constants.py +29 -0
  169. cars/orchestrator/registry/__init__.py +23 -0
  170. cars/orchestrator/registry/abstract_registry.py +143 -0
  171. cars/orchestrator/registry/compute_registry.py +106 -0
  172. cars/orchestrator/registry/id_generator.py +116 -0
  173. cars/orchestrator/registry/replacer_registry.py +213 -0
  174. cars/orchestrator/registry/saver_registry.py +363 -0
  175. cars/orchestrator/registry/unseen_registry.py +118 -0
  176. cars/orchestrator/tiles_profiler.py +279 -0
  177. cars/pipelines/__init__.py +26 -0
  178. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  179. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  180. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  181. cars/pipelines/default/__init__.py +26 -0
  182. cars/pipelines/default/default_pipeline.py +1088 -0
  183. cars/pipelines/filling/__init__.py +26 -0
  184. cars/pipelines/filling/filling.py +981 -0
  185. cars/pipelines/formatting/__init__.py +26 -0
  186. cars/pipelines/formatting/formatting.py +186 -0
  187. cars/pipelines/merging/__init__.py +26 -0
  188. cars/pipelines/merging/merging.py +439 -0
  189. cars/pipelines/parameters/__init__.py +0 -0
  190. cars/pipelines/parameters/advanced_parameters.py +256 -0
  191. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  192. cars/pipelines/parameters/application_parameters.py +72 -0
  193. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  194. cars/pipelines/parameters/dsm_inputs.py +349 -0
  195. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  196. cars/pipelines/parameters/output_constants.py +52 -0
  197. cars/pipelines/parameters/output_parameters.py +438 -0
  198. cars/pipelines/parameters/sensor_inputs.py +859 -0
  199. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  200. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  202. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  204. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  206. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  207. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  208. cars/pipelines/pipeline.py +119 -0
  209. cars/pipelines/pipeline_constants.py +38 -0
  210. cars/pipelines/pipeline_template.py +135 -0
  211. cars/pipelines/subsampling/__init__.py +26 -0
  212. cars/pipelines/subsampling/subsampling.py +358 -0
  213. cars/pipelines/surface_modeling/__init__.py +26 -0
  214. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  215. cars/pipelines/tie_points/__init__.py +26 -0
  216. cars/pipelines/tie_points/tie_points.py +536 -0
  217. cars/starter.py +167 -0
  218. cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
  219. cars-1.0.0rc2.dist-info/METADATA +289 -0
  220. cars-1.0.0rc2.dist-info/RECORD +225 -0
  221. cars-1.0.0rc2.dist-info/WHEEL +4 -0
  222. cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
  223. cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
  224. cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
  225. 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