Ask Your Question
0

Recording video once face and eyes are detected

asked 2013-08-26 16:48:15 -0600

OCV gravatar image

updated 2013-08-29 02:39:34 -0600

Hi

I am trying to capture video file and save to the local once the eyes are detected using opencv. It would stop recording video when eyes are not present. The code could be compiled but it is unable to get the result. It always exits with code -1. Below is my code.

EDIT 1:

I am not sure what is wrong with my code. Actually I have switched to C++ API from C. Now the code can be compiled and run but the problem is it always get hang when two eyes are detected. My idea is to keep recording video as long as two eyes are being detected in the frame and stop recording when the eyes are not detected. Below is my code. Anybody has any idea how should I change my code?

New code attached:

#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\objdetect\objdetect.hpp>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\highgui\highgui.hpp>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\imgproc\imgproc.hpp>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv\cv.h>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\core\core.hpp>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\videostab\optical_flow.hpp>
#include <C:\Users\AM\Desktop\Project\opencv\build\include\opencv2\videostab\videostab.hpp>


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

 using namespace std;
 using namespace cv;

int numFaces;
int numEyes;

 /** Function Headers */
 void detectAndDisplay( Mat frame );
 void videoRecord ();

 /** Global variables */
 String face_cascade_name = "C:/Users/AM/Desktop/Project/opencv/data/haarcascades/haarcascade_frontalface_alt.xml";
 String eyes_cascade_name = "C:/Users/AM/Desktop/Project/opencv/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";

 CascadeClassifier face_cascade;
 CascadeClassifier eyes_cascade;
 string window_name = "Capture - Face detection";
 RNG rng(12345);

 VideoCapture capture;
 VideoWriter record;

 /** @function main */
 int main( int argc, const char** argv )
 {
  // CvCapture* capture;
   Mat frame;

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

   //-- 2. Read the video stream
   capture.open(0);// = cvCaptureFromCAM( -1 );

   if( capture.isOpened() )
   {
     while( true )
     {
       //frame = cvQueryFrame( capture );
       capture >> frame;

   //-- 3. Apply the classifier to the frame
       if( !frame.empty() )
       { 
           detectAndDisplay( frame ); 
          while (numEyes == 2)
           {
            videoRecord();
           }
       }
       else
       { printf(" --(!) No captured frame -- Break!"); break; }

         //pause for 33ms        
         if (waitKey(33) == 27) 
         break; 
       }
   } 
   return 0;
 }

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

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

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


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

    //get region of interest
    Mat faceROI = frame_gray( faces[i] );
    std::vector<Rect> eyes;

    //-- In each face, detect eyes
    eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) );

    for ...
(more)
edit retag flag offensive close merge delete

Comments

I can suggest to start with switching to the C++ API, since they C API is depricated. On the other hand, start with declaring your global variables locations as absolute paths like this:

 String face_cascade_name = "C:/haarcascade_frontalface_alt.xml";
 String eyes_cascade_name = "C:/haarcascade_eye_tree_eyeglasses.xml";
StevenPuttemans gravatar imageStevenPuttemans ( 2013-08-27 02:14:02 -0600 )edit
1

Comment on Edit 1: At the first time where you have detected 2 eyes you get in an endless loop. See line: while (numEyes == 2) You have to reset numEyes in the while loop and set it then again in function detectAndDisplay(...). Use a debugger and step through the code, then you will see the whats happen.

Siegfried gravatar imageSiegfried ( 2013-08-29 02:58:58 -0600 )edit

Just a remark, I deleted your extra code and pasted it into the original question. We urge people to edit their original code instead of creating new answers with extra problems :)

StevenPuttemans gravatar imageStevenPuttemans ( 2013-08-29 03:27:38 -0600 )edit

1 answer

Sort by ยป oldest newest most voted
0

answered 2013-08-27 01:04:36 -0600

Siegfried gravatar image

Hi, in the following cases you return -1.

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

so you should check if the path to both of the cascade models is correct.

String face_cascade_name = "haarcascade_frontalface_alt.xml";
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
edit flag offensive delete link more

Question Tools

Stats

Asked: 2013-08-26 16:48:15 -0600

Seen: 451 times

Last updated: Aug 29 '13