oKen38461's picture
初回コミットに基づくファイルの追加
ac7cda5
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