2017-01-22 19 views
1

Я пытаюсь обнаружить грани с помощью opencv detectmultiscale. Количество граней на выходе HUGE (faces { size=1152921366050660864 }...), хотя входное изображение имеет только одну грань. Я попытался изменить значение minNeighbors, чтобы устранить избыточность, но ничего не изменилось. Я также попытался нарисовать только 5 экземпляров из faces вместо того, чтобы зацикливать на faces.size(), чтобы увидеть, что происходит, и результат выводил круги снова и снова на одном и том же лице. У меня такая же проблема, как в here, они предложили построить библиотеку самостоятельно. Это единственное решение. Я не умею использовать Make.opencv 3.1 detectmultiscale() для обнаружения лица

drawing 5 instances only

Вот код, это копирование/вставка из OpenCV tutorial. Я использую VS2015.

#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/objdetect/objdetect.hpp" 

using namespace std; 
using namespace cv; 

String face_cascade_name = "haarcascade_frontalface_default.xml"; 
String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; 
CascadeClassifier face_cascade; 
CascadeClassifier eyes_cascade; 
String window_name = "Capture - Face detection"; 

void detectAndDisplay(Mat frame) 
{ 
    std::vector<Rect> faces; 
    Mat frame_gray; 
    cvtColor(frame, frame_gray, COLOR_BGR2GRAY); 
    equalizeHist(frame_gray, frame_gray); 

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

    for (size_t i = 0; i < 5; i++) 
    { 
     Point center(faces[i].x + faces[i].width/2, faces[i].y + faces[i].height/2); 
     ellipse(frame, center, Size(faces[i].width/2, faces[i].height/2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); 
     Mat faceROI = frame_gray(faces[i]); 
     //std::vector<Rect> eyes; 

     ////-- In each face, detect eyes 
     //eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); 
     //for (size_t j = 0; j < eyes.size(); j++) 
     //{ 
     // Point eye_center(faces[i].x + eyes[j].x + eyes[j].width/2, faces[i].y + eyes[j].y + eyes[j].height/2); 
     // int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); 
     // circle(frame, eye_center, radius, Scalar(255, 0, 0), 4, 8, 0); 
     //} 
    } 

    //-- Show what you got 
    imshow(window_name, frame); 
} 



int main() 
{ 
    //Load the cascades 
    if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; }; 
    if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; }; 

    Mat img, gray_img; 
    VideoCapture myVideo("head.mpg"); //open default camera 

    if (!myVideo.isOpened()) 
     cout << "The Camera is not open"; 

    while (myVideo.read(img)) { 

     detectAndDisplay(img); 

     if (waitKey(30) >= 0) break; 

    } 

    // system("pause"); 
    return 0; 
} 

ответ

0

I восстановленный opencv используя cmake. Вы можете найти пошаговое руководство here. и он работал.

Result

0

Похоже, что вам нужно не-максимальное подавление, которое избавится от всего избыточного обнаружения.

Я был удивлен, что opencv, похоже, не имеет его нигде. Возможно, вы можете найти какое-то вдохновение здесь: http://code.opencv.org/attachments/994/nms.cpp?

 Смежные вопросы

  • Нет связанных вопросов^_^