最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue2如何使用face-api.js實(shí)現(xiàn)人臉識(shí)別功能

 更新時(shí)間:2024年09月27日 15:11:45   作者:劉小白plus  
本文介紹了如何在Vue.js項(xiàng)目中利用face-api.js實(shí)現(xiàn)人臉識(shí)別功能,首先需要安裝Vue.js和face-api.js以及其依賴(lài)TensorFlow.js,接著,下載并配置必要的模型文件到項(xiàng)目目錄,之后,將人臉識(shí)別功能封裝成Vue組件,并在組件中通過(guò)視頻流進(jìn)行人臉檢測(cè)和結(jié)果展示

由于開(kāi)發(fā)需求要實(shí)現(xiàn)人臉識(shí)別,順便在此記錄一下,希望給各位前端愛(ài)好者帶來(lái)幫助。

1、安裝依賴(lài)

        首先,確保你已經(jīng)安裝了Vue.js,并且創(chuàng)建了一個(gè)Vue項(xiàng)目。然后,安裝face-api.js及其相關(guān)依賴(lài)。由于face-api.js依賴(lài)于TensorFlow.js,你可能還需要安裝這個(gè)庫(kù)??梢酝ㄟ^(guò)npm或yarn來(lái)安裝:

npm install face-api.js

這是我安裝的版本

2、下載模型文件

face-api.js需要一些預(yù)先訓(xùn)練好的模型文件來(lái)執(zhí)行人臉檢測(cè)和識(shí)別。你需要從GitHub倉(cāng)庫(kù)中下載這些文件,并放置在項(xiàng)目的public目錄下,或者配置一個(gè)正確的路徑指向這些文件??梢詮?a rel="external nofollow" target="_blank" title="face-api.js的GitHub頁(yè)面">face-api.js的GitHub頁(yè)面下載模型。

  • 在這個(gè)頁(yè)面上,你會(huì)看到多個(gè)模型文件,例如 ssd_mobilenetv1_model-weights_manifest.jsonface_landmark_68_model-weights_manifest.json 等。為了使用 face-api.js 的不同功能,如人臉檢測(cè)、特征點(diǎn)定位、表情識(shí)別等,你需要下載相應(yīng)的模型文件。
  • 你可以手動(dòng)下載,也可以直接克隆,你也可以私聊我一下我給你發(fā)。
git clone https://github.com/justadudewhohacks/face-api.js.git

    3.克隆完之后你需要把模型文件放到 public下的models沒(méi)有models自己創(chuàng)建,你也可以自己規(guī)定路徑,只要路徑正確就行。

到此準(zhǔn)備工作就做完了,當(dāng)然你需要配置好vue框架。

3、封裝組件

        為了更好地組織代碼并使其可復(fù)用,我們可以將人臉識(shí)別的功能封裝成一個(gè)Vue組件。下面是一個(gè)更完善的示例,展示了如何創(chuàng)建一個(gè)名為FaceRecognition.vue的自定義組件,該組件負(fù)責(zé)處理視頻流、人臉檢測(cè)、以及展示檢測(cè)結(jié)果。完整代碼塊在這

<template>
  <div class="face-recognition">
    <video ref="video" width="640" height="480" autoplay></video>
    <canvas ref="canvas" width="640" height="480"></canvas>
    <div>當(dāng)前人流量:{{ peopleCount }}</div>
  </div>
</template>
<script>
import * as faceapi from 'face-api.js';
export default {
  name: 'FaceRecognition',
  data() {
    return {
      isLoaded: false,
      lastDetections: [], // 上一幀檢測(cè)到的人臉
      peopleCount: 0, // 當(dāng)前人流量計(jì)數(shù)
    };
  },
  mounted() {
    this.loadModels();
  },
  methods: {
    async loadModels() {
      try {
        await Promise.all([
          faceapi.nets.faceRecognitionNet.loadFromUri('/models'),
          faceapi.nets.faceLandmark68Net.loadFromUri('/models'),
          faceapi.nets.ssdMobilenetv1.loadFromUri('/models'),
        ]);
        this.isLoaded = true;
        this.startVideo();
      } catch (error) {
        console.error('Failed to load models:', error);
      }
    },
    startVideo() {
      if (navigator.mediaDevices && this.isLoaded) {
        navigator.mediaDevices.getUserMedia({ video: true })
          .then(stream => {
            this.$refs.video.srcObject = stream;
            this.$refs.video.onloadedmetadata = () => {
              this.detectFaces();
            };
          })
          .catch(error => console.error('getUserMedia error:', error));
      }
    },
    async detectFaces() {
      const video = this.$refs.video;
      const canvas = this.$refs.canvas;
      const ctx = canvas.getContext('2d');
      const detectionOptions = new faceapi.SsdMobilenetv1Options({ minConfidence: 0.9 });
      let recentDetections = [];
      const detectionHistoryLength = 5;
      setInterval(async () => {
        if (video.readyState === video.HAVE_ENOUGH_DATA) {
          ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
          const detections = await faceapi.detectAllFaces(video, detectionOptions).withFaceLandmarks();
          // console.log('查看獲取幀',validDescriptors)
          // 確保只收集有效的面部描述符
          const validDescriptors = detections
          console.log('查看獲取幀',validDescriptors)
          recentDetections.push(...validDescriptors.map(face => face.descriptor));
          // 限制歷史長(zhǎng)度并去重
          recentDetections = recentDetections.slice(-detectionHistoryLength);
          // console.log('查看獲取幀',recentDetections)
          const uniqueDescriptors = Array.from(new Set(recentDetections));
          this.peopleCount = uniqueDescriptors.length; // 直接使用去重后的數(shù)組長(zhǎng)度,因已排除undefined,無(wú)需JSON.stringify和parse
          faceapi.draw.drawDetections(canvas, detections);
          faceapi.draw.drawFaceLandmarks(canvas, detections);
        }
      }, 100);
    }
  },
  beforeDestroy() {
    // 清理視頻流
    if (this.$refs.video.srcObject) {
      this.$refs.video.srcObject.getTracks().forEach(track => track.stop());
    }
  },
};
</script>
<style scoped>
.face-recognition {
  position: relative;
}
</style>

4、使用組件

創(chuàng)建文件直接引入組件然后注冊(cè)使用即可

<template>
    <div id="app">
      <FaceDetection />
    </div>
  </template>
  <script>
  import FaceDetection from '@/components/FaceDetection/FaceDetection.vue';
  export default {
    name: 'App',
    components: {
      FaceDetection,
    },
  };
  </script>

5、實(shí)現(xiàn)邏輯

  • mounted()生命周期鉤子中,首先加載模型,然后啟動(dòng)視頻流。
  • 創(chuàng)建一個(gè)方法如detectFaces()來(lái)周期性地從視頻流中捕獲幀,使用faceapi.detectAllFaces()來(lái)檢測(cè)人臉,并繪制檢測(cè)結(jié)果到<canvas>上。
  • 根據(jù)需要,你可以擴(kuò)展此邏輯來(lái)實(shí)現(xiàn)更復(fù)雜的人臉識(shí)別功能,比如與已知人臉匹配等。

6、注意事項(xiàng)

  • 確保你的應(yīng)用有訪問(wèn)用戶(hù)媒體設(shè)備的權(quán)限。
  • 處理好異步加載模型和獲取視頻流的錯(cuò)誤情況。
  • 由于瀏覽器的安全策略,你可能需要在HTTPS環(huán)境下運(yùn)行此應(yīng)用,或者在localhost上進(jìn)行開(kāi)發(fā)。
  • 考慮性能優(yōu)化,避免頻繁的重繪導(dǎo)致的性能問(wèn)題。

7、實(shí)現(xiàn)效果

到此這篇關(guān)于vue2使用face-api.js實(shí)現(xiàn)人臉識(shí)別功能的文章就介紹到這了,更多相關(guān)vue face-api.js人臉識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Vue路由跳轉(zhuǎn)傳參或者打開(kāi)新頁(yè)面跳轉(zhuǎn)問(wèn)題

    Vue路由跳轉(zhuǎn)傳參或者打開(kāi)新頁(yè)面跳轉(zhuǎn)問(wèn)題

    這篇文章主要介紹了Vue路由跳轉(zhuǎn)傳參或者打開(kāi)新頁(yè)面跳轉(zhuǎn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 完美解決iview 的select下拉框選項(xiàng)錯(cuò)位的問(wèn)題

    完美解決iview 的select下拉框選項(xiàng)錯(cuò)位的問(wèn)題

    下面小編就為大家分享一篇完美解決iview 的select下拉框選項(xiàng)錯(cuò)位的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 解決vue-cli項(xiàng)目開(kāi)發(fā)運(yùn)行時(shí)內(nèi)存暴漲卡死電腦問(wèn)題

    解決vue-cli項(xiàng)目開(kāi)發(fā)運(yùn)行時(shí)內(nèi)存暴漲卡死電腦問(wèn)題

    最近開(kāi)發(fā)一個(gè)vue項(xiàng)目時(shí)遇到電腦卡死問(wèn)題,突然間系統(tǒng)就非???,然后卡著卡著就死機(jī)了,鼠標(biāo)也動(dòng)不了了,只能冷啟動(dòng)。這篇文章主要介紹了vue-cli項(xiàng)目開(kāi)發(fā)運(yùn)行時(shí)內(nèi)存暴漲卡死電腦問(wèn)題,需要的朋友可以參考下
    2019-10-10
  • vue+Element?ui實(shí)現(xiàn)照片墻效果

    vue+Element?ui實(shí)現(xiàn)照片墻效果

    這篇文章主要為大家詳細(xì)介紹了vue+Element?ui實(shí)現(xiàn)照片墻效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 詳解Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model)

    詳解Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model)

    本篇文章主要介紹了Vue.js之視圖和數(shù)據(jù)的雙向綁定(v-model),使用v-model指令,使得視圖和數(shù)據(jù)實(shí)現(xiàn)雙向綁定,有興趣的可以了解一下
    2017-06-06
  • webpack+vue.js快速入門(mén)教程

    webpack+vue.js快速入門(mén)教程

    隨著前端的快速發(fā)展,非常多的js框架被應(yīng)用到項(xiàng)目中。Vue.js本身支持對(duì)組件的異步加載,配合Webpack的分塊打包功能,可以極其輕松地實(shí)現(xiàn)組件的異步按需加載。 這篇文章是webpack+vue.j的入門(mén)教程,有需要的可以參考借鑒。
    2016-10-10
  • vue-router結(jié)合vuex實(shí)現(xiàn)用戶(hù)權(quán)限控制功能

    vue-router結(jié)合vuex實(shí)現(xiàn)用戶(hù)權(quán)限控制功能

    這篇文章主要介紹了vue-router結(jié)合vuex實(shí)現(xiàn)用戶(hù)權(quán)限控制功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • vue如何解決sass-loader的版本過(guò)高導(dǎo)致的編譯錯(cuò)誤

    vue如何解決sass-loader的版本過(guò)高導(dǎo)致的編譯錯(cuò)誤

    這篇文章主要介紹了vue如何解決sass-loader的版本過(guò)高導(dǎo)致的編譯錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue-router實(shí)現(xiàn)編程式導(dǎo)航的代碼實(shí)例

    vue-router實(shí)現(xiàn)編程式導(dǎo)航的代碼實(shí)例

    今天小編就為大家分享一篇關(guān)于vue-router實(shí)現(xiàn)編程式導(dǎo)航的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-01-01
  • 一文詳解Vue3中的14種組件通信方式

    一文詳解Vue3中的14種組件通信方式

    對(duì)于日常使用vue3開(kāi)發(fā)項(xiàng)目的前端小伙伴來(lái)說(shuō),組件通信方式可以說(shuō)是必會(huì)的基本功,今天帶大家一起盤(pán)下vue3中的14種通信方式,希望對(duì)大家有所幫助
    2025-01-01

最新評(píng)論

长岛县| 江达县| 汉寿县| 东城区| 东海县| 汕尾市| 中西区| 马关县| 大邑县| 柘城县| 千阳县| 宁蒗| 栾川县| 华坪县| 岳阳县| 三门县| 海宁市| 同德县| 东乌| 康保县| 达孜县| 晋江市| 桐乡市| 托里县| 陵水| 昌江| 桃江县| 耿马| 新竹市| 崇信县| 榕江县| 宝清县| 正定县| 崇仁县| 永善县| 清徐县| 东至县| 资源县| 灌南县| 会昌县| 三台县|