v1.2.0

v1.2.0 ist ein grundlegendes, sehr umfangreiches Release, das den größten Teil der klassischen OpenMV-Bildgebungs-API ausbaut: die Zeichen-Methoden, Binär-/Morphologie-Operationen, Keypoint-Deskriptoren (FAST / FREAK / LBP), Farbkonvertierungen und image.statistics, BMP-/PPM-/JPEG-Datei-I/O, die Module lcd, mjpeg, gif und mlx (Thermo), die OV7725-Kamera sowie zahlreiche sensor-Steuerungen. Einige grundlegende sensor-Verhaltensweisen haben sich geändert — lies die nachfolgenden Breaking Changes.

Höhepunkte

  • Zeichen-APIdraw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints().

  • Binär / Morphologiebinary(), invert(), and/or/xor/..., erode() / dilate() / morph(), negate() / difference().

  • Keypoints — FAST-/FREAK-/LBP-Deskriptoren mit match_descriptor() / save_descriptor() / load_descriptor().

  • Neue Modulelcd, mjpeg, gif (Farbe) und mlx (Thermo).

  • OV7725-Kameraunterstützung; image.statistics; BMP-/PPM-/JPEG-Datei-I/O.

  • Breaking: Das Verhalten von sensor.reset(), sensor.snapshot() und sensor.set_pixformat() hat sich geändert — siehe die Breaking Changes.

Neue Funktionen

  • Zeichnenimage.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() mit Schlüsselwortargumenten (Farbe, Dicke, …) hinzugefügt.

  • Binär / Morphologieimage.binary(), invert(), and() / nand() / or() / nor() / xor() / xnor(), erode() / dilate() / morph(), negate() / difference(), pixels(), centroid(), orientation_radians() / orientation_degrees() sowie width() / height() / format() hinzugefügt.

  • Keypoints / Deskriptoren — FAST-Keypoint-Extraktion über find_keypoints(), ein einheitliches match_descriptor() und save_descriptor() / load_descriptor() für FREAK / LBP sowie eine Haar-/LBP-Kaskade für Profilgesichter.

  • Farbe / Statistikimage.statistics und Farbkonvertierungsfunktionen (rgb_to_lab / lab_to_rgb / rgb_to_grayscale / grayscale_to_rgb).

  • Datei-I/O — Laden und Speichern von BMP / PPM (P2/P3/P5/P6) / JPEG (einschließlich Graustufen-JPEG und 4:2:0-/4:2:2-Chroma-Subsampling).

  • Module — neue Module lcd (LCD-Shield), mjpeg (Videoaufzeichnung), Farb-gif (mit Gif.loop()) und mlx (Thermokamera), jeweils mit Beispielskripten.

  • Sensorsensor.get_id() (+ OV9650/OV2640/OV7725-PID-Konstanten), sensor.set_special_effect() (SDE_*-Konstanten), sensor.set_image_filter() (FILTER_BW / FILTER_SKIN), die Bildgröße HQVGA und image.set_pixel(x, y, …) hinzugefügt.

  • WiFi — den ATWINC1500-WiFi-Treiber und die Grundlagen für das OpenMV-1/2-BSP sowie ein BLE-Beispiel hinzugefügt.

Weitere Änderungen und Verbesserungen

  • Der Framebuffer wird nun vor dem Streaming an die OpenMV IDE JPEG-komprimiert (geringere Bandbreite); die JPEG-Kompression erfolgt in place; der H/V-Zoom des OV7725 ermöglicht beliebige Skalierung; verbesserte (schnellere) Haar-Gesichtserkennung, die bei QVGA läuft.

Fehlerbehebungen

Bildgebung:

  • Behoben: die Berechnung des Integralbilds, eine Beschädigung durch den median()-Filter, die Schwerpunktberechnung, RGB-Haut-/Schwarz-Weiß-Filter bei RGB-Eingabe sowie schnelleres Lesen/Schreiben von Graustufen-BMP/-PPM.

Sensor und System:

  • Behoben: die Timer von pyb.Servo (Servo funktioniert nun), die HQVGA-Auflösung, die Zuverlässigkeit der SD-Karten-Initialisierung, die Neuinitialisierung des Speichers nach einem Soft-Reset sowie das erneute Ausführen der REPL, wenn kein Skript vorhanden ist.

Hardware- und Board-Unterstützung

  • OV7725-Kamerasensor.

  • LCD-Shield (lcd-Modul), mlx-Thermokamera und Grundlagen für ATWINC1500-WiFi.

Breaking API-Änderungen

Für Benutzer sichtbare API-Brüche zwischen v1.1.0 und v1.2.0. Geltungsbereich: Python-C-Module in modules/ und Python-Bibliotheken in scripts/libraries/.

Alle drei Breaking Changes sind Verhaltens-Änderungen an grundlegenden sensor-Funktionen (gleiche API, anderes Verhalten) — prüfe die betroffenen Skripte erneut. Jeder Commit-Hash verlinkt auf seinen Diff auf GitHub. (Der allergrößte Teil dieses Releases ist neue API, die im Bereich v1.1→v1.2 aufgebaut wurde, und daher additiv, nicht brechend.)

sensor.reset() wendet keine Standardkonfiguration mehr an (Verhalten)

sensor.reset() wendet keine integrierte Standardkonfiguration mehr an (pixformat / framesize / framerate / gain / contrast / brightness / saturation). Skripte, die sich darauf verlassen haben, dass reset() einen nutzbaren Standard hinterlässt, müssen nun nach reset() explizit sensor.set_pixformat() und sensor.set_framesize() (und alle weiteren Einstellungen) aufrufen.

Commits: d1e782df3

sensor.snapshot() löst bei Timeout eine Ausnahme aus (Verhalten)

sensor.snapshot() löst nun RuntimeError("Sensor Timeout!!") aus, wenn der Sensor eine Zeitüberschreitung hat, anstatt unbegrenzt zu hängen. Umschließe snapshot() mit try / except RuntimeError, falls du Timeouts tolerieren musst.

Commits: e3f41d674

sensor.set_pixformat() löst bei nicht unterstütztem Format eine Ausnahme aus (Verhalten)

sensor.set_pixformat() löst nun eine Ausnahme aus, wenn ein nicht unterstütztes Pixelformat übergeben wird, anstatt False zurückzugeben. Code, der den False-Rückgabewert geprüft hat, muss stattdessen die Ausnahme abfangen.

Commits: e0c5822c2

Migrations-Checkliste

Für eine saubere Portierung auf v1.2.0 ist typischerweise Folgendes zu tun:

  1. Setze sensor.set_pixformat() / sensor.set_framesize() nach sensor.reset() explizit (die Reset-Änderung).

  2. Umschließe sensor.snapshot() mit try / except RuntimeError, falls du Sensor-Timeouts tolerieren musst (die Snapshot-Änderung).

  3. Fange die Ausnahme von sensor.set_pixformat() ab, anstatt auf False zu prüfen (die set_pixformat-Änderung).

Alle anderen Skripte laufen unverändert.