原文地址:
https://mp.weixin.qq.com/s/OhZ2ZegT42kwAurHh4HV5w
网盘下载链接:https://pan.baidu.com/s/1wV6SbnYEwpRaw6rkoWLA0Q提取码:4zzp
视频效果:
示例代码:
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(或没有安装成功)