鴻蒙 NEXT開發中輕松實現人臉識別功能

大家好,我是 V 哥。
今天給大家介紹在 HarmonyOS 原生鴻蒙開發中,實現人臉識別功能,這個功能在常用的 APP 開發中上鏡率還是很高的,在傳統的 Android 或 iOS 開發中,通常我們要借助第三方庫來實現,而在鴻蒙原生開發中,天然的集成了這個功能,使用起來也超級方便,接下來聽 V 哥細細說來。

在鴻蒙 NEXT 中實現人臉識別功能,可通過 CoreVision KitFaceDetector 模塊實現。以下是基于 API 12+ 的實現流程及核心代碼示例:


一、開發準備

  1. 配置權限
    module.json5 中添加以下權限:
   "requestPermissions": [{ "name": "ohos.permission.READ_MEDIA" },       // 讀取圖片權限{ "name": "ohos.permission.CAMERA" },          // 相機權限{ "name": "ohos.permission.ACCESS_BIOMETRIC" } // 生物認證權限]
  1. 導入依賴
    使用鴻蒙 NEXT 的視覺服務接口:
   import { faceDetector } from '@kit.CoreVisionKit';import image from '@kit.ImageKit'; // 圖像處理模塊

二、核心實現步驟

1. 初始化人臉檢測器

// 初始化參數配置
let faceDetectConfig: faceDetector.FaceDetectOptions = {maxFaceNum: 5,         // 最大檢測人臉數featureLevel: faceDetector.FeatureLevel.TYPE_FULL, // 檢測全部特征algorithmMode: faceDetector.AlgorithmMode.TYPE_MODE_ACCURATE // 高精度模式
};// 創建檢測器實例
let detector = faceDetector.createFaceDetector(faceDetectConfig);

2. 獲取圖像數據
通過相機或相冊獲取圖像,轉換為 PixelMap 格式:

// 示例:從相冊選擇圖片并轉換為 PixelMap
async function getImagePixelMap() {let imageSource = image.createImageSource(selectedImageUri);let decodeOptions = {desiredSize: { width: 1024, height: 1024 } // 調整尺寸優化性能};let pixelMap = await imageSource.createPixelMap(decodeOptions);return pixelMap;
}

3. 執行人臉檢測

async function detectFaces(pixelMap: image.PixelMap) {try {// 執行檢測let faces: faceDetector.Face[] = await detector.detect(pixelMap);// 處理檢測結果faces.forEach((face: faceDetector.Face) => {console.log("人臉置信度: " + face.confidence);console.log("人臉坐標框: " + JSON.stringify(face.rect));console.log("五官坐標點: " + JSON.stringify(face.landmarks));});} catch (error) {console.error("人臉檢測失敗: " + error.code + ", 信息: " + error.message);}
}

4. 身份驗證集成

結合生物認證接口驗證機主身份:

import userAuth from '@kit.BiometricAuthenticationKit';// 檢查是否支持人臉識別
let status = userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL3
);
if (status.isAvailable) {// 執行人臉認證userAuth.executeAuth(userAuth.UserAuthType.FACE,userAuth.AuthTrustLevel.ATL3,(err, result) => {if (result?.result === userAuth.AuthResult.SUCCESS) {console.log("身份驗證通過");}});
}

三、以下是一個完整示例代碼

  1. Index.ets 主頁面(示例代碼是使用元服務項目實現)
import { authentication } from '@kit.AccountKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';const DOMAIN = 0x0000;export const pathStack: NavPathStack = new NavPathStack();@Entry
@ComponentV2
struct Index {build() {Navigation(pathStack) {Column({ space: 20 }) {Button("人臉活體檢測-示例").width("80%").borderRadius(10).onClick(() => {pathStack.pushPath({ name: "live" })})}.height('100%').width('100%')}.title("元服務")}aboutToAppear() {hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');this.loginWithHuaweiID();}/*** Sample code for using HUAWEI ID to log in to atomic service.* According to the Atomic Service Review Guide, when a atomic service has an account system,* the option to log in with a HUAWEI ID must be provided.* The following presets the atomic service to use the HUAWEI ID silent login function.* To enable the atomic service to log in successfully using the HUAWEI ID, please refer* to the HarmonyOS HUAWEI ID Access Guide to configure the client ID and fingerprint certificate.*/private loginWithHuaweiID() {// Create a login request and set parametersconst loginRequest = new authentication.HuaweiIDProvider().createLoginWithHuaweiIDRequest();// Whether to forcibly launch the HUAWEI ID login page when the user is not logged in with the HUAWEI IDloginRequest.forceLogin = false;// Execute login requestconst controller = new authentication.AuthenticationController();controller.executeRequest(loginRequest).then((data) => {const loginWithHuaweiIDResponse = data as authentication.LoginWithHuaweiIDResponse;const authCode = loginWithHuaweiIDResponse.data?.authorizationCode;// Send authCode to the backend in exchange for unionID, session}).catch((error: BusinessError) => {hilog.error(DOMAIN, 'testTag', 'error: %{public}s', JSON.stringify(error));if (error.code === authentication.AuthenticationErrorCode.ACCOUNT_NOT_LOGGED_IN) {// HUAWEI ID is not logged in, it is recommended to jump to the login guide page}});}
}
  1. LiveDetectPage.ets 頁面
import { common, abilityAccessCtrl, Permissions } from '@kit.AbilityKit';
import { interactiveLiveness } from '@kit.VisionKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
@Builder export function buildPage(){LiveDetectPage()
}
@Component
export struct LiveDetectPage {private context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;// 權限private array: Array<Permissions> = ["ohos.permission.CAMERA"];// 動作個數@State actionsNum: number = 0;/*** 是否是靜默模式* 靜默模式(SILENT_MODE):表示靜默活體檢測模式,暫未支持。* 交互模式(INTERACTIVE_MODE):表示動作活體檢測模式。*/@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() {NavDestination() {// 層疊布局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: "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 })// 行容器組件Row() {// 彈性布局:主軸方向為橫向,內容對齊方式為起始對齊,垂直方向對齊方式為居中對齊Flex({ direction: FlexDirection.Row, justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {Text("動作數量:").fontSize(18).width("25%")TextInput({placeholder: this.actionsNum != 0 ? this.actionsNum.toString() : "動作數量為3或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) {// 如果存在mPixelMap,則顯示檢測的圖片Image(this.resultInfo?.mPixelMap).width(260).height(260).align(Alignment.Center).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).textAlign(TextAlign.Center).fontFamily("HarmonyHeiTi").fontWeight("Medium").margin({ bottom: 200 })}// 開始檢測的按鈕Button("開始檢測").type(ButtonType.Normal).borderRadius(10).width('60%').height(40).fontSize(16).margin({ bottom: 56 }).onClick(() => {this.privateStartDetection();})}.height("100%")}}.title('活體檢測').onWillShow(() => {// 釋放結果this.resultRelease();// 獲取檢測的結果this.getDetectionResultInfo();})}// 跳轉到人臉活體檢測控件private privateRouterLibrary() {// 交互式活體檢測配置實例let routerOptions: interactiveLiveness.InteractiveLivenessConfig = {// 是否是靜默模式isSilentMode: this.isSilentMode as interactiveLiveness.DetectionMode,// 路由模式:返回還是替換routeMode: this.routeMode as interactiveLiveness.RouteRedirectionMode,// 動作個數actionsNum: this.actionsNum}// 如果可以使用該能力(活體檢測能力)// syscap配置if (canIUse("SystemCapability.AI.Component.LivenessDetect")) {// 開始活體檢測interactiveLiveness.startLivenessDetection(routerOptions).then((DetectState: boolean) => {// 如果檢測成功,則跳轉到下一個頁面hilog.info(0x0001, "LivenessCollectionIndex", `Succeeded in jumping.`);}).catch((err: BusinessError) => {// 如果檢測失敗,則顯示檢測失敗的原因hilog.error(0x0001, "LivenessCollectionIndex", `Failed to jump. Code:${err.code},message:${err.message}`);})} else {// 如果不可以使用該能力(活體檢測能力),則顯示不支持該能力的提示hilog.error(0x0001, "LivenessCollectionIndex", '當前設備不支持活體檢測API');}}/*** 返回從用戶獲取到的權限列表,遍歷該列表,如果包含了ohos.permission.CAMERA權限,則調用privateRouterLibrary方法*/private privateStartDetection() {abilityAccessCtrl.createAtManager().requestPermissionsFromUser(this.context, this.array).then((res) => {for (let i = 0; i < res.permissions.length; i++) {if (res.permissions[i] === "ohos.permission.CAMERA" && res.authResults[i] === 0) {this.privateRouterLibrary();}}}).catch((err: BusinessError) => {hilog.error(0x0001, "LivenessCollectionIndex", `Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);})}/*** 獲取檢測的結果*/private getDetectionResultInfo() {// getInteractiveLivenessResult接口調用完會釋放資源// 如果可以使用活體檢測能力(syscap配置)if (canIUse("SystemCapability.AI.Component.LivenessDetect")) {// 獲取活體檢測結果let resultInfo = interactiveLiveness.getInteractiveLivenessResult();resultInfo.then(data => {// 獲取到結果,則賦值this.resultInfo = data;}).catch((err: BusinessError) => {// 如果發生了異常,則設置失敗結果的字段值this.failResult = { "code": err.code, "message": err.message }})} else {// 當前設備不支持活體檢測能力hilog.error(0x0001, "LivenessCollectionIndex", '該設備不支持活體檢測API。');}}/*** 結果重置*/private resultRelease() {this.resultInfo = {livenessType: 0}this.failResult = {"code": 1008302000,"message": ""}}
}

注意,需要在module.json5中配置權限。

四、注意事項

  1. 真機調試
    需使用支持人臉識別的真機(如 P50 系列)測試,模擬器不支持)。
  2. 性能優化
    • 降低圖像分辨率以提升檢測速度。
    • 使用 AlgorithmMode.TYPE_MODE_FAST 快速模式平衡性能與精度。
  3. 特征比對
    進階場景可通過 FaceComparator 比對兩張人臉相似度。

五、擴展場景

  • 活體檢測:通過 VisionKit 監測眨眼、轉頭動作。
  • 暗光增強:結合 ImageKit 調整圖像亮度/對比度強化識別效果。

通過上述步驟,可快速實現基礎人臉識別功能,并根據需求擴展至復雜場景。


六、小結一下

以上就是在鴻蒙 NEXT 開發中實現人臉識別功能,也稱為活體檢測,通過鴻蒙 NEXT 提供的能力,可以輕松實現,兄弟們,可以抓緊試試(請自備真機測試)。學習鴻蒙可以關注威哥寫的《鴻蒙 HarmonyOS NEXT 開發之路》卷1,卷2已上市,卷3正在加緊印刷中。如果你還沒有拿下鴻蒙認證,快到碗里來(https://developer.huawei.com/consumer/cn/training/classDetail/042cb1cc4d7d44ecbdbd902fd1275dcc)。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94122.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為開發者空間訓練營-優秀作品公布

排名標題總分獎品1手把手教你開發一個地區智能查詢MCP&#xff0c;賦能地理位置類MCP服務的“零輸入”無感交互95華為 freebuds 6i 藍牙耳機2基于華為開發者空間云主機DeepSeek助力電商企業AI海報文案驅動的最佳實踐落地 94華為 freebuds 6i 藍牙耳機32小時基于華為開發者空間和…

基于Python與Tkinter開發的微博多功能自動化助手

文章目錄 摘要 1. 背景與意義 2. 需求分析 3. 核心架構設計 3.1. 技術選型 3.2. 核心思想:UI與邏輯分離的異步架構 4. 深度模塊化剖析 4.1. 微博核心API交互模塊 4.2. 健壯性設計:代理與重試機制 4.3. GUI界面模塊 (WeiboApp 類) 4.4. 異步任務處理模塊 5. 難點分析與解決方案…

效果驅動復購!健永科技RFID牛場智能稱重項目落地

近日&#xff0c;北京某養殖企業持續下單電子耳標識讀器&#xff0c;在牛場智能稱重中落地應用&#xff0c;通過自動、準確地識別牛只并記錄體重數據&#xff0c;顯著提升效率和數據精準度&#xff0c;實現了“效果驅動復購”的良性循環。健永科技RFID技術在北京某養殖企業智能…

計算機網絡:2、TCP和UDP

2、TCP和UDP 簡介 TCP(transmission Control Protocol)&#xff1a;是一種通信標準&#xff0c;它使應用程序和計算設備能夠在網絡上交換消息。它的設計目的是在互聯網上發送數據包&#xff0c;并確保數據和信息在網絡上的成功傳遞。UDP(the User Datagram Protocol)&#xf…

WEB安全篇:瀏覽器攻擊原理及防護

1、XSS&#xff1a;跨站腳本攻擊就是攻擊者想盡一切辦法將可以執行的代碼注入到網頁中。攻擊者在web頁面惡意插入HTML或script標簽&#xff0c;當用戶瀏覽該頁面時&#xff0c;惡意代碼就會被執行&#xff0c;從而達到攻擊的目的。XSS利用的是用戶對指定網站的信任。比如&#…

匯編語言學習2---GNU Debugger (GDB)

學習記錄&#xff0c;在匯編語言 &#xff0c;我們面對的是機器碼&#xff08;以匯編指令形式展現&#xff09;&#xff0c;所以斷點要設置在機器碼被加載到內存中的位置。 GEF插件使用 安裝插件wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/pyecho source ~/.gdbinit-g…

談談架構的內容

一、架構的定義架構是一個界定不清的東西&#xff0c;我們很難講清楚哪些東西是架構&#xff0c;哪些東西不是架構。但軟件行業里其實人人都在搞架構&#xff0c;軟件設計就是架構本身。架構這個詞出現得很早&#xff0c;有些人認為是 NASA&#xff08;也可能是NATO&#xff09…

C#文件(夾)讀取相關(完善中。。。)

前言閱讀項目編輯器的代碼時&#xff0c;發現好多與文件&#xff08;夾&#xff09;路徑相關代碼。本來自己之前對路徑相關的東西就模模糊糊&#xff0c;希望通過這篇筆記能讓自己模糊的地方明朗一下。" / " 與 " \ "你是否有過這樣的疑惑&#xff1a;Wind…

FPGA DP1.4 With DSC解決方案

引言&#xff1a;迎接高清高刷時代的顯示挑戰隨著8K分辨率、高刷新率、HDR和更廣色域內容的普及&#xff0c;傳統視頻接口的帶寬正面臨極限。DisplayPort 1.4標準雖提供了高達32.4 Gbps的帶寬&#xff08;HBR3速率&#xff09;&#xff0c;但要無壓縮地傳輸8K60Hz 10bpp HDR視頻…

新手向:Python開發簡易網絡服務器

Python網絡服務器開發指南&#xff1a;從零開始的完整實現網絡服務器基礎概念網絡服務器是互聯網基礎設施的核心組件&#xff0c;它本質上是一個持續運行的程序&#xff0c;負責監聽特定端口&#xff08;如HTTP服務的80端口或HTTPS的443端口&#xff09;&#xff0c;處理來自客…

819 機器學習-決策樹2

一、決策樹的算法信息增益&#xff1a;某個屬性帶來的熵增1、決策樹三大經典算法? ID3 → 信息增益 信息增益&#xff1a;某個屬性帶來的熵增? C4.5 → 信息增益率 信息增益率&#xff1a;信息增益自身熵? CART → 基尼指數&#xff08;分類&#xff09;&#xff1b;平方誤…

Objective-C 版本的 LiveEventBus 效果

想要 Objective-C 版本的 LiveEventBus 效果&#xff08;跨頁面/跨模塊通信&#xff0c;支持粘性和非粘性事件&#xff09;。在 iOS 里對應的就是 NSNotificationCenter&#xff0c;但是它 默認不支持粘性事件&#xff0c;所以如果你想要“粘性”&#xff0c;需要自己封裝一層。…

WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析七

上一篇&#xff1a;WindowsAPI|每天了解幾個winAPI接口之網絡配置相關文檔Iphlpapi.h詳細分析六 如果有錯誤歡迎指正批評&#xff0c;在此只作為科普和參考。 C:\Program Files (x86)\Windows Kits\10\Include\10.0.22621.0\um\iphlpapi.h 文章目錄CreateIpNetEntry&#xff1…

STM32F407VGT6從零建立一個標準庫工程模板+VSCode或Keil5

一、前言 下載平臺:STM32F407ZGT6 代碼使用平臺:VSCode 編譯器:arm-none-aebi-gcc ---- 默認你已經安裝 程序下載工具:STlink ---- 默認你擁有 批處理工具:make ---- 默認你已經安裝 使用此方法可以不借助其它插件&#xff0c;例如:STM32EIDE。這個方法已經經過驗證可以在STM3…

佩京VR黨建工作站-黨建VR系統-VR黨建展廳

VR黨建工作站是一種依托VR虛擬現實技術的數字化黨建文化學習工具。它通過將豐富的學習內容植入到智慧黨建科技產品中&#xff0c;構建出沉浸式的學習場景&#xff0c;從而創新了體驗式學習模式&#xff0c;促進了黨員的自主學習。VR黨建工作站核心功能&#xff1a;1、了解實時新…

Kotlin 協程之Channel的概念和基本使用

前言 在 專欄 之前的文章中&#xff0c;我們已經知道了協程的啟動、掛起、取消、異常以及常用的協程作用域等基礎應用。 這些基礎應用適合的場景是一次性任務&#xff0c;執行完就結束了的場景。 launch / async 適合的場景 網絡請求數據庫查詢文件讀寫并行計算任務等等 而…

安裝使用Conda

文章目錄Linux安裝 Conda&#xff08;Miniconda 或 Anaconda&#xff09;?Miniconda (輕量版)激活配置Windows安裝配置 Conda?添加清華鏡像源加速創建并激活 Conda 環境驗證步驟?安裝項目依賴運行項目Linux安裝 Conda&#xff08;Miniconda 或 Anaconda&#xff09;? Mini…

面向智能空戰的深度強化學習技術綜述

CSDN大禮包《大模型課程》 CSDN大禮包《深度強化學習課程》 CSDN大禮包《人工智能平臺設計開發課程》

DeepSeek-V3.1 Claude Code: 革命性的AI編碼助手詳解與應用指南

DeepSeek-V3.1 & Claude Code: 革命性的AI編碼助手詳解與應用指南 今天 DeepSeek模型已支持接入 Claude Code&#xff0c;我們來深入探討Claude Code ——Anthropic 推出的一個強大工具。它不僅僅是一個簡單的代碼補全助手&#xff0c;而是一個嵌入終端的智能代理&#xf…

智能求職推薦系統

智能求職推薦系統 基于知識圖譜和大語言模型的智能求職推薦系統&#xff0c;為求職者提供個性化崗位推薦和AI驅動的匹配分析。 &#x1f680; 系統特性 智能推薦: 基于知識圖譜的多維度職位匹配AI分析: 集成DeepSeek大模型提供深度分析和建議可視化展示: 使用ECharts展示推薦結…