Programme C algorithme de Hough

Waouuu Messages postés 2 Date d'inscription lundi 22 février 2010 Statut Membre Dernière intervention 23 février 2010 - 22 févr. 2010 à 14:38
ccgousset Messages postés 150 Date d'inscription samedi 1 août 2009 Statut Membre Dernière intervention 4 mars 2023 - 2 mars 2011 à 17:11
Bonjour, je suis actuellement en échange au Japon et dans mon labo mon prof m'a donné a programmer la transformée de Hough pour detecter les lignes de routes dans une image. Je suis debutante en C et j ai deja demandé de l'aide plusieurs fois dans mon labo mais j'attend toujours et je n'ose plus redemander...
Si quelqu'un peut me dire pourquoi mon code fait n'importe quoi? (il compile mais apparement quelque chose dans l'algo cloche je pense...). Merci d'avance!



extern "C"
{
#include
}
#include <stdio.h>

#include <math.h>

#include



main(int argc, char *argv[])
{



int x, y;
int dx,dy;
int G;
FILE *infile, *outfile;
int cols, lignes, format,thetadeg,rr;
gray maxval;
gray **table1, **table2, ;//two * to have a 2 dimension table **accumulateur
int k,e,d,max,p,q,retient,bidul,s,lala,a,b,acc,rint,tint,yint,A,B,rint2,lala2;
int m=0;
int j=0;
int i=0;
double rmax,r,theta,c;
double co,pi,thetaRad;
const int m_FacteurEtalement = 20000;







int **accumulateur2= new int*[m_FacteurEtalement];
for(lala=0;lala<m_FacteurEtalement;lala++) {
accumulateur2[lala] = new int[m_FacteurEtalement];

}


if (argc!=3) {
printf("Mauvais Nombres Arguments\n");
return 0 ;
}


// Reading of the file
pgm_init(&argc, argv);
infile = pm_openr(argv[1]);
pgm_readpgminit( infile, &cols, &lignes, &maxval, &format );//reading of the file called infile
table1 = new gray*[lignes];// reservation of an espace of the memory. the espace size is "rows"/
table2 = new gray*[lignes];


for (y = 0; y <lignes; y++) {//for each ligne y
table1[y] = pgm_allocrow (cols);// reservation of a memory space with the size of one column
table2[y] = pgm_allocrow (cols);

pgm_readpgmrow( infile, table1[y], cols, maxval, format);//read but also filed the new created space (grayrow) with the original image(whiwh is in the file infile)
}


rmax=floor( sqrt(lignes^2+cols^2)+1);



//INITIALISATION IMAGE2

for(y = 0; y < lignes; y++)
{
for(x = 0; x < cols; x++){

table2[y][x]=0;
}
}


//INITIALISATION ACCUMULATEUR

for(y = 0; y < m_FacteurEtalement; y++)
{
for(x = 0; x < m_FacteurEtalement; x++)
{
accumulateur2[y][x]=0;
}
}









//INCREMENTATION ACCUMULATEUR

for(x = 0; x < lignes; x++)
{

for(y = 0; y < cols; y++)//parcours de l'image1

{

if (table1[x][y]>60 )//si le pixel est blanc

{

for (thetadeg = 0; thetadeg <360; thetadeg++)

{
thetaRad=6.28*thetadeg/360;//conversion en radian
r=x*cos(thetaRad)+y*sin(thetaRad) ; // tracage des "lignes" dans l accumulateur
rint = static_cast(r); // j en fait un entier car je devrais l'utiliser comme indice de tableau
rint2=-rint;

if (-rint<m_FacteurEtalement && rint<0 )
{

accumulateur2[rint2][thetadeg]++;

}
}
}
}
}






//TRACAGE DE LIGNES DANS LA NOUVELLE IMAGE


for(rr = 0; rr < m_FacteurEtalement; rr++) //parcours de l accumulateur -------------> nombre pê a changer
{
for(thetadeg = 0; thetadeg < 360; thetadeg++)
{

if (accumulateur2[rr][thetadeg]>59) // --------------pê a changer

{
for(x = 0; x< lignes; x++) //parcours de l image2
{
thetaRad=6.28*thetadeg/360;
A=static_cast((cos(thetaRad))/sin(thetaRad));
B=static_cast(-rr/sin(thetaRad));

if (-A*x+B<cols && -A*x+B>0 && A!=0){
table2[x][-A*x+B]=255;
}

}

}
}

}






// Saving
outfile = pm_openw(argv[2]);
pgm_writepgminit( outfile, cols, lignes, maxval, 0 );
for (y = 0; y<lignes; y++){
pgm_writepgmrow(outfile, table2[y],cols, maxval, 0);
}




//release of space

for (y=0; y<lignes;y++){
pgm_freerow( table1[y] );
pgm_freerow( table2[y] );

}
free(table1);
free(table2);

pm_close( outfile );
pm_close( infile );




for(lala=0;lala<rmax;lala++){
delete accumulateur2[lala];
}
delete [] accumulateur2;




}

3 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
22 févr. 2010 à 14:52
Salut
J'ai pas le temps de regarder ton algo mais en voici un fonctionnel:

Détection de droite:
http://www.cppfrance.com/codes/TRANSFORMEE-HOUGH-DETECTION-DROITES_43381.aspx
et
http://www.cppfrance.com/codes/DETECTION-DROITES-DANS-IMAGE-HOUGH_43486.aspx

Détection de cercle:
http://www.cppfrance.com/codes/DETECTION-CERCLES-DANS-IMAGE-HOUGH_45729.aspx
A+

____________________________________________________________________________
Logiciel en traitement de l'image gratuit et open source.
0
Waouuu Messages postés 2 Date d'inscription lundi 22 février 2010 Statut Membre Dernière intervention 23 février 2010
23 févr. 2010 à 06:00
Merci beaucoup mais ca n est pas vraiment ca du tout ce que je demande. De plus je dois le faire en C, non en C++ que je connais encore moins...!
Si quelqu un a le temps de regarder mon code je vous en supplie!!!
Merci!
0
ccgousset Messages postés 150 Date d'inscription samedi 1 août 2009 Statut Membre Dernière intervention 4 mars 2023
2 mars 2011 à 17:11
Avec un an de retard je cherche a faire marcher hough mais en VB6. Par hasard aurai tu ton morceau de code fonctionnel. Si oui ca m'interesse. J'ai vu les code de pistolpate mais c'est le tien qui m'intereessse . Il pourrai tourner en small C . Si tu l'as operationnel donne le moi s'il te plait. En attendant je vais essayer de le faire fonctionner pour le transrire en VB6. Merci. J'ai publie une detection de cercle par algo bresenham si ta besoin. Christophe. ccgousset@gmail.com
0
Rejoignez-nous