(Problème spécial) Compter le nombre de pixel différent entre deux images
cs_chuckboy
Messages postés64Date d'inscriptionvendredi 16 septembre 2005StatutMembreDernière intervention31 mars 2009
-
27 sept. 2005 à 20:31
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 2006
-
29 sept. 2005 à 09:00
Bonjour a tous ,
J'ai un petit probleme. Cette fonction vérifie pixel par pixel deux images et compte le nombre de pixel différent entre les deux , ca fonctionne sauf quand j'ai des images totalement différente mon programme crash. Ca crash sur l'incrémentation de ma variable j (compter le nombre de pixel différent) le plus étrange est que si je sors mon incrémentation en dehors de mon if (Pour tester les pixel) ca fonctionne (mais ca fais pas ce qu'il faut).
Bref j'suis un peu gourré , je ne sais pas trop d'ou vient mon problème.
thks
int ComptePixelDifferent(const std::string sFichierAbsolut1,const std::string sFichierAbsolut2)
{
BITMAPFILEHEADER bmfh1;
BITMAPFILEHEADER bmfh2;
int i;
int j=0;
FILE *image1;
FILE *image2;
//Ouverture des deux fichiers
image1=fopen(sFichierAbsolut1.c_str(),"r+b");
image2=fopen(sFichierAbsolut2.c_str(),"r+b");
//Boucle pour faire tout les pixel
for(i=1;i<bmfh1.bfSize-bmfh1.bfOffBits;i++)
{
if((pixel1[i]!=pixel2[i])||(pixel1[i+1]!=pixel2[i+1])||(pixel1[i+2]!=pixel2[i+2]))
{
j++; //C'EST LA LE PROBLEME
}
//j++; // SI JE METS CA ICI CA CRASH PAS , PKOI ???
i+=2;
}
printf("\n TOTO %i et %i",j,i);
//Ferme les deux fichiers
fclose(image1);
fclose(image2);
//Retour du nombre de pixel différent
return j;
}
A voir également:
(Problème spécial) Compter le nombre de pixel différent entre deux images
cs_chuckboy
Messages postés64Date d'inscriptionvendredi 16 septembre 2005StatutMembreDernière intervention31 mars 20091 27 sept. 2005 à 22:12
Non c'est pas ca puisqu'il fonctionne tres bien en dehors du if. Et j'ai la variable i qui est incrémenter encore plus rapidement qui est de type int et qui fonctionne.
Pour l'avoir tester aussi avec des variables de d'autre type je peut te dire que c'est pas ca !
Quelqun a une autre idée , c'est vraiment étrange ce truc. Je me demande ci c'est pas au niveau de la pile que je défonce mais pourtant je suis presque sur que le if ne change rien la dedans , c pas comme ci c'etais une fonction !
Vous n’avez pas trouvé la réponse que vous recherchez ?
ymca2003
Messages postés2070Date d'inscriptionmardi 22 avril 2003StatutMembreDernière intervention 3 juillet 20067 28 sept. 2005 à 12:42
A mon avis ça vient du fait que mis en dehors du if, le compilo optilmise et ne fait aucun test (vu qu'il n'y a pas de code).
Le crash vient surement d'un dépassement mémoire. vérifie que les 2 images ont la mêm taille (si bmfh1.bfSize et bmfh2.bfSize sont différents c'est le crash assuré).
tu peux aussi simplifier le for comme cela :
for(i=1;i<bmfh1.bfSize-bmfh1.bfOffBits;i+=3)
et virer le i+=2 à la fin.
Tiens je viens de voir un autre truc, i doit commencer à 0 et s'arrêter + tôt (bmfh1.bfSize-bmfh1.bfOffBits-2).
cs_chuckboy
Messages postés64Date d'inscriptionvendredi 16 septembre 2005StatutMembreDernière intervention31 mars 20091 28 sept. 2005 à 14:45
Bon ca avance mais ca plante toujour !!!
Tout d'abord faut savoir que ca va boucler environ 300 000 fois donc déja en partant ...
Le code suivant marche pas
//Cette fonction compte le nombre de pixel différent entre deux images recu en parametre
int ComptePixelDifferent(const std::string sFichierAbsolut1,const std::string sFichierAbsolut2)
{
BITMAPFILEHEADER bmfh1;
BITMAPFILEHEADER bmfh2;
int i;
FILE *image1;
FILE *image2;
//Ouverture des deux fichiers
image1=fopen(sFichierAbsolut1.c_str(),"r+b");
image2=fopen(sFichierAbsolut2.c_str(),"r+b");
//Boucle pour faire tout les pixel
for(i=1;i<bmfh1.bfSize-bmfh1.bfOffBits-2;i+=3)
{
if((pixel1[i]!=pixel2[i])||(pixel1[i+1]!=pixel2[i+1])||(pixel1[i+2]!=pixel2[i+2]))
{
printf("\nT");
}
}
//Ferme les deux fichiers
fclose(image1);
fclose(image2);
//Delete
delete pixel1;
delete pixel2;
//Retour du nombre de pixel différent
return 0;
}
Ce code marche mais fait pas ce qu'il faut
//Cette fonction compte le nombre de pixel différent entre deux images recu en parametre
int ComptePixelDifferent(const std::string sFichierAbsolut1,const std::string sFichierAbsolut2)
{
BITMAPFILEHEADER bmfh1;
BITMAPFILEHEADER bmfh2;
int i;
FILE *image1;
FILE *image2;
//Ouverture des deux fichiers
image1=fopen(sFichierAbsolut1.c_str(),"r+b");
image2=fopen(sFichierAbsolut2.c_str(),"r+b");
//Boucle pour faire tout les pixel
for(i=1;i<bmfh1.bfSize-bmfh1.bfOffBits-2;i+=3)
{
if((pixel1[i]!=pixel2[i])||(pixel1[i+1]!=pixel2[i+1])||(pixel1[i+2]!=pixel2[i+2]))
{
}
printf("\nT");
}
//Ferme les deux fichiers
fclose(image1);
fclose(image2);
//Delete
delete pixel1;
delete pixel2;
//Retour du nombre de pixel différent
return 0;
}
Si on remarque bien , la seul différence est que le printf est en dehors du if...
Comme ça si le fichier 2<fichier 1 en taille ben ça plante pas
-ta variable pixel n'a pas un nom aproprié, il te faudrait l'appeler byte ou char car un pixel = 3 char...
-Tu es un peu méchant dans les allocs mémoire, tu ouvre tout le fichier
en mémoire pense a ceux qui ont des images de 10 Mo et qui on que 128
de ram sous xp, je te dis pas comme ça va rammer, essais de plus
réfléchir a l'avance avant de te lancer dans le codage (j'ai eu le meme
prob, ça c'est une approche de basic, c'est du c la ...)
-Met printf("T\n"); ça changeras rien a l'affichage mais ça evitera pas mal d'erreur de compréhension de la part du compilo.
cs_chuckboy
Messages postés64Date d'inscriptionvendredi 16 septembre 2005StatutMembreDernière intervention31 mars 20091 28 sept. 2005 à 17:59
Merci à tous , j'ai résolut mon problème c'etait con un peu finalement.
C'etait simplement dans mon if qui avait un probleme , je defoncait mon tableau de pixel
Quand j'enlevait mon implémentation , le compilateur (merci a toi %$%$) enlevait mon if (y etait vide) donc j'avais aucune erreur.
Bon maintenant je peut tester mes 2000 images pour comparer le lightning entre 2 version de drivers !
Voici mon code
//Cette fonction compte le nombre de pixel différent entre deux images recu en parametre
int ComptePixelDifferent(const std::string sFichierAbsolut1,const std::string sFichierAbsolut2)
{
BITMAPFILEHEADER bmfh1;
BITMAPFILEHEADER bmfh2;
int i;
int j=0;
FILE *image1;
FILE *image2;
//Ouverture des deux fichiers
image1=fopen(sFichierAbsolut1.c_str(),"r+b");
image2=fopen(sFichierAbsolut2.c_str(),"r+b");
pixel1 = new unsigned char [bmfh1.bfSize];
pixel2 = new unsigned char [bmfh2.bfSize];
//Lecture et stockage de l'image dans la variable pixel
fread(pixel1,1,bmfh1.bfSize,image1);
fread(pixel2,1,bmfh2.bfSize,image2);
//Si c'est le cas , les deux images sont completement différente
if((bmfh1.bfSize!=bmfh2.bfSize)&&(bmfh1.bfOffBits!=bmfh2.bfOffBits))
{
return -1;
}
else
{
//Parce que la définition des pixel commence a 40 (avant c'est l'entete)
i=40;
//Boucle pour faire tout les pixel
while(i<=(bmfh1.bfSize))
{
if((pixel1[i]!=pixel2[i])||(pixel1[i+1]!=pixel2[i+1])||(pixel1[i+2]!=pixel2[i+2]))
{
j++;
}
i+=3;
}
}
//Ferme les deux fichiers
fclose(image1);
fclose(image2);
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 28 sept. 2005 à 19:09
oui ;-) mais mieux vaut preciser explicitemet, et 2eme raison c'est que le jpg est pas du tout codé comme le bmp donc ce ne serait un pixel changeant mais 3 octets...
MuPuF
Messages postés536Date d'inscriptionmercredi 27 avril 2005StatutMembreDernière intervention22 août 2008 28 sept. 2005 à 19:20
erreur de frappe j'ai oublié le pas :
oui ;-) mais mieux vaut preciser explicitemet, et 2eme raison c'est que le jpg est pas du tout codé comme le bmp donc ce ne serait pas un pixel changeant mais 3 octets...
Le bmp : a 3 char --> un pixel (un unsigned short int pour chaque couleur (rouge, vert et bleu))