Le voila : c vrai que ca fait bourrin mais je pense que l'erreur est toute conne enfin j'espere:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
struct image {unsigned char *p;int x; int y;int bpp;};
struct image* readpnm(FILE *f)
{struct image *pict;
char s[10],t[10],c;
long i;
fscanf(f,"%s",s); /* P5 */
/* printf("%c\n",s[0]); */
if (s[0]!='P') return(NULL);
c=fgetc(f); /* remove carriage return at end of P5 */
/* printf("%c\n",c); */
c=fgetc(f); /* 1st char of new line */
while (c=='#') { /* remove all lines starting with '#' */
if (c=='#') while (c!=10) /* remove 1 line from # to EOL=chr(10) */
{c=fgetc(f); /*printf("%c",c);*/ }
c=fgetc(f); /* 1st char of next line */
}
pict=(struct image*)malloc(sizeof(struct image));
fscanf(f,"%s",s);
sprintf(t,"%c%s",c,s);pict->x=atoi(t);
fscanf(f,"%s",s);pict->y=atoi(s);
fscanf(f,"%s",s);pict->bpp=atoi(s);
/* printf("%d %d %d\n",pict->x,pict->y,pict->bpp); */
pict->p=(unsigned char*)malloc(sizeof(unsigned char)*pict->y*pict->x);
for (i=0;i<pict->y*pict->x;i++) pict->p[i]=fgetc(f);
return(pict);
}
void writepnm(FILE *f,struct image *pict)
{long i;
fprintf(f,"P5\n%d %d\n%d\n",pict->x,pict->y,pict->bpp);
for (i=0;i<pict->y*pict->x;i++) fputc(pict->p[i],f);
fputc(pict->p[i],f); /* xv complains 'file truncated' otherwise */
}
struct image* houghline(struct image *pict)
{struct image *pictout;
long i=0;int psize,x,*tmpi,max;
float dtheta,theta,*smat,*cmat,tmp;
if (pict->y<pict->x) psize=pict->y; else psize=pict->x; /* square(min) */
dtheta=3.1415926535/(float)(psize);
smat=(float*)malloc(sizeof(float)*psize);
cmat=(float*)malloc(sizeof(float)*psize);
pictout=(struct image*)malloc(sizeof(struct image));
pictout->x=psize;pictout->y=psize;;pictout->bpp=255;
pictout->p=(unsigned char*)malloc(sizeof(unsigned char)*psize*psize);
tmpi=(int*)malloc(sizeof(int)*psize*psize);
for (i=0;i<psize*psize;i++) tmpi[i]=0;
i=0;
for (theta=0;theta<3.1415926535;theta+=dtheta)
{smat[i]=sin(theta);cmat[i]=cos(theta);i++;}
for (i=0;i<psize*psize;i++)
{if (pict->p[i] > (pict->bpp>>1) ) /* only look important points */
{/* printf("/ %ld - %ld i %ld\n",i/psize+1,i%psize,i); */
/* ^^^^^^ print interesting point ccords */
for (x=0;x<psize;x++) /* % : modulo = x */
{tmp=(float)(i/psize+1-(psize>>1))*smat[x]+
(float)(i%psize-(psize>>1))*cmat[x]+(float)(psize>>1);
/* tmp[] is h2 */
if (( (int)rint(tmp)<psize) &&
((int)rint(tmp)>0) )
tmpi[(int)rint(tmp)*psize+x]++;
}
}
}
for (i=0;i<psize*psize;i++) if (tmpi[i]>max) max=tmpi[i];
for (i=0;i<psize*psize;i++) pictout->p[i]=(tmpi[i]*255)/max;
return(pictout);
}
int main(int argv,char **argc)
{struct image *pict,*output;char filename[20];
FILE *f;
if (argv==1) {printf("pgm2hough [infile [outfile]]\n");
printf("filename ");scanf("%s",filename);}
else sprintf(filename,"%s",argc[1]);
f=fopen(filename,"r");if (f==NULL) exit(1);
pict=readpnm(f);
fclose(f);
output=houghline(pict);
if (argv>2) sprintf(filename,"%s",argc[2]);
else sprintf(filename,"%s.hough",argc[1]);
f=fopen(filename,"w");
writepnm(f,output);
fclose(f);
}
FLO