우리는 이미지에서 얼굴을 감지합니다. 얼굴을 감지하기 위해 'detectMultiScale()' 함수를 사용했습니다.
이 함수의 실제 형식은 -
입니다.구문
detectMultiScale(source matrix, vector, searchScaleFactor, minNeighbours, flags, minfeatureSize)
함수 인수를 변경하여 'detect.MultiSpace()' 함수를 제어할 수 있습니다. 이 함수는 다음 인수를 사용합니다.
소스 매트릭스
얼굴이 감지될 매트릭스입니다. 이 경우 비디오 프레임을 유지하는 매트릭스가 됩니다.
벡터
'detect.MultiScale()' 함수는 직사각형 유형의 벡터입니다. 직사각형은 OpenCV에서 벡터이며 벡터로 정의해야 합니다.
searchScaleFactor
검색 축척 비율은 함수가 찾을 다양한 크기의 면 수를 결정합니다. 우리는 일반적으로 1.1을 사용합니다. 필요한 경우 1.2를 사용하여 탐지 시스템을 더 빠르게 만들 수 있습니다. 그러나 이 경우 1.1을 사용할 때와 같이 자주 얼굴이 인식되지 않습니다.
최소한 이웃
이 매개변수는 감지기의 신뢰 수준을 감지합니다. 이는 이 기능이 감지기가 얼굴을 감지했음을 얼마나 확신하는지 보여줍니다. 더 나은 안정성을 위해 더 높은 숫자를 사용할 수 있지만 프로세스 속도가 느려집니다. 더 빠른 프로세스이지만 더 낮은 신뢰성을 위해 더 작은 수를 사용할 수 있습니다. 우리는 보통 3~4개를 minNeighbours로 사용합니다.
플래그
기본적으로 이 기능은 모든 얼굴을 찾습니다. 플래그 값으로 'CASCADE_FIND_BIGGEST_OBJECT'를 사용하면 가장 큰 면만 찾습니다. 이 경우 시스템이 더 빠르게 수행됩니다. 'CASCADE_SCALE_IMAGE'를 사용하여 여러 얼굴을 검색할 수 있습니다.
최소 기능 크기
minFeatureSize는 얼굴의 최소 크기를 결정합니다. 카메라에서 멀리 떨어진 얼굴을 감지하려면 더 작은 값을 사용해야 합니다. 얼굴이 카메라에 가까우면 더 큰 값을 사용해야 합니다. 일반적인 거리에는 (20 x 20) 또는 (30 x 30) 크기를 사용합니다. 예제에서 우리는 detectMultiScale() 함수를 다음과 같이 사용했습니다.
faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//
다음 코드는 OpenCV의 정지 사진에서 사람의 얼굴을 감지하는 방법을 보여줍니다.
예시
#include<iostream> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> //This header includes definition of 'rectangle()' function// #include<opencv2/objdetect/objdetect.hpp> //This header includes the definition of Cascade Classifier// #include<string> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat image_with_humanface;//Declaring a matrix to load image with human faces// image_with_humanface = imread("friends.jpg");//loading an image that contains human face in it// namedWindow("Face Detection");//Declaring a window to show the result// string trained_classifier_location = "C:/opencv/sources/data/haarcascades/haarcascade_frontalface_alt.xml";//Defining the location our XML Trained Classifier in a string// CascadeClassifier faceDetector;//Declaring an object named 'face detector' of CascadeClassifier class// faceDetector.load(trained_classifier_location);//loading the XML trained classifier in the object// vector<Rect>faces;//Declaring a rectangular vector named faces// vector<Rect>boundary;//Declaring a rectangular vector named rectangle// faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//Detecting the faces in 'image_with_humanfaces' matrix// for (size_t i = 0; i < faces.size(); i++){ //Loop to draw rectangle around the faces// Mat faceROI = image_with_humanface(faces[i]);//Storing the face in a matrix// int x = faces[i].x;//Getting the initial row value of face rectangle's starting point// int y = faces[i].y;//Getting the initial column value of face rectangle's starting point// int h = y + faces[i].height;//Calculating the height of the rectangle// int w = x + faces[i].width;//Calculating the width of the rectangle// rectangle(image_with_humanface, Point(x, y), Point(w, h), Scalar(255, 0, 255), 2, 8, 0);//Drawing a rectangle using around the faces// } imshow("Face Detection", image_with_humanface);//Showing the detected face// waitKey(0);//To wait for keystroke to terminate the program// return 0; }
출력