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

Archive C/C++

 > 

Archives

 > 

Au secours

 > 

Optimisation et modification du codeC pour lire 4pixels au lieu 1


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

Optimisation et modification du codeC pour lire 4pixels au lieu 1

vendredi 11 mars 2005 à 23:53:47 | Optimisation et modification du codeC pour lire 4pixels au lieu 1

zorrofes

Bonjour,
j ai besoin de votre aide. J' ai reussi a optimiser mon code et de diminuer un peu le nombre de cycles lors de l execution. Ce code permet de lire les images et de les modifies en utilisant la methode ELA de-interlacing.

Maintenant, j ai une partie ou l image est traite pixel par pixel, j aimerai bien votre aide afin de la modifie et de la traite par 4 pixels.

    /*    img_out initialization  */

  img_out = (pix_type**)malloc(sizeof(pix_type*)*frame_height);

  for(j=0; j<frame_height; j++)

  {

    img_out[j] =  (pix_type*)malloc(sizeof(pix_type)*img_width);

    if (field_test == true)

    {

      field_test = false; 

      for(i=0; i<img_width; i++)

       img_out[j][i] = img_in[ptr_j][i+2];

    }    

    else

    {

      field_test = true;    

      for(i=0; i<img_width; i++)

      img_out[j][i] = calculate_out(&img_in[ptr_j][i],&img_in[ptr_j+1][i]); 

      ptr_j++;     

    }

  }

  return img_out;

}

 

#ifdef TEST2

pix_type calculate_out(pix_type line_buf_up[],pix_type  line_buf_down[])

{

 

 

  int   dir_dif[5];

  pix_type    ptr_up, ptr_down;

  float interpolated_val;

  bool  dominant = false;

  int   D_d1, D_d2, smallest;

  pix_type img_out;

 

  int   itr;

  pix_type    tmp_val;

 

#ifdef PARAMETER_VERTICAL_THRESHOLD_OPTIMIZATION

  /*   // Optimization variable */

    Parameter vertical_threshold("T_v", MIN_V_T, MAX_V_T, V_T_MIN_STEP);

    int       T_v = (int)vertical_threshold;

#else

    int       T_v = PARAM_VERTICAL_THRESHOLD;

#endif

#ifdef PARAMETER_DISTANCE_THRESHOLD_OPTIMIZATION

    /*   // Optimization variable */

      Parameter distance_threshold("T_d", MIN_D_T, MAX_D_T, D_T_MIN_STEP);

      int       T_d = (int)distance_threshold;

#else

      int       T_d = PARAM_DISTANCE_THRESHOLD;

#endif

 

 

      dir_dif[0] = abs(line_buf_up[0] - line_buf_down[4]);

      dir_dif[1] = abs(line_buf_up[1] - line_buf_down[3]);

      dir_dif[2] = abs(line_buf_up[2] - line_buf_down[2]);

      dir_dif[3] = abs(line_buf_up[3] - line_buf_down[1]);

      dir_dif[4] = abs(line_buf_up[4] - line_buf_down[0]);

 

      if(dir_dif[2] < T_v)

      {

       ptr_up   = 2;

       ptr_down = 2;

       dominant = false;

         

      }

      else

      {             

       smallest=smallfun2(dir_dif);             

 

       switch(smallest){

       case 0:

         D_d1 = abs(dir_dif[0] - dir_dif[3]);

         D_d2 = abs(dir_dif[0] - dir_dif[4]);

         ptr_up   = 0;

         ptr_down = 4;

         if(D_d1 > T_d && D_d2 > T_d)   dominant = true;

         else dominant = false;

         break;

       case 1:

         D_d1 = abs(dir_dif[1] - dir_dif[3]);

         D_d2 = abs(dir_dif[1] - dir_dif[4]);

         ptr_up   = 1;

         ptr_down = 3;

         if(D_d1 > T_d && D_d2 > T_d)  dominant = true;

         else dominant = false;

         break;

       case 2:

         ptr_up   = 2;

         ptr_down = 2;

         dominant = false;

         break;

       case 3:

         D_d1 = abs(dir_dif[3] - dir_dif[0]);

         D_d2 = abs(dir_dif[3] - dir_dif[1]);

         ptr_up   = 3;

         ptr_down = 1;

         if(D_d1 > T_d && D_d2 > T_d) dominant = true;

         else dominant = false;

         break;

       case 4:

         D_d1 = abs(dir_dif[4] - dir_dif[0]);

         D_d2 = abs(dir_dif[4] - dir_dif[1]);

         ptr_up   = 4;

         ptr_down = 0;

         if(D_d1 > T_d && D_d2 > T_d)  dominant = true;

         else  dominant = false;

         break;

       default:

         break;

       }

      }

      interpolated_val = ((float)(line_buf_up[ptr_up] + line_buf_down[ptr_down])) / 2;

      if(dominant)

      img_out = medianfun(line_buf_up[2],line_buf_down[2],(int)interpolated_val);

      else

       img_out = (int)interpolated_val; 

      return img_out;

             

}

#endif

Tous ca c pour un pixel, j aimerai bien modifier la fontion ecrite en italique, gras pour la rendre en 4 pixels.
Merci de votre aide.
salut.
samedi 12 mars 2005 à 09:49:33 | Re : Optimisation et modification du codeC pour lire 4pixels au lieu 1

SnOOpss

Moi j'ai fait un truc comme ca
if ( (lpBits[tmp] == 0) && (lpBits[tmp+1] == 0 ) && (lpBits[tmp+2] == 0) )
remplacé en
 long *p = (long *)&lpBits[tmp];
 if ( (unsigned)*p == cTransparentColor )
avec cTransparentColor = RGB(0,0,0)
samedi 12 mars 2005 à 19:43:32 | Re : Optimisation et modification du codeC pour lire 4pixels au lieu 1

zorrofes

SnOOpss

Merci, pour ta reponse, est ce que tu as deja un programme qui fait ca??? moi je l ai essaye sur une image de mauvaise qualite. Et j ai reussi, l image etait modifiee et devenue bonne. Mais moi je veux utiliser ce programme que j ai avec un co-processuer, c pour cette raison je veux bien reduire le nombre de cycles lors de la compilation.
Je veux d abord au lieu de traiter l image pixel par pixel, je vais vais la traiter 4pixel par 4.
img_out[j][i] = calculate_out(&img_in[ptr_j][i],&img_in[ptr_j+1][i], &img_in[ptr_j+2][i],&img_in[ptr_j+3][i]); // c ca mon idee....
Alors si tu as une idee merci de me repondre.
Salut et a la prochaine.
dimanche 13 mars 2005 à 11:26:53 | Re : Optimisation et modification du codeC pour lire 4pixels au lieu 1

SnOOpss

Désolé j avais mal compris en fait moi ce que je faisait cété de passer les 3 valeur RGB codé sur 2 octet (max FF) (désolé je peux me planter dans le nom ca date pour moi) en long codé sur 6 max FFFFFF mais je ne sait pas si cete technique augmente la vitesse.
exmple

a = 50 ou 32 en hexa
b= 60 ou 3C en hexa
a/2 = 25 soit 19 en hexa
b/2 = 30 soit 1E en hexa

demande 2 division tandis que

a=323C soit 12860 en decimal
a/2=6430 en decimal soit 191E en hexa
ne demande q'une seule division pour arriver au meme resultat

On arrive aux meme resulat en ne faisant qu'une seule division pour toi je sais pas mais j utlisais cette technique quand je bidouillé en assembleur vu que la division etait une des fonctions ki demandait le plus de temps cependant le fait d augementer le nombre de bit ralonge ( je pense) le temps de calcul donc fait des tests mais ce qui est sur c'est que de bien choisir son type de variable ( int ou byte ou long ) a beaucoup d incidence sur un prog en assembleur

D ailleur pourquoi tu ne le programmes pas en assembleur j'ai vu que 'était possible de mettre des bout d asm dans du c++.

Autre chose y a plus rapide que la division par 2 quand tu interpoles
78 = 1001110 en binaire
78/2=39 = 100111
39/2=19=10011
en fait pour diviser par 2 tu retire le dernier bit

M'enfin je te dit de suite ca m'etonnerait que tu voyes de grosses differences en c++, tu as un petit algorythme fait le en asm meme si tu y connais rien je vois que ca pour optimiser ton code.


Cette discussion est classée dans : ptr, dif, line, dir, buf


Répondre à ce message

Sujets en rapport avec ce message

Aider_ moi [ par yara89 ] [[color=red]color=]Bonjour Je veux aider dans cet exercice Je veux en faire dans programme c++[/color][/color] --------------------------------------- Gestion buffer partagée shm/shmat [ par Guismos ] Bonjour à tous, J'ai un petit soucis quand à la gestion d'un stack pointer pour une mémoire partagée entre plusieurs threads, je m'explique : je veu carte son [ par altyok ] bonjour a tous voila j'ai un projet a faire pour mes études ou je dois utiliser la carte son pour tracer le diagramme de bode d'un filtre pour cela j setjmp en c [ par tahsgh ] salam; int setjmp(jmp_buf buf); est ce que je peux récupérer la valeur de "buf", c'est-à-dire savoir son contenu ? Si oui , comment ? Merci socket serveur ! help me please ! [ par rachel95 ] bonjour, je doit réaliser un programme pour mon projet, mais je ni arrive pas enfaite, j'ai un serveur socket qui reçoit des données ( caractère ) d [Aide] Repackeur EPK/EIX [ par slam2 ] Bonjour, Je requière votre aide étant tout nouveau dans le milieu de la programmation C# & C++ . Afin de mener à bien mon projet, dans le but de pouv OpenGL/FreeGlut sous Ubuntu [ par Debutant2010 ] Bonjour, Je suis sous Ubuntu, et je débute totalement avec OpenGL/FreeGlut (je ne sais pas la différence entre OpenGL et FreeGlut [^^confus2])


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 : 0,624 sec (4)

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