文章目录

  • 环境
  • 使用的函数接口
  • 流程
  • 人脸检测部分
    • 图片读取/尺寸修改
    • 图片矩形标注
    • 人脸检测
    • 读取视频标注人脸
  • 人脸识别
    • 人脸信息录入
    • 数据训练
    • 人脸识别

通过最近的学习感触颇多,大数据,人工智能,分布式,云计算,基于云的云安全,万物互联真的是未来大方向!所谓的web开发,服务器后端其实只是一个开始,玩了python 后端也在体验spring全家桶(学习ing)只要做一个像样的“万人会话”基本上都不会只是靠那一套“增删改查”能够实现的,都会涉及到并发,并行,但是想要做好又涉及到分布式,微服架构等等。此外还有更多的服务细节,例如如何实时分析用户喜好从而推送对应内容等等。这些与大数据联系密切,与分布式计算联系紧密。当然也从这里我意识到python 并不适合,且不论性能,单从这里就可以看到在这一方面python的方案并不如Java,尽管它也有所选择。不过好在的是python凭借着丰富的类库,在机器学习,人工智能这块使用起来的简便性让它魅力依旧,当然这里且不论底层。
当然这里并不是说我那些玩意不玩了,这是不可能的,毕竟还有个web项目没写完( White Hole),而且还得用Springboot 重构。

环境

1.python 3.7
2.opencv

pip3 install opencv-python
pip3 install opencv-contrib-python

这个的话目前其实还是简单的接口调用。

使用的函数接口

铁打的API,流水的程序员呀!

import cv2.cv2 as cv
cv.imread() #读取图片
cv.cvtColot() #图片颜色处理(灰度处理)
cv.imwrite() #保存图片
cv.imshow()  #展示图片
cv.waitKey() #窗口展示(其实是等待键盘输入,IO阻塞)停留传入时间毫秒,返回键盘按下的键位的ascll值
cv.resize() #修改图片大小
cv.rectangle() #绘制矩形
cv.circle() #绘制圆形
cv.CascadeClassifier()#使用训练模型
cv.VideoCapture() #读取视频0表示读取摄像头
face.LBPHFaceRecognizer_create() #数据训练
cv.destoryAllWindows() #释放内存

流程

这里的话主要分为两个大步走

1.读取图片/视频内的人脸信息,识别人脸位置(框出人脸位置)
2.将识别出的人脸进行比对(特征提取)

人脸检测部分

图片读取/尺寸修改

import cv2.cv2 as cvImage = cv.imread("Image/face1.jpg")
cv.imshow("Image",Image)
Image_resize = cv.resize(Image,dsize=(200,200))
cv.imshow("ResizeImage",Image_resize)
cv.waitKey(0)
cv.destroyAllWindows()

图片矩形标注

import cv2.cv2 as cv
img = cv.imread('Image/face1.jpg')
x,y,w,h = 100,100,100,100 #起始坐标
#绘制矩形
cv.rectangle(img,(x,y,x+w,y+h),color=(0,0,255),thickness=1) # 方框颜色,粗细
#绘制圆形
cv.circle(img,center=(x+w,y+h),radius=100,color=(255,0,0),thickness=5)
#显示
cv.imshow('re_img',img)
cv.waitKey(0)
cv.destroyAllWindows()

人脸检测

#导入cv模块
import cv2.cv2 as cv
import cv2.data as data#读取图像
img = cv.imread('Image/face1.jpg')
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_alt2.xml")
face = face_detect.detectMultiScale(gary)
for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv.imshow('result',img)cv.waitKey(0)
#释放内存
cv.destroyAllWindows()

函数说明

gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY) 二值化处理图片

face_detect = cv.CascadeClassifier(data.haarcascades+“haarcascade_frontalface_alt2.xml”)
这个是加载使用人家训练好的提取头像的模型帮助我们提取出图片的人脸,此外还有还有提取人眼的,等等。

face = face_detect.detectMultiScale(gary)按照模型提取出人脸的大小位置,返回一个元组

重点

face = face_detect.detectMultiScale(gary,1.01,5,0,(100,100),(300,300))
还可以这样用,1.01表示图片缩放倍数
5对比次数,意思是对比了五次还是一样的话就认为是人脸
0默认参数不用管,加上
(100,100) (300,300) 表示人脸的范围,这个可以设置
这些参数都可以不设置,直接使用默认的
face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_alt2.xml")
这里加载的模型其实是在虚拟环境下的site-pakges里面找到的


此外如果你安装了opencv的话那么你也可以在opencv的安装目录找到,到时候你要用哪个就搞哪个.
例如我安装在D盘

face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')

我直接填写路径
这边推荐直接使用默认的。

 face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.x")

读取视频标注人脸

cap = cv.VideoCapture(0) 读取摄像头
#导入cv模块
import cv2.cv2 as cv
import cv2.data as data
import time
#检测函数
def face_detect_demo(img):gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detect = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xml")face = face_detect.detectMultiScale(gary)for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.imshow('result',img)cap = cv.VideoCapture(0)
while True:flag, img = cap.read()if not flag:breakface_detect_demo(img)if ord('q') == cv.waitKey(1):break
cap.release() #释放视像头内存
#释放内存
cv.destroyAllWindows()

当前是读取摄像头的视频信息,如果直接填入路径的话那么就会读取到视频的内容进行人脸标注

人脸识别

到目前为止已经可以把人脸从视频或者图片当中抠下来了(其实当当前步骤已经可以实现前些日子比较火热的AI外挂了,不过目前使用的识别模型不咋滴,如果要用得专门训练一下,然后结合外设驱动,我们这边返回获取的人头的坐标,更具游戏特色我们还得计算一下枪械的后座偏移量然后驱动光标瞄准射击。外挂的原理其实也类似,只是人家的坐标是直接在内存里面抓到的,不是我们这样还要通过人脸识别)

人脸信息录入

搞人脸识别那必然还是要录入人脸信息的,这里由两个方案,一个是直接准备好图片(就是需要录入的人脸的照片)或者通过摄像头录入,由于我们识别的时候要调取摄像头所以建议从摄像头里面开始录入。第一个方案准备照片就好了,第二个方案看下面代码即可:

import cv2.cv2 as cv2
import os
import threadingname = None
save_flag = False
lock = threading.Lock()
def input_name():global name,save_flagwhile 1:if name =="Q" or name=="q":returnelse:name=input("\n:")save_flag = Truedef Get_Face():global name,save_flagcap = cv2.VideoCapture(0)num = 1Path_save = r"Image/InPutImg/"if not os.path.exists(Path_save):os.makedirs(Path_save)while(1):ret_flag,VImg = cap.read()cv2.imshow("Capture_Test",VImg)cv2.waitKey(1)lock.acquire()if name:if name == "Q" or name == "q":lock.release()returnif save_flag:cv2.imwrite(Path_save+str(num)+"."+name+".jpg",VImg)print("\n图片已保存:"+str(num)+"."+name+".jpg")num += 1save_flag = Falselock.release()cap.release()cv2.destroyAllWindows()if __name__=="__main__":t1 = threading.Thread(target=Get_Face)t2 = threading.Thread(target=input_name)t1.start()t2.start()

这里为了控制输入额外开了个线程,不过显示没法做到同步,做了就堵死了~
之后在项目的文件夹下会多出一个文件


里面保存了在摄像头拍摄的人脸。

数据训练

这个重复先前的步骤
把获取的图片提取出人脸,然后把对应的人脸和人物的id进行训练

import os
import cv2.cv2 as cv
import numpy as np
import cv2.data as data
def getImageIds(path):#函数作用是提取人脸然后返回人物的人脸和idfaceseare=[] # 保存检测出的人脸ids=[] #imagePaths=[os.path.join(path,f) for f in os.listdir(path)]#人脸检测face_detector = cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xml")if imagePaths:print('训练图片为:',imagePaths)else:print("请先录入人脸")returnfor imagePath in imagePaths:#二值化处理img = cv.imread(imagePath)img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)img_numpy=np.array(img,'uint8')#获取图片矩阵faces = face_detector.detectMultiScale(img_numpy)id = int(os.path.split(imagePath)[1].split('.')[0])for x,y,w,h in faces:ids.append(id)faceseare.append(img_numpy[y:y+h,x:x+w])print('已获取id:', id)return faceseare,idsif __name__ == '__main__':#图片路径path='Image/InPutImg'#获取图像数组和id标签数组和姓名faces,ids=getImageIds(path)#获取训练对象recognizer=cv.face.LBPHFaceRecognizer_create()recognizer.train(faces,np.array(ids)) #把对应的人脸和id联系起来训练#保存训练文件model_save = "trainer/"if not os.path.exists(model_save):os.makedirs(model_save)recognizer.write('trainer/trainer.yml')

人脸识别

这个就是最后一步了,主要其实就是通过评分进行识别

import cv2.cv2 as cv
import os
import cv2.data as datarecogizer=cv.face.LBPHFaceRecognizer_create()#加载训练数据集文件
recogizer.read('trainer/trainer.yml')
names=[]
warningtime = 0#准备识别的图片
def face_detect_demo(img):global warningtimegray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)face_detector=cv.CascadeClassifier(data.haarcascades+"haarcascade_frontalface_default.xm")face=face_detector.detectMultiScale(gray)for x,y,w,h in face:cv.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)cv.circle(img,center=(x+w//2,y+h//2),radius=w//2,color=(0,255,0),thickness=1)# 人脸识别ids, confidence = recogizer.predict(gray[y:y + h, x:x + w])if confidence > 80: #评分越大可信度越低warningtime += 1if warningtime > 100:warningtime = 0print("未识别出此人") #这块的话其实可以再搞一套对应的惩罚机制cv.putText(img, 'unkonw', (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)else:#这里也对应一套识别后的机制cv.putText(img,str(names[ids-1]), (x + 10, y - 10), cv.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 1)cv.imshow('result',img)def get_name(names):path = 'Image/InPutImg/'imagePaths=[os.path.join(path,f) for f in os.listdir(path)]for imagePath in imagePaths:name = str(os.path.split(imagePath)[1].split('.',2)[1])names.append(name)cap=cv.VideoCapture(0)
get_name(names)
while True:flag,frame=cap.read()if not flag:breakface_detect_demo(frame)if ord(' ') == cv.waitKey(10): #按下空格关了break
cap.release()
cv.destroyAllWindows()

下面是演示。
1.已录入图片

1.lena.jpg

效果:

到这里一个最基本的识别就做好了,那么关于这里面的惩罚机制或者通过识别后的机制其实,如果可以结合树莓派的话是可以自己做一个寝室专用的门禁系统的。

分分钟自制人脸识别(如何快速识别心仪的小姐姐~)相关推荐

  1. 【python入门项目实战】:手把手教你给心仪的小姐姐制作漫画头像,懂中文就会

    前言 大家好! opencv是一个基于BSD许可发行(也就是俗称的开源)的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS上.由一系列 C 函数和少量 C++ 类 ...

  2. 三阶贝塞尔曲线选点_什么?贝塞尔曲线竟然可以用来描摹心仪的小姐姐!

    什么是贝塞尔曲线? ​ 贝塞尔曲线于 1962 年,由法国工程师皮埃尔·贝济埃(Pierre Bézier)所广泛发表,他运用贝塞尔曲线来为汽车的主体进行设计,贝塞尔曲线最初由保尔·德·卡斯特里奥于1 ...

  3. 教你用OCR文字识别工具快速识别图片上的文字

    OCR文字识别工具,指利用OCR(Optical Character Recognition,光学字符识别) 技术,将图片.照片上的文字内容,直接转换为可编辑文本的工具.软件可以把图片 转换成可以编辑 ...

  4. 接入植物识别功能快速识别万种植物花卉

    作者:才能我浪费99 1.功能描述: 该请求用于识别一张图片,即对于输入的一张图片(可正常解码,且长宽比较合适),输出植物识别结果.近期植物识别进行了能力升级--模型升级,Top1准确率绝对值提升11 ...

  5. 数据分析师教你如何用Python向心仪的小姐姐表白

    今天是一个浪漫的日子,对于我们这些IT技术从业者来说,有时候尽管有点不善言辞,但是也能通过一些技术手段来表达一下对心仪女生的喜欢. 本文小编使用的第三方模块名叫Turtle来绘图,俗称海龟绘图,它能够 ...

  6. 电脑截图如何快速识别文字?3分钟教会你快速截图识别怎么做

    电脑截图已经成为我们日常生活中的常见操作,无论是工作还是学习,我们都有可能需要截取电脑屏幕上的某个区域进行保存或分享.但是,有时候我们需要识别截图中的文字内容,这时候该怎么办呢?接下来,本文将为大家介 ...

  7. 用 Python 人脸识别,选抖音上好看的小姐姐

    点击"开发者技术前线",选择"星标"? 在看|星标|留言,  真爱 1 目 标 场 景 相信大家平时刷抖音短视频的时候,看到颜值高的小姐姐,都有随手点赞关注的习 ...

  8. 目标识别:如何从人脸图片中扣出眼图,实时人脸人眼检测和识别

    一.了解opencv级联多级分类器: 我们使用opencv级联多级分类器进行解读: 1.基本概念  opencv中的人脸检测使用基于Harr的级联分类和基于LBP的级联分类.  Harr是在2001年 ...

  9. 课堂考试作弊检测系统,情绪识别、表情识别和人脸识别结合

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 智慧教室 课堂专注度及考试作弊系统.课堂动态点名,情绪识别.表情识别和人脸识别结合 课堂专注度 ...

最新文章

  1. cocos v3.10 下载地址
  2. Java 9因模块化进程缓慢而欲推迟发布
  3. Ubuntu 11.04解决txt文档中文乱码方法
  4. javascript的ES6学习总结(第三部分)
  5. 利用多线程实现报表的高效导出
  6. 前端 ---JS中的面向对象
  7. linux没有root密码xshell,LINUX终端免密登陆(以Xshell为例)
  8. .NET异步程序设计之任务并行库
  9. 系统架构设计师 - 软件架构设计 - 软件架构风格
  10. SkinSharp用法
  11. 45. PHP 过滤器(Filter)
  12. 155.最小栈(力扣leetcode) 博主可答疑该问题
  13. 【计算机图形学】画线算法——中点画线算法
  14. C# Socket简单例子(服务器与客户端通信)【转】
  15. [SQLITE_BUSY]问题简析与解决
  16. android4.4风格,Android 4.4消息汇总 扁平化风格来袭
  17. (一)理解word2vec:原理篇
  18. 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇6、影像专题产品生产
  19. 李开复给中国大学生的第六封信—选择的智慧
  20. PS磨皮滤镜Portraiture2.3简体中文绿色版32b/64b

热门文章

  1. Rotated Image
  2. eclipse run as 右键无python unit-test
  3. 计算机网络技术自考刷题APP,计算机网络自考app
  4. 人生苦短,能让你更早下班的Python垃圾回收机制
  5. java 皮尔逊相关系数_皮尔逊相关系数的java实现
  6. VUE货架详情之缩略图previewww
  7. C语言之数组(数组赋值的三种形式)
  8. 我机器人里面的匡威照片_有哪些影视剧中的匡威鞋让人印象深刻?
  9. Scikit learn Sample1—Isotonic Regression
  10. Excel错误链接的编辑