diff --git a/scripts/Depth2Disparity/depth2disparity.py b/scripts/Depth2Disparity/depth2disparity.py new file mode 100644 index 0000000000000000000000000000000000000000..08c6bb232fc2aa7c70b4564cb33b96cd495e9606 --- /dev/null +++ b/scripts/Depth2Disparity/depth2disparity.py @@ -0,0 +1,105 @@ +# takes 2 pixel coordinates and corresponding distance values - and a relative depth map +# caculates relative to absolute function - if linear +# applies function to relative depth map to get absolute depth map +# then convert to disparity map using depth disparity formula + + +import argparse +import numpy as np +import cv2 + +def relative2abs(rel_depth_map, coord1, dist1, coord2, dist2): + # Get the relative depth values at the two points + rel_value1 = rel_depth_map[coord1[1], coord1[0]] # (y, x) + rel_value2 = rel_depth_map[coord2[1], coord2[0]] + + # Calculate the linear transformation: depth = a * rel_depth + b + a = (dist2 - dist1) / (rel_value2 - rel_value1) + b = dist1 - a * rel_value1 + + # Apply the transformation to the entire relative depth map + abs_depth_map = a * rel_depth_map + b + + # this should not be normalised, the values in the array should equate to literal distances + return abs_depth_map + +def depth2disparity(abs_depth_map, baseline=0.176, disp_scale=2.0, disp_offset=-120): + + # Get image dimensions + height, width = abs_depth_map.shape + + # Calculate angular coordinates for each pixel + unit_w = 2.0 / width # Longitude step size + unit_h = 1.0 / height # Latitude step size + + # Initialize disparity map + disparity_map = np.zeros_like(abs_depth_map, dtype=np.float32) + + for i in range(height): + theta_t = i * unit_h * np.pi # Latitude angle for the row + + for j in range(width): + # Longitude angle (not strictly needed for disparity calculation) + phi = j * unit_w * np.pi + + # Retrieve the absolute depth (r_t) for this pixel + r_t = abs_depth_map[i, j] + + # Avoid invalid or infinite depth values + if r_t <= 0: + disparity_map[i, j] = 0 + continue + + try: + # Compute denominator with stability checks + epsilon = 1e-8 # Small value to prevent division instability + tan_theta_t = np.tan(theta_t) if np.abs(np.cos(theta_t)) > epsilon else np.sign(np.sin(theta_t)) * np.inf + + denominator = r_t * np.sin(theta_t) + r_t * np.cos(theta_t) * tan_theta_t + if denominator <= 0: + disparity_map[i, j] = 0 + continue + + # Calculate angular disparity (d) + angle_disp = np.arctan(baseline / denominator) - theta_t + + # Convert angular disparity to pixel disparity + disparity_map[i, j] = (angle_disp / (unit_h * np.pi) - disp_offset) * disp_scale + + except ZeroDivisionError: + disparity_map[i, j] = 0 + + return disparity_map + +if __name__ == "__main__": + # Set up argument parser + parser = argparse.ArgumentParser(description="Convert relative depth map to absolute depth map.") + parser.add_argument("rel_depth_map", type=str, help="Path to the relative depth map (image file).") + parser.add_argument("coord1", type=int, nargs=2, help="Pixel coordinates of the first point (x y).") + parser.add_argument("dist1", type=float, help="Absolute depth value at the first point.") + parser.add_argument("coord2", type=int, nargs=2, help="Pixel coordinates of the second point (x y).") + parser.add_argument("dist2", type=float, help="Absolute depth value at the second point.") + + # Parse arguments + args = parser.parse_args() + + # Load the relative depth map (dummy placeholder for now) + print(f"Loading relative depth map from: {args.rel_depth_map}") + rel_depth_map = cv2.imread(args.rel_depth_map, cv2.IMREAD_GRAYSCALE) # Load as grayscale + if rel_depth_map is None: + raise FileNotFoundError(f"Unable to load file: {args.rel_depth_map}") + + # Normalise depth map + rel_depth_map = rel_depth_map / 255.0 + + # Convert relative to absolute depth + abs_depth_map = relative2abs( + rel_depth_map, tuple(args.coord1), args.dist1, tuple(args.coord2), args.dist2 + ) + + # Convert depth map to disparity map + disparity_map = depth2disparity(abs_depth_map) + + # save disparity map + #cv2.imwrite(f"{args.rel_depth_map}-disparity.png", disparity_map) + \ No newline at end of file