Professional Documents
Culture Documents
http://www.opencv.org.cn/index.php/OpenCV_%E7%BC%96%E7%A8%8B%E7%AE
%80%E4%BB%8B%EF%BC%88%E7%9F%A9%E9%98%B5/%E5%9B%BE
%E5%83%8F/%E8%A7%86%E9%A2%91%E7%9A%84%E5%9F%BA%E6%9C%AC
%E8%AF%BB%E5%86%99%E6%93%8D%E4%BD%9C%EF%BC%89
URL: http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/opencv-
intro.html#SECTION00040000000000000000
chenyusiyuan
http://blog.csdn.net/chenyusiyuan/archive/2010/01/26/5259060.aspx
OpenCV OpenCV
[]
1
1.1 1OpenCV
1.1.1 1
1.1.2 2
1.1.3 3 OpenCV
1.2 2
1.2.1 1
1.2.2 2
1.2.3 3
1.2.4 4 ( <opencv-root>/samples/c/):
1.2.5 5 ( <opencv-root>/samples/c/):
1.3 3OpenCV
1.3.1 1 :
1.3.2 2 :
1.3.3 3 :
1.3.4 4 :
1.4 4
1.4.1 1 Linux:
1.4.2 2 Windows:
1.5 5C
2 GUI
2.1 1
2.1.1 1 :
2.1.2 2 :
2.1.3 3 :
2.1.4 4 :
2.1.5 5 :
2.2 2
2.2.1 1 :
2.2.2 2 :
2.2.3 3 :
3 OpenCV
3.1 1
3.1.1 1 IPL :
3.2 2
3.2.1 1 :
3.2.2 2 :
3.2.3 3 :
3.3 3
3.3.1 1 :
3.3.2 2 :
3.3.3 3 :
4
4.1 1
4.1.1 1 :
4.1.2 2 :
4.1.3 3 :
4.1.4 4 / ROI:
4.1.5 5 / COI:
4.2 2
4.2.1 1 :
4.2.2 2 :
4.3 3
4.3.1 1 k i j
4.3.2 2 : ()
4.3.3 3 : ()
4.3.4 4 : ()
4.4.1 1 -:
4.4.2 2 ->:
4.4.3 3 :
4.5 5
4.5.1 1 :
4.5.2 2 :
4.5.3 3 :
4.5.4 4 :
4.5.5 5 :
4.5.6 6 :
5
5.1 1
5.1.1 1 :
5.1.2 2 :
5.1.3 3 :
5.1.4 4 :
5.1.5 5 :
5.1.6 6 :
5.2 2
5.2.1 1 2D i, j.
5.2.2 2 :
5.2.3 3 4 :
5.2.4 4 possible
alignment gaps:
5.2.5 5 :
5.3 3/
5.3.1 1 :
5.3.2 2 :
5.3.3 3 :
5.3.4 4 :
5.3.5 5 :
5.3.6 6 ():
6
6.1 1
6.1.2 2 :
6.1.3 3 :
6.1.4 4 :
6.1.5 5 :
6.2 2/
6.2.1 1 :
6.2.2 2 :
6.2.3 3 :
6.3 3
6.3.1 1 :
6.3.2 2 :
6.3.3 3 :
[]
[]
1 OpenCV
[]
OpenCV C/C++
API
//
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).
Basic image processing (filtering, edge detection, corner detection, sampling and
interpolation, color conversion, morphological operations, histograms, image
pyramids).
/
HMM
GUI//
[]
3 OpenCV
cv
cvaux
cxcore
highgui GUI
ml
[]
2
[]
1
[]
2
: http://www.intel.com/technology/computing/opencv/
: http://sourceforge.net/projects/opencvlibrary/
[]
3
by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June,
2006). chenyusiyuan:
by Gary Bradski & Adrian Kaehler, O'Reilly Media, 1 st ed. (September, 2008).
OpenCV
200706
[]
4 ( <opencv-root>/samples/c/):
: camshiftdemo
: lkdemo
: motempl
: laplace
[]
5 ( <opencv-root>/samples/c/):
: edge
: pyramid_segmentation
: morphology
: demhist
: distrans
: fitellipse
[]
3OpenCV
[]
1 :
cvActionTargetMod(...)
Action = core functionality (e.g. set, create)
Target = target image area (e.g. contour, polygon)
Mod = optional modifiers (e.g. argument type)
[]
2 :
CV_<bit_depth>(S|U|F)C<number_of_channels>
S =
U =
F =
E.g.: CV_8UC1 8 ,
CV_32FC2 32 .
[]
3 :
IPL_DEPTH_<bit_depth>(S|U|F)
E.g.: IPL_DEPTH_8U 8 .
IPL_DEPTH_32F 32 .
[]
4 :
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <ml.h>
#include <cxcore.h>
// cv.h
[]
4
[]
1 Linux:
g++ hello-world.cpp -o hello-world \
-I /usr/local/include/opencv -L /usr/local/lib
-lm -lcv -lhighgui -lcvaux
[]
2 Windows:
Visual Studio OpenCV
[]
5C
///////////////////////////////////////////////////////////////
/////////
//
// hello-world.cpp
//
// .
//
///////////////////////////////////////////////////////////////
/////////
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char *argv[])
{
IplImage* img = 0;
int height,width,step,channels;
uchar *data;
int i,j,k;
if(argc<2){
printf("Usage: main <image-file-name>\n\7");
exit(0);
}
// load an image
img=cvLoadImage(argv[1]);
if(!img){
printf("Could not load image file: %s\n",argv[1]);
exit(0);
}
// get the image data
height
= img->height;
width
= img->width;
step
= img->widthStep;
channels = img->nChannels;
data
= (uchar *)img->imageData;
printf("Processing a %dx%d image with %d
channels\n",height,width,channels);
// create a window
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin", 100, 100);
// invert the image
// cvNot(img);
for(i=0;i<height;i++) for(j=0;j<width;j++)
for(k=0;k<channels;k++)
data[i*step+j*channels+k]=255-data[i*step+j*channels+k];
[]
GUI
[]
1
[]
1 :
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("win1", 100, 100); // offset from the UL corner
of the screen
[]
2 :
IplImage* img=0;
img=cvLoadImage(fileName, CV_LOAD_IMAGE_COLOR);
if(!img) printf("Could not load image file: %s\n",fileName);
[]
3 :
cvShowImage("win1",img);
/[0-255]
[0-1] BGR--
[]
4 :
cvDestroyWindow("win1");
[]
5 :
cvResizeWindow("win1",100,100); // new width/heigh in pixels
[]
2
[]
1 :
:
mouseParam=5;
cvSetMouseCallback("win1",mouseHandler,&mouseParam);
NULL
[]
2 :
int key;
key=cvWaitKey(10); // wait 10ms for input
int key;
key=cvWaitKey(0); // wait indefinitely for input
while(1){
key=cvWaitKey(10);
if(key==27) break;
switch(key){
case 'h':
...
break;
case 'i':
...
break;
}
}
[]
3 :
//
int trackbarVal=25;
int maxVal=100;
cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal ,
trackbarHandler);
[]
OpenCV
OpenCV 1.11.2 2.0
[]
1
[]
1 IPL :
IplImage
|-- int
|-- int
|
|
|
nChannels;
depth;
// (1,2,3,4)
// :
//
IPL_DEPTH_8U, IPL_DEPTH_8S,
//
IPL_DEPTH_16U,IPL_DEPTH_16S,
//
IPL_DEPTH_32S,IPL_DEPTH_32F,
|
|-|-|-|
|--
int width;
int height;
char* imageData;
int
dataOrder;
//
//
//
//
//
//
IPL_DEPTH_64F
BGR
0 -
// 1 -
|
// cvCreateImage
|
//
|-- char *imageDataOrigin;
|
|
deallocation
|-- int align;
//
alignment
|
//
|-- char colorModel[4]; //
ROI .
//
// ( )
// needed for correct image
: 4 or 8 byte
OpenCV widthStep
OpenCV
[]
2
[]
1 :
CvMat
// 2D
|-- int
type;
//
(uchar,short,int,float,double)
|-- int
step;
//
|-- int
rows, cols;
//
|-- int
height, width; // rowscols
|-- union data;
|
|-- short* s;
|
|-- int*
i;
matrix
|
|-- float* fl;
|
|-- double* db;
|
|-- struct dim[];
|-- size;
|-- step;
CvSparseMat // N-
[]
2 :
CvArr*
//
//
//
//
[]
3 :
CvScalar
|-- double val[4]; //4D
:
C++
cvMat CvMatcvPoint CvPoint
[]
3
[]
1 :
CvPoint
p = cvPoint(int x, int y);
CvPoint2D32f p = cvPoint2D32f(float x, float y);
CvPoint3D32f p = cvPoint3D32f(float x, float y, float z);
//E.g.:
p.x=5.0;
p.y=5.0;
[]
2 :
CvSize
CvSize2D32f
[]
3 :
CvRect
[]
[]
1
[]
1 :
[]
4 / ROI:
void cvSetImageROI(IplImage* image, CvRect rect);
void cvResetImageROI(IplImage* image);
CvRect cvGetImageROI(const IplImage* image);
OpenCV ROI.
[]
5 / COI:
void cvSetImageCOI(IplImage* image, int coi); // 0=all
int cvGetImageCOI(const IplImage* image);
OpenCV COI.
[]
2
[]
1 :
IplImage* img=0;
img=cvLoadImage(fileName);
if(!img) printf("Could not load image file: %s\n",fileName);
: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM,
SR, RAS, TIFF, TIF
OpenCV .
:
img=cvLoadImage(fileName,flag);
flag: >0
=0
<0 .
[]
2 :
if(!cvSaveImage(outFileName,img)) printf("Could not save:
%s\n", outFileName);
outFileName .
[]
3
[]
1 k i j
[]
2 : ( )
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
CvScalar s;
s=cvGet2D(img,i,j); // get the (j,i) pixel value, cvGet2D
cvSet2D opencv .
i y height;j x weight.
printf("intensity=%f\n",s.val[0]);
s.val[0]=111;
cvSet2D(img,i,j,s); // set the (j,i) pixel value
/:
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
[]
3 : ()
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
((uchar *)(img->imageData + i*img->widthStep))[j]=111;
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
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels
+ 0]=111; // B
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels
+ 1]=112; // G
((float *)(img->imageData + i*img->widthStep))[j*img->nChannels
+ 2]=113; // R
[]
4 : ()
IplImage* img
int height
int width
int step
uchar* data
data[i*step+j]
=
=
=
=
=
=
cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
img->height;
img->width;
img->widthStep/sizeof(uchar);
(uchar *)img->imageData;
111;
4 32 :
IplImage* img =
cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
int height
= img->height;
int width
= img->width;
int step
= img->widthStep/sizeof(float);
int channels
= img->nChannels;
float * data
= (float *)img->imageData;
data[i*step+j*channels+k] = 111;
[]
5 c++ wrapper :
Image<RgbPixel>
Image<RgbPixelFloat>
Image<unsigned char>
Image<float>
RgbImage;
RgbImageFloat;
BwImage;
BwImageFloat;
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
BwImage imgA(img);
imgA[i][j] = 111;
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;
IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);
RgbImageFloat imgA(img);
imgA[i][j].b = 111;
imgA[i][j].g = 111;
imgA[i][j].r = 111;
[]
4
[]
1 -:
cvConvertImage(src, dst, flags=0);
src = float/byte grayscale/color image
dst = byte grayscale/color image
flags = CV_CVTIMG_FLIP
()
CV_CVTIMG_SWAP_RB ( R B )
[]
2 ->:
// Using the OpenCV conversion:
cvCvtColor(cimg,gimg,CV_BGR2GRAY); // cimg -> gimg
// Using a direct conversion:
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);
[]
3 :
cvCvtColor(src,dst,code); // src -> dst
code = CV_<X>2<Y>
<X>/<Y> = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
e.g.: CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab
[]
5
[]
1 :
// (100,100) (200,200) 1
cvRectangle(img, cvPoint(100,100), cvPoint(200,200),
cvScalar(255,0,0), 1);
[]
2 :
// (100,100) 20. 1
cvCircle(img, cvPoint(100,100), 20, cvScalar(0,255,0), 1);
[]
3 :
// (100,100) (200,200) 1
cvLine(img, cvPoint(100,100), cvPoint(200,200),
cvScalar(0,255,0), 1);
[]
4 :
CvPoint
CvPoint
CvPoint*
int
int
int
int
100,10};
130,30, 150,10};
cvPolyLine(img,curveArr,nCurvePts,nCurves,isCurveClosed,cvScala
r(0,255,255),lineWidth);
void cvPolyLine( CvArr* img, CvPoint** pts, int* npts, int
contours, int is_closed,
pts
npts
pts
contours
is_closed
color
thickness
line_type cvLine
shift
[]
5 :
cvFillPoly(img,curveArr,nCurvePts,nCurves,cvScalar(0,255,255));
cvFillPoly
,
void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int
contours,CvScalar color, int line_type=8, int shift=0 );
img
pts
npts
contours
color
line_type
shift
[]
6 :
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);
cvPutText (img,"My comment",cvPoint(200,400), &font,
cvScalar(255,255,0));
: CV_FONT_HERSHEY_SIMPLEX, CV_FONT_HERSHEY_PLAIN,
CV_FONT_HERSHEY_DUPLEX, CV_FONT_HERSHEY_COMPLEX,
CV_FONT_HERSHEY_TRIPLEX, CV_FONT_HERSHEY_COMPLEX_SMALL,
CV_FONT_HERSHEY_SCRIPT_SIMPLEX, CV_FONT_HERSHEY_SCRIPT_COMPLEX,
[]
[]
1
[]
1 :
OpenCV C C++
OpenCV 1 N .
- 4 32 .
[]
2 :
CvMat* cvCreateMat(int rows, int cols, int type);
type: .
CV_<bit_depth>(S|U|F)C<number_of_channels> . :
CV_8UC1 CV_32SC2.
:
CvMat* M = cvCreateMat(4,4,CV_32FC1);
[]
3 :
CvMat* M = cvCreateMat(4,4,CV_32FC1);
cvReleaseMat(&M);
[]
4 :
CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
CvMat* M2;
M2=cvCloneMat(M1);
[]
5 :
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
CvMat Ma=cvMat(3, 4, CV_64FC1, a);
//:
CvMat Ma;
cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);
[]
6 :
CvMat* M = cvCreateMat(4,4,CV_32FC1);
cvSetIdentity(M); // does not seem to be working properly
[]
2
[]
1 2D i, j.
[]
2 :
cvmSet(M,i,j,2.0); // Set M(i,j)
t = cvmGet(M,i,j); // Get M(i,j)
[]
3 4 :
CvMat* M
int n
float *data
data[i*n+j]
=
=
=
=
cvCreateMat(4,4,CV_32FC1);
M->cols;
M->data.fl;
3.0;
[]
4 possible alignment gaps:
CvMat* M
= cvCreateMat(4,4,CV_32FC1);
int
step = M->step/sizeof(float);
float *data = M->data.fl;
(data+i*step)[j] = 3.0;
[]
5 :
double a[16];
CvMat Ma = cvMat(3, 4, CV_64FC1, a);
a[i*4+j] = 2.0; // Ma(i,j)=2.0;
[]
3/
[]
1 :
CvMat *Ma, *Mb, *Mc;
cvAdd(Ma, Mb, Mc);
cvSub(Ma, Mb, Mc);
cvMatMul(Ma, Mb, Mc);
// Ma+Mb
// Ma-Mb
// Ma*Mb
-> Mc
-> Mc
-> Mc
[]
2 :
CvMat *Ma, *Mb, *Mc;
cvMul(Ma, Mb, Mc);
// Ma.*Mb -> Mc
cvDiv(Ma, Mb, Mc);
// Ma./Mb -> Mc
cvAddS(Ma, cvScalar(-10.0), Mc); // Ma.-10 -> Mc
[]
3 :
double va[] = {1, 2, 3};
double vb[] = {0, 0, 1};
double vc[3];
CvMat Va=cvMat(3, 1, CV_64FC1, va);
CvMat Vb=cvMat(3, 1, CV_64FC1, vb);
CvMat Vc=cvMat(3, 1, CV_64FC1, vc);
double res=cvDotProduct(&Va,&Vb); // :
cvCrossProduct(&Va, &Vb, &Vc);
// :
Va, Vb, Vc 3 .
[]
4 :
CvMat *Ma, *Mb;
Va . Vb -> res
Va x Vb -> Vc
cvTranspose(Ma, Mb);
Ma )
CvScalar t = cvTrace(Ma);
double d = cvDet(Ma);
cvInvert(Ma, Mb);
// transpose(Ma) -> Mb (
// trace(Ma) -> t.val[0]
// det(Ma) -> d
// inv(Ma) -> Mb
[]
5 :
CvMat* A =
CvMat* x =
CvMat* b =
cvSolve(&A,
cvCreateMat(3,3,CV_32FC1);
cvCreateMat(3,1,CV_32FC1);
cvCreateMat(3,1,CV_32FC1);
&b, &x);
// solve (Ax=b) for x
[]
6 ():
CvMat* A = cvCreateMat(3,3,CV_32FC1);
CvMat* E = cvCreateMat(3,3,CV_32FC1);
CvMat* l = cvCreateMat(3,1,CV_32FC1);
cvEigenVV(A, E, l); // l = A ()
// E = ()
7 SVD:====
CvMat* A =
CvMat* U =
CvMat* D =
CvMat* V =
cvSVD(A, D,
cvCreateMat(3,3,CV_32FC1);
cvCreateMat(3,3,CV_32FC1);
cvCreateMat(3,3,CV_32FC1);
cvCreateMat(3,3,CV_32FC1);
U, V, CV_SVD_U_T|CV_SVD_V_T); // A = U D V^T
U V ().
[]
[]
1
[]
1 OpenCV AVI .
[]
2 :
IplImage*
cvQueryFrame()
[]
5 :
cvReleaseCapture(&capture);
[]
2 /
[]
1 :
cvQueryFrame(capture); //
int frameH
= (int) cvGetCaptureProperty(capture,
CV_CAP_PROP_FRAME_HEIGHT);
int frameW
= (int) cvGetCaptureProperty(capture,
CV_CAP_PROP_FRAME_WIDTH);
int fps
= (int) cvGetCaptureProperty(capture,
CV_CAP_PROP_FPS);
[]
2 :
float posMsec
=
cvGetCaptureProperty(capture,
CV_CAP_PROP_POS_MSEC);
int posFrames
= (int) cvGetCaptureProperty(capture,
CV_CAP_PROP_POS_FRAMES);
float posRatio =
cvGetCaptureProperty(capture,
CV_CAP_PROP_POS_AVI_RATIO);
,
0.
0 1. .
[]
3 :
// start capturing from a relative position of 0.9 of a video
file
cvSetCaptureProperty(capture, CV_CAP_PROP_POS_AVI_RATIO,
(double)0.9);
[]
3
[]
1 :
CvVideoWriter *writer = 0;
int isColor = 1;
int fps
= 25; // or 30
int frameW = 640; // 744 for firewire cameras
int frameH = 480; // 480 for firewire cameras
writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1')
,
fps,cvSize(frameW,frameH),isColor);