OpenCV 강좌, Haar Cascade Classifier 사용법

컴퓨터 비전의 한 분야에서 객체 감지는 중요한 역할을 하며, 다양한 방법이 있습니다. 그중에서도 Haar Cascade Classifier는 간편하게 객체를 감지할 수 있는 방법으로 널리 사용됩니다. 이 포스트에서는 OpenCV와 Haar Cascade Classifier를 사용하여 객체를 감지하는 방법을 자세히 설명합니다.

1. Haar Cascade Classifier란?

Haar Cascade Classifier는 Viola-Jones 알고리즘에 기반을 두고 있으며, 객체 인식 및 얼굴 인식에 뛰어난 성능을 보여줍니다. 이 방법은 이미지에서 객체를 감지하기 위해서 여러 개의 특징을 고려하는 단계적 분류기를 사용합니다. Haar 특징과 단계적 분류기를 결합하여, 빠르면서도 효과적으로 객체를 인식할 수 있습니다.

2. Haar 특징 (Haar Features)

Haar 특징은 특정 영역의 밝기 차이를 나타내는 간단한 형태입니다. 이미지에서 사각형 영역을 선택하고, 각각의 영역의 픽셀 값의 차이를 계산하여 특징을 만들어냅니다. 이를 통해 물체의 형태나 윤곽을 찾을 수 있습니다.

3. Haar Cascade 구조

Haar Cascade 분류기는 여러 단계로 구성되어 있습니다. 각 단계에서는 특정한 패턴을 학습하여, 이것이 해당 객체인지 아닌지를 판단합니다. 모든 단계가 통과해야 최종적으로 객체로 판단됩니다. 이러한 구조 덕분에 객체 감지의 정확도를 높일 수 있습니다.

4. OpenCV 설치

Haar Cascade Classifier를 사용하기 위해서는 OpenCV가 설치되어 있어야 합니다. OpenCV는 Python 패키지로 설치할 수 있습니다. 아래의 명령어를 사용해주세요.

pip install opencv-python

5. Haar Cascade XML 파일 다운로드

Haar Cascade Classifier를 사용하기 위해서는 미리 학습된 모델이 필요합니다. OpenCV에서는 다양한 객체를 감지할 수 있는 Haar Cascade XML 파일을 제공합니다. 얼굴 인식을 위한 파일인 haarcascade_frontalface_default.xml를 사용해 보겠습니다. 이 파일은 OpenCV의 GitHub 저장소 또는 설치된 OpenCV 디렉터리에서 얻을 수 있습니다.

6. Haar Cascade Classifier 활용 예제

아래 예제에서는 Haar Cascade Classifier를 통해 Webcam으로 찍은 영상을 실시간으로 분석하여 얼굴을 감지하는 방법을 보여줍니다.

6.1 예제 코드


import cv2

# Haar Cascade Classifier 파일 경로 설정
cascPath = "haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascPath)

# 동영상 캡처 객체 생성 (0은 기본 카메라)
video_capture = cv2.VideoCapture(0)

while True:
    # 비디오 프레임 읽기
    ret, frame = video_capture.read()
    
    # 프레임을 그레이스케일로 변환
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    
    # 얼굴 감지
    faces = faceCascade.detectMultiScale(gray, 1.1, 4)
    
    # 감지된 얼굴에 사각형 그리기
    for (x, y, w, h) in faces:
        cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)

    # 결과 프레임 보여주기
    cv2.imshow('Video', frame)
    
    # 'q' 키를 누르면 종료
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 리소스 해제
video_capture.release()
cv2.destroyAllWindows()
    

6.2 코드 설명

  1. cv2.VideoCapture(0): 기본 카메라로부터 비디오 스트림을 캡처합니다.
  2. cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY): 캡처한 이미지를 그레이스케일로 변환합니다.
  3. faceCascade.detectMultiScale(gray, 1.1, 4): 그레이스케일 이미지에서 얼굴을 감지합니다. 첫 번째 인자는 이미지, 두 번째 인자는 스케일 팩터, 세 번째 인자는 인접한 객체 간의 최소 거리입니다.
  4. cv2.rectangle(): 감지된 얼굴 주변에 사각형을 그립니다.
  5. cv2.imshow(): 결과 프레임을 화면에 표시합니다.

7. 성능 개선 및 조정

기본 예제에서 성능이 만족스럽지 않거나 다양한 환경에서 테스트를 해야하는 경우, 다음의 항목을 조정하여 성능을 개선할 수 있습니다.

  • 스케일 팩터: detectMultiScale 함수에 전달된 두 번째 인자는 스케일 팩터로, 값이 낮을수록 더 많은 얼굴을 감지하게 됩니다. 그러나 처리 속도가 느려질 수 있습니다.
  • 최소 이웃: 세 번째 인수는 감지된 객체의 그룹 수를 나타내며, 예약어 neighbors가 설정된 개수보다 많아지면 더 큰 그룹으로 묶이게 됩니다.

8. Haar Cascade Classifier의 한계와 대안

Haar Cascade Classifier는 빠르게 객체를 감지하지만 몇 가지 한계가 있습니다. 예를 들어, 얼굴을 정면으로 볼 때 잘 작동하지만 측면이나 뒤에서 촬영된 얼굴은 감지하지 못할 수 있습니다. 소음이나 조명 변화에 민감한 단점도 있습니다.

이러한 한계를 극복하기 위해 DNN(Deep Neural Network) 기반의 방법 또는 HOG(Histogram of Oriented Gradients) 기반의 방법 등을 사용할 수 있습니다. 이들 방법은 더욱 복잡한 특징을 분석하여 높은 정확도를 자랑하지만 그만큼 더 많은 연산 자원을 필요로 합니다.

9. 결론

본 글에서 OpenCV의 Haar Cascade Classifier를 사용한 얼굴 감지 방법에 대해 살펴보았습니다. Haar Cascade Classifier는 객체 감지 작업에서 간단하면서도 빠른 처리 속도를 제공하는 유용한 도구입니다. 다양한 조정과 실험을 통해 성능을 극대화할 수 있으며, 다른 객체 감지 방법도 함께 고려하여 필요한 환경에 맞춘 적용을 하시기 바랍니다.

10. 참고 자료