2012-11-20 20 views
15

Apple ha recentemente aggiunto una nuova costante alla classe CIDetector denominata CIDetectorTracking che sembra essere in grado di tracciare i volti tra i fotogrammi in un video. Questo sarebbe molto utile per me se potessi riuscire a capire come funziona ..Uso corretto di CIDetectorTracking

Ho provato ad aggiungere questa chiave al dizionario delle opzioni dei rivelatori usando ogni oggetto che posso pensare che sia remotamente rilevante incluso, il mio AVCaptureStillImageOutput esempio, l'UIImage su cui sto lavorando, YES, 1, ecc

NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy,myAVCaptureStillImageOutput,CIDetectorTracking, nil]; 

Ma non importa quale parametro che cerco di passare, sia crash (ovviamente sto cercando di indovinare a qui) o le uscite debugger :

CIDetectorTracking sconosciuto specificato. Ignorando.

Normalmente, non vorrei indovinare, ma le risorse su questo argomento sono praticamente inesistenti. Apple's class reference stati:

Un tasto utilizzato per abilitare o disabilitare il rilevamento del volto per il rilevatore. Usa questa opzione quando vuoi tenere traccia dei volti attraverso i fotogrammi di un video.

A parte la disponibilità di iOS 6+ e OS X 10.8+, questo è tutto.

Commenti all'interno CIDetector.h:

/* La chiave nelle opzioni del dizionario utilizzato per specificare che il tracciamento funzione dovrebbe essere usato. */

Se ciò non bastasse, una ricerca Google fornisce 7 risultati (8 quando trovano questo post) che sono tutti o riferimenti alle classi di Apple, diff API, un SO inviare chiedendo come raggiungere questo obiettivo in iOS 5 o copie di terze parti del primo.

Tutto ciò che viene detto, qualsiasi suggerimento o suggerimento per l'uso corretto di CIDetectorTracking sarebbe molto apprezzato!

+0

Con l'opzione SÌ, è stato inserito in NSNumber? [NSNumber numberWithBool: YES]? Qual è il registro degli arresti anomali? Questo esempio funziona con un'immagine fissa, ma potrebbe essere utile, se non l'hai ancora visto: http://b2cloud.com.au/how-to-guides/face-detection-in-ios-5 –

+0

@ CharlieMonroe Grazie per la tua risposta, l'ho provato, e credo che abbia provocato lo stesso incidente. Controllerò il registro quando tornerò sul mio computer. E ho appena sfogliato quel tutorial e non credo che sarà d'aiuto. È un buon tutorial ma come hai detto copre solo immagini fisse e sto cercando informazioni sul tracciamento facciale tra i fotogrammi utilizzando una classe introdotta in iOS 6. –

+0

Cosa significa tracciare una faccia attraverso i fotogrammi in un video? Come sarebbe diverso dall'analizzare ogni frame da solo? –

risposta

18

Hai ragione, questa chiave non è molto ben documentata. Accanto la documentazione API è anche non spiegato in:

  • il file di intestazione CIDetector.h
  • la Guida Core Image programmazione
  • il WWDC 2012 Sessione "520 - What's New in Camera Capture"
  • il codice di esempio per questa sessione (StacheCam 2)

ho provato diversi valori per un CIDetectorTracking d gli unici valori accettati sembrano essere @(YES) e @(NO). Con altri valori stampa questo messaggio nella console:

CIDetectorTracking sconosciuto specificato. Ignorando.

Quando si imposta il valore su @(YES), è necessario ottenere gli ID di tracciamento con le funzionalità del viso rilevate.


Tuttavia, quando si desidera rilevare i volti nei contenuti acquisiti dalla fotocamera, è preferibile utilizzare l'API di rilevamento dei volti in AVFoundation. È dotato di tracciamento del volto incorporato e il rilevamento del volto avviene in background sulla GPU e sarà molto più veloce rispetto al rilevamento del volto di CoreImage Richiede iOS 6 e almeno un iPhone 4S o iPad 2.

Il quadrante viene inviato come oggetti metadati (AVMetadataFaceObject) allo AVCaptureMetadataOutputObjectsDelegate.

È possibile utilizzare questo codice (tratto da StacheCam 2 e le diapositive della sessione WWDC di cui sopra) per il rilevamento del viso di installazione e ottenere oggetti faccia metadati:

- (void) setupAVFoundationFaceDetection 
{  
    self.metadataOutput = [AVCaptureMetadataOutput new]; 
    if (! [self.session canAddOutput:self.metadataOutput]) { 
     return; 
    } 

    // Metadata processing will be fast, and mostly updating UI which should be done on the main thread 
    // So just use the main dispatch queue instead of creating a separate one 
    // (compare this to the expensive CoreImage face detection, done on a separate queue) 
    [self.metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; 
    [self.session addOutput:self.metadataOutput]; 

    if (! [self.metadataOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeFace]) { 
     // face detection isn't supported (via AV Foundation), fall back to CoreImage 
     return; 
    } 

    // We only want faces, if we don't set this we would detect everything available 
    // (some objects may be expensive to detect, so best form is to select only what you need) 
    self.metadataOutput.metadataObjectTypes = @[ AVMetadataObjectTypeFace ]; 

} 

// AVCaptureMetadataOutputObjectsDelegate 
- (void)captureOutput:(AVCaptureOutput *)captureOutput 
     didOutputMetadataObjects:(NSArray *)metadataObjects 
     fromConnection:(AVCaptureConnection *)c 
{ 
    for (AVMetadataObject *object in metadataObjects) { 
    if ([[object type] isEqual:AVMetadataObjectTypeFace]) { 
     AVMetadataFaceObject* face = (AVMetadataFaceObject*)object; 
     CMTime timestamp = [face time]; 
     CGRect faceRectangle = [face bounds]; 
     NSInteger faceID = [face faceID]; 
     CGFloat rollAngle = [face rollAngle]; 
     CGFloat yawAngle = [face yawAngle]; 
     NSNumber* faceID = @(face.faceID); // use this id for tracking 
     // Do interesting things with this face 
    } 
} 

Se si desidera visualizzare il volto i fotogrammi del livello di anteprima è necessario per ottenere l'oggetto volto trasformato:

AVMetadataFaceObject * adjusted = (AVMetadataFaceObject*)[self.previewLayer transformedMetadataObjectForMetadataObject:face]; 

per i dettagli controllare la sample code from WWDC 2012.

+0

faceRectangle contiene coordinate .0, è qualcosa come le percentuali dell'immagine? Cosa significa esattamente? –

+1

C'è una spiegazione dettagliata nei documenti: http://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVMetadataObject_Class/Reference/Reference.html#//apple_ref/occ/instp/AVMetadataObject/bounds – Felix

+0

Per i valori di imbardata e rollio, non sto ottenendo risultati molto accurati. L'imbardata è sempre 0, -45 o 45, e il rotolo cambia con incrementi di 30 gradi. C'è un modo per ottenere un valore più preciso? – Liron