OpenCV - Open Source Computer Vision Library
Alexander Kubias
17. Mai 2005
Institut fur Computervisualistik
¨
a
Universit¨t Koblenz-Landau
a
Universit¨tsstraße 1, 56070 Koblenz
kubias@uni-koblenz.de
http://www.uni-koblenz.de/∼kubias
¨
Ubersicht
t Einleitung
t Grundlagen
t Programmierung
t Image Processing
t Dynamische Datenstrukturen
Alexander Kubias – OpenCV - Open Source Computer Vision Library 1
Einleitung
t OpenCV wurde fur PCs mit Intel-Architektur entwickelt.
¨
t Algorithmen wurden fur Intel-Architektur optimiert.
¨
t OpenCV gibt es fur Linux und Windows.
¨
t OpenCV basiert auf der Image Processing Library (IPL) und
erweitert diese um komplexere Funktionen.
t OpenCV kann frei von Kosten genutzt, ver¨ndert und
a
weitergegeben werden.
Alexander Kubias – OpenCV - Open Source Computer Vision Library 2
Grundlagen - Anwendungsbereiche
t Human-Computer Interaction (HCI)
t Objekt-Identifikation
t Segementierung
t Gesichts-Erkennung
t Gesten-Erkennung
t Tracking von Bewegungen
t Struktur aus Bewegung
t Mobile Roboter
Alexander Kubias – OpenCV - Open Source Computer Vision Library 3
Grundlagen - Funktionsumfang
t Bildfunktionen: Erzeugen und Zerst¨ren von Bildern
o
t Datenstrukturen: Statische Typen und Dynamsiche Speicherung
t Kontur-Verarbeitung: Finden, Anzeigen und Manipulieren von
Bildkonturen
t Geometrie: Konvexe Hulle, Linien und Ellipsen Fitting
¨
t Features: Kanten, Ecken
t Bildstatistik: Mittelwert, Norm, Momente
t Pyramiden-Segmentierung
t Morphologie: Erosion, Dillatation, Open, Close, Top-Hat,
Black-Hat
Alexander Kubias – OpenCV - Open Source Computer Vision Library 4
Grundlagen - Funktionsumfang
t Schwellwert-Bildung
t Kamerakalibrierung und 3D-Rekonstruktion
t Optischer Fluss: Blockmatching u.a.
t Bewegungsanalyse und Objektverfolgung (Tracking)
t Sch¨tzer: Kalman
a
t Histogramm-Funktionen
t HMM
t Matrix Mathematik
t Zeichenfunktionen
Alexander Kubias – OpenCV - Open Source Computer Vision Library 5
Grundlagen - Aufbau der Bibliothek
t Die Bibliothek setzt sich aus vier großen Teilen zusammen:
Eigentliche CV-Funktionalit¨t (cv.h)
a
Experimentelle CV-Funktionalit¨t (cvaux.h)
a
GUI-Funktionalit¨t (highgui.h)
a
Basisstrukturen und Basisoperationen (cxcore.h)
t Fur jeden der vier Bereiche gibt es eine eigene Referenz, die im
¨
Unterverzeichnis docs zu finden ist: opencvref cv.htm,
opencvref cvaux.htm, opencvref cxcore.htm und
opencvref highgui.htm
Alexander Kubias – OpenCV - Open Source Computer Vision Library 6
Grundlagen - Aufbau der Bibliothek
t Durch die vier Dokumentationsreferenzen ist ersichtlich, welche
Funktion im welchem Modul definiert ist.
t Dies ist wichtig zu wissen, damit man die richtige Headerdatei
einbindet:
#include
#include
#include
#include
t Ferner muss man beim Linken der Programme die richtigen
Bibliotheken dazulinken.
Alexander Kubias – OpenCV - Open Source Computer Vision Library 7
Grundlagen - OpenCV Ressourcen
t Offizielle Webseite ist:
http://www.intel.com/research/mrl/research/opencv/
t Newsgroup: http://groups.yahoo.com/group/OpenCV
t Download: http://sourceforge.net/projects/opencvlibrary
Alexander Kubias – OpenCV - Open Source Computer Vision Library 8
Grundlagen - Installation
t Installation von OpenCV in der Version 0.9.6 ist im Dokument
aufbau seu ausfuhrlich beschrieben.
¨
Alexander Kubias – OpenCV - Open Source Computer Vision Library 9
Grundlagen - Compilieren und Linken
t Compilieren und Linken
gcc -I/usr/local/include/opencv -L/usr/local/lib
-lopencv -lcv -lcvaux -lhighgui -lcxcore
-lstdc++ main6.cpp -o main6
Alexander Kubias – OpenCV - Open Source Computer Vision Library 10
Programmierung - Datenformat fur Bilder
¨
t IplImage heißt das Datenformat fur Bilder, welches aus der IPL
¨
stammt.
t OpenCV nutzt dieses Format, aber verwendet aber nur eine
Untermenge der Spezifikation.
t IplImage:
typedef struct _IplImage
{
int nSize; /* sizeof(IplImage) */
int nChannels; /* 1-4 channels */
int depth; /* pixel depth in bits */
int origin; /* 0 - top-left origin,
1 - bottom-left
origin */
Alexander Kubias – OpenCV - Open Source Computer Vision Library 11
Programmierung - Datenformat fur Bilder
¨
int width; /* image width in pix. */
int height; /* image height in pix.*/
char *imageData; /* pointer to aligned
image data */
int widthStep; /* size of aligned image
row in bytes */
...
}
IplImage;
Alexander Kubias – OpenCV - Open Source Computer Vision Library 12
Programmierung - Erzeugen eines Bildes
t Erzeugen eines leeren Bildes
t Beispiel:
#include
int main(){
IplImage* im;
im = cvCreateImage(cvSize(512,256),
IPL_DEPTH_8U, 3);
}
/* Image 512 x 256
8 bit Tiefe
a
3 Kan¨le */
Alexander Kubias – OpenCV - Open Source Computer Vision Library 13
Programmierung - Erzeugen eines Bildes
t Bildtiefe:
8u, 8s, 16s, 32s, 32f, 64f
u=unsigned,s=signed,f=float
t Kan¨le:
a
1 Kanal: Grauwertbild
mehr als 1 Kanal: Farbbild
t Bildspeicherplatz freigeben:
cvReleaseImage(&im);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 14
Programmierung - Kopieren eines Bildes
t cvCloneImage
t Beispiel:
IplImage* im;
im = cvLoadImage("example.jpg",1);
IplImage* im2 = cvCloneImage(im);
}
Alexander Kubias – OpenCV - Open Source Computer Vision Library 15
Programmierung - Laden und Speichern
t Laden und Speichern eines Bildes
t Formate: jpeg, png und pgm
t Beispiel:
#include
int main(){
IplImage* im;
im = cvLoadImage("example.jpg",1);
/* 1 = 3 Kan¨le,
a
0 = 1 Kanal,
-1 = Automatisch */
cvSaveImage("example2.jpg",im);
}
Alexander Kubias – OpenCV - Open Source Computer Vision Library 16
Programmierung - Zugriff auf Pixel
t Zugriff auf Pixel eines Bildes:
IplImage* im = 0;
im = cvCreateImage(cvSize(100,50),
IPL_DEPTH_8U, 3);
int count = im->width * im->height;
for(int i = 0; i imageData[i*3] = 60;
im->imageData[i*3+1] = 0;
im->imageData[i*3+2] = 127;
}
Alexander Kubias – OpenCV - Open Source Computer Vision Library 17
Programmierung - GUI
t Anzeigen des Bildes in einem Fenster
t Warten auf Tastendruck
t Beispiel:
cvNamedWindow("my window", CV_WINDOW_AUTOSIZE);
cvShowImage("my window", im);
cvWaitKey(0);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 18
Programmierung - Basisstrukturen
t CvPoint: 2D Punkt mit ganzzahligen Koordinaten
CvPoint myPoint = cvPoint(10, 20);
int x = myPoint.x;
int y = myPoint.y;
t Daneben gibt es noch die Datentypen: CvPoint2D32f und
CvPoint3D32f
Alexander Kubias – OpenCV - Open Source Computer Vision Library 19
Programmierung - Basisstrukturen
t CvSize: Breite und H¨he eines Bildes
o
CvSize mySize = cvGetSize(im);
int width = mySize.width;
int height = mySize.height;
t Daneben gibt es noch den Datentyp: CvSize2D32f
Alexander Kubias – OpenCV - Open Source Computer Vision Library 20
Programmierung - Basisstrukturen
t CvRect: Gr¨ße und Offset eines Rechtecks
o
t Setzen des ROI (rectangle of interest): cvSetImageROI
t Ermitteln des ROI eines Bildes: cvGetImageROI
t Beispiel: Kopieren eines Bildausschnitts in ein kleineres Bild
CvRect rect = GetImageROI(im);
cvSetImageROI(im, rect);
cvCopy(im, smallImage, 0);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 21
Programmierung - Basisstrukturen
t CvScalar: 1-,2-,3-,4-Tupel
CvScalar scal;
double value = scal.val[0];
t CvMatrix: Matrix
float data[2][3];
CvMat Mat = cvMat(2, 3, CV_32F, data[0]);
t CvArr: Allgemeine Form fur CvMatrix oder IplImage
¨
Alexander Kubias – OpenCV - Open Source Computer Vision Library 22
Programmierung - Operationen auf Matrizen
t Funktionen zum Skalieren der Bilder: cvConvertScale
t Funktionen fur elementweise Operationen: cvAdd, cvSub,
¨
cvMul
t Weitere Funktionen: cvNorm, cvMin, cvMax, cvSum,
cvAvg
Alexander Kubias – OpenCV - Open Source Computer Vision Library 23
Programmierung - Zeichnen von Primitiven
t CV RGB: Erzeugt einen Farbwert
t cvLine: Zeichnet eine Linie
void cvLine( CvArr* img, CvPoint pt1,
CvPoint pt2, CvScalar color,
int thickness=1, int line_type=8,
int shift=0 );
t cvRectangle: Zeichnet ein Rechteck
t Beispiel:
cvRectangle(im, cvPoint(100,300),
cvPoint(150,700), CV_RGB(255,0,0), 3);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 24
Programmierung - Zeichnen von Primitiven
t cvEllipse: Zeichnet ein Rechteck
t Beispiel:
cvEllipse(im, cvPoint(350, 350),
cvSize(50, 30), 45.0, 0, 300,
CV_RGB(220,150,20), CV_FILLED);
t Es gibt noch Funktionen, um Kreise, Polygone usw. zu zeichnen
und um Text auf ein Bild auszugeben.
Alexander Kubias – OpenCV - Open Source Computer Vision Library 25
Programmierung - Zeichnen von Primitiven
Alexander Kubias – OpenCV - Open Source Computer Vision Library 26
Image Processing - Gradienten, Kanten und Eckpunkte
t cvSobel
t cvLaplace
t cvCanny
t cvPreCornerDetect
Alexander Kubias – OpenCV - Open Source Computer Vision Library 27
Image Processing - Gradienten, Kanten und Eckpunkte
t cvLaplace
im2 = cvCreateImage(cvGetSize(im),
IPL_DEPTH_16S, 1);
cvLaplace(im, im2);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 28
Image Processing - Gradienten, Kanten und Eckpunkte
t cvGoodFeaturesToTrack: Findet starke Eckpunkte im Bild
t Beispiel:
IplImage* img = cvLoadImage(filename, 0);
CvSize size = cvGetSize(img);
int count_features = 400;
CvPoint2D32f features[400];
IplImage* eig_image =
cvCreateImage(size, IPL_DEPTH_32F,1);
IplImage* temp_image =
cvCreateImage(size, IPL_DEPTH_32F,1);
cvGoodFeaturesToTrack(img, eig_image,
temp_image, features,
&count_features, 0.01, 0.01);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 29
Image Processing - Gradienten, Kanten und Eckpunkte
Alexander Kubias – OpenCV - Open Source Computer Vision Library 30
Image Processing - Wechsel des Farbraums
t Wechsel von einem Farbraum in einen anderen:
void cvCvtColor( const CvArr* src,
CvArr* dst, int code );
t Beispiel: Wechsel von RGB in HSV
cvCvtColor(img, res, CV_BGR2HSV );
t Beispiel: Wechsel von RGB in Graustufen
cvCvtColor(img, res, CV_BGR2GRAY);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 31
Image Processing - Wechsel des Farbraums
t Auslesen des ersten Kanals eines Bildes
cvSetImageCOI(im, 1);
cvCopy(im, oneChannel, 0);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 32
Dynamische Datenstrukturen - Diskussion
t Vorteile:
sehr schnell
speichereffizient
t Nachteile:
nicht typsicher
umst¨ndlich bei der Benutzung
a
t Deshalb: Besser die STL verwenden
Alexander Kubias – OpenCV - Open Source Computer Vision Library 33
Dynamische Datenstrukturen - Storage
t Speicherverwaltung fur die dynamischen Datenstrukturen
¨
t Man muss einmal im Programm diesen Speicher anlegen:
CvMemStorage* storage = cvCreateMemStorage();
t Freigeben des Speichers:
CvReleaseMemStorage(&storage);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 34
Dynamische Datenstrukturen - Konturen
t Eine Kontur ist eine Liste von Punkten
t Anlegen einer Kontur:
CvSeq* contours = 0;
contours = cvCreateSeq(CV_SEQ_ELTYPE_POINT,
sizeof(CvSeq), sizeof(CvPoint), storage);
t Iteration durch die Konturen:
for(CvSeq* pCont = contours; pCont != 0;
pCont = pCont->h_next){
// hier kann man auf einzelne Kontur
// zugreifen !
}
Alexander Kubias – OpenCV - Open Source Computer Vision Library 35
Dynamische Datenstrukturen - Konturen
t Konturen eines Bin¨rbildes finden:
a
cvFindContours(binaryImage, storage,
&contours, sizeof(CvContour),
CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE,
cvPoint(0,0));
t Kontur in Bild einzeichnen:
cvDrawContours(binaryImage, contours,
CV_RGB(255,255,255),
CV_RGB(255,255,255), 0, 1, 8);
Alexander Kubias – OpenCV - Open Source Computer Vision Library 36
Dynamische Datenstrukturen - Konturen
t Punkte einer Kontur ausgeben:
CvSeqReader reader;
cvStartReadSeq(contours, &reader, 0);
CvPoint pt;
for(int i = 0; i total; i++){
memcpy(&pt, reader.ptr, contours->elem_size);
cout elem_size, reader);
}
Alexander Kubias – OpenCV - Open Source Computer Vision Library 37
References
Alexander Kubias – OpenCV - Open Source Computer Vision Library 38