第一步模板制作
import cv2 as cv
def main():
cap = cv.VideoCapture(0)
while cap.isOpened():
# 获取视频的一帧图像 若获取成功则ret为True,否则返回False Frame:获取到的某一帧的图像
ret,img = cap.read()
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 实例化检测器
face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
face_cas.load("haarcascade_frontalface_default.xml")
# 人脸检测
face_rects = face_cas.detectMultiScale(gray,scaleFactor = 1.2,minNeighbors = 3, minSize = (32,32))
# face_rects = face_cas.detectMultiScale(gray)
for facerect in face_rects:
# 找到的人脸左上角座标原点 人脸的宽、高。
x,y,w,h = facerect
# 画矩形
cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
# cv.imwrite("路径/文件名.格式",保存的图片)
roi_face = img[y:y+h,x:x+w]
cv.imwrite("face_file/XXX_XXX.jpg",roi_face)
cv.imshow("face",img)
key = cv.waitKey(500)
if key == 27:
break
cap.release()
cv.destroyAllWindows()
第二步人脸识别
import cv2 as cv
import os
referImg_list = []
for filename in os.listdir("./face_file/"):
referImg_list.append("./face_file/" + filename)
referImg_list.remove('./face_file/.ipynb_checkpoints')
def sumALL(x):
sum = 0
for r in range(len(x)):
for c in range(len(x[0])):
sum = sum + x[r][c]
return sum
def main():
cap = cv.VideoCapture(0)
while cap.isOpened():
# 获取视频的一帧图像 若获取成功则ret为True,否则返回False Frame:获取到的某一帧的图像
ret,img = cap.read()
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 实例化检测器
face_cas = cv.CascadeClassifier("haarcascade_frontalface_default.xml")
face_cas.load("haarcascade_frontalface_default.xml")
# 人脸检测
face_rects = face_cas.detectMultiScale(gray,scaleFactor = 1.2,minNeighbors = 3, minSize = (32,32))
for facerect in face_rects:
# 找到的人脸左上角座标原点 人脸的宽、高。
x,y,w,h = facerect
# 画矩形
cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),3)
# cv.imwrite("路径/文件名.格式",保存的图片)
roi_face = img[y:y+h,x:x+w]
# cv.imwrite("./face_file/zhaojm2.jpg",roi_face)
for faces in referImg_list:
face = cv.imread(faces,flags=3)
res = cv.matchTemplate(face,roi_face,cv.TM_CCOEFF_NORMED)
x,y = res.shape
z = x * y
agv = sumALL(res)/z
if agv > 0.35:
print(faces)
cv.imshow("face",img)
key = cv.waitKey(500)
if key == 27:
break
cap.release()
cv.destroyAllWindows()
if __name__ == '__main__':
try:
main()
except:
print("摄像头打开失败!")
“haarcascade_frontalface_default.xml” 可通过百度可得