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:

  1. Zamijenite 1. kanal (R - crveno) s 3. kanalom (B - plavo), a tada će crveno biti (0,0,255), a ne (255,0,0) .
  2. 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:

  1. Izvorna slika.
  2. Torka od 2 pozitivna neparna broja. Što je veći broj, to je veća snaga zaglađivanja.
  3. 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:

  1. Sama slika.
  2. Koordinata gornjeg lijevog kuta (x1, y1) .
  3. Koordinata donjeg desnog kuta (x2, y2) .
  4. Boja pravokutnika (GBR/RGB ovisno o odabranom modelu boja).
  5. Š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:

  1. Sama slika na kojoj je nacrtana crta.
  2. Koordinata prve točke (x1, y1) .
  3. Koordinata druge točke (x2, y2) .
  4. Boja linije (GBR/RGB ovisno o odabranom modelu boja).
  5. 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:

  1. Slika izravno.
  2. Tekst za sliku.
  3. Koordinata donjeg lijevog kuta početka teksta (x, y) .
  4. 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:

    1. Obrađena slika u sivim tonovima.
    2. Parametar scaleFactor. Neka lica mogu biti veća od drugih jer su bliža od drugih. Ova postavka kompenzira perspektivu.
    3. 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.
    4. minSize - izravno veličina ovih područja.

    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 #uključi #uključi #uključi int main(int argc, char** argv) ( IplImage* img = NULL; if ((img = cvLoadImage(argv))== 0) ( printf("cvLoadImage failed\n"); ) IplImage* siva = cvCreateImage( cvGetSize(img), IPL_DEPTH_8U, 1); CvMemStorage* storage = cvCreateMemStorage(0); cvCvtColor(img, gray, CV_BGR2GRAY); // Ovo se radi kako bi se spriječilo otkrivanje puno lažnih krugova cvSmooth(gray, gray , CV_GAUSSIAN, 7, 7); IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3); cvCanny(gray, canny, 50, 100, 3); CvSeq* krugovi = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, gray->height/3, 250, 100); cvCvtColor(canny, rgbcanny, CV_GRAY2BGR); for (size_t i = 0; i< circles->ukupno; i++) ( // zaokružite float na int float* p = (float*)cvGetSeqElem(krugovi, i); cv::Point center(cvRound(p), cvRound(p)); int radius = cvRound(p) ; // nacrtaj centar kruga cvCircle(rgbcanny, center, 3, CV_RGB(0,255,0), -1, 8, 0); // nacrtaj obris kruga cvCircle(rgbcanny, center, radius+1, CV_RGB(0, 0,255), 2, 8, 0); printf("x: %d y: %d r: %d\n",center.x,center.y, polumjer); ) cvNamedWindow("krugovi", 1); cvShowImage("krugovi", rgbcanny); cvSaveImage("out.png", rgbcanny); cvWaitKey(0); povratak 0; )

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:

  1. Učitajte sliku s diska i pretvorite je u sive nijanse.
  2. Malo zamutite sliku.
  3. Primijenite detektor rubova Canny za otkrivanje objekata na slici.
  4. Zatvorite sve praznine u konturama.
  5. Pronađite konture predmeta na slici.
  6. 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 #uključi #uključi #uključi int main(int argc, char* argv) ( IplImage* image=0, *dst=0; // naziv slike char filename = "Image0.jpg"; // dohvaćanje slike slike = cvLoadImage(filename, 1); printf( "[i] slika: %s\n", naziv datoteke); assert(image != 0); // prikaži sliku cvNamedWindow("image"); cvShowImage("image", image); // čekaj ključ treba pritisnuti cvWaitKey( 0); // oslobađanje resursa cvReleaseImage(& image); cvReleaseImage(&dst); // uklanjanje prozora cvDestroyAllWindows(); return 0; )

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 #uključi int main(int argc, char** argv) ( // postavite visinu i širinu slike int height = 620; int width = 440; // postavite točku za izlaz teksta CvPoint pt = cvPoint(height/4, width /2); // Stvorite 8-bitnu, 3-kanalnu sliku IplImage* hw = cvCreateImage(cvSize(height, width), 8, 3); // Ispunite sliku crnom cvSet(hw,cvScalar(0,0) ,0)); // inicijalizacija fonta CvFont font; cvInitFont(&font, CV_FONT_HERSHEY_COMPLEX,1.0, 1.0, 0, 1, CV_AA); // prikaz teksta na slici koristeći font cvPutText(hw, "OpenCV Step By Step", pt , &font, CV_RGB(150, 0, 150)); // stvorite prozor cvNamedWindow("Hello World", 0); // prikažite sliku u stvorenom prozoru cvShowImage("Hello World", hw); // pričekajte za tipku koju treba pritisnuti cvWaitKey(0); // oslobađanje resursa cvReleaseImage(&hw); cvDestroyWindow("Hello World"); return 0; )

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 #uključi #uključi #uključi IplImage* slika = 0; IplImage* src = 0; int main(int argc, char* argv) ( // ime slike postavljeno je kao prvi parametar char* filename = argc == 2 ? argv : "Image0.jpg"; // dobivanje slike image = cvLoadImage( filename,1); // kloniraj sliku src = cvCloneImage(image); printf("[i] image: %s\n", filename); assert(src != 0); // prozor za prikaz slike cvNamedWindow ("original",CV_WINDOW_AUTOSIZE); / / prikaži sliku cvShowImage("original",image); // ispis informacija o slici na konzoli printf("[i] kanali: %d\n", image->nChannels ); printf("[i] dubina piksela: % d bita\n", slika->dubina); printf("[i] širina: %d piksela\n", slika->širina); printf("[i ] visina: %d piksela\n", image- >height); printf("[i] veličina slike: %d bajtova\n", image->imageSize); printf("[i] korak širine: %d bajtova \n", image->widthStep); // čekanje pritiska tipke cvWaitKey(0); // oslobađanje resursa cvReleaseImage(& image); cvReleaseImage(&src); // brisanje prozora cvDestroyWindow("original"); return 0 ;)

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 #uključi #uključi #uključi IplImage*okvir=0; int main(int argc, char* argv) ( // naziv datoteke dan kao prvi parametar char* naziv datoteke = argc == 2 ? argv : "test.avi"; printf("[i] datoteka: %s\n", naziv datoteke ); // prozor za prikaz slike cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // dobivanje informacija o video datoteci CvCapture* capture = cvCreateFileCapture(filename); while(1)( // dobivanje sljedećeg okvira frame = cvQueryFrame( capture) ; if(!frame) ( break; ) // ovdje možete umetnuti // postupak obrade // prikazati okvir cvShowImage("original", frame); char c = cvWaitKey(33); if (c == 27) ( // ako se pritisne ESC, izađi iz prekida; ) ) // oslobađanje resursa cvReleaseCapture(&capture); // brisanje prozora cvDestroyWindow("original"); return 0; )

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 #uključi #uključi #uključi int main(int argc, char* argv) ( // dobivanje bilo koje povezane kamere CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); //cvCaptureFromCAM(0); assert(capture); //cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, 640);/ /1280); //cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);//960); // dobivanje širine okvira i visine dvostruke širine = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); dvostruka visina = cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); printf("[i] %.0f x %.0f\n", širina, visina); IplImage*okvir=0; cvNamedWindow("hvatanje", CV_WINDOW_AUTOSIZE); printf("[i] pritisnite Enter za snimanje slike i Esc za izlaz!\n\n"); int brojač=0; charfilename; while(true)( // dohvati okvir frame = cvQueryFrame(capture); // prikaži cvShowImage("capture", frame); char c = cvWaitKey(33); if (c == 27) ( // ESC je pritisnut break ; ) else if(c == 13) ( // Unesite // spremite okvir u datoteku sprintf(ime datoteke, "Slika%d.jpg", brojač); printf("[i] snimanje... %s\ n", naziv datoteke); cvSaveImage(ime datoteke, okvir); brojač++; ) ) // oslobađanje resursa cvReleaseCapture(&capture); cvDestroyWindow("hvatanje"); povratak 0; )

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 #uključi #uključi #uključi IplImage* slika = 0; IplImage* templ = 0; int main(int argc, char* argv) ( // naziv slike dat je kao prvi parametar char* filename = argc >= 2 ? argv : "Image0.jpg"; // dohvaćanje slike image = cvLoadImage(filename, 1); printf( "[i] slika: %s\n", naziv datoteke); assert(slika != 0); // predložak char* naziv datoteke2 = argc >= 3 ? argv : "oko.jpg"; printf( "[i] predložak: %s\n", naziv datoteke2); templ = cvLoadImage(ime datoteke2,1); assert(templ != 0); cvNamedWindow("origianl", CV_WINDOW_AUTOSIZE); cvNamedWindow("predložak", CV_WINDOW_AUTOSIZE); cvNamedWindow("Match" , CV_WINDOW_AUTOSIZE); cvNamedWindow("res", CV_WINDOW_AUTOSIZE); // veličina predloška int width = templ->width; int height = templ->height; // original i predložak cvShowImage("origianl", slika ); cvShowImage(" predložak", templ); // slika za pohranjivanje rezultata usporedbe // veličina rezultata: ako je slika ŠxV, a templ ŠxV, tada je rezultat = (Š-š+1)x(V-v+1) IplImage *res = cvCreateImage(cvSize ((image->width-templ->width+1), (image->height-templ->height+1)), IPL_DEPTH_32F, 1); // usporedi sliku s predloškom cvMatchTemplate(image, templ, res, CV_TM_SQDIFF); // pokažemo što smo dobili cvShowImage("res", res); // određivanje najbolje pozicije za usporedbu // (traženje minimuma i maksimuma na slici) double minval, maxval; CvPoint minloc, maxloc; cvMinMaxLoc(res, &minval, &maxval, &minloc, &maxloc, 0); // normalizirati cvNormalize(res,res,1,0,CV_MINMAX); cvNamedWindow("res norma", CV_WINDOW_AUTOSIZE); cvShowImage("res norma", res); // odaberite područje s pravokutnikom cvRectangle(image, cvPoint(minloc.x, minloc.y), cvPoint(minloc.x+templ->width-1, minloc.y+templ->height-1), CV_RGB( 255, 0, 0), 1, 8); // prikaži sliku cvShowImage("Podudaranje", slika); // čekamo da se tipka pritisne cvWaitKey(0); // oslobađanje resursa cvReleaseImage(&image); cvReleaseImage(&templ); cvReleaseImage(&res); cvUništiSveWindowse(); povratak 0; )