【发布时间】:2015-03-14 00:41:30
【问题描述】:
我正在尝试使用CIDetector 制作人脸检测器,只要检测到人脸就会启用按钮。我搜索但找不到的部分是如何使代码在检测到人脸时触发功能。并在人脸离开相机框架时禁用它。
这是我到现在为止的代码:
.h 文件:
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *actionButton;
//Update 2:
@property (weak, nonatomic) IBOutlet UIView *containerView;
- (IBAction)actionButton:(id)sender;
@end
.m 文件:
#import "ViewController.h"
@import AVFoundation;
@interface ViewController () <AVCaptureMetadataOutputObjectsDelegate> {
AVCaptureVideoPreviewLayer *_previewLayer;
AVCaptureSession *_session;
CIDetector *_faceDetector;
CIContext *_ciContext;
}
@end
@implementation SCViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// Create a new AVCaptureSession
_session = [[AVCaptureSession alloc] init];
[_session setSessionPreset:AVCaptureSessionPreset640x480];
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
NSError *error = nil;
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if(input) {
// Add the input to the session
[_session addInput:input];
} else {
NSLog(@"error: %@", error);
return;
}
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
// Have to add the output before setting metadata types
[_session addOutput:output];
// Restrict the output metadata to faces
[output setMetadataObjectTypes:@[AVMetadataObjectTypeFace]];
// This VC is the delegate. Please call us on the main queue
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// Display on screen
_previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:_session];
_previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
_previewLayer.bounds = self.view.bounds;
_previewLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));
// Update 2 change
[self.containerView.layer addSublayer:_previewLayer];
// Hide the button
self.actionButton.hidden = YES;
// Start the AVSession running
[_session startRunning];
}
// Update 1:
- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputMetadataObjects:(NSArray *)metadataObjects
fromConnection:(AVCaptureConnection *)connection
{
for(AVMetadataObject *metadataObject in metadataObjects) {
if([metadataObject.type isEqualToString:AVMetadataObjectTypeFace]) {
self.retakeButton.hidden = NO;
}
}
}
- (IBAction)actionButton:(id)sender {
}
@end
【问题讨论】:
-
你检查过 AVCaptureMetadataOutput 委托方法了吗?
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection这个应该在检测到人脸后调用。这里有更多信息:stackoverflow.com/questions/18995236/… -
我已经添加了建议的功能,但它似乎什么也没做..
-
@BiancaIoana 您可能必须在 UI 线程上执行
self.retakeButton.hidden = NO;。 -
@MateuszSzlosek 进入函数但 self.retakeButton.hidden = NO;不叫
-
请在委托方法中添加
NSLog(@"%@",metadataObjects);并粘贴输出。
标签: ios avfoundation face-detection