diff --git a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown index 6589a1c01a..53ed36ee68 100644 --- a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown +++ b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.markdown @@ -19,8 +19,6 @@ Code This tutorial code's is shown lines below. You can also download it from [here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp) -. The second version (using LBP for face detection) can be [found -here](https://github.com/opencv/opencv/tree/master/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp) @include samples/cpp/tutorial_code/objectDetection/objectDetection.cpp Explanation @@ -34,8 +32,8 @@ Result ![](images/Cascade_Classifier_Tutorial_Result_Haar.jpg) - Remember to copy the files *haarcascade_frontalface_alt.xml* and - *haarcascade_eye_tree_eyeglasses.xml* in your current directory. They are located in + Be sure the program will find the path of files *haarcascade_frontalface_alt.xml* and + *haarcascade_eye_tree_eyeglasses.xml*. They are located in *opencv/data/haarcascades* -# This is the result of using the file *lbpcascade_frontalface.xml* (LBP trained) for the face diff --git a/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp b/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp index fe321ec21d..71097a852d 100644 --- a/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp +++ b/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp @@ -13,15 +13,25 @@ using namespace cv; void detectAndDisplay( Mat frame ); /** Global variables */ -String face_cascade_name = "haarcascade_frontalface_alt.xml"; -String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; +String face_cascade_name, eyes_cascade_name; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; String window_name = "Capture - Face detection"; /** @function main */ -int main( void ) +int main( int argc, const char** argv ) { + CommandLineParser parser(argc, argv, + "{help h||}" + "{face_cascade|../../data/haarcascades/haarcascade_frontalface_alt.xml|}" + "{eyes_cascade|../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|}"); + + cout << "\nThis program demonstrates using the cv::CascadeClassifier class to detect objects (Face + eyes) in a video stream.\n" + "You can use Haar or LBP features.\n\n"; + parser.printMessage(); + + face_cascade_name = parser.get("face_cascade"); + eyes_cascade_name = parser.get("eyes_cascade"); VideoCapture capture; Mat frame; @@ -30,7 +40,7 @@ int main( void ) if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading eyes cascade\n"); return -1; }; //-- 2. Read the video stream - capture.open( -1 ); + capture.open( 0 ); if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; } while ( capture.read(frame) ) diff --git a/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp b/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp deleted file mode 100644 index e57139b18a..0000000000 --- a/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - * @file objectDetection2.cpp - * @author A. Huaman ( based in the classic facedetect.cpp in samples/c ) - * @brief A simplified version of facedetect.cpp, show how to load a cascade classifier and how to find objects (Face + eyes) in a video stream - Using LBP here - */ -#include "opencv2/objdetect.hpp" -#include "opencv2/videoio.hpp" -#include "opencv2/highgui.hpp" -#include "opencv2/imgproc.hpp" - -#include -#include - -using namespace std; -using namespace cv; - -/** Function Headers */ -void detectAndDisplay( Mat frame ); - -/** Global variables */ -String face_cascade_name = "lbpcascade_frontalface.xml"; -String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; -CascadeClassifier face_cascade; -CascadeClassifier eyes_cascade; -String window_name = "Capture - Face detection"; -/** - * @function main - */ -int main( void ) -{ - VideoCapture capture; - Mat frame; - - //-- 1. Load the cascade - if( !face_cascade.load( face_cascade_name ) ){ printf("--(!)Error loading face cascade\n"); return -1; }; - if( !eyes_cascade.load( eyes_cascade_name ) ){ printf("--(!)Error loading eyes cascade\n"); return -1; }; - - //-- 2. Read the video stream - capture.open( -1 ); - if ( ! capture.isOpened() ) { printf("--(!)Error opening video capture\n"); return -1; } - - while ( capture.read(frame) ) - { - if( frame.empty() ) - { - printf(" --(!) No captured frame -- Break!"); - break; - } - - //-- 3. Apply the classifier to the frame - detectAndDisplay( frame ); - - //-- bail out if escape was pressed - char c = (char)waitKey(10); - if( c == 27 ) { break; } - } - return 0; -} - -/** - * @function detectAndDisplay - */ -void detectAndDisplay( Mat frame ) -{ - std::vector faces; - Mat frame_gray; - - cvtColor( frame, frame_gray, COLOR_BGR2GRAY ); - equalizeHist( frame_gray, frame_gray ); - - //-- Detect faces - face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(80, 80) ); - - for( size_t i = 0; i < faces.size(); i++ ) - { - Mat faceROI = frame_gray( faces[i] ); - std::vector eyes; - - //-- In each face, detect eyes - eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CASCADE_SCALE_IMAGE, Size(30, 30) ); - if( eyes.size() == 2) - { - //-- Draw the face - Point center( faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2 ); - ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2 ), 0, 0, 360, Scalar( 255, 0, 0 ), 2, 8, 0 ); - - for( size_t j = 0; j < eyes.size(); j++ ) - { //-- Draw the eyes - Point eye_center( faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2 ); - int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); - circle( frame, eye_center, radius, Scalar( 255, 0, 255 ), 3, 8, 0 ); - } - } - - } - //-- Show what you got - imshow( window_name, frame ); -}