• Viernes 17 de Mayo de 2024, 03:45

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Temas - javili

Páginas: [1]
1
C/C++ / Problema con "Segmentation Fault" en la libreria "Allegro"
« en: Viernes 4 de Mayo de 2012, 20:34 »
Hola, tengo un problema de lo que creo que es desbordamiento de memoria, con error "Segmentation Fault" de la libreria Allegro.

El fallo se produce en la función "CalcularZonas", creo que el problema esta en el "buffer", pero no estoy seguro. La verdad no creo que se pueda encontrar el por qué, pero si alguien se lo quiere tomar como un reto y quiere ayudarme, le estaria muy gratamente agradecido.

El codigo del programa es el seguiente:

Código: C++
  1. #include <iostream>
  2. #include "EasyBMP.h"
  3. #include "allegro.h"
  4.  
  5. #define X 740
  6. #define Y 570
  7. #define F 10000
  8.  
  9. using namespace std;
  10.  
  11. class Pixel
  12. {
  13.     public:
  14.     short int red;
  15.     short int green;
  16.     short int blue;
  17.     short int alfa;
  18.     unsigned int zona;
  19.     bool pas,prepas;
  20. };
  21.  
  22. class Relieve{
  23.     public:
  24.     bool frontera;
  25. };
  26.  
  27. void CargarImagen (Pixel CCD[X][Y])
  28. {
  29.     int i,j;
  30.  
  31.     BMP imagen;
  32.     imagen.ReadFromFile("m64.bmp");
  33.  
  34.     for(i=0;i<X;i++){
  35.         for(j=0;j<Y;j++){
  36.             CCD[i][j].red=(int) imagen(i,j)->Red;
  37.             CCD[i][j].green=(int) imagen(i,j)->Green;
  38.             CCD[i][j].blue=(int) imagen(i,j)->Blue;
  39.             CCD[i][j].alfa=(int) imagen(i,j) ->Alpha;
  40.             CCD[i][j].pas=false;
  41.             CCD[i][j].prepas=false;
  42.             CCD[i][j].zona=0;
  43.         }
  44.     }
  45. }
  46.  
  47. void GraficarCCD(Pixel array[X][Y])
  48. {
  49.     int i,j;
  50.  
  51.     for(i=0;i<X;i++){
  52.         for(j=0;j<Y;j++){
  53.             putpixel(screen,i,j,makeacol(array[i][j].red,array[i][j].green,array[i][j].blue,array[i][j].alfa));
  54.         }
  55.     }
  56. }
  57.  
  58.  
  59.  
  60. void GraficarMascara(Relieve Mascara[X][Y])
  61. {
  62.     int i,j;
  63.  
  64.     for(i=0;i<X;i++){
  65.         for(j=0;j<Y;j++){
  66.             if(Mascara[i][j].frontera)
  67.             putpixel(screen,i,j,makeacol(255,255,255,255));
  68.             else putpixel(screen,i,j,makeacol(0,0,0,0));
  69.         }
  70.     }
  71. }
  72.  
  73. void GraficarCCDMascara(Pixel CCD[X][Y],Relieve Mascara[X][Y])
  74. {
  75.     int i,j;
  76.  
  77.     for(i=0;i<X;i++){
  78.         for(j=0;j<Y;j++){
  79.             if(Mascara[i][j].frontera) putpixel(screen,i,j,makeacol(255,255,255,255));
  80.             else
  81.             {
  82.                 putpixel(screen,i,j,makeacol(CCD[i][j].red,CCD[i][j].green,CCD[i][j].blue,CCD[i][j].alfa));
  83.             }
  84.         }
  85.     }
  86.  
  87. }
  88.  
  89. int CalcularFrontera (Pixel CCD[X][Y],Relieve Mascara[X][Y])
  90. {
  91.     int i,j, corte, indice;
  92.  
  93.     cout<<"Por favor, escriba el valor de corte para calcular la frontera de luminosidad."<<endl<<endl;
  94.     do{
  95.         cout<<"Numero entre 0 y 255:  "<<endl;
  96.         cin>>corte;
  97.     }while(corte<-1 || corte>255);
  98.  
  99.     for(i=1;i<X-1;i++){
  100.         for(j=1;j<Y-1;j++){
  101.  
  102.             if(CCD[i][j].red>corte){
  103.                 if(CCD[i+1][j].red<corte || CCD[i-1][j].red<corte || CCD[i][j+1].red<corte || CCD[i][j-1].red<corte)
  104.                 {
  105.                     Mascara[i][j].frontera=true;
  106.                 }
  107.                 else Mascara[i][j].frontera=false;
  108.             }
  109.         }
  110.     }
  111.     GraficarMascara(Mascara);
  112.  
  113.     do{
  114.         cout<<"Pulse 1 para refrescar la pantalla"<<endl;
  115.         cout<<"Pulse 2 para superponer el filtro de saturacion a la imagen"<<endl;
  116.         cout<<"Pulse 3 para cambiar el limite de saturacion"<<endl;
  117.         cout<<"Pulse 4 para aceptar el limite de saturacion"<<endl;
  118.         cin>>indice;
  119.  
  120.         if(indice==1)
  121.         {
  122.             GraficarCCD(CCD);
  123.             GraficarMascara(Mascara);
  124.         }
  125.  
  126.         if(indice==2)
  127.         {
  128.             GraficarCCDMascara(CCD,Mascara);
  129.         }
  130.  
  131.         if(indice==3)
  132.         {
  133.             cout<<"Por favor, escriba el valor de corte para calcular la frontera de luminosidad."<<endl<<endl;
  134.             do{
  135.                 cout<<"Numero entre 0 y 255:  "<<endl;
  136.                 cin>>corte;
  137.             }while(corte<-1 || corte>255);
  138.  
  139.             for(i=0;i<X;i++){
  140.                 for(j=0;j<Y;j++){
  141.                     Mascara[i][j].frontera=false;
  142.                 }
  143.             }
  144.  
  145.             for(i=1;i<X-1;i++){
  146.                 for(j=1;j<Y-1;j++){
  147.  
  148.                     if(CCD[i][j].blue>corte){
  149.                         if(CCD[i+1][j].blue<corte || CCD[i-1][j].blue<corte || CCD[i][j+1].blue<corte || CCD[i][j-1].blue<corte)
  150.                         {
  151.                             Mascara[i][j].frontera=true;
  152.                         }
  153.                         else Mascara[i][j].frontera=false;
  154.                     }
  155.                 }
  156.             }
  157.             GraficarCCD(CCD);
  158.             GraficarMascara(Mascara);
  159.         }
  160.     }while(indice!=4);
  161.     return corte;
  162. }
  163.  
  164.  
  165. void CalcularZonas (Pixel CCD[X][Y],int corte_sat)
  166. {
  167.     class buf
  168.     {
  169.         public:
  170.         int k;
  171.         int l;
  172.     };
  173.  
  174.     int i,j,z,b,p,m;
  175.     int zonas=0;
  176.     z=0;
  177.     b=0;
  178.     buf buffer[F];
  179.     for(m=0;m<F;m++)
  180.     {
  181.         buffer[m].k=-1;
  182.         buffer[m].l=-1;
  183.     }
  184.  
  185.  
  186.  
  187.     for(i=0;i<X;i++)
  188.     {
  189.         for(j=0;j<Y;j++)
  190.         {
  191.  
  192.  
  193.             if(CCD[i][j].red>corte_sat && CCD[i][j].pas==false && CCD[i][j].prepas==false)
  194.             {
  195.                 z++;
  196.                 b=0;
  197.  
  198.                 CCD[i][j].zona=z;
  199.                 CCD[i][j].prepas=true;
  200.                 CCD[i][j].pas=true;
  201.  
  202.  
  203.                 if(CCD[i+1][j].red>corte_sat && CCD[i+1][j].prepas==false && CCD[i+1][j].pas==false)
  204.                 {
  205.                     buffer[b].k=i+1;
  206.                     buffer[b].l=j;
  207.                     b++;
  208.                     CCD[i+1][j].prepas=true;
  209.                 }
  210.                 if(CCD[i][j+1].red>corte_sat && CCD[i][j+1].prepas==false && CCD[i][j+1].pas==false)
  211.                 {
  212.                     buffer[b].k=i;
  213.                     buffer[b].l=j+1;
  214.                     b++;
  215.                     CCD[i][j+1].prepas=true;
  216.                 }
  217.                 if(CCD[i-1][j].red>corte_sat && CCD[i-1][j].prepas==false && CCD[i-1][j].pas==false)
  218.                 {
  219.                     buffer[b].k=i-1;
  220.                     buffer[b].l=j;
  221.                     b++;
  222.                     CCD[i-1][j].prepas=true;
  223.                 }
  224.                 if(CCD[i][j-1].red>corte_sat && CCD[i][j-1].prepas==false && CCD[i][j-1].pas==false)
  225.                 {
  226.                     buffer[b].k=i;
  227.                     buffer[b].l=j-1;
  228.                     b++;
  229.                     CCD[i][j-1].prepas=true;
  230.                 }
  231.                 if(CCD[i+1][j+1].red>corte_sat && CCD[i+1][j+1].prepas==false && CCD[i+1][j+1].pas==false)
  232.                 {
  233.                     buffer[b].k=i+1;
  234.                     buffer[b].l=j+1;
  235.                     b++;
  236.                     CCD[i+1][j+1].prepas=true;
  237.                 }
  238.                 if(CCD[i+1][j-1].red>corte_sat && CCD[i+1][j-1].prepas==false && CCD[i+1][j-1].pas==false)
  239.                 {
  240.                     buffer[b].k=i+1;
  241.                     buffer[b].l=j-1;
  242.                     b++;
  243.                     CCD[i+1][j-1].prepas=true;
  244.                 }
  245.                 if(CCD[i-1][j+1].red>corte_sat && CCD[i-1][j+1].prepas==false && CCD[i-1][j+1].pas==false)
  246.                 {
  247.                     buffer[b].k=i-1;
  248.                     buffer[b].l=j+1;
  249.                     b++;
  250.                     CCD[i-1][j+1].prepas=true;
  251.                 }
  252.                 if(CCD[i-1][j-1].red>corte_sat && CCD[i-1][j-1].prepas==false && CCD[i-1][j-1].pas==false)
  253.                 {
  254.                     buffer[b].k=i-1;
  255.                     buffer[b].l=j-1;
  256.                     b++;
  257.                     CCD[i-1][j-1].prepas=true;
  258.                 }
  259.  
  260.                 p=-1;
  261.  
  262.  
  263.                 do {
  264.                     p++;
  265.                     CCD[buffer[p].k][buffer[p].l].pas=true;
  266.                     CCD[buffer[p].k][buffer[p].l].zona=z;
  267.  
  268.                     buffer[p].k=-1;
  269.                     buffer[p].l=-1;
  270.  
  271.  
  272.                     if((CCD[(buffer[1+p].k)+1][buffer[1+p].l].red>corte_sat) && (CCD[(buffer[1+p].k+1)][buffer[1+p].l].prepas==false) && (CCD[(buffer[1+p].k+1)][buffer[1+p].l].pas==false))
  273.                     {
  274.                         buffer[b].k=buffer[1+p].k+1;
  275.                         buffer[b].l=buffer[1+p].l;
  276.                         b++;
  277.                     }
  278.                     if((CCD[(buffer[1+p].k)][buffer[1+p].l+1].red>corte_sat) && (CCD[(buffer[1+p].k)][buffer[1+p].l+1].prepas==false) && (CCD[(buffer[1+p].k)][buffer[1+p].l+1].pas==false))
  279.                     {
  280.                         buffer[b].k=buffer[1+p].k;
  281.                         buffer[b].l=buffer[1+p].l+1;
  282.                         b++;
  283.                     }
  284.                     if((CCD[(buffer[1+p].k)-1][buffer[1+p].l].red>corte_sat) && (CCD[(buffer[1+p].k)-1][buffer[1+p].l].prepas==false) && (CCD[(buffer[1+p].k)-1][buffer[1+p].l].pas==false))
  285.                     {
  286.                         buffer[b].k=buffer[1+p].k-1;
  287.                         buffer[b].l=buffer[1+p].l;
  288.                         b++;
  289.                     }
  290.                     if((CCD[buffer[1+p].k][(buffer[1+p].l)-1].red>corte_sat) && (CCD[buffer[1+p].k][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)][(buffer[1+p].l)-1].pas==false))
  291.                     {
  292.                         buffer[b].k=buffer[1+p].k;
  293.                         buffer[b].l=buffer[1+p].l-1;
  294.                         b++;
  295.                     }
  296.                     if((CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].red>corte_sat) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].prepas==false) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)+1].pas==false))
  297.                     {
  298.                         buffer[b].k=buffer[1+p].k+1;
  299.                         buffer[b].l=buffer[1+p].l+1;
  300.                         b++;
  301.                     }
  302.                     if((CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].red>corte_sat) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)+1][(buffer[1+p].l)-1].pas==false))
  303.                     {
  304.                         buffer[b].k=buffer[1+p].k+1;
  305.                         buffer[b].l=buffer[1+p].l-1;
  306.                         b++;
  307.                     }
  308.                     if((CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].red>corte_sat) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].prepas==false) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)+1].pas==false))
  309.                     {
  310.                         buffer[b].k=buffer[1+p].k-1;
  311.                         buffer[b].l=buffer[1+p].l+1;
  312.                         b++;
  313.                     }
  314.                     if((CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].red>corte_sat) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].prepas==false) && (CCD[(buffer[1+p].k)-1][(buffer[1+p].l)-1].pas==false))
  315.                     {
  316.                         buffer[b].k=buffer[1+p].k-1;
  317.                         buffer[b].l=buffer[1+p].l-1;
  318.                         b++;
  319.                     }
  320.  
  321.                 } while((buffer[1+p].k)!=-1);
  322.  
  323.             }
  324.             else
  325.             {
  326.                CCD[i][j].pas=true;
  327.             }
  328.  
  329.         }
  330.     }
  331.  
  332.  
  333.  
  334. cout<<z<<endl;
  335.  
  336. }
  337.  
  338. void GraficarCCDZona(Pixel array[X][Y])
  339. {
  340.     int i,j;
  341.  
  342.     for(i=0;i<X;i++){
  343.         for(j=0;j<Y;j++){
  344.             if(array[i][j].zona!=0)
  345.             {
  346.             putpixel(screen,i,j,makeacol(array[i][j].red,array[i][j].green,array[i][j].blue,array[i][j].alfa));
  347.             }
  348.             else{
  349.                 putpixel(screen,i,j,makeacol(0,0,0,0));
  350.             }
  351.         }
  352.     }
  353. }
  354.  
  355.  
  356. int main()
  357. {
  358.     string pausa;
  359.     int corte_sat;
  360.  
  361.     Pixel CCD[X][Y];
  362.     Relieve Mascara[X][Y];
  363.  
  364.     allegro_init();
  365.     set_color_depth(16);
  366.     set_write_alpha_blender();
  367.  
  368.     set_gfx_mode(GFX_AUTODETECT_WINDOWED,740,570,0,0);
  369.  
  370.     CargarImagen(CCD);
  371.     GraficarCCD(CCD);
  372.  
  373.     corte_sat=CalcularFrontera(CCD,Mascara);
  374.  
  375.     cin>>pausa;
  376.  
  377.     CalcularZonas(CCD,corte_sat);
  378.  
  379.     GraficarCCDZona(CCD);
  380.  
  381.     cin>>pausa;
  382.  
  383.  
  384.     allegro_exit();
  385.     return 0;
  386. }
  387.  
  388.  

2
C/C++ / Leer bmp y convertirlo a matriz
« en: Martes 24 de Abril de 2012, 17:00 »
Hola, antes que nada enhorabuena por el foro ya que recién ingreso.

Quisiera hacerles una consulta acerca de un código que estoy creando para un proyecto de optica adaptativa.

He creado una classe pixel tal que:

Código: C++
  1. class Pixel
  2. {
  3.     public:
  4.     short int red;
  5.     short int green;
  6.     short int blue;
  7. };
  8.  

Lo que representa la estructura del color de un pixel en RGB siendo números enteros de 0 a 255, por lo que una imagen no será mas que un array de esos objetos "Pixel".
Lo que pretendo es cargar una imagen BMP mediante "fstream" para copiarlo a un array de objetos Pixel (que tiene la misma estructura que las imagenes BMP segun he visto en wiki: http://en.wikipedia.org/wiki/BMP_file_format). Y he visto que existe una cabecera que no se como tratar, ni como obtener la información que está cifrada en el BMP para poder manejarla y copiarla al array de objetos Pixel.
Si es posible no usar punteros, ni nada complicado mejor, ya que mi formación es de físico y mis conocimientos en programación son básicos, solo llego a usar clases y transferencia de archivos por fstream.

Si pudieran ayudarme se lo agradecería. Muchas Gracias.

Páginas: [1]