[opencv] 04. 웹캠 재생시 찾은 얼굴 사각형 프레임씌우기

이지연·2020년 12월 10일

오늘 수업은 웹캠을 켤 시 얼굴 찾아서 사각형으로 씌울 것입니다.

여기서 필요한 모듈을 정리해보겠습니다.

모듈

import cv2
import numpy as np
import datetime
import dlib #얼굴탐색

여기서, 새로운 dlib이 추가됐습니다.

dlib이란 뭘까요?

이미지 처리 및 기계 학습, 얼굴인식 등을 할 수 있는 c++ 로 개발된 고성능의 라이브러리
opencv 와 dlib 는 듣기엔 같은 기능 같으나 두 가지 라이브러리를 함께 사용하는 것이 좋다. 얼굴인식에 관한 dlib 가 강력한 기능을 보이고 있으며 (99% 이상이라 한다..) dlib 의 기능을 사용하기 위한 이미지 처리에 대해서는 opencv 가 많은 역할을 한다.

그런데, dlib은 c++로 개발된 라이브러리입니다. 그래서 install로는 설치가 되지 않습니다.
해당 파일을 다운받은 뒤에 컴파일 후 설치하는 방법으로 해야합니다.

얼굴 찾기 호출

dlib.get_frontal_face_detector()로 생성된 기본 face_detecor 객체는 dlib.fhog_object_detector 객체입니다.

detector = dlib.get_frontal_face_detector()

그리고 다운 받은 것 2가지를 불러오겠습니다.

  • shape_predictor_68_face_landmarks.dat
  • dlib_face_recognition_resnet_model_v1.dat
sp = dlib.shape_predictor('./face_data/shape_predictor_68_face_landmarks.dat')
facerec = dlib.face_recognition_model_v1('./face_data/dlib_face_recognition_resnet_model_v1.dat')

웹캠 불러오기

stream = cv2.VideoCapture(0)

찾은 얼굴 사각형 프레임 씌우기

while(stream.isOpened()):
    ret, frame = stream.read()
    
    if ret:
        now = datetime.datetime.now()
        
        dets = detector(frame,1)
        
        *for k,d in enumerate(dets):
            find_face_frame = cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (0,0,255), 3)
        
        flip_frame = cv2.flip(frame,1)
        text_frame = cv2.putText(flip_frame, str(now), (10,30) ,cv2.FONT_HERSHEY_SIMPLEX,1, (0,255,255), 1, cv2.LINE_AA)
        resize_frame = cv2.resize(text_frame , dsize = (1920,1280), interpolation=cv2.INTER_LINEAR) 

        cv2.imshow('cam', resize_frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

stream.release()
cv2.destroyAllWindows()

*설명 이외에는 지난 시간에 내용이 있으니, 새로 추가된 부분만 쓰겠습니다.

cv2.rectangle()

갖고 온 frame(웹캠 틀)에서 얼굴 인식을 한 부분을 사각형 프레임을 씌워 보도록 하겠습니다.
rantangle()함수를 이용해 사각형을 그릴 수 있는데, rectangle은 모서리 각이 모두 직각(90도)인 사각형이므로 시작점(좌측 상단)과 종료점(우측 하단) 두 곳의 좌표만 기입하여 도형을 그립니다.

cv2.rectangle(img, pt1, pt2, color[,thickness[,lineType[,shift]]])

cv2.rectangle(frame, (d.left(), d.top()), (d.right(), d.bottom()), (0,0,255), 3)
profile
Everyday STEP BY STEP

0개의 댓글