亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > HTML5 > 正文

基于HTML5+tracking.js實現刷臉支付功能

2024-09-05 07:23:24
字體:
來源:轉載
供稿:網友

最近刷臉支付很火,老板們當然要追趕時代潮流,于是就有了刷臉支付這個項目。前端實現關鍵的技術是攝像頭錄像,拍照和人臉比對,本文來探討一下如何在html5環境中如何實現刷臉支付以及開發過程中遇到的問題。

1.攝像頭1.1input獲取攝像頭

html5中獲取用戶攝像頭,有兩種方式,使用input,如下:

<input type="file" capture="camera" accept="image/*"/>

另外如果想打開相冊,可以這樣:

<input type="file" accept="img/*">

但是這兩種方式都會有兼容性問題,用過的同學可能都知道。

1.2getUserMedia獲取攝像圖

getUserMedia是html5一個新的api,官方一點的定義是:

MediaDevices.getUserMedia()會提示用戶給予使用媒體輸入的許可,媒體輸入會產生一個MediaStream,里面包含了請求的媒體類型的軌道。此流可以包含一個視頻軌道(來自硬件或者虛擬視頻源,比如相機、視頻采集設備和屏幕共享服務等等)、一個音頻軌道(同樣來自硬件或虛擬音頻源,比如麥克風、A/D轉換器等等),也可能是其它軌道類型。

簡單一點說就是可以獲取到用戶攝像頭。

同上面input一樣,這種方式也有兼容性問題,不過可以使用其他方式解決,這里可以參考MediaDevices.getUserMedia(),文檔中有介紹"在舊的瀏覽器中使用新的API"。我這里在網上也找了一些參考,總結出一個相對全面的getUserMedia版本,代碼如下:

// 訪問用戶媒體設備getUserMedia(constrains, success, error) {    if (navigator.mediaDevices.getUserMedia) {        //最新標準API        navigator.mediaDevices.getUserMedia(constrains).then(success).catch(error);    } else if (navigator.webkitGetUserMedia) {        //webkit內核瀏覽器        navigator.webkitGetUserMedia(constrains).then(success).catch(error);    } else if (navigator.mozGetUserMedia) {        //Firefox瀏覽器        navagator.mozGetUserMedia(constrains).then(success).catch(error);    } else if (navigator.getUserMedia) {        //舊版API        navigator.getUserMedia(constrains).then(success).catch(error);    } else {        this.scanTip = "你的瀏覽器不支持訪問用戶媒體設備"    }}

1.3播放視屏

獲取設備方法有兩個回調函數,一個是成功,一個是失敗。成功了就開始播放視頻,播放視屏其實就是給video設置一個url,并調用play方法,這里設置url要考慮不同瀏覽器兼容性,代碼如下:

success(stream) {    this.streamIns = stream    // 設置播放地址,webkit內核瀏覽器    this.URL = window.URL || window.webkitURL    if ("srcObject" in this.$refs.refVideo) {        this.$refs.refVideo.srcObject = stream    } else {        this.$refs.refVideo.src = this.URL.createObjectURL(stream)    }    this.$refs.refVideo.onloadedmetadata = e => {        // 播放視頻        this.$refs.refVideo.play()        this.initTracker()    }},error(e) {    this.scanTip = "訪問用戶媒體失敗" + e.name + "," + e.message}

注意:

  1. 播放視屏方法最好寫在onloadmetadata回調函數中,否則可能會報錯。
  2. 播放視頻的時候出于安全性考慮,必須在本地環境中測試,也就是http://localhost/xxxx中測試,或者帶有https://xxxxx環境中測試,不然的話或有跨域問題。
  3. 下面用到的initTracker()方法也好放在這個onloadedmetadata回調函數里,不然也會報錯。

2. 捕捉人臉

2.1使用tracking.js捕捉人臉

視屏在video中播放成功之后就開始識別人臉了,這里使用到一個第三方的功能tracking.js,是國外的大神寫的JavaScript圖像識別插件。關鍵代碼如下:

// 人臉捕捉initTracker() {    this.context = this.$refs.refCanvas.getContext("2d")    // 畫布    this.tracker = new tracking.ObjectTracker(['face'])     // tracker實例    this.tracker.setStepSize(1.7)                           // 設置步長    this.tracker.on('track', this.handleTracked)            // 綁定監聽方法    try {        tracking.track('#video', this.tracker)      // 開始追蹤    } catch (e) {        this.scanTip = "訪問用戶媒體失敗,請重試"    }}

捕獲到人臉之后,可以在頁面上用一個小方框標注出來,這樣有點交互效果。

// 追蹤事件handleTracked(e) {    if (e.data.length === 0) {        this.scanTip = '未檢測到人臉'    } else {        if (!this.tipFlag) {            this.scanTip = '檢測成功,正在拍照,請保持不動2秒'        }        // 1秒后拍照,僅拍一次        if (!this.flag) {            this.scanTip = '拍照中...'            this.flag = true            this.removePhotoID = setTimeout(() => {                this.tackPhoto()                this.tipFlag = true            }, 2000)        }        e.data.forEach(this.plot)    }}

在頁面中畫一些方框,標識出人臉:

<div class="rect" v-for="item in profile"             :style="{ width: item.width + 'px', height: item.height + 'px', left: item.left + 'px', top: item.top + 'px'}"></div>// 繪制跟蹤框plot({x, y, width: w, height: h}) {    // 創建框對象    this.profile.push({ width: w, height: h, left: x, top: y })}

2.2拍照

拍照,就是使用video作為圖片源,在canvas中保存一張圖片下來,注意這里使用toDataURL方法的時候可以設置第二個參數quality,從0到1,0表示圖片比較粗糙,但是文件比較小,1表示品質最好。

// 拍照tackPhoto() {    this.context.drawImage(this.$refs.refVideo, 0, 0, this.screenSize.width, this.screenSize.height)    // 保存為base64格式    this.imgUrl = this.saveAsPNG(this.$refs.refCanvas)    // this.compare(imgUrl)    this.close()},// Base64轉文件getBlobBydataURI(dataURI, type) {    var binary = window.atob(dataURI.split(',')[1]);    var array = [];    for(var i = 0; i < binary.length; i++) {        array.push(binary.charCodeAt(i));    }    return new Blob([new Uint8Array(array)], {        type: type    });},// 保存為png,base64格式圖片saveAsPNG(c) {    return c.toDataURL('image/png', 0.3)}

拍照完成之后就可以把文件發送給后端,讓后端進行對比驗證,這里后端使用的是阿里云的接口。

3.最后效果

3.1參考代碼demo

最后,demo我已經放在github上了,感興趣可以打開看一下。

效果如下:

3.2在項目中落地

最后放在項目中,無非就是最后一個步驟,去調用接口比對,根據比對結果成功是成功還是失敗,決定是人臉支付還是繼續使用原來的密碼支付,效果如下:

ps:這里人臉比對失敗了,是因為我帶著口罩,就不呲牙露臉了。

總結

到此這篇關于基于HTML5+tracking.js實現刷臉支付功能的文章就介紹到這了,更多相關html5 刷臉支付內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章,希望大家以后多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利一区福利二区微拍刺激| 欧美美女操人视频| 国产精品久久久久不卡| 欧美国产精品va在线观看| 亚洲人成网站色ww在线| 国产亚洲日本欧美韩国| 8x海外华人永久免费日韩内陆视频| 亚洲精品有码在线| 亚洲欧美日韩直播| 51精品国产黑色丝袜高跟鞋| 成人免费视频xnxx.com| 久久久久久久久久久亚洲| 久久国产精品偷| 国产成人精品久久久| 国产精品视频免费在线观看| 好吊成人免视频| 91视频九色网站| 欧美怡春院一区二区三区| 国产日韩精品综合网站| 国产成人精品亚洲精品| 欧美日韩在线免费| 欧美人与性动交| 国产欧美婷婷中文| 久久成人免费视频| 国产成人a亚洲精品| 97精品在线观看| 欧美日韩国产专区| 91av视频在线免费观看| 久久中文字幕视频| 国产精品久久久久久av福利软件| 欧美成在线视频| 亚洲精品日韩丝袜精品| 欧美国产日韩视频| 成人欧美一区二区三区黑人孕妇| 中文字幕无线精品亚洲乱码一区| 午夜精品免费视频| xxxx欧美18另类的高清| 中文字幕亚洲无线码在线一区| 欧美美最猛性xxxxxx| 欧美激情一级欧美精品| 久久久久久91| 亚洲欧洲在线视频| 欧美大尺度激情区在线播放| 69av视频在线播放| 尤物yw午夜国产精品视频明星| 日韩在线激情视频| 26uuu另类亚洲欧美日本老年| 国产成人精品视频在线观看| 欧美成年人视频网站| 成人精品一区二区三区电影黑人| 黄网站色欧美视频| 亚洲图片欧洲图片av| 亚洲伊人成综合成人网| 亚洲aaa激情| 欧美日韩激情网| 久久亚洲精品视频| 中文字幕av一区二区三区谷原希美| 亚洲成人av在线| 久久久久久国产三级电影| 国产亚洲综合久久| 亚洲黄色片网站| 亚洲精品成a人在线观看| 8050国产精品久久久久久| 最新国产精品拍自在线播放| 欧美精品久久久久久久久久| 欧美最猛性xxxxx免费| 欧美国产日韩免费| 国产精品com| 国产精品久久91| 国产精品亚洲自拍| 久久精品欧美视频| 国产综合在线视频| 亚洲国产精品资源| 欧美电影在线观看| 亚洲色在线视频| 国产精品中文久久久久久久| 69视频在线免费观看| 成人午夜激情网| 亚洲网站在线观看| 91久久夜色精品国产网站| 清纯唯美亚洲综合| 欧美中文字幕在线观看| 久久精品久久久久| 亚洲毛片在线观看| 日本欧美黄网站| 性色av一区二区三区在线观看| 日韩精品黄色网| 91在线观看免费网站| 国产成人啪精品视频免费网| 国产成人精品在线| 一区三区二区视频| 久久精品国产亚洲精品2020| 国产亚洲精品91在线| 中文国产亚洲喷潮| 欧美人在线观看| 欧美资源在线观看| 欧美视频裸体精品| 韩日欧美一区二区| 亚洲免费电影在线观看| 亚洲国产私拍精品国模在线观看| 欧美做受高潮1| 91精品国产综合久久久久久蜜臀| 国自在线精品视频| 一区二区国产精品视频| 亚洲一区二区三区sesese| 欧美中文字幕视频在线观看| 66m—66摸成人免费视频| 国产精品视频在线观看| 一区二区欧美在线| 亚洲欧美国产一本综合首页| 国产精品亚洲激情| 奇米影视亚洲狠狠色| 国产精品欧美亚洲777777| 久久久电影免费观看完整版| 91嫩草在线视频| 欧美激情视频三区| 亚洲人成网在线播放| 欧美亚洲日本黄色| 日本a级片电影一区二区| 欧美激情欧美激情在线五月| 成人久久久久久久| 国产精品久久久久久久av电影| 性视频1819p久久| 日韩欧美视频一区二区三区| 日韩高清电影免费观看完整| 亚洲天堂网站在线观看视频| 一本色道久久综合亚洲精品小说| 欧美视频二区36p| 久久综合伊人77777尤物| 日韩在线中文视频| 91精品国产乱码久久久久久蜜臀| 亚洲国产精品视频在线观看| 最好看的2019年中文视频| 亚州精品天堂中文字幕| 全球成人中文在线| 一区二区三区国产视频| 5278欧美一区二区三区| 91社影院在线观看| 日韩电影中文 亚洲精品乱码| 国产国产精品人在线视| 成人亚洲激情网| 91精品中文在线| 久久午夜a级毛片| 亚洲一区二区三区视频播放| 亚洲成人三级在线| 精品视频一区在线视频| 日韩在线观看免费高清完整版| 粉嫩av一区二区三区免费野| 5278欧美一区二区三区| 国模精品视频一区二区三区| 在线午夜精品自拍| 亚洲精品久久久久久久久久久久| 日韩视频精品在线| 日韩欧美亚洲成人| 色偷偷亚洲男人天堂| 亚洲电影免费观看高清完整版| 7777免费精品视频| 久久不射电影网| 91av福利视频| 国产精品国产亚洲伊人久久| 国产精品一区二区电影| 久久精品国产欧美激情| 国产一区二区日韩精品欧美精品| 国产精品高清网站|