OpenCV 是有Intel公司资助的开源计算机视觉库,它由一系列C函数和少量C++类构成,实现图像处理和计算机视觉方面的很多通用算法。
1、OpenCV的特征
(1)开源计算机视觉库采用C/C++编写 (2)使用目的是开发实时的应用程序 (3)独立于操作系统、硬件和图形管理器
(4)具有通用的图像/视频载入、保存和获取模块 (5)具有底层和高层的应用开发包
2、OpenCV的功能
(1)对图像数据的操作,包括分配、释放、复制、设置和转换数据
(2)对图像和视频的输入输出,指文件和摄像头作为输入,图像和视频文件作为输出 (3)具有对矩阵和向量的操作及线性代数的算法程序,包括矩阵积、解方程、特征值以及奇异值
(4)可对各种动态数据结构,如列表、队列、集合、树和图等进行操作
(5)具有基本的数字图像处理能力,如可以进行滤波、边缘检测、角点检测、采样于差值、色彩转换、形态操作、直方图和图像金字塔等操作
(6)对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hough变换、多边行逼近、直线拟合、椭圆拟合、和Delaunay三角划分等
(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应
(8)对运动的分析,如对光流、运动分割和跟踪的分析
(9)对目标的识别,如可采用特征法和隐马尔科夫模型(HMM)法
(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等 (11)课对图像标注,如对线,二次曲线和多边行进行标注
3.OpenCV模块
cv – 核心函数库 cvaux – 辅助函数库
cxcore – 数据结构与线性代数库 highgui – GUI函数库 ml – 机器学习函数库
第3章 OpenCV基础
3.1 OpenCV命名规则
1、函数命名规则
通用函数名为 cvActionTargetMod(„„) 其中,Action 表示核心函数(如:set,create) Target表示目标图像区域(如:轮廓,多边形) Mod表示可选变种(如:变量类型)
2、矩阵数据类型
通用矩阵数据类型为 CV_ 例如:CV_8UC1表示8位无符号单通道矩阵 3、图像数据类型 通用图像数据类型为 IPL_DEPTH_ 4、头文件 #include #include 3.2基本数据结构 1、图像结构 OpenCV中德所有图像采用同一个结构IplImage 2、矩阵与向量结构 OpenCV采用一种独特的结构CvArr*,该结构是一个通用数组的变现形式,用做函数的参数,说明函数在调用该函数时接受多种类型的输入数据形式。 3、其他数据结构 (1)点的表示 点的数据结构有以下三种: CvPoint p=cvPoint(int x,int y) CvPoint2D32f p=CvPoint2D32f(float x,float y) CvPoint2D32f p=CvPoint2D32f(float x,float y,float z) (2)长方形维数的表示 表示长方形维数的数据结构及用法 CvSize r=cvSize(int width,int height) CvSizeD32f r=cvSize32f(float width,float height) (3)有偏移量的长方形表示 CvRect r=cvRect(int x,int y,int width, int height) 3.3 矩阵的使用与操作 3.3.1 分配与释放矩阵 在OpenCV中,向量被当成行货列为1的矩阵,并且矩阵在内存中德存储方式是按行存储,且每行按4字节对齐。 (1)分配矩阵 分配矩阵的函数原型为: CvMat* cvCreateMat(int rows,int cols,int type) 其中type表示矩阵元素的类型,可以用如下形式表达 CV_ 释放矩阵的函数原型为 void cvReleaseMat(CvMat**) (3)复制矩阵 复制矩阵的函数原型 CvMat *cvCloneMat(CvMat*) 3.3.2 访问矩阵元素 若访问一个浮点数矩阵的第i行第j列元素,可采用以下几种方式 (1)直接访问M(i,j) cvmSet(M,i,j,2.0)//SET M(i,j) (2)已知对齐方式的直接访问 3.4 GUI命令 3.4.1 窗口管理 (1)创建及定位一个窗口 cvNamedWindow(\"wins\ cvMovewindow(\"win1\",100,100)//偏移量从屏幕的左上角算起 (2)加载一副图像 具体事例 IplImage * image=0; Img=cvLoadImage(fileName) If(img)printf(“Could not load image file:%s \\n”,filename); (3)显示一副画像 具体操作语句实例为:cvShowImage(\"win1\(4)关闭窗口 cvDestroyWindow(“win1”) (5)缩放窗口 cvResizeWindow(“win1”,100,100) IplImage数据结构 IplImage结构 Typedef struct _IplImage{ Int nSize; Int ID; Int nChannels; Int alphaChannel; Int depth; Char colorModel[4]; Char channelSeq; Int dataOrder;//////值可以是IPL_DATA_ORDER_PIXE指明数据将像素点不同通道的值交错排在一起和LIPL_DATA_ORDER_PLANE把所有的像素同通道值排在一起,形成通道平面,在把平面排列在一起; Int origin;/////////有两种取值:IPL_ORIGIN_TL和IPL_ORIGIN_BL分别是设置坐标原点位于图像的左上角或左下角 Int aligin; Int width; Int height; Struct _IplTOI* roi; Struct _IplImage* maskROI; Void* imaged; Strcut _IplTileInfo* tileInfo; Int imageSize; Char* imageData;//////////包含一个指向第一行图像数据的指针 Int widthStep; /////////包括相邻行的同列点之间的字节数 Int borderMode[4]; Int BorderConst[4]; Char* imageDataOrigin; } IplImage; 对ROI和widthStep的补充 设置ROI可以使用函数cvSetImageROI()并为其传递一个图像指针和矩形; 取消ROI,只需要为函数cvRestImageROI()传递一个图像指针。 Void cvSetImageROI(IplImage* image, CvRect rect); cvRestImageROI(IplImage* image); 矩阵和图像的操作 矩阵和图像的基本操作 1、cvAbs 计算数组中所有元素的绝对值 2、cvAbsDiff 计算两个数组差值的绝对值 3、cvAbsDiffS 计算数组和标量差值的绝对值 4、cvAdd 两个数组的元素级的加运算 5、cvAddS 一个数组和一个标量的元素级的相加运算 6、cvAddWeighted 两个数组的元素级的加权相加运算 7、cvAvg 计算数组中所有元素的平均值 8、cvAvgSdv 计算数组中所有元素的绝对值和标准差 9、cvCalcCovarMatrix 计算一组n维空间向量的协方差 10、cvCmp 对两个数组中德所有元素运用设这的比较操作 11、cvCmpS 对数组和标量运用设置的比较操作 12、cvConvertScale 可选的缩放值转换数组元素类型 13、cvConvertScaleAbs 计算可选的缩放值的绝对值之后再转换数组元素的类型 14、cvCopy 把数组中德值复制到另一个数组中 15、cvCountNonZero 计算数组中非0值的个数 16、cvCrossProduct 计算两个三维向量的向量积(叉积) 17、cvCvtColor 将数组的通道从一个颜色空间转换另一个颜色空间 18、cvDet 计算方阵的行列式 19、cvDiv 用另外一个数组对一个数组进行元素级的除法运算 20、cvDotProduct 计算两个向量的点积 21、cvEigenVV 计算方阵的特征值和特征向量 22、cvFilp 围绕选定的轴翻转 23、cvGEMM 矩阵乘法 24、cvGetCol 从一个数组的列中复制元素 25、cvGetCol s 从元素相邻的多列中复制元素值 26、cvGetDiag 复制数组中对角线上的所有元素 27、cvGetDIms 返回数组的维数 28、cvGetDImSize 返回一个数组的所有维数的大小 29、cvGetRow 从一个数组的行中复制元素值 30、cvGetRows 从一个数组的对个相邻的行中复制元素值 31、cvGetSize 得到二维的数组的尺寸。以CvSize返回 32、cvGetSubRect 从一个数组的子区域复制元素值 33、cvInRange 检查一个数组的元素是否在另外两个数组的值的范围内 34、cvInRangeS 检查一个数组的元素的值是否在另外两个标量的范围内 35、cvInvert 求矩阵的转置 36、cvMahalonobis 计算两个向量间的马氏距离 37、cvMax 在两个数组中进行元素级的取最大值操作 38、cvMaxS 在一个数组和一个标量中进行元素级的取最大值操作 39、cvMerge 把几个单通道图像合并为一个多通道图像 40、CvMin 在两个数组中进行元素级的取最小值操作 41、cvMinS 在一个数组和一个标量中进行元素级的取最小值操作 42、cvMinMaxLoc 寻找数组中最大值最小值 43、cvMul 计算两个数组的元素级的乘积 44、cvNot 按位对数组中德每个元素求反 45、cvNorm 计算两个数组的正态相关性 46、cvNormalize 将数组中元素进行规一化 47、cvOr 对两个数组进行按位或操作 48、cvOrs 在数组与变量之间进行按位或操作 49、cvReduce 通过给定的操作符将二维数组约简为向量 50、cvRepeat 以平铺的方式进行数组复制 51、cvSet 用给定值初始化数组 52、cvSetZero 将数组中所有元素初始化为0 53、cvSetIdenty 将数组中对角线上的元素设为1,其他设置0 54、cvSolve 求出线性方程组的解 55、cvSplit 将多通道所组分割成多个单通道数组 56、cvSub 两个数组元素级的相减 57、cvSubs 元素级的从数组中减去标量 58、cvSubRS 元素组中德所有元素求和 59、cvSum 对数组中德所有元素求和 60、cvSVD 二维矩阵的奇异值分解 61、cvSVBkSb 奇异值回代计算 62、cvTrace 计算矩阵迹 63、cvTranspose 矩阵的转置运算 64、cvXor 对两个数组进行按位异或操作 65、cvXorS 在数组和变量之间进行按位异或操作 66、cvZero 将所有数组中德元素置为0 1、cvAbs、cvAbsDiff 和cvAbsDiffs Void cvAbs{////////计算src里德值绝对值,然后把结果写到dst Const CvArr* src, Const dst }; Void cvAbsDiff{//////////先从src1减去src2,然后将所得差的绝对值写到dst Const CvArr* src1, Const CvArr* src2, Const dst }; Void cvAbsDiffs{ Const CvArr* src, CvScalar value, Const dst }; 2、cvAdd,cvAddS,cvAddWeighted和alpha Void cvAdd{///////////简单的加法,把src1里的所有元素对应进行相加,然后结果放到dst中, 如果mask没有被设为null,那么有mask中非零元素指定dst元素值为在函数执行后不变 Const CvArr* src1, Const CvArr* src2, CvArr* dst; Const CvArr* mask=NULL }; Void cvAddS{//////// Const CvArr* src, CvScalar value, CvArr* dst; Const CvArr* mask=NULL }; Void cvAddWeighted {////////两个图像src1和src2融合成dst,src1的融合度为alpha,src22 的融合度为beta;dst=α*src1+β*src2+γ; Const CvArr* src1, Double alpha, Const CvArr* src2, Double beta, Double gamma, CvArr* dst }; cvAnd和cvAndS Void cvAnd{////在src1数组上进行与运算结果在dst中 Const CvArr* src1, Const CvArr* src2, CvArr* dst; Const CvArr* mask=NULL }; Void cvAndS{在src1数组上进行与运算,位于运算有常标量value得出,若mask非空,只计算得0 mask元素所对应的dst元素。 Const CvArr* src1, CvScalar value, CvArr* dst; Const CvArr* mask=NULL} cvAvg 计算数组arr的平均像素值,若mask为非空,那么平均值仅由那些mask为非0的元素对应的像素算出。 CvScalar cvAvg{ Const CvArr* arr; Const CvArr* mask=NULL; }; cvAvgSdv求平均值和像素的方差 cvAvgSdv{ Const CvArr* arr; CvScalar* mean; CvScalar* std_dev; Const CvArr* mask =null; }; cvCalcCovarMatrix计算向量的均值和协方差矩阵 Void cvCalcCovarMatrix { Const CvArr* vects, Int count, CvArr* cov_mat, CvArr* avg, Int flags }; cvCmp和cvCmpS Void cvCmp{//////比较两幅图相应的像素值 Const CvArr* src1, Const CvArr* src2, CvArr* dst, Int cmp_op }; Void cvCmpS{//////将给定图像的像素值与某常标量值进行比较 Const CvArr* src, CvScalar value, CvArr* dst, Int cmp_op }; cvConvertScale 功能:1、将源图像的数据类型转换成目标图像的数据类型。2、对图像数据执行线性变换。 Void cvConvertScale{ Const CvArr* src, CvArr* dst, Double scale=1.0, Double shift=0.0, }; cvConvertScaleAbs先缩放和平移,然后计算出绝对值,最后进行数据类型的转换 Void cvConvertScaleAbs{ Const CvArr* src, CvArr* dst, Double scale=1.0, Double shift=0.0, }; cvCopy 功能:将一个图像复制到另一个图像,要求两个数组具有相同的数据类型、相同的大小和相同的维数。 Void cvCopy { Const CvArr* src, CvArr* dst, Const CvArr* mask =null }; cvCountZero 返回数组arr中非0像素的个数 Int cvCountZero(const CVArr* arr); cvCrossProduct功能:计算两个三维向量的叉积 Void cvCrossProduct( Const CvArr* src1, Const CvArr* src2, CvArr* dst, ); cvCvtColor Void cvCvtColor( Const CvArr* src, CvArr* dst, Int code, ); 直线 cvLine()是绘图函数中最简单的,只需要Bresenham算法画一条线: Void cvLine( CvArr* array; Cvpoint pt1, Cvpoint pt2, CvScalar color,///颜色变量 Int thickness=1,/////线的粗细一般用像素表示 Int connectivity=8,/////被设为反走样模式 ),; 矩形 cvRectangle( CvArr* array; Cvpoint pt1, Cvpoint pt2, CvScalar color,///颜色变量 Int thickness=1 ); 圆形和椭圆 Void cvCircle( CvArr* array, Cvpoint center, Int radius, CvScalar color, Int thickness=1, Int connectivity=8 ); Void cvEllipse( CvArr* img, CvPoint center, CvSize axes, Double start_angle, Double end_angle,///////angle表示偏离主轴的角度,从X轴算起,逆时针方向为正,表示弧线开始和结束位置的角度 CvScalar color, Int thickness=1, Int line_type=8 ); 多边形 Void cvFillPoly(///////允许一个调用中绘制多个多边形 CvArr* img, CvPoint** pts, Int* npts, Int contours, CvScalar color, Int line_type=8 ); Void cvFillConvexPoly(////////允许一个调用中绘制多个多边形,他一次只能画一个多边形,而且只能画凸多边形 CvArr* img, CvPoint* pts, Int* npts, CvScalar color, Int line_type=8 ); Void cvPolyLine(////////允许一个调用中绘制多个多边形,只需画出多边形的边,不需处理相交情况,速度快 CvArr* img, CvPoint** pts, Int* npts, Int contours, Int is_closed, CvScalar color, Int thickness=1, Int line_type=8 ); 字体和文字 cvPutText()功能:可以在图像上输出一些文本 Void cvPutText( CvArr* img, Const char* text,/////所指向的文本将打印到图像上 CvPoint origin,/////指定文本框左下角位置 Const CvPoint* font,/////调用函数cvInitFont() CvScalar color///////指定文本颜色 ); Void cvInitFont( CvFont* font, Int font_face, Double hscale, Double vscale, Double shear=0,/////创建斜字体若为0.0字体不斜,若为1.0时字体倾斜范围接近45度 Int thickness=1, Int line_type=8 ); 第4章 细说HighGUI——一个可移植的工具包 创建窗口 Int cvNamedWindow(const char* name,int flag=CV_WINDOW_AUTOSIZE); 释放窗口 cvDestroyWindow(),这个函数接收一个字符串参数,这个字符串是窗口创建时所指定的名字。 cvResizeWindow()来调整窗口的大小 Void cvResizeWindow(const char*name,int width,int height); 这里的宽度和高度是以像素为单位的,指定了窗口中可以显示部分的大小。 载入图像 IplImage *cvLoadImage(const char* filename,int iscolor CV_LOAD_IMAGE_COLOR); Iscolor 有几个值可以选择,默认情况下,图像是以每个通道8位,3个通道的形式被读入,可以通过设置CV_LOAD_IMAGE_COLOR来读入非8位的图像 保存图像 Int cvSaveImage(const char* filename ,const CvArr* image); 第二个参数是值要存储的图像数据 显示图像 Void cvShowImage(const char* name, const CvArr* image ); 第一个参数用来指定用来显示图像的窗口,第二个参数指向需要显示的图像 cvWaitKey()这个函数在一个给定的时间等待用户按键触发。cvWaitKey()可以接收0作为参数,在这种情况下,cvWaitKey()会无限期地等待,直到用户触发一个按键。 鼠标事件 鼠标事件相应采用回调函数的方式来处理,为了可以相应鼠标点击事件,首先必须创建一个回调函数,是鼠标点击事件发生时OpenCV可以调用这个函数。 回调函数的格式: Void CvMouseCallback(int event,int x,int y,int flags, void*param); 第二个以及第三个参数会被设置成事件发生时鼠标位置的x,y坐标值。这些坐标代表窗口中图像的像素坐标,与窗口的大小没有关系。 第四个参数flags ,每一位指定了在事件发生时的不同状态。 Param可以用来以任何结构方式传递额外的参数信息 注册回调函数 Void cvSetMouseCallBack ( const char* window_name,/////指定回调函数要注册到的窗口 CvMouseCallback on_mouse, ///回调函数 void* param=NULL);////传递额外的信息给void* param 参数 Sliders ,Trackbars,和Switches 滑动条被指定了一个独立的名称(字符串形式),并且后面使用此名称来制定这个滑动条。 Int cvCreateTracker( Const char* trackba_name,////滑动条的名字 Const char* widow_name,///滑动条附属的窗口名字 Int* value,///当滑动条被拖动时,OpenCV自动将当前位置所代表的值传给指针指向的整数 Int count ,/////滑动条所能表示的最大值 CvTrackbarCallback on_change///指向回滑函数的指针,当滑动条被拖动时,回滑函数会自动调用。 ); CvTrackCallback定义如下: Void(*callback)(intposition) Int cvGetTrackbarPos(////用于读取滑动条value的值 const char* track_name, Const char* window_name ); Void cvSetTrackbarPos( const char* track_name, Const char* window_name Int pos ); 无按钮 用只有两个取值的滑动条来代替按钮,开关(switch)事实上就是只有两个状态的滑动条,这个状态是“on”和“off”。 视频的处理 CvCapture* cvCreateFileCapture(const char* filename);///只需要将MPG或AVI视频文件名 CvCapture* cvCreateCameraCapture(int index); 读视频 Int cvGrabFrame(CvCapture* capture); IplImage* CvRetrieveFrame(CvCapture* capture); IplImage* cvQueryFrame (CvCapture* capture); ConvertImage函数//用于不同图像格式之间转换 Void ConvertImage(const CvArr* src, CvArr* dst, int flags=0///垂直旋转图像 ); 第5章 图像处理 图像处理:使用图像结构中所定义的高层处理方法来完成特定任务,这些任务是图形和视觉范畴的任务。 平滑处理(模糊处理) OpenCV提供的平滑操作方法都是由cvSmooth函数实现,该函数可以将用户所期望的平滑方式作为参数。 Void cvSmooth( Const cvArr* src,//平滑操作的输入图像 CvArr* dst,///平滑操作的结果 Int smootype =CV_GAUSSIAN, Int param1=3, Int param2=0, Double param3=0, Double param3=0,////这些参数的含义取决于smoothtype的值 ); CV_BLUR (简单模糊)对每个像素param1*param2领域求和,并缩放1/(param1*param2) CV_BLUR_NO_SCALE(简单无缩放变换的模糊)对每个像素的param1*param2领域求和 CV_MEDIAN(中值模糊)对图像核进行大小为param1*param2的中值滤波 CV_GAUSSIAN(高斯模糊)对图像进行大小为param1*param2的高斯卷积 CV_BILATERAL(双边滤波)应用双线性3*3滤波,颜色sigma=param1,空间sigma=param2 图像形态学 基本的图像转换是膨胀与腐蚀 膨胀是指将一些图像(或图像中德一部分区域成为A)与核(称为B)进行卷积,核可以是任何的形状或大小,他拥有一个单独定义出来的参考点,多数情况下,核是一个小的中间带有参考点的实心正方形或圆盘。核可以视为模板或掩码,膨胀是求局部最大值的操作。 腐蚀是膨胀的反操作,腐蚀操作要计算核区域像素的最小值,腐蚀可以通过下面的算法生成一个新的图像:当核B与图像卷积时,计算被B覆盖区域的最小像素值,并把这个值放到参考点上。 膨胀可以填补凹洞,腐蚀可以消除细的凸起。 膨胀函数cvErode()和腐蚀函数cvDilate()都有源图像和目标函数参数 Void cvErode( IplImage* src, IplImage* dst, IplConvKernel* B=NULL,//是核当为空时,所使用的是参考点位于中心3*3核 int interations=1////迭代的次数 ); Void cvDilate( IplImage* src, IplImage* dst, IplConvKernel* B=NULL, int interations=1 ); 当OpenCV执行cvErode()函数时,将某点p的像素值设为与p对应的核覆盖下所有点中的最小值,同样的,对于执行膨胀操作时,将取最小值换为取最大值: 自定义核 创建 IplConvKernel* cvCreateStructuringElementEx( Int cols, Int rows,///行和列确定了所构成矩形大小 Int anchor_x,//是核的封闭矩形内参数点的横纵左边(x,y) Int anchor_y, Int shape,//形状 Int* values=NULL///value在封闭矩形内定义核的形状 ); 释放 Void cvRealseStructuringElement(IplConvKernel** element); IplConvKernel的形状取值 CV_SHAPE_RECT 核是矩形 CV_SHAPE_CROSS 核是十字交叉形 CV_SHAPE_ELLIPSE 核是椭圆形 CV_SHAPE_CUSTOM 核是用户自定义的值 更通用的形态学 在处理布尔图像和图像掩码时,基本的腐蚀和膨胀操作通常是足够的,然而,在处理灰度或彩色图像时,需要使用cvMorphologyEx()函数 Void cvMorphologyEx( Const CvArr* src, CvArr* dst, CvArr* temp,///temp数组与源图像同样大小 IplConvKernel* element, Int operation,////指定形态学操作的方法 Int interations=1 ); cvMorphologyEx()操作选项 CV_MOP_OPEN 开运算——先腐蚀后膨胀,常用来统计二值图像中得区域数, CV_MOP_CLOSE 闭运算——先膨胀后腐蚀,在连通区域分析算法中,都会用到闭运算来除去噪声引起的区域。 CV_MOP_GRADIENT 形态运算 CV_MOP_TOPHAT “礼帽” CV_MOP_BLACKHAT “黑帽” 1、开运算和闭运算操作“保留区域”形式:最显著的效果是:闭运算消除低于其临近点的孤立点,开运算消除高于其邻近点的孤立点 2、开运算和闭运算“面积保持”形式:闭运算消除低于邻近点的孤立点,开运算消除高于其邻近点的孤立点 形态学梯度 公式: gradient(src)=dilate(src)-erode(src) 对二值图像进行这一操作可以将团块的边缘突出出来,形态梯度操作能描述图像亮度变化的剧烈程度。 礼帽和黑帽 这些操作分别用于分离比邻近点亮或暗的一些斑块,当试图鼓励的部分相对于其邻近的部分有亮度变化时,就可以使用这些方法。 TopHat(src)=src-open(src) 从A中减去open(src)可以突出比A周围的区域更明亮的区域,并跟核的大小相关 BlackHat(src)=close(src)-src 从A中减去open(src)可以突出比A周围的区域更黑暗的区域,并跟核的大小相关 漫水填充算法 常被用来标记或分离图像的一部分以便对其进行进一步的处理和分析。也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码制定的像素点。 cvFloodFill函数本身包含一个可选的掩码参数,用来进一步控制那些区域将被填充颜色。 漫水填充操作的结果总是某个连续的区域。 漫水填充算法的函数原型: void cvFloodFill( IplImage* img;//输入图像 CvPoint seedPoint,漫水法填充从seedPoint开始 CvScalar newVal,///像素点被染色的值 CvScalar loDiff =cvScalarAll(0), CvScalar upDiff =cvScalarAll(0), CvConnectedComp* comp =NULL, int flags=4, CvArr* mask=NULL ); Flags低8位部分可以设置为4或8,这个参数控制填充算法的连通性,若为4,填充算法只考虑当前像素水平方向和垂直方向的相邻点,若为8,还要考虑包含对角线方向的相邻点。 尺寸调整 cvResize()函数来放大或缩小图像 void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR///指定插值法 ); cvResize()插值方法 CV_INTER_NN 最邻近插值 CV_INTER_LINEAR 线性插值 CV_INTER_AREA 区域插值 CV_INTER_CUBIC 三次样条插值 图像金字塔 图像金字塔是一个图像集合,集合中所有的图像都源于同一个原始图像,而且通过对原始图像连续将采样获得,直到带到某个中止条件才停止采样。 高斯金字塔:用来向下降采样图像, 拉普拉斯金字塔:底层图像中向上采样重建一个图像。 OpenCV为我们提供了从金字塔中上一级图像生成下一级图像的方法:、 void cvPyrDown( IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5); 将现有的图像在每个维度上都放大两倍: void cvPyrUp( IplImage* src, IplImage* dst, IplFilter filter=IPL_GAUSSIAN_5x5 ); PyrUp()不是函数PyrDown()的逆操作,因为PyrDown()是一个会丢失信息的函数。 下面是拉普拉斯金字塔的第i层的数学定义: 其中,UP()操作将原始图像中位置为(x,y)的像素映射到目标图像的(2x+1,2y+1)位置,g5*5高斯核。 使用OpenCV直接进行拉普拉斯运算: 最广泛的应用:利用金字塔实现图像分割,图像分割需要建立一个图像金字塔,然后在Gi的像素和Gi+1的像素直接依照对应关系,建立起“父—子”关系,这种方式,快速初始分割可以先在金字塔高层的低分辨率图像上完成, 然后逐层对分割加以优化。 使用cvPyrSegmentation()函数来实现, void cvPyrSegmentation ( IplImage* src,////源图像,起始图像的长和宽都能够被2整除,并且能够被2 整除的次数不小于金字塔的总得层数。 IplImage* dst,////目标图像 CvMemStorage* storage,///指向OpenCV的存储区 CvSeq** comp,////用于存储分割结果更详细的信息——存储区里一系列相连的组成部分 int level, double threshold1, double threshold2, ); 阈值化 使用cvTreshold()可以完成直接剔除一些低于或高于一定值像素 double cvTreshold( CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type ); 第6章 图像变换 卷积 void cvFilter2D( const CvArr* src,源图像 CvArr* dst,目标图像 const CvMat* kernel,核 CvPoint anchor=cvPoint(-1,-1)默认核的中心 ); 卷积边界 使用cvCopyMakeBorder()函数来处理卷积的边界,它可以将特定的图像微变大,然后以各种方式自动填充图像边界。 void cvCopyMakeBorder( const CvArr* src,源图像 CvArr* dst,目标图像 CvPoint offset,告诉cvCopyMakeBorder()将源图像的副本放到目标图像中的位置 int bordertype,类型可以是IPL_BORDER_CONSTANT表示value变量被认为是所在边界的像素应该设置的值,IPL_BORDER_REPLICATE表示原始图像边缘的行和列被复制到大图像的边缘 CvScalar value=cvScalarAll(0) ); 梯度和Sobel导数 cvSobel( const CvArr* src, CvArr* dst, int xorder, int yorder,///求导数的阶数可能得取值0,1,2 int aperture_size=3表示方形滤波器的宽并且应该是奇数 ); Sobel 导数性质:可以定义任意大小的核,并且这些核可以用快速且迭代方式构造,大核对导数有更好的逼近,因为小核对噪声更敏感。其中Sobel导数并不是真正的导数,因为Sobel算子定义于一个离散空间之上。 Scharr滤波器 Scharr滤波器解决小导数滤波器不准确的问题,功能和sobel相似 拉普拉斯变换 拉普拉斯算子 拉普拉斯函数 void cvLaplace( const CvArr* src, CvArr* dst, int apertureSize=3 ); 拉普拉斯函数通常把源图像和目标图像以及中孔大小作为变量。源图像既可以是8位(无符号)图像,也可以是32位(浮点)图像,而目标图像必须是16位(有符号)或32位(浮点)图像。 拉普拉斯的一个应用:通常应用在检测“团块”和边缘检测 Canny算子(Canny边缘检测) Canny算法最重要的一个新特点是其试图将独立变得候选像素拼装成轮廓。轮廓的形成是对这些像素运用滞后性阈值。上限和下限,当一个像素的梯度大于上限阈值,则被认为边缘像素,如果低于下限阈值,则被抛弃。若在二者之间,只有当其高于上限阈值的像素连接时才会被接受。 void cvCanny( const CvArr* img,///输入一幅灰度图 CvArr* edges,////输出一幅灰度图 double lowThresh,///下限阈值 double highThresh, ////上限阈值 int apertureSize=3 ); 霍夫变换 霍夫变换是一种在图像中寻找直线、圆以及其他简单形状的方法。 霍夫线变换 霍夫直线变换的基本理论是二值图像中的任何点都可能是一些候选直线集合的一部分 OPenCV支持两种不同形式的霍夫变换:标准霍夫变换(SHT)和累计概率霍夫变换(PPHT)之所以称“PPHT”为“概率”的,是因为并不将累加器平面内的所有可能点累加,而只累加其中的一部分。 在OpenCV中使用同一个函数来访问这两个算法。 CvSeq* cvHoughLines( CvArr* image,//输入图像,必须是8位的 void* line_storage,//是指向保存结果位置的指针,可以是内存块,也可以 是N*1的矩阵数列 int method,///可以是 CV_HOUGH_STANDARD,CV_HOUGH_PROBABILISTIC或CV_HOUGH_MULTI_SCALE 分别对应SHT,PPHT,SHT的多尺度变种 double rho,设置直线所需要的分辨率,单位是像素 double thrta,设置直线所需要的分辨率,单位是弧度 int threshold,认定为一条直线时在累计平面中必须达到的值 double param1=0, double param2=0 ); 在SHT中没有用到param1和param2参数,对于PPHT,param1设置为将要返回的线段的最小长度,param2设置为一条直线上分离线段不能练成一条直线的分隔像素点数。对于多尺度的HT,这两个参数是用来指明被计算的直线参数中较高的分辨率。 霍夫圆变换 因篇幅问题不能全部显示,请点此查看更多更全内容