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 :

Interpolation linéaire


Sujet :

OpenCV

  1. #1
    Nouveau candidat au Club
    Inscrit en
    Avril 2010
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 1
    Par défaut Interpolation linéaire
    bonjour tout le monde
    je suis entrain de faire un programme avec opencv qui permet de détecter une ligne dans une image après l'avoir traiter.
    la méthode est la suivante:
    -l'image est convertit au niveau de gris
    -l'image est seuillé de let façon que la ligne apparait en couleur blanche et tout le reste est en couleur noire
    - je balaye l'image binaire et je stocke les coordonnées des points formant la ligne dans une matrice
    Problème:
    je doit extraire la pente de cette droite a fin de commandé un robot pour qu'il puisse la suivre, pour cela je doit interpoler ces points et déterminer la ligne qui passe par le maximum de points et de déterminer sa pente.
    quelqu'un peut m'aider svp
    merciiiiiii


    voici le code :
    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    #include <cv.h>
    #include <cvaux.h>
    #include <highgui.h>
    #include <Cxcore.h>
    #include <string.h>
     
    using namespace std;
     
    int main( int argc, char** argv )
    {
     
     
        // DECLARATION image".
        IplImage *img;
     
        //On charge L' image depuis un fichier.
        img=cvLoadImage("C:\\Users\\dell\\Desktop\\ligne\\es2.jpg");
        //On crée une fenêtre intitulée "im1", 
     
        cvNamedWindow("im1",1);
     
        //On affiche l'image dans la fenêtre "im1".
        cvShowImage("im1", img);
    	cvWaitKey(0);
    	// Conversion niveau de gris
    	IplImage *img_nvg = cvCreateImage(cvGetSize(img),8, 1);
    	IplImage *img_bin = cvCreateImage(cvGetSize(img),8, 1);
    	IplImage *img_line = cvCreateImage(cvGetSize(img),8, 1);
     //On vérifie l'origine de l'image chargée
        //Si elle n'est pas en haut à gauche, il faut la corriger
        /*int flip=0;
        if(img->origin!=IPL_ORIGIN_TL)
        {
            flip=CV_CVTIMG_FLIP;
        }
       */
        //Conversion en niveaux de gris
        //cvConvertImage(img, img_nvg, flip);
     
         cvCvtColor(img,img_nvg, CV_RGB2GRAY);
        cvNamedWindow("im2",1);
    	cvShowImage("im2",img_nvg);
    	double p_min=255;
    	double p_max=0;
    	CvScalar scalaire;
    	cvWaitKey(0);
     
    //On parcourt toute l'image
    for(int x=0; x<img->width; x++)
       {
         for(int y=0; y<img->height; y++)
           {
     
    //On récupère le pixel de coordonnées (x,y)
             scalaire=cvGet2D(img_nvg, y, x);
     
    //Si le niveau de gris est inférieur à p_min, il devient p_min
             if(scalaire.val[0]<p_min)
               {
                 p_min=scalaire.val[0];
               }
     
    //Si le niveau de gris est supérieur à p_max, il devient p_max
            if(scalaire.val[0]>p_max)
              {
                p_max=scalaire.val[0];
              }
           }
     }
     
    double T=p_max-0.4*(p_max-p_min);
    cvThreshold(img_nvg,img_bin,T,255,CV_THRESH_BINARY);
    /*for(int x=0; x<img->width; x++)
       {
         for(int y=0; y<img->height; y++)
           { scalaire=cvGet2D(img_nvg, y, x);
    	     if(scalaire.val[0]>T)
    		   {  scalaire.val[0]=255;  }
    		 else 
    		   {scalaire.val[0]=0; }
    		 cvSet2D(img_nvg, y, x, scalaire);
    	   }  
        }*/
    cvNamedWindow("im3",1);
    cvShowImage("im3",img_bin);
    cvWaitKey(0);
    int y=img_nvg->height;
    int countN=1;
    CvMat* points=cvCreateMatHeader(400,2,CV_32FC1);
    /*double ctrx[2000];
    double ctry[2000];*/
    // Extraction des coordonnées des poits de la ligne 
    double countX;
    double Ct[2000];
    int count_point=0;
    while(countN!=0 && y!=0)
         { countN=0;
           countX=0;
     
    	   for(int x=0; x<img->width; x++)
              { scalaire=cvGet2D(img_nvg, y, x);
    	          if(scalaire.val[0]==255)
    			    {countX=countX+x;
    			      countN=countN+1;
    			    }
    	       }
    	   points->rows=countX/countN;
    	   points->cols=y;
          //ctr[x]=[Ct];
          //ctry[x]=[ctry];
          y=y-1;
    	  count_point=count_point+1;
         }

  2. #2
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    c'est une ligne ou une bande que tu as ? tu dois avoir une grosse précision ou pas? Sinon pour l'interpolation d'un ensemble de point me semble que y a un algo en math (dont j'ai oublié le nom bien sur ^^)

  3. #3
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2009
    Messages : 141
    Par défaut
    Si j'ai bien compris ton probleme je pense que ce site pourra t'aider :
    http://fr.wikipedia.org/wiki/R%C3%A9..._lin%C3%A9aire
    Je pense que c'est pas trop complique a implementer et que ca doit donner exactement ce que tu veux (coeff directeur de la droite).

  4. #4
    Membre chevronné
    Inscrit en
    Mars 2010
    Messages
    439
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 439
    Par défaut
    ca me rappelle des souvenir ^^

    attention à vérifier l'erreur commise, si celle-ci est au dessus de 1% l'équation n'est pas très bonne.

Discussions similaires

  1. Réponses: 10
    Dernier message: 19/08/2009, 12h02
  2. [XL-2003] création d'une interpolation linéaire.
    Par Piccou dans le forum Excel
    Réponses: 5
    Dernier message: 30/07/2009, 09h51
  3. algorithme d'interpolation linéaire
    Par kromartien dans le forum Mathématiques
    Réponses: 5
    Dernier message: 11/04/2007, 09h55
  4. Interpolation "linéaire" sur un point dans triangle (3D)
    Par Vol dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 09/07/2006, 22h34

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