您现在的位置是:首页 > 正文

人脸识别活体检测(张嘴摇头识别)

2024-04-01 01:01:11阅读 3

目录

一:简介

二:实现思路分析

根据实现思路分析,一步步进行编码实现:

1. 点击识别按钮,调用相机

2. CameraRules类,检测相机权限

3. 初始化页面,创建摄像页面,创建张嘴数据和摇头数据

4. 开启识别,脸部框识别

5. 脸部部位识别,脸部识别判断是否检测到人脸

6. 检测到人脸之后,判断位置动作提醒

7. 位置判断合适,判断是否张嘴 

8. 张嘴判断完毕,验证是否摇头

9. 摇头判断完毕,3秒倒计时拍照

10. 拍照完毕,选择重拍或者上传图片

11. 选择重拍重复5-9步骤,选择上传将图片数据回调

12. 数据clean

四:讯飞SDK下载及配置

1. SDK下载

2. 添加系统库

3. 设置Bitcode

4. 用户隐私权限配置

五:项目实际使用

1. 下载demo

2. 在项目中引入FBYFaceRecognitionViewController

3. 在项目识别按钮的点击事件中添加代码

4. 图片回调函数

网络安全基础入门需要学习哪些知识?网络安全学习路线这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!


一:简介


最近项目在做了身份证银行卡识别之后,开始实现人脸识别和活体识别,其中人脸识别包括人脸入库、人脸查找、人脸1:N对比、人脸N:N对比,另外活体识别运用在安全登录功能。

大家都熟知的支付宝使用face++ 的服务来实现人脸识别,在实际项目中使用了讯飞的人脸识别SDK进行二次封装来实现活体识别。主要实现了张嘴和摇头两个活体动作的识别。据我所知,讯飞的服务是基于face++,识别率还是很高,并且iOS和Android都对应有封装好的SDK。

在实际运用中,有很多app为了高度保证用户使用的安全问题,除了常规的账号密码登录之外,相继实现了指纹登录,手势登录,第三方登陆(QQ、微信、支付宝)、刷脸登录,接下里我就和大家分享一下如何实现人脸识别的活体检测,这是实现刷脸登录最基础的实现。

另外,这些博文都是来源于我日常开发中的技术总结,在时间允许的情况下,我会针对技术点分别分享iOS、Android两个版本,尽量附上demo以供大家参考,如果有其他技术点需要,可在文章后留言,我会尽全力帮助大家。

二:实现思路分析

点击识别按钮,调用相机2.CameraRules类,检测相机权限3.初始化页面,创建摄像页面,创建张嘴数据和摇头数据4.开启识别,脸部框识别5.脸部部位识别,脸部识别判断是否检测到人脸6.检测到人脸之后,判断位置7.位置判断合适,判断是否张嘴8.张嘴判断完毕,验证是否摇头9.摇头判断完毕,3秒倒计时拍照10.拍照完毕,选择重拍或者上传图片11.选择重拍重复5-9步骤,选择上传将图片数据回调12.数据clean三:实现源码分析


根据实现思路分析,一步步进行编码实现:

1. 点击识别按钮,调用相机

if([CameraRules isCapturePermissionGranted]){[self setDeviceAuthorized:YES];}else{dispatch_async(dispatch_get_main_queue(), ^{NSString* info=@"没有相机权限";[self showAlert:info];[self setDeviceAuthorized:NO];});} 


2. CameraRules类,检测相机权限
 

//检测相机权限
+(BOOL)isCapturePermissionGranted{if([AVCaptureDevice respondsToSelector:@selector(authorizationStatusForMediaType:)]){AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];if(authStatus ==AVAuthorizationStatusRestricted || authStatus ==AVAuthorizationStatusDenied){return NO;}else if(authStatus==AVAuthorizationStatusNotDetermined){dispatch_semaphore_t sema = dispatch_semaphore_create(0);__block BOOL isGranted=YES;[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {isGranted=granted;dispatch_semaphore_signal(sema);}];dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);return isGranted;}else{return YES;}}else{return YES;}
} 


3. 初始化页面,创建摄像页面,创建张嘴数据和摇头数据

 //创建摄像页面,创建张嘴数据和摇头数据[self faceUI];[self faceCamera];[self faceNumber]; 



4. 开启识别,脸部框识别

 float cx = (left+right)/2;float cy = (top + bottom)/2;float w = right - left;float h = bottom - top;float ncx = cy ;float ncy = cx ;CGRect rectFace = CGRectMake(ncx-w/2 ,ncy-w/2 , w, h);if(!isFrontCamera){rectFace=rSwap(rectFace);rectFace=rRotate90(rectFace, faceImg.height, faceImg.width);}BOOL isNotLocation = [self identifyYourFaceLeft:left right:right top:top bottom:bottom];if (isNotLocation==YES) {return nil;} 


5. 脸部部位识别,脸部识别判断是否检测到人脸

 for(id key in keys){id attr=[landmarkDic objectForKey:key];if(attr && [attr isKindOfClass:[NSDictionary class]]){if(!isFrontCamera){p=pSwap(p);p=pRotate90(p, faceImg.height, faceImg.width);}if (isCrossBorder == YES) {[self delateNumber];return nil;}p=pScale(p, widthScaleBy, heightScaleBy);[arrStrPoints addObject:NSStringFromCGPoint(p)];}} 


6. 检测到人脸之后,判断位置动作提醒

 if (right - left < 230 || bottom - top < 250) {self.textLabel.text = @"太远了";[self delateNumber];isCrossBorder = YES;return YES;}else if (right - left > 320 || bottom - top > 320) {self.textLabel.text = @"太近了";[self delateNumber];isCrossBorder = YES;return YES;}else{if (isJudgeMouth != YES) {self.textLabel.text = @"请重复张嘴动作";[self tomAnimationWithName:@"openMouth" count:2];if (left < 100 || top < 100 || right > 460 || bottom > 400) {isCrossBorder = YES;isJudgeMouth = NO;self.textLabel.text = @"调整下位置先";[self delateNumber];return YES;}}else if (isJudgeMouth == YES && isShakeHead != YES) {self.textLabel.text = @"请重复摇头动作";[self tomAnimationWithName:@"shakeHead" count:4];number = 0;}else{takePhotoNumber += 1;if (takePhotoNumber == 2) {[self timeBegin];}}isCrossBorder = NO;} 


7. 位置判断合适,判断是否张嘴
 

if (rightX && leftX && upperY && lowerY && isJudgeMouth != YES) {number ++;if (number == 1 || number == 300 || number == 600 || number ==900) {mouthWidthF = rightX - leftX < 0 ? abs(rightX - leftX) : rightX - leftX;mouthHeightF = lowerY - upperY < 0 ? abs(lowerY - upperY) : lowerY - upperY;NSLog(@"%d,%d",mouthWidthF,mouthHeightF);}else if (number > 1200) {[self delateNumber];[self tomAnimationWithName:@"openMouth" count:2];}mouthWidth = rightX - leftX < 0 ? abs(rightX - leftX) : rightX - leftX;mouthHeight = lowerY - upperY < 0 ? abs(lowerY - upperY) : lowerY - upperY;NSLog(@"%d,%d",mouthWidth,mouthHeight);NSLog(@"张嘴前:width=%d,height=%d",mouthWidthF - mouthWidth,mouthHeight - mouthHeightF);if (mouthWidth && mouthWidthF) { if (mouthHeight - mouthHeightF >= 20 && mouthWidthF - mouthWidth >= 15) {isJudgeMouth = YES;imgView.animationImages = nil;}}} 


8. 张嘴判断完毕,验证是否摇头

if ([key isEqualToString:@"mouth_middle"] && isJudgeMouth == YES) {if (bigNumber == 0 ) {firstNumber = p.x;bigNumber = p.x;smallNumber = p.x;}else if (p.x > bigNumber) {bigNumber = p.x;}else if (p.x < smallNumber) {smallNumber = p.x;} if (bigNumber - smallNumber > 60) {isShakeHead = YES;[self delateNumber];}} 

9. 摇头判断完毕,3秒倒计时拍照

if(timeCount >= 1){self.textLabel.text = [NSStringstringWithFormat:@"%ld s后拍照",(long)timeCount];}else{[theTimer invalidate];theTimer=nil;[self didClickTakePhoto];} 


10. 拍照完毕,选择重拍或者上传图片

-(void)didClickPhotoAgain
{[self delateNumber];[self.previewLayer.session startRunning];self.textLabel.text = @"请调整位置";[backView removeFromSuperview];isJudgeMouth = NO;isShakeHead = NO;} 


11. 选择重拍重复5-9步骤,选择上传将图片数据回调

-(void)didClickUpPhoto
{//上传照片成功[self.faceDelegate sendFaceImage:imageView.image];[self.navigationController popViewControllerAnimated:YES];
} 


12. 数据clean
 

-(void)delateNumber
{number = 0;takePhotoNumber = 0;mouthWidthF = 0;mouthHeightF = 0;mouthWidth = 0;mouthHeight = 0;smallNumber = 0;bigNumber = 0;firstNumber = 0;imgView.animationImages = nil;imgView.image = [UIImage imageNamed:@"shakeHead0"];
} 


四:讯飞SDK下载及配置


1. SDK下载


因为项目中使用到讯飞人脸识别SDK,需要去讯飞开放平台创建应用,下载SDK。


2. 添加系统库


将开发工具包中lib目录下的iflyMSC.framework添加到工程中。同时请将Demo中依赖的其他库也添加到工程中。 按下图示例添加 SDK 所需要的 iOS系统库:


3. 设置Bitcode


在Targets - Build Settings 中搜索Bitcode 即可,找到相应选项,设置为NO,如下图:


4. 用户隐私权限配置


在Info.plist 中增加下图设置:


五:项目实际使用


1. 下载demo


下载demo,将demo中FBYFaceData文件夹引入项目中。

2. 在项目中引入FBYFaceRecognitionViewController


#import "FBYFaceRecognitionViewController.h" 


3. 在项目识别按钮的点击事件中添加代码

-(void)pushToFaceStreamDetectorVC
{FBYFaceRecognitionViewController *faceVC = [[FBYFaceRecognitionViewController alloc]init];faceVC.faceDelegate = self;[self.navigationController pushViewController:faceVC animated:YES];
} 


4. 图片回调函数

-(void)sendFaceImage:(UIImage *)faceImage
{NSLog(@"图片上传成功");
}

- (void)sendFaceImageError {NSLog(@"图片上传失败");
} 

六、网络安全基础入门需要学习哪些知识?


网络安全学习路线
这是一份网络安全从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!


原文链接:https://blog.csdn.net/Galaxy_0/article/details/129096089

免费领取安全学习资料包! 

网站文章

  • c语言链表查,C语言: 链表查询

    c语言链表查,C语言: 链表查询

    满意答案shisanying2016.01.13采纳率:45%等级:10已帮助:725人struct human{char sex[5];char name[10];int age;struct human *next}首先如果已经建好链表的话,就会有一个头指针,假设是 head那么 我只写一部分代码了,相信你学到链表的话其他部分应该不会难倒你int i;char s[10]; //假设...

    2024-04-01 01:01:03
  • 正则表达式总结

    正则表达式//元字符. 换行符以外任意字符\w 字母/数字/下划线/汉字\s 任意空白符\d 数字\b 单词开始和结尾^ 字符串开始$ 字符串结束//字符转义使用\来取消字符的特殊意义//重复* 重复任意次+ 重复一次或多次? 重复零次或一次{n} ...

    2024-04-01 01:00:38
  • 使用双重循环根据用户输入的数字,输出等腰三角形

    public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println(&qu...

    2024-04-01 01:00:35
  • matlab 空间模态,matlab中使用VMD(变分模态分解)

    matlab 空间模态,matlab中使用VMD(变分模态分解)

    使用计算出的IMF绘制多分量信号的希尔伯特频谱。将频率范围限制为[0,40] Hz。分段信号的VMD生成一个由二次趋势,线性调频信号和余弦组成的分段复合信号,在t = 0.5时,两个恒定频率之间会发生急剧过渡 。x(t)= 6t2 + cos(4πt+10πt2)+ {cos(60πt),cos(100πt-10π),t≤0.5,t&gt; 0.5。信号以1 kHz采样1秒。绘制每个单独的分...

    2024-04-01 01:00:28
  • BUUCTF Reverse/特殊的 BASE64

    BUUCTF Reverse/特殊的 BASE64

    BUUCTF Reverse/特殊的 BASE64先看文件信息,没有加壳用IDA64位打开,看题目描述就知道这是base码表做了变换跟进查看base64加密有一个拷贝函数然后下面就是正常的加密了变换过的码表然后找个网站在线自定义base64编解码解出flagflag{Special_Base64_By_Lich}...

    2024-04-01 01:00:03
  • https://download.docker.com/linux/centos/2/x86_64/stable/repodata/repomd.xml: [Errno 14] HTTPS Error

    使用Red Hat7安装docker时报以下错误 https://download.docker.com/linux/centos/2/x86_64/stable/repodata/repomd.xm...

    2024-04-01 00:59:55
  • 设计模式学习笔记(五) - 观察者模式 Observer

    设计模式学习笔记(五) - 观察者模式 Observer

    设计模式学习笔记(五) - 观察者模式 Observer

    2024-04-01 00:59:49
  • 编程必备基础知识|计算机组成原理篇(02):计算机的分类

    编程必备基础知识|计算机组成原理篇(02):计算机的分类

    计算机基础方面的知识,对于一些非科班出身的同学来讲,一直是他们心中的痛,而对于科班出身的同学,很多同学在工作之后,也意识到自身所学知识的不足与欠缺,想回头补补基础知识。关于计算机基础的课程很多,内容繁杂,但无论是相关书籍还是大学课程,都有点脱离工作。特别地,计算机基础知识体系庞杂,想要从零学习或者复习都耗时耗力。有鉴于此,本系列文章将带你更快的补足编程必备基础知识,涵盖计算机领域三大基...

    2024-04-01 00:59:24
  • 命令文件

    vim 设置 在 /etc/vimrc文件中任意行加入命令,可以修改vim打开后的状态,比如显示行号,加下划线等功能。 用户管理 /etc/passwd中显示 1.帐号名称 2.密码 3.uid,4....

    2024-04-01 00:59:17
  • Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。

    Python调用C++ DLL库 ------OSError: [WinError 126] 找不到指定的模块。

    Python调用C++ DLL库 解决Python中 OSError: [WinError 126] 找不到指定的模块 的问题。 一、问题:   在进行Python开发的过程中,很可能遇到调用C++ ...

    2024-04-01 00:59:09