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 );
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 ...
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:
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.
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 :)