Acquisizione: specchiatura orizzontale e verticale per sorgente, memorizzata #110
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
RICHIESTA: Adriano 28/10 (fiera A&T): «nell'acquisizione bisogna mettere flip orizzontale, verticale che poi sia memorizzato».
COSA: due caselle nella pagina Acquisizione (scripts/calibrazione_pagina.py, servita da scripts/camera_service.py su :8765/acquisizione): «Specchia orizzontale», «Specchia verticale». Valgono PER SORGENTE, si salvano subito su disco al cambio, si ricaricano al riavvio del servizio. La specchiatura si applica in software (cv2.flip) a OGNI frame letto dalla sorgente, PRIMA di raddrizzatura/calibrazione: anteprima, /camera/grab (quindi misure e wizard DXF del TMF, che passano dal grab), calibrazione da camera, copia bloccata. Ambo le caselle = rotazione 180°.
PERCHÉ SOFTWARE e non ReverseX/ReverseY GenICam: vale per ogni sorgente (GenTL, OpenCV, camera:folder, immagini caricate) e non dipende dai nodi del producer Itala.
RAMO: lavoro/daitarn-tmf-flip da lavoro/daitarn-tmf-dxfcal
b2e3867(è il codice sul PC fiera DESKTOP-RABEHJJ).MODIFICHE:
orientamenti: dict{sorgente: {"orizzontale": bool, "verticale": bool}} caricato all'avvio da /orientamento.json (archivio.cartella / "orientamento.json"); file assente o rotto → {} con _log.warning, mai eccezione._specchia(nome, frame): legge l'orientamento della sorgente sottolock; orizzontale+verticale → cv2.flip(frame, -1); solo orizzontale → cv2.flip(frame, 1); solo verticale → cv2.flip(frame, 0); nessuno → frame invariato (stesso oggetto, niente copia)._grab(riga ~320:lambda s: _specchia(nome, s.grab(timeout))) eleggiin camera_anteprima (riga ~547: specchiare PRIMA digrezzi[nome] = f.copy(), così /camera/blocca, /camera/anteprima/calibrata e calibrate bloccata ricevono il frame già specchiato). NON specchiare l'immagine caricata a mano in /camera/calibrate (campoimage, origine file:).with lock: grezzi.pop(nome, None); bloccati.pop(nome, None)(frame vecchi con l'orientamento di prima).archivio.leggi_mappa(nome)non è None e l'orientamento è cambiato → "la calibrazione attiva «<archivio.attiva_di(nome)>» corregge la distorsione con l'orientamento di prima: va rifatta". Mappa assente (manuale/planare: solo scala) → avviso null.#parametri, una riga con le due caselle (idspecchiaO,specchiaV) e un<div class="nota" id="msgSpecchia">. JS:caricaOrientamento()chiamata incambioSorgente()accanto acaricaParametri()e al primo caricamento della sorgente; onchange di ciascuna casella → PUT, in caso di errore rimettere la casella com'era e mostraredettaglio(r); se c'èavvisomostrarlo in msgSpecchia (classe di errore/avviso esistente); se l'anteprima è attiva il prossimo frame esce già specchiato (niente da fare), se ferma chiamareunaAnteprima(A.lato)una volta per far vedere l'effetto. Seguire lo stile esistente (var, function, fetch,$,dire).TEST (scripts/tests/test_camera_orientamento.py, nuovo, stesso schema di test_camera_acquisizione.py: modulo caricato con importlib, TestClient, sorgente finta da cartella con un'immagine asimmetrica nota, es. 4x3 con un pixel acceso in alto a sinistra):
Comando: uv run --python 3.13 --extra vision-worker --extra dev --with-editable vendor/visionsuite/packages/vs-camera pytest scripts/tests -q → tutto verde, nessun test esistente toccato.
NON TOCCARE: vendor/visionsuite (submodule), src/ backend/frontend TMF, scripts/calibrazione.py, il formato di attive.json e dei settaggi, il comportamento di /camera/calibrate con
imagecaricata, gli header esistenti delle risposte.FATTO QUANDO: test verdi; sul PC fiera, caselle attivate → anteprima e grab specchiati, riavvio TMF → caselle e specchiatura restano.
Soluzione
ESITO: fatto
COSA: specchiatura orizzontale/verticale per sorgente in Acquisizione, memorizzata in /acquisitore/orientamento.json, applicata in anteprima e grab.
FILE: scripts/camera_service.py — _carica_orientamenti, _specchia, GET/PUT /camera/orientamento (scrittura atomica, ripristino in memoria se il salvataggio fallisce, avviso se esiste una mappa di calibrazione) (
2c2d601,9111eb2)FILE: scripts/calibrazione_pagina.py — caselle specchiaO/specchiaV, caricaOrientamento/salvaOrientamento (
155abfd)FILE: scripts/tests/test_camera_orientamento.py (15 test), scripts/tests/test_pagina_acquisizione.py
RAMO: lavoro/daitarn-tmf-dxfcal @
34c251a(pushato)PROVA: pytest scripts/tests (file camera) → 90 passed; browser locale camera:folder → salva/azzera senza errori console
DEPLOY: DESKTOP-RABEHJJ (PC fiera A&T) 28/10/2026, hash file verificati, porte 8000/8100/8765/8780 su in 30 s, orientamento.json = {}