- Otkrivanje predmeta pomoću SIFT-a
- Otkrivanje predmeta pomoću ORB-a
- Histogram orijentiranih gradijenata (HOG)
- Histogram orijentiranih gradijenata (HOG), korak po korak:
- HAAR-ovi kaskadni klasifikatori
- Otkrivanje lica i očiju
- Otkrivanje lica i očiju uživo
- Ugađanje kaskadnih klasifikatora
- Otkrivanje automobila i pješaka u video zapisima
Počeli smo s instaliranjem python OpenCV-a na Windows i do sada smo izvršili neke osnovne obrade slika, segmentaciju slika i otkrivanje objekata pomoću Pythona, koji su pokriveni u donjim vodičima:
- Početak rada s Python OpenCV: Instalacija i osnovna obrada slika
- Manipulacije slikama u Python OpenCV-u (1. dio)
- Manipulacije slikom u OpenCV-u (2. dio)
- Segmentacija slike pomoću OpenCV - Izdvajanje određenih područja slike
Također smo naučili o raznim metodama i algoritmima za otkrivanje objekata gdje su određene ključne točke identificirane za svaki objekt pomoću različitih algoritama. U ovom uputstvu koristit ćemo te algoritme za otkrivanje predmeta iz stvarnog života, ovdje bismo za otkrivanje koristili SIFT i ORB.
Otkrivanje predmeta pomoću SIFT-a
Ovdje će se otkrivanje objekata izvršiti pomoću streama web kamere uživo, pa ako prepozna objekt, spomenut će pronađeni objet. U kodu glavni dio igra funkcija koja se naziva SIFT detektor, većinu obrade obavlja ova funkcija.
A u drugoj polovici koda započinjemo s otvaranjem toka web kamere, a zatim učitavamo predložak slike, odnosno referentnu sliku, odnosno program zapravo gleda kroz tok web kamere.
Dalje, mi stalno hvatanje slike s web kameru potok uz pomoć beskonačnog dok petlje, a zatim hvatanje odgovarajuću visinu i širinu webcam okvira, a nakon toga definirati parametre regije interesa (ROI) box u kojem naš se objekt može uklopiti uzimajući odgovarajuću visinu i širinu okvira web kamere. A zatim crtamo pravokutnik iz parametara ROI-a koje smo prethodno definirali. Zatim napokon izrežite pravokutnik i unesite ga u SWIFT detektorski dio koda.
Sada SIFT detektor u osnovi ima dva ulaza, jedan je izrezana slika, a drugi je predložak slike koji smo prethodno definirali, a zatim nam daje neka podudaranja, tako da su podudaranja u osnovi broj objekata ili ključnih točaka koji su slični na obrezanoj slici i ciljna slika. Zatim definiramo vrijednost praga za podudaranja, ako je vrijednost podudaranja veća od praga, na naš zaslon stavljamo sliku koja se nalazi sa zelenom bojom ROI pravokutnika.
Sada se vratimo na glavni dio koda, funkciju koja se naziva SIFT detektor, uzima ulaz kao dvije slike jedna je slika na kojoj se traži objekt, a druga je objekt s kojim pokušavamo uskladiti do (predložak slike). Zatim sive skalirajte prvu sliku i definirajte predložak slike kao drugu sliku. Zatim stvorimo objekt SIFT detektora i pokrenimo OpenCV SIFT funkciju otkrivanja i izračunavanja, kako bi otkrili ključne točke i izračunali deskriptore, deskriptori su u osnovi vektori koji pohranjuju informacije o ključnim točkama, i to je zaista važno dok radimo podudaranje između deskriptora slika.
A onda definirajte podudaranje temeljeno na FLANN-u, ne ulazimo u matematičku teoriju podudaranja iza njega, ali o tome možete lako Google. Prvo definirajte indeks kdtree na nulu, a zatim postavljamo indeks i parametre pretraživanja u formatu rječnika, samo definiramo algoritam koji ćemo koristiti, a to je KDTREE, i broj stabala koja ćemo koristiti, više stabla koristimo što je složenije i sporije. A u parametru pretraživanja definirajte broj provjera, što je u osnovi broj podudaranja koje će dovršiti.
A zatim stvorite naš objekt podudaranja zasnovan na FLANN-u učitavanjem parametra koji smo prethodno definirali, a to su parametri indeksa i parametri pretraživanja, a na temelju toga stvorite naš podudarac zasnovan na FLANN-u, koji je KNN podudaranje gdje je KNN najbliži susjed, u osnovi to je način na koji tražimo najbliža podudaranja i deskriptore i vršimo podudaranje s inicijalizacijskom konstantom k. Sada ovo podudaranje temeljeno na FLANN-u vraća broj podudarnosti koje smo dobili.
Podudaranje na temelju FLANN-a samo je približna vrijednost, pa kako bismo povećali točnost podudaranja na temelju FLANN-a, provodimo test Lowe-ovog omjera i ono što čini je da traži podudaranja iz knn-a na osnovi flanna i definiramo neke matrične parametre koji su ovdje udaljenost, za koju je udaljenost numpy funkcija, a nakon što zadovolji kriterije, dodajte podudaranja u dobre podudaranja i vraća pronađena dobra podudaranja, tako da video prijenos uživo prikazuje broj pronađenih podudaranja u kutu zaslona.
Pogledajmo sada kod za gornji opis:
import cv2 import numpy as np def sift_detector (new_image, image_template): # Funkcija koja uspoređuje ulaznu sliku s predloškom # Zatim vraća broj SIFT podudaranja image1 = cv2.cvtColor (new_image, cv2.COLOR_BGR2GRAY) image2 = image_template # Create Objekt SIFT detektora #sift = cv2.SIFT () sift = cv2.xfeatures2d.SIFT_create () # Dobivanje ključnih točaka i deskriptora pomoću SIFT ključnih točaka_1, deskriptori_1 = sift.detectAndCompute (slika1, Nijedan) keypoints_2, descriptors_2 = sift.detete2 Nijedan) # Definirajte parametre za naš Flann Matcher FLANN_INDEX_KDTREE = 0 index_params = dict (algoritam = FLANN_INDEX_KDTREE, stabla = 3) search_params = dict (provjere = 100) # Stvorite objekt Flann Matcher flann = cv2.FlannBasedMatcher (index_params, search_params) # Dobivanje podudaranja pomoću K-Neighbor Neighbor Method # rezultat 'matchs' je broj sličnih podudaranja pronađenih u obje podudarnosti slika = flann.knnMatch (descriptors_1, descriptors_2, k = 2) # Pohranite dobra podudaranja koristeći Loweov omjer testa good_matches = za m, n u podudarnostima: ako je m.distance <0,7 * n.distance: good_matches.append (m) return len (good_matches) cap = cv2.VideoCapture (0) # Učitajte naš predložak slike, ovo je naša referentna slika image_template = cv2.imread ('phone.jpg', 0), dok je True: # Nabavite slike s web kamere ret, frame = cap.read () # Dobijte visinu i širinu visine okvira web kamere , width = frame.shape # Definirajte dimenzije okvira ROI top_left_x = int (width / 3) top_left_y = int ((height / 2) + (height / 4)) bottom_right_x = int ((width / 3) * 2) bottom_right_y = int ((height / 2) - (height / 4)) # Nacrtajte pravokutni prozor za našu regiju interesa cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), 255, 3) # Izrežite prozor promatranja koji smo definirali gore cropped = frame # Flip frame horizontally frame = cv2.flip (frame, 1) # Dobijte broj SIFT podudaranja = sift_detector (obrezano, image_template) # Prikaži statusni niz koji prikazuje trenutni br. podudaranja cv2.putText (frame, str (match), (450,450), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 1) # Naš prag za ukazivanje na otkrivanje objekta # Koristimo 10 jer SIFT detektor vraća malo lažnih položaja prag = 10 # Ako podudaranja premašuju naš prag, tada je otkriven objekt ako je podudaranja> prag: cv2.rectangle (okvir, (gornji_lijevi_x, gornji_lijevi_y), (donji_desni_x, donji_desni_y), (0,255,0), 3) cv2.putText (okvir, 'Objekt pronađen', (50,50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 2) cv2.imshow ('Detektor objekta pomoću SIFT-a, okvir) ako je cv2.waitKey (1) == 13: # 13 je Enter Key break cap.release () cv2.destroyAllWindows ()


Otkrivanje predmeta pomoću ORB-a
Otkrivanje objekata pomoću SIFT-a prilično je cool i precizno, jer generira puno točan broj podudaranja na temelju ključnih točaka, međutim njegovo je patentiranje i otežava njegovo korištenje u komercijalne aplikacije, drugi izlaz za to je ORB algoritam za otkrivanje predmeta.
Slično metodi otkrivanja objekata pomoću SIFT-a u kojoj smo program podijelili u dva dijela, ovdje će se slijediti isti.
Prvo, definiramo funkciju ORB_detector koja uzima dva ulaza jedan je slika prijenosa uživo koja dolazi s web kamere, a druga je predložak slike na temelju koje ćemo uskladiti našu sliku. Potom sivu sliku web kamere postavljamo u sivim tonovima, a zatim inicijaliziramo ORB detektor i postavljamo ga ovdje na 1000 ključnih točaka i parametre skaliranja od 1,2. možete se lako poigrati s tim parametrima, a zatim otkriti ključne točke (kp) i deskriptore (des) za slike, a drugi parametar koji definiramo u funkciji DiscoverANDCompute NIJE , traži upotrebu maske slike ili ne i mi to ovdje negiramo.
Zatim prijeđite na detektor već smo koristili podudaranje temeljeno na FLANN-u, ali ovdje ćemo koristiti BFMatcher, a unutar BFMatchera definiramo dva parametra, jedan je NORM_HAMMING, a drugi je crossCheck čija je vrijednost TRUE.
Zatim izračunajte podudaranja podudaranja između te dvije slike pomoću gore definiranih deskriptora, što u svemu vraća broj podudaranja, jer ta podudaranja nisu aproksimacija, pa stoga nije potrebno raditi Loweov omjerni test, umjesto toga sortiranja podudaramo na temelju udaljenosti, barem je udaljenost što je utakmica bolja (ovdje udaljenost znači udaljenost između točaka), a na kraju vraćamo broj podudarnosti pomoću funkcije dužine.
A u glavnoj smo funkciji postavili prag na puno veću vrijednost, jer detektor kugle generira mnogo buke.
Sada pogledajmo kod za otkrivanje na temelju ORB-a
import cv2 import numpy as np def ORB_detector (new_image, image_template): # Funkcija koja uspoređuje ulaznu sliku s predloškom # Zatim vraća broj ORB podudaranja image1 = cv2.cvtColor (new_image, cv2.COLOR_BGR2GREY) # Stvori ORB detektor pomoću 1000 ključnih točaka s faktorom piramide skaliranja od 1,2 orb = cv2.ORB_create (1000, 1.2) # Otkrivanje ključnih točaka izvorne slike (kp1, des1) = orb.detectAndCompute (image1, None) # Otkrivanje ključnih točaka rotirane slike (kp2, des2) = orb.detectAndCompute (image_template, None) # Stvori podudaranje # Imajte na umu da više ne koristimo podudaranje na osnovi Flannbf = cv2.BFMatcher (cv2.NORM_HAMMING, crossCheck = True) # Učinite podudaranje podudaranja = bf.match (des1, des2) # Razvrstajte podudaranja na temelju udaljenosti. Najmanja udaljenost # je bolja podudaranja = sortirano (podudaranja, ključ = lambda val: val.distance) return len (podudaranja) cap = cv2.VideoCapture (0) # Učitajte naš predložak slike, ovo je naša referentna slika image_template = cv2.imread ('phone.jpg', 0) # image_template = cv2.imread ('images / kitkat.jpg', 0) while True: # Nabavite slike web kamere ret, frame = cap.read () # Dobijte visinu i širinu visine okvira web kamere , width = frame.shape # Definirajte dimenzije okvira ROI (Imajte na umu da neke od ovih stvari trebaju biti izvan petlje) top_left_x = int (width / 3) top_left_y = int ((visina / 2) + (visina / 4)) bottom_right_x = int ((širina / 3) * 2) bottom_right_y = int ((visina / 2) - (visina / 4)) # Nacrtajte pravokutni prozor za naš područje interesa cv2.rectangle (frame, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), 255, 3) # Obrezani prozor promatranja koji smo definirali gore cropped = frame # Flip frame horizontal horizontal frame = cv2.flip (frame, 1) # Dohvati broj podudaranja ORB-a = ORB_detector (obrezano, image_template) # Prikaži statusni niz koji prikazuje trenutni br. podudaranja output_string = "Matches =" + str ( match) cv2.putText (frame, output_string, (50,450), cv2.FONT_HERSHEY_COMPLEX, 2, (250,0,150), 2) # Naš prag za ukazivanje na otkrivanje objekta # Za nove slike ili uvjete osvjetljenja možda ćete trebati malo eksperimentirati. # Napomena: ORB detektor za dobivanje prvih 1000 podudaranja, 350 je u osnovi min. 35% praga podudaranja = 250 # Ako podudaranja premašuju naše prag tada je otkriven objekt ako se podudara> prag: cv2.rectangle (okvir, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), (0,255,0), 3) cv2.putText (okvir, 'Objekt pronađen', (50, 50), cv2.FONT_HERSHEY_COMPLEX, 2, (0,255,0), 2) cv2.imshow ('Object Detector using ORB', frame) ako je cv2.waitKey (1) == 13: # 13 je Enter Break break cap.release () cv2.destroyAllWindows ()


Histogram orijentiranih gradijenata (HOG)
Sada razgovarajmo o drugom opisu koji je histogram orijentiranih gradijenata (HOG).
HOG-ovi su poprilično cool i korisni deskriptori i široko se i uspješno koriste za otkrivanje objekata, kao što se ranije vidjelo, deskriptori slike poput SIFT i ORB, gdje moramo izračunati ključne točke, a zatim iz tih ključnih točaka izračunati deskriptore, a HOG-ovi to rade različito. To predstavlja objekte kao jedan igrani vektora, za razliku od niza igranih vektora, gdje svaki predstavlja segment na slici. To znači da imamo jedinstvenu vektorsku značajku za cijelu sliku.
Izračunava se kliznim detektorom prozora preko slike, gdje se HOG deskriptor izračunava za svaku poziciju. A zatim se svaki položaj kombinira za jedan vektor obilježja.
Kao i SIFT, skala slike se podešava piramidiranjem.
Prije smo koristili podudaranja poput FLANN-a i BFMatcher-a, ali HOG-ovi to rade drugačije uz pomoć SVM (support vector machine) klasifikatora, gdje se svaki HOG deskriptor koji se izračuna šalje u SVM klasifikator kako bi utvrdio je li objekt pronađen ili nije.
Evo veze do velikog članka tvrtke Dalal & Triggs o korištenju HOG-ova za otkrivanje ljudi:
Histogram orijentiranih gradijenata (HOG), korak po korak:
Razumijevanje HOG-a moglo bi biti prilično složeno, ali ovdje ćemo se baviti samo teorijom HOG-a, a da ne ulazimo dublje u matematiku koja je s njim povezana.
Dakle, uzmimo ovu sliku, malo je pikselizirana, a na gornjem je uglu ovdje okvir od 8x8 piksela, pa u ovom okviru izračunavamo vektor gradijenta ili orijentacije ruba na svakom pikselu. Dakle, znači da u ovom okviru izračunavamo vektor gradijenta slike piksela unutar okvira (oni su neka vrsta smjera ili protoka samog intenziteta slike), a to generira 64 (8 x 8) vektora gradijenta koji su zatim predstavljeni kao histogram. Dakle, zamislite histogram koji predstavlja svaki vektor gradijenta. Dakle, ako su sve točke ili intenziteti ležali u jednom smjeru, histogram za taj smjer recimo 45 stupnjeva, histogram bi imao vrhunac na 45 stupnjeva.
Dakle, ono što sada radimo je da svaku ćeliju podijelimo u kutne kante, gdje svaka kanta odgovara smjeru gradijenta (npr. X, y). U radu Dalal i Triggs koristili su 9 kanti0-180 ° (po 20 ° svaka). Ovo učinkovito smanjuje 64 vektora na samo 9 vrijednosti. Stoga smo smanjili veličinu, ali zadržali sve ključne podatke koji su potrebni.


Sljedeći korak u izračunavanju svinja je normalizacija, normaliziramo gradijente kako bismo osigurali nepromjenjivost promjena osvjetljenja, tj. Svjetline i kontrasta.

Na ovoj su slici vrijednosti intenziteta prikazane u kvadratu prema odgovarajućem smjeru i sve imaju međusobnu razliku od 50
∆ H = 50, ∆ v = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707
Podijelimo vektore s gradijentnim veličinama i dobivamo 0,707 za sve, to je normalizacija.

Slično tome, ako promijenimo intenzitet ili promijenimo kontrast, dobit ćemo donje vrijednosti.
∆ H = 50, ∆ v = 50; │∆│ = √50 2 +50 = 70,72, 70,72 / 100 = 0,707; ∆ H = 100, ∆ v = 100; │∆│ = √100 2 +100 = 141,42, 141,42 / 100 = 1,41
Normalizacija se ne odvija na razini stanice, već se odvija na razini bloka, tako da su ovdje blokovi u osnovi skupina od 4 stanice, to uzima u obzir susjedne blokove pa se normalizira uzimajući u obzir veće segmente slike.

Pogledajmo sada kod
import numpy as np import cv2 import matplotlib.pyplot as plt # Učitaj sliku, a zatim sive slike = cv2.imread ('elephant.jpg') grey = cv2.cvtColor (slika, cv2.COLOR_BGR2GRAY) # Prikaži izvornu sliku cv2.imshow (' Ulazna slika ', slika) cv2.waitKey (0) #definiranje parametara, veličine ćelije i veličine bloka # hxw u pikselima size_size = (8, 8) # hxw u ćelijama block_size = (2, 2) # broj orijentacijskih spremnika nbins = 9 # Korištenje OpenCV-ovog HOG Descriptora # winSize je veličina slike izrezane u višekratnik veličine stanice hog = cv2.HOGDescriptor (_winSize = (siva.slika // veličina_ćelije * veličina_ćelije, grey.shape // cell_size * cell_size), _blockSize = (block_size * cell_size, block_size * cell_size), _blockStride = (cell_size, cell_size), _cellSize = (cell_size, cell_size), _nbins = nbins) # Stvorimo numpy oblik polja za stvaranje hog_features n_cells = (grey.shape // size_size, grey.shape // cell_size) # Prvo indeksiramo blokove po redovima. # hog_feats sada sadrži amplitude gradijenta za svaki smjer, # za svaku ćeliju svoje grupe za svaku skupinu. Indeksiranje se vrši po redovima, a zatim po stupcima. hog_feats = hog.compute (sivo).oblikovanje (n_ćelije - veličina_bloka + 1, n_ćelije - veličina_ bloka + 1, veličina_ bloka, veličina_bloka, nbins).transponiraj ((1, 0, 2, 3, 4)) # Stvorite našu matricu gradijenata s nbin dimenzijama za pohranu gradijentnih orijentacija gradients = np.zeros ((n_cells, n_cells, nbins)) # Stvorite niz dimenzija cell_count = np.full ((n_cells, n_cells, 1), 0, dtype = int) # Normalizacija bloka za off_y u rasponu (block_size): za off_x u rasponu (block_size): gradijenti - block_size + off_y + 1, off_x: n_cells - block_size + off_x + 1] + = \ hog_feats cell_count - block_size + off_y + 1, off_x: n_cells - block_size + off_x + 1] + = 1 # Prosječni gradijenti gradijenata / = count_count # Iscrtavanje HOG-ova pomoću Matplotlib-a # kut je 360 / nbins * smjer color_bins = 5 plt.pcolor (gradijenti) plt.gca (). invert_yaxis () plt.gca (). set_aspect ('jednako', podesivo = 'okvir') plt.colorbar () plt.show () cv2.destroyAllWindows ()


Slika prikazuje kako je ulazna slika predstavljena kao HOG prikaz.
HAAR-ovi kaskadni klasifikatori
Kao što je prethodno spomenuto, možemo izdvojiti značajke sa slike i koristiti ih za klasificiranje ili otkrivanje objekata.
Što su HAAR kaskadni klasifikatori?
Metoda otkrivanja objekata koja Haar-ove značajke unosi u niz klasifikatora (kaskada) za identificiranje objekata na slici. Oni su obučeni za prepoznavanje jedne vrste predmeta, međutim, možemo ih upotrijebiti nekoliko paralelno, npr. Otkrivanje očiju i lica zajedno.

Objašnjeni HAAR-ovi klasifikatori:
HAAR klasifikatori se obučavaju koristeći puno pozitivnih slika (tj. Slika s prisutnim objektom) i
negativnih slika (tj. Slika bez prisutnog predmeta).

Jednom kad imamo te slike, tada izdvajamo značajke pomoću kliznih prozora pravokutnih blokova. Te se značajke (HAAR značajke) vrednuju jednokratno i izračunavaju se oduzimanjem zbroja intenziteta piksela ispod bijelih pravokutnika od crnih pravokutnika.

Međutim, ovo je smiješan broj izračuna, čak i za osnovni prozor od 24 x 24 piksela (generirano 180 000 značajki).

Tako su istraživači osmislili metodu nazvanu Integral Images koja je to izračunala s četiri reference niza. Međutim, i dalje su imali 180.000 značajki i većina njih nije dodala stvarnu vrijednost.

Pojačanje je tada korišteno za određivanje najinformativnijih značajki, uz Freund & Schapire-ov AdaBoost i pronašao je najinformativnije značajke na slici. Pojačavanje je postupak kojim koristimo slabe klasifikatore za izgradnju jakih klasifikatora, jednostavno dodjeljivanjem težih ponderiranih kazni na pogrešnim klasifikacijama. Smanjenje 180 000 značajki na 6000, što je još uvijek prilično značajki.
U tih 6000 značajki neke će biti informativnije od drugih. Dakle, ako smo upotrijebili najinformativnije značajke kako bismo prvo provjerili može li regija potencijalno imati lice (lažni pozitivni rezultati neće biti velika stvar). Na taj način uklanja se potreba za izračunom svih 6000 značajki odjednom. Ovaj se koncept naziva Kaskada klasifikatora - za otkrivanje lica metoda Viole Jones koristila je 38 faza.

Otkrivanje lica i očiju
Dakle, nakon što steknemo neko teoretsko znanje o HAAR kaskadama, konačno ćemo ga implementirati, kako bismo stvari učinili prilično jasnima, dijelit ćemo lekcije po dijelovima, prvo bismo otkrili frontalno lice, a zatim bismo krenuli u otkrivanje frontalnog lica s očiju i konačno bismo napravili detekciju lica i očiju uživo putem web kamere.
Dakle, za ovo ćemo koristiti unaprijed obučene klasifikatore koje je OpenCV pružio kao.xml datoteke, xml je skraćenica za proširivi označni jezik, taj se jezik koristi za pohranu velike količine podataka, na njemu biste čak mogli i stvoriti bazu podataka.
Pristup ovim klasifikatorima možete imati na ovoj poveznici .

Prepoznavanje lica
Pokušajmo s frontalnim otkrivanjem lica, ovdje možete imati pristup kaskadi frontalnog detektora lica. Samo izvadite zip datoteku da biste dobili xml datoteku.
import numpy kao np import cv2 # Usmjerimo OpenCV-ovu funkciju CascadeClassifier na mjesto gdje je pohranjen naš # klasifikator (XML format datoteke), ne zaboravite zadržati kod i klasifikator u istoj mapi face_cascade = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') # Load naša slika ga zatim pretvori u sive slike = cv2.imread ('Trump.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) # Naš klasifikator vraća ROI detektiranog lica u obliku korpice # Sprema lijevo gore koordinata i dolje desno koordinate # vraća popis popisa koji su mjesto otkrivenih različitih lica. lica = face_cascade.detectMultiScale (siva, 1.3, 5) # Kada nije otkriveno nijedno lice, vraća se klasifikator lica i prazan tuple ako je lica (): print ("Nije pronađeno lice") # Prelazimo kroz niz lica i crtamo pravokutnik # preko svakog lica u licima za (x, y, w, h) u licima: cv2.rectangle (slika, (x, y), (x + w, y + h), (127,0,255), 2) cv2.imshow ('Otkrivanje lica', slika) cv2.waitKey (0) cv2.destroyAllWindows ()

Sad kombinirajmo otkrivanje lica i oka zajedno, u istoj zip datoteci možete imati pristup kaskadi detektora oka.
import numpy as np import cv2 face_classifier = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier ('haarcascade_eye.xml') img = cv2.imread ('Trump.jpg') v = Cov2.c cv2.COLOR_BGR2GRAY) face = face_classifier.detectMultiScale (siva, 1.3, 5) # Kada nije otkriveno nijedno lice, face_classifier se vraća i prazan skup ako je face (): print ("Nije pronađeno lice") za (x, y, w, h) u licima: cv2.rectangle (img, (x, y), (x + w, y + h), (127,0,255), 2) cv2.imshow ('img', img) roi_gray = grey roi_color = img eyes = eye_classifier.detectMultiScale (roi_gray) cv2.waitKey (0) za (ex, ey, ew, eh) u očima: cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (255,255,0), 2) cv2.imshow ('img', img) cv2.waitKey (0) cv2.destroyAllWindows () cv2.waitKey (0)

Dakle, ovo kod je isto koliko i da je broj za prepoznavanje lica, ali ovdje smo dodali očiju kaskadama i način kako ih otkriti, kao što možete vidjeti odabrali smo Sivi umanjena verzija lica kao parametar za detectMultiScale za očiju, što nas dovodi do smanjenja izračuna, jer ćemo oči otkriti samo u tom području.
Otkrivanje lica i očiju uživo
Dakle, do sada smo radili otkrivanje lica i očiju, ajmo sada implementirati isto s video prijenosom uživo s web kamere. U ovome ćemo napraviti isto otkrivanje lica i očiju, ali ovaj put ćemo to učiniti za prijenos uživo s web kamere. U većini aplikacije lice bi vam bilo istaknuto okvirom oko njega, ali ovdje smo učinili nešto drugačije da biste pronašli izrezano lice i prepoznavanje očiju samo u tome.
Dakle, ovdje uvozimo klasifikator lica i očiju i definirali smo funkciju za obavljanje svih obrada za otkrivanje lica i očiju. A nakon toga pokrenuo je tok web kamere i pozvao funkciju detektora lica za otkrivanje lica i očiju. Parametar koji definiramo u funkciji detektora lica su neprekidne slike iz web web streama
import cv2 import numpy as np face_classifier = cv2.CascadeClassifier ('haarcascade_frontalface_default.xml') eye_classifier = cv2.CascadeClassifier ('haarcascade_eye.xml') def face_detector (img, size = 0.5): # Pretvori sliku u cv u graca2.ca (img, cv2.COLOR_BGR2GRAY) lica = face_classifier.detectMultiScale (siva, 1.3, 5) ako je face (): vrati img za (x, y, w, h) u lica: x = x - 50 w = w + 50 y = y - 50 h = h + 50 cv2.pravokutnik (img, (x, y), (x + w, y + h), (255,0,0), 2) roi_gray = siva roi_color = img eyes = eye_classifier.detectMultiScale (roi_gray) za (ex, ey, ew, eh) u očima: cv2.rectangle (roi_color, (ex, ey), (ex + ew, ey + eh), (0,0,255), 2) roi_color = cv2.flip (roi_color, 1) return roi_color cap = cv2.VideoCapture (0) while True: ret, frame = cap.read () cv2.imshow ('Naš ekstraktor lica', face_detector (frame)) ako je cv2.waitKey (1) == 13: # 13 je Enter Key break cap.release () cv2.destroyAllWindows ()


Ugađanje kaskadnih klasifikatora
Parametri definirani unutar detectMultiScale, osim ulazne slike, imaju sljedeće značenje
našKlasifikator. detectMultiScale (ulazna slika, faktor skale, min. susjeda)
- Faktor skale Određuje koliko smanjujemo veličinu slike svaki put kada skaliramo. Npr. U prepoznavanju lica obično koristimo 1.3. To znači da smanjujemo sliku za 30% svaki put kad se smanji. Izračunavanje manjih vrijednosti, poput 1,05, trajat će duže, ali će povećati brzinu otkrivanja.
- Min Neighbours Navodi broj susjeda koji bi svaki potencijalni prozor trebao imati kako bi ga smatrao pozitivnim otkrivanjem. Tipično se postavlja između 3-6. Djeluje kao postavka osjetljivosti, male vrijednosti ponekad otkrivaju više lica na jednom licu. Visoke vrijednosti osigurat će manje lažnih pozitivnih rezultata, ali možda ćete propustiti neka lica.
Otkrivanje automobila i pješaka u video zapisima
Sada ćemo pješake i automobile otkriti u videozapisima pomoću HAAR kaskada, ali u slučaju da se nijedan video ne učitava i kôd se sastavlja bez pogreške, morate slijediti sljedeće korake:
Ako se nakon pokretanja koda ne učita video, možda ćete trebati kopirati naš opencv_ffmpeg.dl s adrese : opencv \ sources \ 3rdparty \ ffmpeg da biste ga zalijepili tamo gdje je instaliran vaš python, npr. C: \ Anaconda2
Nakon kopiranja morat ćete datoteku preimenovati prema verziji OpenCV-a koju koristite. Npr. Ako koristite OpenCV 2.4.13, a zatim datoteku preimenujte u: opencv_ffmpeg2413_64.dll ili opencv_ffmpeg2413.dll (ako ste pomoću X86 stroja) opencv_ffmpeg310_64.dll ili opencv_ffmpeg310.dll (ako koristite X86 stroj)
Da biste saznali gdje je instaliran python.exe, samo pokrenite ova dva retka koda, ispisat će mjesto na kojem je instaliran python.
uvoz sys ispisa (sys.executable)
Ako ste ove korake uspješno izveli, prijeđimo na kod za otkrivanje pješaka, Možete imati kaskadu za otkrivanje pješaka i iz zip datoteke koja je ovdje priložena.
import cv2 import numpy as np # Stvorite naš klasifikator tijela body_classifier = cv2.CascadeClassifier ('haarcascade_fullbody.xml') # Pokrenite snimanje videozapisa za video datoteku, ovdje koristimo video datoteku u kojoj će biti otkriveni pješaci cap = cv2.VideoCapture ('walking.avi') # Petlja nakon što se video uspješno učita dok je cap.isOpened (): # Čitanje svakog kadra video retka, frame = cap.read () # ovdje mijenjamo veličinu okvira na polovinu njegove veličine, radimo na ubrzavanju klasifikacije # jer veće slike imaju puno više prozora za klizanje, tako da u cjelini smanjujemo razlučivost # videozapisa na pola to je ono što označava 0,5, a koristimo i bržu metodu interpolacije koja je #interlinear frame = cv2.resize (frame, None, fx = 0,5, fy = 0,5, interpolation = cv2.INTER_LINEAR) grey = cv2. cvtColor (frame, cv2.COLOR_BGR2GRAY) # Proslijedite okvir tijelima našeg klasifikatora tijela = body_classifier.detectMultiScale (sivo, 1.2, 3) # Izdvojite granične okvire za bilo koja tijela identificirana za (x, y, w, h) u tijelima: cv2. pravokutnik (okvir, (x, y), (x + w, y + h), (0, 255, 255), 2) cv2.imshow ('Pješaci', okvir) ako je cv2.waitKey (1) == 13: # 13 je Enter Break break cap.release () cv2.destroyAllWindows ()
Nakon uspješnog otkrivanja pješaka u videozapisu, prijeđimo na kod za otkrivanje automobila, Odavde možete dobiti kaskadu za otkrivanje pješaka.
import cv2 import import import numpy as np # Stvorite naš klasifikator tijela car_classifier = cv2.CascadeClassifier ('haarcascade_car.xml') # Pokrenite snimanje videozapisa za video datoteku cap = cv2.VideoCapture ('cars.avi') # Loop nakon uspješnog videozapisa učitava se dok cap.isOpened (): time.sleep (.05) # Pročitajte prvi okvir ret, frame = cap.read () grey = cv2.cvtColor (frame, cv2.COLOR_BGR2GREY) # Proslijedite okvir u našu klasifikaciju automobila cars = car_classifier.detectMultiScale (siva, 1.4, 2) # Izdvojiti granične okvire za bilo koja tijela identificirana za (x, y, w, h) u automobilima: cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 255, 255), 2) cv2.imshow ('Automobili', okvir) ako je cv2.waitKey (1) == 13: # 13 je Enter Key break break cap.release () cv2.destroyAllWindows ()
Primijetili ste da smo dodali time.sleep (.05) , to je samo kašnjenje brzine kadra, tako da možete potvrditi da su svi automobili točno identificirani ili ga možete jednostavno ukloniti dodavanjem oznake komentara.
Ovaj se članak odnosi na Master Computer Vision ™ OpenCV4 u Pythonu s tečajem dubokog učenja na Udemyju, koji je stvorio Rajeev Ratan, pretplatite se da biste saznali više o Computer Visionu i Pythonu.
