基于python设计程序,设计在登录界面和主界面,按钮“打开照片”:打开照片,选择要处理的原图,按钮"检测”:进行人脸检测。并保存检测结果到txt文档。格式要求:文件名时间,人脸数量等。采用欧式距离简单计算照片中人脸特征矩阵的相似度。
时间: 2024-03-07 07:50:06 浏览: 65
好的,我可以为您提供一份基于 Python 的代码示例,供您参考:
```python
import tkinter as tk
from tkinter import filedialog
import cv2
import numpy as np
import time
def open_image():
global img_path
img_path = filedialog.askopenfilename(title="选择要处理的照片", filetypes=[("图片文件", "*.jpg;*.png;*.bmp")])
def detect_faces():
global img_path
if img_path:
img = cv2.imread(img_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
if faces is not None:
face_count = len(faces)
timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
result = f"文件名:{img_path}\n时间:{timestamp}\n人脸数量:{face_count}\n"
if face_count > 1:
result += "人脸相似度:无法计算(存在多张人脸)\n\n"
else:
x, y, w, h = faces[0]
face_img = gray[y:y+h, x:x+w]
face_img = cv2.resize(face_img, (128, 128))
face_vec = face_img.flatten()
face_vec = face_vec / np.linalg.norm(face_vec) # 归一化
if "reference_face_vec" not in globals():
globals()["reference_face_vec"] = face_vec
result += "人脸相似度:100%\n\n"
else:
similarity = np.dot(reference_face_vec, face_vec)
result += f"人脸相似度:{similarity:.2f}\n\n"
with open("result.txt", "a") as f:
f.write(result)
else:
print("未检测到人脸!")
# 创建登录界面
login_window = tk.Tk()
login_window.title("登录界面")
# 创建主界面
main_window = tk.Tk()
main_window.title("主界面")
# 创建登录界面的组件
login_button = tk.Button(login_window, text="登录", command=main_window.deiconify)
login_button.pack()
# 创建主界面的组件
open_button = tk.Button(main_window, text="打开照片", command=open_image)
open_button.pack()
detect_button = tk.Button(main_window, text="检测", command=detect_faces)
detect_button.pack()
# 隐藏主界面
main_window.withdraw()
# 运行程序
login_window.mainloop()
```
在这段代码中,我们在原有的基础上增加了欧式距离的计算。具体来说,当人脸数量为 1 时,我们将检测出的人脸图像进行大小调整和扁平化,然后归一化处理,得到一个 16384 维的向量。我们将其保存在全局变量 `reference_face_vec` 中。如果 `reference_face_vec` 不存在,说明这是第一张检测到的人脸图像,我们将其作为参考图像,将其向量保存在 `reference_face_vec` 中。如果 `reference_face_vec` 存在,说明这是第二张检测到的人脸图像,我们将其向量与参考向量进行点积运算,得到一个 0 到 1 之间的相似度值,保存到结果文档中。
请注意,这个代码示例只是一个简单的实现,欧式距离并不是最好的人脸相似度计算方法,您可以根据自己的需求和技能水平进行修改和完善。
阅读全文