人脸识别(python+opencv)

目标
  • 检测人脸
  • 识别对应自己训练集中的人脸
  • 识别人脸后对自己的手机发送信息

工具

  • Python
  • pycharm
  • OpenCV

环境配置

有了Python和pycharm后,可在cmd中用pip进行安装

  • pip install opencv-python
    此过程会很慢,可以用下面这个
  • pip3 install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
    最后,到OpenCV的官网上,下载源码OpenCV-4.5.2
    在这里插入图片描述
    在这里插入图片描述
    最后最后,对自己的pycharm进行配置,创建项目

步骤

1.首先要用Python读取出图片
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#显示图片
cv.imshow('read_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()
2.灰度转换
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#灰度转换   调用自带的CVT函数(放所要转换的图片,变成什么样的颜色)
gray_img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#显示灰度
cv.i,show('gray'.gray_img)
#保存灰度图片
cv.imwrite('gray_face11.jpg',gray_img)
#显示图片
cv.imshow('read_img',img)
#等待
cv.waitKey(0)
#释放内存
cv.destroyAllWindows()
3.修改尺寸
#导入cv模块
import cv2 as cv
#读取图片
img = cv.imread('face1.jpg')
#修改尺寸
resize_img = cv.resiz(img,dsize=(200,200))
#显示原图
cv.imshow('img',img)
#显示修改后
cv.imshow('resize_img',resize_img)
#输出图片大小
print('未修改:',img.shape)
print('修改后:',resize_img.shape)
#等待
#cv.waitKey(0)
#键盘输入某个键后,自动关闭图片
while True:
	if ord('q') == cv.waitKey(0):
		break
#释放内存
cv.destroyAllWindows()
4.绘制矩形
#导入cv模块
import cv2 as cv
#坐标
x,y,w,h =100,100,100,100
#绘制矩形  rectangle(图片,(横坐标,纵坐标,长,宽),颜色,宽度)
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=1)
#显示
cv.imshow('re_img',img)
#等待
while True:
	if ord('q') == cv.waitKey(0):
		break
#释放内存
cv.destroyAllWindows()
5.人脸检测
#导入cv模块
import cv2 as cv

#检测函数
def face_detect_demo():
	#图片灰度转换
	gray = cv.cvtColor(img,cv.Color_BGR2GRAY)
	#调用OpenCV中的包,加载分类器
	face_detect = cv.CascadeClassifier('')#这里写分类器的地址,分类器位于你安装OpenCV的地址,里面有许多分类器,选择适合的分类器,注意,复制出来的路径中的斜杠为向左划
	#使用分类器,最简单的用法:直接放入图片
	face = face_detect.detectMultiScale(gray)
	#精致用法face_detect.detectMultiScale(图片,每次遍历后的缩放倍数,检测几遍都有即为有,限制范围内出现才能检测出人脸)
	#缩放次数越多,运行次数就越多,也就越卡
	#face = face_detect.detectMultiScale(gray,1.01,5,(100,100),(300,300))
	#绘制方框
	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)


#读取图片
img = cv.imread('face1.jpg')
#调用函数
face_detect_demo()
#等待
while True:
	if ord('q') == cv.waitKey(0):
		break
#释放内存
cv.destroyAllWindows()
6.检测多个人脸
#导入cv模块
import cv2 as cv

#检测函数
def face_detect_demo():
	gray =  cv.cvtColor(img,cv.Color_BGR2GRAY)
	#多个人脸检测,选择好的分类器很重要
	face_detect = cv.CascadeClassifier('')#这里写分类器的地址,分类器位于你安装OpenCV的地址,里面有许多分类器,选择适合的分类器,注意,复制出来的路径中的斜杠为向左划

	face = face_detect.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.imshow('result',img)


#读取图片
img = cv.imread('face1.jpg')
#调用函数
face_detect_demo()
#等待
while True:
	if ord('q') == cv.waitKey(0):
		break
#释放内存
cv.destroyAllWindows()
7.视频人脸检测
#导入cv模块
import cv2 as cv

#检测函数
def face_detect_demo():
	gray =  cv.cvtColor(img,cv.Color_BGR2GRAY)
	#多个人脸检测,选择好的分类器很重要
	face_detect = cv.CascadeClassifier('')#这里写分类器的地址,分类器位于你安装OpenCV的地址,里面有许多分类器,选择适合的分类器,注意,复制出来的路径中的斜杠为向左划
	face = face_detect.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.imshow('result',img)

#读取摄像头
#VideoCapture()里面为0的时候,就默认使用电脑的摄像头
#cap = cv.VideoCapture(0)
cap = cv.VideoCapture('1.mp4') #读取视频
#可以换成网络上的视频,获取其他设备的摄像头
cap.read()
#读取图片
img = cv.imread('face1.jpg')
#调用函数
face_detect_demo()
#循环
while True:
	flag,frame = cap.read()
	if not flag:
		break
	face_detect_demo(frame)
	if ord('q') == cv.waitKey(0):
		break
#释放内存
cv.destroyAllWindows()
#缩放摄像头
cap.release()
8.拍照保存
#导入cv模块
import cv2 as cv

#读取摄像头
cap = cv.VideoCapture(0)
#cap = cv.VideoCapture('1.mp4') #读取视频
#可以换成网络上的视频,获取其他设备的摄像头
falg = 1
num = 1
while(cap.isOpened()):#检测是否是开启状态
	ret_flag,show = cap.read()#得到每一帧的图片
	cv2.imshow("Capture_Test",Vshow)#显示图片
	k = cv2.waitKey(1) & 0xFF #按键判断,这里是空格
	if k == ord('s'): #按住s保存图片
		cv2.imwrite("D:"+src(num)+".name"+".jpg",Vshow) #保存图片的路径+编号+名字
		print("success to save"+str(num)+".jpg")
		print("----------")
		num+=1
	elif k == ord(' '): #退出
		break
#缩放摄像头
cap.release()
#释放内存
cv.destroyAllWindows()

9.数据训练
import os
import cv2
from PTL import Image 
import numpy as np

def getImageAndLabels(path):
	#存储人脸数据
	facesSamples=[]
	#存储姓名数据
	ids = []
	#存储图片信息
	imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
	#加载分类器
	face_detector = cv2.CascadeClassifier('')# 分类器路径
	#遍历列表中的图片
	for imagePath in imagePaths:
		#打开图片,灰度化PIL有九种不同模式:1 L P RGB RGBA CMYK YCbCr I F
		PTL_img = Image.open(imagePath).convert('L') #灰度图像
		#将图片转化为数组,以黑白深浅
		img_numpy = np.array(PTL_img,'uint8') #图片转化为列表
		#获得图片人脸特征
		faces = face_detector.detectMultiScale(img_numpy)
		#获得每张图片的id和姓名
		id = int(os.path.split(imagePath)[1].split('.')[0])
		#预防无人脸图片
		for x,y,w,h in faces:
			ids.append(id)
			facesSamples.append(img_numpy[y:y+h,x:x+w])
		#打印脸部特征和id
		print('id:',id)
		print('fs:',facesSamples)
		return facesSamples,ids

if __name__ =='main':
	#图片路径
	path='./data/jm/'
	#获取图像数组和id标签数组和姓名
	faces,ids = getImageAndLabels(path)
	#加载识别器
	recongizer = cv2.face.LBPHFaceRecognizer_create()
	#训练
	recognizer.train(faces,np.array(ids))
	#保存文件
	recognizer.write('trainer/trainer.yml')
10.人脸识别
import os
import cv2
import urllib
import urllib.request

#加载训练数据集文件
recogizer = cv2.face.LBPHFaceRecognizer_create()
#加载数据
recognizer.write('trainer/trainer.yml')
#名称
names = []
#警报全局变量
warningtine = 0

#工具函数md5加密
def md5(str):
	import hashlib
	m = hashlib.md5()
	m.update(str.encode("utf-8"))
	return m.hexdigest()

#短信反馈
statusStr = {
	'0':'短信发送成功'
	'-1':'参数不全'
	'-2':'服务器空间不支持,请确认支持curl或者fsocket,练习您的空间商解决或者更换空间'
	'30':'密码错误'
	'40':'账号不存在'
	'41':'余额不足'
	'42':'账户已过期'
	'43':'IP地址限制'
	'50':'内容含有敏感词'}
#警报模块
def warning():
	smsapi = "http://api.smsbao.com/"#这里用的是短信宝
	#短信宝账号
	user = ''
	#密码
	password = md5('')
	#要发送的短信内容
	content = '[警报]\n原因:xxx\n地点:xxx\n时间:xxx'
	#要发送短信的手机号码
	phone = ''

	data =  urllib.parse.urlencode({'u':user,'p':password,'m':phone,'c':content})
	send_url = smsapi + 'sms?'+data
	response = urllib.request.urlopen(send_url)
	the_page = response.read().decode('utf-8')
	print(statusStr[the_page])

#准备识别的图片
def face_detect_demo(img):
	gray =  cv2.cvtColor(img,cv2.Color_BGR2GRAY)
	#调用OpenCV中的包,加载分类器
	face_detect = cv.CascadeClassifier('')#这里写分类器的地址,分类器位于你安装OpenCV的地址,里面有许多分类器,选择适合的分类器,注意,复制出来的路径中的斜杠为向左划
	face = face_detect.detectMultiScale(gray,1.01,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))
	#绘制方框
	for x,y,w,h in face:
		cv2.rectangle(img,(x,y).(x+w,y+h),color(0,0,255),thickness=2)
		cv.circle(img,(center=(x+w,y+h),radius=100,color(255,0,0),thickness=1)
		#人脸识别
		ids,confidence = recogizer.predict(gray[y:y+h,x:x+w])
		if confidence > 80:
			global warningtime
			warningtime += 1
			if warningtime > 100:
				warning()
				warningtime = 0
			cv2.putText(img,'unkonw',(x+10,y-10),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),1)
		else:
			cv2.putText(img,(names[ids-1],(x+10,y-10),cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),1)
	cv2.imshow('result',img)

#名字标签
def name():
    path = './data/jm/'
    #names = []
    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=cv2.VideoCapture('1.mp4')
name()
while True:
    flag,frame=cap.read()
    if not flag:
        break
    face_detect_demo(frame)
    if ord(' ') == cv2.waitKey(10):
        break
cv2.destroyAllWindows()
cap.release()
#print(names)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐