파이썬에서 OpenCV를 사용하여 이미지에서 얼굴만 잘라내는 방법

OpenCV를 사용하여 이미지에서 얼굴 부분만을 잘라 보존하는 코드를 작성했으므로 비망록으로 남겨 둡니다.

환경



이번에는 파이썬을 사용합니다.
  • MacOS Mojave 버전 10.14.6
  • Python 3.6.8
  • opencv-python 4.1.1.26

  • 준비



    OpenCV cascade 분류기를 사용합니다. 여기 에서 OpenCV를 clone하여 data/haarcascades를 복사하는 것이 빠릅니다. 이번에는 다음과 같은 구조를 상정합니다.
    root/
      ┣ haarcascades/(opencvからコピーしてきたディレクトリ)
      ┣ target.jpg
      ┗ imgcut.py
    

    이 이미지는 PAKUTASO



    코드



    코드의 전체는 다음과 같습니다. 한 장의 이미지에서 얼굴을 잘라내는 처리로되어 있습니다. 복수의 화상에 대응시켜 조금 사용하기 쉽게 한 것을 GitHub 에 두고 있으므로 이쪽도 참고해 주세요.
    import cv2
    
    cascade = cv2.CascadeClassifier("./haarcascades/haarcascade_frontalface_default.xml")
    img = cv2.imread("target.jpg")
    face_pos = cascade.detectMultiScale(img)
    for x,y,w,h in face_pos:
      face = img[y:y+h, x:x+w]
      cv2.imwrite("result.jpg", face)
    

    코드 설명



    OpenCV를 가져옵니다.
    import cv2
    

    cascade 분류기를 로드합니다. 이번에는 얼굴이 정면을 향하고 있으므로 haarcascade_frontalface_default.xml 를 사용합니다.
    haarcascade_frontalface_default.xml
    

    이미지를 ndarray로 변환합니다.
    img = cv2.imread("target.jpg")
    

    cascade 분류기를 사용하여 얼굴 좌표를 확인합니다.
    face_pos = cascade.detectMultiScale(img)
    

    얼굴 부분을 잘라냅니다. 좌표는 [[1003 135 196 196]] 와 같이 되어 있어 왼쪽으로부터 x 좌표, y 좌표, 폭, 높이가 들어가 있습니다. 여러 얼굴을 찾을 수 있습니다.
    for x,y,w,h in face_pos:
      face = img[y:y+h, x:x+w]
    

    마지막으로 이미지를 저장합니다.
    cv2.imwrite("result.jpg", face)
    

    실행 결과



    다음 명령으로 실행하면 result.jpg가 생성됩니다.
    python imgcut.py
    



    잘 된 것 같습니다. 정말 말할 수 없는 표정을 하고 있네요.

    감상·고찰



    이번에는 OpenCV를 사용하여 이미지에서 얼굴만 잘라내는 방법을 썼습니다. 모델 학습 등 다양한 장면에서 사용할 수 있다고 생각합니다. OpenCV 대단하다고 생각했습니다.

    좋은 웹페이지 즐겨찾기