v2.4.0

v2.4.0 riscrive find_lines() come rilevatore basato sulla trasformata di Hough, aggiunge find_line_segments(), la decodifica delle data matrix find_datamatrices(), sensor.set_vsync_output(), la lettura/scrittura di porzioni di immagine e molte nuove framesize scalate per FPS più elevati. find_lines(), match_descriptor() e skip_frames() sono cambiati — leggi le modifiche incompatibili qui sotto.

In evidenza

  • find_lines() — riscritto come rilevatore di linee basato sulla trasformata di Hough che restituisce oggetti line (ora funziona su RGB565, non solo in scala di grigi).

  • find_line_segments() — rileva segmenti di linea finiti.

  • find_datamatrices() — decodifica delle data matrix.

  • sensor.set_vsync_output() — pilota il VSYNC su un pin di I/O per la sincronizzazione della camera.

  • Più framesize — molte risoluzioni scalate aggiuntive per FPS più elevati.

  • Incompatibile: find_lines(), match_descriptor() e skip_frames() sono cambiati — vedi le modifiche incompatibili.

Nuove funzionalità

  • image.find_line_segments() — trova segmenti di linea non infiniti; gli oggetti line hanno acquisito un accessore .length().

  • image.find_datamatrices() — decodifica delle data matrix, con script di esempio.

  • sensor.set_vsync_output(pin) — emette il segnale VSYNC su un pin GPIO per la sincronizzazione della camera (OpenMV 2 / OpenMV 3).

  • Porzioni di immagine — il subscript dell’immagine / protocollo del buffer ora supporta la lettura e la scrittura di porzioni dei dati dell’immagine.

  • Aggiunte molte combinazioni aggiuntive di risoluzione / framesize scalate per supportare frame rate più elevati; clock.fps() ora azzera i suoi accumulatori ogni 2 s in modo che gli FPS riportati seguano il valore recente.

Altre modifiche e miglioramenti

  • L’OV7725 viene windowed a QVGA quando la risoluzione è ≤ VGA (meno frame persi ad alte frequenze di cattura) e il suo PLL è stato impostato a 6× con un clock esterno ridotto (OpenMV 2 48 MHz, OpenMV 3 54 MHz), modificando la temporizzazione dei frame del sensore.

Correzioni di bug

Imaging:

  • Corretti l’errore di dimensione del buffer di compress_for_ide() (marcatori di inizio/fine), la decodifica QR (più, a monte in quirc, le correzioni all’indicizzazione della bitmap delle celle e ai limiti del pattern di allineamento).

Sensore e connettività:

  • Abbassato il clock del sensore di OpenMV 2 per funzionare con il PLL del sensore più elevato (init/sync della camera) e fatto in modo che socket.recvfrom() del WINC restituisca la dimensione effettivamente ricevuta (generando un errore su una dimensione non positiva invece di restituire un valore obsoleto).

Hardware e supporto schede

  • Uscita VSYNC su un pin GPIO (OpenMV 2 / OpenMV 3) a supporto di sensor.set_vsync_output().

  • OpenMV 3 — abilitata la UART1 di pyb.UART.

Modifiche incompatibili alle API

Incompatibilità delle API visibili all’utente tra v2.3.0 e v2.4.0. Ambito: moduli C Python in modules/ e librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata con il suo impatto:

  • major — interessa la maggior parte degli script che usavano la funzionalità; dovrai adattare il codice.

  • minor — API ristretta; interessa solo gli script che la usavano.

  • behavior — stessa API, risultati diversi; ricontrolla gli script ottimizzati.

Le modifiche sono raggruppate per impatto in quest’ordine. Se vuoi solo adattare il tuo codice, vai direttamente alla checklist di migrazione alla fine. Ogni hash di commit rimanda al relativo diff su GitHub.

find_lines() riscritto come rilevatore di Hough (major)

image.find_lines() è stato riscritto come rilevatore basato sulla trasformata di Hough. Non restituisce più un elenco di tuple (x1, y1, x2, y2) — restituisce oggetti line (.line() / .x1() / .y1() / .x2() / .y2() / .theta() / .rho() / .magnitude()) — e ora funziona anche su RGB565 (non solo in scala di grigi). L’argomento threshold è cambiato da un float 0.0–1.0 a una somma intera della magnitudine dei bordi, line.magnitude è ora un intero e sono stati aggiunti i nuovi parametri theta_margin / rho_margin. Adatta il codice che spacchettava le tuple agli oggetti line e ri-ottimizza threshold.

Commit: 31b7b5bf3, f4a9c6154

match_descriptor() restituisce un oggetto match (minor)

image.match_descriptor() (ORB) ora restituisce un oggetto kptmatch con accessori .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() invece di una semplice tupla a 8 elementi. L’oggetto è ancora indicizzabile/affettabile, quindi l’indicizzazione posizionale continua a funzionare, ma il codice che usava isinstance(result, tuple) (o i metodi delle tuple) deve usare i nuovi accessori.

Commit: e960546b6

sensor.skip_frames() è ora basato sul tempo (behavior)

sensor.skip_frames() è stato rielaborato per accettare un parametro time= (predefinito ~300 ms) ed è ora basato sul tempo per impostazione predefinita invece di eseguire un numero fisso di frame, fermandosi anticipatamente una volta trascorso il tempo. Gli script che si basavano su un numero esatto di frame dovrebbero passare un conteggio esplicito e/o impostare time= di conseguenza.

Commit: a039b5d1c

Checklist di migrazione

Per un adattamento pulito a v2.4.0 il lavoro tipico è:

  1. Adatta lo spacchettamento delle tuple di find_lines() agli oggetti line e ri-ottimizza il threshold intero (la riscrittura di find_lines).

  2. Usa gli accessori kptmatch invece di trattare i risultati di match_descriptor() come una tupla (la modifica di match_descriptor).

  3. Passa un conteggio esplicito e/o time= a sensor.skip_frames() se ti basavi su un numero fisso di frame (la modifica di skip_frames).

Tutti gli altri script funzionano senza modifiche.