<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      HTML5+tracking.js實現(xiàn)刷臉支付

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

      1.攝像頭

      1.1 input獲取攝像頭

      html5中獲取手機上的圖片,有兩種方式,使用input,如下可以打開攝像頭拍照:

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

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

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

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

      1.2 getUserMedia獲取攝像頭

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

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

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

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

      // 訪問用戶媒體設(shè)備
      getUserMedia(constrains, success, error) {
          if (navigator.mediaDevices.getUserMedia) {
              //最新標準API
              navigator.mediaDevices.getUserMedia(constrains).then(success).catch(error);
          } else if (navigator.webkitGetUserMedia) {
              //webkit內(nèi)核瀏覽器
              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 = "你的瀏覽器不支持訪問用戶媒體設(shè)備"
          }
      }

      1.3 播放視屏

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

      success(stream) {
          this.streamIns = stream
          // 設(shè)置播放地址,webkit內(nèi)核瀏覽器
          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回調(diào)函數(shù)中,否則可能會報錯。
      2. 播放視頻的時候出于安全性考慮,必須在本地環(huán)境中測試,也就是http://localhost/xxxx中測試,或者帶有https://xxxxx環(huán)境中測試,不然的話或有跨域問題。
      3. 下面用到的initTracker()方法也好放在這個onloadedmetadata回調(diào)函數(shù)里,不然也會報錯。

      2. 捕捉人臉

      2.1 使用tracking.js捕捉人臉

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

      // 人臉捕捉
      initTracker() {
          this.context = this.$refs.refCanvas.getContext("2d")    // 畫布
          this.tracker = new tracking.ObjectTracker(['face'])     // tracker實例
          this.tracker.setStepSize(1.7)                           // 設(shè)置步長
          this.tracker.on('track', this.handleTracked)            // 綁定監(jiān)聽方法
          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}) {
          // 創(chuàng)建框?qū)ο?/span>
          this.profile.push({ width: w, height: h, left: x, top: y })
      }

      2.2 拍照

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

      // 拍照
      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轉(zhuǎn)文件
      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)
      }

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

      3. 最后效果

      3.1 參考代碼demo

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

      效果如下:

      3.2 在項目中落地

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

      ps:這里人臉比對失敗了,是因為我?guī)е谡郑筒贿谘缆赌樍恕:蠖苏{(diào)用阿里云的接口地址:https://help.aliyun.com/document_detail/154615.html?spm=a2c4g.11186623.6.625.632a37b9brzAoi

       

      posted @ 2020-04-16 14:03  nd  閱讀(11987)  評論(60)    收藏  舉報
      主站蜘蛛池模板: 人妻激情一区二区三区四区| 阿合奇县| 最新亚洲人成网站在线观看| 久热久视频免费在线观看| 男女啪啪高潮激烈免费版| 内射干少妇亚洲69XXX| 精品国产中文字幕在线看| 日本一本正道综合久久dvd| 高清自拍亚洲精品二区| 中日韩黄色基地一二三区| 国产精品自在线拍国产手青青机版| 国产一区日韩二区三区| 亚洲精品精华液一区二区| 福利一区二区在线播放 | 精品无码国产自产拍在线观看蜜| 成人av天堂男人资源站| 亚洲丶国产丶欧美一区二区三区| 国产精品福利一区二区三区| 国产一区二区三区黄色片| 在线免费不卡视频| 波多野结衣一区二区三区高清av| 午夜高清福利在线观看| 五月婷婷激情第四季| 亚洲无人区码二码三码区| 国产明星精品无码AV换脸| 在线看av一区二区三区| 欧美成人aaa片一区国产精品| 日韩精品亚洲专在线电影| 亚洲av无一区二区三区| 亚洲精品无码久久久影院相关影片 | 中文有无人妻vs无码人妻激烈| 一区二区不卡99精品日韩| 丰满少妇高潮在线播放不卡| 国产精品va在线观看无码不卡| 国产办公室秘书无码精品99| 久久精品一本到东京热| 亚洲日本VA午夜在线电影| www插插插无码免费视频网站| 亚洲乱理伦片在线观看中字| 国产免费无遮挡吃奶视频| 91亚洲精品一区二区三区|