Я следую примеру приложения для распознавания лиц из книги 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
, но до сих пор не повезло ... какие-нибудь идеи?
Перерыв разбивающихся линию вниз, в это отдельные биты (т.е.' изображения. .CGImage', '[CIImage imagewithCGImage:' и 'featuresInImage:') и посмотреть, какая из них вызывает проблему. Я подозреваю, что ваше изображение или ваш детектор были освобождены. Используете ли вы ARC? – deanWombourne
Нет. Я не использую ARC. .. но плохо попробуйте, что – MCKapur
Я подозреваю, что вы не сохранили свой детектор достаточно - можете ли вы добавить строку кода, где вы ее создаете, на вопрос? – deanWombourne