2013-09-26 10 views
9

Ho utilizzato l'API cv::findHomography di OpenCV per cacolare la matrice di omografia di due immagini planari. I punti chiave corrispondenti vengono estratti da SIFT e abbinati a BFMatcher. Come so, lo standard cv:findHomography utilizza l'iterazione RANSAC per individuare i quattro punti corrispondenti migliori per ottenere la matrice di omografia. Quindi disegno le quattro coppie di punti selezionate con il contorno calcolato utilizzando la matrice omografica del bordo dell'oggetto. Il risultato sono come collegamenti:come migliorare l'accuratezza dell'omografia?

http://postimg.org/image/5igwvfrx9/

Come si vede, il selezionato corrisponde punti RANSAC sono corrette, ma il contorno mostra che l'omografia non è accurato.

Ma questi test dimostra che, sia la scelta punti abbinati e l'omografia sono corrette:

http://postimg.org/image/dvjnvtm53/

La mia ipotesi è che se il selezionato abbinato punti sono troppo vicini, il piccolo errore della posizione di pixel porterà all'errore significativo della matrice di omografia. Se i quattro punti si trovano nell'angolo dell'immagine, lo spostamento dei punti corrispondenti di 4-6 pixel avrà comunque una buona matrice di omografia. (secondo il coordinate omogenee, penso che sia ragionevole, come il piccolo errore nel piano nei pressi sarà amplificato nel lontano)

La mia domanda è:

1.Is la mia ipotesi giusta? 2. Poiché i quattro punti corrispondenti sono generati dall'iterazione RANSAC, l'errore complessivo di tutti i punti chiave è minimo. Ma come ottenere l'omografia stabile, almeno la mappatura del contorno è corretta? La teoria ha dimostrato che se vengono trovati i quattro punti corrispondenti in un piano, la matrice di omografia deve essere calcolata, ma c'è qualche trucco nel lavoro di ingegnere?

Grazie.

+0

hai trovato qualche soluzione o spiegazione? Sto avendo lo stesso problema – MMH

risposta

5

Penso che tu abbia ragione e la vicinanza dello dei 4 punti non aiuta la precisione del risultato. Quello che osservi è forse indotto da problemi numerici: il risultato potrebbe essere localmente corretto per questi 4 punti ma peggiora quando si va oltre.

Tuttavia, RANSAC non ti aiuterà qui. La ragione è semplice: RANSAC è una procedura di stima robusta che è stata progettata per trovare le coppie di punti migliori tra molte corrispondenze (incluse alcune errate). Quindi, nel loop interno del RANSAC, viene eseguita una stima dell'omografia standard.

potete vedere RANSAC come un modo per rifiutare corrispondenze tra punti di sbagliato che provocare un cattivo risultato.

Torna al tuo problema:

cosa si ha realmente bisogno è di avere più punti. Nei tuoi esempi, usi solo le corrispondenze in 4 punti, il che è sufficiente per stimare un'omografia. Migliorerai i tuoi risultati fornendo più corrispondenze su tutta l'immagine di destinazione. Il problema diventa quindi eccessivamente determinato, ma una soluzione di minimi quadrati può ancora essere trovata da OpenCV.Inoltre, vi è qualche errore nel processo di corrispondenza dei punti o in qualche punto di localizzazione, RANSAC sarà in grado di selezionare quelli migliori e comunque di darvi un risultato affidabile.

Se RANSAC risulta in un sovradattamento di circa 4 punti (come sembra essere il caso nel tuo esempio), provare a ridurre il vincolo aumentando il parametro ransacReprojThreshold. In alternativa, è possibile:

  • uso uno stimatore diverso (la robusta mediana CV_LMEDS è una buona scelta se ci sono alcuni errori di corrispondenza)
  • o utilizzare RANSAC in una prima fase con un grande errore di riproiezione (a ottenere una stima approssimativa) al fine di rilevare le corrispondenze spurie quindi utilizzare LMED su quelle corrette.
+0

grazie per il tuo feedback. Potrebbe essere che non ho descritto abbastanza chiaramente.In effetti, ho fornito centinaia di punti abbinati a cvFindHomography. Ho scavato nel codice sorgente di ransac in opencv, i quattro punti che ho disegnato sono quelli che il processo di ransac "considera" i risultati migliori (è una sorta di iterazione e ogni volta raccolgono quattro coppie di punti) sfortunatamente, questo non sempre cedere a una buona matrice di omografia anche se le coppie di punti sembrano corrispondere agli occhi umani. – binzhang

+1

mio esperimento mostra: se i punti chiave corrispondenti forniti sono distribuiti tra il centro del rettangolo. Poi se uso l'omografia caculated di trasformare i punti d'angolo del rettangolo, l'errore è grande con il piccolo spostamento della posizione dei punti chiave. Se la posizione dei punti chiave corrispondenti raccolti viene distribuita tra ciascuno dei quattro angoli del rettangolo. Quindi se utilizzo l'omografia per trasformare i punti all'interno del rettangolo, il risultato è corretto. Quindi il mio problema è che se riesco ad ottenere solo i punti chiave abbinati vicino al centro del rettangolo, come posso migliorare le prestazioni? – binzhang

+0

Questo è evidente. Le partite centrali ti faranno errori molto più grandi. Prova a ottenere alcune partite d'angolo. Migliora i tuoi candidati chiave. – SolessChong

3

Giusto per estendere la risposta di @ Sansuiso, con il quale sono d'accordo:

Se si forniscono circa 100 corrispondenze di RANSAC, probabilmente si stanno ottenendo più di 4 inlier da cvFindHomography. Controllare il parametro di uscita status. Per ottenere una buona omografia, dovresti avere più di 4 corrispondenze (nota che 4 corrispondenze ti danno sempre un'omografia), che sono ben distribuite intorno all'immagine e che non sono lineari. Puoi effettivamente utilizzare un numero minimo di inlier per decidere se l'omografia ottenuta è abbastanza buona.

Si noti che RANSAC trova un insieme di punti che sono coerenti, ma il modo in cui deve dire che quel set è il migliore (l'errore di riproiezione) è un po 'limitato. Esiste un metodo simile a RANSAC, chiamato MSAC, che utilizza una misurazione dell'errore leggermente diversa, verificarlo.

La cattiva notizia, secondo la mia esperienza, è che è quasi impossibile ottenere un'omografia di precisione al 100% il più delle volte. Se hai diversi frame simili, è possibile che vedi che l'omografia cambia leggermente tra di loro.

Ci sono trucchi per migliorare questo. Ad esempio, dopo aver ottenuto un'omografia con RANSAC, puoi utilizzarla per proiettare il tuo modello nell'immagine e cercare nuove corrispondenze, in modo da poter trovare un'altra omografia che dovrebbe essere più accurata.

0

Il tuo obiettivo ha molti elementi simmetrici e simili. Come altre persone hanno menzionato (e in seguito chiarito) la spaziatura dei punti e il numero di punti possono essere un problema. Un altro problema è che SIFT non è progettato per gestire distorsioni di prospettiva significative presenti nel tuo caso. Prova a tracciare il tuo oggetto attraverso rotazioni più piccole e, come detto, riproiettalo usando l'ultima omografia per farlo sembrare il più vicino possibile all'originale. Ciò consentirà anche di saltare l'elaborazione di SIFT pesante e di utilizzare qualcosa di leggero come FAST con correlazione incrociata di patch di immagini per la corrispondenza.

Si potrebbe anche arrivare alla conclusione che l'utilizzo dei punti non è sufficiente. Devi usare tutto ciò che hai e questo significa linee o coniche. Se un'omografia trasforma un punto Pb = H * Pa è facile verificare che in coordinate omogenee linea Lb = Henv.transposed * La. Questo segue direttamente dall'equazione La'.Pa = 0 = La '* Hinv * H * Pa = La '* Hinv * Pb = Lb'.Pb Il possibile min. le configurazioni sono 1 linea e tre punti o tre linee e un punto. Due linee e due punti non funzionano. Puoi usare anche quattro linee o quattro punti. Ovviamente questo significa che non è più possibile utilizzare la funzione openCV e scrivere il proprio DLT e quindi l'ottimizzazione non lineare.

Problemi correlati