Partage
  • Partager sur Facebook
  • Partager sur Twitter

HogDescriptor

detectmultiscale

    1 juin 2011 à 17:41:36

    Bonjour j'utilise en ce moment la fonction HogDescriptor dans un programme dont j'ai emprunté du code a d'autre programme existant déja.

    Le programme consiste a détecter des piétons et a créer autour d'eux un rectangle.

    Mon but étant de connaitre environ la vitesse du piéton la fonction tel que je l'utilise ( et qui marche sans pbm) ne me convient pas car les rectangles ont une taille variable. je voudrais essayer de fixer leur taille mais je ne trouve pas de documentation sur cette fonction :/

    Je vous met une parti du code sous python.
    from pyopencv import * 
        from PIL import *
        import Image
        
        
        import scipy
        
        img =imread(k)
        
    
       
        hog = HOGDescriptor()
        hog.setSVMDetector(HOGDescriptor.getDefaultPeopleDetector())
        for r in hog.detectMultiScale(img, 0, Size(8,8), Size(24,16), 1.05, 2):
            r.x += round(r.width*0.1)
            r.y += round(r.height*0.1)
            r.width = round(r.width*0.8)
            r.height = round(r.height*0.8)
            rectangle(img, r.tl(), r.br(), Scalar(0,255,0), 1)
        namedWindow("people detector", 1)
        imshow("people detector", img)
    
    • Partager sur Facebook
    • Partager sur Twitter
      1 juin 2011 à 17:59:16

      Pour la théorie derrière la fonction (HOG = Histograms of Oriented Gradients) : Histogram_of_oriented_gradients

      Sinon, n'ayant jamais utilisé cette approche je ne saurais pas t'aider (d'autant que ce n'est même pas un objet de base d'OpenCV, mais une pièce rapportée dans pyopencv). D'instinct je dirais que la détection est simplement une rétro-projection d'histogramme, m'enfin je dis sûrement une connerie.

      Quoi qu'il en soit ça m'étonnerait que tu puisses fixer la taille des cibles (sinon le détecteur ne servirait à rien).
      • Partager sur Facebook
      • Partager sur Twitter
      Zeste de Savoir, le site qui en a dans le citron !
        1 juin 2011 à 18:24:58

        Merci pour la réponse et pour le site ou j'ai pu comprendre un peu mieux le fonctionnement global.

        Dans la fonction utilisé n'y a t'il pas un endroit ou on définit par exemple la taille maximale/minimale que peu prendre le rectangle ?

        Le probleme que je rencontre c'est que sur une capture d'image fixe
        avec ma webcam la position du rectangle n'est pas strictement identique meme si je ne bouge pas l'objet j'espérais qu'en fixant la taille du rectangle, il apparaisse toujours au meme endroit ( mias je me dit de plus en plus que sa ne pourra pas marcher ...)

        En gros pour l'instant dans mon prgm je capture une image je detecte les piétons dessus je soustrait l'image final a l'image initial pour ne conserver que le rectangle autour.
        Je fais de meme avec une autre image peu de temps apré.
        Ensuite je calcule le flux optique entre les deux, et je récupere la composante selon x.
        Mais je pense que si les 2 rectangles n'ont pas la meme taille la composante selon x ne sera pas vraiment représentatif :s

        • Partager sur Facebook
        • Partager sur Twitter
          1 juin 2011 à 19:24:15

          Tu peux toujours calculer simplement le déplacement du centre de gravité du rectangle... c'est une approximation comme une autre qui ne dépend pas de la taille de la cible.
          • Partager sur Facebook
          • Partager sur Twitter
          Zeste de Savoir, le site qui en a dans le citron !
            2 juin 2011 à 9:58:27

            Ok c'est une bonne idée je vais tester.

            Merci :)
            • Partager sur Facebook
            • Partager sur Twitter
              4 juin 2011 à 17:31:09

              Bon je sais que le centre de gravité d'un rectangle se situe a l'intersection de ses diagonales mais y a t'il une fonction python qui le ferait directement ? et si non je pensais en me basant sur la hauteur et la largeur du rectangle placé le point du centre de gravité au milieu de la hauteur et de la largeur mais je n'arrive pas a déterminer dans le programme ci dessus comment trouver la hauteur et la largeur ...
              • Partager sur Facebook
              • Partager sur Twitter
                4 juin 2011 à 17:34:44

                centre = (r.x + r.width // 2, r.y + r.height // 2)

                ;)
                • Partager sur Facebook
                • Partager sur Twitter
                Zeste de Savoir, le site qui en a dans le citron !
                  4 juin 2011 à 19:21:17

                  Merci bien :D.
                  Maintenant j'hésite: soit je crée une image contenant juste le point et sur 2 image consécutive je calcule le flux optique.
                  soit je me débrouille pour la trouver en fonction des coordonnée des 2 points.
                  Quelle serait la meilleur méthode ( la 2eme prendra sans doute moins de temps et sera plus précise je pense mais je n'en suis pas certain)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 juin 2011 à 19:28:47

                    Si tu te sers des HOG pour détecter les personnes sur 2 images consécutives, tu n'as plus besoin du flot optique, et ce sera effectivement plus précis.

                    La seule difficulté va se poser quand il y aura plusieurs personnes à la fois sur la vidéo : il faudra les mettre en correspondance.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zeste de Savoir, le site qui en a dans le citron !
                      4 juin 2011 à 21:02:53

                      Ok je vais me limiter a la présence d'une seule personne pour l'instant et je verrais a l'améliorer plus tard pendant les vacances sans doute.
                      En tout cas merci bcp pour ton aide :)
                      • Partager sur Facebook
                      • Partager sur Twitter

                      HogDescriptor

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown