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;
     }