2013-11-28 11 views
5

Sto tentando di implementare la corrispondenza del blocco stereo senza utilizzare OpenCV o altre librerie di elaborazione immagini. Tutti i tutorial, i libri, le diapositive delle lezioni ecc. Insegnano solo l'approccio di base per confrontare i blocchi nelle immagini, ma i risultati sono pessimi. Ho letto alcuni documenti come quello di K. Konolige, che è la base dell'algoritmo di OpenCV, ma mi sembra che manchi ancora qualcosa di importante.Risultati errati con corrispondenza del blocco stereo di base (senza OpenCV)

Quello che sto facendo ora:

  1. Applicare Sobel a sinistra e l'immagine a destra.
  2. Do blocco corrispondenza
    • selezionamento un blocco (9x9) attorno ad un pixel dell'immagine sinistra e confronta con i blocchi nella stessa riga dell'immagine destra (fino ad un massimo di 80 pixel a destra del blocco originale)
    • trovare quello con la migliore corrispondenza (con somma SAD delle differenze assolute)

la disparità risultante è quanti passi ho dovuto andare a destra per trovare la migliore corrispondenza.

Dopo aver letto il documento Konolige, ho implementato il controllo left-right, che, dopo aver trovato la migliore corrispondenza, cerca la migliore corrispondenza dell'immagine giusta nell'immagine a sinistra e la accetta solo se è quella giusta la tua ricerca originale o proprio accanto ad essa.

Inoltre, è stato aggiunto un controllo in modo che un pixel possa essere abbinato solo una volta, utilizzando un pixel bitfield che verrà saltato nelle ricerche se in precedenza sono stati abbinati a un pixel.

Il risultato non sembra molto sbagliato ma molto scarso.

Che cosa non riesco ad aggiungere? Qualcosa che tutti sembrano sapere ma non è spiegato. Devo aggiungere qualche tipo di interpolazione?

Qualsiasi aiuto è apprezzato!

Il mio ingresso è la coppia stereo Tsukuba.

Risultato trovato sul web (2 ° è OpenCV BM, 3 ° a quanto pare è triste BM da autori blog)

http://cseautonomouscar2012.files.wordpress.com/2012/11/111412_2001_comparisono1.png

risposta

3

E 'normale che i risultati sono scarsi, perché il vostro algoritmo è sparsa!

Diamo riavvolgere la storia un po ':

  • nel vostro primo passo, si applica un rilevatore di bordo Sobel. Quello che fai qui è estrarre una serie sparsa di caratteristiche che sono i bordi dell'immagine;
  • quindi si applica la corrispondenza dei blocchi sul risultato: ciò che si fa effettivamente è quindi la corrispondenza dei bordi e quindi la corrispondenza delle caratteristiche sparse.

Le implementazioni BM classiche funzionano su patch di intensità dell'immagine (questo è il motivo per cui l'equalizzazione della luminosità è importante), ovvero, prendere SSD/SAD/correlazione delle intensità dei pixel.

Inoltre, BM funziona, ma non così bene con le immagini difficili. Al posto del SAD sono spesso necessarie solide funzioni di costo (come la correlazione normalizzata). E fai attenzione quando confronti i tuoi risultati con OpenCV: OpenCV propone un'altra implementazione BM chiamata SGBM (per BM semi-globale). In questo caso, un termine aggiuntivo impone che anche la disparità dei pixel vicini sia vicina. Questo è chiamato un regolarità vincolo e aiuta in due modi:

  1. limita il rumore nel risultato di uscita (se la disparità di un pixel è un outlier, esso viene rimosso e sostituito da un valore desunto dal suo vicinato);
  2. consente di propagare buoni risultati in aree in cui l'algoritmo non ha indizi per inferire un buon risultato. Questo è in genere il caso della corrispondenza dei bordi: si ottengono buone stime di disparità sull'insieme di spigoli e si lascia che il termine di regolarizzazione propaghi questa buona stima su aree piatte (senza tessitura e senza bordi).
Problemi correlati