gpt4 book ai didi

objective-c - 数组分配上的 EXC_BAD_ACCESS(CIDetector featuresInImage)

转载 作者:可可西里 更新时间:2023-11-01 06:16:47 27 4
gpt4 key购买 nike

我正在关注 Pro iOS 5 增强现实书籍中的面部识别应用程序示例。我什至下载了源代码...我从那里运行它,他的代码仍然存在问题。这是问题所在:它在为正在检测面部的 CIDetector 获取 CGImage 的 featuresInImage 的数组分配时崩溃。从日志中...似乎这个方法被调用了很多很多次...我正在使用 cocos2d_chipmunk 所以我正在使用 CSScene。请注意,此崩溃是 EXC_BAD_ACCESS (code=1, address=0x4499923c)请帮忙?

  - (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 但仍然没有成功......有什么想法吗?

最佳答案

在回答评论时(不是整个问题,只是为了格式化而作为答案呈现):
“我该怎么做,我只是写 if 语句来查看它们是否为非零然后记录它吗?”

代替:

  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

关于objective-c - 数组分配上的 EXC_BAD_ACCESS(CIDetector featuresInImage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10160703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com