OpenCV编程简介(矩阵/图像/视频的基本读写操作)摘要:本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。一、简介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-root/docs/index.htm(译注:在你的OpenCV安装目录opencv-root内)(2)网络资源:官方网站:软件下载:(3)书籍:OpenSourceComputerVisionLibrarybyGaryR.Bradski,VadimPisarevsky,andJean-YvesBouguet,Springer,1sted.(June,2006).chenyusiyuan:补充以下书籍LearningOpenCV-ComputerVisionwiththeOpenCVLibrarybyGaryBradski&AdrianKaehler,O'ReillyMedia,1sted.(September,2008).OpenCV教程——基础篇作者:刘瑞祯于仕琪,北京航空航天大学出版社,出版日期:200706(4)视频处理例程(在opencv-root/samples/c/):颜色跟踪:camshiftdemo点跟踪:lkdemo动作分割:motempl边缘检测:laplace(5)图像处理例程(在opencv-root/samples/c/):边缘检测:edge图像分割:pyramid_segmentation形态学:morphology直方图:demhist距离变换:distrans椭圆拟合:fitellipse3、OpenCV命名规则[](1)函数名:cvActionTargetMod(...)Action=核心功能(corefunctionality)(e.g.set,create)Target=目标图像区域(targetimagearea)(e.g.contour,polygon)Mod=(可选的)调整语(optionalmodifiers)(e.g.argumenttype)[](2)矩阵数据类型:CV_bit_depth(S|U|F)Cnumber_of_channelsS=符号整型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)头文件:#includecv.h#includecvaux.h#includehighgui.h#includeml.h#includecxcore.h//一般不需要,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////该程序从文件中读入一幅图像,将之反色,然后显示出来.//////////////////////////////////////////////////////////////////////////#includestdlib.h#includestdio.h#includemath.h#includecv.h#includehighgui.hintmain(intargc,char*argv){IplImage*img=0;intheight,width,step,channels;uchar*data;inti,j,k;if(argc2){printf(Usage:mainimage-file-name\n\7);exit(0);}//loadanimageimg=cvLoadImage(argv[1]);if(!img){printf(Couldnotloadimagefile:%s\n,argv[1]);exit(0);}//gettheimagedataheight=img-height;width=img-width;step=img-widthStep;channels=img-nChannels;data=(uchar*)img-imageData;printf(Processinga%dx%dimagewith%dchannels\n,height,width,channels);//createawindowcvNamedWindow(mainWin,CV_WINDOW_AUTOSIZE);cvMoveWindow(mainWin,100,100);//inverttheimage//相当于cvNot(img);for(i=0;iheight;i++)for(j=0;jwidth;j++)for(k=0;kchannels;k++)data[i*step+j*channels+k]=255-data[i*step+j*channels+k];//showtheimagecvShowImage(mainWin,img);//waitforakeycvWaitKey(0);//releasetheimagecvReleaseImage(&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/heighinpixels2、输入处理(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