cascade_classifier.rst 4.23 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
.. _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.
17

18 19 20 21 22 23 24

Theory
======

Code
====

25
This tutorial code's is shown lines below. You can also download it from `here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/objectDetection/objectDetection.cpp>`_ . The second version (using LBP for face detection) can be `found here <http://code.opencv.org/projects/opencv/repository/revisions/master/raw/samples/cpp/tutorial_code/objectDetection/objectDetection2.cpp>`_
26

27
.. code-block:: cpp
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

   #include "opencv2/objdetect/objdetect.hpp"
   #include "opencv2/highgui/highgui.hpp"
   #include "opencv2/imgproc/imgproc.hpp"

   #include <iostream>
   #include <stdio.h>

   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; };
59

60 61 62 63 64 65
     //-- 2. Read the video stream
     capture = cvCaptureFromCAM( -1 );
     if( capture )
     {
       while( true )
       {
66
     frame = cvQueryFrame( capture );
67

68 69 70 71 72
     //-- 3. Apply the classifier to the frame
         if( !frame.empty() )
         { detectAndDisplay( frame ); }
         else
         { printf(" --(!) No captured frame -- Break!"); break; }
73

74
         int c = waitKey(10);
75
         if( (char)c == 'c' ) { break; }
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
        }
     }
     return 0;
   }

  /** @function detectAndDisplay */
  void detectAndDisplay( Mat frame )
  {
    std::vector<Rect> 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<Rect> 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++ )
       {
106
         Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 );
Alexander Shishkov's avatar
Alexander Shishkov committed
107
         int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 );
108 109
         circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 );
       }
110
    }
111 112 113 114 115 116 117 118 119 120
    //-- Show what you got
    imshow( window_name, frame );
   }

Explanation
============

Result
======

121
#. Here is the result of running the code above and using as input the video stream of a build-in webcam:
122

123
   .. image:: images/Cascade_Classifier_Tutorial_Result_Haar.jpg
124
      :align: center
125
      :height: 300pt
126

127
   Remember to copy the files *haarcascade_frontalface_alt.xml* and *haarcascade_eye_tree_eyeglasses.xml* in your current directory. They are located in *opencv/data/haarcascades*
128

129
#. This is the result of using the file *lbpcascade_frontalface.xml* (LBP trained) for the face detection. For the eyes we keep using the file used in the tutorial.
130 131

   .. image:: images/Cascade_Classifier_Tutorial_Result_LBP.jpg
132
      :align: center
133
      :height: 300pt
134