OpenCV

[OpenCV] 이미지 처리 (Haar Cascade)

괜찮나요닝겐 2024. 8. 18. 14:22
728x90
반응형

오늘은 Haar Cascade를 이용해서 detection을 해보자

 

일단 아래 주소에서 사용하고 싶은 모델 파일을 받아준다.

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

 

opencv/data/haarcascades at master · opencv/opencv

Open Source Computer Vision Library. Contribute to opencv/opencv development by creating an account on GitHub.

github.com

 

import cv2
import os
import glob
from tqdm import tqdm


# 모델 경로
base_dir = '/my_dir/models/'
face_model_path = base_dir + 'haarcascade_frontalface_default.xml'
eye_model_path = base_dir + 'haarcascade_eye.xml'

# Haar Cascade 분류기 로드
face_cascade = cv2.CascadeClassifier(face_model_path)
eye_cascade = cv2.CascadeClassifier(eye_model_path)

# 이미지 경로
src = '/my_dir/images/'
output_dir = '/my_dir/output/'
os.makedirs(output_dir, exist_ok=True)

# 이미지 목록 가져오기
image_list = glob.glob(src + '*.*')

for image_path in tqdm(image_list):
    filename = os.path.basename(image_path)
    ext = os.path.splitext(filename)[1].lower()  # 확장자를 소문자로 변환
    if ext not in ['.jpg', '.png']:
        print(f'Unsupported image format: {ext}')
        continue  # 지원되지 않는 형식의 이미지를 건너뛰기

    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    # 얼굴 탐지
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

    # 얼굴 및 눈 탐지
    for (x, y, w, h) in faces:
        cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
        roi_gray = gray[y:y+h, x:x+w]
        roi_color = image[y:y+h, x:x+w]
        eyes = eye_cascade.detectMultiScale(roi_gray)
        for (ex, ey, ew, eh) in eyes:
            cv2.rectangle(roi_color, (ex, ey), (ex+ew, ey+eh), (0, 255, 0), 2)

    # 결과 저장
    output_path = os.path.join(output_dir, f'detected_{filename}')
    cv2.imwrite(output_path, image)

print("Processing complete.")

 

오늘은 여기까지

 

728x90
반응형