实现方式主要通过以下模块实现:
- DateFromWebChat (从网页版微信窗口下载好友头像)
- AI (识别模块,主要用于识别好友头像是否为人脸,并且计算人脸的数量与头像的总数且return)
- DateVisul (数据可视化模块,用与AI模块返回参数的可视化)
- union(将整合以上三个模块的顶层模块)
知识准备:
- python中opencv图像处理模块的使用(主要是CascadeClassifier级联图像分类器与 detectMultiScale人脸识别函数的使用)
- python中os模块的使用(主要涉及os.imread灰度图像处理与os.listdir(path)获取路径下文件这两个函数的使用)
- sys模块的使用(sys.stdout.flush()缓冲器一次返回一个值)
- python中Matplotlib图形框架的使用(涉及饼图plt.pie的使用与使用matplotlib.font_manager.FontProperties设置文字显示方式)
知识解析:
- CascadeClassifier('path')级联分类器的使用
参考文章https://blog.csdn.net/itismelzp/article/details/50379359
- detectMultiScale人脸识别函数的使用
参考文章https://blog.csdn.net/itismelzp/article/details/50379359
https://blog.csdn.net/dalaipifengxiansheng/article/details/51378879
- os模块的使用
参考文章ttp://www.cnblogs.com/kaituorensheng/archive/2013/03/18/2965766.html
os.listdir(path)https://www.cnblogs.com/chamie/p/4830191.html
os.splitext(file)使用 https://zhidao.baidu.com/question/1435695488679721739.html
- sys.stdout.flush()的使用
参考文章https://blog.csdn.net/wuguangbin1230/article/details/77680058
- Matplotlib.font_manager.FontProperties设置字符集
参考文章https://www.jb51.net/article/113609.htm
饼图绘制参考文章https://www.cnblogs.com/zsr0401/p/6405538.html
#需要导入的包
import itchat
import os
import cv2
import matplotlib.pyplot as plt
import matplotlib.font_manager
import sys
#DateFromWebChat模块完整代码
class DataFromWebchat:
def __init__(self,facedir):
self.facedir = facedir #接收图像文件目录
pass
def downloadFriendFaces(self):
print('开始登陆.......')
itchat.auto_login(hotReload=True)
print('开始获取好友列表.....')
friends = itchat.get_friends()
print('开始下载好友头像.....')
count = 0
for friend in friends:
print('.',end='')
if (count+1)%60==0:
print()
sys.stdout.flush()
username = friend['UserName']
filename = self.facedir + 'face%05d.png'%(count)#设置文件名
with open(filename,'wb') as fd:
faceDate = itchat.get_head_img(userName=username)#获取头像
fd.write(faceDate)
count+=1
print('好友头像下载完毕!')
#完整人脸识别代码如下
class AI:
def __init__(self,facedir):
# 创建一个分类器并且初始化
self.facedir = facedir
self.classtool = cv2.CascadeClassifier('C:\\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\\cv2\\data\\haarcascade_frontalface_alt.xml')
#注意人脸分类器的参数路劲必须是绝对路劲不能是相对路劲否则error
def recognize(self):
sum = 0 #记录头像总数
facenum = 0 #记录人脸总数
# 遍历图像识别是否为人脸
print('开始识别是否为人脸.........')
files = os.listdir(self.facedir)#获取路径下所有文件
for file in files:
if (sum + 1) % 60 == 0:
print()
file = self.facedir + file
if os.path.splitext(file)[1]== '.png':
img = cv2.imread(file) #图像灰度处理
# print('img=',img)
faces = self.classtool.detectMultiScale(image=img, scaleFactor=1.2, minNeighbors=5)
#第一个参数为传入灰度图像,第二个我小矩形放缩比率,第三个为,确定小矩形需满足的数目
if len(faces) > 0:
facenum += 1
print('\033[33m.\033[0m', end='')
else:
print('\033[34mx\033[0m', end='')
sys.stdout.flush()
sum +=1
print('头像识别完毕!!!!!')
return (sum,facenum) #返回参数用于DateVisual模块使用
#完整可视化模块如下
class VisualDate:
def __init__(self):
self.font = matplotlib.font_manager.FontProperties(fname=r'c:\windows\fonts\simsun.ttc')
plt.figure(figsize=(9,6),dpi=80)
plt.axes(aspect=1) # set this , Figure is round, otherwise it is an ellipse
print('数据可视化。。。。')
def visualround(self,data):
sum = data[0]
facenum = data[1]
pie = plt.pie((100.0*facenum/sum,100.0*(sum-facenum)/sum),#计算圆饼图频率
labels=('使用人脸做头像','不使用人脸做头像'),#设置图形边界的说明标签
colors=('yellow','purple'),#颜色设置饼图的
labeldistance=1.1,#设置标签距离中心点的距离
autopct='%5.2f%%',#设置频率的数字格式
shadow=False, #设置是否有阴影
startangle=0, #画图的其实角度
pctdistance=0.6) #设置饼图距离原点的距离
for temp in pie[1]:
temp.set_fontproperties(self.font)#把标签元组元素提取出来设置字符集
plt.title('微信好友使用人脸头像情况(总数=%d)' % data[0], fontproperties=self.font)#设置图形标题
plt.show()#显示图形
#union模块完整代码如下
class union:
date = DataFromWebchat(FECEDIR) #实例化类
MyAi = AI(FECEDIR) #实例化AI类
visual = VisualDate()#实例化类
def analysis(self):
self.date.downloadFriendFaces()
sum,facenum = self.MyAi.recognize()#提取参数
self.visual.visualround((sum,facenum))
print(sum,facenum)
run = union()
run.analysis()
代码运行效果截图:
微信好友图片下载截图:
代码下载地址:https://github.com/luozekun1230/MyPyhonAIprogram.git