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)
相关推荐
工藤学编程6 分钟前
零基础学AI大模型之LangChain智能体执行引擎AgentExecutor
人工智能·langchain
图生生10 分钟前
基于AI的商品场景图批量生成方案,助力电商大促效率翻倍
人工智能·ai
说私域11 分钟前
短视频私域流量池的变现路径创新:基于AI智能名片链动2+1模式S2B2C商城小程序的实践研究
大数据·人工智能·小程序
yugi98783815 分钟前
用于图像分类的EMAP:概念、实现与工具支持
人工智能·计算机视觉·分类
aigcapi18 分钟前
AI搜索排名提升:GEO优化如何成为企业增长新引擎
人工智能
彼岸花开了吗23 分钟前
构建AI智能体:八十、SVD知识整理与降维:从数据混沌到语义秩序的智能转换
人工智能·python·llm
MM_MS24 分钟前
Halcon图像锐化和图像增强、窗口的相关算子
大数据·图像处理·人工智能·opencv·算法·计算机视觉·视觉检测
韩师傅30 分钟前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
AI大佬的小弟31 分钟前
【小白第一课】大模型基础知识(1)---大模型到底是啥?
人工智能·自然语言处理·开源·大模型基础·大模型分类·什么是大模型·国内外主流大模型
lambo mercy38 分钟前
无监督学习
人工智能·深度学习