Wykrywanie twarzy i ruchu za pomocą widzenia komputerowego

Wykrywanie twarzy i ruchu za pomocą widzenia komputerowego
OpenCV (Open Source Computer Vision Library) to moduł Python używany do wizji komputerowej. Jest to ogromny moduł o wyjątkowych możliwościach. Możemy robić wiele rzeczy z wizją komputerową, a niektóre z największych to rozpoznawanie twarzy i wykrywanie ruchu.

W tym samouczku nauczysz się pisać kod w celu wykrywania twarzy w obrazach, filmach i ruchu.

Aby uniknąć wszelkiego rodzaju błędów i problemów, pobieramy plik OpenCV z GitHub na stronie https: // github.com/openCV/openCV. Będziemy używać niektórych plików w celu wypełnienia kodu.

Wykrywanie twarzy za pomocą obrazów

W pliku Github OpenCV znajduje się sub-drektory (openCV-Master \ Samples \ Data), w których dostępne są przykładowe zdjęcia i filmy do pracy. Będziemy używać zdjęć i filmów znalezionych w tym katalogu. W szczególności będę używać leny.plik JPG. Skopiuję i wkleję go do mojego katalogu roboczego pycharm (w moim przypadku to c: \ Users \ nigdy \ pycharmprojects \ pyhonproject). Teraz zacznijmy wykrywać twarz na tym obrazku.

Najpierw załadujmy potrzebne moduły:

importować Numpy jako NP
Importuj CV2

Plik, którego będziemy używać, znajduje się w OpenCV-Master \ Data \ Haarcascades \ Haarcascade_frontalface_default.XML pliku pobranego z Github. Musimy umieścić link do pliku Haarcascade w następujący sposób:

Face_cascade = CV2.Cascadeclassifier ('C: \\ Users \\ Never \\ Downloads \\ opencv-master \\ data \\ haarcascades \\ haarcascade_frontalface_default.xml ')

Załaduj zdjęcie, aby wykonać wykrywanie twarzy za pomocą CV2.metoda IMRead ().

obraz = CV2.Imread („Lena.jpg ')

Naszym następnym celem jest przekształcenie zdjęcia w skalę szarościową. Ten ostatni odbywa się za pomocą CV2.metoda cvtcolor (). Ta metoda przyjmuje dwa argumenty. Pierwszym argumentem jest nazwa pliku, która zostanie przekonwertowana, a drugim argumentem jest format konwersji. W takim przypadku użyjemy CV2.Color_bgr2gray, aby przekonwertować go na format skali szarościowej.

Gray = CV2.cvtcolor (obraz, cv2.Color_bgr2gray)

Następnie używamy funkcji detectMultiscale () do wykrywania obiektów lub, w tym przypadku, twarzy. Tutaj powiemy Python Face_Cascade.detectMultiscale (), który wykryje twarze, ponieważ to właśnie w parametrze Face_Cascade. Funkcja detectMultiscale () bierze kilka argumentów, obraz, współczynnik skalowania, minimalną liczbę sąsiadów, flagi, minimalny rozmiar i maksymalny rozmiar.

Faces = Face_cascade.detectMultiscale (Gray, 1.5, 5)

Aby umieścić prostokątne pudełko wokół twarzy, musimy użyć CV2.Metoda prostokątów (). Korzystając z tej metody, musimy podać jej kilka argumentów. Pierwszym argumentem jest obraz, na którym chcesz, drugim argumentem jest punkt początkowy prostokąta, trzeci argument jest punktem końcowym prostokąta, czwartym argumentem jest kolor prostokąta, a piątym argumentem jest grubość grubości linia. W takim przypadku W jest szerokość, h jest na wysokość, a x i y są punktem wyjścia.

Dla (x, y, w, h) na twarzach:
CV2.prostokąt (obraz, (x, y), (x+w, y+h), (0,255,0), 3)

Na koniec pokazujemy obraz za pomocą CV2.Metoda ImShow (). Używamy również CV2.Waitkey (0), aby ustawić nieskończony czas oczekiwania i użyć CV2.Metoda niszczyjoLWindows () w celu zamykania okna.

CV2.Imshow („obraz”, obraz)
CV2.Waitkey (0)
CV2.DestroyallWindows ()

Wykrywanie twarzy za pomocą filmów/kamery internetowej

W takim przypadku będziemy wykrywać twarze w czasie rzeczywistym za pomocą kamery internetowej lub wideo. Po raz kolejny zaczynamy od zaimportowania wymaganych modułów.

importować Numpy jako NP
Importuj CV2

Następnie musimy określić lokalizację plików Haarcascade. Robimy to w następujący sposób (dokładnie jak dla obrazu):

Face_cascade = CV2.Cascadeclassifier ('C: \\ Users \\ Never \\ Downloads \\ opencv-master \\ data \\ haarcascades \\ haarcascade_frontalface_default.xml ')

Teraz musimy określić wideo, z którym chcemy sobie poradzić za pomocą CV2.Metoda VideOcapture (). W moim przypadku postanowiłem poradzić sobie z filmem, który miałem i wprowadziłem nazwę filmu. Jeśli chcesz poradzić sobie z kamerami internetowymi, umieściłbyś 0 zamiast nazwy pliku wideo.

wideo = CV2.Videokapture („Wideo.MP4 ")

Następnie zaczynamy pętlę. PRAWDA, prosimy program o wykrycie twarzy, dopóki nie zatrzymamy się. Po pierwsze, czytamy plik wideo za pomocą funkcji Read ().

Choć prawda:
ret, obraz = wideo.Czytać()

Podobnie jak w poprzedniej sekcji, musimy przekształcić obrazy lub ramki w skalę szarościową, aby ułatwić wykrycie. Używamy CV2.Metoda CVTCOLOR () zmiany ramek na szary.

Gray = CV2.cvtcolor (obraz, cv2.Color_bgr2gray)

Aby wykryć twarze, używamy funkcji detectMultiscale (). Po raz kolejny wymaga tych samych parametrów jak w poprzedniej sekcji.

Faces = Face_cascade.detectMultiscale (Gray, 1.1, 4)

Aby umieścić prostokąty wokół twarzy, używamy CV2.Metoda prostokątów (). Jest to podobne do poprzedniej sekcji.

Dla (x, y, w, h) na twarzach:
CV2.prostokąt (obraz, (x, y), (x+w, y+h), (255, 0, 0), 2)

Następnie pokazujemy ramki za pomocą CV2.Metoda ImShow (). Ta metoda przyjmuje dwa argumenty, pierwsza to nazwa ramki, a druga to ramka do wyświetlenia.

CV2.Imshow („obraz”, obraz)

Następnie umieszczamy klauzulę, jeśli użytkownik naciśnie klawisz ESC (lub 27), wówczas kod wyjdzie z pętli.

Jeśli CV2.Waitkey (0) i 0xff == 27:
przerwa

Wreszcie, wypuszczamy wideo za pomocą funkcji wydania ().

wideo.uwolnienie()

Detekcja ruchu

Wykrywanie ruchu jest świetne! Oznacza to, że dzięki Pythonowi i dobrej kamerze internetowej możemy stworzyć własną kamerę bezpieczeństwa! Więc zacznijmy.

importować Numpy jako NP
Importuj CV2

Będę wybrać wideo z próbek (OpenCV-Master \ Scars \ Data) z pliku Github.

wideo = CV2.Videokapture („VTEST.avi ”)

W celu wykrycia ruchu, na czym polegamy w zasadzie różnica w wartościach pikseli dwóch obrazów, obrazu odniesienia i drugiego obrazu lub ramki. Tak więc tworzymy dwa obrazy, ramkę1 i ramkę2.

ret, frame1 = wideo.Czytać()
ret, frame2 = wideo.Czytać()

Gdy wideo jest otwarte lub używa funkcji ISOPED (), rozpoczynamy pętlę.

podczas wideo.jest otwarty():

Najpierw obliczamy bezwzględną różnicę między ramką1 i ramką2 za pomocą CV2.Metoda absdiff (). Oczywiście wymaga dwóch argumentów, pierwszej i drugiej ramki.

Różnica = CV2.Absdiff (ramka 1, ramka2)

Ponieważ rzeczy są łatwiejsze w czerni i bieli, zmienimy różnicę w skalę szarości za pomocą CV2.metoda cvtcolor (). CV2.Metoda cvtcolor () przyjmuje dwa argumenty, pierwszy to ramka lub obraz, a druga to transformacja. W takim przypadku użyjemy CV2.Color_bgr2gray.

Gray = CV2.cvtcolor (różnica, cv2.Color_bgr2gray)

Gdy obraz jest w skali szarości, musimy następnie zatrzeć obraz, aby usunąć szum za pomocą CV2.Metoda Gaussianblur (). CV2.Metoda Gaussianblur () bierze kilka argumentów-obraz źródłowy do zamazania, obraz wyjściowy, rozmiar jądra Gaussa, odchylenie standardowe jądra wzdłuż osi X, odchylenie standardowe jądra wzdłuż osi Y i typu granicznego i typu granicznego.

Blur = CV2.Gaussianblur (Gray, (5,5), 0)

Następnie umieszczamy wartość progową za pomocą CV2.Metoda progowa (). Ta technika wyizoluje ruch, podzielając na segmenty tło i plan (lub ruch). CV2.Metoda progowa () przyjmuje cztery argumenty: obraz, wartość progowa, maksymalna wartość do użycia z thresh_binary i thresh_binary_inv oraz typem progowym.

_, próg = cv2.próg (Blur, 20, 255, CV2.Thresh_binary)

Następnie rozszerzamy się za pomocą CV2.Metoda rozszerzona (), która maksymalnie przyjmuje 6 argumentów: obraz, jądro, kotwica, iteracje, typ graniczny i wartość graniczna.

rozszerzenie = CV2.rozszerz (próg, brak, iteracje = 3)

CV2.Metoda FindContours () robi dokładnie to, co oznacza, znajduje kontury. Wymaga trzech argumentów: obraz źródłowy, tryb pobierania i metoda przybliżenia konturu.

Contour, _ = cv2.FindContours (Dilate, CV2.Retr_tree, v2.Chain_Approx_Simple)

CV2.metoda drawcontours () służy do rysowania konturów. Wymaga kilku argumentów: obraz, kontury, contouridx (ta wartość jest ujemna, jeśli wszystkie kontury są narysowane), kolor, grubość, typ linii, hierarchia, maksymalny poziom i przesunięcie.

CV2.Drawcontours (ramka 1, kontur, -1, (0, 0, 255), 2)

W końcu pokazujemy obraz za pomocą CV2.Metoda ImShow ().

CV2.IMSHOW („Image”, Frame1)

Teraz ustawiamy początkową ramkę 2 jako pierwszą ramkę i czytamy wideo dla nowej ramki, którą umieszczamy w parametrze Frame2.

Frame1 = ramka2
ret, frame2 = wideo.Czytać()

Jeśli naciśnięty jest klawisz „Q”, wyjdź z pętli:

Jeśli CV2.Waitkey (40) == Ord („Q '):
przerwa
wideo.uwolnienie()

Kod jako całość do wykrywania ruchu wyglądałby mniej więcej tak:

importować Numpy jako NP
Importuj CV2
wideo = CV2.Videokapture („VTEST.avi ”)
ret, frame1 = wideo.Czytać()
ret, frame2 = wideo.Czytać()
podczas wideo.jest otwarty():
Różnica = CV2.Absdiff (ramka 1, ramka2)
Gray = CV2.cvtcolor (różnica, cv2.Color_bgr2gray)
Blur = CV2.Gaussianblur (Gray, (5,5), 0)
_, próg = cv2.próg (Blur, 20, 255, CV2.Thresh_binary)
rozszerzenie = CV2.rozszerz (próg, brak, iteracje = 3)
Contour, _ = cv2.FindContours (Dilate, CV2.Retr_tree, CV2.Chain_Approx_Simple)
CV2.Drawcontours (ramka 1, kontur, -1, (0, 0, 255), 2)
CV2.IMSHOW („Image”, Frame1)
Frame1 = ramka2
ret, frame2 = wideo.Czytać()
Jeśli CV2.Waitkey (40) == Ord („Q '):
przerwa
wideo.uwolnienie()

To po prostu takie proste! Kilka wierszy kodu i możemy stworzyć własne programy rozpoznawania twarzy i wykrywania ruchu. Kilka dodatkowych wierszy, a nawet możemy zmusić ich do rozmowy (powiedzmy za pomocą PTTSX3) i stworzyć własne kamery bezpieczeństwa!

Szczęśliwe kodowanie!