cars 1.0.0rc3__cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.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.
Files changed (220) hide show
  1. cars/__init__.py +74 -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 +46 -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.cpython-313-x86_64-linux-gnu.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 +597 -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 +278 -0
  53. cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
  54. cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
  55. cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
  56. cars/applications/dsm_merging/__init__.py +28 -0
  57. cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
  58. cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
  59. cars/applications/grid_correction/__init__.py +30 -0
  60. cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
  61. cars/applications/grid_correction/grid_correction_app.py +557 -0
  62. cars/applications/grid_generation/__init__.py +30 -0
  63. cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
  64. cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
  65. cars/applications/grid_generation/grid_generation_algo.py +388 -0
  66. cars/applications/grid_generation/grid_generation_constants.py +46 -0
  67. cars/applications/grid_generation/transform_grid.py +88 -0
  68. cars/applications/ground_truth_reprojection/__init__.py +30 -0
  69. cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
  70. cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
  71. cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
  72. cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
  73. cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
  74. cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
  75. cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
  76. cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
  77. cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
  78. cars/applications/rasterization/__init__.py +30 -0
  79. cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
  80. cars/applications/rasterization/rasterization_algo.py +534 -0
  81. cars/applications/rasterization/rasterization_constants.py +38 -0
  82. cars/applications/rasterization/rasterization_wrappers.py +639 -0
  83. cars/applications/rasterization/simple_gaussian_app.py +1152 -0
  84. cars/applications/resampling/__init__.py +28 -0
  85. cars/applications/resampling/abstract_resampling_app.py +187 -0
  86. cars/applications/resampling/bicubic_resampling_app.py +760 -0
  87. cars/applications/resampling/resampling_algo.py +590 -0
  88. cars/applications/resampling/resampling_constants.py +36 -0
  89. cars/applications/resampling/resampling_wrappers.py +309 -0
  90. cars/applications/sensors_subsampling/__init__.py +32 -0
  91. cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
  92. cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
  93. cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
  94. cars/applications/sparse_matching/__init__.py +30 -0
  95. cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
  96. cars/applications/sparse_matching/sift_app.py +724 -0
  97. cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
  98. cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
  99. cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
  100. cars/applications/triangulation/__init__.py +32 -0
  101. cars/applications/triangulation/abstract_triangulation_app.py +227 -0
  102. cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
  103. cars/applications/triangulation/pc_transform.py +552 -0
  104. cars/applications/triangulation/triangulation_algo.py +371 -0
  105. cars/applications/triangulation/triangulation_constants.py +38 -0
  106. cars/applications/triangulation/triangulation_wrappers.py +259 -0
  107. cars/bundleadjustment.py +750 -0
  108. cars/cars.py +179 -0
  109. cars/conf/__init__.py +23 -0
  110. cars/conf/geoid/egm96.grd +0 -0
  111. cars/conf/geoid/egm96.grd.hdr +15 -0
  112. cars/conf/input_parameters.py +156 -0
  113. cars/conf/mask_cst.py +35 -0
  114. cars/core/__init__.py +23 -0
  115. cars/core/cars_logging.py +402 -0
  116. cars/core/constants.py +191 -0
  117. cars/core/constants_disparity.py +50 -0
  118. cars/core/datasets.py +140 -0
  119. cars/core/geometry/__init__.py +27 -0
  120. cars/core/geometry/abstract_geometry.py +1130 -0
  121. cars/core/geometry/shareloc_geometry.py +604 -0
  122. cars/core/inputs.py +568 -0
  123. cars/core/outputs.py +176 -0
  124. cars/core/preprocessing.py +722 -0
  125. cars/core/projection.py +843 -0
  126. cars/core/roi_tools.py +215 -0
  127. cars/core/tiling.py +774 -0
  128. cars/core/utils.py +164 -0
  129. cars/data_structures/__init__.py +23 -0
  130. cars/data_structures/cars_dataset.py +1544 -0
  131. cars/data_structures/cars_dict.py +74 -0
  132. cars/data_structures/corresponding_tiles_tools.py +186 -0
  133. cars/data_structures/dataframe_converter.py +185 -0
  134. cars/data_structures/format_transformation.py +297 -0
  135. cars/devibrate.py +689 -0
  136. cars/extractroi.py +264 -0
  137. cars/orchestrator/__init__.py +23 -0
  138. cars/orchestrator/achievement_tracker.py +125 -0
  139. cars/orchestrator/cluster/__init__.py +37 -0
  140. cars/orchestrator/cluster/abstract_cluster.py +250 -0
  141. cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
  142. cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
  143. cars/orchestrator/cluster/dask_config/README.md +94 -0
  144. cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
  145. cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
  146. cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
  147. cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
  148. cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
  149. cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
  150. cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
  151. cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
  152. cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
  153. cars/orchestrator/cluster/local_dask_cluster.py +116 -0
  154. cars/orchestrator/cluster/log_wrapper.py +728 -0
  155. cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
  156. cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
  157. cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
  158. cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
  159. cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
  160. cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
  161. cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
  162. cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
  163. cars/orchestrator/cluster/sequential_cluster.py +139 -0
  164. cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
  165. cars/orchestrator/memory_tools.py +47 -0
  166. cars/orchestrator/orchestrator.py +755 -0
  167. cars/orchestrator/orchestrator_constants.py +29 -0
  168. cars/orchestrator/registry/__init__.py +23 -0
  169. cars/orchestrator/registry/abstract_registry.py +143 -0
  170. cars/orchestrator/registry/compute_registry.py +106 -0
  171. cars/orchestrator/registry/id_generator.py +116 -0
  172. cars/orchestrator/registry/replacer_registry.py +213 -0
  173. cars/orchestrator/registry/saver_registry.py +363 -0
  174. cars/orchestrator/registry/unseen_registry.py +118 -0
  175. cars/orchestrator/tiles_profiler.py +279 -0
  176. cars/pipelines/__init__.py +26 -0
  177. cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
  178. cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
  179. cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
  180. cars/pipelines/default/__init__.py +26 -0
  181. cars/pipelines/default/default_pipeline.py +1095 -0
  182. cars/pipelines/filling/__init__.py +26 -0
  183. cars/pipelines/filling/filling.py +981 -0
  184. cars/pipelines/formatting/__init__.py +26 -0
  185. cars/pipelines/formatting/formatting.py +190 -0
  186. cars/pipelines/merging/__init__.py +26 -0
  187. cars/pipelines/merging/merging.py +439 -0
  188. cars/pipelines/parameters/__init__.py +0 -0
  189. cars/pipelines/parameters/advanced_parameters.py +256 -0
  190. cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
  191. cars/pipelines/parameters/application_parameters.py +72 -0
  192. cars/pipelines/parameters/depth_map_inputs.py +0 -0
  193. cars/pipelines/parameters/dsm_inputs.py +349 -0
  194. cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
  195. cars/pipelines/parameters/output_constants.py +52 -0
  196. cars/pipelines/parameters/output_parameters.py +435 -0
  197. cars/pipelines/parameters/sensor_inputs.py +859 -0
  198. cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
  199. cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
  200. cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
  201. cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
  202. cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
  203. cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
  204. cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
  205. cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
  206. cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
  207. cars/pipelines/pipeline.py +119 -0
  208. cars/pipelines/pipeline_constants.py +38 -0
  209. cars/pipelines/pipeline_template.py +135 -0
  210. cars/pipelines/subsampling/__init__.py +26 -0
  211. cars/pipelines/subsampling/subsampling.py +358 -0
  212. cars/pipelines/surface_modeling/__init__.py +26 -0
  213. cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
  214. cars/pipelines/tie_points/__init__.py +26 -0
  215. cars/pipelines/tie_points/tie_points.py +536 -0
  216. cars/starter.py +167 -0
  217. cars-1.0.0rc3.dist-info/METADATA +289 -0
  218. cars-1.0.0rc3.dist-info/RECORD +220 -0
  219. cars-1.0.0rc3.dist-info/WHEEL +6 -0
  220. cars-1.0.0rc3.dist-info/entry_points.txt +8 -0
@@ -0,0 +1,309 @@
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
+ Resampling module:
23
+ contains functions used for epipolar resampling
24
+ """
25
+
26
+ import copy
27
+
28
+ # Standard imports
29
+ import logging
30
+
31
+ # Third party imports
32
+ import numpy as np
33
+
34
+ # CARS imports
35
+ from cars.core import constants as cst
36
+ from cars.core import inputs
37
+ from cars.orchestrator.cluster.log_wrapper import cars_profile
38
+ from cars.pipelines.parameters import sensor_inputs_constants as sens_cst
39
+
40
+
41
+ @cars_profile(name="Get paths and bands", interval=0.5)
42
+ def get_paths_and_bands_from_image(sensor_image, required_bands=None):
43
+ """
44
+ Reformat file paths and bands required from each file to ease reading
45
+
46
+ :param sensor_image: input configuration of an image
47
+ :type sensor_image: dict
48
+ :param required_bands: required bands for resampling
49
+ :type required_bands: list
50
+ """
51
+ paths = {}
52
+ if required_bands is None:
53
+ # All bands are required bands
54
+ required_bands = list(sensor_image["bands"].keys())
55
+ for band in required_bands:
56
+ file_path = sensor_image["bands"][band]["path"]
57
+ band_id = sensor_image["bands"][band]["band"] + 1
58
+ if file_path in paths:
59
+ paths[file_path]["band_id"].append(band_id)
60
+ paths[file_path]["band_name"].append(band)
61
+ else:
62
+ paths[file_path] = {"band_id": [band_id], "band_name": [band]}
63
+ return paths
64
+
65
+
66
+ def get_path_and_values_from_classif(sensor_classif):
67
+ """
68
+ Reformat file paths and bands required from each file to ease reading
69
+
70
+ :param sensor_classif: input configuration of a classif
71
+ :type sensor_image: dict
72
+ """
73
+ paths = {sensor_classif["path"]: {"values": sensor_classif["values"]}}
74
+ return paths
75
+
76
+
77
+ def get_sensors_bounds(sensor_image_left, sensor_image_right):
78
+ """
79
+ Get bounds of sensor images
80
+ Bounds: BoundingBox(left, bottom, right, top)
81
+
82
+ :param sensor_image_left: left sensor
83
+ :type sensor_image_left: dict
84
+ :param sensor_image_right: right sensor
85
+ :type sensor_image_right: dict
86
+
87
+ :return: left image bounds, right image bounds
88
+ :rtype: tuple(list, list)
89
+ """
90
+
91
+ left_sensor_bounds = list(
92
+ inputs.rasterio_get_bounds(
93
+ sensor_image_left[sens_cst.INPUT_IMG]["bands"]["b0"]["path"],
94
+ apply_resolution_sign=True,
95
+ )
96
+ )
97
+
98
+ right_sensor_bounds = list(
99
+ inputs.rasterio_get_bounds(
100
+ sensor_image_right[sens_cst.INPUT_IMG]["bands"]["b0"]["path"],
101
+ apply_resolution_sign=True,
102
+ )
103
+ )
104
+
105
+ return left_sensor_bounds, right_sensor_bounds
106
+
107
+
108
+ def check_tiles_in_sensor( # pylint: disable=too-many-positional-arguments
109
+ sensor_image_left,
110
+ sensor_image_right,
111
+ image_tiling,
112
+ grid_left,
113
+ grid_right,
114
+ geom_plugin,
115
+ ):
116
+ """
117
+ Check if epipolar tiles will be used.
118
+ A tile is not used if is outside sensor bounds
119
+
120
+ :param sensor_image_left: left sensor
121
+ :type sensor_image_left: dict
122
+ :param sensor_image_right: right sensor
123
+ :type sensor_image_right: dict
124
+ :param image_tiling: epipolar tiling grid
125
+ :type image_tiling: np.array
126
+ :param grid_left: left epipolar grid
127
+ :type grid_left: CarsDataset
128
+ :param grid_right: right epipolar grid
129
+ :type grid_right: CarsDataset
130
+
131
+ :return: left in sensor, right in sensor
132
+ :rtype: np.array(bool), np.array(bool)
133
+
134
+ """
135
+
136
+ # Get sensor image bounds
137
+ # BoundingBox: left, bottom, right, top:
138
+ left_sensor_bounds, right_sensor_bounds = get_sensors_bounds(
139
+ sensor_image_left, sensor_image_right
140
+ )
141
+
142
+ # Get tile epipolar corners
143
+ interpolation_margin = 20 # arbitrary
144
+
145
+ # add margin
146
+ tiling_grid = copy.copy(image_tiling)
147
+ tiling_grid[:, :, 0] -= interpolation_margin
148
+ tiling_grid[:, :, 1] += interpolation_margin
149
+ tiling_grid[:, :, 2] -= interpolation_margin
150
+ tiling_grid[:, :, 3] += interpolation_margin
151
+
152
+ # Generate matches
153
+ matches = np.empty((4 * tiling_grid.shape[0] * tiling_grid.shape[1], 2))
154
+ nb_row = tiling_grid.shape[0]
155
+ for row in range(tiling_grid.shape[0]):
156
+ for col in range(tiling_grid.shape[1]):
157
+ y_min, y_max, x_min, x_max = tiling_grid[row, col]
158
+ matches[
159
+ 4 * nb_row * col + 4 * row : 4 * nb_row * col + 4 * row + 4, :
160
+ ] = np.array(
161
+ [
162
+ [x_min, y_min],
163
+ [x_min, y_max],
164
+ [x_max, y_max],
165
+ [x_max, y_min],
166
+ ]
167
+ )
168
+
169
+ # create artificial matches
170
+ tiles_coords_as_matches = np.concatenate([matches, matches], axis=1)
171
+
172
+ # Compute sensors positions
173
+ # Transform to sensor coordinates
174
+ (
175
+ sensor_pos_left,
176
+ sensor_pos_right,
177
+ ) = geom_plugin.matches_to_sensor_coords(
178
+ grid_left,
179
+ grid_right,
180
+ tiles_coords_as_matches,
181
+ cst.MATCHES_MODE,
182
+ )
183
+
184
+ in_sensor_left_array = np.ones(
185
+ (image_tiling.shape[0], image_tiling.shape[1]), dtype=bool
186
+ )
187
+ in_sensor_right_array = np.ones(
188
+ (image_tiling.shape[0], image_tiling.shape[1]), dtype=bool
189
+ )
190
+
191
+ for row in range(tiling_grid.shape[0]):
192
+ for col in range(tiling_grid.shape[1]):
193
+ # Get sensors position for tile
194
+ left_sensor_tile = sensor_pos_left[
195
+ 4 * nb_row * col + 4 * row : 4 * nb_row * col + 4 * row + 4, :
196
+ ]
197
+ right_sensor_tile = sensor_pos_right[
198
+ 4 * nb_row * col + 4 * row : 4 * nb_row * col + 4 * row + 4, :
199
+ ]
200
+
201
+ in_sensor_left, in_sensor_right = check_tile_inclusion(
202
+ left_sensor_bounds,
203
+ right_sensor_bounds,
204
+ left_sensor_tile,
205
+ right_sensor_tile,
206
+ )
207
+
208
+ in_sensor_left_array[row, col] = in_sensor_left
209
+ in_sensor_right_array[row, col] = in_sensor_right
210
+
211
+ nb_tiles = tiling_grid.shape[0] * tiling_grid.shape[1]
212
+ tiles_dumped_left = nb_tiles - np.sum(in_sensor_left_array)
213
+ tiles_dumped_right = nb_tiles - np.sum(in_sensor_right_array)
214
+
215
+ logging.info(
216
+ "Number of left epipolar image tiles outside left sensor "
217
+ "image and removed: {}".format(tiles_dumped_left)
218
+ )
219
+ logging.info(
220
+ "Number of right epipolar image tiles outside right sensor "
221
+ "image and removed: {}".format(tiles_dumped_right)
222
+ )
223
+
224
+ return in_sensor_left_array, in_sensor_right_array
225
+
226
+
227
+ def check_tile_inclusion(
228
+ left_sensor_bounds,
229
+ right_sensor_bounds,
230
+ sensor_pos_left,
231
+ sensor_pos_right,
232
+ ):
233
+ """
234
+ Check if tile is in sensor image
235
+
236
+ :param left_sensor_bounds: bounds of left sensor
237
+ :type left_sensor_bounds: list
238
+ :param right_sensor_bounds: bounds of right sensor
239
+ :type right_sensor_bounds: list
240
+ :param sensor_pos_left: left sensor position
241
+ :type sensor_pos_left: np.array
242
+ :param sensor_pos_right: right sensor position
243
+ :type sensor_pos_right: np.array
244
+
245
+ :return: left tile in sensor image left, right tile in sensor image right
246
+ :rtype: tuple(bool, bool)
247
+ """
248
+
249
+ # check if outside of image
250
+ # Do not use tile if the whole tile is outside sensor
251
+ in_sensor_left = True
252
+ if (
253
+ (
254
+ np.all(
255
+ sensor_pos_left[:, 0]
256
+ < min(left_sensor_bounds[0], left_sensor_bounds[2])
257
+ )
258
+ )
259
+ or (
260
+ np.all(
261
+ sensor_pos_left[:, 0]
262
+ > max(left_sensor_bounds[0], left_sensor_bounds[2])
263
+ )
264
+ )
265
+ or (
266
+ np.all(
267
+ sensor_pos_left[:, 1]
268
+ > max(left_sensor_bounds[1], left_sensor_bounds[3])
269
+ )
270
+ )
271
+ or (
272
+ np.all(
273
+ sensor_pos_left[:, 1]
274
+ < min(left_sensor_bounds[1], left_sensor_bounds[3])
275
+ )
276
+ )
277
+ ):
278
+ in_sensor_left = False
279
+
280
+ in_sensor_right = True
281
+ if (
282
+ (
283
+ np.all(
284
+ sensor_pos_right[:, 0]
285
+ < min(right_sensor_bounds[0], right_sensor_bounds[2])
286
+ )
287
+ )
288
+ or (
289
+ np.all(
290
+ sensor_pos_right[:, 0]
291
+ > max(right_sensor_bounds[0], right_sensor_bounds[2])
292
+ )
293
+ )
294
+ or (
295
+ np.all(
296
+ sensor_pos_right[:, 1]
297
+ > max(right_sensor_bounds[1], right_sensor_bounds[3])
298
+ )
299
+ )
300
+ or (
301
+ np.all(
302
+ sensor_pos_right[:, 1]
303
+ < min(right_sensor_bounds[1], right_sensor_bounds[3])
304
+ )
305
+ )
306
+ ):
307
+ in_sensor_right = False
308
+
309
+ return in_sensor_left, in_sensor_right
@@ -0,0 +1,32 @@
1
+ # pylint: disable=missing-module-docstring
2
+ # flake8: noqa
3
+ #
4
+ # !/usr/bin/env python
5
+ # coding: utf8
6
+ #
7
+ # Copyright (c) 2020 Centre National d'Etudes Spatiales (CNES).
8
+ #
9
+ # This file is part of CARS
10
+ # (see https://github.com/CNES/cars).
11
+ #
12
+ # Licensed under the Apache License, Version 2.0 (the "License");
13
+ # you may not use this file except in compliance with the License.
14
+ # You may obtain a copy of the License at
15
+ #
16
+ # http://www.apache.org/licenses/LICENSE-2.0
17
+ #
18
+ # Unless required by applicable law or agreed to in writing, software
19
+ # distributed under the License is distributed on an "AS IS" BASIS,
20
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
+ # See the License for the specific language governing permissions and
22
+ # limitations under the License.
23
+ #
24
+ """
25
+ CARS core triangulation module init file
26
+ """
27
+
28
+ from cars.applications.sensors_subsampling.abstract_subsampling_app import (
29
+ SensorsSubsampling,
30
+ )
31
+
32
+ from . import rasterio_subsampling_app
@@ -0,0 +1,109 @@
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 matching 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("sensors_subsampling")
33
+ class SensorsSubsampling(ApplicationTemplate, metaclass=ABCMeta):
34
+ """
35
+ SensorsSubsampling
36
+ """
37
+
38
+ available_applications: Dict = {}
39
+ default_application = "rasterio"
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 matching
48
+ :return: a application_to_use object
49
+ """
50
+
51
+ subsampling_method = cls.default_application
52
+ if bool(conf) is False or "method" not in conf:
53
+ logging.info(
54
+ "subsampling method not specified, default "
55
+ " {} is used".format(subsampling_method)
56
+ )
57
+ else:
58
+ subsampling_method = conf.get("method", cls.default_application)
59
+
60
+ if subsampling_method not in cls.available_applications:
61
+ logging.error(
62
+ "No subsampling application named {} registered".format(
63
+ subsampling_method
64
+ )
65
+ )
66
+ raise KeyError(
67
+ "No subsampling application named {} registered".format(
68
+ subsampling_method
69
+ )
70
+ )
71
+
72
+ logging.info(
73
+ "The subsampling({}) application will be used".format(
74
+ subsampling_method
75
+ )
76
+ )
77
+
78
+ return super(SensorsSubsampling, cls).__new__(
79
+ cls.available_applications[subsampling_method]
80
+ )
81
+
82
+ def __init_subclass__(cls, short_name, **kwargs): # pylint: disable=E0302
83
+ super().__init_subclass__(**kwargs)
84
+ for name in short_name:
85
+ cls.available_applications[name] = cls
86
+
87
+ def __init__(self, conf=None):
88
+ """
89
+ Init function of SensorsSubsampling
90
+
91
+ :param conf: configuration
92
+ :return: an application_to_use object
93
+ """
94
+
95
+ super().__init__(conf=conf)
96
+
97
+ @abstractmethod
98
+ def run( # pylint: disable=too-many-positional-arguments
99
+ self,
100
+ id_image,
101
+ sensor_dict,
102
+ resolution,
103
+ out_directory,
104
+ orchestrator,
105
+ ):
106
+ """
107
+ Run Subsampling application.
108
+
109
+ """