Fix the paste back speed
This commit is contained in:
parent
d81371faea
commit
63bab0f84c
@ -2,6 +2,7 @@ from typing import Tuple, Dict, Any
|
|||||||
|
|
||||||
import cv2
|
import cv2
|
||||||
import numpy
|
import numpy
|
||||||
|
import numpy as np
|
||||||
from cv2.typing import Size
|
from cv2.typing import Size
|
||||||
|
|
||||||
from facefusion.typing import Frame, Kps, Matrix, Template
|
from facefusion.typing import Frame, Kps, Matrix, Template
|
||||||
@ -33,21 +34,20 @@ def warp_face(temp_frame : Frame, kps : Kps, template : Template, size : Size) -
|
|||||||
return crop_frame, affine_matrix
|
return crop_frame, affine_matrix
|
||||||
|
|
||||||
|
|
||||||
def paste_back(temp_frame : Frame, crop_frame : Frame, affine_matrix : Matrix) -> Frame:
|
def paste_back(temp_frame: Frame, crop_frame: Frame, affine_matrix: Matrix) -> Frame:
|
||||||
inverse_affine_matrix = cv2.invertAffineTransform(affine_matrix)
|
inverse_affine_matrix = cv2.invertAffineTransform(affine_matrix)
|
||||||
temp_frame_height, temp_frame_width = temp_frame.shape[0:2]
|
temp_frame_height, temp_frame_width = temp_frame.shape[0:2]
|
||||||
crop_frame_height, crop_frame_width = crop_frame.shape[0:2]
|
crop_frame_height, crop_frame_width = crop_frame.shape[0:2]
|
||||||
inverse_crop_frame = cv2.warpAffine(crop_frame, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
|
inverse_mask = numpy.full((crop_frame_height, crop_frame_width), 255).astype(numpy.float32)
|
||||||
inverse_mask = numpy.ones((crop_frame_height, crop_frame_width, 3))
|
inverse_crop_frame = cv2.warpAffine(inverse_mask, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
|
||||||
inverse_mask_frame = cv2.warpAffine(inverse_mask, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
|
inverse_temp_frame = cv2.warpAffine(crop_frame, inverse_affine_matrix, (temp_frame_width, temp_frame_height))
|
||||||
inverse_mask_frame = cv2.erode(inverse_mask_frame, numpy.ones((2, 2)))
|
inverse_mask_size = int(numpy.sqrt(numpy.sum(inverse_crop_frame == 255)))
|
||||||
inverse_mask_border = inverse_mask_frame * inverse_crop_frame
|
kernel_size = max(inverse_mask_size // 10, 10)
|
||||||
inverse_mask_area = numpy.sum(inverse_mask_frame) // 3
|
inverse_crop_frame = cv2.erode(inverse_crop_frame, numpy.ones((kernel_size, kernel_size)))
|
||||||
inverse_mask_edge = int(inverse_mask_area ** 0.5) // 20
|
kernel_size = max(inverse_mask_size // 20, 5)
|
||||||
inverse_mask_radius = inverse_mask_edge * 2
|
blur_size = kernel_size * 2 + 1
|
||||||
inverse_mask_center = cv2.erode(inverse_mask_frame, numpy.ones((inverse_mask_radius, inverse_mask_radius)))
|
inverse_blur_frame = cv2.GaussianBlur(inverse_crop_frame, (blur_size , blur_size), 0) / 255
|
||||||
inverse_mask_blur_size = inverse_mask_edge * 2 + 1
|
inverse_blur_frame = numpy.reshape(inverse_blur_frame, [ temp_frame_height, temp_frame_width, 1 ])
|
||||||
inverse_mask_blur_area = cv2.GaussianBlur(inverse_mask_center, (inverse_mask_blur_size, inverse_mask_blur_size), 0)
|
temp_frame = inverse_blur_frame * inverse_temp_frame + (1 - inverse_blur_frame) * temp_frame
|
||||||
temp_frame = inverse_mask_blur_area * inverse_mask_border + (1 - inverse_mask_blur_area) * temp_frame
|
temp_frame = temp_frame.astype(numpy.uint8)
|
||||||
temp_frame = numpy.clip(temp_frame, 0, 255).astype(numpy.uint8)
|
|
||||||
return temp_frame
|
return temp_frame
|
||||||
|
Loading…
Reference in New Issue
Block a user