def retarget_motion_in_db(db_url, retargeting, motion_id, motion_name, collection, skeleton_model_name, is_aligned=False, session=None): motion_data = get_motion_by_id_from_remote_db(db_url, motion_id, is_processed=is_aligned) if motion_data is None: print("Error: motion data is empty") return meta_info_str = get_annotation_by_id_from_remote_db( db_url, motion_id, is_processed=is_aligned) motion_vector = MotionVector() motion_vector.from_custom_db_format(motion_data) motion_vector.skeleton = retargeting.src_skeleton new_frames = retargeting.run(motion_vector.frames, frame_range=None) target_motion = MotionVector() target_motion.frames = new_frames target_motion.skeleton = retargeting.target_skeleton target_motion.frame_time = motion_vector.frame_time target_motion.n_frames = len(new_frames) m_data = target_motion.to_db_format() upload_motion_to_db(db_url, motion_name, m_data, collection, skeleton_model_name, meta_info_str, is_processed=is_aligned, session=session)
def slot_accept(self): skeleton_name = str(self.skeletonModelComboBox.currentText()) col = self.get_collection() if col is not None: c_id, c_name, c_type = col self.success = True is_processed = bool(self.isProcessedCheckBox.isChecked()) for c in self.controller_list: name = c.scene_object.name motion_data = c.get_json_data() print("upload motion clip ", name, "to ", c_id, c_name, c_type, skeleton_name) semantic_annotation = c._motion._semantic_annotation meta_info = dict() if len(semantic_annotation) >0: meta_info["sections"] = create_section_dict_from_annotation(semantic_annotation) time_function = c._motion._time_function if time_function is not None and is_processed: meta_info["time_function"] = time_function else: is_processed = False if len(meta_info) > 0: meta_info_str = json.dumps(meta_info) else: meta_info_str = "" upload_motion_to_db(self.db_url, name, motion_data, c_id, skeleton_name, meta_info_str, is_processed, session=self.session) self.close()
def align_motions_in_db(db_url, skeleton_name, c_id, session=None): motion_data = get_motion_vectors(db_url, c_id, skeleton_name, is_aligned=0) # delete old data old_aligned_motions = get_motion_list_from_remote_db(db_url, c_id, skeleton_name, is_processed=True) for motion in old_aligned_motions: delete_motion_by_id_from_remote_db(db_url, motion[0], is_processed=True, session=session) skeleton = load_skeleton_from_db(db_url, skeleton_name) n_motions = len(motion_data) if n_motions > 1: print("start alignment", n_motions) aligned_data = align_motion_data(skeleton, motion_data) print("finished alignment") for key, data in aligned_data.items(): frames = data["frames"] name = motion_data[key]["name"] + "_aligned" mv = get_motion_vector(skeleton, frames) m_data = mv.to_db_format() try: meta_data = json.loads(data["meta_info"]) except: meta_data = dict() meta_data["time_function"] = data["time_function"] meta_data_str = json.dumps(meta_data) upload_motion_to_db(db_url, name, m_data, c_id, skeleton_name, meta_data_str, is_processed=True, session=session) print("uploaded aligned data") elif n_motions == 1: first_key = list(motion_data.keys())[0] name = motion_data[first_key]["name"] + "_aligned" mdata = motion_data[first_key]["data"] meta_data_str = get_annotation_by_id_from_remote_db(db_url, first_key) try: meta_data = json.loads(meta_data_str) except: meta_data = dict() print("process",name) motion = create_motion_vector_from_json(mdata) time_function = list(range(motion.n_frames)) meta_data["time_function"] = time_function meta_data_str = json.dumps(meta_data) upload_motion_to_db(db_url, name, mdata, c_id, skeleton_name, meta_data_str, is_processed=True, session=session) print("Need more than 1 motion, found", n_motions) else: print("No motions found")