#导入cv模块import cv2 as cv
#检测函数defface_detect_demo():# 转换为灰度
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)# 选择opencv自带的分类器
face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')# 定义一些参数 如 灰度、缩放、范围大小等
face = face_detect.detectMultiScale(gary,1.01,5,0,(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()#等待whileTrue:iford('q')== cv.waitKey(0):break#释放内存
cv.destroyAllWindows()
检测多个
#导入cv模块import cv2 as cv
#检测函数defface_detect_demo():
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/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)#读取图像
img = cv.imread('face2.jpg')#检测函数
face_detect_demo()#等待whileTrue:iford('q')== cv.waitKey(0):break#释放内存
cv.destroyAllWindows()
视频检测
#导入cv模块import cv2 as cv
#检测函数defface_detect_demo(img):
gary = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
face_detect = cv.CascadeClassifier('D:/opencv/opencv/sources/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)#循环whileTrue:# cap.read()按帧读取视频,flag,frame是获cap.read()方法的两个返回值。# 其中flag是布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False。frame就是每一帧的图像,是个三维矩阵。
flag,frame = cap.read()ifnot flag:break
face_detect_demo(frame)iford('q')== cv.waitKey(1):break#释放内存
cv.destroyAllWindows()#释放摄像头
cap.release()
拍照保存
#导入模块import cv2
#摄像头
cap=cv2.VideoCapture(0)
flag =1
num =1while(cap.isOpened()):#检测是否在开启状态
ret_flag,Vshow = cap.read()#得到每帧图像
cv2.imshow("Capture_Test",Vshow)#显示图像
k = cv2.waitKey(1)&0xFF#按键判断if k ==ord('s'):#保存
cv2.imwrite("D:mycodetest/opencv/data/jm/"+str(num)+".123"+".jpg",Vshow)print("success to save"+str(num)+".jpg")print("-------------------")
num +=1elif k ==ord(' '):#空格退出break#释放摄像头
cap.release()#释放内存
cv2.destroyAllWindows()
训练数据
import os
import cv2
import sys
from PIL import Image
import numpy as np
defgetImageAndLabels(path):
facesSamples=[]
ids=[]
imagePaths=[os.path.join(path,f)for f in os.listdir(path)]#检测人脸
face_detector = cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')#打印数组imagePathsprint('数据排列:',imagePaths)#遍历列表中的图片for imagePath in imagePaths:#打开图片,黑白化
PIL_img=Image.open(imagePath).convert('L')#将图像转换为数组,以黑白深浅# PIL_img = cv2.resize(PIL_img, dsize=(400, 400))
img_numpy=np.array(PIL_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('fs:', facesSamples)print('id:',id)#print('fs:', facesSamples[id])print('fs:', facesSamples)#print('脸部例子:',facesSamples[0])#print('身份信息:',ids[0])return facesSamples,ids
if __name__ =='__main__':#图片路径
path='./data/jm/'#获取图像数组和id标签数组和姓名
faces,ids=getImageAndLabels(path)#获取训练对象
recognizer=cv2.face.LBPHFaceRecognizer_create()#recognizer.train(faces,names)#np.array(ids)
recognizer.train(faces,np.array(ids))#保存文件
recognizer.write('trainer/trainer.yml')#save_to_file('names.txt',names)
人脸识别
import cv2
import numpy as np
import os
# coding=utf-8import urllib
import urllib.request
import hashlib
#加载训练数据集文件
recogizer=cv2.face.LBPHFaceRecognizer_create()
recogizer.read('trainer/trainer.yml')
names=[]
warningtime =0defmd5(str):import hashlib
m = hashlib.md5()
m.update(str.encode("utf8"))return m.hexdigest()
statusStr ={'0':'短信发送成功','-1':'参数不全','-2':'服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间','30':'密码错误','40':'账号不存在','41':'余额不足','42':'账户已过期','43':'IP地址限制','50':'内容含有敏感词'}defwarning():
smsapi ="http://api.smsbao.com/"# 短信平台账号
user ='13******10'# 短信平台密码
password = md5('*******')# 要发送的短信内容
content ='【报警】\n原因:检测到未知人员\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])#准备识别的图片defface_detect_demo(img):
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
face_detector=cv2.CascadeClassifier('D:/opencv/opencv/sources/data/haarcascades/haarcascade_frontalface_alt2.xml')
face=face_detector.detectMultiScale(gray,1.1,5,cv2.CASCADE_SCALE_IMAGE,(100,100),(300,300))#face=face_detector.detectMultiScale(gray)for x,y,w,h in face:
cv2.rectangle(img,(x,y),(x+w,y+h),color=(0,0,255),thickness=2)
cv2.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])#print('标签id:',ids,'置信评分:', confidence)if confidence >80:global warningtime
warningtime +=1if 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,str(names[ids-1]),(x +10, y -10), cv2.FONT_HERSHEY_SIMPLEX,0.75,(0,255,0),1)
cv2.imshow('result',img)#print('bug:',ids)defname():
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()whileTrue:
flag,frame=cap.read()ifnot flag:break
face_detect_demo(frame)iford(' ')== cv2.waitKey(10):break
cv2.destroyAllWindows()
cap.release()#print(names)