Spaces:
Paused
Paused
| import cv2 | |
| import numpy as np | |
| from ..utils.blend import blend_images_cy | |
| from ..utils.get_mask import get_mask | |
| class PutBackNumpy: | |
| def __init__( | |
| self, | |
| mask_template_path=None, | |
| ): | |
| if mask_template_path is None: | |
| mask = get_mask(512, 512, 0.9, 0.9) | |
| self.mask_ori_float = np.concatenate([mask] * 3, 2) | |
| else: | |
| mask = cv2.imread(mask_template_path, cv2.IMREAD_COLOR) | |
| self.mask_ori_float = mask.astype(np.float32) / 255.0 | |
| def __call__(self, frame_rgb, render_image, M_c2o): | |
| h, w = frame_rgb.shape[:2] | |
| mask_warped = cv2.warpAffine( | |
| self.mask_ori_float, M_c2o[:2, :], dsize=(w, h), flags=cv2.INTER_LINEAR | |
| ).clip(0, 1) | |
| frame_warped = cv2.warpAffine( | |
| render_image, M_c2o[:2, :], dsize=(w, h), flags=cv2.INTER_LINEAR | |
| ) | |
| result = mask_warped * frame_warped + (1 - mask_warped) * frame_rgb | |
| result = np.clip(result, 0, 255) | |
| result = result.astype(np.uint8) | |
| return result | |
| class PutBack: | |
| def __init__( | |
| self, | |
| mask_template_path=None, | |
| ): | |
| if mask_template_path is None: | |
| mask = get_mask(512, 512, 0.9, 0.9) | |
| mask = np.concatenate([mask] * 3, 2) | |
| else: | |
| mask = cv2.imread(mask_template_path, cv2.IMREAD_COLOR).astype(np.float32) / 255.0 | |
| self.mask_ori_float = np.ascontiguousarray(mask)[:,:,0] | |
| self.result_buffer = None | |
| def __call__(self, frame_rgb, render_image, M_c2o): | |
| h, w = frame_rgb.shape[:2] | |
| mask_warped = cv2.warpAffine( | |
| self.mask_ori_float, M_c2o[:2, :], dsize=(w, h), flags=cv2.INTER_LINEAR | |
| ).clip(0, 1) | |
| frame_warped = cv2.warpAffine( | |
| render_image, M_c2o[:2, :], dsize=(w, h), flags=cv2.INTER_LINEAR | |
| ) | |
| self.result_buffer = np.empty((h, w, 3), dtype=np.uint8) | |
| # Use Cython implementation for blending | |
| blend_images_cy(mask_warped, frame_warped, frame_rgb, self.result_buffer) | |
| return self.result_buffer |