LivenessViewController.m 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. //
  2. // LivenessViewController.m
  3. // IDLFaceSDKDemoOC
  4. //
  5. // Created by 阿凡树 on 2017/5/23.
  6. // Copyright © 2017年 Baidu. All rights reserved.
  7. //
  8. #import "LivenessViewController.h"
  9. #import <IDLFaceSDK/IDLFaceSDK.h>
  10. #import "LivingConfigModel.h"
  11. #import "FaceParameterConfig.h"
  12. @interface LivenessViewController ()
  13. {
  14. }
  15. @property (nonatomic, strong) NSArray * livenessArray;
  16. @property (nonatomic, assign) BOOL order;
  17. @property (nonatomic, assign) NSInteger numberOfLiveness;
  18. @end
  19. @implementation LivenessViewController
  20. - (void)viewDidLoad {
  21. [super viewDidLoad];
  22. // [self setSDKLicense];
  23. [self initLivenessManager];
  24. }
  25. - (void)setSDKLicense {
  26. NSString *licensePath = [[NSBundle mainBundle] pathForResource:FACE_LICENSE_NAME ofType:FACE_LICENSE_SUFFIX];
  27. [[FaceSDKManager sharedInstance] setLicenseID:FACE_LICENSE_ID andLocalLicenceFile:licensePath];
  28. }
  29. - (void)initLivenessManager {
  30. // _livenessArray = @[@0, @1, @2, @5, @6];
  31. _livenessArray = LivingConfigModel.sharedInstance.liveActionArray;
  32. _order = LivingConfigModel.sharedInstance.isByOrder;
  33. _numberOfLiveness = LivingConfigModel.sharedInstance.numOfLiveness; // _livenessArray=nil时有效
  34. [[IDLFaceLivenessManager sharedInstance] livenesswithList:_livenessArray order:_order numberOfLiveness:_numberOfLiveness];
  35. }
  36. - (void)viewWillAppear:(BOOL)animated {
  37. [super viewWillAppear:animated];
  38. [[IDLFaceLivenessManager sharedInstance] startInitial];
  39. }
  40. - (void)viewDidDisappear:(BOOL)animated {
  41. [super viewDidDisappear:animated];
  42. [IDLFaceLivenessManager.sharedInstance reset];
  43. }
  44. - (void)onAppBecomeActive {
  45. [super onAppBecomeActive];
  46. [[IDLFaceLivenessManager sharedInstance] livenesswithList:_livenessArray order:_order numberOfLiveness:_numberOfLiveness];
  47. }
  48. - (void)onAppWillResignAction {
  49. [super onAppWillResignAction];
  50. [IDLFaceLivenessManager.sharedInstance reset];
  51. }
  52. - (void)didReceiveMemoryWarning {
  53. [super didReceiveMemoryWarning];
  54. // Dispose of any resources that can be recreated.
  55. }
  56. - (void)faceProcesss:(UIImage *)image {
  57. if (self.hasFinished) {
  58. return;
  59. }
  60. __weak typeof(self) weakSelf = self;
  61. [[IDLFaceLivenessManager sharedInstance] livenessStratrgyWithImage:image previewRect:self.previewRect detectRect:self.detectRect completionHandler:^(NSDictionary *images, LivenessRemindCode remindCode) {
  62. switch (remindCode) {
  63. case LivenessRemindCodeOK: {
  64. weakSelf.hasFinished = YES;
  65. [self warningStatus:CommonStatus warning:@"非常好"];
  66. NSString *imageString = [images[@"bestImage"] lastObject];
  67. dispatch_async(dispatch_get_main_queue(), ^{
  68. weakSelf.resultHandler(imageString);
  69. [weakSelf closeAction];
  70. });
  71. self.circleView.conditionStatusFit = true;
  72. [self singleActionSuccess:true];
  73. break;
  74. }
  75. case LivenessRemindCodePitchOutofDownRange:
  76. [self warningStatus:PoseStatus warning:@"建议略微抬头" conditionMeet:false];
  77. [self singleActionSuccess:false];
  78. break;
  79. case LivenessRemindCodePitchOutofUpRange:
  80. [self warningStatus:PoseStatus warning:@"建议略微低头" conditionMeet:false];
  81. [self singleActionSuccess:false];
  82. break;
  83. case LivenessRemindCodeYawOutofLeftRange:
  84. [self warningStatus:PoseStatus warning:@"建议略微向右转头" conditionMeet:false];
  85. [self singleActionSuccess:false];
  86. break;
  87. case LivenessRemindCodeYawOutofRightRange:
  88. [self warningStatus:PoseStatus warning:@"建议略微向左转头" conditionMeet:false];
  89. [self singleActionSuccess:false];
  90. break;
  91. case LivenessRemindCodePoorIllumination:
  92. [self warningStatus:CommonStatus warning:@"光线再亮些" conditionMeet:false];
  93. [self singleActionSuccess:false];
  94. break;
  95. case LivenessRemindCodeNoFaceDetected:
  96. [self warningStatus:CommonStatus warning:@"把脸移入框内" conditionMeet:false];
  97. [self singleActionSuccess:false];
  98. break;
  99. case LivenessRemindCodeImageBlured:
  100. [self warningStatus:CommonStatus warning:@"请保持不动" conditionMeet:false];
  101. [self singleActionSuccess:false];
  102. break;
  103. case LivenessRemindCodeOcclusionLeftEye:
  104. [self warningStatus:occlusionStatus warning:@"左眼有遮挡" conditionMeet:false];
  105. [self singleActionSuccess:false];
  106. break;
  107. case LivenessRemindCodeOcclusionRightEye:
  108. [self warningStatus:occlusionStatus warning:@"右眼有遮挡" conditionMeet:false];
  109. [self singleActionSuccess:false];
  110. break;
  111. case LivenessRemindCodeOcclusionNose:
  112. [self warningStatus:occlusionStatus warning:@"鼻子有遮挡" conditionMeet:false];
  113. [self singleActionSuccess:false];
  114. break;
  115. case LivenessRemindCodeOcclusionMouth:
  116. [self warningStatus:occlusionStatus warning:@"嘴巴有遮挡" conditionMeet:false];
  117. [self singleActionSuccess:false];
  118. break;
  119. case LivenessRemindCodeOcclusionLeftContour:
  120. [self warningStatus:occlusionStatus warning:@"左脸颊有遮挡" conditionMeet:false];
  121. [self singleActionSuccess:false];
  122. break;
  123. case LivenessRemindCodeOcclusionRightContour:
  124. [self warningStatus:occlusionStatus warning:@"右脸颊有遮挡" conditionMeet:false];
  125. [self singleActionSuccess:false];
  126. break;
  127. case LivenessRemindCodeOcclusionChinCoutour:
  128. [self warningStatus:occlusionStatus warning:@"下颚有遮挡" conditionMeet:false];
  129. [self singleActionSuccess:false];
  130. break;
  131. case LivenessRemindCodeTooClose:
  132. [self warningStatus:CommonStatus warning:@"手机拿远一点" conditionMeet:false];
  133. [self singleActionSuccess:false];
  134. break;
  135. case LivenessRemindCodeTooFar:
  136. [self warningStatus:CommonStatus warning:@"手机拿近一点" conditionMeet:false];
  137. [self singleActionSuccess:false];
  138. break;
  139. case LivenessRemindCodeBeyondPreviewFrame:
  140. [self warningStatus:CommonStatus warning:@"把脸移入框内" conditionMeet:false];
  141. [self singleActionSuccess:false];
  142. break;
  143. case LivenessRemindCodeLiveEye:
  144. [self warningStatus:CommonStatus warning:@"眨眨眼" conditionMeet:true];
  145. [self singleActionSuccess:false];
  146. break;
  147. case LivenessRemindCodeLiveMouth:
  148. [self warningStatus:CommonStatus warning:@"张张嘴" conditionMeet:true];
  149. [self singleActionSuccess:false];
  150. break;
  151. case LivenessRemindCodeLiveYawRight:
  152. [self warningStatus:CommonStatus warning:@"向右缓慢转头" conditionMeet:true];
  153. [self singleActionSuccess:false];
  154. break;
  155. case LivenessRemindCodeLiveYawLeft:
  156. [self warningStatus:CommonStatus warning:@"向左缓慢转头" conditionMeet:true];
  157. [self singleActionSuccess:false];
  158. break;
  159. case LivenessRemindCodeLivePitchUp:
  160. [self warningStatus:CommonStatus warning:@"缓慢抬头" conditionMeet:true];
  161. [self singleActionSuccess:false];
  162. break;
  163. case LivenessRemindCodeLivePitchDown:
  164. [self warningStatus:CommonStatus warning:@"缓慢低头" conditionMeet:true];
  165. [self singleActionSuccess:false];
  166. break;
  167. case LivenessRemindCodeLiveYaw:
  168. [self warningStatus:CommonStatus warning:@"摇摇头" conditionMeet:true];
  169. [self singleActionSuccess:false];
  170. break;
  171. case LivenessRemindCodeSingleLivenessFinished:
  172. {
  173. [self warningStatus:CommonStatus warning:@"非常好" conditionMeet:true];
  174. [self singleActionSuccess:true];
  175. }
  176. break;
  177. case LivenessRemindCodeVerifyInitError:
  178. [self warningStatus:CommonStatus warning:@"验证失败"];
  179. break;
  180. case LivenessRemindCodeVerifyDecryptError:
  181. [self warningStatus:CommonStatus warning:@"验证失败"];
  182. break;
  183. case LivenessRemindCodeVerifyInfoFormatError:
  184. [self warningStatus:CommonStatus warning:@"验证失败"];
  185. break;
  186. case LivenessRemindCodeVerifyExpired:
  187. [self warningStatus:CommonStatus warning:@"验证失败"];
  188. break;
  189. case LivenessRemindCodeVerifyMissRequiredInfo:
  190. [self warningStatus:CommonStatus warning:@"验证失败"];
  191. break;
  192. case LivenessRemindCodeVerifyInfoCheckError:
  193. [self warningStatus:CommonStatus warning:@"验证失败"];
  194. break;
  195. case LivenessRemindCodeVerifyLocalFileError:
  196. [self warningStatus:CommonStatus warning:@"验证失败"];
  197. break;
  198. case LivenessRemindCodeVerifyRemoteDataError:
  199. [self warningStatus:CommonStatus warning:@"验证失败"];
  200. break;
  201. case LivenessRemindCodeTimeout: {
  202. dispatch_async(dispatch_get_main_queue(), ^{
  203. UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"remind" message:@"超时" preferredStyle:UIAlertControllerStyleAlert];
  204. UIAlertAction* action = [UIAlertAction actionWithTitle:@"知道啦" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
  205. NSLog(@"知道啦");
  206. }];
  207. [alert addAction:action];
  208. UIViewController* fatherViewController = weakSelf.presentingViewController;
  209. [weakSelf dismissViewControllerAnimated:YES completion:^{
  210. [fatherViewController presentViewController:alert animated:YES completion:nil];
  211. }];
  212. });
  213. break;
  214. }
  215. case LivenessRemindCodeConditionMeet: {
  216. self.circleView.conditionStatusFit = true;
  217. }
  218. break;
  219. default:
  220. break;
  221. }
  222. }];
  223. }
  224. - (void)warningStatus:(WarningStatus)status warning:(NSString *)warning conditionMeet:(BOOL)meet
  225. {
  226. [self warningStatus:status warning:warning];
  227. self.circleView.conditionStatusFit = meet;
  228. }
  229. - (void)dealloc
  230. {
  231. }
  232. @end