From: Kirill Kornyakov Date: Thu, 9 Dec 2010 15:08:32 +0000 (+0000) Subject: facedetect code cleaned. added new multicascadeclassifier sample, duplicating facedet... X-Git-Tag: accepted/2.0/20130307.220821~3846 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=33c44fcd7af16bb805ecbfc9cfcefd3c814d7a29;p=profile%2Fivi%2Fopencv.git facedetect code cleaned. added new multicascadeclassifier sample, duplicating facedetect right now. --- diff --git a/samples/c/facedetect.cpp b/samples/c/facedetect.cpp index c4227e0..e2e169e 100644 --- a/samples/c/facedetect.cpp +++ b/samples/c/facedetect.cpp @@ -10,28 +10,25 @@ using namespace cv; void help() { - cout << "\nThis program demonstrates the haar cascade recognizer\n" - "this classifier can recognize many ~rigid objects, it's most known use is for faces.\n" - "Usage:\n" - "./facedetect [--cascade= this is the primary trained classifier such as frontal face]\n" - " [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n" - " [--scale=\n" - " [filename|camera_index]\n\n" - "see facedetect.cmd for one call:\n" - "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye.xml\" --scale=1.3 \n" - "Hit any key to quit.\n" - "Using OpenCV version %s\n" << CV_VERSION << "\n" - << endl; + cout << "\nThis program demonstrates the cascade recognizer. Now you can use Haar or LBP features.\n" + "This classifier can recognize many ~rigid objects, it's most known use is for faces.\n" + "Usage:\n" + "./facedetect [--cascade= this is the primary trained classifier such as frontal face]\n" + " [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n" + " [--scale=\n" + " [filename|camera_index]\n\n" + "see facedetect.cmd for one call:\n" + "./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye.xml\" --scale=1.3 \n" + "Hit any key to quit.\n" + "Using OpenCV version %s\n" << CV_VERSION << "\n" << endl; } void detectAndDraw( Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale); -String cascadeName = -"../../data/haarcascades/haarcascade_frontalface_alt.xml"; -String nestedCascadeName = -"../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; +String cascadeName = "../../data/haarcascades/haarcascade_frontalface_alt.xml"; +String nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; int main( int argc, const char** argv ) { @@ -46,6 +43,7 @@ int main( int argc, const char** argv ) String inputName; help(); + CascadeClassifier cascade, nestedCascade; double scale = 1; @@ -102,7 +100,7 @@ int main( int argc, const char** argv ) capture = cvCaptureFromAVI( inputName.c_str() ); if(!capture) cout << "Capture from AVI didn't work" << endl; } - } + } else { image = imread( "lena.jpg", 1 ); diff --git a/samples/cpp/multicascadeclassifier.cpp b/samples/cpp/multicascadeclassifier.cpp new file mode 100644 index 0000000..fc9e35f --- /dev/null +++ b/samples/cpp/multicascadeclassifier.cpp @@ -0,0 +1,163 @@ +// WARNING: this sample is under construction! Use it on your own risk. + +#include +#include +#include + +#include +#include + +using namespace std; +using namespace cv; + +void help() +{ + cout << "\nThis program demonstrates the multi cascade recognizer. It is a generalization of facedetect sample.\n\n" + "Usage: ./multicascadeclassifier \n" + " --cascade1= this is the primary trained classifier such as frontal face\n" + " [--cascade2=[this an optional secondary classifier such as profile face or eyes]]\n" + " input video or image\n\n" + "Example: ./multicascadeclassifier --cascade1=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\ --cascade2=\"../../data/haarcascades/haarcascade_eye.xml\"\n\n" + "Using OpenCV version " << CV_VERSION << endl << endl; +} + +void DetectAndDraw(Mat& img, CascadeClassifier& cascade); + +String cascadeName = "../../data/haarcascades/haarcascade_frontalface_alt.xml"; +String nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml"; + +int main( int argc, const char** argv ) +{ + CvCapture* capture = 0; + Mat frame, image; + + if (argc == 0) + { + help(); + return 0; + } + + const String cascadeOpt = "--cascade1="; + size_t cascadeOptLen = cascadeOpt.length(); + string inputName; + for( int i = 1; i < argc; i++ ) + { + cout << "Processing argument #" << i << ": " << argv[i] << endl; + if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 ) + { + cascadeName.assign( argv[i] + cascadeOptLen ); + cout << " from which we have cascadeName= " << cascadeName << endl; + } + else if( argv[i][0] == '-' ) + { + cerr << "WARNING: Unknown option " << argv[i] << endl; + } + else + inputName.assign( argv[i] ); + } + + CascadeClassifier cascade; + if( !cascade.load( cascadeName ) ) + { + cerr << "ERROR: Could not load cascade classifier \"" << cascadeName << "\"" << endl; + help(); + + return -1; + } + + if( inputName.size() ) + { + image = imread( inputName, 1 ); + if( image.empty() ) + { + capture = cvCaptureFromAVI( inputName.c_str() ); + if( !capture ) + cout << "Capture from AVI don't work" << endl; + } + } + else + { + cout << "Please provide input file." << endl; + return -1; + } + + cvNamedWindow( "result", 1 ); + + if( capture ) + { + for(;;) + { + IplImage* iplImg = cvQueryFrame( capture ); + frame = iplImg; + if( frame.empty() ) + break; + + DetectAndDraw( frame, cascade ); + + if( waitKey( 10 ) >= 0 ) + goto _cleanup_; + } + + waitKey(0); +_cleanup_: + cvReleaseCapture( &capture ); + } + else if( !image.empty() ) + { + DetectAndDraw( image, cascade ); + waitKey(0); + } + else + { + cout << "Please provide correct input file." << endl; + } + + cvDestroyWindow("result"); + + return 0; +} + +void DetectAndDraw( Mat& img, CascadeClassifier& cascade) +{ + int i = 0; + double t = 0; + vector faces; + const static Scalar colors[] = { CV_RGB(0,0,255), + CV_RGB(0,128,255), + CV_RGB(0,255,255), + CV_RGB(0,255,0), + CV_RGB(255,128,0), + CV_RGB(255,255,0), + CV_RGB(255,0,0), + CV_RGB(255,0,255)} ; + Mat gray; + Mat frame( cvRound(img.rows), cvRound(img.cols), CV_8UC1 ); + + cvtColor( img, gray, CV_BGR2GRAY ); + resize( gray, frame, frame.size(), 0, 0, INTER_LINEAR ); + equalizeHist( frame, frame ); + + t = (double)cvGetTickCount(); + cascade.detectMultiScale( frame, faces, + 1.1, 2, 0 + //|CV_HAAR_FIND_BIGGEST_OBJECT + //|CV_HAAR_DO_ROUGH_SEARCH + |CV_HAAR_SCALE_IMAGE + , + Size(30, 30) ); + t = (double)cvGetTickCount() - t; + printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); + + for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) + { + Point center; + Scalar color = colors[i%8]; + int radius; + center.x = cvRound(r->x + r->width*0.5); + center.y = cvRound(r->y + r->height*0.5); + radius = cvRound(r->width + r->height)*0.25; + circle( img, center, radius, color, 3, 8, 0 ); + } + + cv::imshow( "result", img ); +}