[iOS]CIDetector之CIDetectorTypeFace人脸识别
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib. UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
imageView.image = [UIImage imageNamed:@"timg.jpeg"];
[self.view addSubview:imageView]; CGFloat width = imageView.image.size.width;
CGFloat height = imageView.image.size.height; CGFloat sWidth = imageView.bounds.size.width;
CGFloat sHeight = imageView.bounds.size.height; CGFloat x = width/sWidth;
CGFloat y = height/sHeight; // 根据image修改imageview的frame
if (x > y)
{
imageView.frame = CGRectMake(, (sHeight-height/x)/, sWidth, height/x);
}else{
imageView.frame = CGRectMake((sWidth-width/y)/, , width/y, sHeight);
} // 压缩image
UIGraphicsBeginImageContext(CGSizeMake(imageView.bounds.size.width , imageView.bounds.size.height));
[imageView.image drawInRect:CGRectMake(, , imageView.bounds.size.width, imageView.bounds.size.height)];
UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); imageView.image = scaledImage; //识别
dispatch_async(dispatch_get_global_queue(, ), ^{
CIImage *cImage = [CIImage imageWithCGImage:imageView.image.CGImage];
// 设置识别模式
NSDictionary *opts = [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh
forKey:CIDetectorAccuracy];
/* Lower accuracy, higher performance */
//CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyLow NS_AVAILABLE(10_7, 5_0); /* Lower performance, higher accuracy */
//CORE_IMAGE_EXPORT NSString* const CIDetectorAccuracyHigh NS_AVAILABLE(10_7, 5_0); CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeFace
context:nil
options:opts]; NSArray *features = [detector featuresInImage:cImage]; if ([features count] == )
{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"检测失败");
});
return ;
} for (CIFaceFeature *feature in features)
{
// 是否微笑
BOOL smile = feature.hasSmile; NSLog(smile ? @"微笑" : @"没微笑"); // 眼睛是否睁开
BOOL leftEyeClosed = feature.leftEyeClosed;
BOOL rightEyeClosed = feature.rightEyeClosed; NSLog(leftEyeClosed ? @"左眼没睁开" : @"左眼睁开");
NSLog(rightEyeClosed ? @"右眼没睁开" : @"右眼睁开"); // 获取脸部frame
CGRect rect = feature.bounds;
rect.origin.y = imageView.bounds.size.height - rect.size.height - rect.origin.y;// Y轴旋转180度
faceRect = rect;
NSLog(@"脸 %@",NSStringFromCGRect(rect)); // 左眼
if (feature.hasLeftEyePosition)
{
CGPoint eye = feature.leftEyePosition;
eye.y = imageView.bounds.size.height - eye.y;// Y轴旋转180度
NSLog(@"左眼 %@",NSStringFromCGPoint(eye));
} // 右眼
if (feature.hasRightEyePosition)
{
CGPoint eye = feature.rightEyePosition;
eye.y = imageView.bounds.size.height - eye.y;// Y轴旋转180度
NSLog(@"右眼 %@",NSStringFromCGPoint(eye));
} // 嘴
if (feature.hasMouthPosition)
{
CGPoint mouth = feature.mouthPosition;
mouth.y = imageView.bounds.size.height - mouth.y;// Y轴旋转180度
NSLog(@"嘴 %@",NSStringFromCGPoint(mouth));
}
} dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"检测完成");
UIView *view = [[UIView alloc] initWithFrame:faceRect];
view.backgroundColor = [UIColor blueColor];
view.alpha = 0.3;
[imageView addSubview:view];
});
});
}
关于图片压缩:imageview的大小与image的大小不一致,识别的时候,是按照image的大小进行计算,通过重绘,使imageview与image保持一致。
关于坐标Y轴翻转:屏幕的坐标原点即(0,0)点在左上角,识别图片的坐标原点在左下角。
运行结果
控制台输出结果
[iOS]CIDetector之CIDetectorTypeFace人脸识别的更多相关文章
- 基于iOS用CoreImage实现人脸识别
2018-09-04更新: 很久没有更新文章了,工作之余花时间看了之前写的这篇文章并运行了之前写的配套Demo,通过打印人脸特征CIFaceFeature的属性,发现识别的效果并不是很好,具体说明见文 ...
- 利用iOS原生系统进行人脸识别+自定义滤镜(GPUImage)
人脸识别+滤镜效果(基于GPUImage实现的自定义滤镜) 最近碰到一个好玩的需求.说要客户端这边判定一下是否有人脸.在有的基础上.对相片做进一步的美化滤镜处理. 首先是人脸的识别判定; //将图片对 ...
- iOS 使用百度的人脸识别登录验证,解决认证失败不跳转界面连续认证,认证相似度对比
在使用百度人脸识别出现的问题:小米6调用摄像机是黑白的一个情况,iOS上会出现识别准确性上的问题(多次代开认证,会通过) 人脸识别(活体验证): 1.芝麻认证 : 0.4元/次,需要企业企业认证.不能 ...
- 基于OpenCV的人脸识别[iOS开发笔记(2)]
开始了OpenCV的试水工作了... 1.Get ready 在OpenCV中我们会使用函数cv::CascadeClassifier 来进行人脸检测.但是在使用本函数之前我们需要添加一个XML文件对 ...
- iOS人脸识别(CoreImage)
1.从初始UIImage获取一个CIImage对象. 2.创建一个用于分析对象的CIContext. 3.通过type和options参数创建一个CIDetector实例. type参数指定了要识别的 ...
- 指纹识别人脸识别 iOS
//1.判断iOS8及以后的版本 if([UIDevice currentDevice].systemVersion.doubleValue >= 8.0){ //从iPhone5S开始,出现指 ...
- uniapp安卓ios百度人脸识别、活体检测、人脸采集APP原生插件
插件亮点 1 支持安卓平板(横竖屏均可),苹果的iPad.2 颜色图片均可更换. 特别提醒 此插件包含 android 端和 iOS 端,考虑到有些同学只做其中一个端的 app,特意分为 2 个插件, ...
- 虹软人脸识别iOS SDK2.0
最近公司要在APP上添加一个人脸识别功能,在网上搜了一圈,发现虹软的人脸识别SDK挺好用的,而且还免费,所以就下载了他们的SDK研究了一下.总的来看功能挺好用的,只是demo上面部分功能不是很完善,所 ...
- opencv 人脸识别
背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...
随机推荐
- 爬虫必备—BeautifulSoup
BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. ...
- Angular js部分关键字的理解
模板:动态模板,是动态的,直接去处理DOM的,而不是通过处理字符串模版(静态模板) mvc:核心思想实现"数据管理-数据模型Model.应用逻辑-控制器Controller.数据表现-视图V ...
- selenium元素定位方法
一.如何找到页面元素 Webdriver的findElement方法可以用来找到页面的某个元素,最常用的方法是用id和name查找.下面介绍几种比较常用的方法. 1.1By ID 假设页面写成这样:i ...
- 服务器编程入门(13) Linux套接字设置超时的三种方法
摘要: 本文介绍在套接字的I/O操作上设置超时的三种方法. 图片可能有点宽,看不到的童鞋可以点击图片查看完整图片.. 1 调用alarm 使用SIGALRM为connect设置超时 设置方法: ...
- Python学习---django惰性机制
Django惰性机制 所谓惰性机制:Publisher.objects.all()或者.filter()等都只是返回了一个QuerySet(查询结果集对象),它并不会马上执行sql,而是当调用Quer ...
- August 18th 2017 Week 33rd Friday
If you shed tears when you miss the sun, you also miss the stars. 如果你因为错过太阳而哭泣,你也将会错过繁星. If you have ...
- December 07th 2016 Week 50th Wednesday
Life is a flower, and love is the honey of the flower. 人生是花儿,而爱情就是花的蜜. My life is not as beautiful a ...
- Mac远程连接服务器
方法一:ssh 方法二:command+K进入远程桌面,这种方式类似于windwos下的远程桌面
- TCP/IP 协议图
- [T-ARA][지난 달력][旧挂历]
歌词来源:http://music.163.com/#/song?id=29343994 作曲 : Rocoberry [作曲 : Rocoberry] [作曲 : Rocoberry] 作词 : R ...