BupeChombaDerrick
Вы должны знать ,что контур граней профиля нелегко обнаружить с помощью функций haar like features или LBP features, поэтому я предлагаю вам использовать HOG plus SVM для граней профиля, ниже приведен код, который, по моему мнению, должен по крайней мере работать, но использует каскадные классификаторы haar.
#include "opencv2/opencv.hpp"
using namespace cv;
CvHaarClassifierCascade *cascade,*cascade_profile;
CvMemStorage *storage;
void detectFaces( IplImage *img );
int main( )
{
CvCapture *capture; IplImage *frame = 0;
int key;
char *filename = "haarcascade_frontalface_alt.xml";
char *filename_profile = "haarcascade_profileface.xml";
capture = cvCreateCameraCapture(0);
storage = cvCreateMemStorage(0);
cascade = (CvHaarClassifierCascade*)cvLoad( filename,storage, 0, 0 );
cascade_profile = (CvHaarClassifierCascade*)cvLoad( filename_profile,storage, 0, 0 );
assert( cascade && storage && capture && cascade_profile);
cvNamedWindow( "video", 1 );
while( capture )
{
frame = cvQueryFrame( capture );
if( !frame )
{
fprintf( stderr, "Cannot query frame!\n" );
break;
}
detectFaces( frame );
detectFacesProfile( frame );
cvShowImage( "video", frame );
key = cvWaitKey( 25 );
}
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );
cvReleaseHaarClassifierCascade( &cascade );
cvReleaseHaarClassifierCascade( &cascade_profile );
cvReleaseMemStorage( &storage );
return 0;
}
void detectFaces( IplImage *img )
{
int i;
CvSeq *faces = cvHaarDetectObjects(img,cascade,storage,1.15,3,0,cvSize( 20, 20 ) );
for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ )
{
CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
cvRectangle( img,cvPoint( r->x, r->y ),cvPoint( r->x + r->width, r->y + r->height ),CV_RGB( 255, 0, 0 ), 1, 8, 0 );
}
cvClearMemStorage( storage );
}
void detectFacesProfile( IplImage *img )
{
int i;
CvSeq *faces = cvHaarDetectObjects(img,cascade_profile,storage,1.15,3,0,cvSize( 20, 20 ) );
for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ )
{
CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
cvRectangle( img,cvPoint( r->x, r->y ),cvPoint( r->x + r->width, r->y + r->height ),CV_RGB( 255, 0, 0 ), 1, 8, 0 );
}
cvClearMemStorage( storage );
}