cars 1.0.0rc2__cp312-cp312-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of cars might be problematic. Click here for more details.
- cars/__init__.py +86 -0
- cars/applications/__init__.py +40 -0
- cars/applications/application.py +117 -0
- cars/applications/application_constants.py +29 -0
- cars/applications/application_template.py +146 -0
- cars/applications/auxiliary_filling/__init__.py +29 -0
- cars/applications/auxiliary_filling/abstract_auxiliary_filling_app.py +105 -0
- cars/applications/auxiliary_filling/auxiliary_filling_algo.py +475 -0
- cars/applications/auxiliary_filling/auxiliary_filling_from_sensors_app.py +632 -0
- cars/applications/auxiliary_filling/auxiliary_filling_wrappers.py +90 -0
- cars/applications/dem_generation/__init__.py +30 -0
- cars/applications/dem_generation/abstract_dem_generation_app.py +116 -0
- cars/applications/dem_generation/bulldozer_config/base_config.yaml +42 -0
- cars/applications/dem_generation/bulldozer_dem_app.py +641 -0
- cars/applications/dem_generation/bulldozer_memory.py +55 -0
- cars/applications/dem_generation/dem_generation_algo.py +107 -0
- cars/applications/dem_generation/dem_generation_constants.py +32 -0
- cars/applications/dem_generation/dem_generation_wrappers.py +323 -0
- cars/applications/dense_match_filling/__init__.py +30 -0
- cars/applications/dense_match_filling/abstract_dense_match_filling_app.py +242 -0
- cars/applications/dense_match_filling/fill_disp_algo.py +113 -0
- cars/applications/dense_match_filling/fill_disp_constants.py +39 -0
- cars/applications/dense_match_filling/fill_disp_wrappers.py +83 -0
- cars/applications/dense_match_filling/zero_padding_app.py +302 -0
- cars/applications/dense_matching/__init__.py +30 -0
- cars/applications/dense_matching/abstract_dense_matching_app.py +261 -0
- cars/applications/dense_matching/census_mccnn_sgm_app.py +1461 -0
- cars/applications/dense_matching/cpp/__init__.py +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.dll.a +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.cp312-win_amd64.pyd +0 -0
- cars/applications/dense_matching/cpp/dense_matching_cpp.py +94 -0
- cars/applications/dense_matching/cpp/includes/dense_matching.hpp +58 -0
- cars/applications/dense_matching/cpp/meson.build +9 -0
- cars/applications/dense_matching/cpp/src/bindings.cpp +13 -0
- cars/applications/dense_matching/cpp/src/dense_matching.cpp +207 -0
- cars/applications/dense_matching/dense_matching_algo.py +401 -0
- cars/applications/dense_matching/dense_matching_constants.py +89 -0
- cars/applications/dense_matching/dense_matching_wrappers.py +951 -0
- cars/applications/dense_matching/disparity_grid_algo.py +597 -0
- cars/applications/dense_matching/loaders/__init__.py +23 -0
- cars/applications/dense_matching/loaders/config_census_sgm_default.json +31 -0
- cars/applications/dense_matching/loaders/config_census_sgm_homogeneous.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_mountain_and_vegetation.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_shadow.json +30 -0
- cars/applications/dense_matching/loaders/config_census_sgm_sparse.json +36 -0
- cars/applications/dense_matching/loaders/config_census_sgm_urban.json +30 -0
- cars/applications/dense_matching/loaders/config_mapping.json +13 -0
- cars/applications/dense_matching/loaders/config_mccnn.json +28 -0
- cars/applications/dense_matching/loaders/global_land_cover_map.tif +0 -0
- cars/applications/dense_matching/loaders/pandora_loader.py +593 -0
- cars/applications/dsm_filling/__init__.py +32 -0
- cars/applications/dsm_filling/abstract_dsm_filling_app.py +101 -0
- cars/applications/dsm_filling/border_interpolation_app.py +278 -0
- cars/applications/dsm_filling/bulldozer_config/base_config.yaml +44 -0
- cars/applications/dsm_filling/bulldozer_filling_app.py +288 -0
- cars/applications/dsm_filling/exogenous_filling_app.py +341 -0
- cars/applications/dsm_merging/__init__.py +28 -0
- cars/applications/dsm_merging/abstract_dsm_merging_app.py +101 -0
- cars/applications/dsm_merging/weighted_fusion_app.py +639 -0
- cars/applications/grid_correction/__init__.py +30 -0
- cars/applications/grid_correction/abstract_grid_correction_app.py +103 -0
- cars/applications/grid_correction/grid_correction_app.py +557 -0
- cars/applications/grid_generation/__init__.py +30 -0
- cars/applications/grid_generation/abstract_grid_generation_app.py +142 -0
- cars/applications/grid_generation/epipolar_grid_generation_app.py +327 -0
- cars/applications/grid_generation/grid_generation_algo.py +388 -0
- cars/applications/grid_generation/grid_generation_constants.py +46 -0
- cars/applications/grid_generation/transform_grid.py +88 -0
- cars/applications/ground_truth_reprojection/__init__.py +30 -0
- cars/applications/ground_truth_reprojection/abstract_ground_truth_reprojection_app.py +137 -0
- cars/applications/ground_truth_reprojection/direct_localization_app.py +629 -0
- cars/applications/ground_truth_reprojection/ground_truth_reprojection_algo.py +275 -0
- cars/applications/point_cloud_outlier_removal/__init__.py +30 -0
- cars/applications/point_cloud_outlier_removal/abstract_outlier_removal_app.py +385 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_algo.py +392 -0
- cars/applications/point_cloud_outlier_removal/outlier_removal_constants.py +43 -0
- cars/applications/point_cloud_outlier_removal/small_components_app.py +522 -0
- cars/applications/point_cloud_outlier_removal/statistical_app.py +528 -0
- cars/applications/rasterization/__init__.py +30 -0
- cars/applications/rasterization/abstract_pc_rasterization_app.py +183 -0
- cars/applications/rasterization/rasterization_algo.py +534 -0
- cars/applications/rasterization/rasterization_constants.py +38 -0
- cars/applications/rasterization/rasterization_wrappers.py +639 -0
- cars/applications/rasterization/simple_gaussian_app.py +1152 -0
- cars/applications/resampling/__init__.py +28 -0
- cars/applications/resampling/abstract_resampling_app.py +187 -0
- cars/applications/resampling/bicubic_resampling_app.py +760 -0
- cars/applications/resampling/resampling_algo.py +590 -0
- cars/applications/resampling/resampling_constants.py +36 -0
- cars/applications/resampling/resampling_wrappers.py +309 -0
- cars/applications/sensors_subsampling/__init__.py +32 -0
- cars/applications/sensors_subsampling/abstract_subsampling_app.py +109 -0
- cars/applications/sensors_subsampling/rasterio_subsampling_app.py +420 -0
- cars/applications/sensors_subsampling/subsampling_algo.py +108 -0
- cars/applications/sparse_matching/__init__.py +30 -0
- cars/applications/sparse_matching/abstract_sparse_matching_app.py +599 -0
- cars/applications/sparse_matching/sift_app.py +724 -0
- cars/applications/sparse_matching/sparse_matching_algo.py +360 -0
- cars/applications/sparse_matching/sparse_matching_constants.py +66 -0
- cars/applications/sparse_matching/sparse_matching_wrappers.py +282 -0
- cars/applications/triangulation/__init__.py +32 -0
- cars/applications/triangulation/abstract_triangulation_app.py +227 -0
- cars/applications/triangulation/line_of_sight_intersection_app.py +1243 -0
- cars/applications/triangulation/pc_transform.py +552 -0
- cars/applications/triangulation/triangulation_algo.py +371 -0
- cars/applications/triangulation/triangulation_constants.py +38 -0
- cars/applications/triangulation/triangulation_wrappers.py +259 -0
- cars/bundleadjustment.py +750 -0
- cars/cars.py +179 -0
- cars/conf/__init__.py +23 -0
- cars/conf/geoid/egm96.grd +0 -0
- cars/conf/geoid/egm96.grd.hdr +15 -0
- cars/conf/input_parameters.py +156 -0
- cars/conf/mask_cst.py +35 -0
- cars/core/__init__.py +23 -0
- cars/core/cars_logging.py +402 -0
- cars/core/constants.py +191 -0
- cars/core/constants_disparity.py +50 -0
- cars/core/datasets.py +140 -0
- cars/core/geometry/__init__.py +27 -0
- cars/core/geometry/abstract_geometry.py +1119 -0
- cars/core/geometry/shareloc_geometry.py +598 -0
- cars/core/inputs.py +568 -0
- cars/core/outputs.py +176 -0
- cars/core/preprocessing.py +722 -0
- cars/core/projection.py +843 -0
- cars/core/roi_tools.py +215 -0
- cars/core/tiling.py +774 -0
- cars/core/utils.py +164 -0
- cars/data_structures/__init__.py +23 -0
- cars/data_structures/cars_dataset.py +1544 -0
- cars/data_structures/cars_dict.py +74 -0
- cars/data_structures/corresponding_tiles_tools.py +186 -0
- cars/data_structures/dataframe_converter.py +185 -0
- cars/data_structures/format_transformation.py +297 -0
- cars/devibrate.py +689 -0
- cars/extractroi.py +264 -0
- cars/orchestrator/__init__.py +23 -0
- cars/orchestrator/achievement_tracker.py +125 -0
- cars/orchestrator/cluster/__init__.py +37 -0
- cars/orchestrator/cluster/abstract_cluster.py +250 -0
- cars/orchestrator/cluster/abstract_dask_cluster.py +381 -0
- cars/orchestrator/cluster/dask_cluster_tools.py +103 -0
- cars/orchestrator/cluster/dask_config/README.md +94 -0
- cars/orchestrator/cluster/dask_config/dask.yaml +21 -0
- cars/orchestrator/cluster/dask_config/distributed.yaml +70 -0
- cars/orchestrator/cluster/dask_config/jobqueue.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask-schema.yaml +137 -0
- cars/orchestrator/cluster/dask_config/reference_confs/dask.yaml +26 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed-schema.yaml +1009 -0
- cars/orchestrator/cluster/dask_config/reference_confs/distributed.yaml +273 -0
- cars/orchestrator/cluster/dask_config/reference_confs/jobqueue.yaml +212 -0
- cars/orchestrator/cluster/dask_jobqueue_utils.py +204 -0
- cars/orchestrator/cluster/local_dask_cluster.py +116 -0
- cars/orchestrator/cluster/log_wrapper.py +728 -0
- cars/orchestrator/cluster/mp_cluster/__init__.py +27 -0
- cars/orchestrator/cluster/mp_cluster/mp_factorizer.py +212 -0
- cars/orchestrator/cluster/mp_cluster/mp_objects.py +535 -0
- cars/orchestrator/cluster/mp_cluster/mp_tools.py +93 -0
- cars/orchestrator/cluster/mp_cluster/mp_wrapper.py +505 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_cluster.py +986 -0
- cars/orchestrator/cluster/mp_cluster/multiprocessing_profiler.py +399 -0
- cars/orchestrator/cluster/pbs_dask_cluster.py +207 -0
- cars/orchestrator/cluster/sequential_cluster.py +139 -0
- cars/orchestrator/cluster/slurm_dask_cluster.py +234 -0
- cars/orchestrator/memory_tools.py +47 -0
- cars/orchestrator/orchestrator.py +755 -0
- cars/orchestrator/orchestrator_constants.py +29 -0
- cars/orchestrator/registry/__init__.py +23 -0
- cars/orchestrator/registry/abstract_registry.py +143 -0
- cars/orchestrator/registry/compute_registry.py +106 -0
- cars/orchestrator/registry/id_generator.py +116 -0
- cars/orchestrator/registry/replacer_registry.py +213 -0
- cars/orchestrator/registry/saver_registry.py +363 -0
- cars/orchestrator/registry/unseen_registry.py +118 -0
- cars/orchestrator/tiles_profiler.py +279 -0
- cars/pipelines/__init__.py +26 -0
- cars/pipelines/conf_resolution/conf_final_resolution.yaml +5 -0
- cars/pipelines/conf_resolution/conf_first_resolution.yaml +4 -0
- cars/pipelines/conf_resolution/conf_intermediate_resolution.yaml +2 -0
- cars/pipelines/default/__init__.py +26 -0
- cars/pipelines/default/default_pipeline.py +1088 -0
- cars/pipelines/filling/__init__.py +26 -0
- cars/pipelines/filling/filling.py +981 -0
- cars/pipelines/formatting/__init__.py +26 -0
- cars/pipelines/formatting/formatting.py +186 -0
- cars/pipelines/merging/__init__.py +26 -0
- cars/pipelines/merging/merging.py +439 -0
- cars/pipelines/parameters/__init__.py +0 -0
- cars/pipelines/parameters/advanced_parameters.py +256 -0
- cars/pipelines/parameters/advanced_parameters_constants.py +68 -0
- cars/pipelines/parameters/application_parameters.py +72 -0
- cars/pipelines/parameters/depth_map_inputs.py +0 -0
- cars/pipelines/parameters/dsm_inputs.py +349 -0
- cars/pipelines/parameters/dsm_inputs_constants.py +25 -0
- cars/pipelines/parameters/output_constants.py +52 -0
- cars/pipelines/parameters/output_parameters.py +438 -0
- cars/pipelines/parameters/sensor_inputs.py +859 -0
- cars/pipelines/parameters/sensor_inputs_constants.py +51 -0
- cars/pipelines/parameters/sensor_loaders/__init__.py +29 -0
- cars/pipelines/parameters/sensor_loaders/basic_classif_loader.py +86 -0
- cars/pipelines/parameters/sensor_loaders/basic_image_loader.py +98 -0
- cars/pipelines/parameters/sensor_loaders/pivot_classif_loader.py +90 -0
- cars/pipelines/parameters/sensor_loaders/pivot_image_loader.py +105 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader.py +93 -0
- cars/pipelines/parameters/sensor_loaders/sensor_loader_template.py +71 -0
- cars/pipelines/parameters/sensor_loaders/slurp_classif_loader.py +86 -0
- cars/pipelines/pipeline.py +119 -0
- cars/pipelines/pipeline_constants.py +38 -0
- cars/pipelines/pipeline_template.py +135 -0
- cars/pipelines/subsampling/__init__.py +26 -0
- cars/pipelines/subsampling/subsampling.py +358 -0
- cars/pipelines/surface_modeling/__init__.py +26 -0
- cars/pipelines/surface_modeling/surface_modeling.py +2098 -0
- cars/pipelines/tie_points/__init__.py +26 -0
- cars/pipelines/tie_points/tie_points.py +536 -0
- cars/starter.py +167 -0
- cars-1.0.0rc2.dist-info/DELVEWHEEL +2 -0
- cars-1.0.0rc2.dist-info/METADATA +289 -0
- cars-1.0.0rc2.dist-info/RECORD +225 -0
- cars-1.0.0rc2.dist-info/WHEEL +4 -0
- cars-1.0.0rc2.dist-info/entry_points.txt +8 -0
- cars.libs/libgcc_s_seh-1-b2494fcbd4d80cf2c98fdd5261f6d850.dll +0 -0
- cars.libs/libstdc++-6-e9b0d12ae0e9555bbae55e8dfd08c3f7.dll +0 -0
- cars.libs/libwinpthread-1-7882d1b093714ccdfaf4e0789a817792.dll +0 -0
|
@@ -0,0 +1,242 @@
|
|
|
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 dense matches filling application class.
|
|
23
|
+
"""
|
|
24
|
+
import logging
|
|
25
|
+
import os
|
|
26
|
+
from abc import ABCMeta, abstractmethod
|
|
27
|
+
from typing import Dict
|
|
28
|
+
|
|
29
|
+
import numpy as np
|
|
30
|
+
|
|
31
|
+
from cars.applications.application import Application
|
|
32
|
+
from cars.applications.application_template import ApplicationTemplate
|
|
33
|
+
from cars.core import constants as cst
|
|
34
|
+
from cars.core import constants_disparity as cst_disp
|
|
35
|
+
from cars.core.utils import safe_makedirs
|
|
36
|
+
from cars.data_structures import cars_dataset
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@Application.register("dense_match_filling")
|
|
40
|
+
class DenseMatchFilling(ApplicationTemplate, metaclass=ABCMeta):
|
|
41
|
+
"""
|
|
42
|
+
DenseMatchFilling
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
available_applications: Dict = {}
|
|
46
|
+
default_application = "zero_padding"
|
|
47
|
+
|
|
48
|
+
def __new__(cls, conf=None): # pylint: disable=W0613
|
|
49
|
+
"""
|
|
50
|
+
Return the required application
|
|
51
|
+
:raises:
|
|
52
|
+
- KeyError when the required application is not registered
|
|
53
|
+
|
|
54
|
+
:param conf: configuration for matching
|
|
55
|
+
:return: a application_to_use object
|
|
56
|
+
"""
|
|
57
|
+
|
|
58
|
+
fill_method = cls.default_application
|
|
59
|
+
if bool(conf) is False or "method" not in conf:
|
|
60
|
+
logging.info(
|
|
61
|
+
"dense_match_filling method not specified, "
|
|
62
|
+
"default {} is used".format(fill_method)
|
|
63
|
+
)
|
|
64
|
+
else:
|
|
65
|
+
fill_method = conf.get("method", cls.default_application)
|
|
66
|
+
|
|
67
|
+
if fill_method not in cls.available_applications:
|
|
68
|
+
logging.error(
|
|
69
|
+
"No DenseMatchFilling application "
|
|
70
|
+
"named {} registered".format(fill_method)
|
|
71
|
+
)
|
|
72
|
+
raise KeyError(
|
|
73
|
+
"No DenseMatchFilling application"
|
|
74
|
+
" named {} registered".format(fill_method)
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
logging.info(
|
|
78
|
+
"The DenseMatchFilling({}) application "
|
|
79
|
+
"will be used".format(fill_method)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
return super(DenseMatchFilling, cls).__new__(
|
|
83
|
+
cls.available_applications[fill_method]
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
def __init_subclass__(cls, short_name, **kwargs): # pylint: disable=E0302
|
|
87
|
+
super().__init_subclass__(**kwargs)
|
|
88
|
+
# init orchestrator
|
|
89
|
+
cls.orchestrator = None
|
|
90
|
+
|
|
91
|
+
# init classification
|
|
92
|
+
cls.classification = None
|
|
93
|
+
|
|
94
|
+
for name in short_name:
|
|
95
|
+
cls.available_applications[name] = cls
|
|
96
|
+
|
|
97
|
+
@abstractmethod
|
|
98
|
+
def get_poly_margin(self):
|
|
99
|
+
"""
|
|
100
|
+
Get the margin used for polygon
|
|
101
|
+
|
|
102
|
+
:return: self.nb_pix
|
|
103
|
+
:rtype: int
|
|
104
|
+
"""
|
|
105
|
+
|
|
106
|
+
def get_classif(self):
|
|
107
|
+
"""
|
|
108
|
+
Get classification band list
|
|
109
|
+
:return: self.classification
|
|
110
|
+
:rtype: list[str]
|
|
111
|
+
"""
|
|
112
|
+
|
|
113
|
+
classif = []
|
|
114
|
+
if self.classification is not None:
|
|
115
|
+
classif = self.classification
|
|
116
|
+
|
|
117
|
+
return classif
|
|
118
|
+
|
|
119
|
+
@abstractmethod
|
|
120
|
+
def run(
|
|
121
|
+
self,
|
|
122
|
+
epipolar_disparity_map,
|
|
123
|
+
**kwargs,
|
|
124
|
+
):
|
|
125
|
+
"""
|
|
126
|
+
Run filling application.
|
|
127
|
+
|
|
128
|
+
:param epipolar_disparity_map: left disparity
|
|
129
|
+
:type epipolar_disparity_map: CarsDataset
|
|
130
|
+
|
|
131
|
+
:return: filled disparity map: \
|
|
132
|
+
The CarsDataset contains:
|
|
133
|
+
|
|
134
|
+
- N x M Delayed tiles.\
|
|
135
|
+
Each tile will be a future xarray Dataset containing:
|
|
136
|
+
- data with keys : "disp", "disp_msk"
|
|
137
|
+
- attrs with keys: profile, window, overlaps
|
|
138
|
+
- attributes containing:
|
|
139
|
+
"largest_epipolar_region","opt_epipolar_tile_size",
|
|
140
|
+
"epipolar_regions_grid"
|
|
141
|
+
|
|
142
|
+
:rtype: CarsDataset
|
|
143
|
+
|
|
144
|
+
"""
|
|
145
|
+
|
|
146
|
+
def __register_dataset__( # pylint: disable=too-many-positional-arguments
|
|
147
|
+
self,
|
|
148
|
+
epipolar_disparity_map,
|
|
149
|
+
save_intermediate_data,
|
|
150
|
+
pair_folder,
|
|
151
|
+
pair_key,
|
|
152
|
+
app_name=None,
|
|
153
|
+
nodata_epi_disp=0,
|
|
154
|
+
):
|
|
155
|
+
"""
|
|
156
|
+
Create dataset and registered the output in the orchestrator
|
|
157
|
+
|
|
158
|
+
:param epipolar_disparity_map: left disparity
|
|
159
|
+
:type epipolar_disparity_map: CarsDataset
|
|
160
|
+
:param save_intermediate_data: true to save disparity map
|
|
161
|
+
:type save_intermediate_data: bool
|
|
162
|
+
:param pair_folder: path to folder
|
|
163
|
+
:type pair_folder: str
|
|
164
|
+
:param pair_key: pair id
|
|
165
|
+
:type pair_key: str
|
|
166
|
+
:param app_name: application name for file names
|
|
167
|
+
:type app_name: str
|
|
168
|
+
:param nodata_epi_disp: the nodata for the epi disp
|
|
169
|
+
:type nodata_epi_disp: int
|
|
170
|
+
|
|
171
|
+
"""
|
|
172
|
+
if app_name is None:
|
|
173
|
+
app_name = ""
|
|
174
|
+
|
|
175
|
+
# Create CarsDataset Epipolar_disparity
|
|
176
|
+
new_epipolar_disparity_map = cars_dataset.CarsDataset(
|
|
177
|
+
"arrays",
|
|
178
|
+
name="dense_match_filling_" + app_name + "_" + pair_key,
|
|
179
|
+
)
|
|
180
|
+
new_epipolar_disparity_map.create_empty_copy(epipolar_disparity_map)
|
|
181
|
+
|
|
182
|
+
# Update attributes to get epipolar info
|
|
183
|
+
new_epipolar_disparity_map.attributes.update(
|
|
184
|
+
epipolar_disparity_map.attributes
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# Save intermediate data (disparity maps)
|
|
188
|
+
if save_intermediate_data:
|
|
189
|
+
safe_makedirs(pair_folder)
|
|
190
|
+
self.orchestrator.add_to_save_lists(
|
|
191
|
+
os.path.join(
|
|
192
|
+
pair_folder, "epi_disp_" + app_name + "_filled.tif"
|
|
193
|
+
),
|
|
194
|
+
cst_disp.MAP,
|
|
195
|
+
new_epipolar_disparity_map,
|
|
196
|
+
cars_ds_name="epi_disp_" + app_name + "_filled",
|
|
197
|
+
nodata=nodata_epi_disp,
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
self.orchestrator.add_to_save_lists(
|
|
201
|
+
os.path.join(
|
|
202
|
+
pair_folder,
|
|
203
|
+
"epi_disp_color_" + app_name + "_filled.tif",
|
|
204
|
+
),
|
|
205
|
+
cst.EPI_TEXTURE,
|
|
206
|
+
new_epipolar_disparity_map,
|
|
207
|
+
cars_ds_name="epi_disp_color_" + app_name + "_filled",
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
self.orchestrator.add_to_save_lists(
|
|
211
|
+
os.path.join(
|
|
212
|
+
pair_folder,
|
|
213
|
+
"epi_disp_mask_" + app_name + "_filled.tif",
|
|
214
|
+
),
|
|
215
|
+
cst_disp.VALID,
|
|
216
|
+
new_epipolar_disparity_map,
|
|
217
|
+
dtype=np.uint8,
|
|
218
|
+
cars_ds_name="epi_disp_mask_" + app_name + "_filled",
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
self.orchestrator.add_to_save_lists(
|
|
222
|
+
os.path.join(
|
|
223
|
+
pair_folder,
|
|
224
|
+
"epi_confidence_" + app_name + "_filled.tif",
|
|
225
|
+
),
|
|
226
|
+
cst_disp.CONFIDENCE,
|
|
227
|
+
new_epipolar_disparity_map,
|
|
228
|
+
cars_ds_name="epi_ambiguity_" + app_name + "_filled",
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
self.orchestrator.add_to_save_lists(
|
|
232
|
+
os.path.join(
|
|
233
|
+
pair_folder,
|
|
234
|
+
"epi_disp_filling_" + app_name + ".tif",
|
|
235
|
+
),
|
|
236
|
+
cst_disp.FILLING,
|
|
237
|
+
new_epipolar_disparity_map,
|
|
238
|
+
dtype=np.uint8,
|
|
239
|
+
cars_ds_name="epi_disp_filling_" + app_name,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
return new_epipolar_disparity_map
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
# pylint: disable=too-many-lines
|
|
21
|
+
"""
|
|
22
|
+
This module is responsible for the filling disparity algorithms:
|
|
23
|
+
thus it fills the disparity map with values estimated according to
|
|
24
|
+
their neighbourhood.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# Standard imports
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
import numpy as np
|
|
31
|
+
|
|
32
|
+
# Third party imports
|
|
33
|
+
import xarray as xr
|
|
34
|
+
|
|
35
|
+
from cars.applications.dense_match_filling import (
|
|
36
|
+
fill_disp_wrappers as fill_wrap,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
# Cars import
|
|
40
|
+
from cars.core import constants as cst
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def classif_to_stacked_array(disp_map, class_index):
|
|
44
|
+
"""
|
|
45
|
+
Convert disparity dataset to mask correspoding to all classes
|
|
46
|
+
|
|
47
|
+
:param disp_map: disparity dataset
|
|
48
|
+
:type disp_map: xarray Dataset
|
|
49
|
+
:param class_index: classification tags
|
|
50
|
+
:type class_index: list of str
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
index_class = np.where(
|
|
55
|
+
np.isin(
|
|
56
|
+
np.array(disp_map.coords[cst.BAND_CLASSIF].values),
|
|
57
|
+
np.array(class_index),
|
|
58
|
+
)
|
|
59
|
+
)[0].tolist()
|
|
60
|
+
# get index for each band classification of the non zero values
|
|
61
|
+
stack_index = np.any(
|
|
62
|
+
disp_map[cst.EPI_CLASSIFICATION].values[index_class, :, :] > 0,
|
|
63
|
+
axis=0,
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
return stack_index
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def fill_disp_using_zero_padding(
|
|
70
|
+
disp_map: xr.Dataset,
|
|
71
|
+
classif_tag,
|
|
72
|
+
fill_valid_pixels,
|
|
73
|
+
) -> xr.Dataset:
|
|
74
|
+
"""
|
|
75
|
+
Fill disparity map holes
|
|
76
|
+
|
|
77
|
+
:param disp_map: disparity map
|
|
78
|
+
:type disp_map: xr.Dataset
|
|
79
|
+
:param classif_tag: classification tags
|
|
80
|
+
:type classif_tag: list
|
|
81
|
+
:param fill_valid_pixels: option to fill valid pixels
|
|
82
|
+
:type fill_valid_pixels: bool
|
|
83
|
+
"""
|
|
84
|
+
|
|
85
|
+
# get index of the application class config
|
|
86
|
+
# according the coords classif band
|
|
87
|
+
if cst.BAND_CLASSIF in disp_map.coords or "nodata" in classif_tag:
|
|
88
|
+
# get index for each band classification
|
|
89
|
+
if classif_tag != ["nodata"]:
|
|
90
|
+
stack_index = classif_to_stacked_array(disp_map, classif_tag)
|
|
91
|
+
else:
|
|
92
|
+
stack_index = np.zeros(disp_map[cst.EPI_MSK].values.shape)
|
|
93
|
+
if "nodata" in classif_tag:
|
|
94
|
+
nodata_mask = np.logical_or(
|
|
95
|
+
disp_map[cst.EPI_MSK].values != 0,
|
|
96
|
+
np.isnan(disp_map["disp"].values),
|
|
97
|
+
)
|
|
98
|
+
stack_index = np.logical_or(stack_index, nodata_mask)
|
|
99
|
+
|
|
100
|
+
# Exclude pixels invalid in epipolar mask
|
|
101
|
+
mask = disp_map[cst.EPI_MSK].values == 0
|
|
102
|
+
|
|
103
|
+
if not fill_valid_pixels:
|
|
104
|
+
# Exclude valid pixels
|
|
105
|
+
mask = np.logical_and(mask, disp_map["disp_msk"].values == 0)
|
|
106
|
+
stack_index = np.logical_and(stack_index, mask)
|
|
107
|
+
# set disparity value to zero where the class is
|
|
108
|
+
# non zero value and masked region
|
|
109
|
+
disp_map["disp"].values[stack_index] = 0
|
|
110
|
+
disp_map["disp_msk"].values[stack_index] = 255
|
|
111
|
+
disp_map[cst.EPI_MSK].values[stack_index] = 0
|
|
112
|
+
# Add a band to disparity dataset to memorize which pixels are filled
|
|
113
|
+
fill_wrap.update_filling(disp_map, stack_index, "zeros_padding")
|
|
@@ -0,0 +1,39 @@
|
|
|
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 constants of fill_disp.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
# USED VARIABLES
|
|
27
|
+
|
|
28
|
+
FILL_DISP_WITH_PLAN_RUN_TAG = "fill_disparity_with_plan"
|
|
29
|
+
FILL_DISP_WITH_ZEROS_RUN_TAG = "fill_disparity_with_zeros"
|
|
30
|
+
|
|
31
|
+
# PARAMS
|
|
32
|
+
METHOD = "method" # default : 'plane'
|
|
33
|
+
INTERP_TYPE = "interpolation_type"
|
|
34
|
+
INTERP_METHOD = "interpolation_method"
|
|
35
|
+
MAX_DIST = "max_search_distance"
|
|
36
|
+
SMOOTH_IT = "smoothing_iterations"
|
|
37
|
+
IGNORE_NODATA = "ignore_nodata_at_disp_mask_borders"
|
|
38
|
+
IGNORE_ZERO = "ignore_zero_fill_disp_mask_values"
|
|
39
|
+
IGNORE_EXTREMA = "ignore_extrema_disp_values"
|
|
@@ -0,0 +1,83 @@
|
|
|
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
|
+
# pylint: disable=too-many-lines
|
|
21
|
+
"""
|
|
22
|
+
This module is responsible for the filling disparity algorithms:
|
|
23
|
+
thus it fills the disparity map with values estimated according to
|
|
24
|
+
their neighbourhood.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
# Third party imports
|
|
28
|
+
import numpy as np
|
|
29
|
+
import xarray as xr
|
|
30
|
+
|
|
31
|
+
# Cars import
|
|
32
|
+
from cars.core import constants as cst
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def add_empty_filling_band(
|
|
36
|
+
output_dataset: xr.Dataset,
|
|
37
|
+
filling_types: list,
|
|
38
|
+
):
|
|
39
|
+
"""
|
|
40
|
+
Add filling attribute to dataset or band to filling attribute
|
|
41
|
+
if it already exists
|
|
42
|
+
|
|
43
|
+
:param output_dataset: output dataset
|
|
44
|
+
:param filling: input mask of filled pixels
|
|
45
|
+
:param band_filling: type of filling (zero padding or plane)
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
nb_band = len(filling_types)
|
|
49
|
+
nb_row = len(output_dataset.coords[cst.ROW])
|
|
50
|
+
nb_col = len(output_dataset.coords[cst.COL])
|
|
51
|
+
filling = np.zeros((nb_band, nb_row, nb_col), dtype=bool)
|
|
52
|
+
filling = xr.Dataset(
|
|
53
|
+
data_vars={
|
|
54
|
+
cst.EPI_FILLING: ([cst.BAND_FILLING, cst.ROW, cst.COL], filling)
|
|
55
|
+
},
|
|
56
|
+
coords={
|
|
57
|
+
cst.BAND_FILLING: filling_types,
|
|
58
|
+
cst.ROW: output_dataset.coords[cst.ROW],
|
|
59
|
+
cst.COL: output_dataset.coords[cst.COL],
|
|
60
|
+
},
|
|
61
|
+
)
|
|
62
|
+
# Add band to EPI_FILLING attribute or create the attribute
|
|
63
|
+
return xr.merge([output_dataset, filling])
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def update_filling(
|
|
67
|
+
output_dataset: xr.Dataset,
|
|
68
|
+
filling: np.ndarray = None,
|
|
69
|
+
filling_type: str = None,
|
|
70
|
+
):
|
|
71
|
+
"""
|
|
72
|
+
Update filling attribute of dataset with an additional mask
|
|
73
|
+
|
|
74
|
+
:param output_dataset: output dataset
|
|
75
|
+
:param filling: input mask of filled pixels
|
|
76
|
+
:param band_filling: type of filling (zero padding or plane)
|
|
77
|
+
|
|
78
|
+
"""
|
|
79
|
+
# Select accurate band of output according to the type of filling
|
|
80
|
+
filling_type = {cst.BAND_FILLING: filling_type}
|
|
81
|
+
# Add True values from inputmask to output accurate band
|
|
82
|
+
filling = filling.astype(bool)
|
|
83
|
+
output_dataset[cst.EPI_FILLING].sel(**filling_type).values[filling] = True
|