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