2010-02-02 12 views
34

Ho una fotocamera che sarà stazionaria, puntata su un'area interna. Le persone passeranno davanti alla telecamera, a circa 5 metri da essa. Usando OpenCV, voglio rilevare le persone che camminano oltre - il mio ritorno ideale è una serie di individui rilevati, con rettangoli di delimitazione.Come posso rilevare e tenere traccia delle persone che usano OpenCV?

Ho guardato molti dei campioni incorporati:

  • Nessuno dei Python campioni valgono davvero
  • Il blob campione di monitoraggio C sembra essere molto promettente, ma non accetta video dal vivo, che rende difficile il test. È anche il più complicato degli esempi, rendendo estraente la conoscenza pertinente e convertendola nell'API Python problematica.
  • Il campione "motempl" C sembra promettente, in quanto calcola una silhouette dai fotogrammi video successivi. Presumibilmente, potrei quindi usarlo per trovare componenti fortemente connessi ed estrarre singoli blob e le loro scatole di delimitazione, ma mi viene comunque lasciato cercare di capire un modo per identificare i blob trovati nei fotogrammi successivi come lo stesso blob.

È chiunque in grado di fornire una guida o campioni per fare questo - preferibilmente in Python?

+2

+1 uno sforzo coraggioso. Interessato a vedere cosa viene fuori. –

+0

@Trent Non sono sicuro che tu sia serio o meno. OpenCV non ha nessuno di questi metodi. –

+0

@Nick Johnson, mi dispiace è stato un brutto tentativo di umorismo. Essere in grado di rilevare e rintracciare le persone in un ambiente reale non è banale. Ci sono molti ostacoli tra cui superare: condizioni di illuminazione variabili, ostacoli, rimozione delle ombre, ecc. – Trent

risposta

27

L'ultima versione SVN di OpenCV contiene un'implementazione (non documentata) del rilevamento dei pedoni basato su HOG. Viene fornito anche con un rilevatore pre-addestrato e un wrapper python. L'uso di base è il seguente:

from cv import * 

storage = CreateMemStorage(0) 
img = LoadImage(file) # or read from camera 

found = list(HOGDetectMultiScale(img, storage, win_stride=(8,8), 
       padding=(32,32), scale=1.05, group_threshold=2)) 

Così, invece di monitoraggio, si potrebbe semplicemente eseguire il rilevatore in ogni fotogramma e utilizzare la sua uscita direttamente.

Vedere src/cvaux/cvhog.cpp per l'implementazione e samples/python/peopledetect.py per un esempio python più completo (entrambi nei sorgenti OpenCV).

1

Questo è simile a un progetto che abbiamo fatto come parte di un corso di Computer Vision, e posso dirvi in ​​questo momento che è un problema difficile avere ragione.

È possibile utilizzare la segmentazione in primo piano/sfondo, trovare tutti i BLOB e quindi decidere di essere una persona. Il problema è che non funzionerà molto bene dato che le persone tendono ad andare insieme, si passano l'un l'altro e così via, quindi un blob potrebbe benissimo consistere di due persone e poi vedrai il blob che si divide e si fonde mentre camminano.

Avrete bisogno di un metodo per discriminare più persone in un blob. Questo non è un problema, mi aspetto che chiunque sia in grado di rispondere in un singolo SO-post.

Il mio consiglio è di entrare nella ricerca disponibile e vedere se riesci a trovare qualcosa lì. Il problema non è irrisolvibile considerando che esistono prodotti che fanno questo: Autoliv ha un prodotto per rilevare i pedoni usando una telecamera IR su un'auto, e ho visto altri prodotti che si occupano di contare i clienti che entrano e escono dai negozi.

+0

In realtà non sono troppo preoccupato di identificare più persone in un "blob" - I'm più interessato a localizzare blocchi di attività e a trovare le loro scatole di delimitazione e centroidi. Speravo che qualcuno sarebbe stato in grado di suggerire semplicemente una sequenza di algoritmi disponibili in OpenCV per lo scopo. :) –

4

Questo è chiaramente un compito non banale. Dovrai esaminare le pubblicazioni scientifiche per l'ispirazione (Google Scholar è tuo amico qui). Ecco un articolo sul rilevamento e il rilevamento degli esseri umani: Human tracking by fast mean shift mode seeking

+0

Come ho commentato, non ho bisogno di determinare che sono umani - Ho solo bisogno di isolare i BLOB in movimento e seguirli. –

5

Nick,

Quello che state cercando non è il rilevamento di persone, ma il rilevamento del movimento. Se ci dici molto di più su ciò che stai cercando di risolvere/fare, possiamo rispondere meglio. Ad ogni modo, ci sono molti modi per fare il rilevamento del movimento a seconda di cosa si intende fare con i risultati. La più semplice sarebbe la differenziazione seguita dalla soglia, mentre una complessa potrebbe essere la corretta modellazione di sfondo -> sottrazione in primo piano -> operazioni morfologiche -> analisi della componente connessa, seguita dall'analisi del blob, se necessario. Scarica il codice opencv e guarda nella directory degli esempi. Potresti vedere cosa stai cercando. Inoltre, c'è un libro di Oreilly su OCV.

Spero che questo aiuti, Nand

Problemi correlati