人脸活体验证控件
介绍
本示例展示了使用视觉类AI能力中的人脸活体验证能力。
本示例模拟了在应用里,跳转人脸活体验证控件,获取到验证结果并展示出来。
需要使用hiai引擎框架人脸活体验证接口@kit.VisionKit.d.ts。
效果预览
使用说明:
- 在手机的主屏幕,点击”faceDetectionDemo“,启动应用。
- 点击“开始检测”按钮,进入人脸检测验证控件。
- 验证结束后返回到主屏幕获取到验证结果并展示出来。
具体实现
本示例展示的控件在@kit.VisionKit.d.ts定义了活体检测API:
/*** Entry to the face liveness detection page.* The security camera needs to apply for network permissions.** @permission ohos.permission.CAMERA* @permission ohos.permission.INTERNET* @param { config } Liveness detection configuration item.* @returns { Promise<boolean> } Result of entering the liveness detection control.* @throws { BusinessError } 1008301002 Route switching failed.* @syscap SystemCapability.AI.Component.LivenessDetect* @atomicservice* @since 5.0.0(12)* */
function startLivenessDetection(config: InteractiveLivenessConfig): Promise<boolean>;/*** Obtains the face and liveness detection result.** @returns { Promise<InteractiveLivenessResult> } The results of the liveness test.* @throws { BusinessError } 1008302000 Detection algorithm initialization.* @throws { BusinessError } 1008302001 Detection timeout.* @throws { BusinessError } 1008302002 Action mutual exclusion error.* @throws { BusinessError } 1008302003 Continuity Check Failure.* @throws { BusinessError } 1008302004 The test is not complete.* @syscap SystemCapability.AI.Component.LivenessDetect* @atomicservice* @since 5.0.0(12)* */
function getInteractiveLivenessResult(): Promise<InteractiveLivenessResult>;
业务使用时,需要先进行import导入interactiveLiveness。 调用进入活体控件接口和验证结果接口,接收处理返回的结果。参考:
import { common, abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
import { interactiveLiveness } from "@kit.VisionKit";
import { BusinessError } from '@kit.BasicServicesKit';@Entry
@Component
struct LivenessIndex {private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;private array: Array<Permissions> = ["ohos.permission.CAMERA"];@State actionsNum: number = 0;@State isSilentMode: string = 'INTERACTIVE_MODE';@State routeMode: string = 'replace';@State resultInfo: interactiveLiveness.InteractiveLivenessResult = {livenessType: 0};@State failResult: Record<string, number | string> = {'code': 1008302000,'message': ''};build() {Stack({alignContent: Alignment.Top}) {Column() {Row() {Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Text('选择模式:').fontSize(18).width('25%')Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Row() {Radio({ value: 'INTERACTIVE_MODE', group: 'isSilentMode' }).checked(true).height(24).width(24).onChange((isChecked: boolean) => {this.isSilentMode = 'INTERACTIVE_MODE'})Text('动作活体检测').fontSize(16)}.margin({ right: 15 })Row() {Radio({ value: 'SILENT_MODE', group: 'isSilentMode' }).checked(false).height(24).width(24).onChange((isChecked: boolean) => {this.isSilentMode = 'SILENT_MODE';})Text('静默活体检测').fontSize(16)}}.width('75%')}}.margin({ bottom: 30 })Row() {Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Text('验证完的跳转模式:').fontSize(18).width('25%')Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Row() {Radio({ value: 'replace', group: 'routeMode' }).checked(true).height(24).width(24).onChange((isChecked: boolean) => {this.routeMode = 'replace'})Text('replace').fontSize(16)}.margin({ right: 15 })Row() {Radio({ value: 'back', group: 'routeMode' }).checked(false).height(24).width(24).onChange((isChecked: boolean) => {this.routeMode = 'back';})Text('back').fontSize(16)}}.width('75%')}}.margin({ bottom: 30 })if (this.isSilentMode == 'INTERACTIVE_MODE') {Row() {Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Text('动作数量:').fontSize(18).width('25%')TextInput({placeholder: this.actionsNum != 0 ? this.actionsNum.toString() : "动作数量最多4个"}).type(InputType.Number).placeholderFont({size: 18,weight: FontWeight.Normal,family: "HarmonyHeiTi",style: FontStyle.Normal}).fontSize(18).fontWeight(FontWeight.Bold).fontFamily("HarmonyHeiTi").fontStyle(FontStyle.Normal).width('65%').onChange((value: string) => {this.actionsNum = Number(value) as interactiveLiveness.ActionsNumber;})}}}}.margin({ left: 24, top: 80 }).zIndex(1)Stack({alignContent: Alignment.Bottom}) {if (this.resultInfo?.mPixelMap) {Image(this.resultInfo?.mPixelMap).width(260).height(260).align(Alignment.Center).rotate({ angle: 270 }).margin({ bottom: 260 })Circle().width(300).height(300).fillOpacity(0).strokeWidth(60).stroke(Color.White).margin({ bottom: 250, left: 0 })}Text(this.resultInfo.mPixelMap ?'检测成功' :this.failResult.code != 1008302000 ?'检测失败' :'').width('100%').height(26).fontSize(20).fontColor('#000000').fontFamily('HarmonyHeiTi').margin({ top: 50 }).textAlign(TextAlign.Center).fontWeight('Medium').margin({ bottom: 240 })if(this.failResult.code != 1008302000) {Text(this.failResult.message as string).width('100%').height(26).fontSize(16).fontColor(Color.Gray).textAlign(TextAlign.Center).fontFamily('HarmonyHeiTi').fontWeight('Medium').margin({ bottom: 200 })}Button("开始检测", { type: ButtonType.Normal, stateEffect: true }).width(192).height(40).fontSize(16).backgroundColor(0x317aff).borderRadius(20).margin({bottom: 56}).onClick(() => {this.privatestartDetection();})}.height('100%')}}onPageShow() {this.resultRelease();this.getDectionRsultInfo();}// 路由跳转到人脸活体验证控件private privaterouterLibrary() {let routerOptions: interactiveLiveness.InteractiveLivenessConfig = {'isSilentMode': this.isSilentMode as interactiveLiveness.DetectionMode,'routeMode': this.routeMode as interactiveLiveness.RouteRedirectionMode,'actionsNum': this.actionsNum}interactiveLiveness.startLivenessDetection(routerOptions).then((DetectState: boolean) => {console.info('LivenessCollectionIndex', `Succeeded in jumping.`);}).catch((err: BusinessError) => {console.error('LivenessCollectionIndex', `Failed to jump. Code:${err.code},message:${err.message}`);})}// 校验CAMERA权限private privatestartDetection() {let res = abilityAccessCtrl.createAtManager().verifyAccessTokenSync(100, "ohos.permission.CAMERA");if (res === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {this.privaterouterLibrary();} else {abilityAccessCtrl.createAtManager().requestPermissionsFromUser(this.context, this.array, (err, res) => {for (let i = 0; i < res.permissions.length; i++) {if (res.permissions[i] === "ohos.permission.CAMERA" && res.authResults[i] === 0) {this.privaterouterLibrary();}}})}}// 获取验证结果private getDectionRsultInfo() {// getInteractiveLivenessResult接口调用完会释放资源let resultInfo = interactiveLiveness.getInteractiveLivenessResult();resultInfo.then(data => {this.resultInfo = data;}).catch((err: BusinessError) => {this.failResult = {'code': err.code,'message': err.message}})}// result releaseprivate resultRelease() {this.resultInfo = {livenessType: 0}this.failResult = {'code': 1008302000,'message': ''}}
}
以上就是本篇文章所带来的鸿蒙开发中一小部分技术讲解;想要学习完整的鸿蒙全栈技术。可以在结尾找我可全部拿到!
下面是鸿蒙的完整学习路线,展示如下:
除此之外,根据这个学习鸿蒙全栈学习路线,也附带一整套完整的学习【文档+视频】,内容包含如下:
内容包含了:(ArkTS、ArkUI、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、鸿蒙南向开发、鸿蒙项目实战)等技术知识点。帮助大家在学习鸿蒙路上快速成长!
鸿蒙【北向应用开发+南向系统层开发】文档
鸿蒙【基础+实战项目】视频
鸿蒙面经
为了避免大家在学习过程中产生更多的时间成本,对比我把以上内容全部放在了↓↓↓想要的可以自拿喔!谢谢大家观看!