budi permana Ответов: 2

как определить профиль лица (боковое лицо) ?


привет, ребята, я использую opencv и visual studio, чтобы попробовать программу обнаружения лиц, и она работает. Мой вопрос заключается в том, могут ли передняя и боковая грани (профиль лица) быть обнаружены одновременно (в одно время в одной программе)? я уже звонил в полицию. lbpcascade_profileface.xml, а потом я воспользовался haarcascade_profileface.xml но программа не работает должным образом. а иногда даже лобное лицо не поддается обнаружению. какие-нибудь предложения, пожалуйста? спасибо

2 Ответов

Рейтинг:
1

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


Рейтинг:
1

HaFiz Umer

private Bitmap DetectFace(Bitmap faceImage)
        {
            var image = new Image<Bgr, byte>(faceImage);
            var gray = image.Convert<Gray, Byte>();
            var haarCascadeFilePath = _httpContext.Server.MapPath("~/haarcascade_profileface.xml");
            var face = new CascadeClassifier(haarCascadeFilePath);

            Rectangle[] facesDetected = face.DetectMultiScale(gray, 1.1, 2 , new Size(20,20));
            Total_faces = facesDetected.Length;
            Image<Gray, byte> result = null;
            if (Total_faces == 0)
            {
                var haarCascadeFilePath_tree = _httpContext.Server.MapPath("~/haarcascade_frontalface_alt_tree.xml");
                var face_tree = new CascadeClassifier(haarCascadeFilePath_tree);
                Rectangle[] facesDetected_tree = face_tree.DetectMultiScale(gray, 1.1, 2, new Size(20, 20));
                Total_faces = facesDetected_tree.Length;
                if (Total_faces == 0)
                {

                }else { 
                image.Draw(facesDetected_tree[0], new Bgr(Color.Blue), 2);
                result = image.Copy(facesDetected_tree[0]).Convert<Gray, byte>();

                if (result != null)
                {
                    result = result.Resize(100, 100, Inter.Cubic);

                    return result.Bitmap;
                }
                }
            }
            else
            {
                image.Draw(facesDetected[0], new Bgr(Color.Blue), 2);
                result = image.Copy(facesDetected[0]).Convert<Gray, byte>();

                if (result != null)
                {
                    result = result.Resize(100, 100, Inter.Cubic);

                    return result.Bitmap;
                }
            }
            

            return null;
        }


Richard Deeming

Вопрос помечен тегом "C++".

Делает код решения выглядят чем-то вроде C++ на вы?!