总结:使用面部识别来计算手机的距离和角度。
此版本适用于Xcode 6.3。由于Travis-ci正在运行Xcode 6.1.1,构建失败,需要等待Travis-ci将Xcode 6.3作为选项添加时(计划在五月底?)重新通过构建。
更长的演示请见:https://www.youtube.com/watch?v=yLAtc7AzjIk
本月初,我与同事讨论了新的用户交互形式。在移动设备上,现在有许多应用程序正在使用指南针和或加速度计。在游戏机中,使用摄像头与游戏交互非常普遍(例如Xbox Kinect和PlayStation move)。我想如果我们能使用手机的前置摄像头与应用程序交互,那会很好。我必须看看这个想法是否可以实现。
自iOS 5以来,苹果添加了脸部检测API。我的想法是根据检测到的面部大小估计设备与面部的距离。如果检测到的面部矩形很大,则设备靠近您的面部,如果很小,则设备远离您的面部。通过类似的技術,还可以计算设备相对于面部的角度。该角度是根据检测到的面部矩形与屏幕中心之间的距离来计算的。
这里的挑战是连接视频流并在每帧中检测人脸。幸运的是,苹果有一个名为SquareCam的示例项目,使用该项目的代码,可以在每秒大约5帧的速率上检测人脸(在iPhone 4S上)
使用面部跟踪,您可以做一些有趣的事情
'EVFaceTracker'现在通过依赖管理器CocoaPods提供。您可以运行以下命令安装cocoapods:
[sudo] gem install cocoapods
您也可以将EVFaceTracker.m和.h文件复制到您的项目中。
- (void)viewDidLoad {
[super viewDidLoad];
// Start tracking your face.
evFaceTracker = [[EVFaceTracker alloc] initWithDelegate:self];
// And give us a smooth update 10 times per second.
[evFaceTracker fluidUpdateInterval:0.1f withReactionFactor:0.5f];
}
#pragma mark - <EVFaceTrackerDelegate>
// This delegate method is called every time the face recognition has detected something (including change)
- (void)faceIsTracked:(CGRect)faceRect withOffsetWidth:(float)offsetWidth andOffsetHeight:(float)offsetHeight andDistance:(float) distance {
[CATransaction begin];
[CATransaction setAnimationDuration:0.2];
CALayer *layer = dynamicLabel.layer;
layer.masksToBounds = NO;
layer.shadowOffset = CGSizeMake(offsetWidth / 5.0f, offsetHeight / 10.0f);
layer.shadowRadius = 5;
layer.shadowOpacity = 0.5;
[CATransaction commit];
}
// When the fluidUpdateInterval method is called, then this delegate method will be called on a regular interval
- (void)fluentUpdateDistance:(float)distance {
// Animate to the zoom level.
float effectiveScale = distance / 60.0f;
[CATransaction begin];
[CATransaction setAnimationDuration:0.1f];
[dynamicView.layer setAffineTransform:CGAffineTransformMakeScale(effectiveScale, effectiveScale)];
[CATransaction commit];
}