当前位置:   article > 正文

Python编程 - 基于OpenCV实现人脸识别(实践篇)爬虫+人脸识别_opencv python 人脸识别例程

opencv python 人脸识别例程

一.案例概述

  1. 本案例需要一定的Python编程基础并掌握OpenCV基本使用。
  2. 时间仓促:初略编写文档

效果如下:

开发环境

操作系统:Windows 10

开发工具:PyCharm 2019.2版本

python版本:3.6.7

计算机视频库包:opencv_contrib_python-4.1.0.25-cp36-cp36m-win_amd64.whl

算法支持包:numpy(安装opencv默认安装numpy)

下载地址:

Python3.6.7:

Download Python​www.python.org​

Pycharm工具:

http://Download PyCharm: Python IDE for Professional Developers by JetBrains​www.jetbrains.com

第三方包下载:

opencv-contrib-python​pypi.org​编辑

二.编写案例准备资源:

准备工作:

  1. 1.开发环境、开发工具及第三方包准备完善并创建空项目。
  2. 2.准备一些个人的图片(或者通过代码保存个人面部存入本地)要求:图片名称有一定规律
  3. 3.爬虫文件 - 爬取明星照片并存储本地
  4. 4.将明星图片和个人图片通过opencv处理保存面部图片
  5. 5.开始编写人脸识别的代码

三.代码编写顺序

一.爬虫代码直接下载运行: 点击下载

链接: https://pan.baidu.com/s/1BNzSQ2Xk9GkYslhwKXLYSQ 提取码: qmy1
二.安装python爬虫需要的第三方包

  • requests(用户网络访问)
  • beautifulsoup4(用户数据结构解析)
  • pypinyin(用于中文转换为拼音)

三.运行python爬虫代码

四.将图片转换为面部图片进行存储

  1. # 获取小头像信息
  2. import cv2
  3. import os
  4. # 图片张数变量
  5. def read_image():
  6. dirs = os.listdir("d_img")
  7. for j,dir in enumerate(dirs):
  8. print(dir)
  9. # 判断是否有存储头像的路径
  10. file_path = "x_face/%s"%str(dir);
  11. if not os.path.exists(file_path):
  12. os.makedirs(file_path);
  13. pass
  14. num = 0;
  15. for i in range(0,20):
  16. image = cv2.imread('d_img/%s/%d.jpg'%(dir,i))
  17. gray = cv2.cvtColor(image,code = cv2.COLOR_BGR2GRAY);
  18. # 数据参数
  19. face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml");
  20. # [3]进行数据对比:minNeighbors = 每一个目标至少要被检测 -整数
  21. face_01 = face_detector.detectMultiScale(gray, minNeighbors=4);
  22. # 绘制矩形人脸检测
  23. print("第%d张图片===:"%i,face_01)
  24. print(type(face_01))
  25. if isinstance(face_01,tuple):
  26. print("没有检查的头像")
  27. pass
  28. else:
  29. print("****有检查的头像****")
  30. for x, y, w, h in face_01:
  31. # time.sleep(10)
  32. x_face = gray[y:y + h, x:x + w];
  33. x_face = cv2.resize(x_face,dsize=(200,200));
  34. bo_photo = cv2.imwrite("%s\%d.jpg" % (file_path, num), x_face);
  35. print("保存成功:%d" % num)
  36. pass
  37. num+=1;
  38. pass
  39. pass
  40. pass
  41. if __name__ == '__main__':
  42. read_image();
  43. pass

运行结果 - 生产以下文件:

五.人脸识别 - 主代码

  1. # 人脸识别 - 主代码
  2. import cv2
  3. import os
  4. import time
  5. import numpy as np;
  6. # 图片张数变量
  7. def Get_x_faces():
  8. dirs = os.listdir("x_face")
  9. print(dirs)
  10. X = []#
  11. Y = []#
  12. for j,dir in enumerate(dirs):
  13. for i in range(0,9):
  14. image = cv2.imread('x_face/%s/%d.jpg'%(dir,i))
  15. gray = cv2.cvtColor(image,code = cv2.COLOR_BGR2GRAY);
  16. print("读取",gray.shape)
  17. # NoneType ndarray
  18. if len(str(image))!=0:
  19. print("加入。。。。")
  20. X.append(gray)
  21. Y.append(j)
  22. pass
  23. return [X,Y,dirs]
  24. pass
  25. if __name__ == '__main__':
  26. X,Y,dirs = Get_x_faces();
  27. print("X=",X)
  28. print("Y=",Y)
  29. print("dirs=",dirs)
  30. #asarray都可以将结构数据转化为ndarray
  31. X = np.asarray(X);
  32. Y = np.asarray(Y);
  33. # 产生一个随机数 -
  34. index = [i for i in range(0,len(X))];
  35. print(index)
  36. #现场修改序列,改变自身内容。(类似洗牌,打乱顺序)
  37. np.random.shuffle(index);
  38. print("***********",index)
  39. # 打乱顺序 :相同规则打乱
  40. X = X[index]
  41. Y = Y[index]
  42. print("88888888",Y)
  43. # 训练数据
  44. print("训练数据为:",len(X),len(Y))
  45. X_train = X[:len(X)]
  46. Y_train = Y[:len(Y)];
  47. print("800000",Y_train)
  48. # 算法Eigen 特征的意思
  49. # 主成分分析(PCA)——Eigenfaces(特征脸)——函数:cv2.face.EigenFaceRecognizer_create
  50. model = cv2.face.EigenFaceRecognizer_create();
  51. print(model)
  52. # 算法学习
  53. print("算法学习", len(X_train), len(Y_train));
  54. model.train(X, Y);
  55. print("已经学会了数据。。。。")
  56. # 测试数据
  57. # X_test, Y_test = X[-5:], Y[-5:];
  58. # 开始验证
  59. # for data in X_test:
  60. # # print(data)
  61. # result = model.predict(data);
  62. # print("=================")
  63. # print(result)
  64. # print(dirs[result[0]])
  65. # pass
  66. Video_face = cv2.VideoCapture(0);
  67. face_detector = cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")
  68. # while循环调取视频图形
  69. while True:
  70. flag,frame = Video_face.read();
  71. gray = cv2.cvtColor(frame,code=cv2.COLOR_BGR2GRAY);
  72. faces = face_detector.detectMultiScale(gray,1.3,5);
  73. if isinstance(faces, tuple):
  74. print("没有检查的头像")
  75. pass
  76. else:
  77. print("有头像了。。。。")
  78. # for循环遍历数据
  79. for x, y, w, h in faces:
  80. cv2.rectangle(frame, pt1=(x, y), pt2=(x + w, y + h), color=[0, 0, 255], thickness=2);
  81. face = gray[y:y + h, x:x+w];
  82. print("===]]]", face.shape)
  83. face_1 = cv2.resize(face, dsize=(200, 200));
  84. print("=================")
  85. print(face_1.shape)
  86. # 开始对比
  87. print("~~~~"*20)
  88. print(" 参数为:",face_1.shape);
  89. result = model.predict(face_1);
  90. print("对比返回结果:", result)
  91. print('该人脸是:', dirs[result[0]])
  92. a1 = dirs[result[0]]
  93. if result[1]<1600:
  94. a1 = "NO"
  95. pass
  96. cv2.putText(frame, a1, (x, y), cv2.FONT_ITALIC, 1, [0, 0, 255], 2);
  97. pass
  98. pass
  99. cv2.imshow('face', frame)
  100. cv2.waitKey(100)
  101. pass
  102. video.release()
  103. cv2.destroyAllWindows();
  104. pass

大功告成

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/686770
推荐阅读
相关标签
  

闽ICP备14008679号