2012-02-02 21 views
10

मैं आईओएस 5 में कोरइमेज के फेस डिटेक्शन का उपयोग करने की कोशिश कर रहा हूं लेकिन यह कुछ भी पता नहीं लगा रहा है। मैं एक छवि है कि बस कैमरे द्वारा कब्जा कर लिया था इस कोड का उपयोग में चेहरे का पता लगाने की कोशिश कर रहा हूँ:आईओएस फेस डिटेक्शन इश्यू

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; 
    NSDictionary *detectorOptions = [[NSDictionary alloc] initWithObjectsAndKeys:CIDetectorAccuracyHigh, CIDetectorAccuracy, nil];  
    CIDetector *faceDetector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; 
    NSArray *features = [faceDetector featuresInImage:image.CIImage]; 
    NSLog(@"Features = %@", features); 
    [self dismissModalViewControllerAnimated:YES]; 
} 

यह संकलित करता है तथा ठीक चलता है, लेकिन यह सुविधाओं सरणी क्या छवि में है की परवाह किए बिना हमेशा खाली है ... किसी भी विचार?

उत्तर

22

मैं अपने @ 14 का उत्तर दे सकते नहीं: 52 टिप्पणी सीधे Vic320, लेकिन मैं चेहरे का पता लगाने के लिए सामने वाला कैमरा के साथ खेल किया गया है - मैं दौर चला गया और सर्कल में गोल करें क्योंकि मुझे अपना चेहरा बिल्कुल चुनने के लिए फ्रंट कैमरा नहीं मिल सका ...

यह घुमाता है कि यह घूर्णन के प्रति बहुत संवेदनशील है - मैंने देखा कि मेरे आईपैड 2 को चित्र में रखते हुए (जैसा कि आप उम्मीद करेंगे फ्रंट कैमरा का उपयोग करके) मुझे 10% से कम मान्यता सटीकता मिल रही थी। एक सनकी पर, इसे किनारे पर बदल दिया और सामने वाले कैमरे के साथ 100% मान्यता प्राप्त कर रही थी।

इस के लिए सरल ठीक आप चित्र में हमेशा सामने कैमरे का उपयोग कर रहे हैं तो यह थोड़ा स्निपेट जोड़ने के लिए है:

NSDictionary* imageOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:6] forKey:CIDetectorImageOrientation]; 
NSArray* features = [detector featuresInImage:image options:imageOptions]; 

6 यही कारण है कि वहाँ डिटेक्टर पोर्ट्रेट मोड में संचालित करने के लिए मजबूर करता है। ऐप्पल के SquareCam नमूना में आपके अभिविन्यास को गतिशील रूप से समझने के लिए आवश्यक होने पर आप किस अभिविन्यास में हैं, यह जानने के लिए नमूना उपयोगिता विधियों का एक पूरा समूह है।

+0

आज भी प्रासंगिक है! बिल्कुल प्रतिभाशाली –

5

ठीक है, यह हमेशा दस्तावेज़ों को पढ़ने के लिए उपयोगी होता है। यूआईएममेज डॉक्स में, सीआईएममेज संपत्ति के तहत यह कहता है: "यदि यूआईएममेज ऑब्जेक्ट को CGImageRef का उपयोग करके प्रारंभ किया गया था, तो संपत्ति का मूल्य शून्य है।" जाहिर है, UIImagePickerController छवि को CGImageRef से प्रारंभ करता है क्योंकि यह संपत्ति वास्तव में शून्य है।

CIImage *ciImage = [CIImage imageWithCGImage:image.CGImage]; 

और इस लाइन को बदलने:

NSArray *features = [faceDetector featuresInImage:ciImage]; 

एक और बड़ा बात मैंने देखा एक अभी भी छवि से कि चेहरे का पता लगाने वास्तव में पर काम नहीं करता है इसके बाद के संस्करण कोड काम करने के लिए, आप जोड़ने की जरूरत सामने वाले कैमरे से कम-रेज छवि! यह हर बार काम करता है जब मैं बैक, हाई-रेज कैमरा का उपयोग करता हूं। शायद एल्गोरिदम उच्च-रेज के लिए ट्यून किया गया है ...

+0

बहुत बहुत धन्यवाद। –

4

निम्नलिखित का प्रयास करें। यह मानते हुए कि आप छवि चर में फोटो लोड:

NSDictionary *options = [NSDictionary dictionaryWithObject: CIDetectorAccuracyLow forKey: CIDetectorAccuracy]; 
      CIDetector *detector = [CIDetector detectorOfType: CIDetectorTypeFace context: nil options: options]; 

     CIImage *ciImage = [CIImage imageWithCGImage: [image CGImage]]; 
     NSNumber *orientation = [NSNumber numberWithInt:[image imageOrientation]+1]; 
     NSDictionary *fOptions = [NSDictionary dictionaryWithObject:orientation forKey: CIDetectorImageOrientation]; 
      NSArray *features = [detector featuresInImage:ciImage options:fOptions]; 
      for (CIFaceFeature *f in features) { 

       NSLog(@"left eye found: %@", (f. hasLeftEyePosition ? @"YES" : @"NO")); 

       NSLog(@"right eye found: %@", (f. hasRightEyePosition ? @"YES" : @"NO")); 

       NSLog(@"mouth found: %@", (f. hasMouthPosition ? @"YES" : @"NO")); 

       if(f.hasLeftEyePosition) 

        NSLog(@"left eye position x = %f , y = %f", f.leftEyePosition.x, f.leftEyePosition.y); 

       if(f.hasRightEyePosition) 

        NSLog(@"right eye position x = %f , y = %f", f.rightEyePosition.x, f.rightEyePosition.y); 

       if(f.hasMouthPosition) 

        NSLog(@"mouth position x = %f , y = %f", f.mouthPosition.x, f.mouthPosition.y); 

      } 
0

जवाब मेरे लिए काम किया उपरोक्त में से कोई (आईओएस 8.4) iPad मिनी & iPad Air 2

मैं robwormald रूप में एक ही अवलोकन किया था। चेहरा पहचान में काम किया जब आईपैड घुमाया गया, तो मैं ciImage :)

जाने ciImage = CIImage घुमाया (CVPixelBuffer: pixelBuffer, विकल्प: संलग्नक) देना कोण = CGFloat (-M_PI/2) जाने rotatedImage = ciImage.imageByApplyingTransform (CGAffineTransformMakeRotation (कोण))

संबंधित मुद्दे