#include <iostream>
static void help()
{
cout << "\nThis program demonstrates the cascade recognizer. Now you can use Haar or LBP features.\n"
"This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n"
"It's most known use is for faces.\n"
"Usage:\n"
"./facedetect [--cascade=<cascade_path> 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=<image scale greater or equal to 1, try 1.3 for example>]\n"
" [--try-flip]\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_tree_eyeglasses.xml\" --scale=1.3\n\n"
"During execution:\n\tHit any key to quit.\n"
"\tUsing OpenCV version " <<
CV_VERSION <<
"\n" << endl;
}
double scale, bool tryflip );
string cascadeName;
string nestedCascadeName;
int main( int argc, const char** argv )
{
string inputName;
bool tryflip;
double scale;
"{help h||}"
"{cascade|../../data/haarcascades/haarcascade_frontalface_alt.xml|}"
"{nested-cascade|../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml|}"
"{scale|1|}{try-flip||}{@filename||}"
);
{
help();
return 0;
}
cascadeName = parser.
get<
string>(
"cascade");
nestedCascadeName = parser.
get<
string>(
"nested-cascade");
scale = parser.
get<
double>(
"scale");
if (scale < 1)
scale = 1;
tryflip = parser.
has(
"try-flip");
inputName = parser.
get<
string>(
"@filename");
{
return 0;
}
if ( !nestedCascade.
load( nestedCascadeName ) )
cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
if( !cascade.
load( cascadeName ) )
{
cerr << "ERROR: Could not load classifier cascade" << endl;
help();
return -1;
}
if( inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1) )
{
int camera = inputName.empty() ? 0 : inputName[0] - '0';
if(!capture.
open(camera))
cout << "Capture from camera #" << camera << " didn't work" << endl;
}
else if( inputName.size() )
{
image =
imread( inputName, 1 );
{
if(!capture.
open( inputName ))
cout << "Could not read " << inputName << endl;
}
}
else
{
image =
imread(
"../data/lena.jpg", 1 );
if(image.
empty()) cout <<
"Couldn't read ../data/lena.jpg" << endl;
}
{
cout << "Video capturing has been started ..." << endl;
for(;;)
{
capture >> frame;
if( frame.empty() )
break;
detectAndDraw( frame1, cascade, nestedCascade, scale, tryflip );
if( c == 27 || c == 'q' || c == 'Q' )
break;
}
}
else
{
cout << "Detecting face(s) in " << inputName << endl;
{
detectAndDraw( image, cascade, nestedCascade, scale, tryflip );
}
else if( !inputName.empty() )
{
FILE* f = fopen( inputName.c_str(), "rt" );
if( f )
{
char buf[1000+1];
while( fgets( buf, 1000, f ) )
{
int len = (int)strlen(buf);
while( len > 0 && isspace(buf[len-1]) )
len--;
buf[len] = '\0';
cout << "file " << buf << endl;
{
detectAndDraw( image, cascade, nestedCascade, scale, tryflip );
if( c == 27 || c == 'q' || c == 'Q' )
break;
}
else
{
cerr << "Aw snap, couldn't read image " << buf << endl;
}
}
fclose(f);
}
}
}
return 0;
}
double scale, bool tryflip )
{
double t = 0;
vector<Rect> faces, faces2;
const static Scalar colors[] =
{
};
double fx = 1 / scale;
1.1, 2, 0
if( tryflip )
{
flip(smallImg, smallImg, 1);
1.1, 2, 0
for( vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); ++r )
{
faces.push_back(
Rect(smallImg.
cols - r->x - r->width, r->y, r->width, r->height));
}
}
for ( size_t i = 0; i < faces.size(); i++ )
{
vector<Rect> nestedObjects;
int radius;
if( 0.75 < aspect_ratio && aspect_ratio < 1.3 )
{
circle( img, center, radius, color, 3, 8, 0 );
}
else
color, 3, 8, 0);
if( nestedCascade.
empty() )
continue;
smallImgROI = smallImg( r );
1.1, 2, 0
for ( size_t j = 0; j < nestedObjects.size(); j++ )
{
Rect nr = nestedObjects[j];
circle( img, center, radius, color, 3, 8, 0 );
}
}
}