Python如何通过dlib和OpenCV将人名和人脸特征存入mysql数据库,在识别时显示人名的代码
时间: 2024-01-21 17:15:58 浏览: 27
以下是一个简单的Python代码示例,演示如何使用dlib和OpenCV来捕获人脸图像、提取人脸特征、将其存储到MySQL数据库中,并在识别时显示人名。
注意:此代码示例仅供参考,需要根据具体情况进行修改和调整。
```python
import dlib
import cv2
import mysql.connector
# 加载dlib的人脸检测器和人脸特征提取器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
# 连接MySQL数据库
mydb = mysql.connector.connect(
host="localhost",
user="yourusername",
password="yourpassword",
database="yourdatabase"
)
# 创建MySQL表格
mycursor = mydb.cursor()
mycursor.execute("CREATE TABLE IF NOT EXISTS faces (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), features BLOB)")
# 捕获摄像头图像并检测人脸
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 转换图像为灰度图像,以提高检测效率
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = detector(gray)
# 遍历每个检测到的人脸
for face in faces:
# 提取人脸特征
landmarks = predictor(gray, face)
features = [landmarks.part(i).x for i in range(68)] + [landmarks.part(i).y for i in range(68)]
# 显示人脸图像和特征点
cv2.rectangle(frame, (face.left(), face.top()), (face.right(), face.bottom()), (0, 0, 255), 2)
for i in range(68):
cv2.circle(frame, (landmarks.part(i).x, landmarks.part(i).y), 2, (0, 255, 0), -1)
# 将人名和人脸特征存储到MySQL数据库中
name = input("请输入人名:")
sql = "INSERT INTO faces (name, features) VALUES (%s, %s)"
val = (name, features)
mycursor.execute(sql, val)
mydb.commit()
# 显示图像
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
# 在识别时从MySQL数据库中检索人名和人脸特征
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 转换图像为灰度图像,以提高检测效率
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = detector(gray)
# 遍历每个检测到的人脸
for face in faces:
# 提取人脸特征
landmarks = predictor(gray, face)
features = [landmarks.part(i).x for i in range(68)] + [landmarks.part(i).y for i in range(68)]
# 在MySQL数据库中检索人名和人脸特征
mycursor.execute("SELECT name FROM faces WHERE features=%s", (features,))
result = mycursor.fetchone()
name = result[0] if result else "Unknown"
# 显示人脸图像和人名
cv2.rectangle(frame, (face.left(), face.top()), (face.right(), face.bottom()), (0, 0, 255), 2)
cv2.putText(frame, name, (face.left(), face.top() - 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
# 显示图像
cv2.imshow('frame', frame)
if cv2.waitKey(1) == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
```
在上面的代码中,我们使用了MySQL数据库来存储人名和人脸特征。首先,我们创建了一个名为“faces”的表格,用于存储人名和人脸特征。在捕获摄像头图像时,我们遍历每个检测到的人脸,并使用dlib提取人脸特征。然后,我们使用输入的人名和提取的人脸特征将其存储到MySQL数据库中。在识别时,我们检索MySQL数据库中的人名和人脸特征,并将其与检测到的人脸特征进行比较,以确定人名。最后,我们在图像上显示人名。