#encoding = utf8 import copy import time from queue import Empty from enum import Enum import cv2 import numpy as np from .base_render import BaseRender def img_warp_back_inv_m(img, img_to, inv_m): h_up, w_up, c = img_to.shape mask = np.ones_like(img).astype(np.float32) inv_mask = cv2.warpAffine(mask, inv_m, (w_up, h_up)) inv_img = cv2.warpAffine(img, inv_m, (w_up, h_up)) img_to[inv_mask == 1] = inv_img[inv_mask == 1] return img_to class VideoRender(BaseRender): def __init__(self, play_clock, context, human_render): super().__init__(play_clock, context, 'Video') self._human_render = human_render self.index = 0 def render(self, frame, ps): res_frame, idx, type_ = frame if type_ == 0: combine_frame = self._context.frame_list_cycle[idx] else: bbox = self._context.coord_list_cycle[idx] combine_frame = copy.deepcopy(self._context.frame_list_cycle[idx]) af = copy.deepcopy(self._context.align_frames[idx]) inv_m = self._context.inv_m_frames[idx] y1, y2, x1, x2 = bbox try: res_frame = cv2.resize(res_frame.astype(np.uint8), (x2 - x1, y2 - y1)) af[y1:y2, x1:x2] = res_frame combine_frame = img_warp_back_inv_m(af, combine_frame, inv_m) except Exception as e: print('resize error', e) return # cv2.imwrite(f'./images/res_frame_{ self.index }.png', res_frame) # combine_frame[y1:y2, x1:x2] = res_frame # cv2.imwrite(f'/combine_frame_{self.index}.png', combine_frame) # self.index = self.index + 1 image = combine_frame image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) if self._human_render is not None: self._human_render.put_image(image)