Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1454 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [ C ] Reconstitution d'une image

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[ C ] Reconstitution d'une image

n°1481167
Alpha002
Posté le 24-11-2006 à 10:33:33  profilanswer
 

Bonjour, le but de ce programme est de reconstituer une image découpée en 512 bandellettes (shred). Il faut effectuer un "tri" d'une liste (inputList),  de manière à obtenir la meilleure image possible (dans la liste pliste_finale).
Le programme utilise buildPicture.pl pour reconstituer cette image.
je sollicite votre aide, car la fonction du main se compile, mais ne s'execute pas lors du lancement de buildPicture.pl. Pouvez-vous m'éclairer svp.
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
 
// usage :
// ./reverseShredderBasics_color  < fileList.txt  
// or
// ls shred*.txt | ./reverseShredderBasics_color
//then use buildPicture.pl to actualy create output picture
 
//////// useful string functions
void chop(char *str) {
 int l = strlen(str)-1;
 if ((l>=0)&&(str[l]=='\n'))
  str[l]='\0';
}
//////////
 
typedef struct {
 int size;
 int *r;
 int *g;
 int *b;
} vector;
 
 
///////// vector functions  
 
vector *vectorAllocate (int size) {
 vector *v;
 if ((v=(vector*)malloc(sizeof(vector)))==NULL)
  exit(12);
 if ((v->r = (int*)malloc(sizeof(int)*size))==NULL) {
  exit(12);
 }
 if ((v->g = (int*)malloc(sizeof(int)*size))==NULL) {
  exit(12);
 }
 if ((v->b = (int*)malloc(sizeof(int)*size))==NULL) {
  exit(12);
 }
 v->size = size;
 return v;
}
 
void vectorDestroy(vector *v) {
 free(v->r);
 free(v->g);
 free(v->b);
    free(v);
}
 
float vectorDistance(vector *v1, vector *v2) {
 float s=0;
 int i;
 
 for(i=0;i<v1->size;i++) {
  s += fabs((float)(v1->r[i] - v2->r[i]));
  s += fabs((float)(v1->g[i] - v2->g[i]));
  s += fabs((float)(v1->b[i] - v2->b[i]));
 }
 s /= (float)v1->size;
 return s;
}
 
///////// end of vector functions
 
typedef struct {
 char id[1024];
 vector *left;
 vector *right;
} shred;
 
////////// shred functions
 
shred *shredAllocate(int size) {
 shred *s;
 if ((s = (shred*)malloc(sizeof(shred)))==NULL)
  exit(12);
 
 s->left = vectorAllocate(size);
 s->right = vectorAllocate(size);
 return s;
}
 
void shredDestroy(shred *s) {
 vectorDestroy(s->left);
 vectorDestroy(s->right);
}
 
float shredDistance(shred *s1, shred *s2) {
 return vectorDistance(s1->right,s2->left);
}
 
 
////////// end of shred functions
 
 
///////////// cell*
typedef struct cell_ {
        shred *elt;
        struct cell_ *next;
        struct cell_ *previous;
} cell;
 
cell* insertFirst(cell* l, shred *elt) { //insert at the beginin of the cell*
  cell *c;
  // allocation of cell
  c = (cell*)malloc(sizeof(cell));
  if (c == NULL)
    return NULL;
  c->elt = elt; // set value
  c->next = l;
  c->previous = NULL;
 if (l !=NULL)
        l->previous = c;
  return c;
}
 
cell* insertLast(cell* l, shred *elt) { // beware this function returns ptr to last elt !
  cell *c;
  // allocation of cell
  c = (cell*)malloc(sizeof(cell));
  if (c == NULL)
    return NULL;
  c->elt = elt; // set value
  c->previous = l;
  c->next = NULL;
  if (l!=NULL)
   l->next = c;
  return c;
}
 
 
cell* popFirst(cell* l) {
  cell *c;
 
  if (l==NULL)
          return NULL;
  c = l;
  l = l->next;
  if (l !=NULL)
   l->previous = NULL;
  free(c);
  return l;
}
 
cell* pop(cell* l,cell* c) { // pop cell c form cell* l  
  cell* tmp;
   
  if (c==NULL)
   return c;
  if (c->previous)
   c->previous->next = c->next;
  if (c->next)
   c->next->previous = c->previous;
  tmp = c->next;
  free(c);
  if (c==l) // pop first elt !
   return tmp;
  return l;
  }
   
int listSize(cell* l) {
 int i = 0;
 while(l != NULL) {
  i++;
  l = l->next;
 }
 return i;
}
 
void printList(cell* l) {
  while (l!=NULL) {
   printf("%s\n",l->elt->id);
 l = l->next;
  }
}
 
/////////////// end of cell* functions
 
 
 
 
/////////// main functions
 
cell* loadVectors() {
 FILE *inVector;
 char buffer[1024], filename[1024];
 cell *l=NULL;
 cell *first;
 int i, firstOne;
 shred *s;
 
 firstOne = 1;
 while (fgets(filename,1024,stdin)) {
  chop(filename);
  //printf("reading vector file : %s\n",filename);
  if ((inVector = fopen(filename,"r" ))==NULL)
   exit(12);
  fgets(buffer,1024,inVector);
  i = 0;
  /*while (!(buffer[i]>'0' && buffer[i] < '9'))
   i++;
  i = atoi(buffer+i);*/
  sscanf(buffer,"shred length %d\n",&i);
  s = shredAllocate(i);
  strcpy(s->id,filename);
  i  = 0;
  while (fgets(buffer,1024,inVector)) {
   sscanf(buffer,"%i %i %i %i %i %i\n", &(s->left->r[i]),&(s->left->g[i]),&(s->left->b[i]),&(s->right->r[i]),&(s->right->g[i]),&(s->right->b[i]));
   i++;
  }
  fclose(inVector);
  l = insertLast(l,s);
  if (firstOne)  
   first = l;
  firstOne = 0;
 }
 return first;
}
 
 
int main(int argc,char **argv) {
 cell* inputList = NULL;
 //printf("coucou" );
 inputList = loadVectors(); // use stdin
 
 //printf("coucou2" );
   
    float distance;
    float distance_comparaison_droite=9999;
    float distance_comparaison_droite_liste_finale;
    float distance_comparaison_gauche;
    cell * minD;
   
    //declaration et initialisation de la liste finale
    cell * pliste_finale;
    pliste_finale=NULL;
    pliste_finale=insertFirst(pliste_finale,inputList->elt);
    inputList=popFirst(inputList);
     
//creation de pointeur pour se deplacer dans les listes
    cell *paux;
    cell *paux2;  
    cell *paux3;
 int temp = listSize(pliste_finale);
 printf("%d",temp);
   
 while(listSize(inputList)!=0)    
    {
     
  printf("je rentre dans la bouvle1" );
  paux=inputList;
       
         
         paux2=pliste_finale;
 
      //j'ai pris un elt de inputList et je calcule la distance minimale avec les shreds de la liste finale.
      //je mémorise l adresse du shred correspondant
    int i=0;
 
 
      while(pliste_finale->next!=NULL)
      {
                                                     
                          distance=shredDistance(paux->elt,paux2->elt);
                           
                          if(distance<distance_comparaison_droite_liste_finale)
                          {
                              minD=paux2;
                              distance_comparaison_droite_liste_finale=distance;
                                                             
                          }
                           
                           paux2=paux2->next;
     
      }
                           
      //pour ce shred je regarde si je place le shred de la inputList a droite ou a gauche                            
                           
      distance_comparaison_gauche = shredDistance( minD->elt,paux2->elt);                      
   
      if(distance_comparaison_gauche<distance_comparaison_droite)
      {
  paux3=paux2;
         paux2=insertFirst(paux2,minD->elt);
  paux2->previous=paux3;
         
  //si on ajoute a gauche du premier elt on place paux2 dans pliste_finale  
         if(paux2==pliste_finale)
         {
           pliste_finale=paux2;
         }
      }
      else
      {
 paux3=paux2;
 paux2=paux2->next;
 
        paux2=insertFirst(paux2,minD->elt);
 paux2->previous=paux3;
      }  
                           
      paux=paux->next;
 inputList=popFirst(inputList);
}
 ///////////////////////////////
 // exemple of code comparing the 2 firsts shreds :
 //  
 // float dist = shredDistance(inputList->elt,inputList->next->elt);
 //
 
 printList(inputList);
 //printList(pliste_finale);
 
 
 return 0;
}
 
 
Merci de votre aide.


Message édité par Alpha002 le 24-11-2006 à 11:38:33
mood
Publicité
Posté le 24-11-2006 à 10:33:33  profilanswer
 

n°1481195
_darkalt3_
Proctopathe
Posté le 24-11-2006 à 11:07:31  profilanswer
 

- balises code stp
- quelle est ta sortie ?

n°1481200
Alpha002
Posté le 24-11-2006 à 11:12:51  profilanswer
 

La sortie, si c'est ce que tu demandes, c'est pliste_finale, c'est à dire la liste qui a reconstitué l'image.
Par contre je ne comprends pas ce que t'entends par balise du code.

n°1481207
Koyomi
www.sebastiengilles.com
Posté le 24-11-2006 à 11:32:55  profilanswer
 

extrait des regles du forum :
 

Citation :

[14] Pour poster du code, il existe des balises C/C++ bien pratiques.
 
    * Malheureusement certains ne les utilisent pas. Si vous les oubliez, on vous le signalera, vous serez alors prié d'effectuer ces modifications.
    * Si vous ne voulez pas de la coloration syntaxique C/C++ (qui peut s'appliquer au PHP, JAVA et autres), vous pouvez utiliser les balises [code] ou [fixed] à la place de [cpp] (elles sont d'ailleur recommandées si vous voulez poster autre chose que du code ayant un style proche du C++).

n°1481248
Elmoricq
Modérateur
Posté le 24-11-2006 à 13:13:18  profilanswer
 

Pour les balises de code, il s'agit d'utiliser [code=C][/code] avec ton code entre ces deux balises, ce qui permet de rendre ton code lisible par les forumeurs.

 

Sinon j'ai réalisé un copier-coller de ton code, pour le compiler, et j'obtiens ceci :

$ gcc -W -Wall -pedantic -std=c99 -O2 test.c
test.c: In function `main':
test.c:262: warning: unused variable `i'
test.c: At top level:
test.c:225: warning: unused parameter 'argc'
test.c:225: warning: unused parameter 'argv'
test.c: In function `loadVectors':
test.c:192: warning: 'first' might be used uninitialized in this function
test.c: In function `main':
test.c:234: warning: 'distance_comparaison_droite_liste_finale' might be used uninitialized in this function
test.c:236: warning: 'minD' might be used uninitialized in this function

 

Il y a surement deux ou trois choses à corriger. Je ne suis pas allé plus loin dans l'analyse, il faudrait que tu isoles l'erreur et que tu nous dises précisément ce qui ne fonctionne pas.


Message édité par Elmoricq le 24-11-2006 à 13:13:35
n°1481265
Alpha002
Posté le 24-11-2006 à 13:57:30  profilanswer
 

apparement il y a un problème dans le main au niveau de la boucle while, je suis en train de réessayer un autre prototype de fonction. J'ai justement une question à ce sujet, je pensai a un autre algorithme qui trouverait la bandelette tout a gauche (de la photo) et ensuite coller les bandelettes (à droite) correspondant à la plus petite distance (shred qui se colle les une à coté des autres). Cependant comme les distances sont calculées en valeur absolue, est il réellement possible de trouver la premiere bandelette( distance avec toutes les autres la plus improbable).


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [ C ] Reconstitution d'une image

 

Sujets relatifs
Inverser (retourner) une image (photo) en C#transformer DOT en image (JPEG,, ...)
Récupérer une image d'une base de donnée[html] aucun espace entre 2 image
Image depuis un Byte streamRendre un décompte en image transparent (lib GD2)
Traitement d'image trop long pour l'hebergeur[RESOLU] PHP EXIF et retouche d'image
Espace apres une imageEcandré image OnClick
Plus de sujets relatifs à : [ C ] Reconstitution d'une image


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR