2010-11-19 11 views
5

Ho scritto un pezzo di codice che deve essere ottimizzato. Mi sono sentito come se avessi consultato la community per vedere se quel codice fosse davvero ottimale. Riempie l'accumulatore per la trasformazione di Hough. In realtà ho appena copiato la maggior parte del codice dalla libreria OpenCV. Grazie!riempimento accumulatore per trasformazione Hough


int i,j,n,index; 
for (i = 0;i<numrows;i++) 
{ 
    for (j = 0;j<numcols;j++) 
    { 
      if (img[i*numcols + j] == 100) 
     { 
      for (n = 300;n<600;n++) 
      { 
       index = cvRound(j*tabCos[n] + i * tabSin[n]) + (numrho-1)/2; 
       accum[(n+1) * (numrho+2) + index+1]++; 
      } 
     } 
    } 
} 
+0

avete un esempio reale di dati su cui applicare questo codice? Sembra che ci siano diverse ottimizzazioni possibili, alcune indipendenti dai dati, ma altre dipenderebbero dalla distribuzione effettiva dei dati in img e dalla dimensione dell'immaginario. – kriss

+0

un esempio dei dati che ho è http: // StackOverflow.it/questions/4372259/hough-transform-error-in-matlab-and-opencv mi rendo conto che ci sono solo 3 punti per colonna (ecco come ho creato quelle immagini) quindi ci dovrebbe essere un modo per accelerarlo, ma la parte di tempo in cui la memoria sta riempiendo l'accumulatore e non sta attraversando l'immagine – Denis

risposta

1

No non lo è. Sostituire il maggior numero degli usi di [] il più possibile con una semplice aritmetica del puntatore per iterare gli array in questione. Estrarre le espressioni invarianti in variabili locali.

Tuttavia, la prima domanda è, il tuo profiler mostra che questo codice è un collo di bottiglia nel contesto dell'intera app. Se no, perché preoccuparsi di micro-ottimizzare questo?

EDIT: ciclo micro-ottimizzazione - preferisco la seconda come nessuna indicizzazione matrice richiesto (Mult contro aggiungere)

int ints[100]; 
int i; 
int *pi; 

for (i = 0; i < 100; ++i) 
{ 
    printf("%d", ints[i]); 
} 

for (pi = ints; pi < ints + 100; ++pi) 
{ 
    printf("%d", *pi); 
} 
+0

ho pensato [] e l'aritmetica del puntatore semplice sarebbe equivalente dal punto di vista del compilatore, (* (accum + (n + 1) * (numrho + 2) + index + 1)) ++; sarebbe quindi equivalente all'accumulo [(n + 1) * (numrho + 2) + indice + 1] ++; no? questa parte è sicuramente il collo di bottiglia nella mia elaborazione, il resto del programma è molto semplice. – Denis

+0

@denis - se è tutto ciò che fai allora sì, ma vedi modifica per un esempio –

+0

Mi dispiace, sono un po 'nuovo in questo forum, a quale modifica ti riferisci? – Denis

2

V'è un ampio e ripetitivo trasformata di Hough in un pezzo di codice che sto vagamente attaccato troppo . Il manutentore di quella parte del codice ha sperimentato con array sparsi (in realtà un C++ std::map digitato sull'indice delle celle se ho capito bene la sua presentazione) per l'accumulatore con un certo successo.

Suppongo che la velocità sia correlata ai problemi di localizzazione della cache, e sicuramente dipende dai dati sparsi.


Aggiornamento: Il software di cui sopra è destinato a servire molti esperimenti di fisica delle particelle, ma è stato originariamente utilizzato su un progetto banco di prova (cioè piccola scala). Dato che siamo diventati seri nel fare progetti più grandi e abbiamo iniziato a fare Monte Carlo per loro, la trasformazione di Hough è tornata a essere un po 'più complessa anche con la matrice sparsa.

Finora abbiamo non hanno una soluzione, ma uno dei colleghi hanno scoperto Gandalf che comprende "fast hough transform", che sembra valutare il trasformare in un quad-albero come modo (in 2D, presumibilmente si utilizza una struttura ottale in 3D) ridurre l'ordine di lavoro. Probabilmente stiamo andando a sperimentare con questo.

Ulteriore aggiornamento: Un collega ha implementato una trasformazione progressiva e probabilistica di Hough nel nostro codice che attualmente sembra essere la versione più veloce che abbiamo. Funziona meglio se non si richiede che ogni punto venga assegnato a una linea.

+1

hai un link al documento che parla di questo approccio? la mia matrice è piuttosto scarsa, quindi si adatterebbe perfettamente. – Denis

+0

@Denis: No. Questo lavoro è ancora in corso, e poiché è un codice di analisi per un esperimento di fisica delle particelle, è improbabile che sia un documento sul codice stesso, anche se sospetto che andrà nella tesi dello studente. – dmckee

+0

@Denis Non conosco l'approccio segnalato da dmckee ma il documento citato in Gandalf è: LI, Hungwen; LAVIN, Mark A .; LE MASTER, Ronald J. ** Trasformazione rapida di Hough: un approccio gerarchico. ** _Computer Vision, Graphics e Image Processing_, 1986, 36.2: 139-161. –

0

A seconda dell'applicazione, esistono numerosi modi per ottimizzare la Trasformazione dell'Hough e il giochetto con codice di basso livello è probabilmente l'ultimo di essi. Vorrei iniziare con Randomized HT o Multiresolution HT, seguito dall'unione di approccio ibrido. Credo che sia meglio ottimizzare l'algoritmo prima. L'ultimo passo sarebbe fare l'ottimizzazione dell'hardware come la memoria CAD.

Problemi correlati