cars 1.0.0rc1__cp312-cp312-manylinux_2_17_i686.manylinux2014_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 (200) 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-312-i386-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 +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 +200 -0
  199. cars-1.0.0rc1.dist-info/WHEEL +6 -0
  200. cars-1.0.0rc1.dist-info/entry_points.txt +8 -0
File without changes
@@ -0,0 +1,94 @@
1
+ """
2
+ this module contains the headers of the dense_matching_cpp module.
3
+ """
4
+
5
+ # pylint: skip-file
6
+
7
+
8
+ def estimate_right_classif_on_left(
9
+ right_classif,
10
+ disp_map,
11
+ disp_mask,
12
+ disp_min,
13
+ disp_max,
14
+ classification_fusion_margin=-1,
15
+ ):
16
+ """
17
+ Estimate right classif on left image
18
+
19
+ :param right_classif: right classification
20
+ :type right_classif: np ndarray
21
+ :param disp_map: disparity map
22
+ :type disp_map: np ndarray
23
+ :param disp_mask: disparity mask
24
+ :type disp_mask: np ndarray
25
+ :param disp_min: disparity min
26
+ :type disp_min: int
27
+ :param disp_max: disparity max
28
+ :type disp_max: int
29
+
30
+ :return: right classif on left image
31
+ :rtype: np nadarray
32
+ """
33
+ ...
34
+
35
+
36
+ def mask_left_classif_from_right_mask(
37
+ left_classif,
38
+ right_mask,
39
+ disp_min,
40
+ disp_max,
41
+ classification_fusion_margin=-1,
42
+ ):
43
+ """
44
+ Mask left classif with right mask.
45
+
46
+ :param left_classif: right classification
47
+ :type left_classif: np ndarray
48
+ :param right_mask: right mask
49
+ :type right_mask: np ndarray
50
+ :param disp_min: disparity min
51
+ :type disp_min: np.array type int
52
+ :param disp_max: disparity max
53
+ :type disp_max: np.array type int
54
+
55
+ :return: masked left classif
56
+ :rtype: np nadarray
57
+ """
58
+ ...
59
+
60
+
61
+ def estimate_right_grid_disp_int(disp_min_grid, disp_max_grid):
62
+ """
63
+ Estimate right grid min and max for int inputs.
64
+ Correspond to the range of pixels that can be correlated
65
+ from left -> right.
66
+ If no left pixels can be associated to right, use global values
67
+
68
+ :param disp_min_grid: left disp min grid
69
+ :type disp_min_grid: numpy ndarray
70
+ :param disp_max_grid: left disp max grid
71
+ :type disp_max_grid: numpy ndarray
72
+
73
+ :return: disp_min_right_grid, disp_max_right_grid
74
+ :rtype: numpy ndarray, numpy ndarray
75
+ """
76
+ return None, None
77
+
78
+
79
+ def estimate_right_grid_disp_float(disp_min_grid, disp_max_grid):
80
+ """
81
+ Estimate right grid min and max for float inputs.
82
+ Correspond to the range of pixels that can be correlated
83
+ from left -> right.
84
+ If no left pixels can be associated to right, use global values
85
+
86
+ :param disp_min_grid: left disp min grid
87
+ :type disp_min_grid: numpy ndarray
88
+ :param disp_max_grid: left disp max grid
89
+ :type disp_max_grid: numpy ndarray
90
+
91
+ :return: disp_min_right_grid, disp_max_right_grid
92
+ :rtype: numpy ndarray, numpy ndarray
93
+ """
94
+ return None, None
@@ -0,0 +1,58 @@
1
+ #ifndef DENSE_MATCHING_HPP
2
+ #define DENSE_MATCHING_HPP
3
+
4
+ #include <pybind11/numpy.h>
5
+ #include <pybind11/stl.h>
6
+ #include <pybind11/pybind11.h>
7
+
8
+ namespace py = pybind11;
9
+
10
+ /**
11
+ * @brief Estimate right classif on left image
12
+ *
13
+ * @param right_classif right classification
14
+ * @param disp_map disparity map
15
+ * @param disp_mask disparity mask
16
+ * @param disp_min disparity min
17
+ * @param disp_max disparity max
18
+ * @return right classif on left image
19
+ */
20
+ py::array_t<bool> estimate_right_classif_on_left(
21
+ py::array_t<bool> right_classif,
22
+ py::array_t<float> disp_map,
23
+ std::optional<py::array_t<bool>> disp_mask,
24
+ int disp_min,
25
+ int disp_max,
26
+ int classification_fusion_margin
27
+ );
28
+
29
+ /**
30
+ * @brief Mask left classif with right mask
31
+ *
32
+ * @param left_classif left classification
33
+ * @param right_mask right mask
34
+ * @param disp_min disparity min
35
+ * @param disp_max disparity max
36
+ * @return masked left classif
37
+ */
38
+ py::array_t<bool> mask_left_classif_from_right_mask(
39
+ py::array_t<bool> left_classif,
40
+ py::array_t<bool> right_mask,
41
+ py::array_t<int> disp_min,
42
+ py::array_t<int> disp_max,
43
+ int classification_fusion_margin
44
+ );
45
+
46
+ /**
47
+ * @brief Estimate right grid disparities from left grid disparities
48
+ *
49
+ * @param disp_min_grid left disparity minimum grid
50
+ * @param disp_max_grid left disparity maximum grid
51
+ * @return pair of right grid minimum and maximum disparities
52
+ */
53
+ template<typename T> std::pair<py::array_t<T>, py::array_t<T>> estimate_right_grid_disp(
54
+ py::array_t<T> disp_min_grid,
55
+ py::array_t<T> disp_max_grid
56
+ );
57
+
58
+ #endif // DENSE_MATCHING_HPP
@@ -0,0 +1,9 @@
1
+
2
+ py.extension_module(
3
+ 'dense_matching_cpp',
4
+ ['src/bindings.cpp', 'src/dense_matching.cpp'],
5
+ include_directories: ['includes'],
6
+ subdir: 'cars/applications/dense_matching/cpp',
7
+ install: true,
8
+ dependencies : [pybind11_dep],
9
+ )
@@ -0,0 +1,13 @@
1
+ #include "dense_matching.hpp"
2
+ #include <pybind11/pybind11.h>
3
+
4
+ namespace py = pybind11;
5
+
6
+ PYBIND11_MODULE(dense_matching_cpp, m) {
7
+ m.doc() = "cars's pybind11 dense matching module"; // optional module docstring
8
+
9
+ m.def("estimate_right_classif_on_left", &estimate_right_classif_on_left, "");
10
+ m.def("mask_left_classif_from_right_mask", &mask_left_classif_from_right_mask, "");
11
+ m.def("estimate_right_grid_disp_int", &estimate_right_grid_disp<int>, "");
12
+ m.def("estimate_right_grid_disp_float", &estimate_right_grid_disp<float>, "");
13
+ }
@@ -0,0 +1,207 @@
1
+ #include <pybind11/numpy.h>
2
+ #include <pybind11/stl.h>
3
+ #include <pybind11/pybind11.h>
4
+ #include <cmath>
5
+ #include <optional>
6
+
7
+ namespace py = pybind11;
8
+
9
+ py::array_t<bool> estimate_right_classif_on_left(
10
+ py::array_t<bool> right_classif,
11
+ py::array_t<float> disp_map,
12
+ std::optional<py::array_t<bool>> disp_mask,
13
+ int disp_min,
14
+ int disp_max,
15
+ int classification_fusion_margin
16
+ ) {
17
+ auto r_right_classif = right_classif.unchecked<3>();
18
+ auto r_disp_map = disp_map.unchecked<2>();
19
+
20
+ size_t n_bands = r_right_classif.shape(0);
21
+ size_t n_row = r_right_classif.shape(1);
22
+ size_t n_col = r_right_classif.shape(2);
23
+
24
+ bool use_disp_mask = disp_mask.has_value();
25
+ std::unique_ptr<py::detail::unchecked_reference<bool, 2>> r_disp_mask;
26
+ if (use_disp_mask) {
27
+ r_disp_mask = std::make_unique<py::detail::unchecked_reference<bool, 2>>(
28
+ disp_mask.value().unchecked<2>()
29
+ );
30
+ }
31
+
32
+ py::array_t<bool> left_from_right_classif = py::array_t<bool>({n_bands, n_row, n_col});
33
+ auto rw_left_from_right_classif = left_from_right_classif.mutable_unchecked<3>();
34
+
35
+ for (size_t row = 0; row < n_row; row++) {
36
+ for (size_t col = 0; col < n_col; col++) {
37
+
38
+ // find classif
39
+ float fdisp = r_disp_map(row, col);
40
+ bool valid = use_disp_mask ? r_disp_mask->operator()(row, col) : !std::isnan(fdisp);
41
+
42
+ if (valid) {
43
+ // direct value
44
+ int disp = static_cast<int>(std::floor(fdisp));
45
+
46
+ for (size_t band = 0; band < n_bands; band++) {
47
+ rw_left_from_right_classif(
48
+ band, row, col
49
+ ) = r_right_classif(band, row, col+disp);
50
+ }
51
+
52
+ continue;
53
+ }
54
+
55
+ // else: estimate with global range
56
+ for (size_t band = 0; band < n_bands; band++) {
57
+
58
+ bool found = false;
59
+ int margin_min = disp_min;
60
+ int margin_max = disp_max;
61
+ if (classification_fusion_margin != -1) {
62
+ margin_min = -classification_fusion_margin;
63
+ margin_max = classification_fusion_margin;
64
+ }
65
+ for (
66
+ size_t col_classif = std::max(0, static_cast<int>(col)+margin_min);
67
+ col_classif < std::min(
68
+ static_cast<int>(n_col),
69
+ static_cast<int>(col)+margin_max
70
+ );
71
+ col_classif++
72
+ ) {
73
+ if (r_right_classif(band, row, col_classif)) {
74
+ found = true;
75
+ break;
76
+ }
77
+ }
78
+
79
+ rw_left_from_right_classif(band, row, col) = found;
80
+ }
81
+
82
+ }
83
+ }
84
+ return left_from_right_classif;
85
+ }
86
+
87
+ py::array_t<bool> mask_left_classif_from_right_mask(
88
+ py::array_t<bool> left_classif,
89
+ py::array_t<bool> right_mask,
90
+ py::array_t<int> disp_min,
91
+ py::array_t<int> disp_max,
92
+ int classification_fusion_margin
93
+ ) {
94
+
95
+ auto rw_left_classif = left_classif.mutable_unchecked<3>();
96
+ auto r_right_mask = right_mask.unchecked<2>();
97
+ auto r_disp_min = disp_min.unchecked<2>();
98
+ auto r_disp_max = disp_max.unchecked<2>();
99
+
100
+ size_t n_bands = rw_left_classif.shape(0);
101
+ size_t n_row = rw_left_classif.shape(1);
102
+ size_t n_col = rw_left_classif.shape(2);
103
+
104
+ for (size_t row = 0; row < n_row; row++) {
105
+ for (size_t col = 0; col < n_col; col++) {
106
+
107
+ // estimate with global range
108
+ bool all_masked = true;
109
+ int margin_min = r_disp_min(row, col);
110
+ int margin_max = r_disp_max(row, col);
111
+ if (classification_fusion_margin != -1) {
112
+ margin_min = -classification_fusion_margin;
113
+ margin_max = classification_fusion_margin;
114
+ }
115
+ size_t lower_bound = std::max(0, static_cast<int>(col)+margin_min);
116
+ size_t upper_bound = std::min(
117
+ static_cast<int>(n_col),
118
+ static_cast<int>(col)+margin_max
119
+ );
120
+ for (size_t col_classif = lower_bound; col_classif < upper_bound; col_classif++) {
121
+ if (!r_right_mask(row, col_classif)) {
122
+ all_masked = false;
123
+ break;
124
+ }
125
+ }
126
+
127
+ if (all_masked) {
128
+ // Remove classif
129
+ for (size_t band = 0; band < n_bands; band++) {
130
+ rw_left_classif(band, row, col) = false;
131
+ }
132
+ }
133
+ }
134
+ }
135
+
136
+ return left_classif;
137
+ }
138
+
139
+ template<typename T> std::pair<py::array_t<T>, py::array_t<T>> estimate_right_grid_disp(
140
+ py::array_t<T> disp_min_grid,
141
+ py::array_t<T> disp_max_grid
142
+ ) {
143
+
144
+ auto r_disp_min_grid = disp_min_grid.template unchecked<2>();
145
+ auto r_disp_max_grid = disp_max_grid.template unchecked<2>();
146
+
147
+ size_t n_row = r_disp_min_grid.shape(0);
148
+ size_t n_col = r_disp_min_grid.shape(1);
149
+
150
+ T global_left_min = std::numeric_limits<T>::max();
151
+ // min is smallest positive value for floats, instead use lowest
152
+ T global_left_max = std::numeric_limits<T>::lowest();
153
+ for (size_t row = 0; row < n_row; row++) {
154
+ for (size_t col = 0; col < n_col; col++) {
155
+ global_left_min = std::min(global_left_min, r_disp_min_grid(row, col));
156
+ global_left_max = std::max(global_left_max, r_disp_max_grid(row, col));
157
+ }
158
+ }
159
+
160
+ py::array_t<T> disp_min_right_grid({n_row, n_col});
161
+ py::array_t<T> disp_max_right_grid({n_row, n_col});
162
+ auto rw_disp_min_right_grid = disp_min_right_grid.template mutable_unchecked<2>();
163
+ auto rw_disp_max_right_grid = disp_max_right_grid.template mutable_unchecked<2>();
164
+
165
+ for (size_t row = 0; row < n_row; row++) {
166
+ for (size_t col = 0; col < n_col; col++) {
167
+ T min_right = static_cast<T>(n_col);
168
+ T max_right = 0;
169
+ bool is_correlated_left = false;
170
+
171
+ for (size_t left_col = 0; left_col < n_col; left_col++) {
172
+ T left_min = r_disp_min_grid(row, left_col) + static_cast<T>(left_col);
173
+ T left_max = r_disp_max_grid(row, left_col) + static_cast<T>(left_col);
174
+
175
+ if (left_min <= static_cast<T>(col) && static_cast<T>(col) <= left_max) {
176
+ is_correlated_left = true;
177
+ min_right = std::min(
178
+ min_right,
179
+ static_cast<T>(left_col) - static_cast<T>(col)
180
+ );
181
+ max_right = std::max(
182
+ max_right,
183
+ static_cast<T>(left_col) - static_cast<T>(col)
184
+ );
185
+ }
186
+ }
187
+
188
+ if (is_correlated_left) {
189
+ rw_disp_min_right_grid(row, col) = min_right;
190
+ rw_disp_max_right_grid(row, col) = max_right;
191
+ } else {
192
+ rw_disp_min_right_grid(row, col) = -global_left_max;
193
+ rw_disp_max_right_grid(row, col) = -global_left_min;
194
+ }
195
+ }
196
+ }
197
+
198
+ return std::make_pair(disp_min_right_grid, disp_max_right_grid);
199
+ }
200
+
201
+ // force compiler to create functions for int and float
202
+ template std::pair<py::array_t<int>, py::array_t<int>> estimate_right_grid_disp<int>(
203
+ py::array_t<int>, py::array_t<int>
204
+ );
205
+ template std::pair<py::array_t<float>, py::array_t<float>> estimate_right_grid_disp<float>(
206
+ py::array_t<float>, py::array_t<float>
207
+ );