2014-07-22 26 views
7

Ho lavorato a un progetto autonomo nell'elaborazione delle immagini e nella robotica, dove invece come al solito, rilevando i colori e individuando l'oggetto, tenta di rilevare i fori (simili a diversi poligoni) sulla scheda. Per una migliore comprensione della configurazione qui è un'immagine: enter image description herecome migliorare il rilevamento e l'abbinamento dei punti chiave

Come potete vedere devo rilevare questi buchi, scoprire le loro forme e quindi utilizzare il robot per adattare l'oggetto nei fori. Sto usando una telecamera di profondità kinect per ottenere l'immagine di profondità. Il pic è il seguente:

enter image description here

ero perso nei suoi pensieri su come rilevare i buchi con la fotocamera, inizialmente utilizzando adesivo per rimuovere la porzione di fondo e alcuni della parte in primo piano in base alla misurazione della profondità, ma questo non ha funzionato in quanto, a diversi orientamenti della telecamera, i buchi si fondevano con la scacchiera ... qualcosa di simile all'abitudine (diventa completamente bianco). Poi mi sono imbattuto adaptiveThreshold funzione

adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0); 

Con la rimozione del rumore utilizzando erodere, si dilatano, e sfocatura gaussiana; che ha rilevato i buchi in un modo migliore, come mostrato nella foto qui sotto. Poi ho usato il rilevatore di bordo cvCanny per ottenere i bordi ma finora non è stato buono come mostrato nella foto qui sotto.Dopo questo ho provato vari rilevatori di caratteristiche da SIFT, SURF, ORB, GoodFeaturesToTrack e ho scoperto che ORB ha dato il meglio tempi e le caratteristiche rilevate. Successivamente, ho cercato di ottenere la relativa posa della telecamera di un'immagine di una query trovando i suoi punti chiave e facendo corrispondere quei punti chiave per ottenere buoni risultati per la funzione findHomography. I risultati sono riportati di seguito come nel diagramma:

enter image description here

Alla fine voglio vedere la telecamera relativa posa tra le due immagini e portare il robot che posizione utilizzando i vettori rotazionale e traslazionale ricevuti dal la funzione solvePnP.

Quindi esiste un altro metodo con cui è possibile migliorare la qualità dei fori rilevati per il rilevamento e l'abbinamento dei punti chiave?

avevo provato anche il rilevamento del profilo e approxPolyDP ma le forme approssimate non sono molto buono:

enter image description here

ho provato modificando i parametri d'ingresso di soglia e le funzioni astuti ma questo è il meglio che posso ottenere

Inoltre, è il mio approccio per ottenere la posa della fotocamera corretta?

UPDATE: Non importa quello che ho cercato non ho potuto ottenere buone caratteristiche ripetibili alla mappa. Poi ho letto online che un'immagine di profondità ha una risoluzione economica e viene usata solo per cose come mascherare e ottenere le distanze. Quindi, mi ha colpito il fatto che le caratteristiche non siano corrette a causa dell'immagine a bassa risoluzione con i suoi bordi disordinati. Quindi ho pensato di rilevare le funzioni su un'immagine RGB e di utilizzare l'immagine di profondità per ottenere solo le distanze di tali funzioni. La qualità delle caratteristiche che ho ottenuto sono state letteralmente fuori scala. Ha anche rilevato le viti sulla scheda !! Ecco i punti chiave rilevati utilizzando il rilevamento dei punti chiave GoodFeaturesToTrack. keypoints using GoodFeaturesToTrack. Ho incontrato un altro ostacolo mentre ottenevo la distanza con le distanze dei punti che non uscivano correttamente. Ho cercato le possibili cause e mi è venuto in mente dopo un po 'che c'era un offset nelle immagini RGB e di profondità a causa dell'offset tra le fotocamere. Si può vedere questo dalle prime due immagini. Ho quindi cercato in rete come compensare questo offset ma non sono riuscito a trovare una soluzione funzionante.

Se qualcuno di voi potrebbe aiutarmi a compensare l'offset, sarebbe fantastico!

UPDATE: non ho potuto fare un buon uso della funzione goodFeaturesToTrack. La funzione fornisce gli angoli in tipo Point2f. Se si desidera calcolare i descrittori, sono necessari i punti chiave e la conversione di Point2f in Keypoint con il frammento di codice sottostante porta alla perdita di scala e all'invarianza di rotazione.

for(size_t i = 0; i < corners1.size(); i++) 
{ 
keypoints_1.push_back(KeyPoint(corners1[i], 1.f)); 
} 

Il risultato ripugnante dall'abbinamento funzione seguito è mostrata loss of invariance.

Devo iniziare ora su diverse corrispondenze di funzionalità. Pubblicherò ulteriori aggiornamenti. Sarebbe davvero utile se qualcuno potesse aiutare a rimuovere il problema di offset.

+0

Ecco resto delle immagini http://www.hostingpics.net/viewer.php ? id = 764686img3.jpg (questa è l'immagine di profondità). – SidJaw

+0

questa è l'immagine con soglia adattativa http://www.hostingpics.net/viewer.php?id=468584adapthresh.png. questa è l'immagine di approxpolyDP http://www.hostingpics.net/viewer.php?id=196889coo.png E chiunque potrebbe essere così gentile da revocare la mia domanda perché ho bisogno di almeno 10 reputazione per pubblicare immagini. – SidJaw

+0

Perché non provi la corrispondenza dei modelli poiché conosci già la forma dei fori su cui il robot deve adattarsi. Nota: la corrispondenza dei modelli non funzionerà correttamente se la dimensione dell'oggetto varia. cioè se la dimensione del rettangolo varia in schede diverse o quando si ingrandisce/rimpicciolisce ecc. – Darshan

risposta

0

Compensare la differenza tra uscita dell'immagine e il mondo coordinate:

Si dovrebbe usare buon approccio vecchio calibrazione della camera per calibrare la risposta della fotocamera e possibilmente generare una matrice di correzione per l'uscita della telecamera (per convertirli in real bilancia).

Non è complicato una volta stampato un modello a scacchiera e catturato vari scatti. (Per questa applicazione non è necessario preoccuparsi di rotazione invarianza Proprio calibrare la visione del mondo con la matrice dell'immagine..)

È possibile trovare maggiori informazioni qui: http://www.vision.caltech.edu/bouguetj/calib_doc/htmls/own_calib.html

-

Ora, poiché Non riesco a commentare la domanda, vorrei chiedere se la tua specifica applicazione richiede alla macchina di "scoprire" la forma del foro al volo. Se sono presenti quantità limitate di forme di fori, è possibile modellarle matematicamente e cercare i pixel che supportano i modelli predefiniti sull'immagine del bordo B/N.

Ad esempio (x)^2 + (y)^2-r^2 = 0 per un cerchio con raggio r, mentre x e y sono le coordinate dei pixel.

Ciò detto, credo che siano necessari ulteriori chiarimenti in merito ai requisiti dell'applicazione (rilevamento della forma).

+0

Ciao. Grazie per la tua risposta. Ma ho già ottenuto le matrici di coefficiente intrinseco e di distorsione della fotocamera attraverso la calibrazione della fotocamera. Sono perso in quello che devo fare dopo. – SidJaw

+0

Ciao, non so se è appropriato chiedere aggiornamenti qui, ma hai progredito finora? – ahmet

0

Se si rilevano forme specifiche come quelle nell'immagine fornita, è meglio usare un classificatore. Immergiti nei classificatori di Haar, o ancora meglio, guarda in Bag of Words.

Utilizzando BoW, è necessario formare un gruppo di set di dati, composto da campioni positivi e negativi. I campioni positivi conterranno N campioni unici di ogni forma che si desidera rilevare. È meglio se N sia> 10, meglio se> 100 e altamente variante e unico, per un buon allenamento di classificatore robusto.

I campioni negativi dovrebbero (ovviamente) contenere elementi che non rappresentano le forme in alcun modo. Serve solo a verificare la precisione del classificatore.

Inoltre, una volta addestrato il classificatore, è possibile distribuire i dati del classificatore (ad esempio, si supponga di utilizzare SVM).

Ecco alcuni link per iniziare con il sacchetto di parole: https://gilscvblog.wordpress.com/2013/08/23/bag-of-words-models-for-visual-categorization/

codice di esempio: http://answers.opencv.org/question/43237/pyopencv_from-and-pyopencv_to-for-keypoint-class/