Introduction To Programming With OpenCV
Introduction To Programming With OpenCV
up previous
Abstract:
The purpose of this document is to get you started quickly with OpenCV without having to go through
lengthy reference manuals. Once you understand these basics you will be able to consult the OpenCV
manuals on a need basis.
Contents
Introduction
Description of OpenCV
Resources
OpenCV naming conventions
Compilation instructions
Example C Program
GUI commands
Window management
Input handling
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 1 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Introduction
Description of OpenCV
General description
Open source computer vision library in C/C++.
Optimized and intended for real-time applications.
OS/hardware/window-manager independent.
Generic image/video loading, saving, and acquisition.
Both low and high level API.
Provides interface to Intel's Integrated Performance Primitives (IPP) with processor specific
optimization (Intel processors).
Features:
Image data manipulation (allocation, release, copying, setting, conversion).
Image and video I/O (file and camera based input, image/video file output).
Matrix and vector manipulation and linear algebra routines (products, solvers, eigenvalues,
SVD).
Various dynamic data structures (lists, queues, sets, trees, graphs).
Basic image processing (filtering, edge detection, corner detection, sampling and interpolation,
color conversion, morphological operations, histograms, image pyramids).
Structural analysis (connected components, contour processing, distance transform, various
moments, template matching, Hough transform, polygonal approximation, line fitting, ellipse
fitting, Delaunay triangulation).
Camera calibration (finding and tracking calibration patterns, calibration, fundamental matrix
estimation, homography estimation, stereo correspondence).
Motion analysis (optical flow, motion segmentation, tracking).
Object recognition (eigen-methods, HMM).
Basic GUI (display image/video, keyboard and mouse handling, scroll-bars).
Image labeling (line, conic, polygon, text drawing)
OpenCV modules:
cv - Main OpenCV functions.
cvaux - Auxiliary (experimental) OpenCV functions.
cxcore - Data structures and linear algebra support.
highgui - GUI functions.
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 2 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Resources
Reference manuals:
<opencv-root>/docs/index.htm
Web resources:
Official webpage: http://www.intel.com/technology/computing/opencv/
Books:
Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves
Bouguet, Springer, 1st ed. (June, 2006).
S = Signed integer
U = Unsigned integer
F = Float
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 3 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
IPL_DEPTH_<bit_depth>(S|U|F)
Header files:
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <cxcore.h> // unnecessary - included in cv.h
Compilation instructions
Linux:
g++ hello-world.cpp -o hello-world \
-I /usr/local/include/opencv -L /usr/local/lib \
-lm -lcv -lhighgui -lcvaux
Windows:
In the project preferences set the path to the OpenCV header files and
the path to the OpenCV library files.
Example C Program
////////////////////////////////////////////////////////////////////////
//
// hello-world.cpp
//
// This is a simple, introductory OpenCV program. The program reads an
// image from a file, inverts it, and displays the result.
//
////////////////////////////////////////////////////////////////////////
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
if(argc<2){
printf("Usage: main <image-file-name>\n\7");
exit(0);
}
// load an image
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 4 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
img=cvLoadImage(argv[1]);
if(!img){
printf("Could not load image file: %s\n",argv[1]);
exit(0);
}
// create a window
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin", 100, 100);
GUI commands
Window management
Create and position a window:
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("win1", 100, 100); // offset from the UL corner of the screen
Load an image:
IplImage* img=0;
img=cvLoadImage(fileName);
if(!img) printf("Could not load image file: %s\n",fileName);
Display an image:
cvShowImage("win1",img);
Can display a color or grayscale byte/float-image. A byte image is assumed to have values in the
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 5 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
range . A float image is assumed to have values in the range . A color image is
Close a window:
cvDestroyWindow("win1");
Resize a window:
cvResizeWindow("win1",100,100); // new width/heigh in pixels
Input handling
Handle mouse events:
Define a mouse handler:
void mouseHandler(int event, int x, int y, int flags, void* param)
{
switch(event){
case CV_EVENT_LBUTTONDOWN:
if(flags & CV_EVENT_FLAG_CTRLKEY)
printf("Left button down with CTRL pressed\n");
break;
case CV_EVENT_LBUTTONUP:
printf("Left button up\n");
break;
}
}
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 6 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
int key;
key=cvWaitKey(0); // wait indefinitely for input
switch(key){
case 'h':
...
break;
case 'i':
...
break;
}
}
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 7 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Generic arrays:
CvArr* // Used only as a function parameter to specify that the
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 8 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Scalars:
CvScalar
|-- double val[4]; //4D vector
Initializer function:
CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0);
Example:
CvScalar s = cvScalar(20.0);
s.val[0]=10.0;
Note that the initializer function has the same name as the data structure only starting with a lower
case character. It is not a C++ constructor.
E.g.:
p.x=5.0;
p.y=5.0;
Rectangular dimensions:
CvSize r = cvSize(int width, int height);
CvSize2D32f r = cvSize2D32f(float width, float height);
size: cvSize(width,height);
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 9 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Examples:
// Allocate a 1-channel byte image
IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
Release an image:
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
cvReleaseImage(&img);
Clone an image:
IplImage* img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
IplImage* img2;
img2=cvCloneImage(img1);
Supported image formats: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM,
SR, RAS, TIFF, TIF
By default, the loaded image is forced to be a 3-channel color image. This default can be modified by
using:
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 10 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
img=cvLoadImage(fileName,flag);
The output file format is determined based on the file name extension.
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 11 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Direct access using a pointer: (Simplified and efficient access under limiting assumptions)
Define a c++ wrapper for single-channel byte images, multi-channel byte images, and multi-
channel float images:
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));}
};
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 12 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
typedef struct{
unsigned char b,g,r;
} RgbPixel;
typedef struct{
float b,g,r;
} RgbPixelFloat;
Image conversion
Convert to a grayscale or color byte-image:
cvConvertImage(src, dst, flags=0);
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 13 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
for(i=0;i<cimg->height;i++) for(j=0;j<cimg->width;j++)
gimgA[i][j]= (uchar)(cimgA[i][j].b*0.114 +
cimgA[i][j].g*0.587 +
cimgA[i][j].r*0.299);
code = CV_<X>2<Y>
<X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
Drawing commands
Draw a box:
// draw a box with red lines of width 1 between (100,100) and (200,200)
cvRectangle(img, cvPoint(100,100), cvPoint(200,200), cvScalar(255,0,0), 1);
Draw a circle:
// draw a circle at (100,100) with a radius of 20. Use green lines of width 1
cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);
cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScalar(0,255,255),lineWidth);
Add text:
CvFont font;
double hScale=1.0;
double vScale=1.0;
int lineWidth=1;
cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX|CV_FONT_ITALIC, hScale,vScale,0,lineWidth);
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 14 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Allocate a matrix:
CvMat* cvCreateMat(int rows, int cols, int type);
Example:
CvMat* M = cvCreateMat(4,4,CV_32FC1);
Release a matrix:
CvMat* M = cvCreateMat(4,4,CV_32FC1);
cvReleaseMat(&M);
Clone a matrix:
CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
CvMat* M2;
M2=cvCloneMat(M1);
Initialize a matrix:
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
Alternatively:
CvMat Ma;
cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 15 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
data[i*n+j] = 3.0;
(data+i*step)[j] = 3.0;
Matrix/vector operations
Matrix-matrix operations:
CvMat *Ma, *Mb, *Mc;
cvAdd(Ma, Mb, Mc); // Ma+Mb -> Mc
cvSub(Ma, Mb, Mc); // Ma-Mb -> Mc
cvMatMul(Ma, Mb, Mc); // Ma*Mb -> Mc
Vector products:
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 16 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Note that Va, Vb, Vc, must be 3 element vectors in a cross product.
The flags cause U and V to be returned transposed (does not work well without the transpose flags).
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 17 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
Capturing a frame:
IplImage* img = 0;
if(!cvGrabFrame(capture)){ // capture a frame
printf("Could not grab a frame\n\7");
exit(0);
}
img=cvRetrieveFrame(capture); // retrieve the captured frame
To obtain images from several cameras simultaneously, first grab an image from each camera.
Retrieve the captured images after the grabbing is complete.
Note that the image captured by the device is allocated/released by the capture function. There is no
need to release it explicitly.
The total frame count is relevant for video files only. It does not seem to be working properly.
Get the position of the captured frame in [msec] with respect to the first frame, or get its index where
the first frame starts with an index of 0. The relative position (ratio) is 0 in the first frame and 1 in the
last frame. This ratio is valid only for capturing images from a file.
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 18 of 19
Introduction to programming with OpenCV 4/1/11 4:18 PM
This only applies for capturing from a file. It does not seem to be working properly.
To view the captured frames during capture, add the following in the loop:
cvShowImage("mainWin", img);
key=cvWaitKey(20); // wait 20 ms
Note that without the 20[msec] delay the captured sequence is not displayed properly.
up previous
Gady Agam 2006-03-31
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-intro.html#SECTION00053000000000000000 Page 19 of 19