- 1. Operacje bitowe i maskowanie
- 2. Splot i rozmycie
- 3. Wyostrzanie - odwracanie rozmycia obrazu
- 4. Threshoding (binaryzacja)
- 5. Dylatacja, erozja, otwieranie / zamykanie
- 6. Wykrywanie krawędzi i gradienty obrazu
- 14. Perspektywa i transformacja afiniczna
- 8. Aplikacja Live Sketch
W poprzednich samouczkach dowiedzieliśmy się o OpenCV i wykonaliśmy podstawowe przetwarzanie obrazu, a następnie w następnym samouczku dokonaliśmy pewnych manipulacji obrazem w OpenCV, takich jak kadrowanie, obracanie, transformacja obrazu itp. Tak więc, kontynuując poprzedni samouczek dotyczący manipulacji obrazami, tutaj uczymy kilka innych technik manipulacji obrazem, takich jak, a na końcu samouczka zbudujemy program python-opencv do tworzenia szkiców na żywo z transmisji na żywo z kamery internetowej. Ta aplikacja będzie korzystać z wielu funkcji przetwarzania obrazu, których nauczyliśmy się do tej pory lub których nauczymy się w tym samouczku, więc będzie to dobry praktyczny przykład obejmujący wszystkie funkcje.
Jak powiedziano w poprzednim samouczku, OpenCV to Open Source Commuter Vision Library, która ma interfejsy C ++, Python i Java i obsługuje systemy Windows, Linux, Mac OS, iOS i Android. Dzięki temu można go łatwo zainstalować w Raspberry Pi w środowisku Python i Linux. Raspberry Pi z OpenCV i dołączoną kamerą może być używany do tworzenia wielu aplikacji do przetwarzania obrazu w czasie rzeczywistym, takich jak wykrywanie twarzy, blokowanie twarzy, śledzenie obiektów, wykrywanie tablic rejestracyjnych samochodów, system bezpieczeństwa w domu itp.
W tym samouczku zobaczymy więcej manipulacji obrazami przy użyciu Python OpenCV. Tutaj nauczymy się, jak zastosować następującą funkcję na obrazie za pomocą Python OpenCV:
- Operacje bitowe i maskowanie
- Splot i rozmycie
- Wyostrzanie - odwracanie rozmycia obrazu
- Progowanie (binaryzacja)
- Dylatacja, erozja, otwieranie / zamykanie
- Wykrywanie krawędzi i gradienty obrazu
- Perspektywa i transformacja afiniczna
- Aplikacja Live Sketch
1. Operacje bitowe i maskowanie
Operacje bitowe pomagają w maskowaniu obrazów i pomagają tworzyć proste obrazy.
Robienie kwadratu
import cv2 import numpy as np # używamy tylko dwóch wymiarów, ponieważ jest to obraz w skali szarości, jeśli używaliśmy obrazu #kolorowego, użyliśmy wtedy prostokąta = np.zeros ((300,300,3), np.uint8) # Tworzenie kwadratowego kwadratu = np.zeros ((300,300), np.uint8) cv2.rectangle (square, (50,50), (250,250), 255, -1) cv2.imshow ("square", square) cv2. waitKey (0)
Tworzenie elipsy
ellipse = np.zeros ((300,300), np.uint8) cv2.ellipse (ellipse, (150,150), (150,150), 30,0,180,255, -1) cv2.imshow ("ellipse", ellipse) cv2.waitKey (0)
Eksperymentowanie z operacjami bitowymi
#AND_shows tylko tam, gdzie te dwa przecinają się
BitwiseAND = cv2.bitwise_and (kwadrat, elipsa) cv2.imshow ("AND", BitwiseAND) cv2.waitKey (0)
#LUB_ pokazuje tylko, gdzie jest kwadrat lub elipsa
BitwiseOR = cv2.bitwise_or (kwadrat, elipsa) cv2.imshow ("LUB", BitwiseOR) cv2.waitKey (0)
#XOR_pokazuje tylko wtedy, gdy jeden z nich istnieje samodzielnie
BitwiseXOR = cv2.bitwise_xor (kwadrat, elipsa) cv2.imshow ("XOR", BitwiseXOR) cv2.waitKey (0)
# NIE_ pokazuje wszystko, co nie jest częścią elipsy i operację NIE można zastosować tylko do pojedynczej figury
BitwiseNOT_elp = cv2.bitwise_not (ellipse) cv2.imshow ("NOT_ellipse", BitwiseNOT_elp) cv2.waitKey (0) cv2.destroyAllWindows ()
2. Splot i rozmycie
Splot jest operacją matematyczną przeprowadzono na dwóch funkcji produkujących trzecią funkcję, która jest zazwyczaj zmodyfikowana wersja pierwotnej funkcji.
Obraz wyjściowy = obraz Funkcja Rozmiar jądra
W wizji komputerowej używamy jądra, aby określić rozmiar, nad którym wykonujemy naszą funkcję manipulacyjną na naszym obrazie.
Rozmycie to operacja, w której uśredniamy piksele w regionie (jądro)
OpenCV rozmywa obraz, stosując jądro, jądro mówi ci, jak zmienić wartość dowolnego danego piksela, łącząc go z inną ilością sąsiednich pikseli, jądro jest nakładane na każdy piksel obrazu po kolei, aby uzyskać ostateczny obraz.
Mówiąc najprościej, splot obrazu jest po prostu elementarnym pomnożeniem dwóch macierzy, po których następuje suma.
Możemy to po prostu zrozumieć na poniższym przykładzie.
Powyższe to jądro 3X3.
Mnożymy przez 1/25, aby znormalizować, czyli sumując do 1 zwiększaliśmy intensywność lub zmniejszaliśmy intensywność, jak w przypadku rozjaśniania lub przyciemniania obrazów.
Test Let to OpenCV zacieranie metoda filter2D, podane przez cv2.filter2D funkcyjnego (zdjęcie, -1, jądro)
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
# tworzenie macierzy jądra 3x3
kernel_3x3 = np.ones ((3,3), np.float32) / 9
# używamy cv2.filter2D do splatania jądra z obrazem
niewyraźne = cv2.filter2D (obraz, -1, kernel_3x3) cv2.imshow ('3x3_blurring', zamazane) cv2.waitKey (0)
# tworzenie macierzy jądra 7x7
kernel_7x7 = np.ones ((7,7), np.float32) / 49
# używamy cv2.filter2D do splatania jądra z obrazem
niewyraźne = cv2.filter2D (obraz, -1, kernel_7x7) cv2.imshow ('7x7_blurring', niewyraźne) cv2.waitKey (0) cv2.destroyAllWindows ()
Istnieją również inne rodzaje metod zamazywania:
cv2.blur - Średnia wartość w określonym oknie.
cv2.GaussianBlur - podobny, ale używa okna Gaussa (większy nacisk na punkty wokół środka).
cv2.medianBlur– używa mediany wszystkich elementów w oknie.
cv2.bilateralFilter– rozmywa przy zachowaniu ostrych krawędzi, zachowuje krawędzie i szczegóły linii.
Zobaczymy jeden po drugim poniżej, najpierw wyświetl oryginalny obraz za pomocą poniższego kodu:
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
cv2.blur:
W tej metodzie uśrednianie odbywa się poprzez splatanie obrazu znormalizowanym filtrem pudełkowym, który zajmuje miejsce pod prostokątem i zastępuje element centralny. Tutaj rozmiar pudełka musi być dziwny i pozytywny .
# cv2.blur rozmycie = cv2.blur (obraz, (3,3)) cv2.imshow ('Uśrednianie', rozmycie) cv2.waitKey (0)
cv2.GaussianBlur:
# cv2.GaussianBlur # zamiast filtru pudełkowego, wypróbujmy jądro Gaussa Gaussian = cv2.GaussianBlur (image, (7,7), 0) cv2.imshow ('Rozmycie gaussowskie', Gaussian) cv2.waitKey (0)
cv2.medianBlur:
Przyjmuje medianę wszystkich pikseli pod obszarem jądra, a element centralny jest zastępowany tą medianą.
# cv2.medianBlur # pobiera medianę wszystkich pikseli pod obszarem jądra, a element centralny # jest zastępowany tą medianą. mediana = cv2.medianBlur (zdjęcie, 5) cv2.imshow ('średnia rozmycie' mediana) cv2.waitKey (0)
cv2.bilateralFilter:
Dwustronne bardzo skutecznie usuwa hałas, zachowując ostre krawędzie
# cv2.bilateralFilter #Bilateral jest bardzo skuteczny w usuwaniu szumów, utrzymując ostre krawędzie dwustronne = cv2.bilateralFilter (obraz, 9,75,75) cv2.imshow ('dwustronne rozmycie', dwustronne) cv2.waitKey (0) cv2. zniszczAllWindows ()
Odszumianie obrazu - nielokalne oznacza Odszumianie
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
# parametr po None to moc filtra `` h '' (5-10 to dobry zakres) # następna to h dla składników koloru, ustaw ponownie taką samą wartość jak h
dst = cv2.fastNlMeansDenoisingColored (image, None, 6,6,7,21) cv2.imshow ('Fast oznacza denois', dst) cv2.waitKey (0) cv2.destroyAllWindows ()
Istnieją 4 odmiany nielokalnego sposobu odszumiania
cv2.fastNlMeansDenoising () - dla pojedynczego obrazu w skali szarości
cv2.fastNlMeansDenoisingColored () - obraz jednokolorowy
cv2.fastNlmeansDenoisingMulti () - dla sekwencji obrazów w skali szarości
cv2.fastNlmeansDenoisingcoloredMulti () - dla sekwencji obrazów w kolorze
3. Wyostrzanie - odwracanie rozmycia obrazu
Wyostrzanie jest przeciwieństwem rozmycia, wzmacnia lub uwydatnia krawędzie obrazu.
Jądro =,,
Nasza macierz jądra sumuje się do jednego, więc nie ma potrzeby normalizowania (tj. Mnożenia przez współczynnik do tej samej jasności co oryginał), jeśli jądro nie jest znormalizowane do 1, obraz byłby jaśniejszy lub ciemniejszy.
import cv2 import numpy as np image = cv2.imread ('elephant.jpg') cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
kernel_sharpening = np.array (,
])
# zastosowanie wyostrzającego jądra do obrazu wejściowego
sharpened = cv2.filter2D (image, -1, kernel_sharpening) cv2.imshow ('wyostrzony obraz', wyostrzony) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Threshoding (binaryzacja)
Progowanie to czynność przekształcania obrazu do postaci binarnej. W opencv istnieje oddzielna funkcja progowania zdefiniowana jako
Cv2.threshold (obraz, wartość progowa, wartość maksymalna, typ progu)
Istnieją następujące typy progów:
- cv2.THRESH_BINARY - najczęściej
- cv2. THRESH_BINARY_INV - najczęściej
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2. THRESH_TOZERO_INV
UWAGA: obraz musi zostać przekonwertowany na skalę szarości przed progowaniem
import cv2 import numpy as np # załaduj obraz jako obraz w skali szarości = cv2.imread ('gradient.jpg', 0) cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
# Wartość poniżej 127 przechodzi do 0 (czarny), a powyżej 127 przechodzi do 255 (biały)
_, thresh1 = cv2.threshold (obraz, 127,255, cv2.THRESH_BINARY) cv2.imshow ('1 próg', thresh1) cv2.waitKey (0)
# Wartość poniżej 127 idzie do 255, a wartości powyżej 127 do 0 (odwrotność powyższego)
_, thresh2 = cv2.threshold (obraz, 127,255, cv2.THRESH_BINARY_INV) cv2.imshow ('2 progi', thresh2) cv2.waitKey (0)
# wartości powyżej 127 są obcinane (utrzymywane) na poziomie 127, argument 255 jest nieużywany.
_, thresh3 = cv2.threshold (image, 127,255, cv2.THRESH_TRUNC) cv2.imshow ('3 thresh trunc', thresh3) cv2.waitKey (0)
# wartości poniżej 127 zmierza do 0, powyżej 127 pozostają niezmienione
_, thresh4 = cv2.threshold (obraz, 127,255, cv2.THRESH_TOZERO) cv2.imshow ('4 próg', thresh4) cv2.waitKey (0)
#Revesrse powyżej, poniżej 127 pozostaje bez zmian, powyżej 127 przechodzi do zera
_, thresh5 = cv2.threshold (image, 127,255, cv2.THRESH_TOZERO_INV) cv2.imshow ('5 próg', thresh5) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Dylatacja, erozja, otwieranie / zamykanie
Są to operacje z zakresu morfologii matematycznej
Dylatacja - dodaje piksele do granic obiektu na obrazku.
Erozja - usuwa piksele na granicach obiektu na obrazie.
Otwarcie - erozja, a następnie dylatacja.
Zamknięcie - dylatacja, po której następuje erozja.
Otwarcie jest bardzo pomocne w odszumianiu obrazów, ponieważ najpierw rozrzedza obraz przez erozję (usuwa szum), a następnie go rozszerza.
Zamieszanie z rozszerzaniem i erozją
Czasami występuje zamieszanie między dylatacją i erozją, zwykle na zdjęciach z białym tłem, ponieważ opencv traktuje białe tło jako obraz jako poszerzony lub zerodowany zamiast oryginalnego obrazu, więc w tym przypadku erozja działa jako dylatacja i odwrotnie, jak pokazano na próbce obrazu pokazane poniżej.
Pamiętaj, że dylatacja dodaje piksele do granic obiektów na obrazku, podczas gdy erozja usuwa piksele na granicach obiektów na obrazku
import cv2 import numpy as np image = cv2.imread ('imagecv.png', 0) cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
#Erosion
# zdefiniujmy rozmiar naszego jądra
jądro = np.ones ((5,5), np.uint8)
# teraz erodujemy obraz, tutaj iteracja nie dotyczy sytuacji, w których chcesz erodować obraz
erosion = cv2.erode (obraz, jądro, iteracje = 1) cv2.imshow ('Erozja', erozja) cv2.waitKey (0)
#rozszerzanie się
dilation = cv2.dilate (image, kernel, iterations = 1) cv2.imshow ('dilation', dilation) cv2.waitKey (0)
#opening, dobry do usuwania hałasu
otwarcie = cv2.morphologyEx (obraz, cv2.MORPH_OPEN, jądro) cv2.imshow ('otwarcie', otwarcie) cv2.waitKey (0)
#closing, dobre do usuwania szumów
zamknięcie = cv2.morphologyEx (obraz, cv2.MORPH_CLOSE, jądro) cv2.imshow ('zamknięcie', zamknięcie) cv2.waitKey (0) cv2.destroyAllWindows ()
6. Wykrywanie krawędzi i gradienty obrazu
Wykrywanie krawędzi jest bardzo ważnym obszarem w wizji komputerowej, szczególnie w przypadku konturów.
Krawędzie można zdefiniować jako granice obrazu, w rzeczywistości są to krawędzie, które definiują obiekt na obrazach, zachowują wiele informacji o obrazie.
Formalnie Krawędzie można zdefiniować jako nagłe zmiany (nieciągłości) w obrazie i mogą zakodować tyle informacji, ile pikseli.
Powyższy obraz pokazuje, w jaki sposób widzenie komputerowe identyfikuje i rozpoznaje obraz.
Algorytmy wykrywania krawędzi: - Istnieją trzy główne typy algorytmów wykrywania krawędzi
- Sobel - aby podkreślić obrazy pionowe lub poziome.
- Laplacian - optymalny ze względu na niski poziom błędów, dobrze zdefiniowane krawędzie i dokładną detekcję.
- Algorytm wykrywania Canny Edge (opracowany przez john.F.Canny w 1986 r.)
1. Stosuje rozmycie Gaussa
2. Znajduje gradient intensywności obrazu
3. stosuje nie-maksymalne tłumienie (tj. Usuwa piksele, które nie są krawędziami).
4. Histereza dotyczy progu (tj. Jeśli piksel znajduje się w górnym i dolnym progu, jest traktowany jako krawędź)
import cv2 import numpy as np image = cv2.imread ('input.jpg', 0) height, width = image.shape
#sobel
# wyciąganie krawędzi Sobela
sobel_x = cv2.Sobel (obraz, cv2.CV_64F, 0,1, ksize = 5) sobel_y = cv2.Sobel (obraz, cv2.CV_64F, 1,0, ksize = 5) cv2.imshow ('oryginał', obraz) cv2.waitKey (0) cv2.imshow ('sobelx', sobel_x) cv2.waitKey (0)
#Sobnie
cv2.imshow ('sobely', sobel_y) cv2.waitKey (0)
sobel_OR = cv2.bitwise_or (sobel_x, sobel_y) cv2.imshow ('sobelOR', sobel_OR) cv2.waitKey (0)
#laplaian
laplacian = cv2.Laplacian (image, cv2.CV_64F) cv2.imshow ('Laplacian', laplacian) cv2.waitKey (0)
#canny algorytm wykrywania krawędzi wykorzystuje wartości gradientu jako progi,
# w przypadku gdy musimy podać dwie wartości: próg1 i próg2 .
# każdy gradient większy niż próg 2 jest uważany za krawędź.
# każdy gradient większy niż próg 1 nie jest krawędzią.
#values pośrednie progu 1 i 2, są zarówno próg jako krawędź lub nie krawędzi
#on jak ich intensywności są połączone, w tym przypadku, każda wartość poniżej 60 są uważane
#non krawędzi wheareas dowolnej wartości powyżej 120 ° są uważane za krawędziami.
canny = cv2.Canny (image, 60,120) cv2.imshow ('canny', canny ) cv2.waitKey (0) cv2.destroyAllWindows ()
14. Perspektywa i transformacja afiniczna
Cofnijmy się o krok i przyjrzyjmy się przekształceniom afinicznym i nieafinicznym, oryginalny obraz pokazany poniżej jest wyraźnie obrazem nie-afinicznym, ponieważ krawędzie w pewnym momencie się spotkają, jednak możemy go wyprostować, wypaczając i przyjmując perspektywę przekształcać.
Do tej transformacji perspektywicznej potrzebujemy czterech współrzędnych oryginalnego obrazu, a następnie czterech punktów obrazu wyjściowego, które są oznaczone punktami_A i punktami_B. Najpierw za pomocą tych punktów obliczamy macierz transformacji, M za pomocą funkcji getPerspectiveTransform.
A następnie ta macierz jest przekazywana do funkcji warpPerspective w celu wygenerowania końcowego wyniku.
Teraz spróbujmy najpierw przekształcić perspektywę.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('paper.jpg') cv2.imshow ('oryginał', obraz) cv2.waitKey (0)
# współrzędna 4 rogów oryginalnego obrazu
points_A = np.float32 (,,,])
# współrzędne 4 rogów żądanego wydruku #
używamy proporcji papieru A4 1: 1,41
points_B = np.float32 (,,,])
# użyj dwóch zestawów dwóch punktów, aby obliczyć przewidywaną macierz transformacji, M
M = cv2.getPerspectiveTransform (points_A, points_B) warped = cv2.warpPerspective (image, M, (420,594)) cv2.imshow ('warppresprespective', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
Transformacja afiniczna jest łatwiejsza niż transformacja nie-afiniczna, ponieważ potrzebujemy tylko trzech punktów, aby uzyskać transformację. Cały proces przebiega tak samo, ale zamiast transformacji perspektywicznej mamy teraz transformację afiniczną, a także definiujemy kolumny i wiersze w warpAffine z funkcji shape, zamiast ręcznie je wprowadzać.
import cv2 import numpy as np import matplotlib.pyplot as plt image = cv2.imread ('box.jpg') rowery, cols = image.shape cv2.imshow ('original', image) cv2.waitKey (0)
# współrzędna 3 rogów oryginalnego obrazu
points_A = np.float32 (,,])
# współrzędne 3 rogów żądanego wydruku #
używamy proporcji papieru A4 1: 1,41
points_B = np.float32 (,,])
# użyj dwóch zestawów dwóch punktów do obliczenia macierzy afinicznej #
transformacji, M
M = cv2.getAffineTransform (points_A, points_B) warped = cv2.warpAffine (image, M, (cols, rows)) cv2.imshow ('warpaffine', warped) cv2.waitKey (0) cv2.destroyAllWindows ()
8. Aplikacja Live Sketch
Przede wszystkim pogratuluj sobie, że wykonałeś ten mini projekt po przeczytaniu wszystkich funkcji obróbki obrazu powyżej. Dlatego w tym mini projekcie Python OpenCV nauczymy się nowych koncepcji pętli i funkcji. Jeśli jesteś zaznajomiony z programowaniem, musisz mieć szersze pojęcie o tym, czym są funkcje i pętle. Jednak w Pythonie podstawowa koncepcja pętli i funkcji pozostaje taka sama, ale metoda ich definiowania nieco się zmienia.
Tak więc na początku tego programu możemy zobaczyć pewną grupę instrukcji pod nagłówkiem „ szkic def (obraz) ” : jest to formalna definicja funkcji grupa instrukcji pracujących razem dla określonego wyjścia.
Więc ten szkic jest funkcją, w Pythonie funkcja jest definiowana przez „def” i kończy się znakiem „:”. Również instrukcje, które muszą znajdować się wewnątrz funkcji lub można powiedzieć, które są wymagane, aby funkcja działała poprawnie, są automatycznie wyrównane z boku przez funkcję. Aby wyjść z funkcji, instrukcje musiały być całkowicie wyrównane do lewej. Aby uzyskać dalsze odniesienia, możesz odnieść się do Google na temat definicji funkcji w Pythonie.
Tak więc w tej funkcji szkicowania wprowadziliśmy kilka warstw przetwarzania obrazu, które łączą się razem, dając wynik. Najpierw obraz jest konwertowany na skalę szarości, aby opencv mógł go łatwo przetworzyć, a następnie do obrazu w skali szarości stosuje się rozmycie gaussowskie, aby zredukować szum. Następnie krawędzie są wyodrębniane za pomocą algorytmu wykrywania krawędzi canny'ego, a następnie odwrotność binarna jest stosowana na obrazie zdefiniowanym krawędzi, tutaj odwrotność binarna można również wykonać za pomocą bitwise_NOT, ale celowo wybraliśmy ten próg binarny odwrotny, ponieważ daje wolność ustawić jego parametry, aż uzyskamy wyraźny obraz.
Należy również zauważyć, że funkcja pobiera argumenty image i zwraca dwa argumenty ret i mask. Podczas gdy ret jest wartością logiczną, która mówi, że funkcja została uruchomiona pomyślnie lub nie, a maska jest końcowym wynikiem funkcji, tj. Przetworzonym obrazem.
Następnie drugą koncepcją jest obsługa kamery internetowej w opencv, która jest wykonywana przez funkcję cv2.VideoCapture (0) , która przechowuje obraz w obiekcie cap, który można odczytać za pomocą funkcji cap.read () , również tutaj, aby zanotować ten cap. read () znajduje się w nieskończonej pętli while, ponieważ stale musiał przechwytywać obrazy, aby nadać mu poczucie wideo na żywo, gdzie liczba klatek wideo byłaby liczbą klatek na sekundę kamery internetowej, która wynosi głównie od 24 do 60 fps.
cap.read () zwraca ret i frame, gdzie ret jest wartością logiczną wskazującą, że funkcja została pomyślnie uruchomiona lub nie, a ramka zawiera obraz wykonany przez kamerę internetową.
Poniżej znajduje się pełny kod Python OpenCV do uruchamiania Live Sketch
import cv2 import numpy as np #sketch generowanie funkcji def szkic (obraz): # konwertuj obraz do skali szarości img_gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # czyszczenie obrazu za pomocą rozmycia gaussowskiego img_gray_blur = cv2.Gausgray_blur, (5,5), 0) # wyodrębnij krawędzie canny_edges = cv2.Canny (img_gray_blur, 10,70) # wykonaj odwrócenie binarizuj obraz ret, mask = cv2.threshold (canny_edges, 70,255, cv2.THRESH_BINARY_INV) maska powrotu #inicjalizacja kamery internetowej, cap to obiekt dostarczony przez przechwytywanie wideo # zawiera wartość logiczną wskazującą, czy się powiodło (ret) #it zawiera również obrazy zebrane z kamery internetowej (ramka) cap = cv2.VideoCapture (0), podczas gdy True: ret, frame = cap.read () cv2.imshow ('livesketcher', sketch (frame)) if cv2.waitKey (1) == 13: # 13 to przerwa na klawisz Enter # zwolnij kamerę i zamknij okno, pamiętaj o zwolnieniu kamery internetowej za pomocą cap.release () cap.release () cv2.destroyAllWindows ()
To już koniec części 2 manipulacji obrazem w Python-OpenCV. Aby dobrze zrozumieć wizję komputerową i OpenCV, przejrzyj poprzednie artykuły (Pierwsze kroki z Python OpenCV i Manipulacje obrazami w Python OpenCV (Część 1)), a będziesz w stanie stworzyć coś fajnego dzięki Computer Vision.