在工作目录下建立/pic文件夹放入测试图片,建立/positive文件夹,放入自己的训练数据(我使用的是自己的相片中截获好的头像)建立list.txt,在里面写入pic/文件名以回车隔开,即可。
#define CV_NO_BACKWARD_COMPATIBILITY
#include "cv.h"
#include "highgui.h"
#include
#include
#include
#ifdef _EiC
#define WIN32
#endif
using namespace std;
using namespace cv;
void detectAndDraw( Mat& img,
CascadeClassifier& cascade, CascadeClassifier& nestedCascade,
double scale,int picid);
int compressPCA(const Mat& pcaset, int maxComponents,
const Mat& testset, Mat& compressed);
String cascadeName ="haarcascade_frontalface_alt.xml";
String nestedCascadeName ="haarcascade_eye_tree_eyeglasses.xml";
int WINDOWID=1;
int main( int argc, const char** argv )
{
Mat frame, frameCopy, image;
const String scaleOpt = "--scale=";
size_t scaleOptLen = scaleOpt.length();
const String cascadeOpt = "--cascade=";
size_t cascadeOptLen = cascadeOpt.length();
const String nestedCascadeOpt = "--nested-cascade";
size_t nestedCascadeOptLen = nestedCascadeOpt.length();
String inputName;
CascadeClassifier cascade, nestedCascade;
double scale = 1;
for( int i = 1; i < argc; i++ )
{
if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 )
cascadeName.assign( argv[i] + cascadeOptLen );
else if( nestedCascadeOpt.compare( 0, nestedCascadeOptLen, argv[i], nestedCascadeOptLen ) == 0 )
{
if( argv[i][nestedCascadeOpt.length()] == '=' )
nestedCascadeName.assign( argv[i] + nestedCascadeOpt.length() + 1 );
if( !nestedCascade.load( nestedCascadeName ) )
cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;
}
else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 )
{
if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale < 1 )
scale = 1;
}
else if( argv[i][0] == '-' )
{
cerr << "WARNING: Unknown option %s" << argv[i] << endl;
}
else
inputName.assign( argv[i] );
}
if( !cascade.load( cascadeName ) )
{
cerr << "ERROR: Could not load classifier cascade" << endl;
cerr << "Usage: facedetect [--cascade=""]
"
" [--nested-cascade[="nested_cascade_path"]]
"
" [--scale[=
"
" [filename|camera_index]
" ;
return -1;
}
image = imread( inputName, 1 );
if( !image.empty() )
{
detectAndDraw( image, cascade, nestedCascade, scale,0 );
waitKey(0);
}
else if( !inputName.empty() )
{
FILE* f = fopen( inputName.c_str(), "rt" );
if( f )
{
char buf[1000+1];
int picid=1;
printf("################################################################
");
printf("
");
while( fgets( buf, 1000, f ) )
{
int len = (int)strlen(buf), c;
while( len > 0 && isspace(buf[len-1]) )
len--;
buf[len] = '