优化上面的回答,并使用tkiner有传入图片按键和结果显示
时间: 2024-03-01 08:55:49 浏览: 58
好的,以下是一个优化后的实现,同时加入了 `tkinter` 前端界面:
```python
import cv2
import numpy as np
import pyautogui
import tkinter as tk
from PIL import ImageTk, Image
class WindowDetector:
def __init__(self, template_path):
self.template = cv2.imread(template_path, 0)
self.w, self.h = self.template.shape[::-1]
def detect(self):
screenshot = pyautogui.screenshot()
screenshot = np.array(screenshot)
screenshot = cv2.cvtColor(screenshot, cv2.COLOR_BGR2GRAY)
res = cv2.matchTemplate(screenshot, self.template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(screenshot, pt, (pt[0] + self.w, pt[1] + self.h), (0, 0, 255), 2)
return screenshot
class App:
def __init__(self, template_path):
self.window_detector = WindowDetector(template_path)
self.root = tk.Tk()
self.root.title("Window Detector")
self.root.geometry("800x600")
self.canvas = tk.Canvas(self.root, width=800, height=600)
self.canvas.pack()
self.template = ImageTk.PhotoImage(Image.open(template_path))
tk.Button(self.root, text="Detect", command=self.detect_window).pack()
tk.Label(self.root, image=self.template).pack()
self.root.mainloop()
def detect_window(self):
screenshot = self.window_detector.detect()
img = ImageTk.PhotoImage(Image.fromarray(screenshot))
self.canvas.create_image(0, 0, anchor=tk.NW, image=img)
self.root.update_idletasks()
if __name__ == "__main__":
app = App("template.png")
```
在这个例子中,我们将 `WindowDetector` 类和前面的例子分离出来,使其更容易重用。我们还使用了 `tkinter` 库创建了一个窗口,其中包含一个用于显示模板图片的 `Label` 和一个用于触发检测的按钮。当点击检测按钮时,我们调用 `WindowDetector.detect()` 方法来检测桌面窗口,并将结果显示在 `Canvas` 中。
值得注意的是,由于 `tkinter` 库的限制,我们需要使用 `PIL` 库来将 `numpy` 数组转换为 `tkinter` 可以显示的格式。此外,我们还使用了 `root.update_idletasks()` 方法来强制刷新窗口,以便及时显示结果。
阅读全文