2012-11-20 4 views
15

Firma Apple dodała ostatnio nową stałą do klasy CIDetector o nazwie CIDetectorTracking, która wydaje się być w stanie śledzić twarze między klatkami w filmie wideo. Byłoby to dla mnie bardzo korzystne, gdybym mógł wymyślić, jak to działa ..Prawidłowe użycie narzędzia CIDetectorTracking

Próbowałem dodać ten klucz do słownika opcji detektorów za pomocą każdego obiektu, który mogę myśleć o tym, który jest zdalnie istotny, w tym, mój AVCaptureStillImageOutput Przykładowo, UIImage pracuję nad, YES, 1 itd

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

Ale bez względu na to, co parametr staram się przekazać, to albo awarii (oczywiście Zgaduję przy tym tutaj) lub wyjścia debugger :

Nieznany Określono CIDetectorTracking. Ignorowanie.

Zazwyczaj nie zgaduję, ale zasoby na ten temat praktycznie nie istnieją. Apple's class reference stwierdza:

Klawisz używany do włączania i wyłączania śledzenia twarzy detektora. Użyj tej opcji, jeśli chcesz śledzić twarze w klatkach filmu wideo.

Oprócz dostępności systemu iOS 6+ i OS X 10.8+ to wszystko.

Komentarze wewnątrz CIDetector.h:

/* Klucz w opcjach słownik używany do określenia, że ​​funkcja śledzenia powinien być stosowany. */

Jeśli to nie było wystarczająco złe, A Google wyszukiwania zapewnia 7 wyniki (8, gdy ten post), z których wszystkie są albo odniesień Klasa Apple, diffs API, SO odpowiedzieć pytaniem, jak to osiągnąć w iOS 5 lub egzemplarzach byłych stron trzecich.

Wszystko, co zostało powiedziane, wszelkie sugestie i wskazówki dotyczące prawidłowego użytkowania CIDetectorTracking byłyby bardzo docenione!

+0

Po wybraniu opcji TAK, owinąłeś ją w NSNumber? [NSNumber numberWithBool: YES]? Co to jest dziennik awarii? Ten przykład działa z obrazem nieruchomym, ale może być przydatny, jeśli jeszcze go nie widziałeś: http://b2cloud.com.au/how-to-guides/face-detection-in-ios-5 –

+0

@ CharlieMonroe Dziękuję za odpowiedź, próbowałem tego i sądzę, że spowodowało to tę samą awarię. Dokładnie sprawdzę dziennik po powrocie na komputer. Właśnie przejrzałem ten samouczek i nie wierzę, że to pomoże. To dobry samouczek, ale jak powiedziałeś, obejmuje tylko obrazy nieruchome i szukam informacji o śledzeniu twarzy między klatkami przy użyciu klasy wprowadzonej w iOS 6. –

+0

Co to znaczy śledzić twarz w klatkach filmu wideo? Czym różni się to od samodzielnego analizowania każdej klatki? –

Odpowiedz

18

Masz rację, ten klucz nie jest dobrze udokumentowany. Obok docs API jest również nie wyjaśnione:

że próbowała różnych wartości w CIDetectorTracking d jedynymi akceptowanymi wartościami są: @(YES) i @(NO). W przypadku innych wartości drukuje ten komunikat w konsoli:

Nieznany Określono CIDetectorTracking. Ignorowanie.

Po ustawieniu wartości na @(YES) należy uzyskać identyfikatory śledzenia z wykrytymi funkcjami twarzy.


Jeśli jednak chcesz wykryć twarze w treści przechwyconej z kamery, powinieneś preferować API wykrywania twarzy w AVFoundation. Ma wbudowane śledzenie twarzy i wykrywanie twarzy odbywa się w tle na GPU i będzie znacznie szybsze niż wykrywanie twarzy CoreImage. Wymaga iOS 6 i co najmniej iPhone'a 4S lub iPada 2.

Twarz jest wysyłana jako obiekty metadanych (AVMetadataFaceObject) do AVCaptureMetadataOutputObjectsDelegate.

Można użyć tego kodu (wzięte z StacheCam 2 i slajdy sesji WWDC wspomniano powyżej) do wykrywania twarzy konfiguracji i dostać obiekty metadanych twarz:

- (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 
    } 
} 

Jeśli chcesz zobaczyć twarz ramki w warstwie podglądu trzeba uzyskać przekształcony obiekt czołowa:

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

szczegółowe sprawdzić się z sample code from WWDC 2012.

+0

Element faceRectangle zawiera współrzędne .0, czy jest to wartość procentowa obrazu? Co to dokładnie oznacza? –

+1

W dokumentach znajduje się szczegółowe wyjaśnienie: http://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVMetadataObject_Class/Reference/Reference.html#//apple_ref/occ/instp/AVMetadataObject/bounds – Felix

+0

Dla wartości odchylenia i przechylenia nie uzyskuję bardzo dokładnych wyników. Zamiana wynosi zawsze 0, -45 lub 45, a rolka zmienia się stopniowo o 30 stopni. Czy istnieje sposób na uzyskanie bardziej dokładnej wartości? – Liron