begin process at 2012 05 29 22:16:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

(Problème spécial) Compter le nombre de pixel différent entre deux images


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

(Problème spécial) Compter le nombre de pixel différent entre deux images

mardi 27 septembre 2005 à 20:31:19 | (Problème spécial) Compter le nombre de pixel différent entre deux images

chuckboy

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");

 fseek(image1, SEEK_SET, 0) ;
 fseek(image2, SEEK_SET, 0) ;

 fread(&bmfh1, sizeof(bmfh1), 1, image1) ;
 fread(&bmfh2, sizeof(bmfh2), 1, image2) ;

 unsigned char* pixel1;
 unsigned char* pixel2;

 pixel1 = new unsigned char [bmfh1.bfSize];
 pixel2 = new unsigned char [bmfh2.bfSize];

 fread(pixel1,1,bmfh1.bfSize,image1);
 fread(pixel2,1,bmfh2.bfSize,image2);

 //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;
}

mardi 27 septembre 2005 à 21:35:07 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

poppyto

Membre Club Administrateur CodeS-SourceS
A vu d'oeil et vu mon état de fatigue, je sais pas  par contre t'as oublié les delete [] mon cochon  !

Poppyto
http://www.poppyto.net
 LE site pour les bassistes
http://blogs.developpeur.org/Poppyto Mon Blog sur C#
mardi 27 septembre 2005 à 21:39:34 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

chuckboy

Ouais je sais pour les delete , mais c'est pas de la que vient mon probleme !!

Si quelqu'un a une bonne idée la dessus , qu'il ne se gène pas !!!
mardi 27 septembre 2005 à 22:06:57 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

MoDDiB

Dépassement de capacité du int ?
mardi 27 septembre 2005 à 22:12:25 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

chuckboy

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 !
mercredi 28 septembre 2005 à 12:42:32 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

ymca2003

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).
mercredi 28 septembre 2005 à 14:45:12 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

chuckboy

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");

 fseek(image1, SEEK_SET, 0) ;
 fseek(image2, SEEK_SET, 0) ;

 fread(&bmfh1, sizeof(bmfh1), 1, image1) ;
 fread(&bmfh2, sizeof(bmfh2), 1, image2) ;

 unsigned char* pixel1;
 unsigned char* pixel2;

 pixel1 = new unsigned char [bmfh1.bfSize];
 pixel2 = new unsigned char [bmfh2.bfSize];

 fread(pixel1,1,bmfh1.bfSize,image1);
 fread(pixel2,1,bmfh2.bfSize,image2);

 //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");

 fseek(image1, SEEK_SET, 0) ;
 fseek(image2, SEEK_SET, 0) ;

 fread(&bmfh1, sizeof(bmfh1), 1, image1) ;
 fread(&bmfh2, sizeof(bmfh2), 1, image2) ;

 unsigned char* pixel1;
 unsigned char* pixel2;

 pixel1 = new unsigned char [bmfh1.bfSize];
 pixel2 = new unsigned char [bmfh2.bfSize];

 fread(pixel1,1,bmfh1.bfSize,image1);
 fread(pixel2,1,bmfh2.bfSize,image2);

 //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...

mercredi 28 septembre 2005 à 17:40:29 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

MuPuF

Bjour, bon :
-Laisse pas le int, met du long, le int c'est de -65535 a +65536. Donc met le en unsigned long (unisgned car le nb de pixels ne peux etre négatif).

- fseek(image1, SEEK_SET, 0) ; inutile quand on ouvre un fichier il commence au debut.

-fopen, met direct rb et pas r+b dans le mode d'ouverture.

-Tu devrais rajouter ça comme condition dans ta for
 for(i=1;i<bmfh1.bfSize-bmfh1.bfOffBits-2 && i<bmfh2.bfSize-bmfh2.bfOffBits-2 ;i+=3)
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.

-Si marche tjs pas alors reposte
sinon
dis nous quand meme que ça marche



mercredi 28 septembre 2005 à 17:49:51 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

ymca2003

La taille d'un int est dépendant de la plateforme. 16 bits pour Win16, 32 bits pour Win32.

Pour moi, i doit commencer à 0.
mercredi 28 septembre 2005 à 17:59:02 | Re : (Problème spécial) Compter le nombre de pixel différent entre deux images

chuckboy

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");

 fseek(image1, SEEK_SET, 0) ;
 fseek(image2, SEEK_SET, 0) ;

 fread(&bmfh1, sizeof(bmfh1), 1, image1) ;
 fread(&bmfh2, sizeof(bmfh2), 1, image2) ;

 unsigned char* pixel1;
 unsigned char* pixel2;

 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);

 //Delete
 delete pixel1;
 delete pixel2;

 //Retour du nombre de pixel différent
 return j;
}


1 2

Cette discussion est classée dans : pixel, image1, image2, pixel1, pixel2


Répondre à ce message

Sujets en rapport avec ce message

Probleme utilisation fwrite sur un fichier partager réseau. [ par chuckboy ] Voila j'ai une fonction qui doit prendre deux images , les comparer et creer une image delta pour cibler les différence entre les deux images. Mon pro Recuperer la Couleur d'un Pixel dans une fenetre. [ par nomlingote ] Bonjour à tous, Est il possible de connaitre la couleur d'un pixel dans une fenetre (dont on connait le handle ) ou sur l'ensemble de l'ecran. J'ai es Bit par pixel [ par vangeurmasker ] Je cherche une fonction qui permette de me retourner le nombre de bit par pixel actuellement utilisé par windows (nombre de couleurs). Le but est de c Pixel->centimetres??? [ par tibob51 ] <TD id=HB_Focus_Element vAlign=top width="100%" background="" height=250 UNSELECTAB aide Je veux ecrire un pixel sur la console [ par gamemonde ] Salut. je sais plusieur l'on posé cette question mais personne avais vraiment de solution j'utilise visual studio 2003 .net et je suis sur le mode con pixel et RGB d'une image en C [ par gibbon ] Bonjour,je voudrai récupérer les composantes RGB d'un pixel d'une image jpg en langage C.Pouvez vous m'aider s'il vous plait.Merci d'avance affichage d'un pixel [ par giom236 ] Bonjour, voilà une petite question toute con. J'aimerai dessiner sur une form, et j'ai besoin d'afficher un pixel en connaissant ses coordonnées. A ma Accéder aux pixels d'une image [ par bikini42 ] Bonjour, je vous écris car j'ai un souci! J'utilise une classe CPicture pour gérer mes images et je voudrais pouvoir accéder à chaque pixel pour pouvo probleme avec la recuperation de la couleur d'un pixel [ par Alucards ] salut , voila j'ai un loader de texture bmp/tga/pcx/jpg qui fonctionne nikel. j'arrive a charger mes textures et les afficher. une fois charger elles affichage 3D MFC [ par gestual ] bonjour j'ai pour projet de realiser un rendu 3D avec MFC et seulement MFC (pas d'openGL) et je sais faire l'ouverture de fichier la projection les om


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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 : 7,020 sec (3)

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