人脸识别(python+opencv)
人脸识别(python+opencv)目标检测人脸识别对应自己训练集中的人脸识别人脸后对自己的手机发送信息工具PythonpycharmOpenCV环境配置有了Python和pycharm后,可在cmd中用pip进行安装pip install opencv-python此过程会很慢pip3 install opencv-python -i https://pypi.tuna.tsinghua.ed
·
人脸识别(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)
更多推荐
已为社区贡献3条内容
所有评论(0)