Python小程序之超级赛亚人

原文地址:

https://mp.weixin.qq.com/s/OhZ2ZegT42kwAurHh4HV5w

网盘下载链接:https://pan.baidu.com/s/1wV6SbnYEwpRaw6rkoWLA0Q提取码:4zzp

视频效果:

Python小程序之超级赛亚人_第1张图片

示例代码:

import cv2
import math
import dlib
from PIL import Image
import random


#电弧图片定义
lightlist = ["l1.png","l2.png","l3.png","l4.png"]
rightlist = ["r1.png","r2.png","r3.png","r4.png"]
toplist = ["t1.png","t2.png","t3.png","t4.png"]

#opencv启用摄像头
cap = cv2.VideoCapture(0)

#dlib面部识别模块相关
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor("shape_predictor_68_face_landmarks.dat")

#定义图片名称,temp为摄像头最初抓取的图像,result为最终处理后生成图像
temp = "temp.jpg"
result = "result.png"
#打开金色头发图片
adding = Image.open('shine.png')
while True:
    #将摄像头抓取到的结果进行赋值
    _, frame = cap.read()
    #将抓到的数据写入temp图片
    cv2.imwrite(temp,frame)
    #通过PIL重新打开图片,因为后续需要PIL贴图操作,所以要使用PIL模块打开
    im = Image.open(temp)

    #在摄像头抓取的数据中进行面部识别
    gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    faces = detector(gray)
    for face in faces:
        #获取面部模式
        landmarks = predictor(gray, face)
        #定位面部左上角点坐标
        x1,y1 = landmarks.part(0).x, landmarks.part(0).y
        # 定位面部右上角点坐标
        x2, y2 = landmarks.part(16).x, landmarks.part(16).y
        #计算面部宽度
        d = math.sqrt((x2-x1)**2+(y2-y1)**2)
        #根据面部宽度计算金色头发尺寸
        size = int(d / 236 * 439)
        #对头发图片缩放
        resized = adding.resize((size,size))
        #在合适位置添加头发图片
        im.paste(resized,(int(x1-d*86/236),int(y1-d*394/236)),resized)

        #电弧尺寸
        lightsize = int(d/2)
        #随机获取电弧图片
        ligntning = Image.open(lightlist[random.randint(0, 3)])
        #对电弧进行缩放
        relight = ligntning.resize((lightsize, lightsize))
        #找到合适位置添加电弧图片
        im.paste(relight,(int(x1-d*60/236),int(y1-d*380/236)),relight)

        #定义另一处添加电弧
        ligntning1 = Image.open(lightlist[random.randint(0, 3)])
        relight1 = ligntning1.resize((lightsize, lightsize))
        im.paste(relight1,(int(x1-d*150/236),int(y1-d*200/236)),relight1)

        # 定义另一处添加电弧
        ligntning2 = Image.open(toplist[random.randint(0, 3)])
        relight2 = ligntning2.resize((lightsize, lightsize))
        im.paste(relight2,(int(x1+d*100/236),int(y1-d*450/236)),relight2)

        # 定义另一处添加电弧
        ligntning3 = Image.open(rightlist[random.randint(0, 3)])
        relight3 = ligntning3.resize((lightsize, lightsize))
        im.paste(relight3,(int(x1+d*280/236),int(y1-d*120/236)),relight3)

        #将添加完金色头发、电弧的图像数据保存为result图片
        im.save(result)

    #将窗口定义为可调节大小
    cv2.namedWindow('Frame', cv2.WINDOW_NORMAL)
    #将result图片展示在窗口中
    cv2.imshow("Frame", cv2.imread(result))

    key = cv2.waitKey(1)
    #按ESC键退出摄像头视频
    if key==27:
        break

#退出摄像头、关闭窗口
cap.release()
cv2.destroyAllWindows()

注意事项:

由于只有python的基础环境,导致报错了好多,解决办法一一如下:

1、pip不是内部或外部命令(pip.exe的路径)

把python安装目录下的Programs\Python\Python37\Scripts加到环境变量,或者进入到此目录再执行pip命令

2、python不是内部或外部命令(python.exe的路径)

把python安装目录下的Programs\Python\Python37加到环境变量,或者进入到此目录再执行python命令

3、no module named cv2

安装opencv:pip install opencv-python

4、no module named dlib

安装boost:pip install boost

安装cmake:pip install cmake

下载dlib:http://dlib.net/,解压c盘dlib

进入此目录,安装:python setup.py install(时间长)

把c:\dlib加到环境变量

5、You are using pip version 18.1, however version 19.0.3 is available.

更新pip版本:python -m pip install --upgrade pip

6、no module named PIL

安装Pillow:pip install Pillow

7、module 'dlib' has no attribute 'get_frontal_face_detector'

dlib好像要大于17.0

一般来说都是没有安装dlib(或没有安装成功)

你可能感兴趣的:(Python小程序之超级赛亚人)