|  |  |  | import numpy as np
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from common.transformations.camera import (FULL_FRAME_SIZE,
 | 
					
						
							|  |  |  |                                            FOCAL,
 | 
					
						
							|  |  |  |                                            get_view_frame_from_road_frame,
 | 
					
						
							|  |  |  |                                            get_view_frame_from_calib_frame,
 | 
					
						
							|  |  |  |                                            vp_from_ke)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 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
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # model
 | 
					
						
							|  |  |  | MODEL_INPUT_SIZE = (320, 160)
 | 
					
						
							|  |  |  | MODEL_YUV_SIZE = (MODEL_INPUT_SIZE[0], MODEL_INPUT_SIZE[1] * 3 // 2)
 | 
					
						
							|  |  |  | MODEL_CX = MODEL_INPUT_SIZE[0] / 2.
 | 
					
						
							|  |  |  | MODEL_CY = 21.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | model_fl = 728.0
 | 
					
						
							|  |  |  | model_height = 1.22
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # canonical model transform
 | 
					
						
							|  |  |  | model_intrinsics = np.array([
 | 
					
						
							|  |  |  |   [model_fl,  0.0,  MODEL_CX],
 | 
					
						
							|  |  |  |   [0.0,  model_fl,  MODEL_CY],
 | 
					
						
							|  |  |  |   [0.0,  0.0,            1.0]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 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]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # CAL model
 | 
					
						
							|  |  |  | CALMODEL_INPUT_SIZE = (512, 256)
 | 
					
						
							|  |  |  | CALMODEL_YUV_SIZE = (CALMODEL_INPUT_SIZE[0], CALMODEL_INPUT_SIZE[1] * 3 // 2)
 | 
					
						
							|  |  |  | CALMODEL_CY = 47.6
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | calmodel_fl = 606.7
 | 
					
						
							|  |  |  | calmodel_intrinsics = np.array([
 | 
					
						
							|  |  |  |   [calmodel_fl,  0.0,  0.5 * CALMODEL_INPUT_SIZE[0]],
 | 
					
						
							|  |  |  |   [0.0,  calmodel_fl,                   CALMODEL_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]])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | model_frame_from_road_frame = np.dot(model_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_road_frame(0, 0, 0, model_height))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bigmodel_frame_from_road_frame = np.dot(bigmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_road_frame(0, 0, 0, model_height))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | medmodel_frame_from_road_frame = np.dot(medmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_road_frame(0, 0, 0, model_height))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | medmodel_frame_from_calib_frame = np.dot(medmodel_intrinsics,
 | 
					
						
							|  |  |  |   get_view_frame_from_calib_frame(0, 0, 0, 0))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | model_frame_from_bigmodel_frame = np.dot(model_intrinsics, np.linalg.inv(bigmodel_intrinsics))
 | 
					
						
							|  |  |  | medmodel_frame_from_bigmodel_frame = np.dot(medmodel_intrinsics, np.linalg.inv(bigmodel_intrinsics))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # 'camera from model camera'
 | 
					
						
							|  |  |  | def get_model_height_transform(camera_frame_from_road_frame, height):
 | 
					
						
							|  |  |  |   camera_frame_from_road_ground = np.dot(camera_frame_from_road_frame, np.array([
 | 
					
						
							|  |  |  |     [1, 0, 0],
 | 
					
						
							|  |  |  |     [0, 1, 0],
 | 
					
						
							|  |  |  |     [0, 0, 0],
 | 
					
						
							|  |  |  |     [0, 0, 1],
 | 
					
						
							|  |  |  |   ]))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   camera_frame_from_road_high = np.dot(camera_frame_from_road_frame, np.array([
 | 
					
						
							|  |  |  |     [1, 0, 0],
 | 
					
						
							|  |  |  |     [0, 1, 0],
 | 
					
						
							|  |  |  |     [0, 0, height - model_height],
 | 
					
						
							|  |  |  |     [0, 0, 1],
 | 
					
						
							|  |  |  |   ]))
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   road_high_from_camera_frame = np.linalg.inv(camera_frame_from_road_high)
 | 
					
						
							|  |  |  |   high_camera_from_low_camera = np.dot(camera_frame_from_road_ground, road_high_from_camera_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return high_camera_from_low_camera
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # camera_frame_from_model_frame aka 'warp matrix'
 | 
					
						
							|  |  |  | # was: calibration.h/CalibrationTransform
 | 
					
						
							|  |  |  | def get_camera_frame_from_model_frame(camera_frame_from_road_frame, height=model_height, camera_fl=FOCAL):
 | 
					
						
							|  |  |  |   vp = vp_from_ke(camera_frame_from_road_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   model_zoom = camera_fl / model_fl
 | 
					
						
							|  |  |  |   model_camera_from_model_frame = np.array([
 | 
					
						
							|  |  |  |     [model_zoom,  0.0,  vp[0] - MODEL_CX * model_zoom],
 | 
					
						
							|  |  |  |     [0.0,  model_zoom,  vp[1] - MODEL_CY * model_zoom],
 | 
					
						
							|  |  |  |     [0.0,  0.0,                                   1.0],
 | 
					
						
							|  |  |  |   ])
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # This function is super slow, so skip it if height is very close to canonical
 | 
					
						
							|  |  |  |   # TODO: speed it up!
 | 
					
						
							|  |  |  |   if abs(height - model_height) > 0.001:
 | 
					
						
							|  |  |  |     camera_from_model_camera = get_model_height_transform(camera_frame_from_road_frame, height)
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     camera_from_model_camera = np.eye(3)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return np.dot(camera_from_model_camera, model_camera_from_model_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_camera_frame_from_medmodel_frame(camera_frame_from_road_frame):
 | 
					
						
							|  |  |  |   camera_frame_from_ground = camera_frame_from_road_frame[:, (0, 1, 3)]
 | 
					
						
							|  |  |  |   medmodel_frame_from_ground = medmodel_frame_from_road_frame[:, (0, 1, 3)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ground_from_medmodel_frame = np.linalg.inv(medmodel_frame_from_ground)
 | 
					
						
							|  |  |  |   camera_frame_from_medmodel_frame = np.dot(camera_frame_from_ground, ground_from_medmodel_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return camera_frame_from_medmodel_frame
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_camera_frame_from_bigmodel_frame(camera_frame_from_road_frame):
 | 
					
						
							|  |  |  |   camera_frame_from_ground = camera_frame_from_road_frame[:, (0, 1, 3)]
 | 
					
						
							|  |  |  |   bigmodel_frame_from_ground = bigmodel_frame_from_road_frame[:, (0, 1, 3)]
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   ground_from_bigmodel_frame = np.linalg.inv(bigmodel_frame_from_ground)
 | 
					
						
							|  |  |  |   camera_frame_from_bigmodel_frame = np.dot(camera_frame_from_ground, ground_from_bigmodel_frame)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return camera_frame_from_bigmodel_frame
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def get_model_frame(snu_full, camera_frame_from_model_frame, size):
 | 
					
						
							|  |  |  |   idxs = camera_frame_from_model_frame.dot(np.column_stack([np.tile(np.arange(size[0]), size[1]),
 | 
					
						
							|  |  |  |                                                             np.tile(np.arange(size[1]), (size[0], 1)).T.flatten(),
 | 
					
						
							|  |  |  |                                                             np.ones(size[0] * size[1])]).T).T.astype(int)
 | 
					
						
							|  |  |  |   calib_flat = snu_full[idxs[:, 1], idxs[:, 0]]
 | 
					
						
							|  |  |  |   if len(snu_full.shape) == 3:
 | 
					
						
							|  |  |  |     calib = calib_flat.reshape((size[1], size[0], 3))
 | 
					
						
							|  |  |  |   elif len(snu_full.shape) == 2:
 | 
					
						
							|  |  |  |     calib = calib_flat.reshape((size[1], size[0]))
 | 
					
						
							|  |  |  |   else:
 | 
					
						
							|  |  |  |     raise ValueError("shape of input img is weird")
 | 
					
						
							|  |  |  |   return calib
 |