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 :

sqrt dans une matrice image


Sujet :

OpenCV

  1. #1
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Par défaut sqrt dans une matrice image
    Bonjour,

    Je travaille actuellement sur un gaze tracking.
    Tout d'abord je souhaite tracker la pupille.

    J'ai trouvé un code source intéressant ( [ame="http://www.youtube.com/watch?v=aGmGyFLQAFM"]Accurate eye center localisation for low-cost eye tracking - YouTube[/ame] ). J'essqie donc de mettre en pratique ce code en utilisant opencv et visual studio 2010. Cependqnt je n'aarive pas à résoudre une erreur concernant la racine carré d'un membre d'une matrice.

    Voici la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double computeDynamicThreshold(const cv::Mat &mat, double stdDevFactor) {
      cv::Scalar stdMagnGrad, meanMagnGrad;
      cv::meanStdDev(mat, meanMagnGrad, stdMagnGrad);
      double stdDev = stdMagnGrad[0] / sqrt(mat.rows*mat.cols);
      return stdDevFactor * stdDev + meanMagnGrad[0];
    }
    En cherchant sur internet j'ai remarqué que cette fonction est souvent reproduite lors du eye tracking.

    Mon problème est que faire le calcul de la racine carré "sqrt" semble compliqué pour Visual Studio. Ainsi le message d'erreur suivant est renvoyé:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2668: 'sqrt' : ambiguous call to overloaded function
    Visual Studio me suggère de remplacer par ou ou encore .

    Je ne vois pas comment réparer ou remplacer la fonction sqrt.

    Quelqu'un aurait-il une solution svp?

    Cordialement.

    Kévin LELU

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Par défaut
    Bonjour.

    La fonction sqrt est certainement définit dans au moins deux fichiers. Un fichier de visual et un fichier d'openCV.

    Il faut certainement faire un truc de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    double stdDev = stdMagnGrad[0] / OpenCV::sqrt(mat.rows*mat.cols);
    PS : Se renseigner sur les "namespace" sera un plus.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    La fonction sqrt du standard accepte les trois types en paramètres float, double et long double :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    float       sqrt( float arg );
    double      sqrt( double arg );
    long double sqrt( long double arg );
    or mat.rows et mat.cols sont de type int.
    Ton compilateur hésite alors entre ces types.

    Il faut donc effectuer un cast explicite pour obtenir l'un des trois types attendus. Vu ton retour, on va prendre double
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double stdDev = stdMagnGrad[0] / sqrt( static_cast<double>(mat.rows*mat.cols) );

  4. #4
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Par défaut
    Merci beaucoup pour votre aide !

    J'ai remplacé ma ligne de code par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double stdDev = stdMagnGrad[0] / sqrt( static_cast<double>(mat.rows*mat.cols) );
    et ça a marché !


    J'avais un autre problème avec la fonction "round" qui n'était pas définie...
    En me renseignant sur internet j'ai donc créer cette fonction en écrivant la ligne de code suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline double round (double d)
    {return floor(d+0.5);
    }
    Mon programme tourne sans bug mais je n'ai pas le résultat attendu (pas de detection de face). J'ai juste l'image envoyée par ma webcam.

    Je me demande donc si il n'y a pas une autre façon de définir la fonction "round".

    Ai-je bien fait?

    Cordialement.

    klelu

  5. #5
    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
    Question bete, mais pourquoi renvoyer un double alors que ta fonction sert a extraire un int d'un double.

  6. #6
    Membre averti
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Par défaut
    C'est vrai qu'un entier devrait l'affaire.
    C'est un peu pour "plus de sécurité" que j'ai laissé double.

    Finalement je réussi à faire fonctionner correctement mon programme!

    La définition de la fonction "round":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    inline double round (double d)
    {return floor(d+0.5);
    }
    est donc bonne !

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

Discussions similaires

  1. [Débutant] Mettre une image dans une matrice plus grande
    Par Artinuin dans le forum Images
    Réponses: 5
    Dernier message: 07/05/2010, 11h31
  2. Réponses: 6
    Dernier message: 17/04/2009, 16h48
  3. Charger une image .png ou .jpeg dans une matrice
    Par Hedidams dans le forum C++Builder
    Réponses: 13
    Dernier message: 06/04/2008, 13h24
  4. Enregistrer une image bmp dans une matrice
    Par Mounr dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/04/2007, 23h54
  5. Réponses: 3
    Dernier message: 07/12/2006, 10h15

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