def _generate_v2(point_group, camera, points, start_frame=None, undistort=False): """ Generate the UV file format contents, using JSON format. :param point_group: The 3DE Point Group containing 'points' :type point_group: str :param camera: The 3DE Camera containing 2D 'points' data. :type camera: str :param points: The list of 3DE Points representing 2D data to save. :type points: list of str :param start_frame: The frame number to be considered at 'first frame'. Defaults to 1001 if set to None. :type start_frame: None or int :param undistort: Should we apply undistortion to the 2D points data? Yes or no. :type undistort: bool Each point will store: - Point name - X, Y position (in UV coordinates, per-frame) - Point weight (per-frame) - Point Set name - Point 'Persistent ID' """ assert isinstance(point_group, basestring) assert isinstance(camera, basestring) assert isinstance(points, (list, tuple)) assert start_frame is None or isinstance(start_frame, int) assert isinstance(undistort, bool) if start_frame is None: start_frame = 1001 data = UV_TRACK_HEADER_VERSION_2.copy() cam_num_frames = tde4.getCameraNoFrames(camera) if len(points) == 0: return '' frame0 = int(start_frame) frame0 -= 1 data['num_points'] = len(points) data['is_undistorted'] = bool(undistort) data['points'] = [] for point in points: point_data = {} # Query point information name = tde4.getPointName(point_group, point) uid = None if SUPPORT_PERSISTENT_ID is True: uid = tde4.getPointPersistentID(point_group, point) point_set = tde4.getPointSet(point_group, point) point_set_name = None if point_set is not None: point_set_name = tde4.getSetName(point_group, point_set) point_data['name'] = name point_data['id'] = uid point_data['set_name'] = point_set_name # Write per-frame position data frame = 1 # 3DE starts at frame '1' regardless of the 'start frame'. point_data['per_frame'] = [] pos_block = tde4.getPointPosition2DBlock(point_group, point, camera, 1, cam_num_frames) for pos in pos_block: if pos[0] == -1.0 or pos[1] == -1.0: # No valid data here. frame += 1 continue # Does the 2D point go outside the camera FOV? Is that ok? valid_2d = tde4.isPointPos2DValid(point_group, point, camera, frame) if valid_2d != 1: # No valid data here. frame += 1 continue f = frame + frame0 if undistort is True: pos = tde4.removeDistortion2D(camera, frame, pos) weight = 1.0 if SUPPORT_POINT_WEIGHT_BY_FRAME is True: weight = tde4.getPointWeightByFrame(point_group, point, camera, frame) frame_data = {'frame': f, 'pos': pos, 'weight': weight} point_data['per_frame'].append(frame_data) frame += 1 data['points'].append(point_data) data_str = json.dumps(data) return data_str
def _generate_v2_v3_and_v4(point_group, camera, points, version=None, **kwargs): """ Generate the UV file format contents, using JSON format. Set the individual _generate_v2 or _generate_v3 functions for details of what is stored. :param point_group: The 3DE Point Group containing 'points' :type point_group: str :param camera: The 3DE Camera containing 2D 'points' data. :type camera: str :param points: The list of 3DE Points representing 2D data to save. :type points: list of str :param version: The version of file to generate, UV_TRACK_FORMAT_VERSION_2 or UV_TRACK_FORMAT_VERSION_3. :type version: int :param start_frame: Format v2 and v3; The frame number to be considered at 'first frame'. Defaults to 1001 if set to None. :type start_frame: None or int :param undistort: Format v2; Should we apply undistortion to the 2D points data? Yes or no. :type undistort: bool :returns: A JSON format string, with the UV Track data in it. :rtype: str """ assert isinstance(point_group, basestring) assert isinstance(camera, basestring) assert isinstance(points, (list, tuple)) assert isinstance(version, (int, long)) assert version in [ UV_TRACK_FORMAT_VERSION_2, UV_TRACK_FORMAT_VERSION_3, UV_TRACK_FORMAT_VERSION_4 ] start_frame = kwargs.get('start_frame') assert start_frame is None or isinstance(start_frame, int) if start_frame is None: start_frame = 1001 undistort = None if version == UV_TRACK_FORMAT_VERSION_2: undistort = kwargs.get('undistort') assert isinstance(undistort, bool) data = None if version == UV_TRACK_FORMAT_VERSION_2: data = UV_TRACK_HEADER_VERSION_2.copy() elif version == UV_TRACK_FORMAT_VERSION_3: data = UV_TRACK_HEADER_VERSION_3.copy() elif version == UV_TRACK_FORMAT_VERSION_4: data = UV_TRACK_HEADER_VERSION_4.copy() else: raise ValueError("Version number is invalid; %r" % version) cam_num_frames = tde4.getCameraNoFrames(camera) camera_fov = tde4.getCameraFOV(camera) if len(points) == 0: return '' frame0 = int(start_frame) frame0 -= 1 data['num_points'] = len(points) data['is_undistorted'] = None if version == UV_TRACK_FORMAT_VERSION_2: data['is_undistorted'] = bool(undistort) data['points'] = [] for point in points: point_data = {} # Query point information name = tde4.getPointName(point_group, point) uid = None if SUPPORT_PERSISTENT_ID is True: uid = tde4.getPointPersistentID(point_group, point) point_set = tde4.getPointSet(point_group, point) point_set_name = None if point_set is not None: point_set_name = tde4.getSetName(point_group, point_set) point_data['name'] = name point_data['id'] = uid point_data['set_name'] = point_set_name valid_mode = _get_point_valid_mode(point_group, point) # Get the 3D point position if version in [UV_TRACK_FORMAT_VERSION_3, UV_TRACK_FORMAT_VERSION_4]: point_data['3d'] = _get_3d_data_from_point(point_group, point) # Write per-frame position data frame = 1 # 3DE starts at frame '1' regardless of the 'start frame'. point_data['per_frame'] = [] pos_block = tde4.getPointPosition2DBlock(point_group, point, camera, 1, cam_num_frames) for pos in pos_block: if pos[0] == -1.0 or pos[1] == -1.0: # No valid data here. frame += 1 continue # Is the 2D point obscured? valid = tde4.isPointPos2DValid(point_group, point, camera, frame) if valid == 0: # No valid data here. frame += 1 continue # Check if we're inside the FOV / Frame or not. valid_pos = _is_valid_position(pos, camera_fov, valid_mode) if valid_pos is False: frame += 1 continue pos_undist = pos if undistort is True or undistort is None: pos_undist = tde4.removeDistortion2D(camera, frame, pos) weight = _get_point_weight(point_group, point, camera, frame) f = frame + frame0 frame_data = {'frame': f, 'pos': pos_undist, 'weight': weight} if version in [ UV_TRACK_FORMAT_VERSION_3, UV_TRACK_FORMAT_VERSION_4 ]: frame_data['pos_dist'] = pos point_data['per_frame'].append(frame_data) frame += 1 data['points'].append(point_data) if version == UV_TRACK_FORMAT_VERSION_4: lens = tde4.getCameraLens(camera) data['camera'] = _generate_camera_data(camera, lens, frame0) data_str = json.dumps(data) return data_str