OpenCV - Open Source Computer Vision Niklas Beuter 30. April 2008 OpenCV - Open Source Computer Vision 1
Übersicht Vorteile von OpenCV Community 1 Vorteile von OpenCV Community 2 Aufbau Funktionalität 3 OpenCV einbinden Unterschiede Icewing - OpenCV 4 Ein einfaches Beispiel Arbeiten mit Bildern OpenCV - Open Source Computer Vision 2
OpenCV - Open Source Computer Vision 3 Vorteile von OpenCV Community OpenCV: Entwickelt von Intel seit 1999 Geschrieben in C/C++, optimiert für Echtzeit-Anwendungen Betriebssystem-, Hardware-, Window-Managerunabhängig Über 500 Funktionen für Foto/Video Bearbeitung, Laden und Speicherung Weit verbreitet in Unternehmen und Forschungseinrichtungen 2006 wurde die Version 1.0 herausgegeben
OpenCV - Open Source Computer Vision 4 Warum OpenCV? Vorteile von OpenCV Community Geschwindigkeit De facto Standard der Algorithmen Leichte Anbindung an IceWing
OpenCV - Open Source Computer Vision 4 Warum OpenCV? Vorteile von OpenCV Community Geschwindigkeit De facto Standard der Algorithmen Leichte Anbindung an IceWing
Community Vorteile von OpenCV Community Web group Eine online community in OpenCV@yahoogroups.com, wo Fehler, Meinungen und Fragen ausgetauscht werden. Eine große community existiert zusätzlich zwischen großen Unternehmen (IBM, Microsoft, Intel, Sony, Siemens, Google,...) und Forschungseinrichtungen (Stanford, MIT, CMU, Cambridge, INRIA,...) OpenCV - Open Source Computer Vision 5
OpenCV - Open Source Computer Vision 6 Module von OpenCV Aufbau Funktionalität
OpenCV - Open Source Computer Vision 7 Funktionalität in Worten Aufbau Funktionalität Vision (cv): Grundlegende Bildverarbeitung (Filter, geometrische Transformationen, Frabraumumwandlungen) Bildanalyse (Featureauswahl, Morphologische Operationen, Konturverfolgung, Histogramme) Strukturelle Analyse (Formfaktoren, Planare Unterteilungen) Bewegungsanalyse und Objektverfolgung Objekt/Gesichtserkennung Kamerakalibrierung und Teile von 3D Rekonstruktion
OpenCV - Open Source Computer Vision 8 Funktionalität in Worten Aufbau Funktionalität Kernfunktionalität (cxcore, partly used by Intel Open Source Probabilistic Network Library as well): Einfache Operationen auf Arrays Matrixoperationen, Mathefunktionen DFT XML Zeichenfunktionen (2D Graphik) Komplexe : Sparsematrizen, Wachsende Sequenzen, Graphen
OpenCV - Open Source Computer Vision 9 Funktionalität in Worten Aufbau Funktionalität IO/GUI (highgui) Bild/Video Aufnahme. Einfache Oberflächenerstellung (Alle OpenCV-Beispiele mit GUI benutzen HighGUI)
OpenCV - Open Source Computer Vision 10 Funktionalität in Worten Aufbau Funktionalität Experimentelle Funtionen (cvaux): 3D Vision: Stereo Kalibrierung,... Stereo Korrespondierung, Graphenverbindungen Gesichtsdetailerkennung und -tracking Shape matching, skeletons... HMMs Texturen
OpenCV - Open Source Computer Vision 11 Funktionalität in Bildern Aufbau Funktionalität
OpenCV - Open Source Computer Vision 13 OpenCV einbinden Unterschiede Icewing - OpenCV Das erste Plugin in Icewing mit OpenCV IceWing Plugin generieren /vol/vita/bin/icewing-plugingen -cpp OpenCVTestPlugin OCVTest OpenCV im Makefile OPENCV_DIR = /vol/vision/ INCLUDES = -I$(OPENCV_DIR)/include/opencv OPENCV_LIB = -L$(OPENCV_DIR)/lib/ -Wl,--rpath,$(OPENCV_DIR)/lib LIBS = $(OPENCV_LIB) -lm -lcvaux -lc -lhighgui LDLIBS += $(ICEWING) --libs $(LIBS) CXXFLAGS += $(INCLUDES) Include Libs im Plugin #include "tools/opencv.h" // IceWing OpenCV support #include <cv.h> #include <cvaux.h> #include <highgui.h> #include <cxcore.h> // unnecessary - included in cv.h
OpenCV - Open Source Computer Vision 15 OpenCV einbinden Unterschiede Icewing - OpenCV Das erste Plugin in Icewing mit OpenCV Kompilieren as usual make clean; make depend; make; IceWing Aufruf icewing -sg f -l./libopencvtestplugin.so opencv.h void iw_opencv_render (prevbuffer *b, const IplImage *img, iwcoltab ctab); IplImage* iw_opencv_from_img (const iwimage *img, BOOL swaprb); iwimage* iw_opencv_to_img (const IplImage *img, BOOL swaprb); iwimage* iw_opencv_to_img_interleaved (const IplImage *img, BOOL swaprb);
OpenCV - Open Source Computer Vision 17 IceWing OpenCV plugin OpenCV einbinden Unterschiede Icewing - OpenCV OpenCV plugin #include "tools/opencv.h" // icewing opencv support #include <cv.h> // opencv header bool OpenCVTestPlugin::Process (char *ident, plugdata *data) { IplImage* BGRimg = 0; iwimage *img = &((grabimagedata*)data->data)->img; int w = img->width, h = img->height; BGRimg = iw_opencv_from_img(img, true); GRAYimg = cvcreateimage(cvsize(w,h), IPL_DEPTH_8U, 1); int i = 120, j= 80; uchar* ptr = &CV_IMAGE_ELEM(iBGRimg,uchar,i,j*3); cvcvtcolor(bgrimg, GRAYimg, CV_BGR2GRAY); iw_opencv_render(b_image, GRAYimg, IW_GRAY); prev_draw_buffer(b_image); if (BGRimg) cvreleaseimage(&bgrimg); return TRUE; } OpenCV Unterstuetzung bereits enthalten in IceWing iw opencv from img() Funktion zur Konvertierung zwischen den Bildformaten cvcreateimage() Standard Kontruktor fuer IplImages cvsize und andere Funktionen machen den Code kuerzer und erlauben 1-line Funktionsaufrufe CV IMAGE ELEM() Einfacher Weg zum Zugriff auf Image Pixel cvcvtcolor() Beispiel fuer eine OpenCV Bildbearbeitungsfunktion iw opencv render() Bildanzeige von IplImage in IceWing cvreleaseimage() Immer schoen aufraeumen
OpenCV - Open Source Computer Vision 18 OpenCV einbinden Unterschiede Icewing - OpenCV IceWing Bildformat vs. OpenCV Bildformat Standard-Bildverwendung unterscheidet sich zwischen IceWing und OpenCV OpenCV (IplImage) Pixel im gleichen Speicherbereich. Farben hintereinander IceWing (iwimage) Plane orientierte Speicherverwaltung Jede plane hat die Größe des Bildes Konvertierungsroutinen zum Umwandeln
OpenCV - Open Source Computer Vision 20 Ein einfaches Beispiel Arbeiten mit Bildern OpenCV Image IplImage -- int nchannels; // Number of color channels (1,2,3,4) -- int depth; // Pixel depth in bits: // IPL_DEPTH_8U, IPL_DEPTH_8S, // IPL_DEPTH_16U,IPL_DEPTH_16S, // IPL_DEPTH_32S,IPL_DEPTH_32F, // IPL_DEPTH_64F -- int width; // image width in pixels -- int height; // image height in pixels -- char* imagedata; // pointer to aligned image data // Note that color images are stored in BGR order -- int dataorder; // 0 - interleaved color channels, // 1 - separate color channels // cvcreateimage can only create interleaved images -- int origin; // 0 - top-left origin, // 1 - bottom-left origin (Windows bitmaps style) -- int widthstep; // size of aligned image row in bytes -- int imagesize; // image data size in bytes = height*widthstep
OpenCV - Open Source Computer Vision 22 Ein einfaches Beispiel Arbeiten mit Bildern OpenCV Matrix CvMat // 2D array -- int type; // elements type (uchar,short,int,float,double) and flags -- int step; // full row length in bytes -- int rows, cols; // dimensions -- int height, width; // alternative dimensions reference -- union data; -- uchar* ptr; // data pointer for an unsigned char matrix -- short* s; // data pointer for a short matrix -- int* i; // data pointer for an integer matrix -- float* fl; // data pointer for a float matrix -- double* db; // data pointer for a double matrix
OpenCV - Open Source Computer Vision 24 Ein einfaches Beispiel Arbeiten mit Bildern OpenCV Vektor CvMatND // N-dimensional array -- int type; // elements type (uchar,short,int,float,double) and flags -- int dims; // number of array dimensions -- union data; -- uchar* ptr; // data pointer for an unsigned char matrix -- short* s; // data pointer for a short matrix -- int* i; // data pointer for an integer matrix -- float* fl; // data pointer for a float matrix -- double* db; // data pointer for a double matrix -- struct dim[]; // information for each dimension -- size; // number of elements in a given dimension -- step; // distance between elements in a given dimension
OpenCV - Open Source Computer Vision 26 Das einfachste Programm Ein einfaches Beispiel Arbeiten mit Bildern sample.cpp #include <cv.h> #include <highgui.h> int main( int argc, char** argv ) { IplImage* image; if( argc!= 2 ) return -1; image = cvloadimage( argv[1] ); if(!image ) return -1; cvnamedwindow( "Sample", 1 ); cvshowimage( "Sample", image ); cvwaitkey(); return 0; }
Das einfachste Programm Ein einfaches Beispiel Arbeiten mit Bildern #include <cv.h> #include <highgui.h> IplImage* image = 0; int thresh = 100; void on_trackbar(int) { IplImage* gray = cvcreateimage( cvgetsize(image), 8, 1 ); CvMemStorage* storage = cvcreatememstorage(0); CvSeq* contours = 0; cvcvtcolor( image, gray, CV_BGR2GRAY ); cvthreshold( gray, gray, thresh, 255, CV_THRESH_BINARY ); cvfindcontours( gray, storage, &contours ); cvzero( gray ); if( contours ) cvdrawcontours( gray, contours, cvscalarall(255), cvscalarall(255), 100 ); cvshowimage( "Contours", gray ); cvreleaseimage( &gray ); cvreleasememstorage( &storage ); } int main( int argc, char** argv ) { IplImage* image; if( argc!= 2!(image = cvloadimage(argv[1])) ) return -1; cvnamedwindow( "Contours", 1 ); cvcreatetrackbar( "Threshold", "Contours", &thresh, 255, on_trackbar ); on_trackbar(0); cvwaitkey(); return 0; } OpenCV - Open Source Computer Vision 28
OpenCV - Open Source Computer Vision 30 Zugriff auf den Bildinhalt Ein einfaches Beispiel Arbeiten mit Bildern k = channel; i = row; j = column; Indirekt - Ineffizient IplImage* img=cvcreateimage(cvsize(640,480),ipl_depth_32f,3); CvScalar s; s=cvget2d(img,i,j); // get the (i,j) pixel value printf("b=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111; cvset2d(img,i,j,s); // set the (i,j) pixel value Direkt - Effizient, aber Fehleranfaellig IplImage* img=cvcreateimage(cvsize(640,480),ipl_depth_8u,3); ((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels + 0]=111; // B ((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels + 1]=112; // G ((uchar *)(img->imagedata + i*img->widthstep))[j*img->nchannels + 2]=113; // R
OpenCV - Open Source Computer Vision 32 Zugriff auf den Bildinhalt Ein einfaches Beispiel Arbeiten mit Bildern k = channel; i = row; j = column; Pointer - Effizient, aber eventuell risikohaft IplImage* img = cvcreateimage(cvsize(640,480), IPL_DEPTH_8U,3); int height = img->height; int width = img->width; int step = img->widthstep/sizeof(uchar); int channels = img->nchannels; uchar* data = (uchar *)img->imagedata; data[i*step+j*channels+k] = 111; Wrapper - Galant template<class T> class Image { private: IplImage* imgp; public: Image(IplImage* img=0) {imgp=img;} ~Image(){imgp=0;} void operator=(iplimage* img) {imgp=img;} inline T* operator[](const int rowindx) { return ((T *)(imgp->imagedata + rowindx*imgp->widthstep));} }; Wrapper - Galant IplImage* img=cvcreateimage(cvsize(640,480), IPL_DEPTH_8U,3); RgbImage imga(img); imga[i][j].b = 111; imga[i][j].g = 111; imga[i][j].r = 111; typedef struct{ unsigned char b,g,r; } RgbPixel; typedef struct{ float b,g,r; } RgbPixelFloat; typedef Image<RgbPixel> typedef Image<RgbPixelFloat> typedef Image<unsigned char> typedef Image<float> RgbImage; RgbImageFloat; BwImage; BwImageFloat;
OpenCV - Open Source Computer Vision 33 Zeichnen mit OpenCV Ein einfaches Beispiel Arbeiten mit Bildern Zeichenfunktionen Linien, Kreise, Ellipse,... Polygone (Gefüllt, Kontur) Text Verschiedene Farben, Linienstärken, Antialising Beliebige Bildtypen werden dabei unterstützt
OpenCV - Open Source Computer Vision 34 Nützliche Quellen Ein einfaches Beispiel Arbeiten mit Bildern /vol/vision/ocv100/share/opencv/doc/index.htm, faq.htm (supplied documentation) http://opencvlibrary.sourceforge.net (OpenCV Wiki-pages) http://www.intel.com/research/mrl/research/opencv/ (OpenCV at Intel) http://sourceforge.net/projects/opencvlibrary/ (the project page at SF. Take the latest release or CVS snapshots here) http://www.opencv.org/ (OpenCV Wiki pages, still being formed) http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/ index.html (nice newbie introduction)