v2.1.0

v2.1.0 to ogromne wydanie modernizujące API. Zastępuje deskryptor punktów kluczowych FREAK przez ORB, przebudowuje find_blobs() / histogramy / statystyki na API oparte na obiektach, zmienia nazwy funkcji automatycznej ekspozycji/wzmocnienia/balansu bieli sensora sensor, dodaje wykrywanie kodów QR oraz korekcję obiektywu OV7725, a także uruchamia wstępnie płytkę OpenMV Cam M7. Zmieniło się wiele API — przeczytaj poniższe zmiany łamiące zgodność.

Najważniejsze zmiany

  • Punkty kluczowe ORB — deskryptor FREAK zastąpiono przez ORB (przebudowano find_keypoints() / match_descriptor()).

  • API obiektowefind_blobs(), get_histogram(), get_statistics() zwracają teraz obiekty z nazwanymi akcesorami.

  • Kody QR — dodano wykrywanie image.find_qrcodes().

  • OpenMV Cam M7 — wstępna obsługa płytki.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (zmieniona nazwa) oraz set_lens_correction().

  • Zmiana łamiąca zgodność: zmieniły się API punktów kluczowych/deskryptorów, plam (blob)/histogramów/statystyk, funkcji automatycznych sensora oraz kilka innych — zobacz zmiany łamiące zgodność.

Nowe funkcje

  • OpenMV Cam M7 — dodano wstępną obsługę płytki OpenMV 3 (M7).

  • Kody QR — dodano image.find_qrcodes() z przykładem qrcodes.py.

  • Punkty kluczowe ORB — nowy system deskryptorów ORB: find_keypoints() z argumentem corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() ze słowem kluczowym filter_outliers i estymacją rotacji; zapis/wczytywanie punktów kluczowych.

  • API obiektoweimage.get_histogram() / get_statistics() / get_percentile() zwracają obiekty histogramu/statystyk; find_blobs() zwraca obiekty plam (blob) (rect() / cx() / cy() / code() / area() / pixels()) z area_threshold / pixels_threshold / merge / margin / invert oraz x_stride / y_stride.

  • Sensor — dodano sensor.set_lens_correction(enable, radi, coef) dla korekcji winietowania obiektywu OV7725, sensor.set_windowing() przyjmuje teraz także krotkę (w, h) (automatycznie wyśrodkowaną) oraz image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Dodano przykładowe skrypty śledzenia kolorów, Arduino jako urządzenie podrzędne SPI/I2C, punktów kluczowych oraz histogramu/statystyk.

Pozostałe zmiany i ulepszenia

  • IDE może teraz przerwać działający main.py; szybsze find_blobs() / find_qrcodes() / get_statistics(); ORB używa odległości Hamminga opartej na popcount; korekcja obiektywu zużywa mniej pamięci RAM; reguła udev w Linuksie powstrzymuje ModemManager przed zajęciem portu szeregowego.

Poprawki błędów

Kamera i obrazowanie:

  • Naprawiono czyszczenie/unieważnianie pamięci podręcznej DMA na M7 (uszkodzone ramki), nadmiarową dodatkową linię na końcu każdej ramki, granice przepełnienia bufora ramki JPEG, zwalnianie bufora ramki przy niepowodzeniu compress(), dokładność / ROI / obsługę pustego zestawu w ORB oraz geometrię load_image(copy_to_fb=True).

System:

  • Naprawiono obsługę ADC na F7, nazwę rejestru OV7725, taktowanie bootloadera/USB, użyto WFI podczas oczekiwania na zrzuty obrazu oraz uczyniono przykład strumieniowania MJPEG nieblokującym, z limitami czasu na klienta.

Sprzęt i obsługa płytek

  • OpenMV Cam M7 (OpenMV 3) — wstępna obsługa płytki.

  • OV7725 — obsługa korekcji obiektywu (winietowania).

Zmiany łamiące zgodność API

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

Każda zmiana jest oznaczona swoim wpływem:

  • major — dotyczy większości skryptów używających danej funkcji; trzeba będzie przenieść kod.

  • minor — wąskie API; dotyczy tylko skryptów, które go używał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 hash commita prowadzi do jego diffa na GitHubie.

FREAK zastąpiony przez ORB; przebudowano API deskryptorów (major)

Deskryptor punktów kluczowych FREAK został usunięty i zastąpiony przez ORB: image.FREAK już nie istnieje (użyj image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() nie przyjmują już wiodącego argumentu typu deskryptora (jest on wnioskowany z obiektu), match_descriptor() zwraca teraz 8-elementową krotkę (cx, cy, x, y, w, h, match_count, rotation) (ostatni element to surowa liczba, a nie procent), a draw_keypoints() wymaga obiektu punktów kluczowych zamiast surowej listy (x, y, angle). find_keypoints() zyskało corner_detector / max_keypoints / scale_factor ze zmienionymi wartościami domyślnymi.

Commity: e2d0c4840, bba8e5a9e, 6000684cb

Zmiana nazw funkcji automatycznych sensora (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() zostały przemianowane na sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (stare nazwy usunięto). Każda zyskała opcjonalne słowo kluczowe value= do ustawienia wartości ręcznej zamiast automatycznej.

Commity: 1b22a2961

Histogram / statystyki przebudowane na API obiektowe (major)

Interfejs histogramu/statystyk został przebudowany na obiektowe image.get_histogram() / get_statistics() / get_percentile() zwracające obiekty histogramu/statystyk. Dawne płaskie wyniki histogramu/statystyk oraz metody bin_count / l_bin_count / a_bin_count / b_bin_count zostały usunięte (użyj len(histogram.bins()) itp.).

Commity: 011108412, 9f37c83de

Zmiana nazwy scale w find_features() (major)

image.find_features() (Haar) zmieniło nazwę słowa kluczowego scale= na scale_factor=. Zaktualizuj wywołania find_features(cascade, scale=...) na scale_factor=....

Commity: 96e4f770c

find_blobs() zwraca obiekty; find_markers() usunięte (minor)

image.find_blobs() zwraca teraz obiekty plam (blob) z nazwanymi akcesorami (dostęp przez indeks nadal działa dla zgodności wstecznej), a image.find_markers() zostało usunięte — użyj zamiast tego find_blobs(..., merge=True, margin=...). Zaawansowane wywołanie zwrotne filtra plam kolorowych nie jest już obsługiwane.

Commity: af15ec6eb

img.copy_to_fb() zastąpione (minor)

Metoda img.copy_to_fb() została zastąpiona słowem kluczowym copy_to_fb= w image.Image / load_image(). Użyj image.Image(path, copy_to_fb=True), aby wczytać duże obrazy bezpośrednio do bufora ramki.

Commity: 1645ab94b

compress() odrzuca jakość spoza zakresu (behavior)

image.compress() / compressed() zgłaszają teraz błąd, gdy quality jest poza zakresem 1–100, zamiast po cichu ograniczać wartość. Ogranicz quality do zakresu 1–100 przed wywołaniem. Niezależnie od tego, bufor JPEG w OpenMV 3 został zmniejszony z 64 KB do 23000 bajtów, więc duże ramki mogą teraz zgłaszać brak pamięci — obniż jakość JPEG lub rozmiar ramki.

Commity: 9efd7474a, 9a7c3defc

Powiększenie w lens_corr() jest teraz funkcjonalne (behavior)

image.lens_corr() faktycznie stosuje teraz swój argument zoom (wcześniej był on parsowany, ale nieskuteczny), więc wynik różni się dla skryptów, które przekazywały niedomyślne powiększenie. Sprawdź ponownie dostrojenie lens_corr().

Commity: d6b49adef

Lista kontrolna migracji

Dla czystego przeniesienia do v2.1.0 typowa praca to:

  1. Zastąp image.FREAK przez image.ORB, usuń argument typu deskryptora oraz zaktualizuj rozpakowanie krotki match_descriptor() / draw_keypoints() do obiektu punktów kluczowych (przebudowa ORB).

  2. Zmień nazwy sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() na formy set_auto_* (zmiana nazw funkcji automatycznych).

  3. Przenieś kod histogramu/statystyk na metody obiektowe (przebudowa histogramu/statystyk).

  4. Zmień nazwę scale= w find_features() na scale_factor= (zmiana nazwy w find_features).

  5. Używaj akcesorów obiektu plamy (blob) i zastąp find_markers() przez find_blobs(merge=True, ...) (zmiana find_blobs); zastąp img.copy_to_fb() słowem kluczowym copy_to_fb= (zmiana copy_to_fb).

  6. Ogranicz jakość compress() do zakresu 1–100 i sprawdź ponownie rozmiary JPEG w OpenMV 3 (zmiana compress); dostrój ponownie powiększenie lens_corr() (zmiana lens_corr).

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