正文
import cv2
from PIL import Image
personPath = '3.jpg' #头像
hatPath = 'sheng.png' #圣诞帽
personImg = cv2.imread(personPath)
face_haar = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')#存放的绝对路径
faces = face_haar.detectMultiScale(personImg, 1.1,5)
personImg = Image.open(personPath)
personImg = personImg.convert('RGBA')
hatImg = Image.open(hatPath)
hatImg = hatImg.convert('RGBA')
for face_x,face_y,face_w,face_h in faces:
face_x -= face_w-180
face_y += face_h-250
face_w *= 1
face_h *= 1
hatImg = hatImg.resize((face_w, face_h))
bg = (face_x, face_y - face_h + 100 , face_x + face_w, face_y + 100 )
personImg.paste(hatImg, bg, mask = hatImg)#将调整好的帽子贴上去
personImg.save('addHat.png')
下面对代码进行讲解。
首先,引入两个模块,用cv2.imread(personPath)来读取相对路径下的图片。
“cv2.imread('图像路径','读取方式'):默认为cv2.imread_color以彩色图像模式读取。
cv2.CascadeClassifier('分类器的路径'):简单来说就是做人脸检测的一个必备方面,专业名词叫做级联分类器。这个分类器到目前版本容纳了Haar特征器和LBP特征分类器两个分类器。这次我们使用常规用的Harr特征器”
Haar特征分类器就是一个xml文件,是OpenCV官方训练好的检测器,它能反应图像的灰度变化,以像素分模块求差值的一种特征。下面我们讲讲它的路径
在我们准备工作中我们在OpenCV的官网下载了人脸识别的插件。
以安装在D盘为例,
Harr特征分类器就在我们的:
D:\opencv\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml
注意:在第6行代码中,我们调用这个特征器的路径最好使用绝对路径!上述代码只是演示
关键代码就是:
detectMultiScale(image,scaleFactor,minNeighbors)。
检验出图片中的所有人脸,并以向量类型保存各个人脸的位置和大小,最后用矩形Rect类表示,该函数由分类器((也就是上述的Haar特征分类器))的对象进行调用。
其中参数如下:
“image是我们要做人脸检测的图片。
scaleFactor表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;
minNeighbors表示构成检测目标的相邻矩形的最小个数(默认为3个)。”
而后就是我们常见的用Pillow模块打开两张图片,不过这次的打开方式是以RGBA模式打开,即四通道模式(A指透明度)。
最后一个for循环就是读取用cv2解析出来的帽子faces参数,这里有趣的一点是,cv2做人脸识别后,会在两眼之间画一条线,并以中间为原点,做x和y轴建立坐标系。最后调节Pillow解析出来的帽子x和y位置,摆到人头上方。所有这个方法对正脸敏感,对侧脸不太友好。
personImg.save('addHat.png')表示存储添加圣诞帽后的照片。
GUI框架整合
现在我们在上一节的基础上,将圣诞帽添加与GUI框架进行整合,还是先上代码之后拆分讲解