Files
MineEVECraft/main.py

132 lines
3.3 KiB
Python

import logging
import numpy as np
import pygetwindow as gw
import pyautogui
from pytesseract import pytesseract
from pytesseract import Output
import cv2
win_name = "EVE - Nostrom Stone"
pytesseract.tesseract_cmd = "C:\\Program Files\\Tesseract-OCR\\tesseract.exe"
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(message)s",
datefmt="%d-%b-%y %H:%M:%S",
handlers=[logging.StreamHandler()],
)
save_result = True
def save_highlighted_screenshot(screenshot, boxes, filename):
new_image = screenshot.copy()
for r in boxes.itertuples():
(x, y, w, h) = (
r.left,
r.top,
r.width,
r.height,
)
cv2.rectangle(new_image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(
new_image,
f"'{r.text}': {r.left}.{r.top} {r.width}.{r.height}",
(x, y - 10),
cv2.FONT_HERSHEY_SIMPLEX,
0.4,
(0, 255, 0),
1,
)
cv2.imwrite(f"images/{filename}.png", new_image)
def get_screenshot():
eve_window = gw.getWindowsWithTitle(win_name)[0]
was_minimized = False
if eve_window.isMinimized:
was_minimized = True
eve_window.maximize()
eve_window.activate()
if save_result:
filepath = "images/screenshot.png"
else:
filepath = None
screenshot = pyautogui.screenshot(
filepath,
region=(
eve_window.box.left + 10,
eve_window.box.top,
eve_window.box.width - 20,
eve_window.box.height - 10,
),
)
if was_minimized:
eve_window.minimize()
logging.info("Скриншот получен")
return cv2.cvtColor(np.array(screenshot), cv2.COLOR_BGR2RGB)
def get_boxes(screenshot):
raw_boxes = pytesseract.image_to_data(
screenshot,
lang="eng",
output_type=Output.DATAFRAME,
config="--psm 4 -c preserve_interword_spaces=1",
)
base_boxes = raw_boxes.loc[(raw_boxes["text"].str.len() > 3)][
["left", "top", "width", "height", "text", "line_num", "word_num"]
]
if save_result:
save_highlighted_screenshot(
screenshot, base_boxes, "base_highlighted_screenshot"
)
base_boxes.to_excel("xlsx/base_boxes.xlsx", index=False)
logging.info("Боксы получены")
return base_boxes
def union_boxes(base_boxes):
grouped_words = base_boxes.groupby("line_num", as_index=False)
result_boxes = grouped_words["width"].sum()
result_boxes = result_boxes.merge(
grouped_words["height"].max(), on="line_num", how="left"
)
result_boxes = result_boxes.merge(
grouped_words["left"].min(), on="line_num", how="left"
)
result_boxes = result_boxes.merge(
grouped_words["top"].min(), on="line_num", how="left"
)
result_boxes = result_boxes.merge(
grouped_words["text"].apply(" ".join),
on="line_num",
how="left",
)
if save_result:
result_boxes.to_excel("xlsx/unioned_boxes.xlsx", index=False)
logging.info("Боксы объединены")
return result_boxes
screenshot = get_screenshot()
base_boxes = get_boxes(screenshot)
unioned_boxes = union_boxes(base_boxes)
save_highlighted_screenshot(
screenshot, unioned_boxes, "unioned_highlighted_screenshot"
)