用python代码 基于opencv的人脸检测和微笑检测,对人进行微笑截图,并将照片通过tkinter显示出来,最多截10张,在tkinter上可以选择最好一张保存,只需要代码和解释
时间: 2024-03-24 19:39:03 浏览: 71
好的,下面是代码和解释说明:
```python
import cv2
import tkinter as tk
from PIL import Image, ImageTk
# 创建窗口
window = tk.Tk()
# 设置窗口标题和大小
window.title("Smile Detector")
window.geometry("800x600")
# 创建画布
canvas = tk.Canvas(window, width=800, height=500)
canvas.pack()
# 创建label用于显示图片
img_label = tk.Label(window)
img_label.pack()
# 加载分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
# 设置参数
max_images = 10 # 最多截取10张照片
smile_counter = 0 # 微笑计数器
best_smile = None # 最好的微笑照片
# 创建摄像头对象
cap = cv2.VideoCapture(0)
# 循环读取视频流
while True:
# 读取一帧
ret, frame = cap.read()
# 将帧转换成灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
# 遍历每个人脸
for (x, y, w, h) in faces:
# 绘制矩形框
cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 从人脸区域检测微笑
roi_gray = gray[y:y + h, x:x + w]
roi_color = frame[y:y + h, x:x + w]
smiles = smile_cascade.detectMultiScale(roi_gray, 1.8, 20)
# 如果检测到微笑,截取照片并显示在界面上
if len(smiles) > 0:
smile_counter += 1
if smile_counter <= max_images:
img_name = f"smile_{smile_counter}.jpg"
cv2.imwrite(img_name, frame)
img = Image.open(img_name)
img = img.resize((800, 500), Image.ANTIALIAS)
img_tk = ImageTk.PhotoImage(img)
img_label.config(image=img_tk)
img_label.image = img_tk
# 保存最好的微笑照片
if best_smile is None:
best_smile = img_name
else:
img1 = cv2.imread(best_smile, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(img_name, cv2.IMREAD_GRAYSCALE)
if cv2.mean(img2)[0] > cv2.mean(img1)[0]:
best_smile = img_name
# 显示视频流
cv2.imshow('Smile Detector', frame)
# 按下q键退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头和窗口
cap.release()
cv2.destroyAllWindows()
# 显示最好的微笑照片
if best_smile is not None:
img = Image.open(best_smile)
img = img.resize((800, 500), Image.ANTIALIAS)
img_tk = ImageTk.PhotoImage(img)
img_label.config(image=img_tk)
img_label.image = img_tk
# 保存最好的微笑照片
save_button = tk.Button(window, text="Save", command=lambda: img.save("best_smile.jpg"))
save_button.pack()
```
代码说明:
1. 导入必要的模块,包括OpenCV、Tkinter和Pillow。
2. 创建窗口、画布和用于显示图片的Label。
3. 加载人脸分类器和微笑分类器,设置参数。
4. 创建摄像头对象。
5. 循环读取视频流,对每一帧进行人脸检测和微笑检测。
6. 如果检测到微笑,将截取的照片显示在界面上,并将计数器加1。同时,判断当前微笑照片是否比之前的更好,如果是,则更新最好的微笑照片。
7. 如果计数器达到最大值,停止截图。
8. 显示视频流,并监听按键事件。如果按下q键,退出程序。
9. 释放摄像头和窗口。
10. 显示最好的微笑照片,并创建保存按钮。如果用户点击保存按钮,将最好的微笑照片保存为"best_smile.jpg"。
注意事项:
1. 在运行程序之前,需要下载人脸分类器和微笑分类器,并将它们放在与代码相同的目录下。
2. 在运行程序之前,需要安装OpenCV、Tkinter和Pillow。
阅读全文