코딩이것저것

openCV_영상파일에서 얼굴 감지하기

황TL 2017. 7. 28. 22:43



영상파일에서 얼굴 감지하기


import cv2


#괄호안에 파일명을 쓰면 파일이 로드됌

#detecting한 얼굴을 표시할 폰트 정의

cap = cv2.VideoCapture('newface.mp4') #카메라 생성

font = cv2.FONT_HERSHEY_SIMPLEX


#create the window & change the window size

#윈도우 생성 및 사이즈 변경

cv2.namedWindow('Face')


#haar 코드 사용(frontal_face) -> 어떤 파일을 쓰느냐에 따라 인식할 객체가 달라짐

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')


while(True):

    #read the camera image

    #카메라에서 이미지 얻기

    ret, frame = cap.read()


#(Blue, Green, Red 계열의 이미지를 gray이미지로 변환. BGR2GRAY)

    grayframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    

#gray로 변환된 이미지를 cascade를 이용하여 detect

    faces = face_cascade.detectMultiScale(grayframe, 1.8, 2, 0, (30, 30))


#얼굴을 인식하는 사각프레임에 대한 내용

#얼굴을 인식하는 사각프레임에 넣을 글자내용

    for (x,y,w,h) in faces:

        cv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),3, 4, 0)

        cv2.putText(frame, 'Detected Face', (x-5, y-5), font, 0.9, (255,255,0),2)


#Face로 정의된 프레임을 보여준다

    cv2.imshow('Face',frame)


    #wait keyboard input until 10ms

    #300ms 동안 키입력 대기

    #키를 누르면 꺼진다. 사진의 형태에서 얼굴 감지

    """if cv2.waitKey(300) >= 0:

break"""


#영상의 형태에서 얼굴 감지, space 입력시 중지

    if cv2.waitKey(1) != 255:

        break;


#close the window

#윈도우 종료

cap.release()

cv2.destroyWindow('Face')


#BGR2GRAY와 cascade 

 


위 사진은 각각의 형태에 따른 이미지 색깔 분류이다.


<Gray 모델>

색(color) 정보를 사용하지 않고 밝기 정보만으로 영상을 표현하는 것이다. 검정색 0부터 흰색 255까지 총 256단계의 밝기값(intensity)으로 영상 픽셀값을 표현한다.


<RGB 모델>

가장 기보적인 색상모델로서 색(color)을 Red, Green, Blue의 3가지 성분의 조합으로 생각하는 것이다. RGB 모델에서 검은색은 R=G=B=0, 흰색은 R=G=B=255, 빨강색은 R=255, G=B=0, 노란색은 R=G=255, B=0로 표현된다. R=G=B인 경우는 무채색인 Gray 색상이 된다. R, G, B 각각은 0 ~ 255 사이의 값을 가질 수 있기 때문에 RGB 색상 모델을 사용하면 총 256*256*256 = 16,777,216가지의 색을 표현할 수 있다.


<HSV 모델>

Hue(색조), Saturation(채도), Value(명도)의 3가지 성분으로 색을 표현한다. Hue는 색조(예: 붉은색 계열인지 푸른색 계열인지, ...)를, Saturation은 그 색이 얼마나 선명한(순수한) 색인지를, Value는 밝기(intensity)를 나타낸다. HSV 모델은 우리가 색을 가장 직관적으로 표현할 수 있는 모델이며 또한 머리속에서 상상하는 색을 가장 쉽게 만들어낼 수 있는 모델이다. 영상처리/영상인식에서 HSV 모델을 사용할 때, H, S, V 각각은 0 ~ 255 사이의 값으로 표현된다. H 값은 색의 종류를 나타내기 때문에 크기는 의미가 없으며 단순한 인덱스(index)를 나타낸다. S 값은 0이면 무채색(gray 색), 255면 가장 선명한(순수한) 색임을 나타낸다. V 값은 작을수록 어둡고 클수록 밝은 색임을 나타낸다. HSV 색상 모델은 그림과 같이 원뿔(conic) 형태, 원기둥(cylindric) 형태가 있다. 둘의 차이는 색의 차이(difference)를 정량적으로 수치화하는 파트에서 설명하겠다.


<YCbCr 모델>

 RGB 색에서 밝기성분(Y)과 색차정보(Cb, Cr)를 분리하여 표현하는 색상모델이다. 위 5번째 그림은 위키페디아에 있는 그림으로  Y=128일 때의 CbCr 색상평면이다. 디지털 영상에서 Y, Cb, Cr은 각각 0 ~ 255 사이의 값을 가지며 Y가 커지면 위 그림이 전체적으로 밝아지고 Y가 작아지면 전체적으로 어두워진다. YCbCr 모델은 mpeg에서 사용되는 색상모델로서 인간의 눈이 밝기차에는 민감하지만 색차에는 상대적으로 둔감하다는 점을 이용해서 Y에는 많은 비트수(해상도)를 할당하고 Cb, Cr에는 낮은 비트수를 할당하는 방식으로 비디오를 압축한다. 따라서 비디오 데이터를 처리할 경우에 YCbCr 모델을 사용하면 별도의 색상변환을 하지 않아도 되는 장점을 갖는다. YCbCr 모델은 YUV 모델로도 불린다.


따라서 grayframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 이 문장을 통해 grayframe은 이미지를 BGR에서 GRAY로 바꿔주는 작업이다.

이 컬러를 회색으로 바꿔주는 작업을 하는 이유는 밑에 나와있다.



haar는 cascade function 접근 기반의 머신러닝이기 때문에 이미지를 gray color로 바꿔주어 위 이미지와 같이 처리한다.

눈은 눈 주위보다 어둡기때문에 검은색의 값이 많고, 콧대는 눈보다 밝기때문에 흰색의 값이 많다.

(gray컬러는 밝기, BGR, RGB컬러는 색상에 대한 값을 나타낸다.)


그러므로 영상에서 객체를 인식하는 순서는


1) 내가 갖고있는 new face 동영상을 불러온다

2) 동영상을 frame으로 인식한다. (영상은 이미지의 연속이므로)

3) frame을 gray 컬러로 바꾼다.

4) gray컬러로 바뀐 이미지를 grade에 따라 인식한다

5) 밝은픽셀영역의 평균-어두운픽셀영역의 평균 -> threshold (문턱)을 넘으면 사람얼굴에 대한 패턴 인지

6) 사람 얼굴 인지 -> 사각형으로 출력

7) 문자 출력



참고자료

http://opencv-python.readthedocs.io/en/latest/doc/01.imageStart/imageStart.html

http://vision0814.tistory.com/113

http://darkpgmr.tistory.com/66

http://hamait.tistory.com/510