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 cv
Image = 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:
break
face_detect_demo(img)
if ord('q') == cv.waitKey(1):
break
cap.release() #释放视像头内存
#释放内存
cv.destroyAllWindows()
当前是读取摄像头的视频信息,如果直接填入路径的话那么就会读取到视频的内容进行人脸标注
到目前为止已经可以把人脸从视频或者图片当中抠下来了(其实当当前步骤已经可以实现前些日子比较火热的AI外挂了,不过目前使用的识别模型不咋滴,如果要用得专门训练一下,然后结合外设驱动,我们这边返回获取的人头的坐标,更具游戏特色我们还得计算一下枪械的后座偏移量然后驱动光标瞄准射击。外挂的原理其实也类似,只是人家的坐标是直接在内存里面抓到的,不是我们这样还要通过人脸识别)
搞人脸识别那必然还是要录入人脸信息的,这里由两个方案,一个是直接准备好图片(就是需要录入的人脸的照片)或者通过摄像头录入,由于我们识别的时候要调取摄像头所以建议从摄像头里面开始录入。第一个方案准备照片就好了,第二个方案看下面代码即可:
import cv2.cv2 as cv2
import os
import threading
name = None
save_flag = False
lock = threading.Lock()
def input_name():
global name,save_flag
while 1:
if name =="Q" or name=="q":
return
else:
name=input("\n:")
save_flag = True
def Get_Face():
global name,save_flag
cap = cv2.VideoCapture(0)
num = 1
Path_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()
return
if save_flag:
cv2.imwrite(Path_save+str(num)+"."+name+".jpg",VImg)
print("\n图片已保存:"+str(num)+"."+name+".jpg")
num += 1
save_flag = False
lock.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):
#函数作用是提取人脸然后返回人物的人脸和id
faceseare=[] # 保存检测出的人脸
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("请先录入人脸")
return
for 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,ids
if __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 data
recogizer=cv.face.LBPHFaceRecognizer_create()#加载训练数据集文件
recogizer.read('trainer/trainer.yml')
names=[]
warningtime = 0
#准备识别的图片
def face_detect_demo(img):
global warningtime
gray=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 += 1
if warningtime > 100:
warningtime = 0
print("未识别出此人") #这块的话其实可以再搞一套对应的惩罚机制
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:
break
face_detect_demo(frame)
if ord(' ') == cv.waitKey(10): #按下空格关了
break
cap.release()
cv.destroyAllWindows()
1.lena.jpg
效果:
到这里一个最基本的识别就做好了,那么关于这里面的惩罚机制或者通过识别后的机制其实,如果可以结合树莓派的话是可以自己做一个寝室专用的门禁系统的。