Skip to content

Commit

Permalink
Merge branch '902-mode-sans-echec' into 'master'
Browse files Browse the repository at this point in the history
Resolve "mode sans échec"

Closes #902

See merge request 3d/cars-park/cars!751
  • Loading branch information
dyoussef committed Oct 23, 2024
2 parents 463f8b4 + 9667333 commit f356138
Show file tree
Hide file tree
Showing 7 changed files with 219 additions and 69 deletions.
165 changes: 115 additions & 50 deletions cars/applications/dense_matching/census_mccnn_sgm.py
Original file line number Diff line number Diff line change
Expand Up @@ -513,6 +513,8 @@ def generate_disparity_grids( # noqa: C901
geom_plugin_with_dem_and_geoid,
dmin=None,
dmax=None,
altitude_delta_min=None,
altitude_delta_max=None,
dem_median=None,
dem_min=None,
dem_max=None,
Expand All @@ -536,6 +538,10 @@ def generate_disparity_grids( # noqa: C901
:type dmin: float
:param dmax: maximum disparity
:type dmax: float
:param altitude_delta_max: Delta max of altitude
:type altitude_delta_max: int
:param altitude_delta_min: Delta min of altitude
:type altitude_delta_min: int
:param dem_median: path to median dem
:type dem_median: str
:param dem_min: path to minimum dem
Expand Down Expand Up @@ -612,73 +618,128 @@ def generate_disparity_grids( # noqa: C901

if None not in (dmin, dmax):
# use global disparity range
if None not in (dem_min, dem_max):
if None not in (dem_min, dem_max) or None not in (
altitude_delta_min,
altitude_delta_max,
):
raise RuntimeError("Mix between local and global mode")

grid_min[:, :] = dmin
grid_max[:, :] = dmax

elif None not in (dem_min, dem_max, dem_median):
elif None not in (dem_min, dem_max, dem_median) or None not in (
altitude_delta_min,
altitude_delta_max,
):
# use local disparity
if None not in (dmin, dmax):
raise RuntimeError("Mix between local and global mode")

# dem min max are the same shape
# dem median is not , hence we crop it

# Get associated alti mean / min / max values
dem_median_shape = inputs.rasterio_get_size(dem_median)
dem_median_width, dem_median_height = dem_median_shape

min_row = 0
min_col = 0
max_row = dem_median_height
max_col = dem_median_width

# get epsg
terrain_epsg = inputs.rasterio_get_epsg(dem_median)

# Get epipolar position of all dem mean
transform = inputs.rasterio_get_transform(dem_median)

# get terrain bounds dem min
dem_min_bounds = inputs.rasterio_get_bounds(dem_min)
if None not in (dem_min, dem_max, dem_median):
dem_min_shape = inputs.rasterio_get_size(dem_min)

# find roi in dem_mean
roi_points = np.array(
[
[dem_min_bounds[0], dem_min_bounds[1]],
[dem_min_bounds[0], dem_min_bounds[3]],
[dem_min_bounds[2], dem_min_bounds[1]],
[dem_min_bounds[2], dem_min_bounds[3]],
]
)
if dem_median_shape != dem_min_shape:
# dem min max are the same shape
# dem median is not , hence we crop it

# Transform points to terrain_epsg (dem min is in 4326)
roi_points_terrain = points_cloud_conversion(
roi_points,
4326,
terrain_epsg,
)
# get terrain bounds dem min
dem_min_bounds = inputs.rasterio_get_bounds(dem_min)

# Get pixel roi in dem mean
pixel_roi_dem_mean = inputs.rasterio_get_pixel_points(
dem_median, roi_points_terrain
)
roi_lower_row = np.floor(np.min(pixel_roi_dem_mean[:, 0]))
roi_upper_row = np.ceil(np.max(pixel_roi_dem_mean[:, 0]))
roi_lower_col = np.floor(np.min(pixel_roi_dem_mean[:, 1]))
roi_upper_col = np.ceil(np.max(pixel_roi_dem_mean[:, 1]))

min_row = int(max(0, roi_lower_row))
max_row = int(
min(
dem_median_height, # number of rows
roi_upper_row,
# find roi in dem_mean
roi_points = np.array(
[
[dem_min_bounds[0], dem_min_bounds[1]],
[dem_min_bounds[0], dem_min_bounds[3]],
[dem_min_bounds[2], dem_min_bounds[1]],
[dem_min_bounds[2], dem_min_bounds[3]],
]
)

# Transform points to terrain_epsg (dem min is in 4326)
roi_points_terrain = points_cloud_conversion(
roi_points,
4326,
terrain_epsg,
)

# Get pixel roi in dem mean
pixel_roi_dem_mean = inputs.rasterio_get_pixel_points(
dem_median, roi_points_terrain
)
roi_lower_row = np.floor(np.min(pixel_roi_dem_mean[:, 0]))
roi_upper_row = np.ceil(np.max(pixel_roi_dem_mean[:, 0]))
roi_lower_col = np.floor(np.min(pixel_roi_dem_mean[:, 1]))
roi_upper_col = np.ceil(np.max(pixel_roi_dem_mean[:, 1]))

min_row = int(max(0, roi_lower_row))
max_row = int(
min(
dem_median_height, # number of rows
roi_upper_row,
)
)
min_col = int(max(0, roi_lower_col))
max_col = int(
min(
dem_median_width, # number of columns
roi_upper_col,
)
)

elif (
None not in (altitude_delta_min, altitude_delta_max)
and geom_plugin_with_dem_and_geoid.plugin_name
== "SharelocGeometry"
):
roi_points_terrain = np.array(
[
[
geom_plugin_with_dem_and_geoid.roi_shareloc[1],
geom_plugin_with_dem_and_geoid.roi_shareloc[0],
],
[
geom_plugin_with_dem_and_geoid.roi_shareloc[1],
geom_plugin_with_dem_and_geoid.roi_shareloc[2],
],
[
geom_plugin_with_dem_and_geoid.roi_shareloc[3],
geom_plugin_with_dem_and_geoid.roi_shareloc[0],
],
[
geom_plugin_with_dem_and_geoid.roi_shareloc[3],
geom_plugin_with_dem_and_geoid.roi_shareloc[2],
],
]
)
)
min_col = int(max(0, roi_lower_col))
max_col = int(
min(
dem_median_width, # number of columns
roi_upper_col,

pixel_roi_dem_mean = inputs.rasterio_get_pixel_points(
dem_median, roi_points_terrain
)
)

roi_lower_row = np.floor(np.min(pixel_roi_dem_mean[:, 0]))
roi_upper_row = np.ceil(np.max(pixel_roi_dem_mean[:, 0]))
roi_lower_col = np.floor(np.min(pixel_roi_dem_mean[:, 1]))
roi_upper_col = np.ceil(np.max(pixel_roi_dem_mean[:, 1]))

min_row = int(max(0, roi_lower_row))
max_row = int(min(dem_median_height, roi_upper_row))
min_col = int(max(0, roi_lower_col))
max_col = int(min(dem_median_width, roi_upper_col))

# compute terrain positions to use (all dem min and max)
row_indexes = range(min_row, max_row)
Expand Down Expand Up @@ -707,13 +768,17 @@ def generate_disparity_grids( # noqa: C901
lon_mean = terrain_position_lon_lat[:, 0]
lat_mean = terrain_position_lon_lat[:, 1]

# dem min and max are in 4326
dem_min_list = inputs.rasterio_get_values(
dem_min, lon_mean, lat_mean, points_cloud_conversion
)
dem_max_list = inputs.rasterio_get_values(
dem_max, lon_mean, lat_mean, points_cloud_conversion
)
if None not in (dem_min, dem_max, dem_median):
# dem min and max are in 4326
dem_min_list = inputs.rasterio_get_values(
dem_min, lon_mean, lat_mean, points_cloud_conversion
)
dem_max_list = inputs.rasterio_get_values(
dem_max, lon_mean, lat_mean, points_cloud_conversion
)
else:
dem_min_list = dem_median_list - altitude_delta_min
dem_max_list = dem_median_list + altitude_delta_max

# sensors physical positions
(
Expand Down
6 changes: 6 additions & 0 deletions cars/applications/dense_matching/dense_matching.py
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ def generate_disparity_grids(
geom_plugin_with_dem_and_geoid,
dmin=None,
dmax=None,
altitude_delta_min=None,
altitude_delta_max=None,
dem_min=None,
dem_max=None,
pair_folder=None,
Expand All @@ -154,6 +156,10 @@ def generate_disparity_grids(
:type dmin: float
:param dmax: maximum disparity
:type dmax: float
:param altitude_delta_max: Delta max of altitude
:type altitude_delta_max: int
:param altitude_delta_min: Delta min of altitude
:type altitude_delta_min: int
:param dem_min: path to minimum dem
:type dem_min: str
:param dem_max: path to maximum dem
Expand Down
22 changes: 22 additions & 0 deletions cars/pipelines/parameters/advanced_parameters.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,22 @@ def check_advanced_parameters(conf, check_epipolar_a_priori=True):
overloaded_conf[adv_cst.TERRAIN_A_PRIORI][adv_cst.DEM_MAX] = (
overloaded_conf[adv_cst.TERRAIN_A_PRIORI].get(adv_cst.DEM_MAX, None)
)
overloaded_conf[adv_cst.TERRAIN_A_PRIORI][
adv_cst.ALTITUDE_DELTA_MIN
] = overloaded_conf[adv_cst.TERRAIN_A_PRIORI].get(
adv_cst.ALTITUDE_DELTA_MIN, None
)
overloaded_conf[adv_cst.TERRAIN_A_PRIORI][
adv_cst.ALTITUDE_DELTA_MAX
] = overloaded_conf[adv_cst.TERRAIN_A_PRIORI].get(
adv_cst.ALTITUDE_DELTA_MAX, None
)
terrain_a_priori_schema = {
adv_cst.DEM_MEDIAN: str,
adv_cst.DEM_MIN: Or(str, None), # TODO mandatory with local disp
adv_cst.DEM_MAX: Or(str, None),
adv_cst.ALTITUDE_DELTA_MIN: Or(int, None),
adv_cst.ALTITUDE_DELTA_MAX: Or(int, None),
}
checker_terrain = Checker(terrain_a_priori_schema)
checker_terrain.validate(overloaded_conf[adv_cst.TERRAIN_A_PRIORI])
Expand Down Expand Up @@ -148,6 +160,8 @@ def update_conf(
dem_median=None,
dem_min=None,
dem_max=None,
altitude_delta_max=None,
altitude_delta_min=None,
):
"""
Update the conf with grid correction and disparity range
Expand Down Expand Up @@ -194,3 +208,11 @@ def update_conf(
conf[ADVANCED][adv_cst.TERRAIN_A_PRIORI]["dem_min"] = dem_min
if dem_max is not None:
conf[ADVANCED][adv_cst.TERRAIN_A_PRIORI]["dem_max"] = dem_max
if altitude_delta_max is not None:
conf[ADVANCED][adv_cst.TERRAIN_A_PRIORI][
"altitude_delta_max"
] = altitude_delta_max
if altitude_delta_min is not None:
conf[ADVANCED][adv_cst.TERRAIN_A_PRIORI][
"altitude_delta_min"
] = altitude_delta_min
2 changes: 2 additions & 0 deletions cars/pipelines/parameters/advanced_parameters_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,3 +40,5 @@
DEM_MEDIAN = "dem_median"
DEM_MIN = "dem_min"
DEM_MAX = "dem_max"
ALTITUDE_DELTA_MAX = "altitude_delta_max"
ALTITUDE_DELTA_MIN = "altitude_delta_min"
2 changes: 2 additions & 0 deletions cars/pipelines/parameters/sensor_inputs_constants.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
ROI = "roi"
GEOID = "geoid"
DEM_PATH = "dem"
ALTITUDE_DELTA_MIN = "altitude_delta_min"
ALTITUDE_DELTA_MAX = "altitude_delta_max"

INPUT_IMG = "image"
INPUT_MSK = "mask"
Expand Down
Loading

0 comments on commit f356138

Please sign in to comment.