2012-11-12 12 views
6

Attualmente sto combattendo con un comportamento molto strano di OpenCV/C++. Questo è quello che sto facendo:Risultati diversi che calcolano la media delle doppie variabili contenute in un vettore di strutture alterando la formattazione del codice?

Aggiornato 1: Qui maggiori informazioni:

ho calcolare l'orientamento del gradiente per un insieme di pixel e memorizzarli in un double campo di un sé dichiarato struct. Gli elementi struct vengono memorizzati in un vettore.

myfunct1() { 
    (...) 
    c.grad_orientation = (sum_ori/highgrads.size()) + M_PI; // +M_PI because i just want to rotate the angle around 180°. 
    (...) 
    my_struct_vector.push_back(c); 
} 

seguito ho ottenuto diversi c memorizzati in un vettore e vuole stimare la media di ogni singolo grad_orientation, immagazzinato in ogni struct-elemento del mio vettore simile a questo:

myfunct0() { 
    myfunct1(); //adds element to the my_struct_vector 
    (...) 
    int n = 0; 
    double total_ori = 0.0; 
    for (uint i = 0; i < my_struct_vector.size(); ++i) { 
     total_ori += my_struct_vector[i].grad_orientation; 
     n++; 
    } 

    azimuth = (total_ori/n); 
    cout << "Average: " << azimuth * 180/M_PI << endl; // print out in degrees 
} 

Ora per la parte divertente: se lo faccio in determinate circostanze, lo cout stampa 215.963. Questo è il risultato che ho ottenuto più spesso (ESATTAMENTE questo risultato). In alcuni casi, se aggiungo queste matrici dette sopra o (sì, davvero) se sposto il doppio campo tenendo lo grad_orientation nella struttura una colonna più in alto in termini di codice ottengo 223.442. Quindi la differenza tra i due risultati nel codice è solo il seguente:

struct my_struct { 

std::vector<cv::Point> contour_shadow; 
std::vector<cv::Point> contour_light; 
cv::RotatedRect rect; 
cv::Point pf; 
cv::Point pc; 
double grad_orientation; // this line moved one column down, beneath "grad_flag" results in a differing result. 
bool grad_flag; 
double grad_magnitude; 

};

I risultati stampati dipendono non solo dalla posizione della colonna nella dichiarazione della struttura ma anche quando altero parti diverse del mio codice.

Questo potrebbe avere qualcosa a che fare con la doppia precisione, ma perché altera se sposto colonne di codice?

+0

Suoni come un sovraccarico del buffer. Difficile da dire senza vedere il codice che dichiara le tue variabili immagine e le operazioni eseguite su di esse tra la loro istanziazione e le chiamate di funzione sopra. – Rook

+0

esamina come esegui il ciclo. il criterio di finitura è craters.size(), ma poi my_struct [i] ?? Mi aspetterei invece crateri [i]. Un altro consiglio è quello di usare un buon debugger, troverai il problema in un attimo, – Rolle

+0

, il tuo "edit" sembra totalmente estraneo al tuo primo problema e non sembra avere nulla a che fare con opencv. probabilmente fuori dai limiti dell'array o simili – Rolle

risposta

0

Ok, grazie a Rolle per avermi aiutato in questo. Spero che sia giusto rispondere alla mia stessa domanda solo per segnare la risposta?
Il problema era in effetti l'utilizzo della memoria non inizializzata e di un flag bool (a seguito di una decisione errata) all'interno della struttura (ciò che non è, ovviamente, zero se non inizializzato). Cose che sono abbastanza ovvie, ma il fatto che lo scambio di righe nel codice (anche al di fuori della struttura!) Abbia portato a valori sbagliati (ma in qualche modo non casuali) mi ha lasciato un po 'confuso.

Vedere qui Are members of a C++ struct initialized to 0 by default?

Problemi correlati