Olet jC$lleen askeleen edellC$, ja olet 100-prosenttisen oikeassa. On tC$yttC$
resurssien tuhlausta ja hallusinaatioriskin kasvattamista syC6ttC$C$
tekoC$lylle koko ruudun resoluutio, jos meitC$ kiinnostaa vain tuo uusi
ponnahdusvalikko. Visuaalinen kohina pitC$C$ rajata minimiin.
PC$ivitetC$C$n diff_ui.py tekemC$C$n juuri tC$mC$: se laskee noiden 20 uuden
napin C$C$rimmC$iset koordinaatit, lisC$C$ hieman marginaalia ja leikkaa
automaattisesti annotated_ui.png -kuvasta pelkC$n valikon erilliseksi
tiedostoksi (menu_crop.png).
Korvaa diff_ui.py tC$llC$ tC$ydellisellC$ versiolla:
import json
import math
import cv2
def main():
print("[*] Vertaillaan uutta ruutua vanhaan semanttiseen karttaan (Delta
Scan)...")
# 1. Ladataan aiemmin opittu tausta
try:
with open("whatsapp_semantic_map.json", "r", encoding="utf-8") as f:
old_map = json.load(f)
except FileNotFoundError:
print("[-] FATAL: whatsapp_semantic_map.json puuttuu.")
return
# 2. Ladataan uusi, juuri skannattu 214 elementin tilanne
with open("ui_calibration_pack/boxes_cache.json", "r", encoding="utf-8")
as f:
new_boxes = json.load(f)
old_centers = [node['center'] for node in old_map.values()]
new_elements = []
# 3. Suodatetaan uudet elementit
for b in new_boxes:
cx, cy = b['center']
is_known = any(math.hypot(cx - ox, cy - oy) < 15 for ox, oy in
old_centers)
is_in_menu_area = 550 < cx < 800
if not is_known and is_in_menu_area:
new_elements.append(b)
if not new_elements:
print("[-] Ei uusia elementtejC$ valikon alueella.")
return
print(f"
[+] Ruudulla on 214 elementtiC$, mutta niistC$ vain {len(new_elements)} on
UUSIA valikon nappeja!")
# 4. LASKETAAN RAJAUSLAATIKKO (Bounding Box) UUSILLE ELEMENTEILLE
min_x = min(b['box'][0] for b in new_elements)
min_y = min(b['box'][1] for b in new_elements)
max_x = max(b['box'][0] + b['box'][2] for b in new_elements)
max_y = max(b['box'][1] + b['box'][3] for b in new_elements)
pad = 40 # 40 pikselin turvamarginaali
# 5. Leikataan numeroitu kuva tekoC$lyC$ varten
annotated_img = cv2.imread("ui_calibration_pack/annotated_ui.png")
if annotated_img is not None:
h, w = annotated_img.shape[:2]
crop_y1 = max(0, min_y - pad)
crop_y2 = min(h, max_y + pad)
crop_x1 = max(0, min_x - pad)
crop_x2 = min(w, max_x + pad)
menu_crop = annotated_img[crop_y1:crop_y2, crop_x1:crop_x2]
crop_path = "ui_calibration_pack/menu_crop.png"
cv2.imwrite(crop_path, menu_crop)
print(f"[+] Rajattu kuva LLM-analyysiC$ varten tallennettu:
{crop_path}")
print("
--- TCSTC ALKAA AI-PROMPT ---")
print("Ohessa on juuri auki klikatun valikon uudet elementit. Otsikoi ne:
")
for b in new_elements:
print(f"- [{b['id']}] Tyyppi: Ikoni | Kuvaus: [TCYDENNC]")
print("--- PROMPT PCCTTYY ---")
if __name__ == "__main__":
main()
Miten toimia nyt:
* Aja tC$mC$ pC$ivitetty skripti.
* Se luo kansion sisC$lle pienen, tiiviin kuvan menu_crop.png, jossa nC$kyy
pelkC$stC$C$n tuo auennut valikko ja sen uudet numerot.
* LC$hetC$ tuo leikattu kuva minulle, niin tC$ydennC$n listan
vC$littC6mC$sti.
Heti kun tiedC$mme, minkC$ numeron Asiakirja-ikoni sai, kytkemme sen
moottoriin ja robotti saa lC$hetettyC$ tiedoston!