项目简介
在文件夹中上传自己的图片,对自己的图片进行训练,得到训练后的yml文件。调用yml文件,配合人脸数据集,识别电脑摄像头中的人脸,判断是否是自己。如果置信评分符合要求,则将向数据库插入一条数据,数据包括检测成功时间。
训练数据
图片的命名要求是数字,放在这个地址下面
path='./data/mydata/'
然后运行python程序,就得到trainer文件夹下trainer1.yml文件。
1. import os 2. import cv2 3. import sys 4. from PIL import Image 5. import numpy as np 6. def getImageAndLabels(path): 7. facesSamples=[] 8. ids=[] 9. imagePaths=[os.path.join(path,f) for f in os.listdir(path)] 10. #检测人脸 11. face_detector = cv2.CascadeClassifier( 12. './haarcascade/haarcascade_frontalface_default.xml') 13. 14. #遍历列表中的图片 15. for imagePath in imagePaths: 16. #打开图片 17. PIL_img=Image.open(imagePath).convert('L') 18. #将图像转换为数组 19. img_numpy=np.array(PIL_img,'uint8') 20. faces = face_detector.detectMultiScale(img_numpy) 21. #获取每张图片的id 22. id=int(os.path.split(imagePath)[1].split('.')[0]) 23. for x,y,w,h in faces: 24. facesSamples.append(img_numpy[y:y+h,x:x+w]) 25. ids.append(id) 26. return facesSamples,ids 27. 28. if __name__ == '__main__': 29. #图片路径 30. path='./data/mydata/' 31. #获取图像数组和id标签数组 32. faces,ids=getImageAndLabels(path) 33. #获取训练对象 34. recognizer=cv2.face.LBPHFaceRecognizer_create() 35. recognizer.train(faces,np.array(ids)) 36. #保存文件 37. recognizer.write('trainer/trainer1.yml')
检测摄像头中的人脸并插入数据库
我们这里先建立了与本地数据库的连接,然后定义了插入数据库的函数。同时编写了人脸检测的函数,如果得到的置信评分小于60,我们认为检测到了正确的人,则调用插入数据库的函数。
主函数中调用了电脑内置摄像头,将图片传给人脸检测函数。
1. 2. import cv2 as cv 3. import time 4. import pymysql 5. 6. id = 5 7. def insert_sql(): 8. # 建立连接 9. conn = pymysql.connect( 10. host="localhost", 11. # host="192.168.1.112", 12. user="root", # 用户名 13. passwd="youpassword", # 用户密码 14. db="检测小车") # 数据库名 15. 16. global id 17. # 创建游标,默认是元组型 18. cursor = conn.cursor() 19. # sql = "select * from t_plane"#数据库中表的名 20. sql = '''INSERT INTO t_plane(id,x,y) VALUES(num,7,2);''' # 数据库中表的名 21. sql = sql.replace("num", str(id)) 22. cursor.execute(sql) 23. conn.commit() 24. id += 1 25. cursor.close() 26. conn.close() 27. 28. 29. # 加载训练数据集文件 30. recogizer=cv.face.LBPHFaceRecognizer_create() 31. recogizer.read('trainer/trainer1.yml') 32. 33. # 加载特征数据 34. face_detector = cv.CascadeClassifier( 35. './haarcascade/haarcascade_frontalface_default.xml') 36. 37. def face_detect_demo(img): 38. #将图片灰度 39. gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY) 40. faces = face_detector.detectMultiScale(gray) 41. ans = [] 42. for x, y, w, h in faces: 43. cv.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) 44. # 人脸识别 45. id, confidence = recogizer.predict(gray[y:y + h, x:x + w]) 46. # print('标签id:', id, '置信评分:', confidence) 47. print(confidence) 48. ans.append(confidence) 49. 50. cv.namedWindow('result', 0) 51. cv.resizeWindow('result', 600, 500) 52. cv.imshow('result', img) 53. 54. if ans == []: 55. return 56. elif min(ans) < 60: 57. print("符合标准") 58. insert_sql() 59. time.sleep(1) 60. 61. #读取视频 62. # cap=cv.VideoCapture('video.mp4') 63. # cap=cv.VideoCapture('test.mp4') 64. cap= cv.VideoCapture(0) # 0为电脑内置摄像头 65. 66. while True: 67. # cap = cv.VideoCapture(0) 68. flag,frame=cap.read() 69. # print('flag:',flag,'frame.shape:',frame.shape) 70. if not flag: 71. break 72. # cv.imshow("video", frame) 73. face_detect_demo(frame) 74. if ord('q') == cv.waitKey(10): 75. break 76. 77. cv.destroyAllWindows() 78. cap.release()