live2d 抠人脸

Peppa_Pig_Face_Landmark

python 复制代码
import glob

import cv2
import time
import numpy as np
import os
import argparse


from Skps import FaceAna
def video(video_path_or_cam):
    facer = FaceAna()
    vide_capture=cv2.VideoCapture(video_path_or_cam)

    while 1:
        ret, image = vide_capture.read()
        if ret:
            pattern = np.zeros_like(image)
            img_show = image.copy()
            star=time.time()
            result = facer.run(image)
            duration=time.time()-star
            #print('one iamge cost %f s'%(duration))
            fps=1/duration
            cv2.putText(img_show, "X: " + "{:7.2f}".format(fps), (20, 20), cv2.FONT_HERSHEY_SIMPLEX,
                        0.75, (0, 0, 0), thickness=2)
            for face_index in range(len(result)):
                cur_face_kps=result[face_index]['kps']
                cur_face_kps_score=result[face_index]['scores']
                for landmarks_index in range(cur_face_kps.shape[0]):
                    x_y = cur_face_kps[landmarks_index]
                    score=cur_face_kps_score[landmarks_index]
                    # color = (255, 255, 255)
                    if score>0.8:
                        color=(255,255,255)
                    else:
                        color = (0, 0, 255)
                    cv2.circle(img_show, (int(x_y[0]), int(x_y[1])),
                                   color=color, radius=1, thickness=2)
            cv2.namedWindow("capture", 0)
            cv2.imshow("capture", img_show)
            if args.mask:
                cv2.namedWindow("masked", 0)
                cv2.imshow("masked", image*pattern)

            key=cv2.waitKey(1)
            if key==ord('q'):
                return

def save_roi_as_png(mask, landmarks, indices,expand_ratio=1.0):

    pts = landmarks[indices].astype(np.int32)
    x_min = np.min(pts[:, 0])
    x_max = np.max(pts[:, 0])
    y_min = np.min(pts[:, 1])
    y_max = np.max(pts[:, 1])
    
    H, W = mask.shape[:2]
    # 矩形中心
    cx = (x_min + x_max) // 2
    cy = (y_min + y_max) // 2

    # 边长取矩形最大边,扩展 expand_ratio
    side = int(max(x_max - x_min, y_max - y_min) * expand_ratio / 2)

    # 正方形边界
    x1 = max(cx - side, 0)
    x2 = min(cx + side, W - 1)
    y1 = max(cy - side, 0)
    y2 = min(cy + side, H - 1)

    # 填充 mask
    cv2.rectangle(mask, (x1, y1), (x2, y2), 255, -1)
    
    return mask
def images(image_dir):
    facer = FaceAna()
    
    # image_list=glob.glob(image_dir+'/*.jpg')
    image_list=glob.glob(r"B:\360MoveData\Users\Administrator\Desktop\tmp\a123.jpeg")

    for image_name in image_list:

        image=cv2.imread(os.path.join(image_dir,image_name))
        pattern = np.zeros_like(image)
        img_show = image.copy()

        star=time.time()
        result = facer.run(image)
        ###no track
        facer.reset()
        duration=time.time()-star
        print('one iamge cost %f s'%(duration))
        for face_index in range(len(result)):

            cur_face_kps = result[face_index]['kps']
            cur_face_kps_score = result[face_index]['scores']
            
            left_eye_idx = np.arange(60, 68)
            right_eye_idx = np.arange(68, 76)
            mouth_idx = np.arange(76, 96)
            jaw_low_idx = np.arange(8, 11)
            
            
            H, W = img_show.shape[:2]
            
            # 创建黑色 mask
            mask = np.zeros((H, W), dtype=np.uint8)
            # ----- 保存区域 -----
            mask = save_roi_as_png(mask, cur_face_kps, left_eye_idx)
            mask = save_roi_as_png(mask, cur_face_kps, right_eye_idx)
            
        
            pts = np.concatenate([cur_face_kps[mouth_idx], cur_face_kps[jaw_low_idx]]).astype(np.int32)
            x_min, y_min = np.min(pts, axis=0)
            x_max, y_max = np.max(pts, axis=0)
            cv2.rectangle(mask, (x_min, y_min), (x_max, y_max), 255, -1)
            
            cv2.imwrite('mask1.png',mask)
            
            for landmarks_index in range(cur_face_kps.shape[0]):

                x_y = cur_face_kps[landmarks_index]
                score = cur_face_kps_score[landmarks_index]
                # color = (255, 255, 255)
                if score > 0.8:
                    color = (255, 0, 0)
                else:
                    color = (0, 0, 255)
                cv2.circle(img_show, (int(x_y[0]), int(x_y[1])),
                           color=color, radius=1, thickness=1)

        # cv2.namedWindow("capture", 0)
        cv2.imshow("capture", img_show)

        key=cv2.waitKey(0)
        if key==ord('q'):
            return

def build_argparse():
    parser = argparse.ArgumentParser(description='Start train.')
    parser.add_argument('--video', dest='video', type=str, default=None,  help='the camera id (default: 0)')
    parser.add_argument('--cam_id', dest='cam_id', type=int, default=0,help='the camera to use')
    parser.add_argument('--img_dir', dest='img_dir', type=str, default='aa',  help='the images dir to use')

    parser.add_argument('--mask', dest='mask', type=bool, default=False, help='mask the face or not')

    args = parser.parse_args()
    return  args

if __name__=='__main__':

    args=build_argparse()

    if args.img_dir is not None:
        images(args.img_dir)

    elif args.video is not None:
        video(args.video)
    else:
        video(args.cam_id)
相关推荐
GuWenyue2 小时前
写Agent还要重复封装工具?一套MCP多服务方案,3个能力让AI自动查地图、读写文件、操控浏览器
人工智能·机器学习·开源
GuWenyue2 小时前
90%AI新手不会调参!LangChain双模型流水线实战,一套代码兼顾严谨+创意
人工智能
光锥智能3 小时前
WAIC亮点|兼具泛化能力与作业效率的极智嘉机器人天团
人工智能·机器人
阳光是sunny3 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
甲维斯3 小时前
Kimi K3 重构10000行单文件屎山代码!
人工智能
阳光是sunny3 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
新知图书4 小时前
11.3 详细实现与核心配置(作业批改智能体开发)
人工智能·agent·ai agent·智能体·扣子
深度研习笔记5 小时前
OpenCV工业视觉实战11|多线程解耦+视频流稳流+推理加速,彻底解决卡顿阻塞,实现毫秒级工业实时检测
人工智能·opencv·计算机视觉
delishcomcn5 小时前
AI视觉识别+分切算法:电化铝缺陷检测与裁切一体化解锁
人工智能·算法
触底反弹5 小时前
深入理解大模型采样:Temperature、Top-K、Top-P 的原理与实战
人工智能·算法·面试