Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++를 사용하여 OpenCV의 정지 사진에서 얼굴을 감지하는 방법은 무엇입니까?

<시간/>

우리는 이미지에서 얼굴을 감지합니다. 얼굴을 감지하기 위해 '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;
}

출력

C++를 사용하여 OpenCV의 정지 사진에서 얼굴을 감지하는 방법은 무엇입니까?