2012-04-15 3 views
3

Я следую примеру приложения для распознавания лиц из книги Pro iOS 5 Augmented Reality. Я даже загрузил исходный код ... Я запустил его оттуда, и проблема осталась с его кодом. Вот в чем проблема: он сбой при назначении массива, который принимает функцииInImage CGImage для CIDetector, который обнаруживает лицо. Из регистрации ... кажется, что этот метод называется многими много раз ... Я использую cocos2d_chipmunk, поэтому я использую CSScene. Обратите внимание, что этот сбой - это EXC_BAD_ACCESS (code=1, address=0x4499923c) Помогите пожалуйста?EXC_BAD_ACCESS по распределению массива (CIDetector featuresInImage)

- (void)facialRecognitionRequest:(UIImage *)image { 
//NSLog(@"Image is: %f by %f", image.size.width, image.size.height); 
if (!isProcessingRequest) { 
    isProcessingRequest = YES; 
    //NSLog(@"Detecting Faces"); 
    NSArray* arr = [detector featuresInImage:[CIImage imageWithCGImage:[image CGImage]]]; // CRASHES HERE 


    if ([arr count] > 0) { 
     //NSLog(@"Faces found."); 
     for (int i = 0; i < 1; i++) { //< [arr count]; i++) { 
      CIFaceFeature *feature = [arr objectAtIndex:i]; 
      double xPosition = (feature.leftEyePosition.x + feature.rightEyePosition.x+feature.mouthPosition.x)/(3*image.size.width) ; 
      double yPosition = (feature.leftEyePosition.y + feature.rightEyePosition.y+feature.mouthPosition.y)/(3*image.size.height); 

      double dist = sqrt(pow((feature.leftEyePosition.x - feature.rightEyePosition.x),2)+pow((feature.leftEyePosition.y - feature.rightEyePosition.y),2))/image.size.width; 

      yPosition += dist; 
      CGSize size = [[CCDirector sharedDirector] winSize]; 
      pumpkin.opacity = 255; 
      pumpkin.scale = 5*(size.width*dist)/256.0; 

      //int randomPumpkin = ((arc4random() % 10) + 5); 
      [pumpkin setDisplayFrame:[[CCSpriteFrameCache sharedSpriteFrameCache] spriteFrameByName:[NSString stringWithFormat:@"pumpkin%d.png", pumpkin_count + 4]]]; 
      CCMoveTo *moveAction = [CCMoveTo actionWithDuration:0 position:ccp((size.width * (xPosition)), (size.height * ((yPosition))))]; 
      [pumpkin runAction:moveAction]; 

     } 
    } else { 
     pumpkin.opacity = 0; 

    }  


} 
isProcessingRequest = NO; 

    } 

Назначение CIDetector:

- (id)init { 
if (self = [super init]) { 
    // ....... other stuff here   
    NSDictionary *detectorOptions = [NSDictionary dictionaryWithObjectsAndKeys:CIDetectorAccuracyLow, CIDetectorAccuracy, nil]; 
    self.detector = [CIDetector detectorOfType:CIDetectorTypeFace context:nil options:detectorOptions]; // CIDetector instance named detector is my property 

} 
return self; 
} 

Я попытался: CGImage * theCGImage = [изображение CGImage]; NSLog (@ "theCGImage:% @", theCGImage);

CIImage *theCIImage = [CIImage imageWithCGImage:theCGImage]; 
NSLog(@"theCIImage: %@", theCIImage); 

NSArray* arr = [detector featuresInImage:theCIImage]; 
NSLog(@"arr: %@", arr); 

Вот результаты:

2012-04-15 19:08:25.136 Ch8[981:609f] tmpCGImage: <CGImage 0x1f689c00> 
2012-04-15 19:08:25.143 Ch8[981:609f] tmpCIImage: <CIImage: 0x1f687970 extent [0 0 480 360]> 
2012-04-15 19:08:25.282 Ch8[981:609f] arr: (
"<CIFaceFeatureInternal: 0x1f58e080>" 
) 

Я также попытался позволяет NSZombies, но до сих пор не повезло ... какие-нибудь идеи?

+1

Перерыв разбивающихся линию вниз, в это отдельные биты (т.е.' изображения. .CGImage', '[CIImage imagewithCGImage:' и 'featuresInImage:') и посмотреть, какая из них вызывает проблему. Я подозреваю, что ваше изображение или ваш детектор были освобождены. Используете ли вы ARC? – deanWombourne

+0

Нет. Я не использую ARC. .. но плохо попробуйте, что – MCKapur

+0

Я подозреваю, что вы не сохранили свой детектор достаточно - можете ли вы добавить строку кода, где вы ее создаете, на вопрос? – deanWombourne

ответ

0

В ответ на комментарий (а не весь вопрос, представленный как ответ только для форматирования):
«Как я могу это сделать, просто напишу, если инструкции, чтобы узнать, отличны ли они от нуля, а затем запишите его? "

Вместо:

NSArray* arr = [detector featuresInImage:[CIImage imageWithCGImage:[image CGImage]]]; 

разбить его на три утверждения:

CGImage *theCGImage = [image CGImage]; 
NSLog(@"theCGImage: %@", theCGImage); 

CIImage *theCIImage = [CIImage imageWithCGImage:theCGImage]; 
NSLog(@"theCIImage: %@", theCIImage); 

NSArray* arr = [detector featuresInImage:theCIImage]; 
NSLog(@"arr: %@", arr); 

Так что заявление нарушителя может быть найдено. Это общий метод отладки и не плохой способ написать код в любом случае.

Операторы NSLog на самом деле не нужны, точка останова для первого оператора, а затем один шаг.

Для аварий, вызванных преждевременными выбросами, используется NSZombies. Он может быть включен в Xcode под «Редактировать Схема, вкладки:„Диагностика“, обязательно отключите его при работе на устройстве

enter image description here

+0

посмотри мое отредактированное обновление для результатов – MCKapur

+0

Отлично, что сузило вещи. Потенциально я бы посмотрел на «детектор» и его метод: 'featuresInImage'. Обратите внимание, что доступ к выпущенному объекту не предсказуем. Включите NSZombies, который поможет вам найти проблему. Следите за тем, чтобы «детектор» был правильно сохранен. Если это вообще возможно, используйте ARC. – zaph

+0

no ... все еще deosnt work; (тот же сбой ... lemme делаю еще кое-что, а затем возвращаюсь к u – MCKapur

Смежные вопросы