30. listopadu 2010, Brno Prˇipravil: David Procha´zka
OpenCV: Open Computer Vision Pocˇı´tacˇova´ grafika 2
Obsah prˇedna´sˇky
Strana 2 / 27
Obsah prˇedna´sˇky Za´klady pra´ce s knihovnou OpenCV a za´klady zpracova´nı´ obrazu.
OpenCV
Strana 3 / 27
Knihovna OpenCV Pravdeˇpodobneˇ nejrozsˇ´ırˇeneˇjsˇ´ı knihovna pro zpracova´nı´ obrazu. Obsahuje i na´stroje pro strojove´ ucˇenı´. Vyuzˇ´ıva´ha hodneˇ v souvislosti s robotikou (robot Stanley ze Stanfordu, ktery´ vyhra´l 2 mil. USD od DARPA). Napsa´na pro C/C++, ale existujı´ rozhranı´ pro Python, Ruby, Matlab, aj. Podporova´ny platformy Linux, MacOS X i Windows. OpenCV pu˚vodneˇ orientova´no na C, noveˇ i C++ (zpeˇtneˇ kompatibilnı´, lze kombinovat). Vznikla v laboratorˇ´ıch Intelu, proto je optimalizova´na pro IIP (Intel’s Integrated Performance Primitives).
OpenCV
Strana 4 / 27
Zdroje Knihovna je k dispozici na: http://opencv.willowgarage.com/wiki/. Nejlepsˇ´ı kniha: Bradski, Kaehler: Learning OpenCV – Computer Vision with the OpenCV Library. (OpenCV 1.x) Spousta tutoria´lu na webu: http://www.aishack.in/ (podrobny´ u´vod s VS)
OpenCV
Strana 5 / 27
Struktura OpenCV CV – image processing, vision algorithms, MLL – statistical classifiers, clustering tools, HighGUI – GUI, image and video i/o, CxCore – basic structures, algorithms, XML support, drawing functions, CvAux – Hidden Markov Models face recognition, gesture recognition, stereo vision, 3D tracking, experimental algorithms (background/foreground segmentation) . . . (Velmi sˇpatna´ dokumentace)
OpenCV
Strana 6 / 27
Pocˇı´tacˇove´ vnı´ma´nı´ obrazu Sveˇt je 2D matice pixelu˚, ktera´ reprezentuje 3D prostor – objekty jsou zkresleny perspektivou. Obraz je posˇkozen sˇumem, sˇpatnou optikou, kompresı´ atp.
OpenCV
Strana 7 / 27
Ulozˇenı´ obrazu v OpenCV: IplImage Vytvorˇenı´ instance IplImage: cvCreateImage(CvSize size, int depth, int channels) cvLoadImage(const char* filename, int iscolor=1)
Uvolneˇnı´ z pameˇti: cvReleaseImage(IplImage** image) int nChannels int depth int width int height char* imageData int imageSize ...
pocˇet kana´lu˚ obrazu, 1-4 bitova´ hloubka (naprˇ. IPL DEPTH 8U) sˇ´ırˇka v pixelech vy´sˇka v pixelech pole s daty velikost obrazu
Podrobnosti viz http://opencv.willowgarage.com/ documentation/c/basic_structures.html
OpenCV
Strana 8 / 27
Nacˇtenı´ a zobrazenı´ snı´mku 1 2
# include < cv .h > # include < highgui .h >
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
int main (){ // nacteni obrazu do pameti , dynamicka instance ! IplImage * img = cvLoadImage ( " lena . bmp " ); // vytvoreni okna , volba unik . identifikatoru cvNamedWindow ( " mainWindow " ); // vlozeni obrazu do okna cvShowImage ( " mainWindow " , img ); // cekani na stisk libovolne klavesy cvWaitKey (0); // uvolneni obrazu z pameti a zavreni okna cvReleaseImage (& img ); cvDestroyWindow ( " mainWindow " ); return 0; }
OpenCV
OpenCV podporuje rˇadu forma´tu˚ JPEG files – JPEG, JPG, JPE, JPEG 2000 images – jp2, Portable Network Graphics – PNG, TIFF files – TIFF, TIF, OpenEXR HDR images – EXR, Windows bitmaps – BMP, DIB, Portable image format – PBM, PGM, PPM, Sun rasters – SR, RAS. . .
Strana 9 / 27
OpenCV
Strana 10 / 27
Manipulace s nacˇteny´m snı´mkem 1 2
# include < cv .h > # include < highgui .h >
3 4 5 6 7 8
int main (){ IplImage * img = cvLoadImage ( " lena . bmp " ); cvNamedWindow ( " original " ); // zobrazeni puvodniho obrazu cvShowImage ( " original " , img );
9
// vynasobi kazdy pixel obrazu danou hodnotou cvScale ( img , img , 2); // zdroj i cil jsou stejne cvNamedWindow ( " scaled " ); // zobrazeni noveho obrazu s vysokym kont . cvShowImage ( " scaled " , img ); ...
10 11 12 13 14 15 16
}
OpenCV
Strana 11 / 27
Typy operacı´ nad obrazem Operace, ktere´ aplikujeme nad obrazem lze rozdeˇlit do neˇkolika skupin: diskre´tnı´ operace nad jedinou bunˇkou – je zpracova´na vzˇdy pra´veˇ jedna bunˇka, nenı´ uvazˇova´no okolı´ (zvy´sˇenı´ konstrastu, prahova´nı´ atp.), konvolucˇnı´ filtry – na pixely obrazu je aplikova´na konvolucˇnı´ matice, je uvazˇova´no okolı´ pod maticı´ (gaussovo vyhlazenı´, detekce hran aj.), operace nad segmenty obrazu – je zpracova´va´n vzˇdy cely´ segment obrazu (loka´lnı´ metody prˇi tone mappingu u HDR, rozpozna´va´nı´ spojity´ch tvaru˚).
Za´kladnı´ filtry
Strana 12 / 27
Prahova´nı´ Jednou ze za´kladnı´ch operacı´ je prahova´nı´. 1 2 3
IplImage * img = cvLoadImage ( " lena . bmp " ); cvNamedWindow ( " original " ); cvShowImage ( " original " , img );
4 5 6 7 8
// vytvoreni noveho obrazu pro sedy , 8 bitu , 1 kanal IplImage * gray = cvCreateImage ( cvGetSize ( img ) ,8 ,1); // prevod na sedou skalu cvCvtColor ( img , gray , CV_RGB2GRAY );
9 10 11 12 13
// metody prahovani : CV_THRESH_BINARY , // CV_THRESH_BINARY_INV , CV_THRESH_TRUNC , // CV_THRESH_TOZERO , C V _ T H R E S H _ T O Z E R O _ I N V cvThreshold ( gray , gray ,128.0 ,255.0 , CV_THRESH_BINARY );
Za´kladnı´ filtry
Strana 13 / 27
Metody prahova´nı´ v OpenCV
(zdroj: Webove´ stra´nky OpenCV )
Konvoluce
Strana 14 / 27
Konvolucˇnı´ filtry
(zdroj: Wikipedia, cˇla´nek Konvoluce)
Konvoluce
Strana 15 / 27
Konvolucˇnı´ filtry: zaostrˇenı´ 0 -1 0
-1 5 -1
0 -1 0
-1 -1 -1
-1 9 -1
-1 -1 -1
Za´kladnı´ princip: sveˇtlo, ktere´ meˇlo dopadnout pouze na sousednı´ bunˇky snı´macˇe dopadlo i do zpracova´vane´ bunˇky. Zdu˚raznı´ se sˇum. cvFilter2D(src, dst, kernel, anchor).
Konvoluce
Strana 16 / 27
Implementace vlastnı´ho filtru v OpenCV Pro vytvorˇenı´ kopie lze vygenerovat novy´ obraz a prove´st kopı´rova´nı´ dat, ale rychlejsˇ´ı je klonovat. Smazat i kopii! 1 2 3 4 5 6 7 8 9 10 11 12 13 14
IplImage * img = cvLoadImage ( " lena . bmp " ); cvNamedWindow ( " original " ); cvShowImage ( " original " , img ); // vytvoreni kopie obsahu img IplImage * out = cvCloneImage ( img ); float mat [9] = { // matice pro doostreni -1.0 , -1.0 , -1.0 , -1.0 , 9.0 , -1.0 , -1.0 , -1.0 , -1.0 }; // ulozeni matice do CvMat CvMat kernel = cvMat (3 , 3 , CV_32FC1 , mat ); // aplikace filtru cvFilter2D ( img , out , & kernel );
Konvoluce
Strana 17 / 27
Konvolucˇnı´ filtry: gaussovo vyhlazenı´ 1 2 1
2 4 2
1 4 6 4 1
4 16 24 16 4
1 2 1 6 24 36 24 6
Za´kladnı´ princip: pru˚meˇruju hodnotu s okolnı´mi pixely. 4 16 24 16 4
1 4 6 4 1
Vyhladı´m sˇum a drobne´ objekty. Implementace: cvSmooth(img, out, CV GAUSSIAN, 11, 11); kde 11 je velikost konv. ja´dra.
Konvoluce
Strana 18 / 27
Vytvorˇenı´ kopie snı´mku a gaussovo vyhlazenı´ 1 2 3 4
IplImage * img = cvLoadImage ( " lena . bmp " ); cvNamedWindow ( " input " ); cvNamedWindow ( " output " ); cvShowImage ( " input " , img );
5 6 7
// vyytvoreni kopie obsahu img IplImage * out = cvCloneImage ( img );
8 9 10
// Gaussovo vyhlazeni , jsou i jine varianty cvSmooth ( img , out , CV_GAUSSIAN , 11 , 11);
11 12 13 14
cvShowImage ( " output " , out ); cvWaitKey (0); ...
Konvoluce
Strana 19 / 27
Konvolucˇnı´ filtry: detekce hran v obraze Laplaceu´v opera´tor: 0 1 0 1 -4 1 0 1 0
Zdu˚raznı´ hrany, ale i sˇum. Existuje rˇada ru˚zny´ch konvolucˇnı´ch matic. Hrana je urcˇena tı´m, zˇe se prudce meˇnı´ obr. fce – na hraneˇ se la´me sveˇtlo. cvSobel(), cvLaplace(), cvCanny() . . .
Konvoluce
ˇ asto pouzˇ´ıvane´ opera´tory C
Strana 20 / 27
Konvoluce
Strana 21 / 27
Cannyho detekce hran v OpenCV 1
IplImage * img = cvLoadImage ( " lena . bmp " );
2 3 4 5
// vytvoreni kopie img , 8 bitu , 1 kanal IplImage * gray = cvCreateImage ( cvGetSize ( img ) , 8 , 1 ); cvCvtColor ( img , gray , CV_RGB2GRAY );
6 7 8
// vystupni soubor s hranami IplImage * out = cvCreateImage ( cvGetSize ( img ) , 8 , 1 );
9 10
cvCanny ( gray , out , 100 , 200 , 3);
Vy´rˇezy
Strana 22 / 27
Pra´ce s vy´rˇezem obrazu ˇ asto je nutne´ aplikovat metodu pouze na cˇa´st obrazu C (vyhleda´nı´ vrcholu˚ jednoho urcˇite´ho objektu). 1 2 3
// nastaveni ROI // x , y , width , height cvSetImageROI ( img , cvRect (50 ,50 ,200 ,200));
4 5 6 7 8 9 10 11 12
// ziskani informaci o obrazu s ROI IplImage * out = cvCreateImage ( cvGetSize ( img ) , img - > depth , img - > nChannels ); // kopie vymezene casti obrazu cvCopy ( img , out ); // reset nastaveni ROI cvResetImageROI ( img );
Videosoubory
Strana 23 / 27
Nacˇtenı´/prˇehra´nı´ videosouboru 1 2 3 4 5
cvNamedWindow ( " myWindow " , CV _W IN DO W_ AU TO SI ZE ); CvCapture * camera = cvCr e a te F i le C a pt u r e ( " input . avi " ); IplImage * frame ; char c ;
6 7 8 9 10 11 12 13
do { frame = cvQueryFrame ( camera ); if ( frame ) { cvShowImage ( " myWindow " , frame ); c = cvWaitKey (33); } } while ( ( c != 27) && ( frame ) );
14 15 16
cvReleaseCapture (& camera ); cvDestroyWindow ( " myWindow " );
Videosoubory
Vytvorˇenı´ videosouboru 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
CvVideoWriter * writer = 0; int isColor = 1; // 0= BW int fps = 25; // 30 int frameW = 640; int frameH = 480; writer = c vC r e at e V id e o Wr i t er ( " out . avi " , CV_FOURCC ( ’P ’ , ’I ’ , ’M ’ , ’1 ’) , fps , cvSize ( frameW , frameH ) , isColor ); // CV_FOUR ... lze nahradit -1 pro dialog IplImage * img = 0; int nFrames = 50; for ( i =0; i < nFrames ; i ++){ Img = cvQueryFrame ( capture ); cvWriteFrame ( writer , img ); } cvRele a s e V i d e o W r i t e r (& writer );
Strana 24 / 27
Vkla´da´nı´ objektu˚
Strana 25 / 27
Nastavenı´ a vlozˇenı´ graf. objektu 1
IplImage * src = cvLoadImage ( " input . jpg " );
2 3 4 5 6 7 8
CvPoint pt1 = cvPoint (250 ,60); // body linie CvPoint pt2 = cvPoint (405 ,195); // CvPoint je 2 D bod // CvScalar je vektor delky 1 -4 CvScalar red = CV_RGB (250 ,0 ,0); int thickness = 2; int connectivity = 8;
9 10 11
int radius = 30; CvScalar blue = CV_RGB (0 ,0 ,250);
12 13 14 15
// vykresleni cvLine ( src , pt1 , pt2 , red , thickness , connectivity ); cvCircle ( src , pt2 , radius , blue , thickness , connectivity );
Vkla´da´nı´ objektu˚
Strana 26 / 27
Nastavenı´ a vlozˇenı´ textu 1 2 3 4 5 6
const char * text = " testing " ; double hscale = 1.0; double vscale = 0.8; double shear = 0.2; int line_type = 8; int thickness = 1;
7 8 9 10
CvFont font ; cvInitFont (& font , CV_FONT_HERSHEY_DUPLEX , hscale , vscale , shear , thickness , line_type );
11 12
cvPutText ( src , text , pt1 ,& font , blue );
13 14 15 16
cvNamedWindow ( " myWindow " , 1); cvShowImage ( " myWindow " , src ); ...
Shrnutı´
Strana 27 / 27
Shrnutı´ Co je to konvoluce? Co znamenajı´ koeficienty konvolucˇnı´ho ja´dra a procˇ majı´ popsane´ hodnoty. Jak v OpenCV vytvorˇ´ım okno, nahraji do neˇj obraz a zduplikuji jej. Jak Vlozˇ´ım do okna v OpenCV text a za´kladnı´ graficke´ objekty.