用pythond 代码 在tkinter界面上 实现打开摄像头截取一个人10张笑脸图片,并全部显示在界面上让用户选择最好的一张保存
时间: 2024-03-23 11:36:15 浏览: 74
python tkinter实现界面切换的示例代码
5星 · 资源好评率100%
好的,我可以帮你完成这个任务。
首先,你需要安装 OpenCV 和 tkinter 库。你可以使用以下命令在终端或命令提示符中安装它们:
```
pip install opencv-python
pip install tkinter
```
接下来,你可以使用以下代码来实现你的要求:
```python
import cv2
import tkinter as tk
from PIL import Image, ImageTk
class App:
def __init__(self, window, video_source=0):
self.window = window
self.window.title("摄像头截图")
self.video_source = video_source
# 打开视频捕捉设备
self.cap = cv2.VideoCapture(self.video_source)
# 创建Canvas
self.canvas = tk.Canvas(window, width=self.cap.get(cv2.CAP_PROP_FRAME_WIDTH), height=self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
self.canvas.pack()
# 创建按钮
self.btn_snapshot = tk.Button(window, text="截图", command=self.snapshot)
self.btn_snapshot.pack(anchor=tk.CENTER, expand=True)
# 创建提示信息标签
self.lbl_info = tk.Label(window, text="请对着摄像头微笑,然后点击截图按钮")
self.lbl_info.pack(anchor=tk.CENTER, expand=True)
# 创建保存按钮
self.btn_save = tk.Button(window, text="保存", command=self.save)
self.btn_save.pack(anchor=tk.CENTER, expand=True)
self.btn_save.config(state=tk.DISABLED)
self.delay = 15
self.update()
self.window.mainloop()
def snapshot(self):
# 获取一帧图像
ret, frame = self.cap.read()
# 转换颜色空间
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 检测笑脸
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile_cascade = cv2.CascadeClassifier('haarcascade_smile.xml')
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
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:
# 在Canvas上显示图像
self.photo = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# 保存图像
self.images.append(frame)
self.lbl_info.config(text="请再次微笑,然后点击截图按钮")
break
# 如果超过10张,禁用截图按钮
if len(self.images) >= 10:
self.btn_snapshot.config(state=tk.DISABLED)
self.btn_save.config(state=tk.ACTIVE)
def save(self):
# 计算平均图像
avg_image = self.images[0]
for i in range(1, len(self.images)):
avg_image += self.images[i]
avg_image = avg_image / len(self.images)
# 显示平均图像
self.photo = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(avg_image, cv2.COLOR_BGR2RGB)))
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# 保存最好的图像
cv2.imwrite("best_smile.jpg", avg_image)
# 提示用户保存成功
self.lbl_info.config(text="保存成功!")
def update(self):
# 从视频捕捉设备中读取一帧图像
ret, frame = self.cap.read()
if ret:
# 在Canvas上显示图像
self.photo = ImageTk.PhotoImage(image=Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)))
self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)
# 每隔一段时间更新一次图像
self.window.after(self.delay, self.update)
# 记录图像
self.images = []
# 创建App实例
App(tk.Tk())
```
这个程序会打开摄像头并在 tkinter 窗口中显示摄像头捕捉到的图像。当你微笑并点击“截图”按钮时,程序会检测笑脸并保存10张图片。当你完成截图后,程序会计算平均图像并显示在窗口中,然后保存最好的一张图片。
阅读全文