- IplImage* frame = cvQueryFrame(capture);
- if(!frame) {
- cerr << "ERROR: frame is null..." << endl;
- getchar();
- return -1;
- }
- IplImage* mirrored =
- cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels);
- t_current = time(NULL);
- // Show the image captured from the camera in the window and repeat
- while(1) {
- // Get one frame
- frame = cvQueryFrame(capture);
- if(!frame) {
- cerr << "ERROR: frame is null..." << endl;
- getchar();
- break;
- }
-
- //flip the image so displayed right/left corresponds to physical right/left
- cvFlip(frame, mirrored, MIRROR);
-
- detect_and_draw_objects(mirrored, cascade, 1);
- cvShowImage("mywindow", mirrored);
- // Do not release the frame!
- //screensave(t_current);
-
- //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
- //remove higher bits using AND operator
- if((cvWaitKey(100) & 255) == 27) break;
- }
+ if(cascade_filename == "")
+ {
+ printf("you must supply a filename with -c option. example:\n");
+ printf(
+ "%s -c %s\n",
+ argv[0],
+ "/usr/share/opencv/haarcascades/haarcascade_frontalface_alt.xml"
+ );
+ return 1;
+ }
+ if(verbose) printf("SILENT ALARM ACTIVATED!!!\n");
+ return 0;
+}
+
+int get_frames(CvCapture* capture, CvHaarClassifierCascade* cascade)
+{
+ int got_null_frame = 0;
+ IplImage* frame = NULL;
+ get_one_frame(capture, frame);
+
+ IplImage* mirrored =
+ cvCreateImage(cvGetSize(frame), frame->depth, frame->nChannels);
+ // Show the image captured from the camera in the window and repeat
+ while(!(got_null_frame = get_one_frame(capture, frame)))
+ {
+ //so displayed right/left corresponds to physical right/left:
+ cvFlip(frame, mirrored, MIRROR);
+
+ detect_and_draw_objects(mirrored, cascade, 1);
+ cvShowImage("mywindow", mirrored);
+ // Do not release the frame!
+ //screensave(t_current);
+
+ //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
+ //remove higher bits using AND operator
+ if((cvWaitKey(100) & 255) == 27) break;
+ }
+ cvReleaseImage(&mirrored);
+ return got_null_frame;
+}
+
+int do_capture()
+{
+ int got_null_capture = 0;
+ CvHaarClassifierCascade* cascade =
+ load_object_detector(cascade_filename.c_str());
+
+ CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
+ if(!capture) {
+ cerr << "ERROR: capture is NULL " << endl;
+ return 1;
+ }
+
+ // Create a window in which the captured images will be presented
+ cvNamedWindow("mywindow", CV_WINDOW_AUTOSIZE);
+ t_current = time(NULL);
+ while(get_frames(capture, cascade))
+ {
+ cerr << "resetting capture." << endl;
+ cvReleaseCapture( &capture );
+ capture = cvCaptureFromCAM( CV_CAP_ANY );
+ if(!capture)
+ {
+ got_null_capture = 1;
+ break;
+ }
+ }
+
+ // Release the capture device housekeeping
+ if(!got_null_capture)
+ {
+ cvReleaseCapture(&capture);
+ }
+ cvDestroyWindow("mywindow");
+ return got_null_capture;
+}
+
+int get_one_frame(CvCapture* capture, IplImage* &frame)
+{
+ int got_null_frame = 0;
+ frame = cvQueryFrame(capture);
+ if(!frame)
+ {
+ cerr << "ERROR: frame is null..., trying again" << endl;
+ frame = cvQueryFrame(capture);
+ if(!frame)
+ {
+ cerr << "ERROR: frame is still null... maybe reset capture?" << endl;
+ got_null_frame = 1;
+ }
+ }
+ return got_null_frame;
+}
+
+// A Simple Camera Capture Framework.
+int main(int argc, char** argv)
+{
+ if(parse_opts(argc, argv)) return 0;