v1.2.0

v1.2.0 to fundamentalne, bardzo duże wydanie, które rozbudowuje większość klasycznego API obrazowania OpenMV: metody rysowania, operacje binarne / morfologiczne, deskryptory punktów kluczowych (FAST / FREAK / LBP), konwersje kolorów oraz image.statistics, wejście/wyjście plików BMP / PPM / JPEG, moduły lcd, mjpeg, gif oraz termiczny mlx, kamerę OV7725 i wiele elementów sterujących sensor. Część podstawowego zachowania sensor uległa zmianie — przeczytaj poniższe zmiany powodujące niezgodność.

Najważniejsze zmiany

  • API rysowaniadraw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints().

  • Operacje binarne / morfologicznebinary(), invert(), and/or/xor/..., erode() / dilate() / morph(), negate() / difference().

  • Punkty kluczowe — deskryptory FAST / FREAK / LBP z match_descriptor() / save_descriptor() / load_descriptor().

  • Nowe modułylcd, mjpeg, gif (kolorowy) oraz termiczny mlx.

  • Obsługa kamery OV7725; image.statistics; wejście/wyjście plików BMP/PPM/JPEG.

  • Niezgodność: zmieniło się zachowanie sensor.reset(), sensor.snapshot() oraz sensor.set_pixformat() — zobacz zmiany powodujące niezgodność.

Nowe funkcje

  • Rysowanie — dodano image.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() z argumentami nazwanymi (kolor, grubość, …).

  • Operacje binarne / morfologiczne — dodano image.binary(), invert(), and() / nand() / or() / nor() / xor() / xnor(), erode() / dilate() / morph(), negate() / difference(), pixels(), centroid(), orientation_radians() / orientation_degrees() oraz width() / height() / format().

  • Punkty kluczowe / deskryptory — ekstrakcja punktów kluczowych FAST za pomocą find_keypoints(), ujednolicone match_descriptor() oraz save_descriptor() / load_descriptor() dla FREAK / LBP, a także kaskada Haar/LBP dla twarzy z profilu.

  • Kolor / statystykiimage.statistics oraz funkcje konwersji kolorów (rgb_to_lab / lab_to_rgb / rgb_to_grayscale / grayscale_to_rgb).

  • Wejście/wyjście plików — wczytywanie i zapis BMP / PPM (P2/P3/P5/P6) / JPEG (w tym JPEG w skali szarości oraz podpróbkowanie chrominancji 4:2:0 / 4:2:2).

  • Moduły — nowy lcd (nakładka LCD), mjpeg (nagrywanie wideo), kolorowy gif (z Gif.loop()) oraz moduły kamery termicznej mlx, każdy z przykładowymi skryptami.

  • Sensor — dodano sensor.get_id() (+ stałe PID OV9650/OV2640/OV7725), sensor.set_special_effect() (stałe SDE_*), sensor.set_image_filter() (FILTER_BW / FILTER_SKIN), rozmiar ramki HQVGA oraz image.set_pixel(x, y, …).

  • WiFi — dodano sterownik WiFi ATWINC1500 oraz podstawy BSP dla OpenMV 1/2, a także przykład BLE.

Pozostałe zmiany i ulepszenia

  • Bufor ramki jest teraz kompresowany do JPEG przed przesłaniem strumieniowym do OpenMV IDE (mniejsze zużycie pasma); kompresja JPEG odbywa się w miejscu; powiększenie poziome/pionowe OV7725 umożliwia dowolne skalowanie; ulepszone (szybsze) wykrywanie twarzy metodą Haara działające przy QVGA.

Poprawki błędów

Obrazowanie:

  • Naprawiono obliczanie obrazu całkowego, uszkodzenia filtra median(), obliczanie centroidu, filtry skóry RGB / czarno-białe na wejściu RGB oraz przyspieszono odczyt/zapis BMP/PPM w skali szarości.

Sensor i system:

  • Naprawiono liczniki czasu pyb.Servo (Servo teraz działa), rozdzielczość HQVGA, niezawodność inicjalizacji karty SD, ponowną inicjalizację pamięci masowej po miękkim resecie oraz ponowne uruchamianie REPL, gdy nie ma żadnego skryptu.

Sprzęt i obsługa płytek

  • Sensor kamery OV7725.

  • Nakładka LCD (moduł lcd), kamera termiczna mlx oraz podstawy WiFi ATWINC1500.

Zmiany API powodujące niezgodność

Widoczne dla użytkownika niezgodności API między v1.1.0 a v1.2.0. Zakres: moduły C dla Pythona w modules/ oraz biblioteki Pythona w scripts/libraries/.

Wszystkie trzy zmiany powodujące niezgodność to zmiany zachowania podstawowych funkcji sensor (to samo API, inne zachowanie) — ponownie sprawdź dotknięte skrypty. Każdy skrót commita prowadzi do jego diffa na GitHubie. (Zdecydowana większość tego wydania to nowe API zbudowane w zakresie v1.1→v1.2, a więc jest to rozbudowa, a nie niezgodność.)

sensor.reset() nie stosuje już domyślnej konfiguracji (zachowanie)

sensor.reset() nie stosuje już wbudowanej domyślnej konfiguracji (pixformat / framesize / framerate / wzmocnienie / kontrast / jasność / nasycenie). Skrypty, które polegały na tym, że reset() pozostawia użyteczne ustawienia domyślne, muszą teraz jawnie wywołać sensor.set_pixformat() oraz sensor.set_framesize() (i wszelkie inne ustawienia) po reset().

Commity: d1e782df3

sensor.snapshot() zgłasza wyjątek przy przekroczeniu limitu czasu (zachowanie)

sensor.snapshot() zgłasza teraz RuntimeError("Sensor Timeout!!"), gdy sensor przekroczy limit czasu, zamiast zawieszać się w nieskończoność. Owiń snapshot() w try / except RuntimeError, jeśli musisz tolerować przekroczenia limitu czasu.

Commity: e3f41d674

sensor.set_pixformat() zgłasza wyjątek przy nieobsługiwanym formacie (zachowanie)

sensor.set_pixformat() zgłasza teraz wyjątek, gdy poda się nieobsługiwany format pikseli, zamiast zwracać False. Kod, który sprawdzał zwracaną wartość False, musi teraz zamiast tego przechwytywać wyjątek.

Commity: e0c5822c2

Lista kontrolna migracji

Dla czystego przeniesienia na v1.2.0 typowa praca to:

  1. Jawnie ustaw sensor.set_pixformat() / sensor.set_framesize() po sensor.reset() (zmiana reset).

  2. Owiń sensor.snapshot() w try / except RuntimeError, jeśli musisz tolerować przekroczenia limitu czasu sensora (zmiana snapshot).

  3. Przechwytuj wyjątek z sensor.set_pixformat() zamiast sprawdzać False (zmiana set_pixformat).

Wszystkie pozostałe skrypty działają bez zmian.