人脸识别照片眨眼张嘴生成器,一键生成眨眼照片app,怎么用一张照片做人脸识别

简介: 基于Python的人脸识别照片动画生成系统,支持眨眼和张嘴动作。使用OpenCV、dlib等技术实现,可输出GIF或序列帧。代码包含完整的人脸检测

下载地址:https://www.pan38.com/share.php?code=pvvmX 提取码:8888

基于Python的人脸识别照片动画生成系统,包含眨眼和张嘴动作的完整实现。这个系统使用OpenCV、dlib和图像处理技术来实现。

import cv2
import dlib
import numpy as np
from scipy.spatial import Delaunay
from skimage.transform import PiecewiseAffineTransform, warp
import os
import argparse

class FaceAnimator:
def init(self):
self.detector = dlib.get_frontal_face_detector()
self.predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")
self.blink_sequence = [0.1, 0.3, 0.7, 0.9, 0.7, 0.3, 0.1]
self.mouth_open_sequence = [0.1, 0.3, 0.5, 0.7, 0.9, 0.7, 0.5, 0.3, 0.1]

def load_image(self, image_path):
    image = cv2.imread(image_path)
    if image is None:
        raise ValueError(f"无法加载图像: {image_path}")
    return image

def get_landmarks(self, image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    faces = self.detector(gray)
    if len(faces) == 0:
        raise ValueError("未检测到人脸")

    landmarks = self.predictor(gray, faces[0])
    return np.array([(p.x, p.y) for p in landmarks.parts()])

def create_triangles(self, points):
    rect = (0, 0, 1000, 1000)
    subdiv = cv2.Subdiv2D(rect)
    for p in points:
        subdiv.insert((int(p[0]), int(p[1])))

    triangle_list = subdiv.getTriangleList()
    triangles = []
    for t in triangle_list:
        pt1 = (t[0], t[1])
        pt2 = (t[2], t[3])
        pt3 = (t[4], t[5])
        triangles.append((pt1, pt2, pt3))
    return triangles

def apply_affine_transform(self, src, src_tri, dst_tri, size):
    warp_mat = cv2.getAffineTransform(np.float32(src_tri), np.float32(dst_tri))
    dst = cv2.warpAffine(src, warp_mat, (size[0], size[1]), None, 
                        flags=cv2.INTER_LINEAR, 
                        borderMode=cv2.BORDER_REFLECT_101)
    return dst

def warp_triangle(self, img1, img2, t1, t2):
    r1 = cv2.boundingRect(np.float32([t1]))
    r2 = cv2.boundingRect(np.float32([t2]))

    t1_rect = []
    t2_rect = []
    t2_rect_int = []

    for i in range(0, 3):
        t1_rect.append(((t1[i][0] - r1[0]), (t1[i][1] - r1[1])))
        t2_rect.append(((t2[i][0] - r2[0]), (t2[i][1] - r2[1])))
        t2_rect_int.append((int(t2[i][0] - r2[0]), int(t2[i][1] - r2[1])))

    mask = np.zeros((r2[3], r2[2], 3), dtype=np.float32)
    cv2.fillConvexPoly(mask, np.int32(t2_rect_int), (1.0, 1.0, 1.0), 16, 0)

    img1_rect = img1[r1[1]:r1[1] + r1[3], r1[0]:r1[0] + r1[2]]

    size = (r2[2], r2[3])
    warp_image = self.apply_affine_transform(img1_rect, t1_rect, t2_rect, size)

    warp_image = warp_image * mask
    img2_rect = img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]]
    img2_rect = img2_rect * (1 - mask)
    img2_rect = img2_rect + warp_image
    img2[r2[1]:r2[1] + r2[3], r2[0]:r2[0] + r2[2]] = img2_rect

def generate_blink_frame(self, img, landmarks, intensity):
    new_landmarks = landmarks.copy()

    # 上眼皮点
    upper_lid_left = [37, 38, 43, 44]
    upper_lid_right = [36, 39, 40, 41]

    # 下眼皮点
    lower_lid_left = [41, 40, 47, 46]
    lower_lid_right = [36, 47, 46, 45]

    # 调整上眼皮点
    for idx in upper_lid_left + upper_lid_right:
        new_landmarks[idx][1] += intensity * 5

    # 调整下眼皮点
    for idx in lower_lid_left + lower_lid_right:
        new_landmarks[idx][1] -= intensity * 3

    return self.warp_image(img, landmarks, new_landmarks)

def generate_mouth_open_frame(self, img, landmarks, intensity):
    new_landmarks = landmarks.copy()

    # 上嘴唇点
    upper_lip = [48, 49, 50, 51, 52, 53, 54, 64, 63, 62, 61, 60]

    # 下嘴唇点
    lower_lip = [54, 55, 56, 57, 58, 59, 48, 60, 67, 66, 65, 64]

    # 调整上嘴唇点
    for idx in upper_lip:
        new_landmarks[idx][1] -= intensity * 2

    # 调整下嘴唇点
    for idx in lower_lip:
        new_landmarks[idx][1] += intensity * 3

    return self.warp_image(img, landmarks, new_landmarks)

def warp_image(self, img, src_points, dst_points):
    triangles = self.create_triangles(src_points)
    warped_img = np.zeros(img.shape, dtype=img.dtype)

    for triangle in triangles:
        src_tri = []
        dst_tri = []

        for p in triangle:
            src_idx = np.where((src_points == p).all(axis=1))[0]
            if len(src_idx) > 0:
                src_tri.append(src_points[src_idx[0]])
                dst_tri.append(dst_points[src_idx[0]])

        if len(src_tri) == 3:
            self.warp_triangle(img, warped_img, src_tri, dst_tri)

    return warped_img

def generate_animation(self, input_image, output_path, animation_type="blink"):
    img = self.load_image(input_image)
    landmarks = self.get_landmarks(img)

    if animation_type == "blink":
        sequence = self.blink_sequence
        generator = self.generate_blink_frame
    elif animation_type == "mouth":
        sequence = self.mouth_open_sequence
        generator = self.generate_mouth_open_frame
    else:
        raise ValueError("不支持的动画类型")

    frames = []
    for intensity in sequence:
        frame = generator(img, landmarks, intensity)
        frames.append(frame)

    # 添加原始帧使动画更自然
    frames.extend(frames[::-1][1:-1])

    # 保存为GIF
    if output_path.endswith('.gif'):
        import imageio
        with imageio.get_writer(output_path, mode='I', duration=0.1) as writer:
            for frame in frames:
                writer.append_data(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    else:
        for i, frame in enumerate(frames):
            cv2.imwrite(f"{output_path}_{i}.jpg", frame)

if name == "main":
parser = argparse.ArgumentParser(description="人脸动画生成器")
parser.add_argument("-i", "--input", required=True, help="输入图像路径")
parser.add_argument("-o", "--output", required=True, help="输出路径")
parser.add_argument("-t", "--type", choices=["blink", "mouth"], default="blink",
help="动画类型: blink(眨眼)或mouth(张嘴)")

args = parser.parse_args()

animator = FaceAnimator()
animator.generate_animation(args.input, args.output, args.type)

人脸动画生成器

功能

  • 从单张照片生成眨眼动画
  • 从单张照片生成张嘴动画
  • 输出为GIF或序列帧

使用方法

  1. 安装依赖: pip install -r requirements.txt
  2. 下载dlib模型文件: shape_predictor_68_face_landmarks.dat
  3. 运行程序:
    python face_animator.py -i input.jpg -o output.gif -t blink
    

参数说明

  • -i/--input: 输入图像路径
  • -o/--output: 输出路径(.gif或前缀)
  • -t/--type: 动画类型(blink或mouth)

示例

生成眨眼动画:

python face_animator.py -i photo.jpg -o blink.gif -t blink
相关文章
|
JavaScript 计算机视觉
纯js实现人脸识别眨眨眼张张嘴案例——ccv.js
纯js实现人脸识别眨眨眼张张嘴案例——ccv.js
|
JavaScript 前端开发 Java
纯前端JS实现人脸识别眨眨眼张张嘴案例
纯前端JS实现人脸识别眨眨眼张张嘴案例
|
20天前
|
Java
照片一键生成眨眼视频app,手机照片一键生成眨眼动图,通过JAR代码实现效果
这是一个自动生成眨眼GIF动画的Java程序,包含主程序处理、图像变形和GIF生成三个模块。输入照片路径,自动识别人脸眼睛位置,生成闭眼、半闭眼等多帧图像,并合成为眨眼动效GIF文件。
|
JavaScript 计算机视觉
纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js
纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js
|
23天前
|
Java 数据安全/隐私保护 计算机视觉
银行转账虚拟生成器app,银行卡转账截图制作软件,java实现截图生成工具【仅供装逼娱乐用途】
本内容提供Java生成自定义图片的示例代码,涵盖基础图像创建、文本添加及保存功能,适合学习2D图形编程。包括教学示例图片生成、文本图层处理和数字水印技术实现方案。
|
23天前
|
存储 前端开发 安全
病历单生成器在线制作,病历单生成器app,HTML+CSS+JS恶搞工具
本项目为医疗病历模拟生成器,旨在为医学教学和软件开发测试提供数据支持,严格遵守《医疗机构病历管理规定》。
|
19天前
|
机器学习/深度学习 计算机视觉 索引
眨眼张嘴人脸识别软件,图片眨眼摇头生成器,制作眨眼睛张嘴图软件
本系统基于OpenCV和Dlib实现人脸动态特征识别与图像生成,包含眨眼、张嘴检测及头部姿态估计功能,提供约200行核心代码,并支持扩展深度学习模型提升性能。
|
22天前
|
安全 测试技术 开发者
银行转账模拟器手机版app, 银行转账凭证生成器app,用autojs实现效果【逼真效果】
本内容展示了一套基于Auto.js的银行APP自动化测试脚本和框架,用于学习和研究移动应用测试技术。脚本涵盖登录、转账等功能测试
|
22天前
|
Java
四大银行虚拟仿真app,银行卡p图软件,银行转账截图生成器【jar实现仅供娱乐用途】
这是一款增强版银行系统程序,包含完整账户管理、交易记录、转账及账户流水查询功能。代码采用Java编写,通过`BankSystem`类实现账户创建与管理。

热门文章

最新文章