image — wizja maszynowa#

Moduł image jest sercem stosu wizji maszynowej OpenMV. Udostępnia klasę Image – bufor pikseli w pamięci, na którym operuje każda procedura rysowania, filtrowania, transformacji i ekstrakcji cech – wraz z pomocniczymi obiektami wyników zwracanymi przez te procedury (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) oraz klasami pomocniczymi służącymi do ich konfiguracji (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Pozyskiwanie obrazu#

Istnieją cztery sposoby umieszczenia obiektu Image w pamięci RAM:

  • Przechwytywanie na żywo z sensora kamery. Wywołaj csi.CSI.snapshot(), aby przechwycić następną ramkę bezpośrednio do bufora ramki; zwrócony obiekt Image odwołuje się do tego bufora.

  • Z pliku. Przekaż ścieżkę do konstruktora Image (image.Image("/sd/photo.jpg")); obsługiwane formaty na dysku to BMP, PPM/PGM, JPEG, PNG oraz format nagrywania OpenMV ImageIO.

  • Z ndarray. Przekaż do konstruktora Image tablicę ndarray typu float32 o kształcie (h, w) lub (h, w, 3). Piksele są skalowane z zakresu 0.0 -- 255.0 odpowiednio do obrazu GRAYSCALE lub RGB565. Użyj tego, aby przenieść tensor wyjściowy z ml (lub dowolnego potoku ulab) z powrotem do obrazu, na którym można rysować.

  • Pusty bufor. Skonstruuj obiekt Image o zadanym rozmiarze i formacie pikseli (image.Image(320, 240, image.RGB565)), aby rysować na nim od zera lub używać go jako powierzchni roboczej do operacji arytmetycznych na obrazach.

Formaty pikseli#

Każdy obiekt Image ma jeden z poniższych formatów pikseli; wybór jest kompromisem między zużyciem pamięci, kosztem przetwarzania a tym, jakie algorytmy mogą na nim działać. Użyj BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG lub PNG jako argumentu pixformat podczas konstruowania obrazu lub konfigurowania sensora kamery:

  • BINARY (1 bpp) – jeden bit na piksel. Najmniejszy format; używany wewnętrznie przez procedury progowania i morfologii, ale rzadko przechwytywany bezpośrednio z sensora.

  • GRAYSCALE (8 bpp) – jeden bajt na piksel (kanał Y z YUV422). Najszybszy format dla większości algorytmów wizji komputerowej (AprilTag, wykrywanie krawędzi, przepływ optyczny).

  • RGB565 (16 bpp) – dwa bajty na piksel, 5-bitowy czerwony / 6-bitowy zielony / 5-bitowy niebieski. Domyślny format kolorowy.

  • BAYER (8 bpp) – surowe dane kolorowe wzorca Bayera prosto z sensora. Przydatne do niestandardowego demozaikowania lub do przechowywania większej liczby pikseli w mniejszej ilości pamięci przed debayeringiem na żądanie.

  • YUV422 (16 bpp) – kolor z podpróbkowaniem chrominancji 4:2:2, dwa bajty na piksel. Przydatne, gdy chcesz stosować algorytmy specyficzne dla chrominancji bez ponoszenia pełnego kosztu RGB.

  • JPEG / PNG – skompresowane bufory. Najlepsze do przechowywania i transmisji sieciowej. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

Praca z wynikami#

Metody wykrywania / ekstrakcji cech klasy Image zwracają obiekty, które możesz iterować i łączyć – wywołanie Image.find_blobs() zwraca listę obiektów Blob, wywołanie Image.find_apriltags() zwraca listę obiektów AprilTag itd. Każda klasa wyniku udostępnia geometryczne właściwości wykrycia (centroid, ramkę ograniczającą, pole, wartość kodu itd.), dzięki czemu możesz działać na nich bezpośrednio lub przekazać je z powrotem do metod rysowania (Image.draw_rectangle(), Image.draw_string(), …).

Funkcje pomocnicze przestrzeni barw#

Moduł udostępnia także małe czyste funkcje do konwersji pojedynczych wartości pikseli pomiędzy przestrzeniami barw binary / grayscale / RGB / LAB / YUV. Są przydatne, gdy potrzebujesz przekonwertować wartości progów lub wpisy palety w Pythonie przed przekazaniem ich do operacji na obrazach – do konwersji całego obrazu użyj metod to_* klasy Image, które są znacznie szybsze niż wywoływanie tych funkcji pomocniczych w pętli.

Klasy#

Funkcje#

Funkcje pomocnicze konwersji przestrzeni barw#

Każda z poniższych funkcji X_to_Y wykonuje pojedynczą konwersję wartości piksela. Wszystkie przyjmują/zwracają wartości w kanonicznych zakresach OpenMV:

  • binary – int 0 – 1.

  • grayscale – int 0 – 255.

  • RGB – krotka (r, g, b) 8-bitowych liczb całkowitych (każda 0 – 255).

  • LAB – krotka (l, a, b), gdzie L mieści się w zakresie 0 – 100, a A/B w zakresie -128 – 127.

  • YUV – krotka (y, u, v), gdzie Y mieści się w zakresie 0 – 255, a U/V w zakresie -128 – 127.

Do konwersji całego obrazu użyj metod to_* klasy Image, które są znacznie szybsze niż wywoływanie tych funkcji pomocniczych w pętli.

image.binary_to_grayscale(value: int) int#

Konwertuje wartość binarną na wartość w skali szarości.

image.binary_to_rgb(value: int) Tuple[int, int, int]#

Konwertuje wartość binarną na krotkę RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]#

Konwertuje wartość binarną na krotkę LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]#

Konwertuje wartość binarną na krotkę YUV.

image.grayscale_to_binary(value: int) int#

Konwertuje wartość w skali szarości na wartość binarną.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]#

Konwertuje wartość w skali szarości na krotkę RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]#

Konwertuje wartość w skali szarości na krotkę LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]#

Konwertuje wartość w skali szarości na krotkę YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int#

Konwertuje krotkę RGB na wartość binarną.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int#

Konwertuje krotkę RGB na wartość w skali szarości.

image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę RGB na krotkę LAB.

image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę RGB na krotkę YUV.

image.lab_to_binary(value: Tuple[int, int, int]) int#

Konwertuje krotkę LAB na wartość binarną.

image.lab_to_grayscale(value: Tuple[int, int, int]) int#

Konwertuje krotkę LAB na wartość w skali szarości.

image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę LAB na krotkę RGB.

image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę LAB na krotkę YUV.

image.yuv_to_binary(value: Tuple[int, int, int]) int#

Konwertuje krotkę YUV na wartość binarną.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int#

Konwertuje krotkę YUV na wartość w skali szarości.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę YUV na krotkę RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]#

Konwertuje krotkę YUV na krotkę LAB.

Deskryptory cech#

image.HaarCascade(path: str, stages: int = -1) Cascade#

Wczytuje kaskadę Haara i zwraca uchwyt Cascade do użycia z Image.find_features().

path może być jednym z dwóch:

  • literalnym łańcuchem "frontalface" lub "eye", aby wczytać jedną z dwóch kaskad wbudowanych w pamięć ROM oprogramowania układowego, albo

  • ścieżką w systemie plików do niestandardowego pliku binarnego .cascade wytworzonego przez narzędzia konwertera kaskad OpenMV.

stages wybiera, ile etapów kaskady ma zostać przetworzonych w czasie wykrywania. Wartość -1 używa każdego etapu zapisanego w pliku. Zmniejszenie tej wartości przyspiesza wykrywanie kosztem większej liczby fałszywych trafień.

image.load_descriptor(path: str) kp_desc | lbp_desc#

Wczytuje deskryptor z pliku w ścieżce path i zwraca go. Wewnętrzny znacznik typu pliku decyduje, która klasa deskryptora zostanie odtworzona:

image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None#

Serializuje descriptor (deskryptor punktów kluczowych ORB lub deskryptor LBP) do pliku w ścieżce path w formacie pliku deskryptora OpenMV. Ten sam plik można później ponownie wczytać za pomocą image.load_descriptor().

image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch#

Dopasowuje dwa deskryptory tego samego typu.

  • Dla dwóch deskryptorów LBP – zwraca całkowitą odległość Hamminga między nimi (mniejsza oznacza bliższe dopasowanie).

  • Dla dwóch deskryptorów punktów kluczowych ORB – zwraca obiekt kptmatch opisujący klaster dopasowanych punktów kluczowych lub None, jeśli żadne dopasowanie nie przekroczy progu threshold.

threshold (0 – 100) określa, jak restrykcyjne jest dopasowywanie ORB przy akceptowaniu pary punktów kluczowych. Niższe wartości zaostrzają dopasowywanie, odrzucając słabe dopasowania najbliższych sąsiadów.

filter_outliers włącza odrzucanie wartości odstających w stylu RANSAC w obrębie zbioru dopasowanych punktów kluczowych. Użyj go, gdy oczekujesz pojedynczej sztywnej transformacji między dwoma widokami; wyłącz go, gdy dopasowane punkty kluczowe obejmują wiele obiektów.

Funkcje pomocnicze geometrii plam (blob)#

Te funkcje pomocnicze przyjmują obiekt Blob (zwracany przez Image.find_blobs()) i na żądanie obliczają dodatkowe właściwości geometryczne. Znajdują się w zakresie modułu – a nie w Blob – dzięki czemu podstawowa ścieżka find_blobs() nie ponosi ich kosztu, dopóki o nie nie poprosisz.

image.get_solidity(blob: blob) float#

Zwraca zwartość (blob.pixels / convex_hull_area) obiektu blob. Liczba zmiennoprzecinkowa, 0 – 1; wartość 1.0 oznacza, że plama całkowicie wypełnia swoją otoczkę wypukłą.

image.get_convexity(blob: blob) float#

Zwraca wypukłość (convex_hull_perimeter / blob.perimeter) obiektu blob. Liczba zmiennoprzecinkowa, 0 – 1; wartość 1.0 oznacza idealnie wypukłą plamę.

image.get_major_axis_line(blob: blob) line#

Zwraca obiekt Line wzdłuż osi głównej obiektu blob (dłuższej z dwóch osi głównych prostokąta obróconego o minimalnym polu).

image.get_minor_axis_line(blob: blob) line#

Zwraca obiekt Line wzdłuż osi pomocniczej obiektu blob (krótszej z dwóch osi głównych prostokąta obróconego o minimalnym polu).

image.get_enclosing_circle(blob: blob) circle#

Zwraca obiekt Circle, który otacza obiekt blob.

image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]#

Zwraca 5-elementową krotkę (cx, cy, a, b, rotation) opisującą elipsę wpisaną w prostokąt obrócony o minimalnym polu wokół obiektu blob:

  • cx / cy – środek elipsy w pikselach (liczba całkowita).

  • a / b – długości półosi w pikselach (liczba całkowita).

  • rotation – obrót elipsy w stopniach (liczba całkowita).

Jest to zwykła krotka, a nie attrtuple, więc pola są dostępne wyłącznie przez indeks.

Stałe#

Formaty pikseli#

Przekaż dowolną z poniższych wartości jako argument pixformat do konstruktora Image lub do csi.CSI.pixformat().

image.BINARY: int#

Bitmapa 1 bit na piksel. Najmniejszy format – używany wewnętrznie przez progowanie i morfologię, rzadko przechwytywany bezpośrednio z sensora.

image.GRAYSCALE: int#

Skala szarości 8 bitów na piksel (jeden bajt na piksel). Najszybszy format dla większości algorytmów wizji komputerowej (AprilTag, wykrywanie krawędzi, przepływ optyczny).

image.RGB565: int#

Kolor 16 bitów na piksel upakowany jako 5 bitów czerwonego / 6 bitów zielonego / 5 bitów niebieskiego. Domyślny format kolorowy.

image.BAYER: int#

Surowe dane Bayera 8 bitów na piksel prosto z sensora. Większość metod przetwarzania obrazu nie jest dostępna dla obrazów Bayera; użyj tego formatu, gdy chcesz debayerować na żądanie lub przechowywać więcej pikseli w mniejszej ilości pamięci.

image.YUV422: int#

Kolor z podpróbkowaniem chrominancji 4:2:2, dwa bajty na piksel, upakowane jako Y1, U, Y2, V na parę pikseli. Tylko niektóre metody przetwarzania obrazu działają bezpośrednio na YUV422.

image.JPEG: int#

Skompresowany bufor JPEG. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

image.PNG: int#

Skompresowany bufor PNG. Operacje na poziomie pikseli wymagają najpierw Image.to_grayscale() lub Image.to_rgb565().

Palety kolorów#

Przekaż dowolną z poniższych wartości do Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) lub do csi.CSI.color_palette(), aby pokolorować obraz w skali szarości.

image.PALETTE_RAINBOW: int#

Gładkie tęczowe koło barw. Domyślna paleta OpenMV dla obrazów termicznych.

image.PALETTE_IRONBOW: int#

Nieliniowa paleta „ironbow”, która naśladuje wygląd celownika termicznego FLIR Lepton.

image.PALETTE_DEPTH: int#

Paleta obrazu głębi. Dostępna tylko w kompilacjach z obsługą sensora głębi (potok ToF – np. OpenMV Cam AE3 lub dowolna kamera z dołączonym modułem ToF Pmod).

image.PALETTE_EVT_DARK: int#

Paleta do wizualizacji ramek z kamery zdarzeniowej GENX320 na ciemnym tle. Przekaż ją do csi.CSI.color_palette, aby sterownik GENX320 emitował pokolorowane ramki RGB565 w trybie histogramu, lub do Image.draw_image() color_palette= podczas kolorowania obrazu zdarzeń w skali szarości.

Dostępna tylko w kompilacjach z obsługą GENX320 (OpenMV Cam AE3 oraz moduł GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int#

Paleta do wizualizacji ramek z kamery zdarzeniowej GENX320 na jasnym tle. Ten sam mechanizm dyspozycji i dostępność jak PALETTE_EVT_DARK.

Tryby skalowania#

Przekaż dowolną z poniższych wartości jako argument hint do Image.draw_image(), Image.scale() lub podobnych metod skalowania.

image.AREA: int#

Skaler uśredniający obszary. Używany przy zmniejszaniu; do powiększania używany jest Nearest-Neighbor.

image.BILINEAR: int#

Skaler dwuliniowy. Podpróbkuje przy zmniejszaniu.

image.BICUBIC: int#

Skaler dwukubiczny. Wyższa jakość niż BILINEAR, ale wolniejszy. Podpróbkuje przy zmniejszaniu.

Wskazówki rysowania / draw_image#

Połącz dowolne z tych wartości operacją bitową OR i przekaż jako argument hint metody Image.draw_image().

image.VFLIP: int#

Odwraca źródło w pionie podczas rysowania.

image.HMIRROR: int#

Odbija źródło w poziomie podczas rysowania.

image.TRANSPOSE: int#

Transponuje (zamienia x/y) źródło podczas rysowania.

image.CENTER: int#

Centruje źródło na celu. Wszelkie jawne przesunięcia x/y stają się wtedy przesunięciami od środka, a nie od lewego górnego rogu.

image.EXTRACT_RGB_CHANNEL_FIRST: int#

Podczas ekstrakcji kanału RGB za pomocą Image.draw_image() wyodrębnia kanał przed skalowaniem. Bez tej wskazówki kanał jest wyodrębniany po skalowaniu.

image.APPLY_COLOR_PALETTE_FIRST: int#

Podczas stosowania palety kolorów za pomocą Image.draw_image() stosuje paletę przed skalowaniem. Bez tej wskazówki paleta jest stosowana po skalowaniu.

image.SCALE_ASPECT_KEEP: int#

Skaluje źródło tak, aby zmieściło się wewnątrz celu z zachowaniem proporcji (dodaje czarne pasy, gdy proporcje się różnią).

image.SCALE_ASPECT_EXPAND: int#

Skaluje źródło tak, aby wypełniło cel z zachowaniem proporcji (przycina, gdy proporcje się różnią).

image.SCALE_ASPECT_IGNORE: int#

Skaluje źródło tak, aby wypełniło cel, ignorując proporcje.

image.BLACK_BACKGROUND: int#

Informuje ścieżkę mieszania alfa, że cel jest znany jako czarny, dzięki czemu może pominąć odczyt zwrotny piksela celu. Przyspiesza efekty alfa na świeżo wyczyszczonych buforach.

image.ROTATE_90: int#

Skrót dla VFLIP | TRANSPOSE (obrót o 90 stopni zgodnie z ruchem wskazówek zegara).

image.ROTATE_180: int#

Skrót dla HMIRROR | VFLIP (obrót o 180 stopni).

image.ROTATE_270: int#

Skrót dla HMIRROR | TRANSPOSE (obrót o 270 stopni zgodnie z ruchem wskazówek zegara).

Podpróbkowanie JPEG#

Przekaż dowolną z poniższych wartości jako argument subsampling do Image.to_jpeg(), Image.compress() lub Image.save() podczas zapisu pliku JPEG.

image.JPEG_SUBSAMPLING_AUTO: int#

Automatycznie wybiera podpróbkowanie chrominancji na podstawie ustawienia jakości JPEG.

image.JPEG_SUBSAMPLING_444: int#

Wymusza podpróbkowanie chrominancji 4:4:4 (brak kompresji chrominancji).

image.JPEG_SUBSAMPLING_422: int#

Wymusza podpróbkowanie chrominancji 4:2:2. Zalecane podczas strumieniowania MJPEG do zewnętrznych odtwarzaczy wideo, które źle obsługują 4:2:0.

image.JPEG_SUBSAMPLING_420: int#

Wymusza podpróbkowanie chrominancji 4:2:0.

Dopasowywanie szablonów#

Przekaż jedną z poniższych wartości jako argument search do Image.find_template().

image.SEARCH_EX: int#

Wyszukiwanie wyczerpujące – ocenia każdą pozycję w ROI. Najwolniejsze, ale gwarantuje znalezienie najlepszego dopasowania.

image.SEARCH_DS: int#

Wyszukiwanie diamentowe – wyszukiwanie od zgrubnego do dokładnego, które jest znacznie szybsze niż SEARCH_EX, ale może pominąć globalne optimum w przypadku silnie samopodobnych szablonów.

Wykrywanie krawędzi#

Przekaż jedną z poniższych wartości jako argument algorithm do Image.find_edges().

image.EDGE_CANNY: int#

Detektor krawędzi Canny’ego – amplituda gradientu + tłumienie niemaksimów + histereza. Wyższa jakość, wolniejszy.

image.EDGE_SIMPLE: int#

Detektor krawędzi oparty na progowanym filtrze górnoprzepustowym. Szybszy, ale produkuje grubsze, bardziej zaszumione krawędzie niż EDGE_CANNY.

Detektory narożników ORB#

Przekaż jedną z poniższych wartości jako argument corner_detector do Image.find_keypoints().

image.CORNER_FAST: int#

Detektor narożników FAST. Szybszy niż CORNER_AGAST, ale mniej dokładny.

image.CORNER_AGAST: int#

Detektor narożników AGAST. Wolniejszy niż CORNER_FAST, ale produkuje bardziej stabilne punkty kluczowe.

Rodziny AprilTag#

Połącz dowolną kombinację poniższych wartości operacją bitową OR i przekaż jako argument families do Image.find_apriltags(). Każda rodzina jest sterowana własną opcją kompilacji w oprogramowaniu układowym; nieobsługiwane rodziny są nieobecne w czasie wykonywania, a nie zawsze zerowe.

image.TAG16H5: int#

Rodzina AprilTag 16h5 (30 unikalnych identyfikatorów, korekcja błędów 0-bitowa).

image.TAG25H9: int#

Rodzina AprilTag 25h9 (35 unikalnych identyfikatorów, korekcja błędów do 3 bitów).

image.TAG36H10: int#

Rodzina AprilTag 36h10 (2320 unikalnych identyfikatorów, korekcja błędów do 3 bitów).

image.TAG36H11: int#

Rodzina AprilTag 36h11 (587 unikalnych identyfikatorów, korekcja błędów do 4 bitów). Najczęściej używana rodzina.

image.TAGCIRCLE21H7: int#

Rodzina AprilTag Circle21h7.

image.TAGCIRCLE49H12: int#

Rodzina AprilTag Circle49h12.

image.TAGCUSTOM48H12: int#

Rodzina AprilTag Custom48h12.

image.TAGSTANDARD41H12: int#

Rodzina AprilTag Standard41h12.

image.TAGSTANDARD52H13: int#

Rodzina AprilTag Standard52h13.

Symboliki kodów kreskowych#

Wartości zgłaszane w BarCode.type dla wpisów zwracanych przez Image.find_barcodes().

image.EAN2: int#

Uzupełniający kod kreskowy EAN-2.

image.EAN5: int#

Uzupełniający kod kreskowy EAN-5.

image.EAN8: int#

Kod kreskowy EAN-8.

image.UPCE: int#

Kod kreskowy UPC-E.

image.ISBN10: int#

Kod kreskowy ISBN-10.

image.UPCA: int#

Kod kreskowy UPC-A.

image.EAN13: int#

Kod kreskowy EAN-13.

image.ISBN13: int#

Kod kreskowy ISBN-13.

image.I25: int#

Kod kreskowy Interleaved 2-of-5.

image.DATABAR: int#

Kod kreskowy GS1 DataBar.

image.DATABAR_EXP: int#

Kod kreskowy GS1 DataBar Expanded.

image.CODABAR: int#

Kod kreskowy Codabar.

image.CODE39: int#

Kod kreskowy Code 39.

image.PDF417: int#

Dwuwymiarowy warstwowy kod kreskowy PDF417. Stała istnieje dla kompletności, ale dekoder kodów kreskowych obecnie nie implementuje PDF417 – Image.find_barcodes() nie zwróci wykryć tego typu.

image.CODE93: int#

Kod kreskowy Code 93.

image.CODE128: int#

Kod kreskowy Code 128.