import tkinter import cv2 import numpy as np from PIL import Image, ImageTk from PIL.ImageGrab import grab from win32api import SendMessage from win32con import WM_SYSCOMMAND, SC_RESTORE from win32gui import EnumWindows, IsWindow, IsWindowEnabled, IsWindowVisible, GetWindowText, GetWindowRect, \ SetForegroundWindow
game_hwnd = None
board_x, board_y = (13, 219) chess_w, chess_h = (50, 50) board_x_max, board_y_max = (board_x + (8 * chess_w) + (7 * 3), board_y + (9 * chess_h) + (8 * 3))
templates = [ cv2.imread('t1.png', 0), cv2.imread('t2.png', 0), cv2.imread('t3.png', 0), cv2.imread('t4.png', 0), cv2.imread('t5.png', 0), cv2.imread('t1.png', 0), cv2.imread('t7.png', 0), ]
def _find_hwnd(hwnd, _): global game_hwnd if IsWindow(hwnd) and IsWindowEnabled(hwnd) and IsWindowVisible(hwnd): if GetWindowText(hwnd) == '棋逢对手 象棋': game_hwnd = hwnd
def draw_danger(screen, x, y): if (board_x < x + (chess_w / 2) < board_x_max) and (board_y < y + (chess_h / 2) < board_y_max): cv2.rectangle(screen, (x + 5, y + 5), (x + chess_w - 5, y + chess_h - 5), (255, 0, 0), 1)
def draw_chess(screen, t, pt): cv2.rectangle(screen, pt, (pt[0] + chess_w, pt[1] + chess_h), (0, 0, 255), 1)
if t == 1 or t == 7: draw_danger(screen, pt[0], pt[1] - chess_h) draw_danger(screen, pt[0] - chess_w, pt[1]) draw_danger(screen, pt[0] + chess_w, pt[1]) draw_danger(screen, pt[0], pt[1] + chess_h) elif t == 2: draw_danger(screen, pt[0] - chess_w, pt[1] - chess_h) draw_danger(screen, pt[0] - chess_w, pt[1] + chess_h) draw_danger(screen, pt[0] + chess_w, pt[1] - chess_h) draw_danger(screen, pt[0] + chess_w, pt[1] + chess_h) elif t == 3: draw_danger(screen, pt[0] - chess_w, pt[1] - (chess_h * 2)) draw_danger(screen, pt[0] - chess_w, pt[1] + (chess_h * 2)) draw_danger(screen, pt[0] + chess_w, pt[1] - (chess_h * 2)) draw_danger(screen, pt[0] + chess_w, pt[1] + (chess_h * 2)) draw_danger(screen, pt[0] - (chess_w * 2), pt[1] - chess_h) draw_danger(screen, pt[0] - (chess_w * 2), pt[1] + chess_h) draw_danger(screen, pt[0] + (chess_w * 2), pt[1] - chess_h) draw_danger(screen, pt[0] + (chess_w * 2), pt[1] + chess_h) elif t == 4: draw_danger(screen, pt[0] - (chess_w * 2), pt[1] - (chess_h * 2)) draw_danger(screen, pt[0] - (chess_w * 2), pt[1] + (chess_h * 2)) draw_danger(screen, pt[0] + (chess_w * 2), pt[1] - (chess_h * 2)) draw_danger(screen, pt[0] + (chess_w * 2), pt[1] + (chess_h * 2)) elif t == 5: return elif t == 6: return
class App(object): def __init__(self): self.root = tkinter.Tk()
self.image = None self.img_label = tkinter.Label() self.img_label.pack()
self.root.after(0, self.loop) self.root.mainloop()
def update(self): screen = np.asarray(grab(GetWindowRect(game_hwnd))) screen_gray = cv2.cvtColor(screen, cv2.COLOR_BGR2GRAY) cv2.rectangle(screen, (board_x, board_y), (board_x_max, board_y_max), (255, 255, 255), 1)
for t in [1, 2, 3, 4, 5, 7]: res = cv2.matchTemplate(screen_gray, templates[t - 1], cv2.TM_CCOEFF_NORMED) for pt in zip(*np.where(res >= 0.7)[::-1]): if pt[1] < board_y: continue
draw_chess(screen, t, pt)
self.image = ImageTk.PhotoImage(Image.fromarray(screen)) self.img_label.config(image=self.image)
def loop(self): self.update() self.root.after(1000, self.loop)
if __name__ == "__main__": EnumWindows(_find_hwnd, 0)
if game_hwnd is None: print('未找到游戏') exit()
SendMessage(game_hwnd, WM_SYSCOMMAND, SC_RESTORE, 0) SetForegroundWindow(game_hwnd)
app = App()
|