2011-09-05 7 views
9

L'obiettivo è visualizzare la persona su uno sfondo diverso (ovvero rimozione dello sfondo).Rimozione dello sfondo con Kinect: soppressione del rumore attorno alla forma del corpo

Sto utilizzando il Kinect con Microsoft Kinect SDK di Microsoft per farlo. Con l'aiuto della profondità, lo sfondo viene filtrato e otteniamo solo l'immagine della persona.

Questo è piuttosto semplice da fare, e possiamo trovare il codice che lo fa ovunque su Internet. Tuttavia, il segnale di profondità è rumoroso e otteniamo pixel che non appartengono alla persona che viene visualizzata.

ho applicato un rilevatore di bordo per vedere se era utile, e attualmente ottenere questo:

Ecco un altro senza rilevamento di fronte:

enter image description here

La mia domanda è: In che modo posso liberarmi di questi pixel bianchi rumorosi intorno alla persona?

Ho provato le operazioni morfologiche, ma alcune parti del corpo sono state cancellate e lasciano ancora dei pixel bianchi dietro.

L'algoritmo non deve essere in tempo reale, posso solo applicarlo quando premo il pulsante 'Salva immagine'.

Edit 1:

ho solo cercato di fare sottrazione di fondo con le cornici più vicini al confine forma. I pixel singoli che vedi sono tremolanti, il che significa che è un rumore e posso facilmente liberarmene.

Edit 2:

Il progetto è ormai finita, e qui è quello che abbiamo fatto: calibrazione manuale del Kinect utilizzando il driver OpenNI, che fornisce direttamente l'immagine a infrarossi. Il risultato è davvero buono, ma ogni calibrazione è specifica per ogni Kinect.

Quindi, abbiamo applicato un po 'di trasparenza sui bordi e il risultato è davvero bello! Non posso fornire immagini, comunque.

+1

È possibile postare l'immagine prima di applicare il rilevatore di bordi? – misha

+1

L'ho appena aggiunto. – wormsparty

+0

puoi condividere il codice – ravithejag

risposta

5

Il tuo problema non è solo il rumore dei pixel bianchi. Ti mancano anche parti significative della persona, ad es. parte della sua mano destra. Consiglierei di essere più prudente con la soglia dei dati di profondità (consentire più falsi positivi). Questo ti darebbe pixel più rumorosi, ma almeno avresti la persona nella sua interezza.

per sbarazzarsi dei pixel rumorosi, mi viene in mente un paio di cose:

  • Feather i pixel esterni (a ridurre di intensità/aumentare la loro trasparenza se si sta utilizzando un canale alfa)
  • Appianare l'immagine, eseguire il rilevamento dei bordi sull'immagine liscia, quindi utilizzare questi bordi con l'immagine nitida originale.
  • Esegui il rilevamento della regione della pelle per contrassegnare le parti che appartengono sicuramente a una persona. Vedi skin detection in the YUV color space? e Skin Color Detection
  • Per i vestiti, lavorare con l'immagine della tonalità e della saturazione. Se conosci il colore della maglietta (o almeno questo non è un colore neutro), allora questo risulterà facilmente. Se non conosci queste informazioni, potrebbe valere la pena costruire un modello della persona che usa gli altri fotogrammi (se c'è un grosso blob grigio che si muove nel tuo video, è probabile che il soggetto abbia una maglietta grigia)

Gli approcci non si escludono a vicenda quindi potrebbe valere la pena provare a farli in combinazione. Se penso ad altro, pubblicherò di nuovo qui.

+0

Grazie, guarderò le tue idee domani. Riguardo alle parti della persona che mancano, non ho il controllo su di esso, dal momento che utilizzo il rilevamento della persona dell'SDK. Anche se ho scritto le mie versioni, questi errori si verificano quando il segnale di profondità è molto rumoroso, come sui bordi del braccio o sui capelli. A volte, in alcune parti della testa ottengo una profondità di 0, che non riesco a recuperare facilmente. – wormsparty

2

Se non c'è altro modo di risolvere il jitter sui bordi, è sempre possibile provare l'anti-alias come post-processo.