본문 바로가기
Projects/Face Toy Project

[GUI 기반 Face Toy Project -6] real time face alignment opencv

by apsdfjoi 2023. 4. 11.
728x90
반응형

이전 글에서 다룬 face alignment를 이 글에서 실시간으로 적용해 보도록 한다.

 

[GUI 기반 Face Toy Project -5] face alignment opencv

이전 글에서 real time face swap (replacement)를 했다. [GUI 기반 Face Toy Project -4] real time face swap 이전 글에서 2개의 얼굴 사진을 이용해서 face swap을 했다. [GUI 기반 Face Toy Project -3] 들로네 삼각 변환(Delaunay

yeeca.tistory.com

실행 결과는 아래와 같다.

눈을 기준으로 수평 정렬되므로 배경이 움직이는 것처럼 보인다.

코드는 이전 pyqt5 코드에서 수정, 추가했다.

def test_m4(frame):
    frame = face_align(frame)
    return frame

test_m4()는 button1과 연결한다.

 def button1_clicked(self):
        print('btn1')
        self.handler = 3

 

def face_align(frame):
    """
        frame : RGB converted ndarray
    """
   
    idx_to_coordinates = get_idx_to_coordinates(frame)
    if idx_to_coordinates:
        try:
            frame = get_masked_frame(frame,idx_to_coordinates[0],connection=mpFaceMesh.FACEMESH_FACE_OVAL,thickness=20)
            frame = get_masked_frame(frame,idx_to_coordinates[0],connection=mpFaceMesh.FACEMESH_LIPS,color=(255,0,0),thickness=2)
            frame = align(frame,idx_to_coordinates[0],1)
        except:
            return frame
    return frame

위 코드의 함수는 GUI 기반 Face Toy Project -5 게시글에 설명되어 있으며, 추가한 함수는 get_masked_frame이다.

내 얼굴을 가리기 위해 align() 함수 실행 전에 frame위에 mask를 씌웠다.

def get_masked_frame(frame,idx_to_coordinates,connection=mpFaceMesh.FACEMESH_LEFT_EYE,color=(0,0,0),thickness=8):
    # mask = np.zeros(frame.shape[:2],dtype=frame.dtype)
    # cv2.fillConvexPoly(mask,np.int32(get_connection_points(idx_to_coordinates,connection)),(255,255,255))
    # frame = cv2.bitwise_and(frame,frame,mask=mask)
    cv2.drawContours(frame,[get_connection_points(idx_to_coordinates,connection)],0,color,thickness)
    return frame
728x90
반응형

댓글