otkrivanje opencv objekta. OpenCV. Alat za "prosvjetljenje" stroja. Usklađivanje uzorka
Knjižnica za računalni vid i strojno učenje otvorenog koda. Uključuje više od 2500 algoritama, koji uključuju klasične i moderne algoritme za računalni vid i strojno učenje. Ova biblioteka ima sučelja na raznim jezicima, uključujući Python (koristimo ga u ovom članku), Java, C++ i Matlab.
Montaža
Možete vidjeti upute za instalaciju za Windows, a za Linux -.
Uvezite i pogledajte sliku
import cv2 slike = cv2.imread("./path/to/image.extension") cv2.imshow("Slika", slika) cv2.waitKey(0) cv2.destroyAllWindows()Napomena Kada čitate na gornji način, slika je u prostoru boja, a ne RGB (kao što su svi navikli), već BGR. Možda u početku nije toliko važno, ali kada počnete raditi s bojom, vrijedi znati za ovu značajku. Postoje 2 rješenja:
- Zamijenite 1. kanal (R - crveno) s 3. kanalom (B - plavo), a tada će crveno biti (0,0,255), a ne (255,0,0) .
- Promjena prostora boja u RGB: rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
Zatim u kodu ne radite više sa slikom, nego sa rgb_image.
Napomena Za zatvaranje prozora koji prikazuje sliku pritisnite bilo koju tipku. Ako koristite gumb za zatvaranje prozora, možete naići na smrzavanje.
U cijelom članku koristit će se sljedeći kod za prikaz slika:
Import cv2 def viewImage(image, name_of_window): cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL) cv2.imshow(name_of_window, image) cv2.waitKey(0) cv2.destroyAllWindows()
kadriranje
Pas nakon podrezivanja
Import cv2 cropped = image viewImage(cropped, "Cropped dog")
Gdje je slika slika.
Promjena veličine
Nakon promjene veličine za 20%
Import cv2 scale_percent = 20 # Postotak originalne veličine width = int(img.shape * scale_percent / 100) height = int(img.shape * scale_percent / 100) dim = (širina, visina) resized = cv2.resize(img, dim , interpolacija = cv2.INTER_AREA) viewImage(promijenjena veličina, "Nakon promjene veličine za 20%")
Ova funkcija uzima u obzir omjer slike izvorne slike. Pogledajte druge značajke promjene veličine slike.
Skretanje
Pas nakon okretanja za 180 stupnjeva
Import cv2 (h, w, d) = image.shape center = (w // 2, h // 2) M = cv2.getRotationMatrix2D(center, 180, 1.0) rotated = cv2.warpAffine(image, M, (w) , h)) viewImage(rotated, "Pas rotiran za 180 stupnjeva")
image.shape vraća visinu, širinu i kanale. M - rotacijska matrica - rotira sliku za 180 stupnjeva oko središta. -ve je kut rotacije slike u smjeru kazaljke na satu, a +ve u suprotnom smjeru.
Prijevod u sivim tonovima iu crno-bijeloj slici prema pragu
Pas u sivim tonovima
Crno-bijeli pas
Uvezi cv2 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ret, threshold_image = cv2.threshold(im, 127, 255, 0) viewImage(gray_image, "Pas u nijansama sive") viewImage(threshold_image, "Crno-bijeli pas ")
gray_image je jednokanalna verzija slike.
Funkcija praga vraća sliku sa svim pikselima tamnijim (manjim od) 127 zamijenjenim s 0 i svim svjetlijim (većim od) 127 zamijenjenim s 255.
Radi jasnoće, još jedan primjer:
Ret, prag = cv2.threshold(im, 150, 200, 10)
Ovdje je sve što je tamnije od 150 zamijenjeno sa 10, a sve što je svjetlije zamijenjeno je sa 200.
Opisane su ostale funkcije praga.
Zamućenje/glatko
Zamagljen pas
Uvezi cv2 blurred = cv2.GaussianBlur(image, (51, 51), 0) viewImage(blurred, "Blurred dog")
Funkcija GaussianBlur (Gaussian blur) ima 3 parametra:
- Izvorna slika.
- Torka od 2 pozitivna neparna broja. Što je veći broj, to je veća snaga zaglađivanja.
- sigmaX i sigmaY. Ako se ti parametri ostave jednaki 0, tada će se njihova vrijednost automatski izračunati.
Crtanje pravokutnika
Ocrtajte njušku psa pravokutnikom
Uvezi cv2 izlaz = image.copy() cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10) viewImage(output, "Pravokutnik lica psa")
Ova funkcija ima 5 parametara:
- Sama slika.
- Koordinata gornjeg lijevog kuta (x1, y1) .
- Koordinata donjeg desnog kuta (x2, y2) .
- Boja pravokutnika (GBR/RGB ovisno o odabranom modelu boja).
- Širina linije pravokutnika.
linijski crtež
2 psa odvojena linijom
Import cv2 output = image.copy() cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5) viewImage(output, "2 psa odvojena linijom")
Linijska funkcija ima 5 parametara:
- Sama slika na kojoj je nacrtana crta.
- Koordinata prve točke (x1, y1) .
- Koordinata druge točke (x2, y2) .
- Boja linije (GBR/RGB ovisno o odabranom modelu boja).
- Debljina linije.
Tekst na slici
Slika s tekstom
Import cv2 output = image.copy() cv2.putText(output, "Mi<3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "Изображение с текстом")
Funkcija putText ima 7 parametara:
- Slika izravno.
- Tekst za sliku.
- Koordinata donjeg lijevog kuta početka teksta (x, y) .
- Obrađena slika u sivim tonovima.
- Parametar scaleFactor. Neka lica mogu biti veća od drugih jer su bliža od drugih. Ova postavka kompenzira perspektivu.
- Algoritam za prepoznavanje koristi klizni prozor tijekom prepoznavanja objekta. Parametar minNeighbors određuje broj objekata oko lica. Odnosno, što je veća vrijednost ovog parametra, algoritam treba više sličnih objekata da odredi trenutni objekt kao lice. Premala vrijednost će povećati broj lažno pozitivnih rezultata, dok će prevelika vrijednost učiniti algoritam zahtjevnijim.
- minSize - izravno veličina ovih područja.
Pronađene osobe: 2
Import cv2 image_path = "./path/to/photo.extension" face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml") image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade .detectMultiScale(gray, scaleFactor= 1.1, minNeighbors= 5, minSize=(10, 10)) faces_detected = "Otkrivena lica: " + format(len(faces)) print(faces_detected) # Crtanje kvadrata oko lica za (x, y) , w, h) u licima: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2) viewImage(image,faces_detected)
detectMultiScale je generička funkcija za prepoznavanje lica i predmeta. Kako bi funkcija tražila točno lica, prosljeđujemo joj odgovarajuću kaskadu.
Funkcija detectMultiScale ima 4 parametra:
Konture - prepoznavanje predmeta
Prepoznavanje objekata izvodi se pomoću segmentacije slike u boji. Za to postoje dvije funkcije: cv2.findContours i cv2.drawContours.
Ovaj članak opisuje otkrivanje objekata pomoću segmentacije boja. Sve što trebate za nju je tu.
Spremanje slike
import cv2 slike = cv2.imread("./import/path.extension") cv2.imwrite("./export/path.extension", slika)Zaključak
OpenCV je izvrsna biblioteka s laganim algoritmima koji se mogu koristiti u 3D renderiranju, naprednom uređivanju slika i videa, praćenju i identificiranju objekata i ljudi u videu, pronalaženju identičnih slika iz skupa i još mnogo, mnogo više.
Ova je biblioteka vrlo važna za one koji razvijaju projekte vezane uz strojno učenje u području slika.
Pa, u biti morate otkriti krugovi. Jeste li vidjeli cvHoughCircles()? Smijete li ga koristiti?
Ova stranica ima neke dobre informacije o tome kako otkriti stvari pomoću OpenCV-a. Možda će vas zanimati odjeljak 2.5.
Ovo je mali demo koji sam upravo napisao kako bih otkrio novčiće na ovoj slici. Nadam se da možete iskoristiti dio koda u svoju korist.
Ulaz :
izlazi :
// kompilirano s: g++ circles.cpp -o circles `pkg-config --cflags --libs opencv` #include
Otkrivanje krugova uvelike ovisi o parametrima cvHoughCircles(). Imajte na umu da sam također koristio Canny u ovom demou.
Moram kodirati detektor predmeta (u ovom slučaju loptu) koristeći OpenCV. Problem je što mi svaka google pretraga vrati nešto s DETEKCIJOM LICA. Dakle, trebam pomoć gdje početi, što koristiti itd.
Neke informacije:
- Lopta nema fiksnu boju, vjerojatno će biti bijela, ali može se promijeniti.
- Moram koristiti strojno učenje, ne nužno biti složen i robustan, KNN-ov prijedlog (lakše je i jednostavnije).
- Nakon svog pretraživanja otkrio sam da izračunavanje uzorka histograma samo za lopte i njegovo treniranje s ML-om može biti od pomoći, ali moja glavna briga ovdje je da se veličina lopte može i mijenja (bliže i dalje od kamere) i ja nemam pojma koji prolaz ML klasificirati za mene, mislim.. Ne mogu (ili mogu?) samo testirati svaki piksel slike za svaku moguću veličinu (od recimo 5x5 do ŠxV) i nadam se da ću pronaći pozitivan rezultat.
- Može postojati neravna pozadina, poput ljudi, tkanine iza lopte itd.
- Kao što sam rekao, moram koristiti ML algoritam, što znači da nema Haar ili Viola algoritama.
Također, razmišljao sam o korištenju kontura za pronalaženje krugova na slici koju je izradio Canny, samo trebam pronaći način da pretvorim konturu u niz podataka za KNN obuku.
Dakle... prijedlozi?
Hvala unaprijed. ;)
U ovom ćete članku naučiti kako izraditi Python skriptu za brojanje knjiga na slici pomoću OpenCV-a.
Što nam je činiti?
Pogledajmo sliku na kojoj ćemo tražiti knjige:
Vidimo da su na slici četiri knjige, kao i smetnje kao što su šalica za kavu, Starbucks šalica, magneti i komadić slatkiša.
Naš cilj je pronaći četiri knjige na slici bez identificiranja bilo koje druge stavke kao knjige.
Koje knjižnice trebamo?
Da bismo napisali sustav za pretraživanje i otkrivanje knjiga u slikama, koristit ćemo OpenCV za računalni vid i obradu slika. Također moramo instalirati NumPy da OpenCV radi ispravno. Provjerite imate li ove biblioteke instalirane!
Pronalaženje knjiga u slikama pomoću Pythona i OpenCV-a
Bilješka. prev. Možda ćete primijetiti da se izvorni kod u našem članku razlikuje od koda u izvorniku. Autor je vjerojatno koristio instalaciju potrebnih biblioteka kroz repozitorije. Predlažemo korištenje pipa što je puno lakše. Kako biste izbjegli pogreške, preporučujemo upotrebu verzije koda navedenog u našem članku.
Otvorite svoj omiljeni uređivač koda, izradite novu datoteku pod nazivom find_books.py i počnimo:
# -*- kodiranje: utf-8 -*- # import potrebnih paketa import numpy as np import cv2 # učitaj sliku, promijeni boju u sive nijanse i smanji oštrinu image = cv2.imread("example.jpg") gray = cv2. cvtColor (slika, cv2.COLOR_BGR2GRAY) siva = cv2.GaussianBlur(siva, (3, 3), 0) cv2.imwrite("siva.jpg", siva)
Počnimo s uvozom OpenCV biblioteke. Učitavanje slike s diska obavlja funkcija cv2.imread. Ovdje ga samo učitavamo s diska i zatim pretvaramo raspon boja iz RGB u sive tonove.
Također malo zamućujemo sliku kako bismo smanjili visokofrekventni šum i poboljšali točnost naše aplikacije. Nakon izvršavanja koda, slika bi trebala izgledati ovako:
Učitali smo sliku s diska, pretvorili je u sive tonove i malo zamutili.
Sada definirajmo rubove (tj. obrise) objekata na slici:
# otkrivanje rubova edged = cv2.Canny(gray, 10, 250) cv2.imwrite("edged.jpg", edged)
Sada naša slika izgleda ovako:
Pronašli smo obrise objekata na slikama. Međutim, kao što vidite, neke staze nisu zatvorene - postoje praznine između staza. Da bismo uklonili praznine između bijelih piksela slike, primijenit ćemo operaciju "zatvori":
# kreirajte i primijenite jezgru zatvaranja = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) close = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel) cv2.imwrite("closed.jpg", zatvoreno)
Sada su praznine u konturama zatvorene:
Sljedeći korak je stvarno otkrivanje kontura objekata na slici. Za ovo ćemo koristiti funkciju cv2.findContours:
# pronađite konture na slici i prebrojite broj knjiga cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ukupno = 0
Razmotrimo geometriju knjige.
Knjiga je pravokutnik. Pravokutnik ima četiri vrha. Stoga, ako ispitamo stazu i ustanovimo da ima četiri vrha, tada možemo pretpostaviti da je ovo knjiga, a ne neki drugi objekt na slici.
Da bismo provjerili je li staza knjiga ili ne, moramo proći kroz svaku stazu:
# petlja preko kontura za c u cnts: # aproksimacija (glatka) konture peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0,02 * peri, True) # ako kontura ima 4 vrha, pretpostavljamo da je ova knjiga ako je len(približno) == 4: cv2.drawContours(image, , -1, (0, 255, 0), 4) ukupno += 1
Za svaku od kontura, izračunavamo opseg koristeći cv2.arcLength i zatim aproksimiramo (glatkamo) konturu pomoću cv2.approxPolyDP.
Razlog zašto aproksimiramo konturu je taj što ona možda nije savršeni pravokutnik. Zbog šuma i sjena na fotografiji male su šanse da će knjiga imati točno 4 vrha. Aproksimacijom konture rješavamo ovaj problem.
Na kraju provjeravamo ima li kontura koju aproksimiramo zapravo četiri vrha. Ako je tako, crtamo obris oko knjige, a zatim povećavamo brojač za ukupan broj knjiga.
Dovršimo ovaj primjer prikazivanjem nastale slike i broja pronađenih knjiga:
# pokaži rezultirajuću sliku print("Pronašao sam (0) knjiga na ovoj slici". format(total) cv2.imwrite("output.jpg", image))
U ovoj fazi naša će slika izgledati ovako:
Sumirati
U ovom ste članku naučili kako pronaći knjige na slikama koristeći jednostavnu obradu slika i tehnike računalnog vida s Pythonom i OpenCV-om.
Naš pristup je bio:
- Učitajte sliku s diska i pretvorite je u sive nijanse.
- Malo zamutite sliku.
- Primijenite detektor rubova Canny za otkrivanje objekata na slici.
- Zatvorite sve praznine u konturama.
- Pronađite konture predmeta na slici.
- Primijenite prilagođavanje konture kako biste utvrdili je li kontura bila pravokutnik, a time i knjiga.
Možete preuzeti izvorni kod skripte i sliku korištenu u ovom članku.
Kod rješavanja problema računalnog vida ne može se bez upotrebe specijaliziranog softvera. Želim vam predstaviti ovo - OpenCV - knjižnicu otvorenog koda u C++. Ima set alata za digitalizaciju slika, daljnju obradu pomoću numeričkih algoritama ili neuronske mreže.
Osnovni algoritmi za obradu slike: interpretacija slike, kalibracija kamere prema referenci, uklanjanje optičkih izobličenja, detekcija sličnosti, analiza kretanja objekta, detekcija oblika objekta i praćenje objekta, 3D rekonstrukcija, segmentacija objekta, prepoznavanje gesta.
Biblioteku možete preuzeti na službenoj stranici http://sourceforge.net/projects/opencvlibrary/
Struktura OpenCV biblioteke
cxcore - jezgra
* sadrži osnovne strukture podataka i algoritme:
- osnovne operacije na višedimenzionalnim numeričkim nizovima
- matrična algebra, matematičke funkcije, generatori slučajnih brojeva
- Pisanje/vraćanje struktura podataka u/iz XML-a
- osnovne funkcije 2D grafike
CV - Modul za slikovni i računalni vid
- osnovne operacije na slikama (filtriranje, geometrijske transformacije, konverzija prostora boja, itd.)
- analiza slike (odabir razlikovnih obilježja, morfologija, traženje kontura, histogrami)
- analiza pokreta, praćenje objekata
- otkrivanje objekata, posebno lica
- kalibracija kamere, elementi obnove prostorne strukture
Highgui - modul za unos / izlaz slika i videa, stvaranje korisničkog sučelja
- snimanje videa s kamera i video datoteka, čitanje/pisanje statičnih slika.
- funkcije za organiziranje jednostavnog korisničkog sučelja (sve demo aplikacije koriste HighGUI)
Cvaux - eksperimentalne i zastarjele značajke
- razmaci. vid: stereo kalibracija, samokalibracija
- pretraživanje stereo podudaranja, klikovi u grafikonima
- pronalaženje i opisivanje crta lica
CvCam - video snimanje
- omogućuje vam snimanje videa s digitalnih video kamera (podrška je ukinuta i ovaj modul nije dostupan u najnovijim verzijama)
Instalacija OpenCV-a pod Linuxom
Nakon preuzimanja najnovije verzije OpenCV-a s web-mjesta programera http://sourceforge.net/projects/opencvlibrary/, trebate raspakirati arhivu i izgraditi je pomoću CMake verzije 2.6 ili novije.
Instalacija CMake-a je standardna:
sudo apt-get instalirajte cmake
Za prikaz OpenCV prozora morat ćete instalirati biblioteke GTK + 2.x i libgtk2.0-dev
apt-get instaliraj libgtk2.0-dev
Izgradnja knjižnice:
Tar -xjf OpenCV-2.2.0.tar.bz2 cd OpenCV-2.2.0 cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ./ make make install
Da biste testirali instaliranu biblioteku, možete izraditi primjere i pokrenuti nešto:
cd samples/c/ chmod +x build_all.sh ./build_all.sh ./delaunay
Ako umjesto testne slike vidite pogrešku "greška pri učitavanju zajedničkih biblioteka: libopencv_core.so.2.2: nije moguće otvoriti datoteku zajedničkog objekta: nema takve datoteke ili direktorija", to znači da program ne može pronaći knjižnice. Morate eksplicitno navesti put do njih:
$ izvoz LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
Ako se nakon toga opet pojavi greška:
OpenCV pogreška: neodređena pogreška (funkcija nije implementirana. Ponovno izgradite biblioteku s podrškom za Windows, GTK+ 2.x ili Carbon. Ako ste na Ubuntu ili Debianu, instalirajte libgtk2.0-dev i pkg-config, zatim ponovno pokrenite cmake ili konfigurirajte skriptu) u cvNamedWindow, datoteka /usr/src/OpenCV-2.2.0/modules/highgui/src/window.cpp, red 274 terminate pozvan nakon izbacivanja instance "cv::Exception" what(): /usr /src/OpenCV-2.2.0/modules/highgui/src/window.cpp:274: pogreška: (-2) Funkcija nije implementirana. Ponovno izgradite biblioteku s podrškom za Windows, GTK+ 2.x ili Carbon. Ako koristite Ubuntu ili Debian, instalirajte libgtk2.0-dev i pkg-config, zatim ponovno pokrenite cmake ili konfigurirajte skriptu u funkciji cvNamedWindow
Dakle, zaboravili ste instalirati GTK+ 2.x: libgtk2.0-dev. Pokrenite instalaciju (vidi gore).
Kada instalacija završi, datoteke zaglavlja bit će dostupne u direktoriju /usr/local/include/opencv, a datoteke biblioteke bit će u /usr/local/lib
Izgradimo program s OpenCV-om:
test.cpp
// // za testiranje // // robocraft.ru // #include
Makefile
CC:= g++ CFLAGS:= -I/usr/local/include/opencv -L/usr/local/lib OBJEKTI:= BIBLIOTEKE:= -lopencv_core -lopencv_imgproc -lopencv_highgui .PHONY: sve čisto sve: test test: $(CC ) $(CFLAGS) -o test test.cpp $(LIBRARIES) clean: rm -f *.o
Pokretanje izgradnje naredbom make.
Pozdrav svijete!
OpenCV je instaliran i spreman za rad. Napišimo našu prvu aplikaciju Hello World!
#uključi
Prijenos slike
Ovaj primjer će biti osnova svih vaših OpenCV programa. U okruženje ćemo učitati sliku iz datoteke Image0.jpg
#uključi
Podržane vrste formata slike:
- Windows bitmape - BMP, DIB
- JPEG datoteke - JPEG, JPG, JPE
- Prijenosna mrežna grafika - PNG
- Prijenosni format slike - PBM, PGM, PPM
- Sunčani rasteri - SR, RAS
- TIFF datoteke - TIFF, TIF
Za pristup slici možete uputiti sljedeće pozive:
Image->nChannels // broj kanala slike (RGB, iako u OpenCV - BGR) (1-4) image->depth // bit dubina image->width // širina slike u pikselima image->height // visina slike u pikselima image->imageSize // memorija koju zauzima slika (==image->height*image->widthStep) image->widthStep // udaljenost između okomito susjednih točaka slike (broj bajtova u jednom retku slike - može potrebno za neovisno zaobilaženje svih piksela na slici)
Prijenos videa
Učitavanje videa nije puno kompliciranije od učitavanja slike, osim što će postojati petlja koja ponavlja okvire.
Odgoda između sličica postavljena je na 33 milisekunde. ova odgoda vam omogućuje obradu video streama standardnom brzinom od 30 sličica u sekundi.
#uključi
Za snimanje videa s kamere potrebno je malo modificirati kod - umjesto funkcije cvCreateFileCapture() koristit će se cvCreateCameraCapture(). Kada pritisnete ESC, reprodukcija će se prekinuti i prozor će se zatvoriti, a kada pritisnete Enter, trenutni kadar će biti spremljen u jpg datoteku.
#uključi
OpenCV v1.0 prikazuje i sprema sliku minimalne rezolucije kamere od 320x240.
Prepoznavanje uzoraka objekata
Postoji funkcija cvMatchTemplate() za prepoznavanje područja na izvornoj slici prema predlošku. Funkcija postavlja predložak slike na trenutnu sliku i, prema odabranom algoritmu, traži korelaciju među njima. Određivanje granica pronađenog predloška na izvornoj slici vrši funkcija cvMinMaxLoc, a za normalizaciju algoritma pretraživanja cvNormalize().
// // primjer cvMatchTemplate() // podudaranje slike s predloškom // #include