cars 1.0.0rc1__cp313-cp313-musllinux_1_2_i686.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 (202) hide show
  1. cars/__init__.py +74 -0
  2. cars/applications/__init__.py +37 -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 +104 -0
  8. cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
  9. cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +630 -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 +655 -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 +1460 -0
  28. cars/applications/dense_matching/cpp/__init__.py +0 -0
  29. cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-i386-linux-musl.so +0 -0
  30. cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
  31. cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
  32. cars/applications/dense_matching/cpp/meson.build +9 -0
  33. cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
  34. cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
  35. cars/applications/dense_matching/dense_matching_algo.py +401 -0
  36. cars/applications/dense_matching/dense_matching_constants.py +89 -0
  37. cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
  38. cars/applications/dense_matching/disparity_grid_algo.py +588 -0
  39. cars/applications/dense_matching/loaders/__init__.py +23 -0
  40. cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
  41. cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
  42. cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
  43. cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
  44. cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
  45. cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
  46. cars/applications/dense_matching/loaders/config_mapping.json +13 -0
  47. cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
  48. cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
  49. cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
  50. cars/applications/dsm_filling/__init__.py +32 -0
  51. cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
  52. cars/applications/dsm_filling/border_interpolation_app.py +270 -0
  53. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  54. cars/applications/dsm_filling/bulldozer_filling_app.py +279 -0
  55. cars/applications/dsm_filling/exogenous_filling_app.py +333 -0
  56. cars/applications/grid_generation/__init__.py +30 -0
  57. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  58. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  59. cars/applications/grid_generation/grid_correction_app.py +496 -0
  60. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  61. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  62. cars/applications/grid_generation/transform_grid.py +88 -0
  63. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  64. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  65. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  66. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  67. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  68. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  69. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  70. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  71. cars/applications/point_cloud_outlier_removal/small_components_app.py +527 -0
  72. cars/applications/point_cloud_outlier_removal/statistical_app.py +531 -0
  73. cars/applications/rasterization/__init__.py +30 -0
  74. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  75. cars/applications/rasterization/rasterization_algo.py +534 -0
  76. cars/applications/rasterization/rasterization_constants.py +38 -0
  77. cars/applications/rasterization/rasterization_wrappers.py +634 -0
  78. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  79. cars/applications/resampling/__init__.py +28 -0
  80. cars/applications/resampling/abstract_resampling_app.py +187 -0
  81. cars/applications/resampling/bicubic_resampling_app.py +762 -0
  82. cars/applications/resampling/resampling_algo.py +614 -0
  83. cars/applications/resampling/resampling_constants.py +36 -0
  84. cars/applications/resampling/resampling_wrappers.py +309 -0
  85. cars/applications/sparse_matching/__init__.py +30 -0
  86. cars/applications/sparse_matching/abstract_sparse_matching_app.py +498 -0
  87. cars/applications/sparse_matching/sift_app.py +735 -0
  88. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  89. cars/applications/sparse_matching/sparse_matching_constants.py +68 -0
  90. cars/applications/sparse_matching/sparse_matching_wrappers.py +238 -0
  91. cars/applications/triangulation/__init__.py +32 -0
  92. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  93. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  94. cars/applications/triangulation/pc_transform.py +552 -0
  95. cars/applications/triangulation/triangulation_algo.py +371 -0
  96. cars/applications/triangulation/triangulation_constants.py +38 -0
  97. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  98. cars/bundleadjustment.py +757 -0
  99. cars/cars.py +177 -0
  100. cars/conf/__init__.py +23 -0
  101. cars/conf/geoid/egm96.grd +0 -0
  102. cars/conf/geoid/egm96.grd.hdr +15 -0
  103. cars/conf/input_parameters.py +156 -0
  104. cars/conf/mask_cst.py +35 -0
  105. cars/core/__init__.py +23 -0
  106. cars/core/cars_logging.py +402 -0
  107. cars/core/constants.py +191 -0
  108. cars/core/constants_disparity.py +50 -0
  109. cars/core/datasets.py +140 -0
  110. cars/core/geometry/__init__.py +27 -0
  111. cars/core/geometry/abstract_geometry.py +1119 -0
  112. cars/core/geometry/shareloc_geometry.py +598 -0
  113. cars/core/inputs.py +568 -0
  114. cars/core/outputs.py +176 -0
  115. cars/core/preprocessing.py +722 -0
  116. cars/core/projection.py +843 -0
  117. cars/core/roi_tools.py +215 -0
  118. cars/core/tiling.py +774 -0
  119. cars/core/utils.py +164 -0
  120. cars/data_structures/__init__.py +23 -0
  121. cars/data_structures/cars_dataset.py +1541 -0
  122. cars/data_structures/cars_dict.py +74 -0
  123. cars/data_structures/corresponding_tiles_tools.py +186 -0
  124. cars/data_structures/dataframe_converter.py +185 -0
  125. cars/data_structures/format_transformation.py +297 -0
  126. cars/devibrate.py +689 -0
  127. cars/extractroi.py +264 -0
  128. cars/orchestrator/__init__.py +23 -0
  129. cars/orchestrator/achievement_tracker.py +125 -0
  130. cars/orchestrator/cluster/__init__.py +37 -0
  131. cars/orchestrator/cluster/abstract_cluster.py +244 -0
  132. cars/orchestrator/cluster/abstract_dask_cluster.py +375 -0
  133. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  134. cars/orchestrator/cluster/dask_config/README.md +94 -0
  135. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  136. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  137. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  138. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  139. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  140. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  141. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  142. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  143. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  144. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  145. cars/orchestrator/cluster/log_wrapper.py +1075 -0
  146. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  147. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  148. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  149. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  150. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  151. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +873 -0
  152. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  153. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  154. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  155. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  156. cars/orchestrator/orchestrator.py +905 -0
  157. cars/orchestrator/orchestrator_constants.py +29 -0
  158. cars/orchestrator/registry/__init__.py +23 -0
  159. cars/orchestrator/registry/abstract_registry.py +143 -0
  160. cars/orchestrator/registry/compute_registry.py +106 -0
  161. cars/orchestrator/registry/id_generator.py +116 -0
  162. cars/orchestrator/registry/replacer_registry.py +213 -0
  163. cars/orchestrator/registry/saver_registry.py +363 -0
  164. cars/orchestrator/registry/unseen_registry.py +118 -0
  165. cars/orchestrator/tiles_profiler.py +279 -0
  166. cars/pipelines/__init__.py +26 -0
  167. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  168. cars/pipelines/conf_resolution/conf_first_resolution.yaml +2 -0
  169. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  170. cars/pipelines/default/__init__.py +26 -0
  171. cars/pipelines/default/default_pipeline.py +786 -0
  172. cars/pipelines/parameters/__init__.py +0 -0
  173. cars/pipelines/parameters/advanced_parameters.py +417 -0
  174. cars/pipelines/parameters/advanced_parameters_constants.py +69 -0
  175. cars/pipelines/parameters/application_parameters.py +71 -0
  176. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  177. cars/pipelines/parameters/dsm_inputs.py +918 -0
  178. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  179. cars/pipelines/parameters/output_constants.py +52 -0
  180. cars/pipelines/parameters/output_parameters.py +454 -0
  181. cars/pipelines/parameters/sensor_inputs.py +842 -0
  182. cars/pipelines/parameters/sensor_inputs_constants.py +49 -0
  183. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  184. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  185. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  186. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  187. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  188. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  189. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  190. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  191. cars/pipelines/pipeline.py +119 -0
  192. cars/pipelines/pipeline_constants.py +31 -0
  193. cars/pipelines/pipeline_template.py +139 -0
  194. cars/pipelines/unit/__init__.py +26 -0
  195. cars/pipelines/unit/unit_pipeline.py +2850 -0
  196. cars/starter.py +167 -0
  197. cars-1.0.0rc1.dist-info/METADATA +292 -0
  198. cars-1.0.0rc1.dist-info/RECORD +202 -0
  199. cars-1.0.0rc1.dist-info/WHEEL +5 -0
  200. cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
  201. cars.libs/libgcc_s-1257a076.so.1 +0 -0
  202. cars.libs/libstdc++-0530927c.so.6.0.32 +0 -0
@@ -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