opencv中文手册_第1页
opencv中文手册_第2页
opencv中文手册_第3页
opencv中文手册_第4页
opencv中文手册_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录?1梯度、边缘和角点01.1Sobelo1.2Laplaceo1.3Cannyo1.4PreCornerDetecto1.5CornerEigenValsAndVecso1.6CornerMinEigenValo1.7CornerHarriso1.8FindCornerSubPixo1.9GoodFeaturesToTrack?2采样、插值和几何变换o2.1InitLineIteratoro2.2SampleLineo2.3GetRectSubPixo2.4GetQuadrangleSubPixo2.5Resizeo2.6WarpAffineo2.7GetAffineTransformo2

2、.82DRotationMatrixo2.9WarpPerspectiveo2.10WarpPerspectiveQMatrixo2.11GetPerspectiveTransformo2.12Remapo2.13LogPolar?3形态学操作o3.1CreateStructuringElementExo3.2ReleaseStructuringElemento3.3Erodeo3.4Dilateo3.5MorphologyEx?4滤波器与色彩空间变换o4.1Smootho4.2Filter2Do4.3CopyMakeBordero4.4Integralo4.5CvtColoro4.6Thre

3、sholdo4.7AdaptiveThreshold?5金字塔及其应用o5.1PyrDowno5.2PyrUp?6连接部件o6.1CvConnectedCompo6.2FloodFillo6.3FindContourso6.4StartFindContourso6.5FindNextContouro6.6SubstituteContouro6.7EndFindContourso6.8PyrSegmentationo6.9PyrMeanShiftFilteringo6.10Watershed?7图像与轮廓矩o7.1Momentso7.2GetSpatialMomento7.3GetCentral

4、Momento7.4GetNormalizedCentralMomento7.5GetHuMoments?8特殊图像变换o8.1HoughLineso8.2HoughCircleso8.3DistTransformo8.4Inpaint?9直方图o9.1CvHistogramo9.2CreateHisto9.3SetHistBinRangeso9.4ReleaseHisto9.5ClearHisto9.6MakeHistHeaderForArrayo9.7QueryHistValue1Do9.8GetHistValue1Do9.9GetMinMaxHistValueo9.10Normalize

5、Histo9.11ThreshHisto9.12CompareHisto9.13CopyHisto9.14CalcHisto9.15CalcBackProjecto9.16CalcBackProjectPatcho9.17CalcProbDensityo9.18EqualizeHist?10匹配o10.1MatchTemplateo10.2MatchShapeso10.3CalcEMD2梯度、边缘和角点Sobel使用扩展Sobel算子计算一阶、二阶、三阶或混合图像差分voidcvSobel(constCvArr*src,CvArr*dst,intxorder,intyorder,intaper

6、ture_size=3);src输入图像.dst输出图像.xorderx方向上的差分阶数yordery方向上的差分阶数aperture_size扩展Sobel核的大小,必须是1,3,5或7。除了尺寸为1,其它情况下,aperture_sizexaperture_size可分离内核将用来计算差分。对aperture_size=1的情况,使用3x1或1x3内核(不进行高斯平滑操作)。这里有一个特殊变量CV_SCHAR传-1),对应3x3Scharr滤波器,可以给出比3x3Sobel滤波更精确的结果。Scharr滤波器系数是:-303-10010-303对x-方向或矩阵转置后对y-方向。函数cvSo

7、bel通过对图像用相应的内核进行卷积操作来计算图像差分:产世典丁土炉荷的品而s£的即力住士由于Sobel算子结合了Gaussian平滑和微分,所以,其结果或多或少对噪声有一定的鲁棒性。通常情况,函数调用采用如下参数(xorder=1,yorder=0,aperture_size=3)或(xorder=0,yorder=1,aperture_size=3)来计算一阶x-或y-方向的图像差分。第一种情况对应:-1011-202-1。U核第二种对应:-1-2-T000121一或者-121-000-1-2-1V核的选则依赖于图像原点的定义(origin来自IplImage结构的定义)。由于该

8、函数不进行图像尺度变换,所以和输入图像(数组)相比,输出图像(数组)的元素通常具有更大的绝对数值(译者注:即像素的位深)。为防止溢出,当输入图像是8位的,要求输出图像是16位的。当然可以用函数cvConvertScale或cvConvertScaleAbs转换为8位的。除了8-位图像,函数也接受32-位浮点数图像。所有输入和输出图像都必须是单通道的,并且具有相同的图像尺寸或者ROI尺寸。Laplace计算图像的Laplacian变换voidcvLaplace(constCvArr*src,CvArr*dst,intaperture_size=3);src输入图像.dst输出图像.apertur

9、e_size核大小(与cvSobel中定义一样).函数cvLaplace计算输入图像的Laplacian变换,方法是先用sobel算子计算二阶x-和y-差分,再求和:drffrcd?src心而1而对aperture_size=1则给出最快计算结果,相当于对图像采用如下内核做卷积:10101-41010类似于cvSobel函数,该函数也不作图像的尺度变换,所支持的输入、输出图像类型的组合和cvSobel一致。Canny采用Canny算法做边缘检测voidcvCanny(constCvArr*image,CvArr*edges,doublethresholdl,doublethreshold2,i

10、ntaperture_size=3);image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel算子内核大小(见cvSobel).函数cvCanny采用CANNY算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。?注意事项:cvCanny只接受单通道图像作为输入。?外部链接:经典的canny自调整阈值算法的一个opencv的实现见狂OpenCW自适应确定canny算法的分割门限PreCorn

11、erDetect计算用于角点检测的特征图,voidcvPreCornerDetect(constCvArr*image,CvArr*corners,intaperture_size=3);image输入图像.corners保存候选角点的特征图aperture_sizeSobel算子的核大小(见cvSobel).函数cvPreCornerDetect计算函数其中D表示一阶图像差分,表示二阶图像差分。角点被认为是函数的局部最大值:/假设图像格式为浮点数IplImage*corners=cvCloneImage(image);IplImage*dilated_corners=cvCloneImage

12、(image);IplImage*corner_mask=cvCreateImage(cvGetSize(image),8,1);cvPreCornerDetect(image,corners,3);cvDilate(corners,dilated_corners,0,1);cvSubS(corners,dilated_corners,corners);cvCmpS(corners,0,corner_mask,CV_CMP_GE);cvReleaseImage(&corners);cvReleaseImage(&dilated_corners);CornerEigenValsA

13、ndVecs计算图像块的特征值和特征向量,用于角点检测voidcvCornerEigenValsAndVecs(constCvArr*image,CvArr*eigenvv,intblock_size,intaperture_size=3);image输入图像.eigenvv保存结果的数组。必须比输入图像宽6倍。block_size一邻域大小(见讨论).aperture_sizeSobel算子的核尺寸(见cvSobel).对每个象素,函数cvCornerEigenValsAndVecs考虑block_sizexblock_size大小的邻域S(p),然后在邻域上计算图像差分的相关矩阵:一一rv

14、,V阳.更p乙/S乙也r(/,V。好.红、2vf好F.乙员p)di碗r,乙*5p)l(fgJ.然后它计算矩阵的特征值和特征向量,并且按如下方式(入1,入2,x1,y1,x2,y2)存储这些值到输出图像中,其中入1,入2-M的特征值,没有排序(x1,y1)-特征向量,对入1(x2,y2)-特征向量,对入2CornerMinEigenVal计算梯度矩阵的最小特征值,用于角点检测voidcvCornerMinEigenVal(constCvArr*image,CvArr*eigenval,intblock_size,intaperture_size=3);image输入图像.eigenval保存最小

15、特征值的图像.与输入图像大小一致block_size邻域大小(见讨论cvCornerEigenValsAndVecs).aperture_sizeSobel算子的核尺寸(见cvSobel).当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数.函数cvCornerMinEigenVal与cvCornerEigenValsAndVecs类似,但是它仅仅计算和存储每个象素点差分相关矩阵的最小特征值,即前一个函数的min(入1,入2)CornerHarris哈里斯(Harris)角点检测voidcvCornerHarris(constCvArr*image,CvArr*harris

16、_responce,intblock_size,intaperture_size=3,doublek=0.04);image输入图像。harris_responce存储哈里斯(Harris)检测responces的图像。与输入图像等大。block_size邻域大小(见关于cvCornerEigenValsAndVecs的讨论)。aperture_size扩展Sobel核的大小(见cvSobel)。格式.当输入图像是浮点数格式时,该参数表示用来计算差分固定的浮点滤波器的个数。kharris检测器的自由参数。参见下面的公式。函数cvCornerHarris对输入图像进行Harris边界检测。类似于

17、cvCornerMinEigenVal和cvCornerEigenValsAndVecs。对每个像素,在block_size*block_size大小的邻域上,计算其2*2梯度共变矩阵(或相关异变矩阵)Ml然后,将det(M)-k*trace(M)2(这里2是平方)保存到输出图像中。输入图像中的角点在输出图像中由局部最大值表示。FindCornerSubPix精确角点位置voidcvFindCornerSubPix(constCvArr*image,CvPoint2D32f*corners,intcount,CvSizewin,CvSizezero_zone,CvTermCriteriacri

18、teria);image输入图像.corners输入角点的初始坐标,也存储精确的输出坐标count角点数目win搜索窗口的一半尺寸。如果win=(5,5)那么使用5*2+1乂5*2+1=11乂11大小的搜索窗口zero_zone死区的一半尺寸,死区为不对搜索区的中央位置做求和运算的区域。它是用来避免自相关矩阵出现的某些可能的奇异性。当值为(-1,-1)表示没有死区。criteria求角点的迭代过程的终止条件。即角点位置的确定,要么迭代数大于某个设定值,或者是精确度达到某个设定值。criteria可以是最大迭代数目,或者是设定的精确度,也可以是它们的组合。或如图函数cvFindCornerSub

19、Pix通过迭代来发现具有子象素精度的角点位置,所示的放射鞍点(radialsaddlepoints)。子象素级角点定位的实现是基于对向量正交性的观测而实现的,即从中央点q到其邻域点p的向量和p点处的图像梯度正交(服从图像和测量噪声)。考虑以下的表达式:£i=DIpiT?(q-pi)其中,DIpi表示在q的一个邻域点pi处的图像梯度,q的值通过最小化ei得到。通过将ei设为0,可以建立系统方程如下:sumi(DIpi?DIpiT)?q-sumi(DIpi?DIpiT?pi)=0其中q的邻域(搜索窗)中的梯度被累加。调用第一个梯度参数G和第二个梯度参数b,得到:q=G-1?b该算法将搜索

20、窗的中心设为新的中心q,然后迭代,直到找到低于某个阈值点的中心位置。GoodFeaturesToTrack确定图像的强角点voidcvGoodFeaturesToTrack(constCvArr*image,CvArr*eig_image,CvArr*temp_image,CvPoint2D32f*corners,int*corner_count,doublequality_level,doublemin_distance,constCvArr*mask=NULL);image输入图像,8-位或浮点32-比特,单通道eig_image一临时浮点32-位图像,尺寸与输入图像一致temp_imag

21、e另外一个临时图像,格式与尺寸与eig_image一致corners输出参数,检测到的角点corner_count一输出参数,检测到的角点数目quality_level大最小特征值的乘法因子。定义可接受图像角点的最小质量因子。min_distance限制因子。得到的角点的最小距离。使用Euclidian距离maskROI:感兴趣区域。函数在ROI中计算角点,如果mask为NULL.,则选择整个图像。必须为单通道的灰度图,大小与输入图像相同。mask对应的点不为0,表示计算该点。函数cvGoodFeaturesToTrack在图像中寻找具有大特征值的角点。该函数,首先用cvCornerMinEi

22、genVal计算输入图像的每一个象素点的最小特征值,并将结果存储到变量eig_image中。然后进行非最大值抑制(仅保留3x3邻域中的局部最大值)。下一步将最小特征值小于quality_level?max(eig_image(x,y)排除掉。最后,函数确保所有发现的角点之间具有足够的距离,(最强的角点第一个保留,然后检查新的角点与已有角点之间的距离大于min_distance)。采样、插值和几何变换InitLineIterator初始化线段迭代器intcvInitLineIterator(constCvArr*image,CvPointpt1,CvPointpt2,CvLineIterator

23、*line_iterator,intconnectivity=8);image带采线段的输入图像.pt1线段起始点pt2线段结束点line_iterator一指向线段迭代器状态结构的指针connectivity被扫描线段的连通数,4或8.函数cvInitLinelterator初始化线段迭代器,并返回两点之间的象素点数目。两个点必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用CV_NEXT_LINE_POIN来得至IJ。线段上的点是使用4连通或8-连通利用Bresenham算法逐点计算的。例子:使用线段迭代器计算彩色线上象素值的和CvScalarsum_line_p

24、ixels(IplImage*image,CvPointpt1,CvPointpt2)CvLineIteratoriterator;intblue_sum=0,green_sum=0,red_sum=0;intcount=cvInitLineIterator(image,pt1,pt2,&iterator,8);for(inti=0;i<count;i+)blue_sum+=iterator.ptr0;green_sum+=iterator.ptr1;red_sum+=iterator.ptr2;CV_NEXT_LINE_POINT(iterator);/*printthepix

25、elcoordinates:demonstrateshowtocalculatethecoordinates*/intoffset,x,y;/*assumethatROIisnotset,otherwiseneedtotakeitintoaccount.*/offset=iterator.ptr-(uchar*)(image->imageData);y=offset/image->widthStep;x=(offset-y*image->widthStep)/(3*sizeof(uchar)/*sizeofpixel*/);printf("(%d,%d)n"

26、;,x,y);)returncvScalar(blue_sum,green_sum,red_sum);)SampleLine将图像上某一光栅线上的像素数据读入缓冲区intcvSampleLine(constCvArr*image,CvPointpt1,CvPointpt2,void*buffer,intconnectivity=8);image输入图像pt1光栅线段的起点pt2光栅线段的终点buffer存储线段点的缓存区,必须有足够大小来存储点max(|pt2.x-pt1.x|+1,|pt2.y-pt1.y|+1):8一连通情况下,或者|pt2.x-pt1.x|+|pt2.y-pt1.y|+1

27、:4连通情况下.connectivity线段的连通方式,4or8.函数cvSampleLine实现了线段迭代器的一个特殊应用。它读取由pt1和pt2两点确定的线段上的所有图像点,包括终点,并存储到缓存中。GetRectSubPix从图像中提取象素矩形,使用子象素精度voidcvGetRectSubPix(constCvArr*src,CvArr*dst,CvPoint2D32fcenter);src输入图像.dst提取的矩形.center提取的象素矩形的中心,浮点数坐标。中心必须位于图像内部.函数cvGetRectSubPix从图像src中提取矩形:dst(x,y)=src(x+center.

28、x-(width(dst)-1)*0.5,y+center.y-(height(dst)-1)*0.5)其中非整数象素点坐标采用双线性插值提取。对多通道图像,每个通道独立单独完成提取。尽管函数要求矩形的中心一定要在输入图像之中,但是有可能出现矩形的一部分超出图像边界的情况,这时,该函数复制边界的模识(hunnish:即用于矩形相交的图像边界线段的象素来代替矩形超越部分的象素)。GetQuadrangleSubPix提取象素四边形,使用子象素精度voidcvGetQuadrangleSubPix(constCvArr*src,CvArr*dst,constCvMat*map_matrix);sr

29、c输入图像.dst提取的四边形.map_matrix3x2变换矩阵A|b(见讨论).函数cvGetQuadrangleSubPix以子象素精度从图像src中提取四边形,使用子象素精度,并且将结果存储于dst,计算公式是:dst(x+width(dst)/2,y+height(dst)/2)=src(AiX+Ai2y+b1,A21x+A22y+b2)其中A和b均来自映射矩阵(译者注:A,b为几何形变参数),映射矩阵为:map-matrix=!*-其中在非整数坐标.(4岁)十$的象素点值通过双线性变换得到。当函数需要图像边界外的像素点时,使用重复边界模式(replicationbordermode

30、恢复出所需的值。多通道图像的每一个通道都单独计算。例子:使用cvGetQuadrangleSubPix进行图像旋转#include"cv.h"#include"highgui.h"#include"math.h"intmain(intargc,char*argv)IplImage*src;/*thefirstcommandlineparametermustbeimagefilename*/if(argc=2&&(src=cvLoadImage(argv1,-1)!=0)IplImage*dst=cvCloneImage

31、(src);intdelta=1;intangle=0;cvNamedWindow("src",1);cvShowImage("src",src);for(;)floatm6;doublefactor=(cos(angle*CV_PI/180.)+1.1)*3;CvMatM=cvMat(2,3,CV_32F,m);intw=src->width;inth=src->height;m0=(float)(factor*cos(-angle*2*CV_PI/180.);m1=(float)(factor*sin(-angle*2*CV_PI/180

32、.);m2=w*0.5f;m3=-m1;m4=m0;m5=h*0.5f;cvGetQuadrangleSubPix(src,dst,&M,1,cvScalarAll(0);cvNamedWindow("dst",1);cvShowImage("dst",dst);if(cvWaitKey(5)=27)break;angle=(angle+delta)%360;)return0;)Resize图像大小变换voidcvResize(constCvArr*src,CvArr*dst,intinterpolation=CV_INTER_LINEAR);s

33、rc输入图像.dst输出图像.interpolation插值方法:?CV_INTER_NN-最近令口插值,?CV_INTER_LINEAR-双线性插值(缺省使用)?CV_INTER_AREA使用象素关系重采样。当图像缩小时候,该方法而以避免双纹出现。当图像放大时,类似于CV_INTER_NNJ法.?CV_INTER_CUBIC-立方寸S值.函数cvResize将图像src改变尺寸得到与dst同样大小。若设定ROI,函数将按常规支持ROI.WarpAffine对图像做仿射变换voidcvWarpAffine(constCvArr*src,CvArr*dst,constCvMat*map_matr

34、ix,intflags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalarfillval=cvScalarAll(0);src输入图像.dst输出图像.map_matrix2X3变换矩阵flags插值方法和以下开关选项的组合:?cv_warp_fill_outliersM充所有输出图像的象素。如果部分象点落在输入图丽勺边界外,那么它们的值设定为fillval.?CV_WARP_INVERSE_MAP定map_matrix是输出图像到输入图像白歹反变换,因此可以百接用来做象素插值。否则,函数从map_matrix得到反变换。fillval用来填充边界外面

35、的值函数cvWarpAffine利用下面指定的矩阵变换输入图像:鼐£任二矿)jsrc(电力?如果没有指定CV_WARP_INVERSE_MAP(xy)!=mapjmatrix-(骂m1)T?否则,(y)f=mapmatrixI)1函数与cvGetQuadrangleSubPix类似,但是不完全相同。cvWarpAffine要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对小图像不太合适)而且输出图像的部分可以保留不变。而cvGetQuadrangleSubPix可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。要变换稀

36、疏矩阵,使用cxcore中的函数cvTransform。GetAffineTransform由三对点计算仿射变换CvMat*cvGetAffineTransform(constCvPoint2D32f*src,constCvPoint2D32f*dst,CvMat*map_matrix);src输入图像的三角形顶点坐标。dst输出图像的相应的三角形顶点坐标。map_matrix指向2X3输出矩阵的指针。函数cvGetAffineTransform计算满足以下关系的仿射变换矩阵:(以或,1)'=mapjnatrix(书如这里,dst(i)=(x'i,y'i),src(i)

37、=(xi,y)i=0.2.2DRotationMatrix计算二维旋转的仿射变换矩阵CvMat*cv2DRotationMatrix(CvPoint2D32fcenter,doubleangle,doublescale,CvMat*map_matrix);center输入图像的旋转中心坐标angle旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角).scale各项同性的尺度因子map_matrix输出2X3矩阵的指针函数cv2DRotationMatrix计算矩阵:aB|(1-a)*center.x-0*center.y-Ba|B*center.x+(1-a)*center.ywher

38、ea=scale*cos(angle),B=scale*sin(angle)该变换并不改变原始旋转中心点的坐标,如果这不是操作目的,则可以通过调整平移量改变其坐标(译者注:通过简单的推导可知,仿射变换的实现是首先将旋转中心置为坐标原点,再进行旋转和尺度变换,最后重新将坐标原点设定为输入图像的左上角,这里的平移量是center.x,center.y).WarpPerspective对图像进行透视变换voidcvWarpPerspective(constCvArr*src,CvArr*dst,constCvMat*map_matrix,intflags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,CvScalarfillval=cvScalarAll(0);src输入图像.dst输出图像.map_matrix3X3变换矩阵flags插值方法和以下开关选项的组合:?cv_warp_fill_outliersM充所有缩小图像的象素。如果部分象点落在输入图丽勺边界外,那么它们的值设定为fillval.?CV_WARP_INVERSE_MAP定matrix是输出图像到输入图像的反变换,因此可以直接用来做象素插值。否则,函数从map_matrix得到反变换。fillval用来填充边界外面的值函数cvWarpPerspective

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论