import base64
from io import BytesIO
import cv2
import mysql.connector as mysql
import numpy as np
from PIL import Image
import face_recognition
face_cascade_path = "F:\OpenCV\haarcascade_frontalface_default.xml"
config = {
'user': 'root',
'password': '123456',
'host': '127.0.0.1',
'database': 'face'
}
def connect_to_db(config):
try:
cnx = mysql.connect(**config)
cursor = cnx.cursor()
return cnx, cursor
except mysql.Error as e:
print("Error while connecting to MySQL:", e)
exit()
def load_faces_from_db(cursor):
query = "SELECT face FROM user"
cursor.execute(query)
db_faces_base64 = cursor.fetchall()
faces = []
for face_base64 in db_faces_base64:
decoded_image = base64.b64decode(face_base64[0])
image = Image.open(BytesIO(decoded_image))
rgb_image = image.convert("RGB")
numpy_image = np.array(rgb_image)
image.show()
for face_encoding in face_recognition.face_encodings(numpy_image):
faces.append(face_encoding)
return faces
def compare_faces(frame_face_encoding, db_faces, threshold=0.8):
similarities = [face_recognition.compare_faces(db_faces, frame_face_encoding)[0] for _ in db_faces]
max_similarity_index = np.argmax(similarities)
max_similarity = similarities[max_similarity_index]
if max_similarity >= threshold:
return True
else:
return False
def process_frame(frame, face_cascade):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.05,
minNeighbors=5, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
if len(face_rects) > 0:
fX, fY, fW, fH = face_rects[0]
face_roi = frame[fY:fY + fH, fX:fX + fW]
face_bgr = cv2.cvtColor(face_roi, cv2.COLOR_BGR2RGB)
buffer = BytesIO()
pil_image = Image.fromarray(face_bgr)
pil_image.save(buffer, format="JPEG")
face_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
return face_base64
else:
return None
def capture_and_compare_one_face():
face_cascade = cv2.CascadeClassifier(face_cascade_path)
cnx, cursor = connect_to_db(config)
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
if not ret:
break
face_base64 = process_frame(frame, face_cascade)
if face_base64 is None:
continue
buffer = BytesIO(base64.b64decode(face_base64))
pil_image = Image.open(buffer).convert("RGB")
numpy_image = np.array(pil_image)
frame_face_encoding = face_recognition.face_encodings(numpy_image)[0]
db_faces = load_faces_from_db(cursor)
if len(db_faces) == 0:
print("警告:数据库中没有可用的人脸数据")
if len(db_faces) > 0:
is_match = compare_faces(frame_face_encoding, db_faces)
else:
is_match = False
if is_match:
print("True")
break
else:
print("False")
video_capture.release()
cnx.close()
if __name__ == "__main__":
capture_and_compare_one_face()
from io import BytesIO
import cv2
import mysql.connector as mysql
import numpy as np
from PIL import Image
import face_recognition
face_cascade_path = "F:\OpenCV\haarcascade_frontalface_default.xml"
config = {
'user': 'root',
'password': '123456',
'host': '127.0.0.1',
'database': 'face'
}
def connect_to_db(config):
try:
cnx = mysql.connect(**config)
cursor = cnx.cursor()
return cnx, cursor
except mysql.Error as e:
print("Error while connecting to MySQL:", e)
exit()
def load_faces_from_db(cursor):
query = "SELECT face FROM user"
cursor.execute(query)
db_faces_base64 = cursor.fetchall()
faces = []
for face_base64 in db_faces_base64:
decoded_image = base64.b64decode(face_base64[0])
image = Image.open(BytesIO(decoded_image))
rgb_image = image.convert("RGB")
numpy_image = np.array(rgb_image)
image.show()
for face_encoding in face_recognition.face_encodings(numpy_image):
faces.append(face_encoding)
return faces
def compare_faces(frame_face_encoding, db_faces, threshold=0.8):
similarities = [face_recognition.compare_faces(db_faces, frame_face_encoding)[0] for _ in db_faces]
max_similarity_index = np.argmax(similarities)
max_similarity = similarities[max_similarity_index]
if max_similarity >= threshold:
return True
else:
return False
def process_frame(frame, face_cascade):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
face_rects = face_cascade.detectMultiScale(gray, scaleFactor=1.05,
minNeighbors=5, minSize=(30, 30),
flags=cv2.CASCADE_SCALE_IMAGE)
if len(face_rects) > 0:
fX, fY, fW, fH = face_rects[0]
face_roi = frame[fY:fY + fH, fX:fX + fW]
face_bgr = cv2.cvtColor(face_roi, cv2.COLOR_BGR2RGB)
buffer = BytesIO()
pil_image = Image.fromarray(face_bgr)
pil_image.save(buffer, format="JPEG")
face_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
return face_base64
else:
return None
def capture_and_compare_one_face():
face_cascade = cv2.CascadeClassifier(face_cascade_path)
cnx, cursor = connect_to_db(config)
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
if not ret:
break
face_base64 = process_frame(frame, face_cascade)
if face_base64 is None:
continue
buffer = BytesIO(base64.b64decode(face_base64))
pil_image = Image.open(buffer).convert("RGB")
numpy_image = np.array(pil_image)
frame_face_encoding = face_recognition.face_encodings(numpy_image)[0]
db_faces = load_faces_from_db(cursor)
if len(db_faces) == 0:
print("警告:数据库中没有可用的人脸数据")
if len(db_faces) > 0:
is_match = compare_faces(frame_face_encoding, db_faces)
else:
is_match = False
if is_match:
print("True")
break
else:
print("False")
video_capture.release()
cnx.close()
if __name__ == "__main__":
capture_and_compare_one_face()