Ask Your Question

Revision history [back]

Recording video once face and eyes are detected

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.

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 <iostream>

include <stdio.h>

using namespace std; using namespace cv;

int numFaces; int numEyes;

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

/** Global variables */ String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; string window_name = "Capture - Face detection"; RNG rng(12345);

/* @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 = cvCaptureFromCAM( -1 ); if( capture ) { while( true ) { frame = cvQueryFrame( capture );

//-- 3. Apply the classifier to the frame if( !frame.empty() ) { detectAndDisplay( frame ); 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].width0.5, faces[i].y + faces[i].height0.5 ); ellipse( frame, center, Size( faces[i].width0.5, faces[i].height0.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( int j = 0; j < eyes.size(); j++ )
 {
 //draw eyes
   Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
   int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
   circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
 }

 //save number of faces/eyes detected
 numFaces = faces.size();
 numEyes = eyes.size();

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

int videoRecord () { CvCapture *capture; IplImage *img; CvVideoWriter *writer;

 int       key = 0;

 // initialize camera
 capture = cvCaptureFromCAM( 0 );

 // always check
assert( capture );

 int color = 1; // 0 for black and white

// get the frame size
CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));

writer = cvCreateVideoWriter("out.avi", -1 , 10 , size, color);

while(numEyes != 0) 
{
    // get a frame
    img = cvQueryFrame( capture );

    // always check
    if( !img ) break;

    cvWriteFrame( writer, img );        
}

// free memory
cvReleaseVideoWriter( &writer );
cvReleaseCapture( &capture );

return 0; }

click to hide/show revision 2
source code formatted

Recording video once face and eyes are detected

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.

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 <iostream>

include <stdio.h>

#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 <iostream>
#include <stdio.h>

using namespace std;
 using namespace cv;

cv; int numFaces; int numEyes;

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

(); /** Global variables */ String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; string window_name = "Capture - Face detection"; RNG rng(12345);

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

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 = cvCaptureFromCAM( -1 ); if( capture ) { while( true ) { frame = cvQueryFrame( capture );

); //-- 3. Apply the classifier to the frame if( !frame.empty() ) { detectAndDisplay( frame ); 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> std::vector<Rect> faces; Mat frame_gray;

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].width0.5, faces[i].width*0.5, faces[i].y + faces[i].height0.5 faces[i].height*0.5 ); ellipse( frame, center, Size( faces[i].width0.5, faces[i].height0.5), 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( int j = 0; j < eyes.size(); j++ )
 {
  //draw eyes
  Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
 int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
  circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
 }
  //save number of faces/eyes detected
 numFaces = faces.size();
 numEyes = eyes.size();

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

} int videoRecord () { CvCapture *capture; IplImage *img; CvVideoWriter *writer;

*writer;
 int key = 0;
  // initialize camera
 capture = cvCaptureFromCAM( 0 );
  // always check
 assert( capture );
  int color = 1; // 0 for black and white
 // get the frame size
 CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));
 writer = cvCreateVideoWriter("out.avi", -1 , 10 , size, color);
 while(numEyes != 0)
 {
  // get a frame
 img = cvQueryFrame( capture );
  // always check
  if( !img ) break;
 cvWriteFrame( writer, img );
 }
 // free memory
 cvReleaseVideoWriter( &writer );
 cvReleaseCapture( &capture );

return 0;
}

return 0; }

click to hide/show revision 3
No.3 Revision

Recording video once face and eyes are detected

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.

#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 <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int numFaces;
int numEyes;

 /** Function Headers */
 void detectAndDisplay( Mat frame );
 int videoRecord ();
 /** Global variables */
 String face_cascade_name = "haarcascade_frontalface_alt.xml";
 String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
 CascadeClassifier face_cascade;
 CascadeClassifier eyes_cascade;
 string window_name = "Capture - Face detection";
 RNG rng(12345);
 /** @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 = cvCaptureFromCAM( -1 );
   if( capture )
   {
     while( true )
     {
       frame = cvQueryFrame( capture );
     //-- 3. Apply the classifier to the frame
       if( !frame.empty() )
       { {
        detectAndDisplay( frame ); 
         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( int j = 0; j < eyes.size(); j++ )
     {
      //draw eyes
       Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
       int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
       circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
     }

     //save number of faces/eyes detected
     numFaces = faces.size();
     numEyes = eyes.size();  
  }
  //-- Show what you got
  imshow( window_name, frame );
 }

int videoRecord ()
 {
     CvCapture *capture;
     IplImage *img;
     CvVideoWriter *writer;

     int       key = 0;

     // initialize camera
     capture = cvCaptureFromCAM( 0 );

     // always check
     assert( capture );

     int color = 1; // 0 for black and white

    // get the frame size
    CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));

    writer = cvCreateVideoWriter("out.avi", -1 , 10 , size, color);

    while(numEyes != 0) 
    {
        // get a frame
        img = cvQueryFrame( capture );

        // always check
        if( !img ) break;

        cvWriteFrame( writer, img );        
    }

    // free memory
    cvReleaseVideoWriter( &writer );
    cvReleaseCapture( &capture );


  return 0;
 }

Recording video once face and eyes are detected

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 );
int  void videoRecord ();
 /** Global variables */
 String face_cascade_name = "haarcascade_frontalface_alt.xml";
"C:/Users/AM/Desktop/Project/opencv/data/haarcascades/haarcascade_frontalface_alt.xml";
 String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml";
"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  capture.open(0);// = cvCaptureFromCAM( -1 );
   if( capture capture.isOpened() )
   {
     while( true )
     {
      frame  //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( int j = 0; j < eyes.size(); j++ )
     {
      //draw eyes
       Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
       int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
       circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
     }

     cout<<"numEyes =" << numEyes;
     numFaces = faces.size();
     numEyes = eyes.size();


  }
  //-- Show what you got
  imshow( window_name, frame );
  //save number of faces/eyes detected
     numFaces = faces.size();
     numEyes = eyes.size();  
   }
  //-- Show what you got
  imshow( window_name, frame );
 }

int 
void videoRecord ()
 {
     CvCapture *capture;
     IplImage *img;
     CvVideoWriter *writer;

     int       key = 0;

     if(!capture.isOpened())  // initialize camera
   check if we succeeded
      {
        printf("Camera failed to open");
      }

   Mat frame;
  capture = cvCaptureFromCAM( 0 );

     // always check
     assert( capture );

     int color = 1; // 0 for black and white

    >> frame; // get the first frame for size
    CvSize size = cvSize((int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT));

    writer = cvCreateVideoWriter("out.avi", -1 , 10 , size, color);

    while(numEyes != 0) 
  // record video
  record.open("Intruder.avi", CV_FOURCC('M','J','P','G'), 30, frame.size(), true);
  if( !record.isOpened() ) 
  {
  printf("VideoWriter failed to open!\n");
  }      

 for(int i=0; i<5000000; i++)
  {
         // get a frame
        img = cvQueryFrame( new frame from camera
          capture );

>> frame; 

         // always check
        if( !img ) break;

        cvWriteFrame( writer, img );        
  add frame to recorded video
          record << frame;         
  }

    // free memory
    cvReleaseVideoWriter( &writer );
    cvReleaseCapture( &capture );


  return 0;
 }