2014-12-23 2 views
2

Есть ли способ оптимизировать классификатор Haar-Cascade для обнаружения лица?Точность определения угла наклона шкалы Хаар-Каскада при обнаружении лица

Я создал эту функцию, и она работает хорошо, но я все еще есть некоторые проблемы с некоторым фото:

void ImageManager::detectAndDisplay(Mat frame, CascadeClassifier face_cascade){ 


    string window_name = "Capture - Face detection"; 
    string filename; 

    std::vector<Rect> faces; 
    std::vector<Rect> eyes; 
    Mat frame_gray; 
    Mat crop; 
    Mat res; 
    Mat gray; 
    string text; 
    stringstream sstm; 


    cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

    // Detect faces 
    face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); 

    // Set Region of Interest 
    cv::Rect roi_b; 
    cv::Rect roi_c; 

    size_t ic = 0; // ic is index of current element 


    for (ic = 0; ic < faces.size(); ic++) // Iterate through all current elements (detected faces) 
    { 

     roi_c.x = faces[ic].x; 
     roi_c.y = faces[ic].y; 
     roi_c.width = (faces[ic].width); 
     roi_c.height = (faces[ic].height); 



     crop = frame_gray(roi_c); 

     faces_img.push_back(crop); 

     rectangle(frame, Point(roi_c.x, roi_c.y), Point(roi_c.x + roi_c.width, roi_c.y + roi_c.height), Scalar(0,0,255), 2); 


    } 

    imshow("test", frame); 
    waitKey(0); 

    cout << faces_img.size(); 


} 

кадра: фото я должен провести анализ.

face_cascade: это каскад классификатор создан из haar_cascade.xml

Это фото я использовал в качестве теста для алгоритма: и результат: enter image description here

Результат неплох , все лица правильно распознаются, но, как видите, есть три ложных срабатывания, которые я хотел бы удалить.

Заранее спасибо

+2

Увеличьте параметр minNeighbours от 2 до 5, возможно (пока вы не начнете пропускать положительные эффекты). – berak

+0

Woow, это работает. Спасибо –

+0

Кстати, если вы найдете более приятные ложные обнаружения, - не стесняйтесь [добавьте их сюда] (http://machine-pareidolia.appspot.com/) – berak

ответ

6

внутренне, то CascadeClassifier делает несколько обнаружений и группы тех.

minNeighbours (в вызове detectMultiScale) это количество обнаружений примерно в том же месте nessecary считать в качестве действительного обнаружения, тем самым увеличить, что с вашей текущей 2, может быть, 5 или около того, пока вы не начнете пропускать позитивы ,