Valeurs recommandées pour les paramètres OpenCV detectMultiScale()

Quels sont les paramètres recommandés pour CascadeClassifier::detectMultiScale() et selon quels facteurs je dois changer les paramètres par défaut?

void CascadeClassifier::detectMultiScale(
    const Mat& image, 
    vector<Rect>& objects, 
    double scaleFactor=1.1,
    int minNeighbors=3, 
    int flags=0, 
    Size minSize=Size(),
    Size maxSize=Size() )
48
demandé sur herohuyongtao 2013-12-27 16:48:21

3 réponses

parmi ces paramètres, vous devez prêter plus d'attention à quatre d'entre eux:

  • scaleFactor – paramètre spécifiant combien la taille de l'image est réduite à chaque échelle d'image.

    essentiellement le facteur d'échelle est utilisé pour créer votre pyramide d'échelle. Plus d'explications peuvent être trouvées ici . En bref , comme décrit ici , votre modèle a un taille fixe définie lors de la formation, visible dans le xml . Cela signifie que cette taille de visage est détecté dans l'image si elle est présente. Cependant, en rééchelonnant l'image d'entrée, vous pouvez redimensionner un plus grand visage à un plus petit, ce qui le rend détectable par l'algorithme.

    1.05 est une bonne valeur possible pour cela, ce qui signifie que vous utilisez un petit pas pour redimensionner, i.e. réduire la taille de 5%, vous augmentez la chance d'une taille correspondant à la modèle pour la détection est trouvé. Cela signifie également que l'algorithme fonctionne plus lent, car il est plus complet. Vous pouvez l'augmenter jusqu'à 1,4 pour une détection plus rapide, avec le risque de manquer certains visages.

  • minNeighbors – paramètre spécifiant combien de voisins chaque rectangle candidat devrait avoir à le conserver.

    ce paramètre affecte la qualité des faces détectées. Supérieur la valeur résulte en moins de détections, mais avec une qualité supérieure. 3~6 est une bonne valeur pour elle.

  • minSize – taille minimale possible de l'objet. Les objets plus petits sont ignorés.

    ce paramètre détermine la petite taille que vous voulez détecter. Vous le décidez! Habituellement, [30, 30] est un bon début pour la détection du visage.

  • maxSize – taille maximale possible de l'objet. Les objets plus gros sont ignorés.

    ce paramètre détermine la taille que vous voulez détecter. Encore une fois, vous décidez! habituellement, vous n'avez pas besoin de définir manuellement , la valeur par défaut suppose que vous voulez détecter sans limite supérieure sur la taille de la face.

117
répondu herohuyongtao 2015-07-02 15:22:49

si vous avez une bonne performance CPU et RAM ou plus, vous pouvez définir scaleFactor=1 minNeighbors=3

si vous travaillez dans un système intégré comme dans raspberry je recommande de choisir smth comme scaleFactor= 2, (des valeurs plus élevées signifient moins de précision) minNeighbors = 1, (des valeurs plus élevées signifient moins de précision mais plus de fiabilité) l'algorithme fonctionnera beaucoup plus vite sinon il gèlera si les performances CPU et la RAM ne sont pas suffisantes .

espérons qu'il aide

-4
répondu The Beast 2016-10-21 10:43:54
cl_int err;
    cl_uint numPlatforms;

    err = clGetPlatformIDs(0, NULL, &numPlatforms);
    if (CL_SUCCESS == err)
    printf("\nDetected OpenCL platforms: %d", numPlatforms);
    else
    printf("\nError calling clGetPlatformIDs. Error code: %d", err);

    string str ="haarcascade_frontalface_alt2.xml";
    ocl::OclCascadeClassifier fd;
    fd.load(str);
    ocl::oclMat frame, frameGray;
    Mat frameCpu;


    CvVideoCapture vcap = openVideo("0");
    vcap.set(CV_CAP_PROP_FRAME_WIDTH,320);
    vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240);

    static const cv::Size maxSize;

    for(;;){
    //  // processing loop
        vector<Rect> faces;
    vcap >> frameCpu;
    frame = frameCpu;
    ocl::cvtColor(frame, frameGray, CV_BGR2GRAY);
    //ocl::equalizeHist(frameGray, frameGray);
    //Mat mm(frameGray);
    //cvWaitKey(100);

    fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize);


      for(int   i=0; i<  faces.size() ; i++)
       {
         if(faces.size())
         //circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 );       
             cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 );       
       }

      imshow("fsfs",frameCpu);

    cvWaitKey(1);
-4
répondu milind Morey 2017-01-09 08:11:59