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
반응형
'공부 > 코딩' 카테고리의 다른 글
스파르타코딩클럽 제 2회 스파르톤 생존일지 (4) | 2021.09.04 |
---|---|
스파르타코딩클럽 이미지로 시작하는 딥러닝 5주차 개발일지 (0) | 2021.07.21 |
스파르타코딩클럽 이미지로 시작하는 딥러닝 3주차 개발일지 (0) | 2021.07.11 |
스파르타코딩클럽 이미지로 시작하는 딥러닝 2주차 개발일지 (0) | 2021.07.11 |
스파르타코딩클럽 이미지로 시작하는 딥러닝 1주차 개발일지 (0) | 2021.07.11 |