返回

拜年黑科技!人脸识别自制专属表情包

前端

随着人工智能技术的发展,人脸识别技术也不断成熟,它可以被应用于各种有趣的场景中。比如,在今年的新春佳节,我们可以利用人脸识别技术制作专属的拜年表情包,为亲朋好友送上独一无二的新春祝福。

本文将介绍如何使用 Vite + Vue3 结合 face-api.js 来制作人脸识别拜年表情包。通过本教程,你将了解如何利用人脸识别技术进行图片处理,并将其应用于实际场景中。

技术栈

  • Vite
  • Vue3
  • face-api.js

准备工作

在开始之前,你需要确保已经安装了以下软件:

  • Node.js
  • npm/yarn

项目初始化

首先,创建一个新的 Vite + Vue3 项目:

npm create vite@latest my-project --template vue
cd my-project

安装依赖

接下来,安装 face-api.js:

npm install face-api.js

人脸识别初始化

main.js 文件中,引入 face-api.js 并初始化人脸识别模型:

import faceapi from 'face-api.js';

const MODEL_URL = '/models/';

async function loadModels() {
  await faceapi.loadSsdMobilenetv1Model(MODEL_URL);
  await faceapi.loadFaceLandmarkModel(MODEL_URL);
  await faceapi.loadFaceRecognitionModel(MODEL_URL);
}

loadModels();

人脸检测

使用 faceapi.detectAllFaces() 函数进行人脸检测:

const detectFaces = async (image) => {
  const detections = await faceapi.detectAllFaces(image);
  return detections;
};

获取人脸符

使用 faceapi.computeFaceDescriptors() 函数获取人脸符:

const getFaceDescriptors = async (detections) => {
  const faceDescriptors = await faceapi.computeFaceDescriptors(image, detections);
  return faceDescriptors;
};

创建表情包

使用 fabric.js 创建表情包:

const createCanvas = (width, height) => {
  const canvas = new fabric.Canvas('canvas', {
    width: width,
    height: height,
  });
  return canvas;
};
const addImage = (canvas, image, left, top) => {
  fabric.Image.fromURL(image, (img) => {
    img.set({
      left: left,
      top: top,
    });
    canvas.add(img);
  });
};
const addText = (canvas, text, left, top) => {
  const textObj = new fabric.Text(text, {
    left: left,
    top: top,
  });
  canvas.add(textObj);
};

组合图片和文本创建表情包

将人脸识别和表情包制作结合起来:

const makeExpression = async (image, detections) => {
  const faceDescriptors = await getFaceDescriptors(detections);
  const canvas = createCanvas(image.width, image.height);
  addImage(canvas, image, 0, 0);

  faceDescriptors.forEach((descriptor) => {
    const landmarks = descriptor.landmarks;
    const eyes = landmarks.positions[36] // 左眼
    const mouth = landmarks.positions[62] // 嘴巴

    const emojiLeft = mouth.x - (eyes.x - mouth.x) / 2;
    const emojiTop = mouth.y - (mouth.y - eyes.y) / 3;

    addImage(canvas, 'emoji.png', emojiLeft, emojiTop);
  });

  return canvas.toDataURL();
};

Vue 组件

在 Vue 组件中使用上述函数:

<template>
  <div>
    <input type="file" @change="handleFile" />
    <canvas id="canvas"></canvas>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const image = ref(null);

    const handleFile = (e) => {
      const file = e.target.files[0];
      const reader = new FileReader();

      reader.onload = async () => {
        const imageData = reader.result;
        const img = new Image();
        img.src = imageData;

        img.onload = async () => {
          const detections = await detectFaces(img);
          const expression = await makeExpression(img, detections);
          const canvas = document.getElementById('canvas');
          canvas.src = expression;
        };
      };

      reader.readAsDataURL(file);
    };

    return {
      image,
      handleFile,
    };
  },
};
</script>

结语

通过本教程,你已经了解了如何使用 Vite + Vue3 结合 face-api.js 来制作人脸识别拜年表情包。你可以利用本文的代码,自由发挥你的想象力,制作出更多有趣的拜年表情包,为你的亲朋好友带来惊喜。