Ho un problema che non so come risolvere di segmentation...
il mio programma apre un immagine jpg con quattro uova, cerco i pixel con i valori rgb corrispondenti a queste uova, e disegno su di esse un quadrato da 150 pixel introducendo una tolleranza in caso che non prendo esattamente tutti i pixel delle uova... ma non capisco per quale motivo mi da un errore si segmentation... qualcuno di voi mi può aiutare ?
grazie in anticipo
Questo é il mio programma
#include <stdio.h>
#include "image.h"
#include <stdlib.h>
int main(int argc, char * argv[]) {
// Le nom du fichier à lire
char * fichier = "/Users/dax/Desktop/detection-mac/763.jpg";
// Lire l'image
struct Image image;
char * erreur = image_read(&image, fichier);
if (erreur != NULL)
{
printf("Impossible de lire %s: %s\n", fichier, erreur);
return 1;
}
//definisco variabili per cicli for
int k;
int x;
int y;
// definisco la struttura
struct Uovo {
int flag;
int countX;
int x1;
int y1;
};
// dichiarazione variabili
struct Uovo uova [4];
for (k=0; k<4; k++)
{
uova[k].flag=0;
}
struct Uovo vario;
vario.flag=0;
vario.countX=0;
//trova le uova
int i;
int a;
int tolleranza;
int esci=0;
for(a=0; a<4; a++)
{
//trovo una riga orrizzontale di 150 pixel color uovo
for ( y = 0; y < image.heightInPixels; y++) //ciclo sulle y
{
for ( x = 0; x < image.widthInPixels; x++) //ciclo sulle x
{
i = y * image.widthInPixels + x;
if ((abs(image.pixels.r - 70) < 30 && abs(image.pixels.g - 40) < 25 && abs(image.pixels.b - 25) < 20) ||
(abs(image.pixels.r - 50) < 20 && abs(image.pixels.g - 10) < 10 && abs(image.pixels.b - 10) < 10)) //Se il pixel è colorato
{
if (vario.countX == 0) //se è il primo pixel colorato
{
vario.x1 = x;
vario.y1 = y;
tolleranza=0;
}
vario.countX++;
}
else //se il pixel NON è colorato
{
if (vario.countX>0)
{
tolleranza++;
vario.countX++;
}
if (tolleranza>30)
{
if (vario.countX < 150)
{
vario.countX = 0;
}
else
{
uova[a].x1=vario.x1;
uova[a].y1=vario.y1;
uova[a].flag=1;
esci=1;
break;
}
}
}
}
if (esci==1)
break;
}
//verificare che sia vero uovo e colorare di blu
tolleranza=0;
for ( y = uova[a].y1; y<=uova[a].y1+200; y++)
{
for( x = uova[a].x1; x<=uova[a].x1+200; x++)
{
i = y * image.widthInPixels + x;
if ((abs(image.pixels.r - 70) < 30 && abs(image.pixels.g - 40) < 25 && abs(image.pixels.b - 25) < 20)||
(abs(image.pixels.r - 50) < 20 && abs(image.pixels[i].g - 10) < 10 && abs(image.pixels[i].b - 10) < 10))
{}
else
{
tolleranza++;
}
// Rendre le pixel blu
image.pixels[i].r = 190;
image.pixels[i].g = 0;
image.pixels[i].b = 0;
}
}
printf("tolleranza %d\n", tolleranza);
vario.countX = 0;
/*if (tolleranza<1000)
{
printf("la bandiera è %d\n", uova[a].flag);
a++;
}
else
{
uova[a].x1=0;
uova[a].y1=0;
uova[a].flag=0;
}*/
}
// Ecrire l'image (avec les pixels modifiés)
image_write_to_png(&image, "/Users/dax/Desktop/detection-mac/763-modifie.png");
// Libérer la mémoire occupée par l'image
image_free(&image);
return 0;
}