begin process at 2012 05 30 00:48:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Optimisation des boucles pour .....


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

Optimisation des boucles pour .....

vendredi 28 janvier 2005 à 04:50:17 | Optimisation des boucles pour .....

zorrofes

Bonjour les amis,

j ai un code C d un programme de traitement de video/images. Mon projet c de bien comprendre (deinterlacing/interlacing) entrelacement et desentrelacement pour bien modifier le code c que j ai.

Car ds ce code, j ai des boucles et je dois les optimiser le maximum possible.
Alors s il vous plait si qlq1 connait les methodes de:
**entrelacement et desentrelacement
**optimisation du code C et les etapes a suivre.
Veuillez m aider.
Mes remerciements.

Pour avoir 1e idee:

char *im_scr_path = "/home/images/trevor_field_0.pgm";

char *im_f_path = "/home/images/trevor_field_0_deinter.pgm";

/* int  im_height; */

/* int  im_width; */

int   first_field=0;

 

 

#define TEST

 

#ifdef TEST

pix_type ** read_raw_pgm_file(pix_type **im_src, int *im_height, int *im_width){

  FILE *LireBin;

 

  char          tampon;

  char*         num;

  unsigned int* dim;

  unsigned int  itr_x;

  unsigned int  itr_y;

  int err;

  unsigned char num_tmp;

 

  /* Read raw PGM image file */

  LireBin = fopen(im_scr_path, "rb");

 

  if (!LireBin){

    printf("ERREUR d ouverture\n");

    return;

  }

 

 

  num = malloc(3);

  dim = malloc(3*sizeof(unsigned int)) ;

  if (feof(LireBin)){

    printf("FILE OPEN ERROR \n");

    return;

  }

 

  /* Read raw PGM image file header */

  for(itr_x=0; itr_x<3; itr_x++)

    fread((char *) &tampon, 1, sizeof(char),LireBin);

 

  for(itr_x=0; itr_x<3; itr_x++){

    itr_y = 0;

    fread((char *) &tampon, 1, sizeof(char), LireBin);

    while(itr_y != 3){

      num[itr_y] = tampon;

      fread((char *) &tampon,1,  sizeof(char), LireBin);

      itr_y++;

    }

    dim[itr_x] = atoi(num);

  }

 

  /* Read raw PGM image file pixel */

  *im_width = (int)dim[0];

  *im_height = (int)dim[1];

 

  im_src = malloc(sizeof(pix_type*)*(*im_height));

 

  for(itr_x=0; itr_x<(*im_height); itr_x++){

    im_src[itr_x] = malloc(sizeof(pix_type)*(*im_width));

    for(itr_y=0; itr_y<(*im_width); itr_y++){

      fread((char *) &im_src[itr_x][itr_y], 1, sizeof(unsigned char), LireBin);

    }

  }

 

  fclose(LireBin);

 

  free(num);

 

  printf("WIDTH: %d\t, HEIGHT: %d\n", *im_width,*im_height );

  return im_src;

}

 

void  write_raw_pgm_file(pix_type **im_f, int im_height, int im_width){

  FILE *EcrireBin;

  char* header_tmp;

  char* ctmp;

  unsigned int  itr_x, itr_y;

 

 

  /* Write raw PGM image file pixel*/ 

  EcrireBin = fopen(im_f_path, "wb");

 

  if (!EcrireBin)

    return;

 

  /* Create raw PGM image file header */

 

 

  printf("MARIA 1\n");

  ctmp = malloc(10);

  header_tmp =  malloc(20); /*new char[20];*/

 

  strcat(header_tmp,"P5\n");

  sprintf(ctmp,"%d",im_width);

  strcat(header_tmp,ctmp);

  strcat(header_tmp," ");

  sprintf(ctmp,"%d",im_height);

  strcat(header_tmp,ctmp);

  strcat(header_tmp,"\n255\n");

 

 

 

  fwrite((char *) header_tmp,1, sizeof(char)*strlen(header_tmp),EcrireBin);

 

 

  for(itr_x=0; itr_x<im_height; itr_x++){

    for(itr_y=0; itr_y<im_width; itr_y++){   

      fwrite((char *) &im_f[itr_x][itr_y],1, sizeof(unsigned char),EcrireBin);

    }

  }

 

  fclose(EcrireBin);

 

  free(ctmp);

  free(header_tmp);

 

}

 

int main(){

  int   cur_field;

  int   nb_field;

  int   ***img_seq;

  pix_type   **img_src;

  pix_type   **img_deinterlaced;

  int   img_height,img_width;

  int   img_num = 0;

  int   row, col;

  int   the_int;

  float the_float;

  float the_height,the_width,the_nb_field,the_first_field;

 

#ifdef TEST

  img_seq= read_raw_pgm_file(img_seq,&img_height,&img_width);

 

#endif 

  /* creation des sequences d'images */

#ifdef VIDEO

  img_height = img_height / 2;

  img_seq    = malloc(sizeof(int**) * nb_field);

  for(cur_field=0; cur_field<nb_field; cur_field++){

    img_seq[cur_field] = malloc(sizeof(int*) * img_height);

    for(row=0; row<img_height; row++){

      img_seq[cur_field][row] = malloc (sizeof(int)*img_width);

      for(col=0; col<img_width; col++){

      if(getinput(&the_float) == 1)

        img_seq[cur_field][row][col] = (int)the_float;

      else

        fprintf(stderr,"Image sequence is wrong size.\n");

      }

    }

  }

#endif

 

  img_deinterlaced = compute_ela_deinterlacer(&img_seq,img_height,img_width,first_field);

 

#ifdef TEST

  if (img_deinterlaced)

    write_raw_pgm_file(img_deinterlaced,img_height*2,img_width);

 

#endif

 

  for(row=0; row<img_height; row++){

    free ((int*)(img_seq[row]));

 

    free ((int*)img_deinterlaced[row]);

  }

 

  for(row=img_height; row<img_height*2; row++){

    free ((int*)img_deinterlaced[row]);

  }

 

  free ((int**)img_deinterlaced);

  free ((int***)img_seq);

  img_deinterlaced = NULL;

  img_seq          = NULL;

 

 

 

  return 0;

}

 

#endif

vendredi 28 janvier 2005 à 07:06:40 | Re : Optimisation des boucles pour .....

Nashua

De ce que je vois tes boucle servent tres souvent a faire des read/write deans un fichier.
tu peux deja optimiser en faisant un fread de 3 elements au lieu de for irt_x .; itr_x < 3 : itr_x++
Example:
dans pix_type ** read_raw_pgm_file(...

for(itr_x=0; itr_x<3; itr_x++)

    fread((char *) &tampon, 1, sizeof(char),LireBin);

peut se reduire a fseek (LireBin,3L,SEEK_CUR); bien plus rapide que troix fread()
 
 

  for(itr_x=0; itr_x<3; itr_x++){

    itr_y = 0;

    fread((char *) &tampon, 1, sizeof(char), LireBin);

    while(itr_y != 3){

      num[itr_y] = tampon;

      fread((char *) &tampon,1,  sizeof(char), LireBin);

      itr_y++;

    }

    dim[itr_x] = atoi(num);

  }

dans cet exemple : tu avance de 1 dans le for puis tu lis 3 char dans le while que tu met dans tampon aussi tu peux remplacer tout cela par :
  for( i = 0 ; i < 3 ; i++){
        memset(tampon,0,sizeof(tampon);
    fseek( LireBin,1,SEEK_CUR)
    fread((char *) &tampon,1, 3, LireBin);
    dim[i] = atoi (tampon);
 }
   Bien entendu ceci est un exemple a toi de faire le reste.
Un autre conseil fais attention aux malloc(), je gage que tous ne sont pas liberes.
Essaie de remplacer les malloc par une allocation statique quand cela est possible. le malloc prend enormenent de temps.


Yves

samedi 12 mars 2005 à 19:50:00 | Re : Optimisation des boucles pour .....

zorrofes

Nashua

Merci pour ta reponse, oui vraiment tu as raison, le malloc() a pris beaucoup de temps et je n ai pas gagne de nbre de cycle lors l execution.

Concernant:
fseek (LireBin,3L,SEEK_CUR); // je n ai jamais utilise 3L et fseek et seek_cur,????

Merci.
mercredi 16 mars 2005 à 20:12:31 | Re : Optimisation des boucles pour .....

Nashua

Je ne sais pas ce que tu utilises comme OS et compilo. SEEK_CUR viens du monde unix, mais je pense tout de meme que c'est dans stdio.h ou meme dans posix. Je suis desole de ne pouvoir en faire plus. Si tu es dans unix ou Linux fais un man fseek ou lseek.
Yves

mercredi 16 mars 2005 à 20:20:15 | Re : Optimisation des boucles pour .....

Nashua

Si tu travailles avec VC ++ fesek est documente.
fseek, ftell, lseek sont des fonctions permettant de deplacer les pointeurs de lecture et ecriture dans le fichier a partir
 - de la position courante ( SEEK_CUR)
 - du debut du fichier (SEEK_SET)
 - ou de la fin (SEEK_END)
 Pour le 3L c'est juste 3Bytes convertius dans le format long ( fseek attend un long dans l'argument 2) tu peux aussi faire un cast  ( long ) 3.

Yves



Cette discussion est classée dans : int, img, char, im, itr


Répondre à ce message

Sujets en rapport avec ce message

Probleme urgent [ par pozor16 ] Une image est composée d'un ensemble de points (des pixels) dont on peut fixer la couleur en donnant la valeur des 4 composantes qui composent une cou Conversion handle en char* ou int [ par unrealgun ] Bonjour,Je voudrais savoir comment convertir un type HWND en CHAR*.j'aimerais savoir s'il y a une fonction style itoa (pour conv. un int en char*) mai Convertir un Int en Char [ par MaxSoldier ] Bonjours, tout d'abord, j'aimerai m'excuser car je sais que cette question a déjà été posée des milliards de fois mais, je n'ai jamais réussi à faire problem avec un char[] [ par kibab ] Bounour a vous tous, je suis nouveau de ce langage et je m'amuse à faire des épreuves diverses.Ici il y a un petit example mais jái un problem:#includ initialisation d'un tablo char et int [ par ddd666 ] bonjour,je narrive pas à initialiser un tablo char ni un tablo int. kelkun pourré maider svpmerci d'avance Convertir une valeur d'un tableau de char en int [ par impskil ] Bonjour.J'ai un tableau de char: char line[3000];Je veux reccuperer une valeur à l'interrieur du tableau et enssuite la convertir au format int ou dou Petit problème pour créer un arbre binaire [ par dragarth1 ] Bonjour j'ai un travail à faire pour l'école, il faut que je crée un arbre binaire à partir d'un fichier, comme un arbre généalogique, la racine étant Pendu en C [ par the_kaiser ] Voila je suis débutant en C (en programmation tous cours d'ailleurs puisque le C est le premier language que je teste) et je tente de faire un pendu. Fonction Convert [ par nem02004 ] Voila mon code marche, mais comme je ne suis pas un super programmeur, je pense qu'il ya moyen de l'amélioré, c'est la que vous intervenez :DEn fait i Probleme avec qsort [ par Noxk ] bonjour, voila j'ai un probleme avec qsort j'esssaie de faire un tri sur un tableau de structure mais j'obtiens une erreur d'acces violation, apparemm


Nos sponsors


Sondage...

Comparez les prix

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

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