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

 C++ Discussion :

Multiple definition of


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut Multiple definition of
    Bonjour,

    J'ai récupéré un code source pour qt mais impossible de le compiler. Le problème se trouve au niveau d'une classe et de son .h, les voici ci-dessous:

    colordetector.h:
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    #if !defined COLORDETECT
    #define COLORDETECT
     
    #include <opencv2/opencv.hpp>
     
    class ColorDetector {
     
      private:
     
    	  // minimum acceptable distance
    	  int minDist; 
     
    	  // target color
    	  cv::Vec3b target; 
     
    	  // image containing resulting binary map
    	  cv::Mat result;
     
    	  // image containing color converted image
    	  cv::Mat converted;
     
    	  // inline private member function
    	  // Computes the distance from target color.
    	  int getDistance(const cv::Vec3b& color) const {
    		 // return static_cast<int>(cv::norm<int,3>(cv::Vec3i(color[0]-target[0],color[1]-target[1],color[2]-target[2])));
    		  return abs(color[0]-target[0])+
    					abs(color[1]-target[1])+
    					abs(color[2]-target[2]);
    	  }
     
      public:
     
    	  // empty constructor
    	  ColorDetector() : minDist(100) { 
     
    		  // default parameter initialization here
    		  target[0]= target[1]= target[2]= 0;
    	  }
     
    	  // Getters and setters
     
    	  // Sets the color distance threshold.
    	  // Threshold must be positive, otherwise distance threshold
    	  // is set to 0.
    	  void setColorDistanceThreshold(int distance) {
     
    		  if (distance<0)
    			  distance=0;
    		  minDist= distance;
    	  }
     
    	  // Gets the color distance threshold
    	  int getColorDistanceThreshold() const {
     
    		  return minDist;
    	  }
     
    	  // Sets the color to be detected
    	  void setTargetColor(unsigned char red, unsigned char green, unsigned char blue) {
     
    		  cv::Mat tmp(1,1,CV_8UC3);
              tmp.at<cv::Vec3b>(0,0)[0]= blue;
              tmp.at<cv::Vec3b>(0,0)[1]= green;
              tmp.at<cv::Vec3b>(0,0)[2]= red;
     
      	      // Converting the target to Lab color space 
    	      cv::cvtColor(tmp, tmp, CV_BGR2Lab);
     
              target= tmp.at<cv::Vec3b>(0,0);
    	  }
     
    	  // Sets the color to be detected
    	  void setTargetColor(cv::Vec3b color) {
     
    		  cv::Mat tmp(1,1,CV_8UC3);
              tmp.at<cv::Vec3b>(0,0)= color;
     
      	      // Converting the target to Lab color space 
    	      cv::cvtColor(tmp, tmp, CV_BGR2Lab);
     
              target= tmp.at<cv::Vec3b>(0,0);
    	  }
     
    	  // Gets the color to be detected
    	  cv::Vec3b getTargetColor() const {
     
    		  return target;
    	  }
     
          // Processes the image. Returns a 1-channel binary image.
          cv::Mat process(const cv::Mat &image);
    };
     
     
    #endif
    colordetector.cpp
    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
     
    #include "colordetector.h"
     
    cv::Mat ColorDetector::process(const cv::Mat &image) {
     
          // re-allocate binary map if necessary
          // same size as input image, but 1-channel
          result.create(image.rows,image.cols,CV_8U);
     
          // re-allocate intermediate image if necessary
          converted.create(image.rows,image.cols,image.type());
     
          // Converting to Lab color space
          cv::cvtColor(image, converted, CV_BGR2Lab);
     
          // get the iterators
          cv::Mat_<cv::Vec3b>::iterator it= converted.begin<cv::Vec3b>();
          cv::Mat_<cv::Vec3b>::iterator itend= converted.end<cv::Vec3b>();
          cv::Mat_<uchar>::iterator itout= result.begin<uchar>();
     
          // for each pixel
          for ( ; it!= itend; ++it, ++itout) {
     
            // process each pixel ---------------------
     
              // compute distance from target color
              if (getDistance(*it)<minDist) {
     
                  *itout= 255;
     
              } else {
     
                  *itout= 0;
              }
     
            // end of pixel processing ----------------
          }
     
          return result;
    }
    Quand je compile j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    colordetector.cpp:20: multiple definition of `ColorDetector::process(cv::Mat const&)' first defined here
    Ce qui lui pose problème est qu'il n'autorise pas le colordetector.cpp a définir l'implémentation de la fonction process?

    Cependant ceci devrait marcher non?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    De deux choses l'une :

    Ou bien, tu as inclus le fichier colordetector.cpp dans un de tes propres fichiers (qui sait, une distraction, ca arrive ) et, dans ce cas, tu dois veiller à n'inclure que colordetector.hpp, ou bien, tu as un problème avec les gardes anti inclusion multiple.

    Il me semble en effet que, define UN_SYMBOLE définit bel et bien le symbole, mais qu'il vaut 0 par défaut, or, comme tout le monde le sait !0 donne true

    Dans ce cas, remplace simplement les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #if !defined COLORDETECT
    #define COLORDETECT
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #if !defined COLORDETECT
    #define COLORDETECT 1
    afin que !defined COLORDETECT ne donne true que tant que COLORDETECT n'est pas défini ou mieux encore par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifndef COLORDETECT
    #define COLORDETECT
    dans le même but (car ifndef vérifie juste si le symbole existe et non la valeur du symbole, et ca, c'est garanti )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    Merci Koala, en fait c'était dans le .pro que le .cpp était déclaré deux fois ^^.

    Par contre j'ai une autre erreur de compilation que je ne comprends pas (dur dur ), je vais créer un autre post plutôt.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 19/09/2006, 15h42
  2. Multiple definition
    Par vdumont dans le forum C++
    Réponses: 6
    Dernier message: 11/05/2006, 19h21
  3. multiple definition of operator<<...
    Par kleenex dans le forum C++
    Réponses: 3
    Dernier message: 05/05/2006, 02h56
  4. [LG]Interfaces et multiples définitions
    Par fatt dans le forum Langage
    Réponses: 2
    Dernier message: 15/04/2004, 22h41
  5. multiple definition
    Par scorbo dans le forum C
    Réponses: 5
    Dernier message: 10/09/2003, 13h16

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