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.
- cars/__init__.py +74 -0
- cars/applications/__init__.py +37 -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 +104 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +630 -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 +655 -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 +1460 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cpython-313-i386-linux-musl.so +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 +588 -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 +270 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +279 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +333 -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_correction_app.py +496 -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 +527 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +531 -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 +634 -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 +762 -0
- cars/applications/resampling/resampling_algo.py +614 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +498 -0
- cars/applications/sparse_matching/sift_app.py +735 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +68 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +238 -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 +757 -0
- cars/cars.py +177 -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 +1541 -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 +244 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +375 -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 +1075 -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 +873 -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/orchestrator.py +905 -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 +2 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +786 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +417 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +69 -0
- cars/pipelines/parameters/application_parameters.py +71 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +918 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +454 -0
- cars/pipelines/parameters/sensor_inputs.py +842 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +49 -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 +31 -0
- cars/pipelines/pipeline_template.py +139 -0
- cars/pipelines/unit/__init__.py +26 -0
- cars/pipelines/unit/unit_pipeline.py +2850 -0
- cars/starter.py +167 -0
- cars-1.0.0rc1.dist-info/METADATA +292 -0
- cars-1.0.0rc1.dist-info/RECORD +202 -0
- cars-1.0.0rc1.dist-info/WHEEL +5 -0
- cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s-1257a076.so.1 +0 -0
- cars.libs/libstdc++-0530927c.so.6.0.32 +0 -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,30 @@
|
|
|
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
|
+
CARS core matching module init file
|
|
23
|
+
"""
|
|
24
|
+
# flake8: noqa: F401
|
|
25
|
+
|
|
26
|
+
from cars.applications.sparse_matching.abstract_sparse_matching_app import (
|
|
27
|
+
SparseMatching,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
from . import sift_app
|