Files
my-botty/src/d2r_image/processing.py
T
alex 8eafd91f0a fix: health_manager merc healing by actual HP + clean up stray TODO comment
- health_manager.py: read actual merc health for heal/chicken/rejuv decisions
  instead of timer-only logic; pass merc_health to belt.drink_potion stats
- processing.py: remove stale TODO comment (traceback import is used)
2026-05-31 13:43:26 +02:00

88 lines
3.5 KiB
Python

import cv2
import time
import cv2
import numpy as np
from d2r_image.data_models import GroundItemList, HoveredItem, ItemQuality, ItemText
from d2r_image.bnip_helpers import parse_item
from d2r_image.processing_helpers import build_d2_items, crop_text_clusters, crop_item_tooltip, get_items_by_quality, consolidate_clusters, find_base_and_remove_items_without_a_base, set_set_and_unique_base_items
import numpy as np
from logger import Logger
from utils.log_rotation import safe_imwrite
import os
os.makedirs("./log/screenshots/info", exist_ok=True)
def get_ground_loot(image: np.ndarray, consolidate: bool = False) -> GroundItemList | None:
crop_result = crop_text_clusters(image)
items_by_quality = get_items_by_quality(crop_result)
if consolidate:
consolidate_clusters(items_by_quality)
find_base_and_remove_items_without_a_base(items_by_quality)
set_set_and_unique_base_items(items_by_quality)
return build_d2_items(items_by_quality)
import traceback
def get_hovered_item(image: np.ndarray, model = "hover-eng_inconsolata_inv_th_fast") -> tuple[HoveredItem, ItemText]:
res, quality = crop_item_tooltip(image, model)
parsed_item = None
if res.ocr_result:
try:
parsed_item = parse_item(quality, res.ocr_result.text)
except Exception as e:
Logger.warning(f"\nparsed_item ERROR {e}\n {traceback.format_exc()}")
# * Log the screenshot to log/screenshots/info directory.
t = time.time()
safe_imwrite(f"log/screenshots/info/02_{t}.png", res.img)
with open("log/screenshots/info/02_error_log.txt", "a") as f:
f.write(f"""--------------------------------------------------------------------------------
[{t}]
{res.ocr_result.text}
{traceback.format_exc()}
--------------------------------------------------------------------------------""")
return parsed_item, res
if __name__ == "__main__":
from input_layer import keyboard
import os
from screen import start_detecting_window, stop_detecting_window, grab
from d2r_image import processing as d2r_image
from d2r_image.demo import draw_items_on_image_data, gen_truth_from_ground_loot
from bnip.actions import should_keep, should_pickup
import json
from logger import Logger
start_detecting_window()
keyboard.add_hotkey('f12', lambda: Logger.info('Force Exit (f12)') or stop_detecting_window() or os._exit(1))
Logger.info("Move to d2r window and press f11")
keyboard.wait("f11")
gen_truth = False
while 1:
img = grab().copy()
# look for item tooltip
item, res = d2r_image.get_hovered_item(img)
if res.roi is not None:
Logger.debug(f"Keep {item.Quality} {item.BaseItem['DisplayName']}?: {should_keep(item.as_dict())}")
x, y, w, h = res.roi
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1)
Logger.debug(f"{json.dumps(item.as_dict(), indent=4)}\n")
else:
# look for dropped items
all_loot = d2r_image.get_ground_loot(img)
if all_loot.items and len(all_loot.items) > 0:
for item in all_loot.items:
if item:
Logger.debug(f"Pick {item.Quality} {item.BaseItem['DisplayName']}?: {should_pickup(item.as_dict())}")
Logger.debug(item.as_dict())
draw_items_on_image_data(all_loot.items, img)
if gen_truth:
gen_truth_from_ground_loot(all_loot.items, img)
cv2.imshow("res", img)
cv2.waitKey(3000)