一言不和,先上码子(纯新手,莫嘲笑)

  1. # encoding: utf-8
  2. #老杨的猫,环境:PYCHARM,python3.6,opencv3
  3.  
  4. import cv2,os
  5. import cv2.face as fc #此处有坑,找不到脸,这样引用程序可以运行,欢迎大牛指点,CV2和CV3的结构区别没有搞清楚,应该怎么样引用才是正确的
  6. import numpy as np
  7. from PIL import Image, ImageDraw, ImageFont #pip install pillow
  8.  
  9. #由于cv2.putText()不支持汉字,把图像里加入需要显示的文字,可以为汉字
  10. def cvtopil(img,posion,txt):#图像数组,文字位置,文字内容
  11. pil_im = Image.fromarray(img)
  12. draw = ImageDraw.Draw(pil_im)
  13. font = ImageFont.truetype("simhei.ttf", 50, encoding="utf-8") # 第一个参数为字体文件路径,第二个为字体大小
  14. draw.text(posion, txt, (0, 0, 255), font=font) # 第一个参数为打印的坐标,第二个为打印的文本,第三个为字体颜色,第四个为字体
  15. image=cv2.cvtColor(np.array(pil_im), cv2.COLOR_RGB2BGR) #把图像数组由RGB转为CV2处理的BGR格式
  16. return image #返回处理后图像文件
  17. #脸部图像采集模块。采集脸部图像,转为200*200的大小后,存到每个人对应的文件夹下
  18. def dectface():
  19. #OPENCV3 自带的脸部检测XML文件
  20. #D:\Downloads...../haarcascade_frontalface_default.xml 文件所在路径为我的电脑里文件路径,检测脸部,可酌情修改
  21. face_cas=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_frontalface_default.xml')
  22. #检测眼睛,这里用不到
  23. eye_cas=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_eye.xml')
  24. cap=cv2.VideoCapture(0)#打开默认摄像头
  25. count=0 #初始化计数器,用来生成文件名,如0.pgm,1.pgm,3.pgm.....
  26.  
  27. '''
  28. C:\Users\Administrator\.PyCharm2017.2\system\python_stubs\-1184660488\cv2\CascadeClassifier.py
  29. 连续读取摄像头图像,检测到脸部图像,把脸部图像以PGM的灰度格式格式保存在当前程序路径里的 jm1,jm2...文件夹下
  30. 采集要求:1光线适中,2脸部正直,3脸部图像大小以刚刚露出头发和下颌最佳,控制距离,太远采集图像精确度差,太近
  31. 没脸,4有效采集时间5秒左右就够用了,太多影响运行速度。
  32. '''
  33. while True:
  34. ret,frame=cap.read()#读取图像,RET为判断是否采集到图像,FRAME为采集到的一帧图像
  35. #此处最好判断是否采集到图像 if ret:do else:err 偷懒了
  36. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #转为灰度图像,用来判断脸部用
  37. # 找脸,参数:图像文件,压缩率(越小检测迭代次数越多,越慢,越详细,此处图像大,1.3-1.5均可),矩形个数最小值,flags不知道,最小检测窗口大小,最大检测窗口大小。返回一个脸部区域,左上角为(0,0)坐标系,起始x,y点,w宽,h高
  38. faces = face_cas.detectMultiScale(gray, 1.3, 5)
  39. #用方框勾画出脸部位置
  40. for (x, y, w, h) in faces:
  41. img=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,255,0),2) #画矩形,位置,大小,颜色,通道
  42. #cv2.putText(img,'abc',(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2) 不能显示汉字
  43. frame=cvtopil(img,(x,y-20),"老杨")#测试汉字用,可采集出图像是灰的,待解决
  44. f=cv2.resize(gray[y:y+h,x:x+w],(200,200)) #从灰度图中,扣出脸部,设置固定大小像素
  45. #保存到jm1里
  46. cv2.imwrite('F:\pytest\cvtest\detectface\jm1\ %s.pgm'%str(count),f)
  47. count+=1
  48. #眼睛检测
  49. # eyes=eye_cas.detectMultiScale(f,1.03,5,0,(40,40))
  50. # for (ex,ey,ew,eh) in eyes:
  51. # cv2.rectangle(img,(ex,ey),(ex+ew,ey+eh),(0,0,255),2)
  52. cv2.imshow("demo",frame) #显示图像
  53. # cv2.waitKey(0)
  54. if cv2.waitKey(1) & 0xFF == ord('q'):
  55. break
  56. # camera.release()
  57. # cv2.destroyAllWindows()
  58.  
  59. #读取样本文件,并加载到一个列表里,返回值包括2部分,[文件列表,对应标签],标签用来对照姓名用。
  60. def read_img(path,sz=None):
  61. pr_img=[] #图像列表
  62. pr_flg=[] #对应标签
  63. pr_count=0 #初始化检测到的人数
  64. for dirname,dirnames,filenames in os.walk(path):#遍历当前程序目录我的图像文件保存在f:盘下
  65. #print(os.walk(path))
  66. #print(dirname,dirnames,filenames)
  67. for subdirname in dirnames: #遍历程序文件夹下的各个目录
  68. subject_path=os.path.join(dirname,subdirname)
  69. print(subject_path)
  70. for filename in os.listdir(subject_path): #遍历文件夹下文件
  71. print(filename)
  72. try:
  73. filepath=os.path.join(subject_path,filename)
  74. im=cv2.imread(filepath,cv2.IMREAD_GRAYSCALE) #读取JM文件下PGM文件
  75. print(filepath)
  76. #print(im.shape)
  77. if im.shape!=(200,200): #判断像素是否200
  78. im=cv2.resize(im,(200,200))
  79. pr_img.append(np.asarray(im,dtype=np.uint8)) #添加图像
  80. pr_flg.append(pr_count)#添加标签
  81. except:
  82. print("io error")
  83. pr_count+=1 #另一个人的标签
  84. return [pr_img,pr_flg]
  85.  
  86. #学习样本,比对样本和实例,根据对应算法返回标签和系数,依据标签对照姓名,系数值提现了准确度。
  87. def face_rec():
  88. names=['BAO BAO ','BA BA BA ','Bei Bei','MMMMMMM'] #标签对应的名字0,baobao,1,bbb,2,beibei....
  89. [x,y]=read_img("f:") #调读取函数,返回图像、和标签列表
  90. y=np.asarray(y,dtype=np.int32) #转为NUMPY的ARRAY
  91.  
  92. #CV自带的三种算法,现用LBPH算法。此处有坑,坑的我差点放弃,原来叫createLBPHFaceRecognizer,为什么我下载的这模样
  93. #model=fc.EigenFaceRecognizer_create()
  94. #model = fc.FisherFaceRecognizer_create()
  95. model = fc.LBPHFaceRecognizer_create()
  96.  
  97. # 训练,此处应把训练结果保存,再用到时直接读取结果,效率更高,xml?json?pickle?
  98. model.train(np.asarray(x),np.asarray(y))
  99.  
  100. #下面读取摄像头图像,用矩形标识检测到脸部和训练后结果比对,打印出对应标签所对应名字
  101. camera=cv2.VideoCapture(0)
  102. face_cascade=cv2.CascadeClassifier('D:\Downloads\opencv-3.3.1-vc14\opencv\sources\data\haarcascades/haarcascade_frontalface_default.xml')
  103. while True:
  104. read,img=camera.read()
  105. faces=face_cascade.detectMultiScale(img,1.3,5)
  106. for (x,y,w,h) in faces:
  107. img=cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
  108. gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  109. roi=gray[x:x+w,y:y+h]
  110. try:
  111. roi=cv2.resize(roi,(200,200),interpolation=cv2.INTER_LINEAR)
  112.  
  113. params=model.predict(roi) #predict()函数做比对,返回一个元祖格式值 (标签,系数)。系数和算法有关,
  114. # 前2种算法值低于5000不可靠,LBPH低于50可靠,80-90不可靠,高于90纯蒙
  115. #此处有文章可做,通过单位时间内检测到的系数平均值,可以得到更准确结果
  116. print(params)
  117. #打印标签对应名字,如cvtopil的灰度问题解决,可cvtopil函数替换
  118. cv2.putText(img,names[params[0]],(x,y-20),cv2.FONT_HERSHEY_SIMPLEX,1,255,2)
  119. except:
  120. continue
  121. cv2.imshow("abc",img)
  122. if cv2.waitKey(1) & 0xFF == ord('q'):
  123. break
  124. cv2.destroyAllWindows()
  125. if __name__=='__main__':
  126. '''
  127. 1.先用dectface()采集样本,注释掉face_rec(),将采集样本保存到jm文件夹里,现在每次采集不同人样本,需要手动建立JM1,JM2.....以后应完善程序流程为,首先判断是否有此人样本,如没有自动建立文件夹并保存该人的样本。
  128. 2.采集完成后,注释dectface(),用face_rec()通过比对得到是谁的结果。
  129. 3.names=['BAO BAO ','BBBBBBB','Bei Bei','MMMMMMM'] 名字和对应标签应该存成文件,对应读取
  130. 3.真心不会用类啊。。。咋用类实现整个流程呢??
  131. 4.从学PYTHON到现在也不过一个月时间,基础很不牢,cv2,CV3从引用到使用的区别搞不清楚呢,恳求大牛各种批评指导啊!!
  132. '''
  133. #dectface()
  134. face_rec()

python3 opencv3 实现基本的人脸检测、识别功能的更多相关文章

  1. Emgu cv人脸检测识别

    Emgu cv人脸检测识别 1.开发平台:WIN10 X64    VS2012    Emgucv版本:3.1 2.先给大家分享一个官网给的示例源代码: https://ncu.dl.sourcef ...

  2. 基于opencv3.0下的人脸检测和检测部分的高斯模糊处理

    如题 这里将任务分解为三大部分: 1.录播放视频 2.人脸检测 3.部分高斯模糊 其中重点放在人脸检测和部分高斯模糊上 1.录播放视频(以opencv中的VideoCapture类进行实现) 首先罗列 ...

  3. 在opencv3中进行图片人脸检测

    在opencv中,人脸检测用的是harr或LBP特征,分类算法用的是adaboost算法.这种算法需要提前训练大量的图片,非常耗时,因此opencv已经训练好了,把训练结果存放在一些xml文件里面.在 ...

  4. Python学习案例之视频人脸检测识别

    前言 上一篇博文与大家分享了简单的图片人脸识别技术,其实在实际应用中,很多是通过视频流的方式进行识别,比如人脸识别通道门禁考勤系统.人脸动态跟踪识别系统等等. 案例 这里我们还是使用 opencv 中 ...

  5. Python学习案例之人脸检测识别

    前言 随着科技的发展,人脸识别技术在许多领域得到的非常广泛的应用,手机支付.银行身份验证.手机人脸解锁等等. 识别 废话少说,这里我们使用 opencv 中自带了 haar人脸特征分类器,利用训练好的 ...

  6. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

      AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haa ...

  7. MTCNN人脸检测识别笔记

    论文:Joint Face Detection and Alignment using Multi-task Cascaded Convolutional Networks 论文链接:https:// ...

  8. Python视频人脸检测识别

    案例 这里我们还是使用 opencv 中自带了 haar人脸特征分类器,通过读取一段视频来识别其中的人脸. 代码实现:   动图有点花,讲究着看吧:   如果是捕捉摄像头,只需要改变以下代码即可: c ...

  9. 人脸检测识别,人脸检测,人脸识别,离线检测,C#源码

    百度网盘地址 微云地址 使用虹软人工智能开放平台技术开发完成

随机推荐

  1. Python —— 函数高级特性(切片、迭代、列表生成式、生成器、迭代器)

    一.切片(Slice) 在很多编程语言中,针对字符串提供了很多截取函数(i.e.  substring),目的就是对字符串切片.python中没有针对字符串的截取函数,需要通过“切片”来完成. 取一个 ...

  2. pycharm配置QtDesigner

    QtDesigner C:\Qt\Qt5.12.2\5.12.2\mingw73_64\bin\designer.exe $ProjectFileDir$ Pyuic C:\Anaconda3\pyt ...

  3. XJ模拟noip赛1

    什么都不说—— 成功打出 G-G!

  4. CloudStack 云计算平台框架

    前言 CloudStack 和OpenStack 一样都是IaaS层 开源框架,可以管理XenServer.ESXI.KVM.OVM等主流虚拟机,相对OpenStack比较简单.稳定: 二.Cloud ...

  5. 在Postman中使用不受信任的SSL证书

    阅读目录 第一种方案——临时添加到受信任的证书颁发机构: 第二种方案——永久添加到受信任的证书颁发机构: add by zhj: 在http://www.cnblogs.com/ajianbeyour ...

  6. SpringBoot 下 mybatis 的缓存

    背景: 说起 mybatis,作为 Java 程序员应该是无人不知,它是常用的数据库访问框架.与 Spring 和 Struts 组成了 Java Web 开发的三剑客--- SSM.当然随着 Spr ...

  7. 自动化扫描src漏洞

    首先介绍一下常见的漏洞类型: 漏洞自动扫描思路: 常见的一些github上常用的漏洞采集工具,我们可以利用一款工具进行接口调用直接进行利用 自动化工具的雏形:

  8. php使用gearman进行任务分发

    一.安装gearman 下载gearman源码包 1 https://launchpad.net/gearmand/+download 如: gearmand-1.1.12.tar.gz 下载php的 ...

  9. vscode 创建.net core项目初体验

    微软的virtual studio编辑器那是宇宙第一大编辑器,可惜就是太笨重,遇到性能差一些的电脑设备,简直无法快速的编辑项目. 而vs code编辑器轻便易用,想要编辑哪种项目,只需扩展插件就OK, ...

  10. idea的一般使用和初始配置

    ----- idea的一般使用和配置 1.java的类注释及方法注释 :https://blog.csdn.net/sikefeng/article/details/80557265 类注释模板 /* ...