이미지 속 얼굴 개수 세기
OpenCV를 사용하면 이미지에 포함된 얼굴의 개수를 아주 쉽게 셀 수 있습니다. 사실 이전 단계에서 작성한 얼굴 검출 프로그램에는 이미 그 정보가 들어 있습니다. 바로 faces.size()라는 코드인데, 이 코드는 검출된 얼굴의 개수를 정수(integer) 값으로 반환합니다.
예를 들어 다음과 같이 작성하면:
int x = faces.size();
변수 x에는 이미지에서 감지된 얼굴의 개수가 저장됩니다. 즉, 별도의 복잡한 연산 없이 벡터의 크기를 확인하는 것만으로 얼굴 개수를 알아낼 수 있는 것입니다.
아래 프로그램은 주어진 이미지에서 얼굴의 개수를 계산한 뒤, 그 결과를 콘솔 창에 출력합니다.
전체 예제 코드
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/objdetect/objdetect.hpp>
//Cascade Classifier(캐스케이드 분류기)의 정의가 포함된 헤더//
#include<string>
using namespace std;
using namespace cv;
int main(int argc, char** argv){
Mat image_with_humanface;//사람 얼굴이 담긴 이미지를 불러올 행렬 선언//
image_with_humanface = imread("friends.jpg");//사람 얼굴이 포함된 이미지 로드//
string trained_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//XML 학습 분류기 파일의 경로를 문자열로 지정//
CascadeClassifier faceDetector;//CascadeClassifier 클래스의 객체 'faceDetector' 선언//
faceDetector.load(trained_classifier_location);//객체에 XML 학습 분류기 로드//
vector<Rect>faces;//검출 결과를 담을 사각형(Rect) 벡터 'faces' 선언//
faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//'image_with_humanface' 행렬에서 얼굴 검출//
int x = faces.size();//검출된 얼굴의 개수를 계산하여 정수 값 x에 저장//
cout << "Number of face(s)in the image=" << x << endl;//콘솔 창에 x 값 출력//
system("pause");//결과를 확인할 수 있도록 시스템 일시 정지//
return 0;
}코드 핵심 설명
1. 학습된 분류기 로드
Haar Cascade 기반의 정면 얼굴 검출기(haarcascade_frontalface_alt.xml) 파일 경로를 문자열로 지정한 후, CascadeClassifier 객체에 로드합니다. 이 XML 파일에는 얼굴을 판별하기 위한 학습 데이터가 들어 있습니다.
2. detectMultiScale()로 얼굴 검출detectMultiScale() 함수는 이미지에서 여러 크기의 얼굴을 동시에 검출합니다. 주요 매개변수는 다음과 같습니다.
1.1: 스케일 팩터(scaleFactor) — 이미지를 축소해 가며 탐색하는 비율입니다. 값이 작을수록 정밀하지만 처리 속도는 느려집니다.4: minNeighbors — 후보 영역 주변에 겹치는 검출 횟수 기준으로, 값이 클수록 오탐(false positive)이 줄어듭니다.Size(20, 20): minSize — 이 크기보다 작은 얼굴은 무시합니다.
3. faces.size()로 개수 확인
검출된 얼굴들은 vector<Rect> 타입의 faces 벡터에 각각의 위치와 크기 정보와 함께 저장됩니다. 따라서 faces.size()만 호출하면 곧바로 얼굴의 개수를 얻을 수 있으며, 이 값을 cout으로 출력하면 됩니다.
실행 결과
프로그램을 실행하면 콘솔 창에 다음과 같이 이미지 속 얼굴의 개수가 표시됩니다.
