如何基于webRTC實(shí)現(xiàn)人臉識(shí)別功能
前言
首先我們需要先了解一下什么是webRTC 他能做什么
webRTC主要是幫我們處理多媒體應(yīng)用,如音視頻通話,屏幕共享都可以實(shí)現(xiàn),主要基于瀏覽器API調(diào)用,其底層瀏覽器會(huì)調(diào)用native C++ 等一些庫(kù)幫我們實(shí)現(xiàn)的,而我們?cè)趹?yīng)用層掉API 即可。
桌面程序我們選擇 tauri 而不是 electron
- 體積更小
electron的 架構(gòu)是 將Node.js集成到Chromium中 因此啥也不寫打包完之后體積也有40-50MB 而tauri不在嵌入nodejs + Chromium前端使用webview2渲染,后端和操作系統(tǒng)集成這塊使用rust實(shí)現(xiàn),打包只有3MB。 - 安全方面,
tauri最終在打包之后會(huì)生成二進(jìn)制文件,會(huì)增加破解難度,而electron 打包 會(huì)把node_modules打進(jìn)去,增加了體積,而且沒有加密。 - 自動(dòng)更新 electron 和 tauir 都內(nèi)置了自動(dòng)更新 但是electron還是使用electron-updater 多一些,
tauri相比electron 就簡(jiǎn)單了tauri.app/zh-cn/v1/gu…
詳細(xì)對(duì)比

安裝rust
tauri 是基于 rust 的 我們需要先安裝rust
下載rust www.rust-lang.org/learn/get-s…
根據(jù)自己的操作系統(tǒng)選擇下載方式即可

安裝完成之后會(huì)有 cargo 和 rustc 兩個(gè)命令

cargo 就是 rust 的包管理工具 類似于npm
cargo build 可以構(gòu)建項(xiàng)目
cargo run 可以運(yùn)行項(xiàng)目
cargo test 可以測(cè)試項(xiàng)目
cargo doc 可以為項(xiàng)目構(gòu)建文檔
cargo publish 可以將庫(kù)發(fā)布到 crates.io。
構(gòu)建tauri應(yīng)用
pnpm create tauri-app |
選擇對(duì)應(yīng)的模板即可

構(gòu)建完成之后 執(zhí)行
pnpm tauri dev

App.vue
<template>
<div>
<video controls ref="video" src=""></video>
<button @click="openVideo">開啟攝像頭</button>
</div>
</template>
<script lang="ts" setup>
import { ref, reactive } from 'vue'
const video = ref<HTMLVideoElement>()
const openVideo = () => {
//調(diào)用攝像頭以及音頻
navigator.mediaDevices.getUserMedia({video:true,audio:true}).then(s=>{
video.value!.srcObject = s
})
}
</script>
<style lang="less" scoped>
</style>tips:如果讀不到 mediaDevices 需要增加plist 文件
info.plist 跟 tauri.conf.json 平級(jí)即可
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>NSCameraUsageDescription</key> <string>請(qǐng)?jiān)试S本程序訪問您的攝像頭</string> </dict> </plist>

添加人臉識(shí)別API
模型下載地址 github.com/justadudewh…
face-api 下載地址
npm i face-api.js
<template>
<div>
<video autoplay controls ref="video" src=""></video>
<canvas width="400" height="400" ref="canvas"></canvas>
<button @click="openVideo">開啟攝像頭</button>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import * as faceapi from 'face-api.js';
const video = ref<HTMLVideoElement>()
const canvas = ref<HTMLCanvasElement>()
const models = './models';
(async () => {
await Promise.all([
faceapi.loadAgeGenderModel(models), //加載訓(xùn)練模型
faceapi.loadFaceDetectionModel(models),//加載訓(xùn)練模型
faceapi.loadFaceExpressionModel(models),//加載訓(xùn)練模型
faceapi.loadTinyFaceDetectorModel(models),//加載訓(xùn)練模型
faceapi.loadFaceRecognitionModel(models)//加載訓(xùn)練模型
])
})()
const openVideo = () => {
navigator.mediaDevices.getUserMedia({ video: true, audio: true }).then(async s => {
video.value!.srcObject = s
})
const context = canvas.value?.getContext('2d')
setInterval(async ()=>{
context?.drawImage(video.value as any, 0, 0, 400, 400);
//獲取分析人臉的數(shù)據(jù)
const detections = await faceapi.detectAllFaces(video.value as any, new faceapi.TinyFaceDetectorOptions())
const resizedDetections = faceapi.resizeResults(detections, {width:400,height:400});
//將人臉邊框繪制到canvas上
faceapi.draw.drawDetections(canvas.value as any, resizedDetections)
},100)
}
</script>
<style lang="less" scoped>
</style>
總結(jié)
到此這篇關(guān)于如何基于webRTC實(shí)現(xiàn)人臉識(shí)別的文章就介紹到這了,更多相關(guān)webRTC人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
函數(shù)式 JavaScript(一)簡(jiǎn)介
JavaScript 是一種強(qiáng)大但被誤解的語(yǔ)言。關(guān)于它到底是一種面向?qū)ο蟮恼Z(yǔ)言還是函數(shù)式語(yǔ)言,人們眾說(shuō)紛紜——但是現(xiàn)在讓我們把這些爭(zhēng)辯都拋到腦后。2014-07-07
Clipboard.js 無(wú)需Flash的JavaScript復(fù)制粘貼庫(kù)
這篇文章主要介紹了JavaScript 內(nèi)容復(fù)制(無(wú)需flash) Clipboard.js使用方法,需要的朋友可以參考下2015-10-10
網(wǎng)頁(yè)禁用右鍵實(shí)現(xiàn)代碼(JavaScript代碼)
網(wǎng)頁(yè)禁用右鍵的代碼,我們可以不少網(wǎng)站在使用,讓別人復(fù)制什么的麻煩,但破解方法也比較簡(jiǎn)單。這里就不說(shuō)了,如果想知道的可以參考腳本之家以前發(fā)布的文章。2009-10-10
javascript 初學(xué)教程及五子棋小程序的簡(jiǎn)單實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇javascript 初學(xué)教程及五子棋小程序的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-07-07
js實(shí)現(xiàn)class樣式的修改、添加及刪除的方法
這篇文章主要介紹了js實(shí)現(xiàn)class樣式的修改、添加及刪除的方法,主要通過修改標(biāo)簽的className來(lái)實(shí)現(xiàn)這一功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-01-01
快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題
今天小編就為大家分享一篇快速解決select2在bootstrap模態(tài)框中下拉框隱藏的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-08-08
JavaScript實(shí)現(xiàn)文本目標(biāo)字符替換和一鍵全部替換
這篇文章主要介紹了JavaScript實(shí)現(xiàn)文本目標(biāo)字符替換和一鍵全部替換,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06
javascript基礎(chǔ)進(jìn)階_深入剖析執(zhí)行環(huán)境及作用域鏈
下面小編就為大家?guī)?lái)一篇javascript基礎(chǔ)進(jìn)階_深入剖析執(zhí)行環(huán)境及作用域鏈。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-09-09

