用python写一个人数检测的程序,要求可以框出输入图片中的人,在可视化界面显示处理后的图片并显示图片中的人数,有可视化界面有三个窗口,分别显示处理前的图片,处理后的图片和检测出的人数
时间: 2024-01-24 13:17:05 浏览: 111
好的,需要使用到 OpenCV 和 tkinter 库来实现。以下是代码实现:
```python
import cv2
from tkinter import *
from PIL import Image, ImageTk
# 加载人脸检测器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 创建窗口
root = Tk()
root.title("人数检测")
root.geometry("800x600")
# 创建三个画布
canvas1 = Canvas(root, width=400, height=400)
canvas1.grid(row=0, column=0)
canvas2 = Canvas(root, width=400, height=400)
canvas2.grid(row=0, column=1)
canvas3 = Canvas(root, width=200, height=50)
canvas3.grid(row=1, column=0, columnspan=2)
# 加载图片
def load_image():
global img, img_display
img_path = filedialog.askopenfilename(title="选择图片", filetypes=[("图片文件", "*.jpg;*.png;*.jpeg")])
img = cv2.imread(img_path)
img_display = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
show_image(canvas1, img_display)
canvas3.delete("all")
# 显示图片
def show_image(canvas, img_display):
canvas.delete("all")
img_display = cv2.resize(img_display, (400, 400))
img_display = Image.fromarray(img_display)
imgtk = ImageTk.PhotoImage(image=img_display)
canvas.imgtk = imgtk
canvas.create_image(0, 0, image=imgtk, anchor=NW)
# 处理图片
def process_image():
global img_display, img, face_count
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
face_count = len(faces)
for (x,y,w,h) in faces:
cv2.rectangle(img_display,(x,y),(x+w,y+h),(255,0,0),2)
show_image(canvas2, img_display)
canvas3.delete("all")
canvas3.create_text(100, 25, text="检测到{}个人".format(face_count), font=("Arial", 16))
# 添加按钮和菜单
menu = Menu(root)
root.config(menu=menu)
file_menu = Menu(menu)
menu.add_cascade(label="文件", menu=file_menu)
file_menu.add_command(label="打开", command=load_image)
btn1 = Button(root, text="处理图片", command=process_image)
btn1.grid(row=2, column=0, columnspan=2)
root.mainloop()
```
需要注意的是,代码中使用了 OpenCV 自带的人脸检测器 haarcascade_frontalface_default.xml,需要先下载并将其放在与代码文件同一目录下。另外,代码中使用了 tkinter 的 filedialog 来选择图片文件。
阅读全文