본문 바로가기
공부/코딩

스파르타코딩클럽 이미지로 시작하는 딥러닝 4주차 개발일지

by ▤▣▩▒□ 2021. 7. 17.
728x90
반응형

스파르톤에서 3주차 강의까지 끝내고 이제 4주차 강의까지 완료!

 

이번 주차에 배운 것은 영상에서 얼굴을 인식하고 그 위에 이미지를 씌우는 거였다.

스노우 앱에서 카메라 필터중에 얼굴에 그림이 씌워지는 그런 거랑 똑같다.

 

import cv2
import dlib

detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('models/shape_predictor_5_face_landmarks.dat')

cap = cv2.VideoCapture('videos/02.mp4')
sticker_img = cv2.imread('imgs/pig.png', cv2.IMREAD_UNCHANGED)

while True:
    ret, img = cap.read()

    if ret == False:
        break

    dets = detector(img)

    for det in dets:
        shape = predictor(img, det)

        try:
            x1 = det.left()
            y1 = det.top()
            x2 = det.right()
            y2 = det.bottom()            

            h, w, c = sticker_img.shape

            pig_x1 = shape.parts()[4].x - int((x2 - x1) / 5)
            pig_x2 = shape.parts()[4].x + int((x2 - x1) / 5)            
            
            pig_w = pig_x2 - pig_x1
            pig_h = int(h / w * pig_w) 

            # print(pig_w)
            
            sticker_img = cv2.resize(sticker_img, dsize=(pig_w,pig_h))           

            #좌표의 자료형을 int로 해야 표시된다.
            pig_y1 = shape.parts()[4].y - int(pig_h / 2)
            pig_y2 = shape.parts()[4].y + int(pig_h / 2)   

            print(pig_y1)
            print(pig_y2)


            #overlay_pig
            overlay_img = sticker_img.copy()
            overlay_img = cv2.resize(overlay_img, dsize=(pig_w, pig_h))   


            # cv2.imshow('img', overlay_img)         

            overlay_alpha = overlay_img[:,:,3:4] / 255.0
            background_alpha = 1.0 - overlay_alpha

            img[pig_y1:pig_y2, pig_x1:pig_x2] = overlay_alpha * overlay_img[:, :, :3] + background_alpha * img[pig_y1:pig_y2, pig_x1:pig_x2]


        except:
            pass

    cv2.imshow('result', img)
    if cv2.waitKey(1) == ord('q'):
        break

 

이번에는 dlib 라이브러리를 이용해서 얼굴인식, 눈코 위치 찾기를 했다.

 

강의에서는 눈에다가 안경을 씌우는 걸 했는데 이번에는 코에 돼지코를 씌우는 것이 숙제였다.

간만에 좌표 계산하느라 머리를 좀 썼는데 맞는거 같은데도 이상하게 제대로 안 나오더라.

봤더니 사칙연산 실수해서 좌표가 이상해진 것이 원인이었고, 또 한가지.

이미지 위치좌표를 int형으로 맞춰주지 않아서 화면에 표시가 안 되는 것이 문제였다.

문제를 싹 다 고치고 나니 아래처럼 사람 얼굴에 돼지코가 씌워졌다.

 

 

스노우 앱에 있는 기능을 실제로 구현했다는 것이 신기하면서도 너무 간단해서 놀랍다.

(물론 아는 사람한테만 간단해 보이겠지만ㅎㅎ)

728x90
반응형