ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenCv haarcascades 얼굴인식
    Search: Python Python 2021. 4. 12. 08:32

     

     

    얼굴인식 예제

    OpenCV에는 트레이너와 감지기가 함께 제공된다. 자동차, 비행기 등과 같은 객체에 대해 고유 한 분류기를 훈련하려면 OpenCV를 사용하여 만들 수 있다.
    OpenCV에는 이미 얼굴, 눈, 미소 등에 대한 많은 사전 훈련 된 분류 기가 포함되어 있다. 이러한 XML 파일은 opencv/data/haarcascades/폴더에 있다 .

    OpenCV로 얼굴 및 눈 감지기 예제. 

    import numpy as np
    import cv2
    
    # XML 분류자를로드.
    cascadeFace = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
    cascadeEye = cv2.CascadeClassifier('haarcascade_eye.xml')
    
    # 입력 이미지 (또는 비디오)를 그레이 스케일 모드로로드.
    img = cv2.imread('humans_hkit0303.jpg') # 눈 못 찾음
    #img = cv2.imread('Face_ChaeYeon.jpg') # 얼굴 눈 찾음
    #img = cv2.imread('Human_AryaStark(Px251).jpg') # 아무것도 못 찾음
    #img = cv2.imread('Human_AryaStark(Px308).jpg') # 얼굴만 찾음
    #img = cv2.imread('Human_AryaStark(Px1232).jpg') # 얼굴과 한쪽 눈만 찾음
    #img = cv2.imread('Human_AryaStarkFace(Px1076).jpg') # 얼굴 눈 찾음
    
    # 명암으로 인식하는 cascade식별기를 위한 준비.
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    # 이미지에서 얼굴을 찾는다.
    # detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
    # 입력 이미지에서 크기가 다른 물체를 감지하고, 감지 된 개체는 rectangle목록으로 반환.
    # cascade – Haar 분류기 캐스케이드 (OpenCV 1.x API 전용). Load ()를 사용하여 XML 또는 YAML 파일에서로드 할 수 있다. 캐스케이드가 더 이상 필요하지 않으면 cvReleaseHaarClassifierCascade (& cascade)를 사용하여 해제해야 한다.
    # image – 개체가 감지 된 이미지를 포함하는 CV_8U 유형의 매트릭스다.
    # objects – 각 직사각형에 감지 된 객체가 포함 된 직사각형의 벡터다.
    # scaleFactor – 각 이미지 배율에서 이미지 크기를 줄이는 정도를 지정하는 매개 변수.
    # minNeighbors – 각 후보 사각형이 유지해야하는 이웃 수를 지정하는 매개 변수.
    # flags – cvHaarDetectObjects 함수에서와 같이 이전 캐스케이드에 대해 동일한 의미를 가진 매개 변수다. 새로운 캐스케이드에는 사용되지 않는다.
    # minSize – 가능한 최소 개체 크기입니다. 그보다 작은 개체는 무시된다.
    # maxSize – 가능한 최대 개체 크기입니다. 그보다 큰 개체는 무시된다.
    faces = cascadeFace.detectMultiScale(gray, scaleFactor = 1.03, minNeighbors = 5)
    
    wndname = 'result'
    
    if (len(faces) > 0):
        wndname += ' - finded'
    else : wndname += ' - failure'
    
    for (x,y,w,h) in faces:
    	# 얼굴이 발견되면 감지 된 얼굴의 위치를 Rect (x, y, w, h)로 반환
        img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = img[y:y+h, x:x+w]
        # 눈은 항상 얼굴에 있기 때문에 얼굴에 대한 ROI를 생성하고이 ROI에 눈 감지를 적용 할 수 있다.
        eyes = cascadeEye.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(wndname, img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

     

     

    https://github.com/opencv/opencv/tree/master/data/haarcascades

     

     

     

    사진 출처: https://opencv-python-tutroals.readthedocs.io/; 

     

     

    인식 결과

    Human_AryaStark(Px251).jpg
    Human_AryaStark(Px308).jpg
    Human_AryaStark(Px1232).jpg
    Human_AryaStarkFace(Px1076).jpg

     

    얼굴인식 성능

    옆모습은 인식하지 못한다.

    얼굴이 회전(기울어짐)이 되는 만큼 인식이 떨어진다. 약0~30도 정도까지는 쓸만함.

     

     

    댓글