欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

1、安裝依賴

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

npm install face-api.js

這是我安裝的版本

2、下載模型文件

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

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

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

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

3、封裝組件

        為了更好地組織代碼并使其可復(fù)用,我們可以將人臉識別的功能封裝成一個(gè)Vue組件。下面是一個(gè)更完善的示例,展示了如何創(chuàng)建一個(gè)名為FaceRecognition.vue的自定義組件,該組件負(fù)責(zé)處理視頻流、人臉檢測、以及展示檢測結(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: [], // 上一幀檢測到的人臉
      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));
          // 限制歷史長度并去重
          recentDetections = recentDetections.slice(-detectionHistoryLength);
          // console.log('查看獲取幀',recentDetections)
          const uniqueDescriptors = Array.from(new Set(recentDetections));
          this.peopleCount = uniqueDescriptors.length; // 直接使用去重后的數(shù)組長度,因已排除undefined,無需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)建文件直接引入組件然后注冊使用即可

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

6、注意事項(xiàng)

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

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

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

相關(guān)文章

  • Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐

    Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐

    這篇文章主要介紹了Vue SPA單頁應(yīng)用首屏優(yōu)化實(shí)踐,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • Vue實(shí)現(xiàn)導(dǎo)入Excel功能步驟詳解

    Vue實(shí)現(xiàn)導(dǎo)入Excel功能步驟詳解

    這篇文章主要介紹了Vue實(shí)現(xiàn)導(dǎo)入Excel功能,本文分步驟給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • 解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目)

    解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目)

    這篇文章主要介紹了解決微信瀏覽器緩存站點(diǎn)入口文件(IIS部署Vue項(xiàng)目),本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • Vue中的@blur/@focus事件解讀

    Vue中的@blur/@focus事件解讀

    這篇文章主要介紹了Vue中的@blur/@focus事件解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 詳解vue父子組件間傳值(props)

    詳解vue父子組件間傳值(props)

    本篇文章主要介紹了詳解vue父子組件間傳值(props),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • vue多級復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn)

    vue多級復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn)

    這篇文章主要介紹了vue多級復(fù)雜列表展開/折疊及全選/分組全選實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-11-11
  • Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器)功能

    Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器)功能

    最近項(xiàng)目中有個(gè)場景,一組圖片、視頻、音頻、文件數(shù)據(jù),要求點(diǎn)擊圖片可以放大預(yù)覽,左右可以切換音視頻、文件,支持鼠標(biāo)及各種鍵控制?縮放,左右旋轉(zhuǎn),移動等功能,這篇文章主要介紹了Vue3.0實(shí)現(xiàn)圖片預(yù)覽組件(媒體查看器),需要的朋友可以參考下
    2023-12-12
  • VUE中常用的四種高級方法總結(jié)

    VUE中常用的四種高級方法總結(jié)

    開發(fā)vue項(xiàng)目的時(shí)候一般都會開發(fā)很多自定義的全局組件,下面這篇文章主要給大家總結(jié)介紹了關(guān)于VUE中常用的四種高級方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • 利用vuex-persistedstate將vuex本地存儲實(shí)現(xiàn)

    利用vuex-persistedstate將vuex本地存儲實(shí)現(xiàn)

    這篇文章主要介紹了利用vuex-persistedstate將vuex本地存儲的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 理解Vue2.x和Vue3.x自定義指令用法及鉤子函數(shù)原理

    理解Vue2.x和Vue3.x自定義指令用法及鉤子函數(shù)原理

    這篇文章主要介紹了理解Vue2.x和Vue3.x的自定義指令的用法及鉤子函數(shù)原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2021-09-09

最新評論