微信人脸识别可视化的实现:

2018-11-08  本文已影响0人  罗泽坤

实现方式主要通过以下模块实现:

知识准备:

知识解析:

#需要导入的包
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()        

代码运行效果截图:

visual.PNG

微信好友图片下载截图:

111.PNG

代码下载地址:https://github.com/luozekun1230/MyPyhonAIprogram.git

上一篇 下一篇

猜你喜欢

热点阅读