파이썬(Python)/opencv

[Python]OpenCV 카메라로 얼굴, 눈 인식하고 모자이크 하기#1(CascadeClassifier)

끄적끄적아무거나 2022. 6. 21. 08:50
반응형

 

목차

    파이썬 OpenCV 얼굴, 눈 인식 함수(CascadeClassifier)

     

    이번 포스트에서는 OpenCV에서 제공하는 CascadeClassifier 함수를 사용해서 얼굴과 눈을 인식해서 출력해보겠습니다. 흔히 구글 지도나 네이버 지도 거리뷰를 보면 사람들 얼굴이 모자이크 처리가 된것을 볼 수 있습니다. 하나 하나 모자이크를 한다면 얼마나 힘들겠습니까.... 

     

    그래서 위와 같은 함수를 사용해서 사람 얼굴을 인식하고 모자이크 처리 해주는 것입니다. 

     

    이번 포스트에서는 사람 얼굴 부분과 눈 부분을 인식하는 방법에 대해 알아보고 다음 장에서 인식한 부분을 모자이크 처리하는 방법에 대해 알아보겠습니다. 

     

     

    CascadeClassifier는 Haar Cascades 라는 사람의 논문에 Face Detection 방법을 사용합니다. Face Detection이 어떤 로직으로 동작하는지는 저의 이해 범주 밖이므로 저는 예제 코드를 통해 어떻게 사용하는지에 대해 얘기하도록 하겠습니다. 

     

    CascadeClassifier를 사용하기 위해서는 OpenCV에 내장된 아래의 DB를 이용해서 검출 합니다. 이번 시간에는 얼굴과 눈을 검색할 것이므로 haarcascade_frontalface_alt.xml 와 haarcascade_eye.xml를 불러 올것 입니다. 얼굴 이외의 다른 부분을 검출 하고 싶을 때는 아래 목록 중에 하나를 선택해서 구현 하면 됩니다. 

     

    DB 리스트

    haarcascade_eye_tree_eyeglasses.xml   

    haarcascade_mcs_leftear.xml
    haarcascade_eye.xml                   

    haarcascade_mcs_lefteye.xml
    haarcascade_frontalface_alt2.xml      

    haarcascade_mcs_mouth.xml
    haarcascade_frontalface_alt_tree.xml  

    haarcascade_mcs_nose.xml
    haarcascade_frontalface_alt.xml       

    haarcascade_mcs_rightear.xml
    haarcascade_frontalface_default.xml   

    haarcascade_mcs_righteye.xml
    haarcascade_fullbody.xml             

     haarcascade_mcs_upperbody.xml
    haarcascade_lefteye_2splits.xml       

    haarcascade_profileface.xml
    haarcascade_lowerbody.xml             

    haarcascade_righteye_2splits.xml
    haarcascade_mcs_eyepair_big.xml       

    haarcascade_smile.xml
    haarcascade_mcs_eyepair_small.xml     

    haarcascade_upperbody.xml

     

     

     

     

    파이썬 OpenCV 얼굴, 눈 인식 함수(CascadeClassifier) 예제

     

    코드>>

    import cv2
    
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)    
    if not cap.isOpened():    
        print("cap open failed")    
        exit()
    
    face_xml = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    eye_xml = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_eye.xml')
    
    while True:
        ret, img = cap.read()  
        if not ret:       
            print("Can't read cap")        
            break  
    
        img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
        faces = face_xml.detectMultiScale(img_gray, 1.3, 5)
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
            roi_color = img[y:y + h, x:x + w]
            roi_gray = img_gray[y:y + h, x:x + w]
            
            eyes = eye_xml.detectMultiScale(roi_gray)
            for (ex, ey, ew, eh) in eyes:
                cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)
    
       
        cv2.imshow("Face Recognition", img)
    
        if cv2.waitKey(1) == ord('q'):
            break
    
    cv2.destroyAllWindows()

    라인1~8번: 컴퓨터의 카메라를 구동 합니다.

    10~11번 라인: 얼굴 인식, 눈 인식 관련 XML을 불러옵니다.

    19번 라인: 이미지를 회색으로 변경합니다. 회색 변경 이유는 Haar의 Face recognition 시 얼굴을 인식하기에 흑백의 명도를 이용하는 것이 유리하기 때문입니다.

    21번 라인: detectMultiScale 함수 입력값으로 이미지와 scale값 minNeighbors 값을 입력 합니다. scale 은 확대해서 검출하는 것이고 minNeighbors는 간단하게 높은 값을 쓸수록 검출은 어렵지만 높은 출력으로 구분 됩니다. return 값으로 인식된 face 좌표(Coordinate)를 넘겨 줍니다.

    22~30번 라인: 얼굴이 인식된 좌표를 사각형으로 표기하고 각 얼굴안에 눈이 있으면 사각형으로 표기 합니다.

     

     

     

    결과>>

    눈과 얼굴이 인식됨을 알 수 있습니다.

     

    다음 장에서는 해당 얼굴을 모자이크(Mosaic) 하는 방법에 대해 알아보겠습니다.

     

     

    반응형