openCV快速入门.docx
- 文档编号:4295652
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:31
- 大小:30.55KB
openCV快速入门.docx
《openCV快速入门.docx》由会员分享,可在线阅读,更多相关《openCV快速入门.docx(31页珍藏版)》请在冰豆网上搜索。
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)视频处理例程(在
1.2.5(5)图像处理例程(在
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)参考手册:
在你的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)视频处理例程(在
颜色跟踪:
camshiftdemo点跟踪:
lkdemo动作分割:
motempl边缘检测:
laplace
[编辑]
(5)图像处理例程(在
边缘检测:
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=浮点型
E.g.:
CV_8UC1是指一个8位无符号整型单通道矩阵,
CV_32FC2是指一个32位浮点型双通道矩阵.
[编辑]
(3)图像数据类型:
IPL_DEPTH_
E.g.:
IPL_DEPTH_8U图像像素数据是8位无符号整型.
IPL_DEPTH_32F图像像素数据是32位浮点型.
[编辑]
(4)头文件:
#include
#include
#include
#include
#include
[编辑]
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
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;i data[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;//颜色通道数目(1,2,3,4) |--intdepth;//像素的位深: |//IPL_DEPTH_8U,IPL_DEPTH_8S, |//IPL_DEPTH_16U,IPL_DEPTH_16S, |//IPL_DEPTH_32S,IPL_DEPTH_32F, |//IPL_DEPTH_64F |--intwidth;//图像宽度(像素为单位) |--intheight;//图像高度 |--char*imageData;//图像数据指针 |//注意彩色图像按BGR顺序存储数据 |--intdataOrder;//0-将像素点不同通道的值交错排在一起,形成单一像素平面 |//1-把所有像素同通道值排在一起,形成若干个通道平面,再把平面排列起来 |//cvCreateImage只能创建像素交错排列式的图像 |--intorigin;//0–像素原点为左上角, |//1–像素原点为左下角(Windowsbitmapsstyle) |--intwidthStep;//相邻行的同列点之间的字节数 |--intimageSize;//图像的大小(字节为单位)=height*widthStep |--struct_IplROI*roi;//图像的感兴趣区域(ROI).R
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- openCV 快速 入门