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)
相关推荐
IT_Octopus1 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148111 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
LiuPig刘皮哥1 小时前
2026年开源3D陪玩对比:xiaoke.ai、AIRI、Open-LLM-VTuber、Amica 有什么、没有什么
人工智能·3d·开源
西柚小萌新1 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
Luminbox紫创测控2 小时前
车载LiDAR强光测试的实验设计方法与数据分析
人工智能·数据挖掘·数据分析·车载系统·安全性测试·太阳光模拟器
硅谷秋水3 小时前
CommitFlow:面向长时程机器人操作 VLA 执行的语义承诺验证与局部修正
机器学习·计算机视觉·语言模型·机器人
建筑工程企业管理系统3 小时前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化
唠点键盘之外的3 小时前
27 存量系统接大模型:旁挂一个 AI 微服务,老架构一行不改
人工智能·微服务·架构
kaixin_啊啊3 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
GOWIN革文品牌咨询3 小时前
工业测量品牌系统化搭建指南:从内容架构到长期治理的全流程
大数据·人工智能·架构