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

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

  • 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()        

代码运行效果截图:

visual.PNG

微信好友图片下载截图:

111.PNG

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

你可能感兴趣的:(微信人脸识别可视化的实现:)