728x90
part4에서 한개의 삼각형만 맞춰봤는데 전체 삼각형에 대해 회전, 변형을 해서 타겟 얼굴 삼각형과 일치시켰다.
첫 번째 이미지에서 삼각형을 뒤틀린 후 두 번째 면과 같은 크기와 위치로 뒤틀린 첫 번째 면을 재구성합니다.
# Reconstructing destination face
img2_new_face_rect_area = img2_new_face[y: y + h, x: x + w]
img2_new_face_rect_area = cv2.add(img2_new_face_rect_area, warped_triangle)
img2_new_face[y: y + h, x: x + w] = img2_new_face_rect_area
얼굴이 삼각형을 결합하여 재구성되면 마스크를 만들어 얼굴을 선택하고 검은색은 img2에서 원래 얼굴을 제거할 수 있습니다.
# Face swapped (putting 1st face into 2nd face)
img2_face_mask = np.zeros_like(img2_gray)
img2_head_mask = cv2.fillConvexPoly(img2_face_mask, convexhull2, 255)
img2_face_mask = cv2.bitwise_not(img2_head_mask)
마스크가 있으면 이미지 2에서 얼굴을 제외한 모든 것을 추출합니다.
img2_head_noface = cv2.bitwise_and(img2, img2, mask=img2_face_mask)
마침내 img2_head_no_face와 img2_new_face를 함께 추가합니다.
result = cv2.add(img2_head_noface, img2_new_face)
원활한 복제
마지막으로 얼굴이 올바르게 바뀌었고 소스 이미지가 대상 이미지에 맞도록 색상을 조정할 차례 입니다.
Opencv에는 이 작업을 자동으로 수행하는 "seamlessClone"이라는 내장 함수가 있습니다.
새로운 얼굴을 취해야 하고 원래 대상 이미지를 취해야 하며 얼굴을 잘라낼 마스크입니다. 얼굴의 중심을 가져와야합니다.
(x, y, w, h) = cv2.boundingRect(convexhull2)
center_face2 = (int((x + x + w) / 2), int((y + y + h) / 2))
seamlessclone = cv2.seamlessClone(result, img2, img2_head_mask, center_face2, cv2.MIXED_CLONE)
'영상처리 > 기초' 카테고리의 다른 글
Python slowfast설치 windows환경 (23) | 2023.01.20 |
---|---|
Instance Segmentation MASK R-CNN (13) | 2023.01.07 |
Face swapping-Select and Warp triangles(part 4) (0) | 2023.01.06 |
Face swapping-Matching the two faces triangulation(part 3) (0) | 2023.01.06 |
Face swapping-Delaunay Triangulation(part 2) 들로네 삼각분할 (19) | 2023.01.05 |