반응형

파이썬, opencv, 사진에서 얼굴 인식하기 

 

글. 오상문 sualchi@daum.net

 

opencv 기능을 이용하여 사진 이미지에서 얼굴을 찾아서 이미지로 다시 보여주는 예제이다. 분석을 위해 haarcascade_frontalface_alt.xml 파일이 필요한데, 첨부 파일을 다운로드 받아서 지정 위치에 저장하면 된다.

 

haarcascade_frontalface_alt.zip

 

그리고 얼굴이 들어간 사진 이미지도 필요하다. 예제에서는 하이텔 1992 공개 프로그램 100에 선정된 분들의 축하 모임이었던 "HiTEL 아마추어 프로그래머 간담회(1993,2,13)"에 모였던 분들의 기념 사진이다. 

 

 

자료에 사용한 이미지 해상도가 낮아서 그걸 확대해서 사용했더니 일부 얼굴은 인식하지 못하는 경우가 발생했는데 이 정도면 기대한 것보다 좋은 것 같다.

 

[사진] 원본 이미지

 

 

[사진] 얼굴을 찾아 표시한 이미지

 

 

아래는 예제 소스 코드이다.

 

import cv2

 

filename = r"c:\temp\hitel.jpg"  # 파일 이름과 경로 

img_src = cv2.imread(filename)  # 이미지 파일 읽어오기

 

# 흑백 명암(그레이스케일)으로 이미지를 변환하여 찾음

img = cv2.cvtColor(img_src, cv2.COLOR_BGR2GRAY) 

img2 = img_src   # 얼굴을 찾아 사각형 그릴 이미지 생성

 

# 얼굴 찾을 때 사용할 방식을 지정  

cascade_filename = r"c:\temp\haarcascade_frontalface_alt.xml"

cascade = cv2.CascadeClassifier(cascade_filename)

 

# 찾은 얼굴 자료 리스트를 얻음

face_data = cascade.detectMultiScale(img, 

                     scaleFactor=1.1,

                     minNeighbors=1,

                     minSize=(40,40))  # 최소 얼굴 범위 40x40픽셀

 

# 윈도우 생성한다.

cv2.namedWindow("image viewer1", cv2.WINDOW_NORMAL) 

cv2.imshow("image viewer1", img_src)    # 이미지를 보여준다.

 

if len(face_data) > 0:  # 찾은 얼굴 자료가 한 명 이상이면...

    color = (0,0,255)  # 선 색

    for f in face_data:

        # 찾은 얼굴 시작 x, y 위치, 넓이, 높이 

        x, y, w, h = f

        # 얼굴 위치에 사각형 그릴 때는 원본 복사본에 그려줌(컬러 이미지).

        cv2.rectangle(img2, (x,y), (x+w, y+h), color, thickness=4)

 

    # 윈도우 생성한다.

    cv2.namedWindow("image viewer2", cv2.WINDOW_NORMAL) 

    cv2.imshow("image viewer2", img2)   # 이미지를 보여준다.

 

    # 얼굴을 표시한 이미지를 저장한다.    

    cv2.imwrite(r"c:\temp\face_result.jpg", img2)   

else:

    print("Not Found!")  # 얼굴을 못 찾았을 때...

 

# 10초 기다린다. 단, 키나 입력되면 바로 종료함. 

cv2.waitKey(10000)      

cv2.destroyAllWindows() # 윈도우 닫음

 

<이상>

 

haarcascade_frontalface_alt.zip
0.09MB
반응형

+ Recent posts