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 obiektImageodwoł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 OpenMVImageIO.Z ndarray. Przekaż do konstruktora
Imagetablicęndarraytypu float32 o kształcie(h, w)lub(h, w, 3). Piksele są skalowane z zakresu0.0 -- 255.0odpowiednio do obrazu GRAYSCALE lub RGB565. Użyj tego, aby przenieść tensor wyjściowy zml(lub dowolnego potokuulab) z powrotem do obrazu, na którym można rysować.Pusty bufor. Skonstruuj obiekt
Imageo 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()lubImage.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¶
- class Image – obiekt obrazu
- klasa ImageIO – obiekt ImageIO
- class HaarCascade – deskryptor cech
- klasa Similarity – obiekt Similarity
- class Histogram – obiekt Histogram
- klasa Percentile – obiekt Percentile
- class Threshold – Obiekt Threshold
- klasa Statistics – obiekt Statistics
- class Blob – obiekt Blob
- klasa Line – obiekt Line
- class Circle – obiekt Circle
- klasa Rect – obiekt Rectangle
- klasa QRCode – obiekt QRCode
- class AprilTag – obiekt AprilTag
- class DataMatrix – obiekt DataMatrix
- class BarCode – obiekt BarCode
- class Displacement – obiekt Displacement
- class kptmatch – Obiekt dopasowania punktów kluczowych
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 –
int0 – 1.grayscale –
int0 – 255.RGB – krotka
(r, g, b)8-bitowych liczb całkowitych (każda 0 – 255).LAB – krotka
(l, a, b), gdzieLmieści się w zakresie 0 – 100, aA/Bw zakresie -128 – 127.YUV – krotka
(y, u, v), gdzieYmieści się w zakresie 0 – 255, aU/Vw 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.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_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_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_grayscale(value: Tuple[int, int, int]) int¶
Konwertuje krotkę YUV na wartość w skali szarości.
Deskryptory cech¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Wczytuje kaskadę Haara i zwraca uchwyt
Cascadedo użycia zImage.find_features().pathmoż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
.cascadewytworzonego przez narzędzia konwertera kaskad OpenMV.
stageswybiera, ile etapów kaskady ma zostać przetworzonych w czasie wykrywania. Wartość-1uż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
pathi zwraca go. Wewnętrzny znacznik typu pliku decyduje, która klasa deskryptora zostanie odtworzona:Deskryptor punktów kluczowych ORB – zapisany przez
Image.find_keypoints(), a następnieimage.save_descriptor().Deskryptor LBP – zapisany przez
Image.find_lbp(), a następnieimage.save_descriptor().
- 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żcepathw 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
kptmatchopisujący klaster dopasowanych punktów kluczowych lubNone, jeśli żadne dopasowanie nie przekroczy proguthreshold.
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_outlierswłą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) obiektublob. 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) obiektublob. Liczba zmiennoprzecinkowa, 0 – 1; wartość 1.0 oznacza idealnie wypukłą plamę.
- image.get_major_axis_line(blob: blob) line¶
Zwraca obiekt
Linewzdłuż osi głównej obiektublob(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
Linewzdłuż osi pomocniczej obiektublob(krótszej z dwóch osi głównych prostokąta obróconego o minimalnym polu).
- 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ół obiektublob: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, Vna 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()lubImage.to_rgb565().
- image.PNG: int¶
Skompresowany bufor PNG. Operacje na poziomie pikseli wymagają najpierw
Image.to_grayscale()lubImage.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 doImage.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.
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.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.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.
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).
Dopasowywanie szablonów¶
Przekaż jedną z poniższych wartości jako argument search do Image.find_template().
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).
Symboliki kodów kreskowych¶
Wartości zgłaszane w BarCode.type dla wpisów zwracanych przez Image.find_barcodes().
- 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.