v2.1.0

v2.1.0 ist ein umfangreiches API-Modernisierungs-Release. Es ersetzt den FREAK-Schlüsselpunkt-Deskriptor durch ORB, überarbeitet find_blobs() / Histogramme / Statistiken zu objektbasierten APIs, benennt die Funktionen für automatische Belichtung/Verstärkung/Weißabgleich des sensor-Moduls um, fügt QR-Code-Erkennung und OV7725-Objektivkorrektur hinzu und nimmt das erste OpenMV Cam M7-Board in Betrieb. Viele APIs haben sich geändert — lesen Sie die nachstehenden Breaking Changes.

Highlights

  • ORB-Schlüsselpunkte — der FREAK-Deskriptor wurde durch ORB ersetzt (find_keypoints() / match_descriptor() überarbeitet).

  • Objekt-APIsfind_blobs(), get_histogram(), get_statistics() geben jetzt Objekte mit benannten Zugriffsmethoden zurück.

  • QR-Codes — Erkennung mit image.find_qrcodes() hinzugefügt.

  • OpenMV Cam M7 — erste Board-Unterstützung.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (umbenannt) und set_lens_correction().

  • Breaking: die Schlüsselpunkt-/Deskriptor-, Blob-/Histogramm-/Statistik-, Sensor-Automatikfunktions- und mehrere andere APIs haben sich geändert — siehe die Breaking Changes.

Neue Funktionen

  • OpenMV Cam M7 — erste Unterstützung für das OpenMV 3 (M7)-Board hinzugefügt.

  • QR-Codesimage.find_qrcodes() mit einem qrcodes.py-Beispiel hinzugefügt.

  • ORB-Schlüsselpunkte — neues ORB-Deskriptorsystem: find_keypoints() mit einem corner_detector-Argument (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() mit einem filter_outliers-Schlüsselwort und einer Rotationsschätzung; Speichern/Laden von Schlüsselpunkten.

  • Objekt-APIsimage.get_histogram() / get_statistics() / get_percentile() geben Histogramm-/Statistikobjekte zurück; find_blobs() gibt Blob-Objekte zurück (rect() / cx() / cy() / code() / area() / pixels()) mit area_threshold / pixels_threshold / merge / margin / invert und x_stride / y_stride.

  • Sensorsensor.set_lens_correction(enable, radi, coef) für die Objektiv-Vignettierungskorrektur des OV7725 hinzugefügt, sensor.set_windowing() akzeptiert jetzt auch ein (w, h)-Tupel (automatisch zentriert), sowie image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Beispielskripte für Farbverfolgung, Arduino-SPI/I2C-Slave, Schlüsselpunkte und Histogramme/Statistiken hinzugefügt.

Weitere Änderungen und Verbesserungen

  • Die IDE kann jetzt ein laufendes main.py unterbrechen; schnellere find_blobs() / find_qrcodes() / get_statistics(); ORB verwendet eine Popcount-Hamming-Distanz; die Objektivkorrektur verbraucht weniger RAM; eine Linux-udev-Regel verhindert, dass der ModemManager den seriellen Port belegt.

Fehlerbehebungen

Kamera und Bildgebung:

  • Das DMA-Cache-Clean/Invalidate des M7 korrigiert (beschädigte Einzelbilder), eine fehlerhafte zusätzliche Zeile am Ende jedes Einzelbildes, die JPEG-Framebuffer-Überlaufgrenzen, das Freigeben des Framebuffers bei compress()-Fehlschlag, die ORB-Genauigkeit / ROI / Behandlung leerer Mengen sowie die Geometrie von load_image(copy_to_fb=True).

System:

  • Die F7-ADC-Unterstützung, einen OV7725-Registernamen und das Bootloader/USB-Timing korrigiert, WFI beim Warten auf Schnappschüsse verwendet und das MJPEG-Streamer-Beispiel mit Timeouts pro Client nicht-blockierend gemacht.

Hardware- und Board-Unterstützung

  • OpenMV Cam M7 (OpenMV 3) — erste Board-Unterstützung.

  • OV7725 — Unterstützung der Objektivkorrektur (Vignettierung).

Breaking API-Änderungen

Für Benutzer sichtbare API-Brüche zwischen v2.0.0 und v2.1.0. Umfang: Python-C-Module in modules/ und Python-Bibliotheken in scripts/libraries/.

Jede Änderung ist mit ihrer Auswirkung gekennzeichnet:

  • major — betrifft die meisten Skripte, die die Funktion verwendet haben; Sie müssen Code portieren.

  • minor — schmale API; betrifft nur Skripte, die sie verwendet haben.

  • behavior — gleiche API, andere Ergebnisse; abgestimmte Skripte erneut prüfen.

Die Änderungen sind in dieser Reihenfolge nach Auswirkung gruppiert. Wenn Sie nur Ihren Code portieren möchten, springen Sie zur Migrations-Checkliste am Ende. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub.

FREAK durch ORB ersetzt; Deskriptor-API überarbeitet (major)

Der FREAK-Schlüsselpunkt-Deskriptor wurde entfernt und durch ORB ersetzt: image.FREAK existiert nicht mehr (verwenden Sie image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() nehmen kein führendes Deskriptortyp-Argument mehr entgegen (es wird aus dem Objekt abgeleitet), match_descriptor() gibt jetzt ein 8-elementiges Tupel (cx, cy, x, y, w, h, match_count, rotation) zurück (das letzte Element ist ein roher Zähler, kein Prozentsatz), und draw_keypoints() erfordert ein Schlüsselpunkt-Objekt anstelle einer rohen (x, y, angle)-Liste. find_keypoints() erhielt corner_detector / max_keypoints / scale_factor mit geänderten Standardwerten.

Commits: e2d0c4840, bba8e5a9e, 6000684cb

Sensor-Automatikfunktionen umbenannt (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() wurden in sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() umbenannt (die alten Namen wurden entfernt). Jede erhielt ein optionales value=-Schlüsselwort, um statt Automatik einen manuellen Wert zu setzen.

Commits: 1b22a2961

Histogramm / Statistiken zu Objekt-APIs überarbeitet (major)

Die Histogramm-/Statistik-Schnittstelle wurde zu objektbasierten image.get_histogram() / get_statistics() / get_percentile() überarbeitet, die Histogramm-/Statistikobjekte zurückgeben. Die alten flachen Histogramm-/Statistikergebnisse und die Methoden bin_count / l_bin_count / a_bin_count / b_bin_count wurden entfernt (verwenden Sie len(histogram.bins()) usw.).

Commits: 011108412, 9f37c83de

find_features() scale umbenannt (major)

image.find_features() (Haar) benannte sein scale=-Schlüsselwort in scale_factor= um. Aktualisieren Sie find_features(cascade, scale=...)-Aufrufe auf scale_factor=....

Commits: 96e4f770c

find_blobs() gibt Objekte zurück; find_markers() entfernt (minor)

image.find_blobs() gibt jetzt Blob-Objekte mit benannten Zugriffsmethoden zurück (Indexzugriff funktioniert aus Gründen der Abwärtskompatibilität weiterhin), und image.find_markers() wurde entfernt — verwenden Sie stattdessen find_blobs(..., merge=True, margin=...). Der erweiterte Callback zum Filtern von Farb-Blobs wird nicht mehr unterstützt.

Commits: af15ec6eb

img.copy_to_fb() ersetzt (minor)

Die Methode img.copy_to_fb() wurde durch ein copy_to_fb=-Schlüsselwort bei image.Image / load_image() ersetzt. Verwenden Sie image.Image(path, copy_to_fb=True), um große Bilder direkt in den Framebuffer zu laden.

Commits: 1645ab94b

compress() lehnt Qualität außerhalb des Bereichs ab (behavior)

image.compress() / compressed() lösen jetzt einen Fehler aus, wenn quality außerhalb von 1–100 liegt, anstatt stillschweigend zu begrenzen. Begrenzen Sie quality vor dem Aufruf auf 1–100. Davon getrennt wurde der JPEG-Puffer der OpenMV 3 von 64 KB auf 23000 Byte reduziert, sodass große Einzelbilder jetzt einen Out-of-Memory-Fehler auslösen können — senken Sie die JPEG-Qualität oder Bildgröße.

Commits: 9efd7474a, 9a7c3defc

lens_corr()-Zoom ist jetzt funktionsfähig (behavior)

image.lens_corr() wendet jetzt tatsächlich sein zoom-Argument an (es wurde zuvor zwar geparst, war aber wirkungslos), sodass sich die Ausgabe für Skripte unterscheidet, die einen vom Standard abweichenden Zoom übergaben. Prüfen Sie die lens_corr()-Abstimmung erneut.

Commits: d6b49adef

Migrations-Checkliste

Für eine saubere Portierung auf v2.1.0 ist typischerweise Folgendes zu tun:

  1. Ersetzen Sie image.FREAK durch image.ORB, entfernen Sie das Deskriptortyp-Argument und aktualisieren Sie das Tupel-Entpacken von match_descriptor() / draw_keypoints() auf das Schlüsselpunkt-Objekt (die ORB-Überarbeitung).

  2. Benennen Sie sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() in die set_auto_*-Formen um (die Umbenennung der Automatikfunktionen).

  3. Verschieben Sie Histogramm-/Statistik-Code zu den Objektmethoden (die Histogramm-/Statistik-Überarbeitung).

  4. Benennen Sie find_features() scale= in scale_factor= um (die find_features-Umbenennung).

  5. Verwenden Sie Blob-Objekt-Zugriffsmethoden und ersetzen Sie find_markers() durch find_blobs(merge=True, ...) (die find_blobs-Änderung); ersetzen Sie img.copy_to_fb() durch das copy_to_fb=-Schlüsselwort (die copy_to_fb-Änderung).

  6. Begrenzen Sie die compress()-Qualität auf 1–100 und prüfen Sie die JPEG-Größen auf der OpenMV 3 erneut (die compress-Änderung); stimmen Sie den lens_corr()-Zoom erneut ab (die lens_corr-Änderung).

Alle anderen Skripte laufen unverändert.