IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

pointPolygonTest rend la capture très lente.


Sujet :

OpenCV

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut pointPolygonTest rend la capture très lente.
    Bonjour,
    Ce bout de code permet de trouver le cercle maximum inscrit dans le contour de la main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
     /*
        ********************************Rechercher et dessiner le cercle maximum inscrit.**********************************
       */
      //Dessiner le rectangle englobant le contour le plus large.
      //Pour limiter la zone de la recherche du centre et du rayon du cercle.
      Rect recta = boundingRect(allContours[maxIndex]);
      rectangle(fluxCamera , recta , Scalar(255,0,0) , 1 , 8 , 0 );
     
      //Une fois le rectangle trouvé, on détermine la zone de recherche. 
      int startX = recta.tl().x;
      int startY = recta.tl().y;
      int endX = recta.tl().x + recta.width;
      int endY = recta.tl().y + recta.height;
     
     
      //Décalaration des variables qui vont contenir le centre et le rayon.
      Point2f centroideOfMaxInscribedCircle;
      float raduisOfMaxInscribedCircle = -1.0;
      //variable de comparaison.
      float distance;
     
      //Recherche du rayon et du centre.
      for (int x = startX ; x <= endX ; x++)
      {
        for(int y = startY ; y <= endY ; y++)
        {
          distance = pointPolygonTest(allContours[maxIndex], Point(x,y),true);
     
          if (raduisOfMaxInscribedCircle < distance)
          {
    	raduisOfMaxInscribedCircle = distance;
    	centroideOfMaxInscribedCircle = Point(x,y);
          }
        }
      }
     
      //Dessiner le cercle.
      circle(fluxCamera , centroideOfMaxInscribedCircle , (int)raduisOfMaxInscribedCircle , Scalar(255,255,0) , 2);
      circle(fluxCamera , centroideOfMaxInscribedCircle , 2 , Scalar(255,255,0) , 2);
      /***************************************************************************************************************************************/
    sauf que il rend l'affichage trés lent.
    Est-ce-qu'il y a un autre moyen de trouvé le cercle maximum inscrit sans passer par deux boucles ?

    Merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Par défaut
    Bonjour,

    Si tu cherches un cercle inscrit dans une main, tu dois te douter qu'il doit se trouver au milieu de la paume de la main.
    Du coup tu pourrais deja restreindre ta recherche a cette zone.

    Sinon, un peu plus evolue, je pensais a un squelette, ou a une carte des distances.
    Tu considere ta main, non pas comme un contour, mais comme un objet plein, et tu cherche le skelette de cet objet.
    Le centre de ton cercle se trouve sur ton squelette.

    Pour la carte des distances, tu calcules pour chaque pixel sa distance avec le contour.
    Le pixel ayant la plus grande distance est le centre de ton cercle.

    Bonne chance.

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 94
    Par défaut
    Bonjour,

    Merci de votre réponse.

    Je crois que "pointPolygonTest" utilise la carte de distances.

    J'ai résolu le problème en diminuant la taille de la capture vidéo. Ce n'est pas la meilleur solution, mais ça marche pour le moment.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2011
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2011
    Messages : 147
    Par défaut
    Bonjour,

    Je me suis mal fait comprendre.
    Dans ton code source, tu appelle la fonction pointPolygonTest n*n fois.
    Donc ton code est tres lent, et c'est normal.

    Ce que je te proposais etait de calculer la carte des distance une fois et une seule (si pointPolygonTest fonctionne de la meme maniere ou non, cela ne change rien).
    Mais pour calculer ta carte des distances, tu ne part pas d'un point et tu regardes la distance des bords. Tu pars des bords et regarde la distance des points a l'interieur.

Discussions similaires

  1. BDD sur réseau très très très lent...
    Par ericain dans le forum Access
    Réponses: 12
    Dernier message: 20/02/2015, 17h17
  2. Ouverture et fermeture de base très lent...
    Par Tofdelille dans le forum Installation
    Réponses: 6
    Dernier message: 19/09/2006, 18h51
  3. [Lomboz] Editeur jsp très lent
    Par lr dans le forum Eclipse Java
    Réponses: 10
    Dernier message: 29/01/2005, 19h43
  4. SQL Server trés lent
    Par arwen dans le forum MS SQL Server
    Réponses: 18
    Dernier message: 07/11/2003, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo