Computer >> Máy Tính >  >> Lập trình >> C ++

Làm thế nào để phát hiện khuôn mặt trong ảnh tĩnh trong OpenCV bằng C ++?

Chúng tôi phát hiện các khuôn mặt từ hình ảnh. Để phát hiện khuôn mặt, chúng tôi đã sử dụng hàm 'DetMultiScale ()'.

Định dạng thực tế của hàm này là -

Cú pháp

detectMultiScale(source matrix, vector, searchScaleFactor, minNeighbours, flags, minfeatureSize)

Bằng cách thay đổi các đối số của hàm, chúng ta có thể kiểm soát hàm 'explore.MultiSpace ()'. Hàm này nhận các đối số sau.

Ma trận nguồn

Nó là ma trận nơi mà khuôn mặt sẽ được phát hiện. Trong trường hợp này, nó sẽ là ma trận giữ các khung hình video.

Véc tơ

Hàm 'detector.MultiScale ()' sẽ là một vectơ có kiểu hình chữ nhật. Hình chữ nhật là một vectơ trong OpenCV và chúng ta phải xác định nó là một vectơ.

searchScaleFactor

Hệ số tỷ lệ tìm kiếm xác định có bao nhiêu kích thước khuôn mặt khác nhau mà hàm sẽ tìm kiếm. Chúng tôi thường sử dụng 1.1. Nếu cần, chúng ta có thể sử dụng 1.2 để làm cho hệ thống phát hiện nhanh hơn. Tuy nhiên, trong trường hợp này, các khuôn mặt không được phát hiện thường xuyên như khi sử dụng 1.1.

phútNeighbours

Tham số này phát hiện mức độ tin cậy của bộ dò. Nó có nghĩa là chức năng này cho thấy mức độ tin cậy của máy dò rằng nó đã phát hiện ra một khuôn mặt. Để có độ tin cậy tốt hơn, chúng ta có thể sử dụng số cao hơn, nhưng nó sẽ làm chậm quá trình. Đối với quy trình nhanh hơn nhưng độ tin cậy thấp hơn, chúng ta có thể sử dụng số nhỏ hơn. Chúng tôi thường sử dụng 3 hoặc 4 làm minNeighbours.

cờ

Theo mặc định, hàm sẽ tìm kiếm tất cả các khuôn mặt. Nếu chúng tôi sử dụng 'CASCADE_FIND_BIGGEST_OBJECT' làm giá trị của cờ, nó sẽ chỉ tìm mặt lớn nhất. Trong trường hợp này, hệ thống hoạt động nhanh hơn. Sử dụng 'CASCADE_SCALE_IMAGE', chúng tôi có thể tìm kiếm nhiều khuôn mặt.

minFeatureSize

minFeatureSize xác định kích thước tối thiểu của khuôn mặt. Nếu chúng ta muốn phát hiện các khuôn mặt ở xa máy ảnh, thì chúng ta nên sử dụng giá trị nhỏ hơn. Nếu các khuôn mặt gần máy ảnh, chúng ta nên sử dụng giá trị lớn hơn. Chúng tôi sử dụng kích thước (20 x 20) hoặc (30 x 30) cho khoảng cách điển hình. Trong ví dụ, chúng tôi đã sử dụng hàm DetMultiScale () làm

faceDetector.detectMultiScale(image_with_humanface, faces, 1.1, 4, CASCADE_SCALE_IMAGE, Size(20, 20));//

Đoạn mã sau trình bày cách phát hiện khuôn mặt người từ ảnh tĩnh trong OpenCV.

Ví dụ

#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;
}

Đầu ra

Làm thế nào để phát hiện khuôn mặt trong ảnh tĩnh trong OpenCV bằng C ++?