openCV快速入门.docx
《openCV快速入门.docx》由会员分享,可在线阅读,更多相关《openCV快速入门.docx(90页珍藏版)》请在冰豆网上搜索。
openCV快速入门
摘要:
本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。
掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。
目录
[隐藏]
1一、简介
1.11、OpenCV的特点
1.1.1
(1)总体描述
1.1.2
(2)功能
1.1.3(3)OpenCV模块
1.22、有用的学习资源
1.2.1
(1)参考手册:
1.2.2
(2)网络资源:
1.2.3(3)书籍:
1.2.4(4)视频处理例程(在/samples/c/):
1.2.5(5)图像处理例程(在/samples/c/):
1.33、OpenCV命名规则
1.3.1
(1)函数名:
1.3.2
(2)矩阵数据类型:
1.3.3(3)图像数据类型:
1.3.4(4)头文件:
1.44、编译建议
1.4.1
(1)Linux:
1.4.2
(2)Windows:
1.55、C例程
2二、GUI指令
2.11、窗口管理
2.1.1
(1)创建和定位一个新窗口:
2.1.2
(2)载入图像:
2.1.3(3)显示图像:
2.1.4(4)关闭窗口:
2.1.5(5)改变窗口大小:
2.22、输入处理
2.2.1
(1)处理鼠标事件:
2.2.2
(2)处理键盘事件:
2.2.3(3)处理滑动条事件:
3三、OpenCV的基本数据结构
3.11、图像数据结构
3.1.1
(1)IPL图像:
3.22、矩阵与向量
3.2.1
(1)矩阵:
3.2.2
(2)一般矩阵:
3.2.3(3)标量:
3.33、其它结构类型
3.3.1
(1)点:
3.3.2
(2)矩形框大小(以像素为精度):
3.3.3(3)矩形框的偏置和大小:
4四、图像处理
4.11、图像的内存分配与释放
4.1.1
(1)分配内存给一幅新图像:
4.1.2
(2)释放图像:
4.1.3(3)复制图像:
4.1.4(4)设置/获取感兴趣区域ROI:
4.1.5(5)设置/获取感兴趣通道COI:
4.22、图像读写
4.2.1
(1)从文件中读入图像:
4.2.2
(2)保存图像:
4.33、访问图像像素
4.3.1
(1)假设你要访问第k通道、第i行、第j列的像素。
4.3.2
(2)间接访问:
(通用,但效率低,可访问任意格式的图像)
4.3.3(3)直接访问:
(效率高,但容易出错)
4.3.4(4)基于指针的直接访问:
(简单高效)
4.3.5(5)基于c++wrapper的直接访问:
(更简单高效)
4.44、图像转换
4.4.1
(1)字节型图像的灰度-彩色转换:
4.4.2
(2)彩色图像->灰度图像:
4.4.3(3)不同彩色空间之间的转换:
4.55、绘图指令
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.11、矩阵的内存分配与释放
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.22、访问矩阵元素
5.2.1
(1)假设需要访问一个2D浮点型矩阵的第(i,j)个单元.
5.2.2
(2)间接访问:
5.2.3(3)直接访问(假设矩阵数据按4字节行对齐):
5.2.4(4)直接访问(当数据的行对齐可能存在间隙时possiblealignmentgaps):
5.2.5(5)对于初始化后的矩阵进行直接访问:
5.33、矩阵/向量运算
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.11、从视频流中捕捉一帧画面
6.1.1
(1)OpenCV支持从摄像头或视频文件(AVI格式)中捕捉帧画面.
6.1.2
(2)初始化一个摄像头捕捉器:
6.1.3(3)初始化一个视频文件捕捉器:
6.1.4(4)捕捉一帧画面:
6.1.5(5)释放视频流捕捉器:
6.22、获取/设置视频流信息
6.2.1
(1)获取视频流设备信息:
6.2.2
(2)获取帧图信息:
6.2.3(3)设置从视频文件抓取的第一帧画面的位置:
6.33、保存视频文件
6.3.1
(1)初始化视频编写器:
6.3.2
(2)保持视频文件:
6.3.3(3)释放视频编写器:
[编辑]
一、简介
[编辑]
1、OpenCV的特点
[编辑]
(1)总体描述
OpenCV是一个基于C/C++语言的开源图像处理函数库
其代码都经过优化,可用于实时处理图像
具有良好的可移植性
可以进行图像/视频载入、保存和采集的常规操作
具有低级和高级的应用程序接口(API)
提供了面向IntelIPP高效多媒体函数库的接口,可针对你使用的IntelCPU优化代码,提高程序性能(译注:
OpenCV2.0版的代码已显着优化,无需IPP来提升性能,故2.0版不再提供IPP接口)
[编辑]
(2)功能
图像数据操作(内存分配与释放,图像复制、设定和转换)
Imagedatamanipulation(allocation,release,copying,setting,conversion).
图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)
ImageandvideoI/O(fileandcamerabasedinput,image/videofileoutput).
矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)
Matrixandvectormanipulationandlinearalgebraroutines(products,solvers,eigenvalues,SVD).
支持多种动态数据结构(链表、队列、数据集、树、图)
Variousdynamicdatastructures(lists,queues,sets,trees,graphs).
基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)
Basicimageprocessing(filtering,edgedetection,cornerdetection,samplingandinterpolation,colorconversion,morphologicaloperations,histograms,imagepyramids).
结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)
Structuralanalysis(connectedcomponents,contourprocessing,distancetransform,variousmoments,templatematching,Houghtransform,polygonalapproximation,linefitting,ellipsefitting,Delaunaytriangulation).
摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)
Cameracalibration(findingandtrackingcalibrationpatterns,calibration,fundamentalmatrixestimation,homographyestimation,stereocorrespondence).
运动分析(光流、动作分割、目标跟踪)
Motionanalysis(opticalflow,motionsegmentation,tracking).
目标识别(特征方法、HMM模型)
Objectrecognition(eigen-methods,HMM).
基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条)
BasicGUI(displayimage/video,keyboardandmousehandling,scroll-bars).
图像标注(直线、曲线、多边形、文本标注)
Imagelabeling(line,conic,polygon,textdrawing)
[编辑]
(3)OpenCV模块
cv–核心函数库
cvaux–辅助函数库
cxcore–数据结构与线性代数库
highgui–GUI函数库
ml–机器学习函数库
[编辑]
2、有用的学习资源
[编辑]
(1)参考手册:
/docs/index.htm(译注:
在你的OpenCV安装目录内)
[编辑]
(2)网络资源:
官方网站:
软件下载:
[编辑]
(3)书籍:
OpenSourceComputerVisionLibrary
byGaryR.Bradski,VadimPisarevsky,andJean-YvesBouguet,Springer,1sted.(June,2006).chenyusiyuan:
补充以下书籍
LearningOpenCV-ComputerVisionwiththeOpenCVLibrary
byGaryBradski&AdrianKaehler,O'ReillyMedia,1sted.(September,2008).
OpenCV教程——基础篇
作者:
刘瑞祯于仕琪,北京航空航天大学出版社,出版日期:
200706
[编辑]
(4)视频处理例程(在/samples/c/):
颜色跟踪:
camshiftdemo
点跟踪:
lkdemo
动作分割:
motempl
边缘检测:
laplace
[编辑]
(5)图像处理例程(在/samples/c/):
边缘检测:
edge
图像分割:
pyramid_segmentation
形态学:
morphology
直方图:
demhist
距离变换:
distrans
椭圆拟合:
fitellipse
[编辑]
3、OpenCV命名规则
[编辑]
(1)函数名:
cvActionTargetMod(...)
Action=核心功能(corefunctionality)(e.g.set,create)
Target=目标图像区域(targetimagearea)(e.g.contour,polygon)
Mod=(可选的)调整语(optionalmodifiers)(e.g.argumenttype)
[编辑]
(2)矩阵数据类型:
CV_(S|U|F)C
S=符号整型
U=无符号整型
F=浮点型
E.g.:
CV_8UC1是指一个8位无符号整型单通道矩阵,
CV_32FC2是指一个32位浮点型双通道矩阵.
[编辑]
(3)图像数据类型:
IPL_DEPTH_(S|U|F)
E.g.:
IPL_DEPTH_8U图像像素数据是8位无符号整型.
IPL_DEPTH_32F图像像素数据是32位浮点型.
[编辑]
(4)头文件:
#include
#include
#include
#include
#include//一般不需要,cv.h内已包含该头文件
[编辑]
4、编译建议
[编辑]
(1)Linux:
g++hello-world.cpp-ohello-world\
-I/usr/local/include/opencv-L/usr/local/lib\
-lm-lcv-lhighgui-lcvaux
[编辑]
(2)Windows:
在VisualStudio的‘选项’和‘项目’中设置好OpenCV相关文件的路径。
[编辑]
5、C例程
////////////////////////////////////////////////////////////////////////
//
//hello-world.cpp
//
//该程序从文件中读入一幅图像,将之反色,然后显示出来.
//
////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
intmain(intargc,char*argv[])
{
IplImage*img=0;
intheight,width,step,channels;
uchar*data;
inti,j,k;
if(argc<2){
printf("Usage:
main\n\7");
exit(0);
}
//loadanimage
img=cvLoadImage(argv[1]);
if(!
img){
printf("Couldnotloadimagefile:
%s\n",argv[1]);
exit(0);
}
//gettheimagedata
height=img->height;
width=img->width;
step=img->widthStep;
channels=img->nChannels;
data=(uchar*)img->imageData;
printf("Processinga%dx%dimagewith%dchannels\n",height,width,channels);
//createawindow
cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin",100,100);
//inverttheimage
//相当于cvNot(img);
for(i=0;idata[i*step+j*channels+k]=255-data[i*step+j*channels+k];
//showtheimage
cvShowImage("mainWin",img);
//waitforakey
cvWaitKey(0);
//releasetheimage
cvReleaseImage(&img);
return0;
}
[编辑]
二、GUI指令
[编辑]
1、窗口管理
[编辑]
(1)创建和定位一个新窗口:
cvNamedWindow("win1",CV_WINDOW_AUTOSIZE);
cvMoveWindow("win1",100,100);//offsetfromtheULcornerofthescreen
[编辑]
(2)载入图像:
IplImage*img=0;
img=cvLoadImage(fileName);
if(!
img)printf("Couldnotloadimagefile:
%s\n",fileName);
[编辑]
(3)显示图像:
cvShowImage("win1",img);
该函数可以显示彩色或灰度的字节型/浮点型图像。
字节型图像像素值范围为[0-255];浮点型图像像素值范围为[0-1]。
彩色图像的三色元素按BGR(蓝-红-绿)顺序存储。
[编辑]
(4)关闭窗口:
cvDestroyWindow("win1");
[编辑]
(5)改变窗口大小:
cvResizeWindow("win1",100,100);//newwidth/heighinpixels
[编辑]
2、输入处理
[编辑]
(1)处理鼠标事件:
定义一个鼠标处理程序:
voidmouseHandler(intevent,intx,inty,intflags,void*param)
{
switch(event){
caseCV_EVENT_LBUTTONDOWN:
if(flags&CV_EVENT_FLAG_CTRLKEY)
printf("LeftbuttondownwithCTRLpressed\n");
break;
caseCV_EVENT_LBUTTONUP:
printf("Leftbuttonup\n");
break;
}
}
x,y:
相对于左上角的像素坐标
event:
CV_EVENT_LBUTTONDOWN,CV_EVENT_RBUTTONDOWN,CV_EVENT_MBUTTONDOWN,
CV_EVENT_LBUTTONUP,CV_EVENT_RBUTTONUP,CV_EVENT_MBUTTONUP,
CV_EVENT_LBUTTONDBLCLK,CV_EVENT_RBUTTONDBLCLK,CV_EVENT_MBUTTONDBLCLK,
CV_EVENT_MOUSEMOVE:
flags:
CV_EVENT_FLAG_CTRLKEY,CV_EVENT_FLAG_SHIFTKEY,CV_EVENT_FLAG_ALTKEY,
CV_EVENT_FLAG_LBUTTON,CV_EVENT_FLAG_RBUTTON,CV_EVENT_FLAG_MBUTTON
注册该事件处理程序:
mouseParam=5;
cvSetMouseCallback("win1",mouseHandler,&mouseParam);
[编辑]
(2)处理键盘事件:
实际上对于键盘输入并没有专门的事件处理程序.
按一定间隔检测键盘输入(适用于循环体中):
intkey;
key=cvWaitKey(10);//wait10msforinput
中止程序等待键盘输入:
intkey;
key=cvWaitKey(0);//waitindefinitelyforinput
键盘输入的循环处理程序:
while
(1){
key=cvWaitKey(10);
if(key==27)break;
switch(key){
case'h':
...
break;
case'i':
...
break;
}
}
[编辑]
(3)处理滑动条事件:
定义一个滑动条处理程序:
voidtrackbarHandler(intpos)
{
printf("Trackbarposition:
%d\n",pos);
}
注册该事件处理程序:
inttrackbarVal=25;
intmaxVal=100;
cvCreateTrackbar("bar1","win1",&trackbarVal,maxVal,trackbarHandler);
获取当前的滑动条位置:
intpos=cvGetTrackbarPos("bar1","win1");
设置滑动条位置:
cvSetTrackbarPos("bar1","win1",25);
[编辑]
三、OpenCV的基本数据结构
(译注:
OpenCV1.1、1.2或2.0版本中各数据结构的结构体元素有所调整,以下仅作参考)
[编辑]
1、图像数据结构
[编辑]
(1)IPL图像:
IplImage
|--intnChannels;//颜