--- /dev/null
+#include <cv.h>
+#include <highgui.h>
+#include <stdio.h>
+
+CvHaarClassifierCascade* load_object_detector( const char* cascade_path )
+{
+ return (CvHaarClassifierCascade*)cvLoad( cascade_path );
+}
+
+void detect_and_draw_objects( IplImage* image,
+ CvHaarClassifierCascade* cascade,
+ int do_pyramids )
+{
+ IplImage* small_image = image;
+ CvMemStorage* storage = cvCreateMemStorage(0);
+ CvSeq* faces;
+ int i, scale = 1;
+
+ /* if the flag is specified, down-scale the input image to get a
+ performance boost w/o loosing quality (perhaps) */
+ if( do_pyramids )
+ {
+ small_image = cvCreateImage( cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3 );
+ cvPyrDown( image, small_image, CV_GAUSSIAN_5x5 );
+ scale = 2;
+ }
+
+ /* use the fastest variant */
+ faces = cvHaarDetectObjects( small_image, cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING );
+
+ /* draw all the rectangles */
+ for( i = 0; i < faces->total; i++ )
+ {
+ /* extract the rectangles only */
+ //CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i, 0 );
+ CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i);
+ cvRectangle( image, cvPoint(face_rect.x*scale,face_rect.y*scale),
+ cvPoint((face_rect.x+face_rect.width)*scale,
+ (face_rect.y+face_rect.height)*scale),
+ CV_RGB(255,0,0), 3 );
+ }
+
+ if( small_image != image )
+ cvReleaseImage( &small_image );
+ cvReleaseMemStorage( &storage );
+}
+
+// A Simple Camera Capture Framework
+int main( int argc, char** argv )
+{
+ CvHaarClassifierCascade* cascade = load_object_detector(argv[1]);
+
+ CvCapture* capture = cvCaptureFromCAM( CV_CAP_ANY );
+ if( !capture ) {
+ fprintf( stderr, "ERROR: capture is NULL \n" );
+ getchar();
+ return -1;
+ }
+
+ // Create a window in which the captured images will be presented
+ cvNamedWindow( "mywindow", CV_WINDOW_AUTOSIZE );
+
+ // Show the image captured from the camera in the window and repeat
+ while( 1 ) {
+ // Get one frame
+ IplImage* frame = cvQueryFrame( capture );
+ if( !frame ) {
+ fprintf( stderr, "ERROR: frame is null...\n" );
+ getchar();
+ break;
+ }
+
+ detect_and_draw_objects( frame, cascade, 1 );
+ cvShowImage( "mywindow", frame );
+ // Do not release the frame!
+
+ //If ESC key pressed, Key=0x10001B under OpenCV 0.9.7(linux version),
+ //remove higher bits using AND operator
+ if( (cvWaitKey(10) & 255) == 27 ) break;
+ }
+
+ // Release the capture device housekeeping
+ cvReleaseCapture( &capture );
+ cvDestroyWindow( "mywindow" );
+ return 0;
+}