diff --git a/doc/conf.py b/doc/conf.py index e7eac4201e..28100b3d1b 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -377,7 +377,10 @@ extlinks = {'cvt_color': ('http://opencv.willowgarage.com/documentation/cpp/imgp 'perspective_transform' : ('http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html?#perspectiveTransform%s', None ), 'flann_based_matcher' : ('http://opencv.willowgarage.com/documentation/cpp/features2d_common_interfaces_of_descriptor_matchers.html?#FlannBasedMatcher%s', None), 'brute_force_matcher' : ('http://opencv.willowgarage.com/documentation/cpp/features2d_common_interfaces_of_descriptor_matchers.html?#BruteForceMatcher%s', None ), - 'flann' : ('http://opencv.willowgarage.com/documentation/cpp/flann_fast_approximate_nearest_neighbor_search.html?%s', None ) + 'flann' : ('http://opencv.willowgarage.com/documentation/cpp/flann_fast_approximate_nearest_neighbor_search.html?%s', None ), + 'cascade_classifier' : ('http://opencv.willowgarage.com/documentation/cpp/objdetect_cascade_classification.html#cascadeclassifier%s', None ), + 'cascade_classifier_load' : ('http://opencv.willowgarage.com/documentation/cpp/objdetect_cascade_classification.html#cv-cascadeclassifier-load%s', None ), + 'cascade_classifier_detect_multiscale' : ('http://opencv.willowgarage.com/documentation/cpp/objdetect_cascade_classification.html#cv-cascadeclassifier-detectmultiscale%s', None ) } diff --git a/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst b/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst index bfaf9b0a7c..e0d4381910 100644 --- a/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst +++ b/doc/tutorials/features2d/table_of_content_features2d/table_of_content_features2d.rst @@ -136,7 +136,7 @@ Learn about how to use the feature points detectors, descriptors and matching f *Author:* |Author_AnaH| - In this tutorial, you will use *features2d* to detect interest points. + In this tutorial, you will use the FLANN library to make a fast matching. ===================== ============================================== @@ -198,4 +198,9 @@ Learn about how to use the feature points detectors, descriptors and matching f ../trackingmotion/good_features_to_track/good_features_to_track.rst ../trackingmotion/generic_corner_detector/generic_corner_detector ../trackingmotion/corner_subpixeles/corner_subpixeles + ../feature_detection/feature_detection + ../feature_detection/feature_description + ../feature_flann_matcher/feature_flann_matcher + ../feature_homography/feature_homography ../detection_of_planar_objects/detection_of_planar_objects + diff --git a/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst new file mode 100644 index 0000000000..2a3d8ce5cd --- /dev/null +++ b/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.rst @@ -0,0 +1,134 @@ +.. _cascade_classifier: + +Cascade Classifier +******************* + +Goal +===== + +In this tutorial you will learn how to: + +.. container:: enumeratevisibleitemswithsquare + + * Use the :cascade_classifier:`CascadeClassifier <>` class to detect objects in a video stream. Particularly, we will use the functions: + + * :cascade_classifier_load:`load <>` to load a .xml classifier file. It can be either a Haar or a LBP classifer + * :cascade_classifier_detect_multiscale:`detectMultiScale <>` to perform the detection. + + +Theory +====== + +Code +==== + +This tutorial code's is shown lines below. You can also download it from `here `_ . The second version (using LBP for face detection) can be found `here `_ + +.. code-block:: cpp + + #include "opencv2/objdetect/objdetect.hpp" + #include "opencv2/highgui/highgui.hpp" + #include "opencv2/imgproc/imgproc.hpp" + + #include + #include + + using namespace std; + using namespace cv; + + /** Function Headers */ + void detectAndDisplay( Mat frame ); + + /** 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 ); } + else + { printf(" --(!) No captured frame -- Break!"); break; } + + int c = waitKey(10); + if( (char)c == 'c' ) { break; } + } + } + return 0; + } + + /** @function detectAndDisplay */ + void detectAndDisplay( Mat frame ) + { + std::vector 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++ ) + { + Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 ); + ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); + + Mat faceROI = frame_gray( faces[i] ); + std::vector 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++ ) + { + 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[i].height)*0.25 ); + circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 ); + } + } + //-- Show what you got + imshow( window_name, frame ); + } + +Explanation +============ + +Result +====== + +#. Here it is: + + ========== ========== + |CCH| |CCLBP| + ========== ========== + + .. |CCH| image:: images/Cascade_Classifier_Tutorial_Result_Haar.jpg + :align: middle + :height: 200pt + + .. |CCLBP| image:: images/Cascade_Classifier_Tutorial_Result_LBP.jpg + :align: middle + :height: 200pt + diff --git a/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_Haar.jpg b/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_Haar.jpg new file mode 100644 index 0000000000..917714456b Binary files /dev/null and b/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_Haar.jpg differ diff --git a/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_LBP.jpg b/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_LBP.jpg new file mode 100644 index 0000000000..dc977344ac Binary files /dev/null and b/doc/tutorials/objdetect/cascade_classifier/images/Cascade_Classifier_Tutorial_Result_LBP.jpg differ diff --git a/doc/tutorials/objdetect/table_of_content_objdetect/images/Cascade_Classifier_Tutorial_Cover.jpg b/doc/tutorials/objdetect/table_of_content_objdetect/images/Cascade_Classifier_Tutorial_Cover.jpg new file mode 100644 index 0000000000..cfa5de67e5 Binary files /dev/null and b/doc/tutorials/objdetect/table_of_content_objdetect/images/Cascade_Classifier_Tutorial_Cover.jpg differ diff --git a/doc/tutorials/objdetect/table_of_content_objdetect/table_of_content_objdetect.rst b/doc/tutorials/objdetect/table_of_content_objdetect/table_of_content_objdetect.rst index e9b37f5eb2..64ed109450 100644 --- a/doc/tutorials/objdetect/table_of_content_objdetect/table_of_content_objdetect.rst +++ b/doc/tutorials/objdetect/table_of_content_objdetect/table_of_content_objdetect.rst @@ -5,4 +5,32 @@ Ever wondered how your digital camera detects peoples and faces? Look here to find out! -.. include:: ../../definitions/noContent.rst \ No newline at end of file +.. include:: ../../definitions/tocDefinitions.rst + ++ + .. tabularcolumns:: m{100pt} m{300pt} + .. cssclass:: toctableopencv + + ===================== ============================================== + |CascadeClassif| **Title:** :ref:`cascade_classifier` + + *Compatibility:* > OpenCV 2.0 + + *Author:* |Author_AnaH| + + Here we learn how to use *objdetect* to find objects in our images or videos + + ===================== ============================================== + + .. |CascadeClassif| image:: images/Cascade_Classifier_Tutorial_Cover.jpg + :height: 90pt + :width: 90pt + +.. raw:: latex + + \pagebreak + +.. toctree:: + :hidden: + + ../cascade_classifier/cascade_classifier