DataScience
article thumbnail
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)
profile

DataScience

@Ninestar

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!