Download Game! Currently 87 players. Last logged in:BullwinFloppySentenceStomp

Blitzer's Blog >> 72589

Back to blogs index
Posted: 20 Sep 2026 15:43 [ permalink ]
TC$mC$ on tC$ydellinen arkkitehtuuri "sokeiden" tai ei-saavutettavien
graafisten kC$yttC6liittymien tC$ydelliseen mallintamiseen. Olet
kC$ytC$nnC6ssC$ rakentamassa universaalia GUI-parseria, joka luo DOM-puun
mistC$ tahansa pikselimassasta, tC$ysin riippumatta ohjelmointikielestC$ tai
kC$yttC6jC$rjestelmC$n AT-SPI-tuesta.
TC$mC$ pipeline voidaan orkestroida suoraan kC$C$ntC$mC$C$n visuaalinen tieto
AST-MD -muotoon. Jaetaan tC$mC$ prosessi neljC$C$n loogiseen kerrokseen (Pass
1 - Pass 4), jotta raskaat operaatiot voidaan reitittC$C$ asynkronisesti.
Putken Arkkitehtuuri (Vision-to-AST)
1. Pass 1: Edge Mapping & Spatial Hierarchy (OpenCV)
Ruudusta tai mC$C$ritellystC$ rajausalueesta otetaan raakakuva, jolle
tehdC$C$n reunojen tunnistus ja segmentointi.
 * Operaatio: cv2.Canny (reunanetsintC$) ja cv2.findContours (C$C$riviivat).
 * Rekursio: OpenCV osaa palauttaa C$C$riviivat hierarkiana (isojen
laatikoiden sisC$llC$ olevat pienemmC$t laatikot). Jokainen lC6ydetty selkeC$
bounding box (BBox) muutetaan "solmuksi" (Node) tyhjC$C$n AST-puuhun.
 * Karsinta: Liian pienet (alle 5x5px) alueet hylC$tC$C$n kohinana.
2. Pass 2: Kognitiivinen Luokittelu (OCR & Ikoni-analyysi)
TC$mC$ vaihe kC$y lC$pi Pass 1:n tuottamat solmut (alueet).
 * OCR-reitti: Alue syC6tetC$C$n Tesseractille. Jos sieltC$ palautuu
luotettavaa tekstiC$ (esim. "Dokumentti" > 80% konfidenssilla), solmu
merkitC$C$n tyypiksi TextNode.
 * Ikoni-reitti: Jos OCR ei lC6ydC$ tekstiC$, mutta alueen pikselivarianssi on
korkea (siinC$ on terC$viC$ reunoja ja kontrasteja, kuten klemmari-ikonissa),
se luokitellaan tyypiksi IconNode. Se voidaan ajaa joko lC$pi YOLO-mallista
tai tallentaa lokaalisti base64 -muodossa suoraan AST-puuhun myC6hempC$C$
template-matchingia varten.
3. Pass 3: Sweeper Agent (Aktiivinen Interrogaatio)
TC$mC$ on nerokas ratkaisu, joka erottaa staattisen kuvan interaktiivisesta
kC$yttC6liittymC$stC$.
 * Sen sijaan, ettC$ sweeper lakaisee koko ruudun 20px askelin, se
optimoidaan: agentti lC$hetetC$C$n hoveroimaan vain Pass 1:ssC$ lC6ydettyjen
IconNode ja TextNode -alueiden keskipisteisiin.
 * X11:n XFixes -kirjastoa hyC6dyntC$en luetaan kursorin ID. Jos kursori
muuttuu (esim. XC_left_ptr muuttuu XC_hand2:ksi), kyseinen solmu
pC$ivitetC$C$n ominaisuudella interactive: true.
 * Jos solmun vieressC$ tai ympC$rillC$ ei ollut tunnistettua laatikkoa,
sweeper voi edelleen tehdC$ mikrolakaisun varmistaakseen piilotetut
hover-elementit.
4. Pass 4: AST-MD KC$C$ntC$jC$
Kaikki kerC$tty tieto yhdistetC$C$n hierarkkiseksi Markdown-rakenteeksi, joka
on suoraan luettavissa tekoC$lymalleille ja rutiinimoottoreille.
TC$ssC$ on Python-pseudokoodina hahmotelma tC$stC$ putkesta ja siitC$, miltC$
lopullinen AST-MD -ulostulo nC$yttC$C$.
import cv2
import json

def process_gui_to_ast(image_path):
    # 1. Edge Mapping & Contours
    img = cv2.imread(image_path, 0)
    edges = cv2.Canny(img, 50, 150)
    contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE,
cv2.CHAIN_APPROX_SIMPLE)
    
    ast_nodes = []
    
    for i, contour in enumerate(contours):
        x, y, w, h = cv2.boundingRect(contour)
        if w < 10 or h < 10: continue # Ohitetaan kohina
        
        node = {
            "id": f"node_{i}",
            "box": {"x": x, "y": y, "w": w, "h": h},
            "type": "unknown",
            "interactive": False
        }
        
        # 2. Analyysi (OCR / Ikoni)
        cropped = img[y:y+h, x:x+w]
        text = run_ocr(cropped)
        
        if text:
            node["type"] = "TextNode"
            node["content"] = text
        else:
            if is_icon_heuristic(cropped):
                node["type"] = "IconNode"
                node["signature"] = hash_image(cropped) # Esim. phash
        
        ast_nodes.append(node)
        
    # 3. Sweeper 2-pass (Aktiivinen hiiren kC$yttC6)
    for node in ast_nodes:
        cursor_changed = x11_hover_test(node["box"]["x"] + node["box"]["w"]//2,
 
                                        node["box"]["y"] + node["box"]["h"]//2)
        if cursor_changed:
            node["interactive"] = True
            
    # 4. AST-MD Rakentaminen
    return build_ast_md(ast_nodes, hierarchy)

Lopullinen AST-MD Formaatti
Kun putki on valmis, se renderC6i kC$yttC6liittymC$n tilan tiiviiksi AST-MD
(Markdown) -dokumentiksi. TC$mC$ on C$C$rimmC$isen kevyt syC6ttC$C$ mille
tahansa kielimallille, ja se pitC$C$ sisC$llC$C$n sekC$ visuaalisen hierarkian
ettC$ sweeperin lC6ytC$mC$n interaktiivisuuden:
# AST-MD: WhatsApp Web UI Segment
> Coordinates: (X:400, Y:700, W:300, H:400)

## Layout Elements

- `[node_1]` **Container** (X:410, Y:710, W:280, H:380)
  - `[node_2]` **IconNode**: *Paperclip* (X:420, Y:816, W:36, H:36)
    - interactive: `true` (Cursor: hand2)
    - template_ref: `/tmp/bot_templates/icon_1029.png`
  - `[node_3]` **TextNode**: "Dokumentti" (X:420, Y:750, W:120, H:25)
    - interactive: `true` (Cursor: hand2)
  - `[node_4]` **TextNode**: "Kuvat ja videot" (X:420, Y:780, W:150, H:25)
    - interactive: `true` (Cursor: hand2)
  - `[node_5]` **IconNode**: *Unknown Graphic* (X:600, Y:715, W:15, H:15)
    - interactive: `false` (Cursor: left_ptr)

KC$ytC$nnC6n toteutusaskeleet
TC$mC$n rakentamiseen tarvitaan olemassa olevien tyC6kalujen orkestrointia:
 * Voidaan luoda vision_parser.py, joka tekee Canny-edge luokittelun.
 * KytketC$C$n se suoraan portissa 7711 pyC6rivC$C$n X11-Vision-API:in
sisC$C$nrakennettuna reittinC$ (esim. /api/vision/ast_map), jolloin rajapinta
ottaa kuvan, ajaa sen Tesseract- ja OpenCV-myllyjen lC$pi ja palauttaa
ylemmC$n esimerkin kaltaisen listan.
 * Sweeper Agent voi ottaa tC$mC$n listan kohteikseen (target list), "kC$ydC$
tC6kkimC$ssC$" elementtejC$ X11-ruudulla ja palauttaa AST-MD:n lopulliseen,
tila-automaatin ymmC$rtC$mC$C$n muotoon.