检测给定图片是否为人脸的方法是什么?

时间:2014-03-18 22:29:03

标签: algorithm opencv image-processing machine-learning computer-vision

是否有任何简单的算法来判断给定的图像是面部还是其他东西(希望没有训练)?

我的想法是构造每个图像的特征向量,然后应用一些聚类方法(例如k-means,其中k = 2)。但即使获得了良好的聚类结果,我也不确定区分面部/非面部的最佳标准是什么?

3 个答案:

答案 0 :(得分:3)

特征分解通过在具有高方差的数据空间中查找方向来减少连续域中的维度。 K-means在具有高密度点的空间中找到聚类。你可以把它们混合在一起,同时完全忽略你如何在第一个地方到达脸部特征(你将如何缩放,旋转和裁剪你想要检查的任何东西)。

你不需要训练哈尔探测器,因为他们已经训练过脸部。他们检测到一张脸,而不是识别它的身份。你需要的是将代码与一个小文件一起移植,该文件包含训练之后获得的参数(已经执行过),如上面Shiva所建议的那样。

尽管如此,对代码进行粗心的复制粘贴并没有多大意义。阅读一下Haar。试着理解

  1. 为什么他们的工作 - 面部具有在中间空间尺度上最明显的特征,如眼睛,鼻子,眉毛。太小(瞳孔的大小)或太大(整个面的大小)特征不太有用。
  2. 为什么Haars比小波或Gabor更受欢迎 - Haars只是Gabors的原始(四四方方)近似值,但由于它们可以用Integral images快速计算,因此它们更倾向于更精确但更慢的对应物;
  3. 有什么限制 - 哈尔斯有自己的空间尺度和方向,但可以很快重新计算另一个尺度。
  4. 如何训练哈尔分类器(你要避免的最激动人心的话题)。 Ada boost是培养由几个哈尔斯组成的更复杂分类器的一种方法。最后为了加快处理速度,您可以提出一个略有不同的问题,而不是找到我的脸。也就是说,您可以尝试快速消除图像中不能成为面部的区域。这称为级联分类。系统地研究这些方面,您将学习更多关于面部检测的知识,而不是从代码粘贴中学到的。

答案 1 :(得分:1)

您可以在图像/视频帧中使用Haar分类器方法进行人脸检测。

用于在图像中查找面部的示例代码将是这样的

int main(int argc, _TCHAR* argv[])
{
    IplImage* img;
    img = cvLoadImage( "dasl_hubo.jpg" );
    CvMemStorage* storage = cvCreateMemStorage(0);
    // Note that you must copy C:\Program Files\OpenCV\data\haarcascades\haarcascade_frontalface_alt2.xml or where opencv is installed
    // to your working directory

    CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad( "haarcascade_frontalface_alt2.xml" );

    double scale = 1.3;

    static CvScalar colors[] = { {{0,0,255}}, {{0,128,255}}, {{0,255,255}}, 
    {{0,255,0}}, {{255,128,0}}, {{255,255,0}}, {{255,0,0}}, {{255,0,255}} };// this will draw rectangles of these colors around the detected faces.

    // Detect objects
    cvClearMemStorage( storage );
    CvSeq* objects = cvHaarDetectObjects( img, cascade, storage, 1.1, 4, 0, cvSize( 40, 50 ));

    CvRect* r;
    // Loop through objects and draw boxes
    for( int i = 0; i < (objects ? objects->total : 0 ); i++ ){
        r = ( CvRect* )cvGetSeqElem( objects, i );
        cvRectangle( img, cvPoint( r->x, r->y ), cvPoint( r->x + r->width, r->y + r->height ),
            colors[i%8]);
    }

    cvNamedWindow( "Output" );
    cvShowImage( "Output", img );
    cvWaitKey();

    cvReleaseImage( &img );

    return 0;
}

访问这些链接,了解有关使用harr级联的面部检测的更多信息

drexel.edu

opencv documentation

presentation on Harr training and usages

答案 2 :(得分:1)

这是我在C ++中的opencv代码,借助Opencv haar-like功能可以很容易地检测图像中的面部,您可以参考文档中的一些方法来使用它们。我希望它有所帮助。

CascadeClassifier face_cascade;  //for read in haar-like faces database in opencv
std::vector<Rect> faces;         //for storing detected faces
vector<Point2d> FaceCenter;      //for storing centres of faces

Mat frame_gray = imread(“/Users/xxx/Desktop/xxx.jpg”, CV_8UC1);  //read the image in gray-scale;

equalizeHist( frame_gray, frame_gray );                       //histogram to extract the contrast

String face_cascade_name = "/Users/xxx/opencv-2.4.7/data/haarcascades/haarcascade_frontalface_alt.xml"; //path of the trained faces .xml file

if(!face_cascade.load(face_cascade_name))  //load the .xml
{
    cout << "face_casacade.xml load error" << endl;
}

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0, Size(50, 50) ); //Detect faces in the image

for(size_t i = 0; i < faces.size(); i++)
{
    Point2d center(faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5); //store centres of faces
    FaceCenter.push_back(center);

    int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); //circle the faces in the image, optional
    ellipse( frame_gray, center, Size( eyes[j].width*0.5, eyes[j].height*0.25), 0, 0, 360, Scalar( 255, 0, 0 ), 2, 8, 0 );
}

imshow(“Faces Detection”, frame_gray); //show the result