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 :

Utilisation de la ROI ailleurs qu'à l'origine


Sujet :

OpenCV

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut Utilisation de la ROI ailleurs qu'à l'origine
    Bonjour tout le monde,

    Dans le cadre d'une application de détection d'objets à des fins d'assistance à la navigation pour une chaise roulante, j'utilise les méthodes de flux optique de OpenCV (cvGoodFeaturesToTrack, cvCalcOpticalFlowPyrLK), mais il se trouve que selon l'environnement, l'ensemble des points (features) détectés sont majoritairement situés dans le haut de l'image, ce qui ne m'interesse pas, car les objets proches, donc "intéressants dans l'immédiat" sont situés généralement sur le bas de l'image.

    J'ai donc décidé de définir une ROI (region of interest) dans la moitié inférieure de mon image. Ca fonctionne mais... Quel que soient les coordonnées que je lui donne, ma ROI se situe à l'origine de mon image (en haut à gauche), donc c'est toujours dans la mauvaise moitié de l'image que les points sont détectés...

    Voici ce que j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    //Definit un carre de 100*100 en coordonnees 200:200 pour le test
    CvRect roi = cvRect(200,200,100,100);
     
    cvSetImageROI(currentMonochromeFrame, roi);
    Donc la, le carré fait bien 100*100, mais se trouve en position 0:0


    Pour info, je travail sous MacOS, je ne sais pas si ca une influence...

    Merci de votre aide

  2. #2
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Peux tu nous montrer un peu plus de code stp? A voir comme ça, ça a l'air bien forcément.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    C'est aussi ce qu'il me semblait, j'ai regardé les codes que je trouvais sur internet et ils ont l'air de faire de la meme manière que moi... Pour obtenir ce que je veux, j'ai pour l'instant retourné mon image de base (cvFlip) je la traite, puis je la retourne à nouveau pour l'affichage... Mais ce système ne suffira pas par la suite, quand j'utiliserai diverses ROI...

    Alors voici la méthode en entier
    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
       void ComputerVision::processImage(IplImage * currentFrame)
       {
          //Copy current frame to the previous one and get a new one
          cvCopy(currentMonochromeFrame, previousMonochromeFrame);
          cvCopy(currentFrame, currentMonochromeFrame);
     
     
          CvRect roi = cvRect(0,0,frameSize.width, (int)frameSize.height / 2.0);
     
          cvSetImageROI(currentMonochromeFrame, roi);
          cvSetImageROI(previousMonochromeFrame, roi);
          cvSetImageROI(eigImage, roi);
          cvSetImageROI(tempImage, roi);
          cvSetImageROI(pyramid1, roi);
          cvSetImageROI(pyramid2, roi);
     
          cvGoodFeaturesToTrack(previousMonochromeFrame, eigImage, tempImage, previousFeatures, &featuresNumber, .01, .01, NULL); 
     
          //Compute the optical flow
          cvCalcOpticalFlowPyrLK(previousMonochromeFrame, currentMonochromeFrame, pyramid1, pyramid2, previousFeatures, 
                                 currentFeatures, featuresNumber, opticalFlowWindow, MAXPYRAMIDS, 
                                 foundFeatures, errorFeatures, 
                                 termCriteria, ENHANCEMENTS); 
     
          cvResetImageROI(currentMonochromeFrame);
          cvResetImageROI(previousMonochromeFrame);
       }
    Pour le moment, à des fins de débug, la ROI est définie à l'intérieur, mais par la suite, l'idée serait d'en faire un paramètre réglable.

    Si tu veux l'appli entière, je peux également en faire une archive pour la déposer ici en pièce jointe.

    Je pense que je vais également faire un test sur une VM windows pour voir si le comportement est pareil... (l'ouvrier préfère forcement accuser l'outil plutôt que lui même )


    En tout cas, merci de ton aide

  4. #4
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CvRect roi = cvRect(0,0,...
    He bien là la position de ton carré commence bien à l'origine...c'est où que tu veux avoir une position ailleurs?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Oui, effectivement, je t'ai donné le mauvais code. La, j'ai fait comme j'ai dit plus haut, càd en retournant mon image pour que la ROI soit au bon endroit. Mais j'ai beau changer ces valeurs à volonté rien ne se passe...

    Par exemple comme j'avais avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          CvRect roi = cvRect((int)frameSize.height / 2.0,0,frameSize.width, (int)frameSize.height / 2.0);
          //CvRect roi = cvRect(0,0,frameSize.width, (int)frameSize.height / 2.0);
     
          cvSetImageROI(currentMonochromeFrame, roi);
          cvSetImageROI(previousMonochromeFrame, roi);
          cvSetImageROI(eigImage, roi);
          cvSetImageROI(tempImage, roi);
          cvSetImageROI(pyramid1, roi);
          cvSetImageROI(pyramid2, roi);
    Par contre, je viens de le remarquer que si la coordonnée Y de ma ROI + sa hauteur sont supérieures à la taille de ma frame, ca plante...

  6. #6
    Membre régulier Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Points : 123
    Points
    123
    Par défaut
    Salut,

    Pour le CvRect, c'est CvRect(int xRoi, int yRoi, int widthRoi, int heightRoi), donc j'aurai plutôt vu :
    CvRect roi = cvRect(0, (int)frameSize.height / 2.0, frameSize.width, (int)frameSize.height / 2.0);

    Tu fais pas mal de cvSetImageROI mais tous ne sont pas supprimer par cvResetImageROI, normal ?

    Sinon regarde cet exemple en bas de page :
    http://www.developpez.net/forums/arc.../t-540921.html
    Il est fonctionnel, j'obtenais bien une mosaïque en changeant le roi de place.

    A+,

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Effectivement, j'ai confondu les 2 coordonées, mais malheureusement, ni en x, ni en y je ne vois de changement.

    Sinon, au sujet des libérations, effectivement je ne libère pas tout la, car mon code est en mode "je-teste-a-la-moche-en-esperant-trouver-le-probleme"... Donc normalement, il ne devrait pas y avoir de cvSetImageROI ici, ils devraient être dans le constructeur, ni de cvReleaseImageROI, ni de cvResetImageROI, je n'en ai théoriquement pas besoin, ils devraient être dans le destructeur, mais comme ma fonction plantait sur les 2 cvCopy j'ai un peu bidouillé. Mais avec ton lien j'ai compris qu'en fait c'est les cvCopyImage que je devais utiliser ^^ (ils ne tiennent pas compte de la ROI pour la copie).

    Je vais donc tester ton code et voir quel résultat j'ai.

    Merci

  8. #8
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    mes cvCopyImage à moi ne marchaient pas avec la ROI
    J'ai fait cvCopy(img1,img2,0); à la place et ça marche bien

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Bon, l'exemple marche, c'est donc bien moi qui fait un truc faux... Je vais voir ce que je trouve

  10. #10
    Membre régulier Avatar de hunta_kirua
    Profil pro
    Inscrit en
    Février 2008
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 110
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par gassi64 Voir le message
    mes cvCopyImage à moi ne marchaient pas avec la ROI
    J'ai fait cvCopy(img1,img2,0); à la place et ça marche bien
    cvCopyImage ne marche pas avec le ROI et c'est bien cvCopy qu'il faut utiliser lorsqu'il y a un ROI sur une image. lgomez parlait d'utiliser cvCopyImage pour les deux copies qu'il fait au début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     cvCopy(currentMonochromeFrame, previousMonochromeFrame);
     cvCopy(currentFrame, currentMonochromeFrame);
    Edit : je me demande si cvGoodFeaturesToTrack tient compte du ROI... rien vu dans la doc ni dans un sens, ni dans l'autre. Pour tester le ROI dans la fonction, voir avec cvShowImage qui en tient compte, déjà ça permettra de savoir si le ROI passe. Mais il serait peut-être préférable de faire une copie temporaire de la partie basse de l'image (ROI + cvCopy) puis de travailler dessus...

    A+,

    Hunta
    newbie un jour, newbie toujours
    n'oubliez pas le

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par hunta_kirua Voir le message
    Mais il serait peut-être préférable de faire une copie temporaire de la partie basse de l'image (ROI + cvCopy) puis de travailler dessus...
    Je pense que c'est ce que je vais tenter, je ne vois pas ce que je fais de different autrement...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 59
    Points : 46
    Points
    46
    Par défaut
    Je suis impardonnable Après plusieurs heures d'arrachage de cheveux, j'ai compris...

    C'était très... Con...

    La ROI fonctionnait très bien, c'était plus loin, lorsque j'affichais le résultat de l'optical flow, je ne tenais pas compte du fait que les coordonnées que j'avais correspondaient à celles... De la ROI et non de l'image entière!

    En tout cas, merci beaucoup pour votre aide et dsl de vous avoir fait perdre votre temps pour rien

  13. #13
    Membre actif Avatar de gassi64
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2008
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 255
    Points : 230
    Points
    230
    Par défaut
    Baa on ne perd pas notre temps à te répondre, plus on s'entraide et plus on va vite dans nos programmes!

    Si tu as d'autres soucis, n'hésites pas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Joomla!] Utiliser un module/une extension Joomla ailleurs que dans le CMS
    Par fashuai dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 26/04/2009, 21h59
  2. [POO] Utiliser un membre static ailleurs ou ?
    Par Metallizer dans le forum C++
    Réponses: 2
    Dernier message: 04/12/2008, 18h45
  3. utilisation d'une fonction ailleur dans le code
    Par tortuegenie dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/11/2008, 11h07
  4. Récupérer une injection pour l'utiliser ailleurs
    Par f-k-z dans le forum Langage
    Réponses: 5
    Dernier message: 20/03/2008, 00h15
  5. Récupérer un socket utilisé pour l'utiliser ailleurs
    Par v4np13 dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 01/12/2007, 10h11

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