사진을 다루는데 가장 중요한 작업 중 하나는 이미지에서 얼굴을 감지하고 자르는 것이다. 이 글에서는 Python을 사용하여 사진에서 얼굴만 자르고 저장하는 방법을 살펴보겠다. 이 작업을 수행하는 데 사용할 수 있는 라이브러리에는 OpenCV, dlib, Pillow 등 널리 사용되는 라이브러리가 많이 있다. 이 글에서는 가장 널리 사용되는 컴퓨터 비전 라이브러리 중 하나인 OpenCV를 사용하겠다.
OpenCV를 사용하기 전에 먼저 설치해야 한다.
pip install opencv-python
이제 OpenCV를 설치했으므로 필요한 라이브러리를 가져오고 이미지를 로드할 수 있다.
import cv2
import numpy as np
# 사진에서 얼굴 인식을 위해 cascade classifier 로드
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
# 이미지 로드
img = cv2.imread("example.jpg")
이미지를 로드했으므로 이제 이미지에서 얼굴 감지를 시작할 수 있다. 이 작업은 CascadeClassifier 클래스의 detectMultiscale 메서드를 사용하여 수행된다. 이 메서드는 이미지를 받아 사각형 목록을 반환하며, 각 사각형은 얼굴을 나타낸다.
faces = face_cascade.detectMultiscale(img, scaleFactor=1.1, minNeighbors=5)
scaleFactor 매개변수는 감지 window의 크기를 제어하며, scaleFactor 값이 작을수록 감지 window가 커지고, 스케일팩터 값이 클수록 감지 window가 작아진다. 감지 window 크기를 줄이면 더 작은 얼굴을 감지할 수 있지만 얼굴 감지 프로세스가 느려진다.
minNeighbors 매개변수는 값이 높을수록 오탐지를 제거하는 데 도움이 되지만 일부 얼굴이 누락될 위험이 높아지는 반면 값이 낮을수록 얼굴 감지가 더 민감해지지만 오탐지 위험도 높아진다.
최상의 얼굴 인식 결과를 얻으려면 scaleFactor와 최소 minNeighbors의 적절한 균형을 찾는 것이 중요한다. 특정 사용 사례에 가장 적합한 조합을 찾으려면 다양한 값으로 실험해봐야 할 수도 있다.
얼굴을 감지했으면 사각형 목록을 반복하여 각 얼굴을 자를 수 있다. 이미지를 자르려면 자르기의 시작점과 끝점을 지정하기만 하면 된다. 이 경우 각 사각형의 왼쪽 상단과 오른쪽 하단을 사용한다.
for (x, y, w, h) in faces:
face = img[y:y+h, x:x+w]
cv2.imwrite("face.jpg", face)
CloneCoding
한 줄의 코드에서 시작되는 혁신!