Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

How to count faces in the video?

Hi, I'm Angel Jenifer. I'm a newbie to Image processing. As a part of my project I have to tell how many faces are detected in the video in real-time. I saw the sample code in the source and successfully implemented it. For example if there is three faces, it is well detected and shown inside a ellipse. And my question is how to calculate the no. of ellipse that formed or no.of faces in the video. I have to take it out as a text output. Would really appreciate your help. Thanks.

My code:

#include "opencv2/objdetect.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

/** Function Headers */
void detectAndDisplay(Mat frame);
/** Global variables */
String face_cascade_name = "haarcascade_frontalface_alt.xml";
CascadeClassifier face_cascade;
String window_name = "Capture - Face detection";

/** @function main */
int main(void)
{
VideoCapture capture;
Mat frame;

//-- 1. Load the cascades
if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading face cascade\n"); return -1; };

//-- 2. Read the video stream
capture.open(0);
if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }

while (capture.read(frame))
{
    if (frame.empty())
    {
        printf(" --(!) No captured frame -- Break!");
        break;
    }

    //-- 3. Apply the classifier to the frame
    detectAndDisplay(frame);

    int c = waitKey(10);
    if ((char)c == 27) { break; } // escape
}
return 0;
   }

   /** @function detectAndDisplay */
   void detectAndDisplay(Mat frame)
   {
std::vector<Rect> faces;
Mat frame_gray;

cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
equalizeHist(frame_gray, frame_gray);

//-- Detect faces
face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));

for (size_t i = 0; i < faces.size(); i++)
{
    Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
    ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0);

    Mat faceROI = frame_gray(faces[i]);

}
//-- Show what you got
imshow(window_name, frame);
    }