下面是一个基于OpenCV的人脸识别项目示例代码。这个程序将尝试满足你的要求:
打开摄像头时自动检测人脸,按q键退出程序。
读取人脸时自动判断人脸所在的位置,如left,right和null。
将人脸信息保存在数据库中,请确保你已经在数据库中建立了一个images表,并且有以下四个列名,id,name,image_data,date_uploaded,location。id用来表示序号,name是用来显示图像名称,image_data用来保存图像信息,date_uploaded用来显示当前时间,location用于保存人脸的位置信息
import os
import cv2
import mysql.connector
import datetime
import time
# 确保有一个保存图像的目录
save_dir = 'saved_images'
if not os.path.exists(save_dir):
os.makedirs(save_dir)
# 加载人脸检测分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 打开摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("Error opening video stream or file")
exit()
# 初始化计数器和上次保存时间
count = 0
last_time = time.time() # 记录上次保存图像的时间
# 打开数据库连接,并将图像存储在数据库中
db_config = {
'host': '你的数据库主机名',
'user': '用户名(默认为root)',
'password': '用户密码',
'database': '你存放images表的数据库名称'
}
# 进行数据库连接,创建一个游标对象cursor,用于执行sql语句
cnx = mysql.connector.connect(**db_config)
cursor = cnx.cursor()
# 定义插入数据库的函数并且存储在数据库中的对应列名中
def insert_database(filename, position, image_data):
# 获取当前时间并格式化为 'YYYY-MM-DD HH:MM:SS' 格式
current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 构造 SQL 插入语句
insert_query = "INSERT INTO images (name, image_data, date_uploaded, location) VALUES (%s, %s, %s, %s)"
# 游标对象操作执行 SQL 语句
cursor.execute(insert_query, (filename, image_data, current_time, position))
cnx.commit() #提交事务
while True:
ret, frame = cap.read() #读取摄像头画面
if not ret:
print("Can't receive frame (stream end?). Exiting ...")
break
current_time = time.time()
if (current_time - last_time) >= 1:
mid_point = frame.shape[1] // 2 # 获取图像宽度的一半
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 转换为灰度图像
faces = face_cascade.detectMultiScale(gray, 1.3, 5) # 检测人脸,设置参数
face_locations = [] # 存储人脸位置于列表中
for (x, y, w, h) in faces: # 遍历检测到的人脸
face_center_x = x + w // 2
face_location = 'left' if face_center_x < mid_point else 'right'if face_center_x > mid_point else 'NULL'
face_locations.append(face_location) #添加人脸位置信息
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2) # 绘制人脸矩形框
left_count = face_locations.count('left')
right_count = face_locations.count('right')
position = 'left_right' if left_count >=1 and right_count >=1 else 'left' if left_count >=1 else 'right' if right_count >=1 else 'NULL'
filename = os.path.join(save_dir, f'face_detected_{count:04d}.jpg') # 保存图像的文件名
cv2.imwrite(filename, frame)
print(f"Face detected and saved as {filename}")
with open(filename, 'rb') as file:
image_data = file.read()
# 调用插入数据库的函数
insert_database(filename, position, image_data)
count += 1
last_time = current_time
cv2.imshow('Face Detection', frame) # 显示图像
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
cursor.close()
cnx.close()