v2.4.0

v2.4.0 przepisuje find_lines() jako detektor oparty na transformacie Hougha, dodaje find_line_segments(), dekodowanie data matrix find_datamatrices(), sensor.set_vsync_output(), odczyt/zapis wycinków obrazu oraz wiele nowych skalowanych rozmiarów ramki dla wyższej liczby FPS. Funkcje find_lines(), match_descriptor() i skip_frames() uległy zmianie — przeczytaj poniżej o zmianach łamiących.

Najważniejsze zmiany

  • find_lines() — przepisana jako detektor linii oparty na transformacie Hougha, zwracający obiekty linii (działa teraz na RGB565, nie tylko na skali szarości).

  • find_line_segments() — wykrywanie skończonych odcinków linii.

  • find_datamatrices() — dekodowanie data matrix.

  • sensor.set_vsync_output() — wystawienie VSYNC na pin I/O w celu synchronizacji kamery.

  • Więcej rozmiarów ramki — wiele dodatkowych skalowanych rozdzielczości dla wyższej liczby FPS.

  • Zmiana łamiąca: find_lines(), match_descriptor() i skip_frames() uległy zmianie — zobacz zmiany łamiące.

Nowe funkcje

  • image.find_line_segments() — wyszukiwanie nieskończonych odcinków linii; obiekty linii zyskały akcesor .length().

  • image.find_datamatrices() — dekodowanie data matrix, z przykładowymi skryptami.

  • sensor.set_vsync_output(pin) — wystawienie sygnału VSYNC na pin GPIO w celu synchronizacji kamery (OpenMV 2 / OpenMV 3).

  • Wycinki obrazu — indeksowanie obrazu / protokół bufora obsługują teraz odczyt i zapis wycinków danych obrazu.

  • Dodano wiele dodatkowych kombinacji skalowanej rozdzielczości / rozmiaru ramki, aby umożliwić wyższe liczby klatek; clock.fps() resetuje teraz swoje akumulatory co 2 s, dzięki czemu raportowane FPS odzwierciedla bieżącą liczbę klatek.

Pozostałe zmiany i usprawnienia

  • OV7725 jest okienkowany do QVGA, gdy rozdzielczość wynosi ≤ VGA (mniej pominiętych ramek przy wysokiej szybkości przechwytywania), a jego PLL ustawiono na 6× ze zmniejszonym zegarem zewnętrznym (OpenMV 2 48 MHz, OpenMV 3 54 MHz), co zmienia taktowanie ramek sensora.

Poprawki błędów

Przetwarzanie obrazu:

  • Naprawiono błąd rozmiaru bufora w compress_for_ide() (znacznik start/end), dekodowanie QR (oraz poprawki indeksowania bitmapy komórek i granic wzorca wyrównania w upstream quirc).

Sensor i łączność:

  • Obniżono zegar sensora OpenMV 2, aby współpracował z wyższym PLL sensora (inicjalizacja/synchronizacja kamery), oraz sprawiono, że WINC socket.recvfrom() zwraca rzeczywisty odebrany rozmiar (zgłaszając błąd przy rozmiarze niedodatnim zamiast zwracać nieaktualną wartość).

Sprzęt i obsługa płytek

  • Wyjście VSYNC na pinie GPIO (OpenMV 2 / OpenMV 3) wspierające sensor.set_vsync_output().

  • OpenMV 3 — włączono pyb.UART UART1.

Zmiany łamiące API

Widoczne dla użytkownika zmiany łamiące API między v2.3.0 a v2.4.0. Zakres: moduły C Pythona w modules/ oraz biblioteki Pythona w scripts/libraries/.

Każda zmiana jest oznaczona jej wpływem:

  • major — dotyczy większości skryptów korzystających z danej funkcji; konieczne będzie przeniesienie kodu.

  • minor — wąskie API; dotyczy tylko skryptów, które z niego korzystały.

  • behavior — to samo API, inne wyniki; sprawdź ponownie dostrojone skrypty.

Zmiany są pogrupowane według wpływu w tej kolejności. Jeśli chcesz po prostu przenieść swój kod, przejdź do listy kontrolnej migracji na końcu. Każdy skrót commita prowadzi do jego diffa na GitHubie.

find_lines() przepisana jako detektor Hougha (major)

image.find_lines() została przepisana jako detektor oparty na transformacie Hougha. Nie zwraca już listy krotek (x1, y1, x2, y2) — zwraca obiekty linii (.line() / .x1() / .y1() / .x2() / .y2() / .theta() / .rho() / .magnitude()) — i działa teraz również na RGB565 (nie tylko na skali szarości). Argument threshold zmienił się z liczby zmiennoprzecinkowej 0.0–1.0 na całkowitą sumę magnitudy krawędzi, line.magnitude jest teraz liczbą całkowitą, a także dodano nowe słowa kluczowe theta_margin / rho_margin. Przenieś kod rozpakowujący krotki na obiekty linii i ponownie dostrój threshold.

Commity: 31b7b5bf3, f4a9c6154

match_descriptor() zwraca obiekt dopasowania (minor)

image.match_descriptor() (ORB) zwraca teraz obiekt kptmatch z akcesorami .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() zamiast zwykłej 8-elementowej krotki. Obiekt nadal można indeksować/wycinać, więc indeksowanie pozycyjne nadal działa, ale kod, który używał isinstance(result, tuple) (lub metod krotek), musi korzystać z nowych akcesorów.

Commity: e960546b6

sensor.skip_frames() jest teraz oparta na czasie (behavior)

sensor.skip_frames() została przerobiona tak, aby przyjmować słowo kluczowe time= (domyślnie ~300 ms), i jest teraz domyślnie oparta na czasie, zamiast wykonywać stałą liczbę ramek, kończąc działanie wcześniej po upływie czasu. Skrypty, które polegały na dokładnej liczbie ramek, powinny przekazać jawną liczbę i/lub odpowiednio ustawić time=.

Commity: a039b5d1c

Lista kontrolna migracji

Dla czystego przeniesienia do v2.4.0 typowa praca obejmuje:

  1. Przenieś rozpakowywanie krotek find_lines() na obiekty linii i ponownie dostrój całkowity threshold (przepisanie find_lines).

  2. Używaj akcesorów kptmatch zamiast traktować wyniki match_descriptor() jako krotkę (zmiana match_descriptor).

  3. Przekaż jawną liczbę i/lub time= do sensor.skip_frames(), jeśli polegałeś na stałej liczbie ramek (zmiana skip_frames).

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