|  |  |  | import numpy as np
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from common.transformations.camera import (FULL_FRAME_SIZE,
 | 
					
						
							|  |  |  |                                            get_view_frame_from_calib_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # segnet
 | 
					
						
							|  |  |  | SEGNET_SIZE = (512, 384)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_segnet_frame_from_camera_frame(segnet_size=SEGNET_SIZE, full_frame_size=FULL_FRAME_SIZE):
 | 
					
						
							|  |  |  |   return np.array([[float(segnet_size[0]) / full_frame_size[0],  0.0],
 | 
					
						
							|  |  |  |                    [0.0,  float(segnet_size[1]) / full_frame_size[1]]])
 | 
					
						
							|  |  |  | segnet_frame_from_camera_frame = get_segnet_frame_from_camera_frame() # xx
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # MED model
 | 
					
						
							|  |  |  | MEDMODEL_INPUT_SIZE = (512, 256)
 | 
					
						
							|  |  |  | MEDMODEL_YUV_SIZE = (MEDMODEL_INPUT_SIZE[0], MEDMODEL_INPUT_SIZE[1] * 3 // 2)
 | 
					
						
							|  |  |  | MEDMODEL_CY = 47.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | medmodel_fl = 910.0
 | 
					
						
							|  |  |  | medmodel_intrinsics = np.array([
 | 
					
						
							|  |  |  |   [medmodel_fl,  0.0,  0.5 * MEDMODEL_INPUT_SIZE[0]],
 | 
					
						
							|  |  |  |   [0.0,  medmodel_fl,                   MEDMODEL_CY],
 | 
					
						
							|  |  |  |   [0.0,  0.0,                                   1.0]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # BIG model
 | 
					
						
							|  |  |  | BIGMODEL_INPUT_SIZE = (1024, 512)
 | 
					
						
							|  |  |  | BIGMODEL_YUV_SIZE = (BIGMODEL_INPUT_SIZE[0], BIGMODEL_INPUT_SIZE[1] * 3 // 2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bigmodel_fl = 910.0
 | 
					
						
							|  |  |  | bigmodel_intrinsics = np.array([
 | 
					
						
							|  |  |  |   [bigmodel_fl,  0.0,  0.5 * BIGMODEL_INPUT_SIZE[0]],
 | 
					
						
							|  |  |  |   [0.0,  bigmodel_fl,             256 + MEDMODEL_CY],
 | 
					
						
							|  |  |  |   [0.0,  0.0,                                   1.0]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # SBIG model (big model with the size of small model)
 | 
					
						
							|  |  |  | SBIGMODEL_INPUT_SIZE = (512, 256)
 | 
					
						
							|  |  |  | SBIGMODEL_YUV_SIZE = (SBIGMODEL_INPUT_SIZE[0], SBIGMODEL_INPUT_SIZE[1] * 3 // 2)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sbigmodel_fl = 455.0
 | 
					
						
							|  |  |  | sbigmodel_intrinsics = np.array([
 | 
					
						
							|  |  |  |   [sbigmodel_fl,  0.0,  0.5 * SBIGMODEL_INPUT_SIZE[0]],
 | 
					
						
							|  |  |  |   [0.0,  sbigmodel_fl,      0.5 * (256 + MEDMODEL_CY)],
 | 
					
						
							|  |  |  |   [0.0,  0.0,                                     1.0]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bigmodel_frame_from_calib_frame = np.dot(bigmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_calib_frame(0, 0, 0, 0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | sbigmodel_frame_from_calib_frame = np.dot(sbigmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_calib_frame(0, 0, 0, 0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | medmodel_frame_from_calib_frame = np.dot(medmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_calib_frame(0, 0, 0, 0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | medmodel_frame_from_bigmodel_frame = np.dot(medmodel_intrinsics, np.linalg.inv(bigmodel_intrinsics))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### This function mimics the update_calibration logic in modeld.cc
 | 
					
						
							|  |  |  | ### Manually verified to give similar results to xx.uncommon.utils.transform_img
 | 
					
						
							|  |  |  | def get_warp_matrix(rpy_calib, wide_cam=False, big_model=False, tici=True):
 | 
					
						
							|  |  |  |   from common.transformations.orientation import rot_from_euler
 | 
					
						
							|  |  |  |   from common.transformations.camera import view_frame_from_device_frame, eon_fcam_intrinsics, tici_ecam_intrinsics, tici_fcam_intrinsics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if tici and wide_cam:
 | 
					
						
							|  |  |  |     intrinsics = tici_ecam_intrinsics
 | 
					
						
							|  |  |  |   elif tici:
 | 
					
						
							|  |  |  |     intrinsics = tici_fcam_intrinsics
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     intrinsics = eon_fcam_intrinsics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if big_model:
 | 
					
						
							|  |  |  |     sbigmodel_from_calib = sbigmodel_frame_from_calib_frame[:, (0,1,2)]
 | 
					
						
							|  |  |  |     calib_from_model = np.linalg.inv(sbigmodel_from_calib)
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     medmodel_from_calib = medmodel_frame_from_calib_frame[:, (0,1,2)]
 | 
					
						
							|  |  |  |     calib_from_model = np.linalg.inv(medmodel_from_calib)
 | 
					
						
							|  |  |  |   device_from_calib = rot_from_euler(rpy_calib)
 | 
					
						
							|  |  |  |   camera_from_calib = intrinsics.dot(view_frame_from_device_frame.dot(device_from_calib))
 | 
					
						
							|  |  |  |   warp_matrix = camera_from_calib.dot(calib_from_model)
 | 
					
						
							|  |  |  |   return warp_matrix
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ### This is old, just for debugging
 | 
					
						
							|  |  |  | def get_warp_matrix_old(rpy_calib, wide_cam=False, big_model=False, tici=True):
 | 
					
						
							|  |  |  |   from common.transformations.orientation import rot_from_euler
 | 
					
						
							|  |  |  |   from common.transformations.camera import view_frame_from_device_frame, eon_fcam_intrinsics, tici_ecam_intrinsics, tici_fcam_intrinsics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def get_view_frame_from_road_frame(roll, pitch, yaw, height):
 | 
					
						
							|  |  |  |     device_from_road = rot_from_euler([roll, pitch, yaw]).dot(np.diag([1, -1, -1]))
 | 
					
						
							|  |  |  |     view_from_road = view_frame_from_device_frame.dot(device_from_road)
 | 
					
						
							|  |  |  |     return np.hstack((view_from_road, [[0], [height], [0]]))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if tici and wide_cam:
 | 
					
						
							|  |  |  |     intrinsics = tici_ecam_intrinsics
 | 
					
						
							|  |  |  |   elif tici:
 | 
					
						
							|  |  |  |     intrinsics = tici_fcam_intrinsics
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     intrinsics = eon_fcam_intrinsics
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   model_height = 1.22
 | 
					
						
							|  |  |  |   if big_model:
 | 
					
						
							|  |  |  |     model_from_road = np.dot(sbigmodel_intrinsics,
 | 
					
						
							|  |  |  |              get_view_frame_from_road_frame(0, 0, 0, model_height))
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     model_from_road = np.dot(medmodel_intrinsics,
 | 
					
						
							|  |  |  |              get_view_frame_from_road_frame(0, 0, 0, model_height))
 | 
					
						
							|  |  |  |   ground_from_model = np.linalg.inv(model_from_road[:, (0, 1, 3)])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   E = get_view_frame_from_road_frame(*rpy_calib, 1.22)
 | 
					
						
							|  |  |  |   camera_frame_from_road_frame = intrinsics.dot(E)
 | 
					
						
							|  |  |  |   camera_frame_from_ground = camera_frame_from_road_frame[:,(0,1,3)]
 | 
					
						
							|  |  |  |   warp_matrix = camera_frame_from_ground .dot(ground_from_model)
 | 
					
						
							|  |  |  |   return warp_matrix
 |