OpenCV

From ImageWiki

(Difference between revisions)
Jump to: navigation, search
(Tilgang til pixels)
Line 37: Line 37:
  #define BLUE(IMAGE, X, Y) \
  #define BLUE(IMAGE, X, Y) \
     ((uchar*)((IMAGE)->imageData + (IMAGE)->widthStep*(Y)))[(X)*3]
     ((uchar*)((IMAGE)->imageData + (IMAGE)->widthStep*(Y)))[(X)*3]
-
Herefter er det muligt at tilg pixel ''(x, y)'' i grtone billedet 'I' p flgende mde:
+
Herefter er det muligt at tilg pixel ''(x, y)'' i grtone billedet ''I'' p flgende mde:
  // Stter I(x,y) = I(x,y) + 1
  // Stter I(x,y) = I(x,y) + 1
  int tmp = GRAY(I, x, y);
  int tmp = GRAY(I, x, y);
  GRAY(I, x, y) = tmp + 1;
  GRAY(I, x, y) = tmp + 1;
-
Tilsvarende kan de enkelte elementer af pixels i RGB billedet 'RGB' tilgs:
+
Tilsvarende kan de enkelte elementer af pixels i RGB billedet ''RGB'' tilgs:
  // Overskriver den bl vrdi af RGB(x,y) med den tilsvarende rde vrdi
  // Overskriver den bl vrdi af RGB(x,y) med den tilsvarende rde vrdi
  int red = RED(RGB, x, y);
  int red = RED(RGB, x, y);

Revision as of 10:10, 9 July 2006

Denne side giver en bl�d introduktion til OpenCV, som er et kraftigt bibliotek til billedbehandling og Computer Vision udviklet i C. OpenCV's hjemmeside kan ses her.

Generelt er OpenCV yderst veldokumenteret, s� denne side giver kun et par simple eksempler p� anvendelse. Et problem ved OpenCV's dokumentation er dog at der er s� meget af den, hvilket kan g�re det hele noget uoverskueligt. Man skal derfor vide hvad man leder efter -- men bare rolig, det l�rer man med tiden.

Contents

Strukturen af OpenCV

OpenCV best�r af tre dele

  • cxcore stiller diverse basale strukturer til r�dighed. Dette inkluderer strukturer til billeder, matricer, punkter, o.lign. Desuden indeholder cxcore basale grafiske funktioner, s� som tegning af linier, cirkler, firkanter, osv.
  • cv indeholder funktioner til billedbehandling, Computer Vision og m�nstergenkendelse. Det vil sige funktioner til kantdetektion, kamerakalibrering, beregning af motion flow, klyngeanalyse og s� videre.
  • highgui indeholder funktioner til opbygning af simple grafiske brugergr�nseflader og til indl�sning af billeder. Dvs. at highgui prim�rt bruges til at hente billeder (fra kamera og filer) og derefter vise dem.

Hvordan benyttes OpenCV?

En af OpenCV's styrker er at det er let at benytte. Hver af de tre dele af OpenCV stiller en header-fil til r�dighed der blot skal inkluderes i dit C/C++ program. Dvs. f�lgende tre header-filer er interessante: "cxcore.h", "cv.h" og "highgui.h".

For at overs�tte programmer der benytter OpenCV, benyttes programmet pkg-config. Dette program fort�ller blot hvilke argumenter der skal gives til overs�tteren for at OpenCV kan benyttes. Kommandoen

pkg-config --cflags opencv

udskriver de argumenter der skal gives til overs�tteren for at den kan finde OpenCV, mens kommandoen

pkg-config --libs opencv

udskriver de argumenter der skal gives til overs�tteren f�rend den kan linke til OpenCV. Dette g�r det yderst nemt at skrive en passende Makefile. Der henvises til billedgruppens SVN server for et simpelt eksempel p� en Makefile til OpenCV. XXX: F� lagt et eksempel i SVN og henvis til dette.

Eksempel 1

Tag billeder og vis dem.

Eksempel 2

Tag billeder, find kanter og vis dem.

Tips og tricks

Her er en samling af diverse r�d, der kan v�re relevante under udvikling af programmer i OpenCV.

Tilgang til pixels

En af de ting der efter min mening kan v�re lidt besv�rligt er at l�se og skrive enkelte pixels i billeder. Denne generelle teknik for billeder af forskellig type beskrives ganske godt i OpenCV's FAQ (XXX: link til denne). Typisk arbejdes dog med enten gr�tone eller RGB billeder hvor hver pixel repr�senteres med 8 bit. Her benytter jeg ofte f�lgende simple makroer:

#define GRAY(IMAGE, X, Y) \
   ((uchar*)((IMAGE)->imageData  + (IMAGE)->widthStep*(Y)))[X]
#define RED(IMAGE, X, Y) \
   ((uchar*)((IMAGE)->imageData + (IMAGE)->widthStep*(Y)))[(X)*3+2]
#define GREEN(IMAGE, X, Y) \
   ((uchar*)((IMAGE)->imageData + (IMAGE)->widthStep*(Y)))[(X)*3+1]
#define BLUE(IMAGE, X, Y) \
   ((uchar*)((IMAGE)->imageData + (IMAGE)->widthStep*(Y)))[(X)*3]

Herefter er det muligt at tilg� pixel (x, y) i gr�tone billedet I p� f�lgende m�de:

// S�tter I(x,y) = I(x,y) + 1
int tmp = GRAY(I, x, y);
GRAY(I, x, y) = tmp + 1;

Tilsvarende kan de enkelte elementer af pixels i RGB billedet RGB tilg�s:

// Overskriver den bl� v�rdi af RGB(x,y) med den tilsvarende r�de v�rdi
int red = RED(RGB, x, y);
BLUE(RGB, x, y) = red;

Det er dog meget en smagssag om disse makroer g�r koden k�nnere.

Propaganda

En af �rsagerne til at OpenCV benyttes er at det er frit programmel. Det betyder at vi har adgang til alle dele af kildekoden og vi har ret til �ndre i denne hvis vi har behov for dette. Dette betyder ogs� at det uden problemer er muligt at hente OpenCV p� nettet og installere det p� egen maskine.

Personal tools