@ -1,14 +1,6 @@
/**
* @ file objectDetection . 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
*/
# include "opencv2/objdetect/objdetect.hpp"
# include "opencv2/highgui/highgui.hpp"
# include "opencv2/imgproc/imgproc.hpp"
# include "opencv2/core/utility.hpp"
# include "opencv2/highgui/highgui_c.h"
# include "opencv2/objdetect.hpp"
# include "opencv2/highgui.hpp"
# include "opencv2/imgproc.hpp"
# include <iostream>
# include <stdio.h>
@ -20,79 +12,73 @@ using namespace cv;
void detectAndDisplay ( Mat frame ) ;
/** Global variables */
//-- Note, either copy these two files from opencv/data/haarscascades to your current folder, or change these locations
string face_cascade_name = " haarcascade_frontalface_alt.xml " ;
string eyes_cascade_name = " haarcascade_eye_tree_eyeglasses.xml " ;
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 ) ;
String window_name = " Capture - Face detection " ;
/**
* @ function main
*/
/** @function main */
int main ( void )
{
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 )
{
for ( ; ; )
{
frame = cv : : cvarrToMat ( cvQueryFrame ( capture ) ) ;
VideoCapture capture ;
Mat frame ;
//-- 1. Load the cascades
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 ; } ;
//-- 3. Apply the classifier to the frame
if ( ! frame . empty ( ) )
{ detectAndDisplay ( frame ) ; }
else
{ printf ( " --(!) No captured frame -- Break! " ) ; break ; }
//-- 2. Read the video stream
capture . open ( - 1 ) ;
if ( ! capture . isOpened ( ) ) { printf ( " --(!)Error opening video capture \n " ) ; return - 1 ; }
int c = waitKey ( 10 ) ;
if ( ( char ) c = = ' c ' ) { break ; }
while ( capture . read ( frame ) )
{
if ( frame . empty ( ) )
{
printf ( " --(!) No captured frame -- Break! " ) ;
break ;
}
//-- 3. Apply the classifier to the frame
detectAndDisplay ( frame ) ;
int c = waitKey ( 10 ) ;
if ( ( char ) c = = 27 ) { break ; } // escape
}
}
return 0 ;
return 0 ;
}
/**
* @ function detectAndDisplay
*/
/** @function detectAndDisplay */
void detectAndDisplay ( Mat frame )
{
std : : vector < Rect > faces ;
Mat frame_gray ;
std : : vector < Rect > faces ;
Mat frame_gray ;
cvtColor ( frame , frame_gray , COLOR_BGR2GRAY ) ;
equalizeHist ( frame_gray , 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 | CASCADE_SCALE_IMAGE , Size ( 30 , 30 ) ) ;
//-- Detect faces
face_cascade . detectMultiScale ( frame_gray , faces , 1.1 , 2 , 0 | CASCADE_SCALE_IMAGE , Size ( 30 , 30 ) ) ;
for ( size_t i = 0 ; i < faces . size ( ) ; i + + )
for ( size_t i = 0 ; i < faces . size ( ) ; i + + )
{
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 , 255 ) , 2 , 8 , 0 ) ;
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 , 255 ) , 4 , 8 , 0 ) ;
Mat faceROI = frame_gray ( faces [ i ] ) ;
std : : vector < Rect > eyes ;
Mat faceROI = frame_gray ( faces [ i ] ) ;
std : : vector < Rect > eyes ;
//-- In each face, detect eyes
eyes_cascade . detectMultiScale ( faceROI , eyes , 1.1 , 2 , 0 | CASCADE_SCALE_IMAGE , Size ( 30 , 30 ) ) ;
//-- In each face, detect eyes
eyes_cascade . detectMultiScale ( faceROI , eyes , 1.1 , 2 , 0 | CASCADE_SCALE_IMAGE , Size ( 30 , 30 ) ) ;
for ( size_t j = 0 ; j < eyes . size ( ) ; j + + )
{
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 , 0 ) , 3 , 8 , 0 ) ;
}
for ( size_t j = 0 ; j < eyes . size ( ) ; j + + )
{
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 , center , radius , Scalar ( 255 , 0 , 0 ) , 4 , 8 , 0 ) ;
}
}
//-- Show what you got
imshow ( window_name , frame ) ;
//-- Show what you got
imshow ( window_name , frame ) ;
}