还记得疫情初期我们用Python给头像戴口罩的文章吗?第一天上班,用Python戴口罩。当时只是简单的调用了一个第三方模块,将mask图片替换为原图,内容也很简短。今天给大家提供一个Python教程,可以通过以下三种方式给头像戴上圣诞帽:1.实时打开摄像头读取头像图片并戴上圣诞帽2.读取本地头像图片并戴上圣诞帽3.从文件夹中批量读取头像戴上圣诞帽1.在开始之前,您需要确保您的计算机上已经成功安装了Python和pip。如果没有,请访问这篇文章:超详细的Python安装指南进行安装。如果使用Python进行数据分析,可以直接安装Anaconda:Python数据分析挖掘的好帮手——Anaconda,内置Python和pip。另外,推荐大家使用VSCode编辑器,因为可以在编辑器下方的终端中运行命令安装依赖模块:Python编程最佳搭档——VSCode详解指南。Windows环境打开Cmd(开始-运行-CMD),苹果系统环境打开Terminal(command+空格输入Terminal),输入命令安装依赖:`pipinstallhttps://pypi.python.org/packages/da/06/bd3e241c4eb0a662914b3b4875fc52dd176a9db0d4a2c915ac2ad8800e9e/dlib-19.7.0-cp36-cp36m-win_amd64.whl#md5=b7330a5b2d46420343fbed5df69e6a3f``pipinstallopencv-python`有两个依赖,一个是dlib模块,需要通过whl文件安装。Oneisthe常用的opencv模块,直接用pip安装即可。文章源码fork自:amusi/Merry\_Christmas\_Hat本文所有源码和图片都可以在这里下载:https://github.com/Ckend/Merry\_Christmas\_Hat如果可以't访问Github,可以在Python实战宝典中找到公众号后台回复:圣诞帽下载。2.为头像戴上圣诞帽。为了不让大家看的不耐烦,我把圣诞帽戴教程提前了。下载源码后,进入源码所在文件夹,可以通过三种方式给头像戴上圣诞帽。1.开启相机读取头像:开启相机时,您会实时出现戴着圣诞老人帽。按q保存喜欢的图片,源码如下:`defmethod_one(hat_img):``"""``方法一:打开相机读取头像``"""``cap=cv2.VideoCapture(0)``ifnotcap.isOpened():``print('相机打开失败!')``else:``print('相机打开成功!')``print("请按键盘上的‘q’键,保存当前满意的图像!”)``whilecap.isOpened():``_,img=cap.read()``cv2.imshow("img",img)``k=cv2.waitKey(33)&0xFF``if(k==ord('q')):``cv2.imwrite("sefile.jpg",img)``face_flag,output=add_hat(img,hat_img)``if(-1==face_flag):``break``cv2.imshow("output",output)``print("请按键盘上的任意键退出当前程序!")``cv2.waitKey(0)``cv2.imwrite("output.jpg",output)``break``#读取帽子图像,第二个参数-1表示读取为rgba通道,否则为rgb通道``hat_img=cv2.imread("hat.png",-1)``#选择你需要的方法``method_one(hat_img)``cv2.destroyAllWindows()`这样运行Merry\_Chirstmas\_Hat.py文件就可以打开摄像头实时显示你戴着圣诞帽:pythonMerry_Chirstmas_Hat.py2。阅读一张戴着圣诞帽的图片。这是最常见的使用场景。你只需要将需要戴圣诞帽的图片放在源码文件夹中,并命名为test。jpg(或其他,只需在函数调用中更改指定的文件名)。放置完成后,运行Merry\_Christmas\_Hat.py文件,戴上圣诞帽。`defmethod_two(hat_img,filename):``"""``方法二:从本地读取头像图片``"""``img=cv2.imread(filename)``成功,output=add_hat(img,hat_img)``如果不成功:``print("Diefailed!")``return``#显示效果``cv2.imshow("output",output)``cv2.waitKey(0)``cv2.imwrite("output.jpg",output)``#读取帽子图片,第二个参数-1表示读取为rgba通道,否则为rgb通道``hat_img=cv2.imread("hat.png",-1)``#选择你需要的方式``method_two(hat_img,"test.jpg")``cv2.destroyAllWindows()`3.从源代码文件夹下的文件夹中读取多个头像图片(批处理),创建一个名为images的文件夹,并将所有以.jpg结尾的图像放入其中。运行Merry\_Chirstmas\_Hat.py文件后,你可以看到所有这些图像都戴着圣诞帽的效果。`defmethod_three(hat_img):``"""``方法三:从文件夹中读取多个头像图片(批处理)``"""``importglobasgb``img_path=gb.glob("./images/*.jpg")`forpathinimg_path:``img=cv2.imread(path)``#Addhat``success,output=add_hat(img,hat_img)``ifnotsuccess:``print("Failedtowear!")``continue``#显示效果``cv2.imshow("output",output)``cv2.waitKey(0)``#读取帽子图,第二个参数-1表示读取为rgba通道,否则为rgb通道``hat_img=cv2.imread("hat.png",-1)``#选择你需要的方式``method_three(hat_img)``cv2.destroyAllWindows()`我们的代码默认使用第二种方式戴圣诞帽,可以修改代码第178行的方法选择自己需要的方式。戴上效果如下:原图:戴上效果图:3.原理分析上面三种戴圣诞帽的方法中,调用了一个函数add\_hat。顾名思义,该函数实现了在原图上戴圣诞帽的逻辑,步骤如下:1.正面人脸识别(将帽子戴到头上)。2.遍历所有的脸,取5个关键点,根据脸的大小调整帽子的大小。3.用alpha通道的图像提取帽子放置的区域(提取空心区域)。4.将原帽子盖在步骤3中提取的镂空区域,放回原图。以下步骤说明:1.正面人脸识别使用dlib中已经训练好的人脸关键点检测模型,从图像中提取人脸:`#dlibfacekeypointdetector(需要保证.py文件在同级目录下有一个文件shape_predictor_5_face_landmarks.dat)``predictor_path="shape_predictor_5_face_landmarks.dat"``predictor=dlib.shape_predictor(predictor_path)``#dlibfrontalfacedetector``detector=dlib.get_frontal_face_detector()``#正面人脸检测``dets=detector(img,1)`检测到的人脸数据会保存在dets变量中,所以dets的长度会大于0.2。遍历人脸,取关键点,调整帽子大小,得到保存的人脸数据的各种参数,根据这些参数转换帽子:`#如果检测到人脸``iflen(dets)>0:``#Traverseallfaces``fordindets:``x,y,w,h=d.left(),d.top(),d.right()-d.left(),d.bottom()-d.top()``#关键点检测,5个关键点``shape=predictor(img,d)``#选择左(0)右(2)眼角的点``point1=shape.part(0)``point2=shape.part(2)``#求两点的中心``eyes_center=((point1.x+point2.x)//2,(point1.y+point2.y)//2)``#根据脸的大小调整帽子的大小``factor=1.5#比例因子``resized_hat_h=int(``round(rgb_hat.shape[0]*w/rgb_hat.shape[1]*factor))``resized_hat_w=int(``round(rgb_hat.shape[1]*w/rgb_hat.shape[1]*factor))``#避免帽子高度超过图像框架``如果resized_hat_h>y:``resized_hat_h=y-1``#根据脸的大小调整帽子的大小``resized_hat=cv2.resize(rgb_hat,(resized_hat_w,resized_hat_h))`3.使用alpha通道imagetoextractthehatarea(Extractthehollowarea)将通过alpha通道生成的黑白图像作为mask,填充到原图中。生成的bg.jpg.`#使用alpha通道作为mask(bitwise_not)``mask=cv2.resize(a,(resized_hat_w,resized_hat_h))``mask_inv=cv2.bitwise_not(mask)``#帽子是相对于theface框上线的偏移``dh=0``dw=0``#原图ROI``bg_roi=img[y+dh-resized_hat_h:y+dh,``(eyes_center[0]-resized_hat_w//3):(eyes_center[0]+resized_hat_w//3*2)]``#从原始图像ROI中提取帽子区域``bg_roi=bg_roi.astype(float)``mask_inv=cv2.merge((mask_inv,mask_inv,mask_inv))``alpha=mask_inv.astype(float)/255``#相乘前确保两者大小相同(可能因四舍五入不一致)``alpha=cv2.resize(alpha,(bg_roi.shape[1],bg_roi.shape[0]))``bg=cv2.multiply(alpha,bg_roi)``bg=bg.astype('uint8')``cv2.imwrite("bg.jpg",bg)`如果你打开bg.jpg,你会发现这是一个带有黑色模板的原始帽子区域:4.将原始帽子覆盖在步骤3提取的镂空区域上,然后放回原图.接下来要做的是替换第3部分生成的空心区域上的帽子,并将其放回原始图像:`#Extracthatarea``hat=cv2.bitwise_and(resized_hat,resized_hat,mask=mask)``简历2。imwrite("hat.jpg",hat)``#添加前确保两者大小相同(可能因四舍五入不一致)``hat=cv2.resize(hat,(bg_roi.shape[1],bg_roi.shape[0]))``#添加两个ROI区域``add_hat=cv2.add(bg,hat)``#将添加的帽子区域放回原图``img[y+dh-resized_hat_h:y+dh,(eyes_center[0]-resized_hat_w//3):(``eyes_center[0]+resized_hat_w//3*2)]=add_hat``return1,img`这样整个戴一个的过程圣诞帽制作完成。文章完整源码可以在Python实战宝典中下载公众号后台回复:圣诞老人帽子。这是我们文章的结尾。如果喜欢今天的Python实战教程,请继续关注Python实战宝典。有问题可以在公众号后台回复:进群,回答对应的红字验证信息,进入互助群提问。原创不易,希望大家能在下方点赞观看支持我继续创作,谢谢!点击下方阅读原文,更好的阅读体验Python实战宝典(pythondict.com)不只是合集欢迎关注公众号:Python实战宝典
