6

Attualmente mi trovo di fronte a un problema piuttosto comune che dovrebbe essere abbastanza facile da risolvere ma finora tutti i miei approcci sono falliti, quindi mi rivolgerò a voi per chiedere aiuto.Approccio di corrispondenza forma/modello in Computer Vision

Penso che il problema sia spiegato meglio con alcune illustrazioni. Ho alcuni modelli come questi due:

Pattern 1 Pattern 3

Ho anche un'immagine come (probabilmente meglio, perché la foto questa origine da era abbastanza scarsamente illuminata) questo:

Picture

(Nota come il modello è stato ridimensionato per adattarsi alla dimensione dell'immagine)

L'obiettivo finale è uno strumento che determina se l'utente mostra un gesto pollice su/pollice in giù e anche alcuni angoli in mezzo. Quindi voglio abbinare i disegni all'immagine e vedere quale assomiglia di più all'immagine (o per essere più precisi, l'angolo che la mano mostra). Conosco la direzione in cui il pollice sta mostrando nel modello, quindi se trovo il modello che sembra identico ho anche l'angolo.

Sto lavorando con OpenCV (con Python Bindings) e ho già provato cvMatchTemplate e MatchShapes ma finora non funziona in modo affidabile.

Posso solo intuire perché MatchTemplate non è riuscito, ma penso che uno schema più piccolo con un bianco più piccolo si adatti perfettamente all'area bianca di un'immagine, creando così il miglior fattore di corrispondenza sebbene sia ovvio che non sembrano proprio uguali.

Ci sono alcuni metodi nascosti in OpenCV che non ho ancora trovato o esiste un algoritmo noto per quei tipi di problemi che dovrei reimplementare?

Buon anno.

risposta

6

alcune semplici tecniche potrebbero lavorare:

  1. Dopo binarizzazione e segmentazione, trovare il diametro di Feret del blob (anche noto come la maggiore distanza tra i punti, o l'asse maggiore).
  2. Trova lo scafo convesso del set di punti, riempilo e trattalo come una regione collegata. Sottrarre l'immagine originale con il pollice. La differenza sarà l'area tra il pollice e il pugno, e la posizione di quell'area rispetto al centro di massa dovrebbe darvi un'indicazione di rotazione.
  3. Utilizzare un algoritmo di spartiacque sulle distanze di ogni punto sul bordo del blob. Questo può aiutare a identificare la regione sottile collegata (il pollice).
  4. Inserire il cerchio più grande (o il più grande poligono inscritto) all'interno del BLOB. Dilatare questo cerchio o poligono fino a quando una frazione del suo bordo si sovrappone allo sfondo. Sottrarre questa figura dilatata dall'immagine originale; rimarrà solo il pollice.
  5. Se la dimensione della mano è consistente (o relativamente consistente), allora è possibile eseguire operazioni di erosione morfologica N fino a quando il pollice scompare, quindi N per dilatare le operazioni per riportare il pugno alla sua dimensione approssimativa originale. Sottrai questo blob di solo pugno dal blob originale per ottenere il blob del pollice. Quindi usa la direzione della bolla del pollice (diametro di Feret) e/o il centro di massa rispetto al centro di massa del blob a pugno per determinare la direzione.

Le tecniche per trovare i punti critici (regioni di forte cambiamento di direzione) sono più complicate. Nel modo più semplice, potresti anche usare i rivelatori d'angolo e poi controllare la distanza da un angolo all'altro per identificare il punto in cui il bordo interno del pollice incontra il pugno.

Per metodi più complessi, consultare documenti sulla decomposizione delle forme di autori come Kimia, Siddiqi e Xiaofing Mi.

1

MatchTemplate sembra una buona misura per il problema che descrivi. In che modo sta fallendo per te? Se in realtà mascherate i simboli pollice su/pollice in giù/pollice in mezzo, come avete mostrato nella vostra immagine di esempio, avete già fatto la parte più difficile.

MatchTemplate non include rotazione e ridimensionamento nello spazio di ricerca, pertanto è necessario generare più modelli dall'immagine di riferimento con tutte le rotazioni che si desidera rilevare e ridimensionare i modelli in modo che corrispondano alle dimensioni generali del trovato segni pollice su/pollice in basso.

[modifica] L'array di risultati per MatchTemplate contiene un valore intero che specifica il livello di adattamento del modello nell'immagine in quella posizione. Se si utilizza CV_TM_SQDIFF, il valore più basso nella matrice di risultati è la posizione migliore, se si utilizza CV_TM_CCORR o CV_TM_CCOEFF, allora è il valore più alto. Se le immagini del modello ridimensionate e ruotate hanno tutti lo stesso numero di pixel bianchi, è possibile confrontare il valore di miglior adattamento che si trova per tutte le diverse immagini del modello e l'immagine del modello che ha la migliore vestibilità complessiva è quella che si desidera selezionare.

Esistono molte funzioni di rilevamento indipendente di rotazione/ridimensionamento che potrebbero essere di aiuto aiuto, ma normalizzare il problema con MatchTemplate è di gran lunga il più semplice.

per la roba più avanzata, controlla SIFT, Haar feature based classifiers, o one of the others available in OpenCV

+0

sì, le immagini fornite sono immagini originali. è solo che, ad esempio, la seconda immagine del modello non ha il miglior valore di corrispondenza se confrontata con l'immagine di esempio. anche quando hanno quasi le stesse dimensioni come nell'immagine. consigliate un metodo matchtemplate speciale (CV_TM_SQDIFF, ...)? qual è il valore che ottengo? errore per l'intera immagine? distanza per pixel (quindi devo dividerlo per la dimensione dell'immagine o qualcosa del genere?) – Nicolas

+0

Ho aggiornato la mia risposta per rispondere alle vostre domande. –

+0

Per una forma "elastica" come un pugno, i modelli di corrispondenza potrebbero non funzionare sempre come si desidera. Rotazione, ridimensionamento e trasformazioni affini non tengono conto della rotazione a tratti e dello stiramento dei singoli componenti. Se una combinazione di tecniche morfologiche e di segmentazione non funziona, prendi in considerazione la ricerca di documenti sulla "decomposizione della forma". – Rethunk

1

Penso che si possono ottenere ottimi risultati se basta calcolare i due punti che hanno il percorso più breve lontano attraversando bianco. La direzione in cui punta il pollice è solo la direzione della linea che unisce i due punti.

È possibile farlo facilmente mediante punti di campionamento nell'area bianca e utilizzando Floyd-Warshall.

+0

Sembra un approccio interessante, ma potresti approfondire ulteriormente? Non capisco cosa intendi per "punti di campionamento sull'area bianca" e come potresti usare un tale algoritmo per i grafici per risolvere il nostro problema – Nicolas

+1

Dai un'occhiata a questo documento, che descrive bene la tecnica: "Classificazione forma usando l'interno -Distance "di Ling e Jacobs www.cs.umd.edu/~djacobs/pubs_files/ID-pami-8.pdf – Rethunk