v2.1.0

v2.1.0 è una imponente release di modernizzazione delle API. Sostituisce il descrittore di keypoint FREAK con ORB, rielabora find_blobs() / istogrammi / statistiche in API basate su oggetti, rinomina le funzioni di esposizione/guadagno/bilanciamento del bianco automatici del modulo sensor, aggiunge il rilevamento di codici QR e la correzione della lente per l’OV7725, e introduce la prima scheda OpenMV Cam M7. Molte API sono cambiate: leggi le modifiche incompatibili qui sotto.

In evidenza

  • Keypoint ORB: il descrittore FREAK è stato sostituito con ORB (find_keypoints() / match_descriptor() rielaborati).

  • API a oggetti: find_blobs(), get_histogram(), get_statistics() ora restituiscono oggetti con accessor con nome.

  • Codici QR: aggiunto il rilevamento image.find_qrcodes().

  • OpenMV Cam M7: supporto iniziale per la scheda.

  • Sensor: set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (rinominate) e set_lens_correction().

  • Incompatibile: le API di keypoint/descrittore, blob/istogramma/statistiche, funzioni automatiche del sensore e diverse altre sono cambiate: vedi le modifiche incompatibili.

Nuove funzionalità

  • OpenMV Cam M7: aggiunto il supporto iniziale per la scheda OpenMV 3 (M7).

  • Codici QR: aggiunto image.find_qrcodes() con un esempio qrcodes.py.

  • Keypoint ORB: nuovo sistema di descrittori ORB: find_keypoints() con un argomento corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() con un keyword filter_outliers e una stima della rotazione; salvataggio/caricamento dei keypoint.

  • API a oggetti: image.get_histogram() / get_statistics() / get_percentile() restituiscono oggetti istogramma/statistiche; find_blobs() restituisce oggetti blob (rect() / cx() / cy() / code() / area() / pixels()) con area_threshold / pixels_threshold / merge / margin / invert e x_stride / y_stride.

  • Sensor: aggiunta sensor.set_lens_correction(enable, radi, coef) per lo shading della lente dell’OV7725, sensor.set_windowing() ora accetta anche una tupla (w, h) (centrata automaticamente) e image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Aggiunti script di esempio per color-tracking, slave SPI/I2C Arduino, keypoint e istogramma/statistiche.

Altre modifiche e miglioramenti

  • L’IDE ora può interrompere un main.py in esecuzione; find_blobs() / find_qrcodes() / get_statistics() più veloci; ORB usa una distanza di Hamming basata su popcount; la correzione della lente usa meno RAM; una regola udev per Linux impedisce a ModemManager di occupare la porta seriale.

Correzioni di bug

Camera e imaging:

  • Corretti il clean/invalidate della cache DMA dell’M7 (frame corrotti), una spuria riga aggiuntiva alla fine di ogni frame, i limiti di overflow del frame buffer JPEG, la liberazione del frame buffer in caso di fallimento di compress(), l’accuratezza / la ROI / la gestione dell’insieme vuoto di ORB e la geometria di load_image(copy_to_fb=True).

Sistema:

  • Corretti il supporto ADC dell’F7, il nome di un registro dell’OV7725, il timing di bootloader/USB, usato WFI durante l’attesa degli snapshot e reso non bloccante l’esempio di streamer MJPEG con timeout per ogni client.

Hardware e supporto schede

  • OpenMV Cam M7 (OpenMV 3): supporto iniziale per la scheda.

  • OV7725: supporto alla correzione della lente (shading).

Modifiche incompatibili alle API

Rotture delle API visibili all’utente tra v2.0.0 e v2.1.0. Ambito: C-module Python in modules/ e librerie Python in scripts/libraries/.

Ogni modifica è contrassegnata dal suo impatto:

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

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

  • behavior: stessa API, risultati diversi; ricontrolla gli script affinati.

Le modifiche sono raggruppate per impatto in quell’ordine. Se vuoi solo portare il tuo codice, salta alla checklist di migrazione in fondo. Ogni hash di commit rimanda al suo diff su GitHub.

FREAK sostituito con ORB; API dei descrittori rielaborata (major)

Il descrittore di keypoint FREAK è stato rimosso e sostituito con ORB: image.FREAK non esiste più (usa image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() non accettano più un argomento iniziale per il tipo di descrittore (viene dedotto dall’oggetto), match_descriptor() ora restituisce una tupla di 8 elementi (cx, cy, x, y, w, h, match_count, rotation) (l’ultimo elemento è un conteggio grezzo, non una percentuale) e draw_keypoints() richiede un oggetto keypoint invece di una lista grezza (x, y, angle). find_keypoints() ha acquisito corner_detector / max_keypoints / scale_factor con valori predefiniti modificati.

Commit: e2d0c4840, bba8e5a9e, 6000684cb

Rinominazione delle funzioni automatiche del sensore (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() sono state rinominate in sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (i vecchi nomi sono stati rimossi). Ciascuna ha acquisito un keyword opzionale value= per impostare un valore manuale invece di quello automatico.

Commit: 1b22a2961

Istogramma / statistiche rielaborati in API a oggetti (major)

La superficie di istogramma/statistiche è stata rielaborata in image.get_histogram() / get_statistics() / get_percentile() basate su oggetti, che restituiscono oggetti istogramma/statistiche. I vecchi risultati piatti di istogramma/statistiche e i metodi bin_count / l_bin_count / a_bin_count / b_bin_count sono stati rimossi (usa len(histogram.bins()) ecc.).

Commit: 011108412, 9f37c83de

scale di find_features() rinominato (major)

image.find_features() (Haar) ha rinominato il suo keyword scale= in scale_factor=. Aggiorna le chiamate find_features(cascade, scale=...) in scale_factor=....

Commit: 96e4f770c

find_blobs() restituisce oggetti; find_markers() rimosso (minor)

image.find_blobs() ora restituisce oggetti blob con accessor con nome (l’accesso per indice funziona ancora per retrocompatibilità) e image.find_markers() è stato rimosso: usa invece find_blobs(..., merge=True, margin=...). La callback avanzata per il filtro dei blob colorati non è più supportata.

Commit: af15ec6eb

img.copy_to_fb() sostituito (minor)

Il metodo img.copy_to_fb() è stato sostituito da un keyword copy_to_fb= su image.Image / load_image(). Usa image.Image(path, copy_to_fb=True) per caricare immagini di grandi dimensioni direttamente nel frame buffer.

Commit: 1645ab94b

compress() rifiuta una qualità fuori intervallo (behavior)

image.compress() / compressed() ora sollevano un errore quando quality è al di fuori di 1–100 invece di limitarla silenziosamente. Limita quality a 1–100 prima della chiamata. Separatamente, il buffer JPEG dell’OpenMV 3 è stato ridotto da 64 KB a 23000 byte, quindi i frame di grandi dimensioni possono ora sollevare un errore di memoria esaurita: abbassa la qualità JPEG o il framesize.

Commit: 9efd7474a, 9a7c3defc

Lo zoom di lens_corr() è ora funzionante (behavior)

image.lens_corr() ora applica effettivamente il suo argomento zoom (in precedenza veniva analizzato ma era inefficace), quindi l’output differisce per gli script che passavano uno zoom diverso da quello predefinito. Ricontrolla l’affinamento di lens_corr().

Commit: d6b49adef

Checklist di migrazione

Per un porting pulito alla v2.1.0 il lavoro tipico è:

  1. Sostituisci image.FREAK con image.ORB, elimina l’argomento del tipo di descrittore e aggiorna l’unpacking della tupla di match_descriptor() / draw_keypoints() all’oggetto keypoint (la rielaborazione ORB).

  2. Rinomina sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() nelle forme set_auto_* (la rinominazione delle funzioni automatiche).

  3. Sposta il codice di istogramma/statistiche ai metodi a oggetti (la rielaborazione di istogramma/statistiche).

  4. Rinomina scale= di find_features() in scale_factor= (la rinominazione di find_features).

  5. Usa gli accessor degli oggetti blob e sostituisci find_markers() con find_blobs(merge=True, ...) (la modifica a find_blobs); sostituisci img.copy_to_fb() con il keyword copy_to_fb= (la modifica a copy_to_fb).

  6. Limita la qualità di compress() a 1–100 e ricontrolla le dimensioni JPEG sull’OpenMV 3 (la modifica a compress); riaffina lo zoom di lens_corr() (la modifica a lens_corr).

Tutti gli altri script funzionano senza modifiche.