begin process at 2010 02 10 00:07:58
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Segmentation Fault....en traitement d'image


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Segmentation Fault....en traitement d'image

vendredi 2 avril 2004 à 22:05:12 | Segmentation Fault....en traitement d'image

psysta

Bonjour,
je suis nouveau dans la programmation en C. J'ai un programme Matlab qui marche bien, et je souhaiterais l'implémenter en C. Le pgm compile bien, mais me sort un "segmentation fault" à l'exécution. Le pgm doit prendre une image en RAW data en entrée, lui appliquer un algo de tri, puis en ressortir une image modifiée, toujours en RAW.
Il doit y avoir un pb de pointeurs...mais où? Si vous pouviez m'aider, ca serait vraiment inespéré!
Merci par avance.
Psysta
@mail

PS: le pgm a l'air long, mais en grande partie à cause des déclarations et initialisations.
----------------------------------------------------------------------
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define INT_TYPE unsigned int
#define IMAGE_TYPE unsigned char
#define DOUBLE_TYPE double

void fatal(s)
char *s;
{
printf("\n%s\n",s);
exit(-1);
}

FILE *fichier, *ouput;

IMAGE_TYPE **image, **newImage;

DOUBLE_TYPE *sumClustCol;

INT_TYPE *averageRowDist, *averageColDist, *averageCol, *colCent, *rowCent, *columnCent,
*whichColCent, **whichCent, **rowDistance, **columnDistance, *sumRowDistance,
*sumColDistance, *pixelsInClust, *colorOfCent;

int numClustCent=10, NBC=256, NBL=256;
int i, j, A, Q, O, P, I, J, k, K, N, M, R, S, X, Z, m1, m2, H, p=1,
whichColor,
currentRow,
currentColumn,
rowDist,
columnDist,
clustCent,
colCentOrder,
centerBelong;

double whichDistCent, totalDist;
long int taille;

main()
{ /* Entry variables */
averageRowDist = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));
averageColDist = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));
averageCol = (unsigned int*)calloc(numClustCent,sizeof(unsigned int));

for(i=0;i<numClustCent;i++)
{averageRowDist[i]=0;}
for(i=0;i<numClustCent;i++)
{averageColDist[i]=0;}
for(i=0;i<numClustCent;i++)
{averageCol[i]=0;}

colorOfCent = (unsigned int*)calloc(numClustCent,sizeof(unsigned int));
colCent = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));
rowCent = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));
columnCent = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));
whichColCent = (unsigned int*)calloc(numClustCent, sizeof(unsigned int));

whichCent = (unsigned int**)calloc(NBC, sizeof(unsigned int));
for (i=0;i<NBL;i++)
{ whichCent[i] = (unsigned int*)calloc(NBC,sizeof(unsigned int));}

rowDistance = (unsigned int**)calloc(NBC, sizeof(unsigned int));
for (i=0;i<NBL;i++)
{ rowDistance[i] = (unsigned int*)calloc(NBC,sizeof(unsigned int));}

columnDistance = (unsigned int**)calloc(NBC, sizeof(unsigned int));
for (i=0;i<NBL;i++)
{ columnDistance[i] = (unsigned int*)calloc(NBC,sizeof(unsigned int));}


/* Reading of the image file */

if((fichier=fopen("lenna.dat","rb"))==NULL)
{fatal("Can't open input file");}

fseek(fichier,0,SEEK_END);
taille = ftell(fichier);
fseek(fichier,0,SEEK_SET);
image = (unsigned char**)calloc(NBC,sizeof(unsigned char));
for (i=0;i<NBL;i++)
{ image[i] = (unsigned char*)calloc(NBC,sizeof(unsigned char));}

fread(image[i][j],1,taille,fichier);
fclose(fichier);

newImage = (unsigned char**)calloc(NBC,sizeof(unsigned char));
for (i=0;i<NBL;i++)
{ newImage[i] = (unsigned char*)calloc(NBC,sizeof(unsigned char));}

/* start of Kmean algorithm */
m1 = floor((double)NBL/numClustCent);
m2 = floor((double)NBC/numClustCent);

/* see where to put cluster centers initially */
for(H=0;H<numClustCent;H++)
{ rowCent[H]= floor(((double)H-1.0)*m1+m1/2.0);
columnCent[H] = floor(((double)H-1.0)*m2+m2/2.0);
colorOfCent[H] = (double)(image[rowCent[H]][columnCent[H]]);
}


do
{
if(p>1)
{
colorOfCent = averageCol;
rowCent = averageRowDist;
columnCent = averageColDist;
}
/* compare pixels by color and distance to determine what is cluster center for
it */
for(I=0;I<NBL;I++)
{
for(J=0;J<NBC;J++)
{
currentRow = I;
currentColumn = J;

/* compare with cluster centers */
for(K=0;K<numClustCent;K++)
{
/* compare with cluster centers for color */
clustCent = colorOfCent[K];
whichColor = abs((int)image[I][J]-clustCent);
colCent[K] = whichColor;

/* see if color centers are within treshold range */
if (whichColor>=30)
{whichColCent[K]=0;}
else {whichColCent[K]=1;}

/* list best color center */
if(K==1)
{colCentOrder=K;}
else if(colCent[K]<=colCent[colCentOrder])
{colCentOrder=K;}
}
colCentOrder=colCentOrder;

whichDistCent = sqrt(pow((double)NBL,2.0)+pow((double)NBC,2.0))+1.0;

/* compare with cluster center for distance */
for(M=0;M<numClustCent;M++)
{
/* check to see if something is within color threshold */
/* if not, then choose the closest color as cluster center */
for(k=0;k<numClustCent;k++)
{
if(whichColCent[k]!=0)
{N=1;}
else {N=0;}
}

if(N==1 || whichColCent[M]==1)
{
rowDist = abs(I-rowCent[M]);
columnDist = abs(J-columnCent[M]);
totalDist = sqrt(pow((double)rowDist,2.0)+pow((double)columnDist,2.0));
if(totalDist<=whichDistCent)
{
whichDistCent = totalDist;
whichCent[I][J] = M;
rowDistance[I][J] = rowDist;
columnDistance[I][J] = columnDist;
}
}
}
}
}
whichCent = whichCent;

/* replace cluster centers with the mean of the elements in their cluster */

/* initialization of data */
sumClustCol = (double*)calloc(numClustCent, sizeof(double));
sumRowDistance = (unsigned int*)calloc(numClustCent, sizeof(int));
sumColDistance = (unsigned int*)calloc(numClustCent, sizeof(int));
pixelsInClust = (unsigned int*)calloc(numClustCent, sizeof(int));

for(i=0;i<numClustCent;i++)
{sumClustCol[i]=0;}
for(i=0;i<numClustCent;i++)
{sumRowDistance[i]=0;}
for(i=0;i<numClustCent;i++)
{sumColDistance[i]=0;}
for(i=0;i<numClustCent;i++)
{pixelsInClust[i]=0;}


for(O=0;O<NBL;O++)
{ for(P=0;P<NBC;P++)
{ A = whichCent[O][P];
pixelsInClust[A] = pixelsInClust[A]+1;
sumClustCol[A] = sumClustCol[A]+(double)image[O][P];
sumRowDistance[A] = sumRowDistance[A]+rowDistance[O][P];
sumColDistance[A] = sumColDistance[A]+columnDistance[O][P];
}
}

for(i=0;i<numClustCent;i++)
{averageRowDist[i]=0;}
for(i=0;i<numClustCent;i++)
{averageColDist[i]=0;}
for(i=0;i<numClustCent;i++)
{averageCol[i]=0;}

for(Q=0;Q<numClustCent;Q++)
{ averageCol[Q] = (unsigned int)ceil(sumClustCol[Q]/(double)pixelsInClust[Q]);
averageColDist[Q] = (unsigned int)ceil(sumRowDistance[Q]/(double)pixelsInClust[Q]);
averageRowDist[Q] = (unsigned int)ceil(sumColDistance[Q]/(double)pixelsInClust[Q]);
}

p=p+1;

}while(rowCent!=averageRowDist && columnCent!=averageColDist &&
colorOfCent!=averageCol);

/* set all pixels that belong to a cluster to different colors */
for(R=0;R<NBL;R++)
{ for(S=0;S<NBL;S++)
{ centerBelong = whichCent[R][S];
newImage[R][S] = colorOfCent[centerBelong]*40;
}
}

/* output file generated */
ouput = fopen("sortie_kmean","wb");

if(ouput == NULL)
{ fatal("ouput file error");}
else {printf("fichier de sortie cree avec succes.");}

for(Z=0;Z<NBL;Z++)
{ for(X=0;X<NBC;X++)
{ fwrite(&newImage[Z][X],1,1,ouput);}
}
fclose(ouput);

}
mardi 6 avril 2004 à 09:01:12 | Re : Segmentation Fault....en traitement d'image

progqt

Le source est effectivement un peu long pour trouver ce qui ne va pas en le lisant. Voici néanmoins quelques techniques pour trouver la source du problème. Puisque tu fais référence à un "segmentation fault" je pense que tu es sans doute sous Linux ou Unix.
Afin de trouver l'endroit du programme qui "plante", le mieux est d'utiliser un debogeur tel que gdb. Donc tu lances dans un terminal : gdb nomprog
gdb va charger ton programme qu'il faut ensuite lancer par run.
Le programme va fonctionner normalement et s'arrêter lorsqu'il va planter. En tapant where, gdb va t'indiquer l'endroit et la cause du plantage.
PS : Il faut compiler le programme avec des options de debogage. Pour ce faire il faut rajouter -g dans les optiions du compilateur et du linkeur.

webmestre du site français dédié à la programmation QT.
http://prog.qt.free.fr
mardi 6 avril 2004 à 23:55:38 | Re : Segmentation Fault....en traitement d'image

psysta

Merci de ton aide. Je vais peut-être trouver la solution grâce à toi.
Je travaille effectivement sous Unix, Solaris. L'erreur provient du 1er fread.... je vais essayer de trouver ca. par contre, ayant repris les travaux de qqun, j'utilise gcc et gmake, au lieu de cc et make. Puis je modifier le compilateur et linkeur de même?
merci d'avance

Psysta
mercredi 7 avril 2004 à 00:57:13 | Re : Segmentation Fault....en traitement d'image

psysta

au fait, en utilisant gdb, je tape run, puis where, mais il me donne comme réponse:
#0 0x11b98 in main()

Qu'est ce que ca veut dire??

Psysta
mercredi 7 avril 2004 à 12:00:39 | Re : Segmentation Fault....en traitement d'image

progqt

Pour avoir accès au debogage de ton programme, il faut utiliser -g comme option de compilation :
gcc -g -o monprog monsource.c
va générer un exécutable nommé monprog en compilant monsource.c et en incluant dans l'exe ce qui est nécessaire pour degoguer.
Ensuite avec : gdb monprog, run puis where après le plantage tu devrais avoir plus de détails.
Pour remplacer cc par gcc, il faut je pense dans ton Makefile simplement changer chaque occurence de cc par gcc.

webmestre du site français dédié à la programmation QT.
http://prog.qt.free.fr
mercredi 7 avril 2004 à 22:01:50 | Re : Segmentation Fault....en traitement d'image

psysta

Le debogeur fonctionne bien, mais je n'arrive pas a comprendre ce qu'il me dit...
il me donne comme réponse:
#0 0x11b98 in main()
comment puis je retrouver la ligne exact de l'erreur dans mon code?

Psysta
mercredi 7 avril 2004 à 23:37:20 | Re : Segmentation Fault....en traitement d'image

progqt

gdb te donne #0 0x11b98 in main() sans plus de détail car tu n'a pas inclus les options de déboguage lors de la compilation.
Voici un petit exemple :
// toto.c
#include <stdio.h>

void f();

void main()
{
f();
}

void f()
{
int j;
int *i[100];
for(j=0; j<100; j++)
*i[j] = 12000;
}

Si je compile sans instruction de déboguage :
gcc -o toto toto.c
puis gdb toto
run
j'obtiens "Program received signal SIGSEGV, Segmentation fault."
0x080483365 in f ()
Gdb connait l'adresse du plantage mais ne peut afficher la ligne en cause.

Si je compile avec les instructions de déboguage :
gcc -g -o toto toto.c
puis gdb toto
run
j'obtiens "Program received signal SIGSEGV, Segmentation fault."
0x080483365 in f () at toto.c:15
15 *i[j] = 12000;
ici j'ai maintenant le ligne en cause.

Pour plus de renseignement concernant le débogage avec gdb, vas jeter un oeil à : http://www.linux-france.org/article/memo/node119.html

webmestre du site français dédié à la programmation QT.
http://prog.qt.free.fr
vendredi 9 avril 2004 à 22:11:44 | Re : Segmentation Fault....en traitement d'image

psysta

ok. je ne sais pas pourquoi, mais malgre tout (options du deboggeur mises), il ne veut pas m'affciher les lignes. Ce n'est pas grave, j'ai palie ce probleme en ecrivant un printf de la ligne.J'ai reussi a faire fonctionner le pgm. Merci beaucoup pour ton aide.
8D]

Psysta
vendredi 9 avril 2004 à 22:13:57 | Re : Segmentation Fault....en traitement d'image

progqt

De rien , toujours prêt à rendre service. Au plaisir.

webmestre du site français dédié à la programmation QT.
http://prog.qt.free.fr
jeudi 10 mars 2005 à 19:41:33 | Re : Segmentation Fault....en traitement d'image

zamourse

comment je fais pour prendre la librairie de pandore


Cette discussion est classée dans : int, for, double, unsigned, numclustcent


Répondre à ce message

Sujets en rapport avec ce message

class matrice [ par flaky ] Slt à tousJ'utilise une classe "matrice" (celle de nicolas aunai, téléchargée sur le site) qui fonctionne très bien. Mais j'ai du mal à manipuler l'ob allocation dynamique [ par CeNedra83 ] je code en C++ en je ne comprend pas un truc: ma fonction marchait très bien et maintenant elle se met à planter une fois sur 2 pour cause d'allocatio algorithmique de fonction rec [ par fs_fck_sarko ] bonjour tout le monde, est ce que quelquun pourai maider pour le calul de complexite d'un programme qui resout les sudoku ? En fait je voudrais trouve Problème en tête bitmap [ par piroman14 ] Slt tt le monde!Je rencontre un petit problème dans mon algorithme. En effet, je n'arrive pas à coder l'en-tête d'une image bitmap correctement. J'obt matrice de caractere en c [ par flofloo ] slt tout le monde voici mon probleme : char **Init_Matrice_IrcMSG(int ligne,int colone){     char **mat = NULL;     int i;     mat = problème d'édition des liens avec code::blocks [ par walidoss1 ] Salut tout le monde !  je suis nouveau ici et j'espère trouver de l'aide :) alors je suis entrain d'implémenter l'a remplir aléatoirement une matrice binaire dynamique [ par amani20081984 ] bonjour, je veux bien remplir une matrice de structure dynamique d'une manière aléatoire par des valeurs 0 et 1 en utilisant la fonction rand(),voicii random et printf avec for :( [ par sokotanic ] salutj'ai besoin d'aide#include #include #include //Abdou chez les Almohadesusing namespace std;int main(){    srand(time(NULL));int j,i;i code ascii [ par tasken2 ] bonjour à tous  et merci d'avoir cliquez sur moi .Alors voila j'ai un probleme pour récuperer la valeur du code ascii dun caractere speciaux mais le r Projet en C++ [ par Hugo Dam ] Bonjour, Il se trouve que j'ai un projet en C++ et je suis complètement bloqué. Au moment de la compilation j'ai énormément d'erreur. Voici le sujet ;


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,499 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales