Problema con errore di segmentazione

di il
2 risposte

Problema con errore di segmentazione

Salve a tutti, ho un problema con la seguente porzione di codice. Non capisco perchè la funzione plotCircle e in particolare setPix generano questo errore(credo). L'errore è saltato fuori dopo aver aggiunto la matrice di int Acc. in prima istanza era un file PGM ,non creava errori ma non mi bastava il massimo raggiungibile.

premetto che , il programma prende in ingresso un immagine B/N. per ogni punto bianco deve tracciare una circonferenza all'interno di una matrice Acc

void trasformata_Hough(PGMFile *in,Mat *Acc, PGMFile *originale)                        
{                           
 
  for ( int r = 0; r < Acc->rows_; r++ )
  {
    for ( int c = 0; c < Acc->cols_; c++ )
      Acc->data_[r*Acc->cols_ + c]=0;                                            //setto l'accumulatore su 0,quindi come un immagine nera   
   }       

 int raggio,Xc,Yc;

 for(raggio=25;raggio<=35;raggio++)                                            //iterazioni per la ricerca di un raggio compreso nel range assegnato
  {                        
    for ( int r = 0; r < in->rows_; r++ )
    {
      for ( int c = 0; c < in->cols_; c++ )                                     //scan dell'immagine in ingresso
      {                 
                                                                   
          if( in->data_[r*in->cols_ + c]!=0  )                                  //cerco tutti i punti non neri
          {                                                                     //e uso quelle coordinate come centro 
            Xc=r;
            Yc=c;  
            plotCircle(Acc,Xc,Yc,25); 
                     
          }   
          
      }
    }
  }
  }
  
  void plotCircle(Mat *img, int xc, int yc, int r)                                              
{
 int x = -r, y = 0, err = 2-2*r;
  
 do
  { 
      
    setPix(img, xc-x, yc+y); /*I. Quadrant */
    setPix(img, xc-y, yc-x); /* II. Quadrant */
    setPix(img, xc+x, yc-y); /* III. Quadrant */
    setPix(img, xc+y, yc+x); /* IV. Quadrant */
    r = err;
    if (r <= y) err += ++y*2+1;              /* e_xy+e_y < 0 */
    if (r > x || err > y) err += ++x*2+1;  /* e_xy+e_x > 0 or no 2nd y-step */
  } while (x < 0);
}


void setPix(Mat *img, int xc, int yc)
{
    img->data_[xc*img->cols_+yc]+=1;       
    
}
  

2 Risposte

  • Re: Problema con errore di segmentazione

    Hai controllato in debugging il valore del puntatore Mat? E' valido?
  • Re: Problema con errore di segmentazione

    Ho individuato il problema, la funzione plotcircle scrive al difuori della matrice assegnata...ho provato a mettere questo controllo ma non va bene in quanto non mi traccia le circonferenze che occupano una porzione esterna di matrice...ma a me servono tracciate anche parzialmente fino al bordo
    void setPix(int img[][7], int xc, int yc)
    {    
        if(xc<0 || xc>5 || yc<0 || yc>7){}
        else        
        img[xc][yc]+=1;                                         //rivedi indicizzazione
        
    }
    void plotCircle(int Acc[][7], int xc, int yc, int r)                                               //funzioni verificate
    {
     int x = -r, y = 0, err = 2-2*r;
     if((xc-r)<0 || (xc+r)>5 || (yc-r)<0 || (yc+r)>7){}
        else
        {
     do
      {
        
        setPix(Acc, xc-x, yc+y); /*I. Quadrant */
        setPix(Acc, xc-y, yc-x); /* II. Quadrant */
        setPix(Acc, xc+x, yc-y); /* III. Quadrant */
        setPix(Acc, xc+y, yc+x); /* IV. Quadrant */    
        r = err;
        if (r <= y) err += ++y*2+1;              /* e_xy+e_y < 0 */
        if (r > x || err > y) err += ++x*2+1;  /* e_xy+e_x > 0 or no 2nd y-step */
      } while (x < 0);
    }
    } 
Devi accedere o registrarti per scrivere nel forum
2 risposte