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 obiektowe —
find_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.
Sensor —
set_auto_whitebal()/set_auto_gain()/set_auto_exposure()(zmieniona nazwa) orazset_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łademqrcodes.py.Punkty kluczowe ORB — nowy system deskryptorów ORB:
find_keypoints()z argumentemcorner_detector(CORNER_FAST/CORNER_AGAST),max_keypoints/scale_factor;match_descriptor()ze słowem kluczowymfilter_outliersi estymacją rotacji; zapis/wczytywanie punktów kluczowych.API obiektowe —
image.get_histogram()/get_statistics()/get_percentile()zwracają obiekty histogramu/statystyk;find_blobs()zwraca obiekty plam (blob) (rect()/cx()/cy()/code()/area()/pixels()) zarea_threshold/pixels_threshold/merge/margin/invertorazx_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ą) orazimage.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; szybszefind_blobs()/find_qrcodes()/get_statistics(); ORB używa odległości Hamminga opartej na popcount; korekcja obiektywu zużywa mniej pamięci RAM; regułaudevw 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.
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.).
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.
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:
Zastąp
image.FREAKprzezimage.ORB, usuń argument typu deskryptora oraz zaktualizuj rozpakowanie krotkimatch_descriptor()/draw_keypoints()do obiektu punktów kluczowych (przebudowa ORB).Zmień nazwy
sensor.set_whitebal()/set_gain_ctrl()/set_exposure_ctrl()na formyset_auto_*(zmiana nazw funkcji automatycznych).Przenieś kod histogramu/statystyk na metody obiektowe (przebudowa histogramu/statystyk).
Zmień nazwę
scale=wfind_features()nascale_factor=(zmiana nazwy w find_features).Używaj akcesorów obiektu plamy (blob) i zastąp
find_markers()przezfind_blobs(merge=True, ...)(zmiana find_blobs); zastąpimg.copy_to_fb()słowem kluczowymcopy_to_fb=(zmiana copy_to_fb).Ogranicz jakość
compress()do zakresu 1–100 i sprawdź ponownie rozmiary JPEG w OpenMV 3 (zmiana compress); dostrój ponownie powiększenielens_corr()(zmiana lens_corr).
Wszystkie pozostałe skrypty działają bez zmian.