您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > OpenCv学习心得之程序
OpenCv学习心得:常用的五个函数(I/O)1.图像载入函数函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。函数支持bmp、jpg、png、tiff等格式的图像。其函数原型如下:IplImage*cvLoadImage(constchar*filename,intiscolor);其中,filename是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。2.窗口定义函数函数cvNamedWindow定义一个窗口,用于显示图像。其函数原型如下:intcvNamedWindow(constchar*name,unsignedlongflags);其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。3.窗口销毁函数函数cvDestroyWindow(constchar*name)销毁已定义的name窗口,释放窗口所占用的内存空间。其中name是之前定义的窗口名称。3.图像显示函数函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:voidcvShowImage(constchar*name,constCvArr*image);其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。4.图像保存函数函数cvSaveImage以指定的文件名保存IplImage类型的指针变量,其函数原型如下:intcvSaveImage(constchar*filename,constCvArr*image);其中,filename是图像保存路径和名称,image是IplImage指针变量。5.图像销毁函数函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下:voidcvReleaseImage(IplImage**image);其中,image为已定义的IplImage指针Mat有3个重要的方法:1、Matmat=imread(constString*filename);读取图像2、imshow(conststringframeName,InputArraymat);显示图像3、imwrite(conststring&filename,InputArrayimg);储存图像OpenCv的基本数据结构:点:CvPoint、CvPoint2D32f、CvPoint3D32f、矩形框大小:CvSize、CvSize2D32f矩形框:CvRect可以存放1-4个数值的数组:CvScalar定义迭代算法的终止规则:CvTermCriteria矩阵:CvMat、CvMatND、CvSparseMatIPL图像头部:IplImage定义不确定的数组:CvArr(仅作函数参数)IplImage:IPL图像头typedefstruct_IplImage{intnSize;/*IplImage大小*/intID;/*版本(=0)*/intnChannels;/*大多数OPENCV函数支持1,2,3或4个通道*/intalphaChannel;/*被OpenCV忽略*/intdepth;/*像素的位深度IPL_DEPTH_8U,IPL_DEPTH_8S,IPL_DEPTH_16U,IPL_DEPTH_16S,IPL_DEPTH_32S,IPL_DEPTH_32FandIPL_DEPTH_64F可支持*/charcolorModel[4];charchannelSeq[4];/*被OpenCV忽略*/intdataOrder;/*0-交叉存取颜色通道,1-分开的颜色通道.cvCreateImage只能创建交叉存取图像*/intorigin;/*0-顶—左结构,1-底—左结构(BMP风格)*/intalign;/*图像行排列(4or8).OpenCV用widthStep代替*/intwidth;/*图像宽像素数*/intheight;/*图像高像素数*/struct_IplROI*roi;/*图像感兴趣区域.当该值非空只对该区域进行处理*/struct_IplImage*maskROI;/*在OpenCV中必须置NULL*/void*imageId;/*同上*/struct_IplTileInfo*tileInfo;/*同上*/intimageSize;/*图像数据大小,单位字节*/char*imageData;/*指向排列的图像数据*/intwidthStep;/*排列的图像行大小,以字节为单位*/intBorderMode[4];intBorderConst[4];/*边际结束模式,被忽略*/char*imageDataOrigin;/*指针指向一个不同的图像数据结构,是为了纠正图像内存分配准备的*/}IplImage;CvPoint的构造函数:inlineCvPointcvPoint(intx,inty);从CvPoint2D32f类型转换得来:inlineCvPointcvPointFrom32f(CvPoint2D32fpoint)CvSize的构造函数inlineCvSizecvSize(intwidth,intheight);CvScalar像素点数组typedefstructCvScalar{doubleval[4];}CvScalar;CvScalar的构造函数inlineCvScalarcvScalar(doubleval0,doubleval1=0,doubleval2=0,doubleval3=0);【后面三个参数可以缺省】例:存放三通道图像中的像素:cvScalar(255,255,255)CV_RGB是OpenCv中的一个宏:#defineCV_RGB(r,g,b)cvScalar((b),(g),(r),0)CvRect矩形框typedefstructCvRect{intx;/*方形的最左角的x-坐标*/inty;/*方形的最上或者最下角的y-坐标*/intwidth;/*宽*/intheight;}CvRect;构造函数:inlineCvRectcvRect(intx,inty,intwidth,intheight);CvMat二维矩阵typedefstructCvMat{inttype;/*CvMat标识,元素类型和标记*/intstep;/*以字节为单位的行数据长度*/introws;/*行数*/intcols;/*列数*/int*refcount;/*数据引用计数*/union{uchar*ptr;short*s;int*i;float*fl;double*db;}data;/*data指针*/......}矩阵的使用与操作:创建矩阵CreateMat:CvMat*cvCreateMat(introws,intcols,inttype);rows矩阵行数cols矩阵列数type矩阵元素类型,通常以CV_比特数(S|U|F)C通道数形式描述。例:CV_8UC1指8-bit无符号单通道矩阵,CV_32SC2指32-bit有符号二通道的矩阵。删除矩阵ReleaseMat:voidcvReleaseMat(CvMat**mat);复制矩阵CloneMat:CvMat*cvCloneMat(constCvMat*mat);初始化矩阵:①用cvMat初始化doublea[]={1,2,3,4,5,6,7,8,9,10,11,12};CvMatMa=cvMat(3,4,CV_64FC1,a);②用cvCreateMatHeader初始化CvMatMa;cvInintMatHeader(&Ma,3,4,CV_64FC1,a);初始化单位矩阵CvMat*M=cvCreateMat(4,4,CV_32FC1);cvSetIdentity(M);访问矩阵元素①直接访问cvmSet(M,i,j,2,0);//SetM(i,j);t=cvmGet(M,i,j);//GetM(i,j);②已知对齐方式的直接访问CvMat*M=cvCreateMat(4,4,CV_32FC1);intn=M-cols;float*data=M-data.fl;data[i*n+j]=3.0;③未知对齐方式的直接访问CvMat*M=cvCreateMat(4,4,CV_32FC1);intstep=M-step/sizeof(float);float*data=M-data.fl;(data+i*step)[j]=3.0;④直接访问一个已初始化的矩阵Ma[i*4+j]=2.0;矩阵间的操作:CvMat*Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc);//Ma+Mb=MccvSub(Ma,Mb,Mc);//Ma-Mb=MccvMatMul(Ma,Mb,Mc);//Ma*Mb=Mc矩阵间元素的操作:cvMul(Ma,Mb,Mc);//Ma.*Mb=MccvDiv(Ma,Mb,Mc);//Ma./Mb=MccvAddS(Ma,cvScalar(-10.0),Mc);//Ma.-10=Mc单个矩阵的操作:cvTranspose(Ma,Mb);//transpose(Ma)=MbCvScalart=cvTrace(Ma);//trace(Ma)=t.val[0]doubled=cvDet(Ma);//det(Ma)=dcvInvert=(Ma,Mb);//inv(Ma)=Mb向量乘法:doubleres=cvDotProduct(&Va,&Vb);//Va·Vb=rescvCrossProduct(&Va,&Vb,&Vc);//Va×Vb=Vc【角点】角点,目前没有明确的数学定义。角点就是兴趣点,其可被看作为极值点,即某方面的属性特别突出。角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点。【END角点】【角点检测】四种OpenCv角点检测方法1.cvGoodFeatureToTrack,cvCornerMinEigenVal,CornerEigenValsAndVecs:用到了图像差分的相关矩阵2.CornerHarris:利用CornerEigenValsAndVecs得到的图像差分相关矩阵,据其特征值和向量,判断角点,Harris角点探测器R(x,y)=det(M)-k*trace^2(M)3.FindCornerSubPix:子象素级角点定位,是基于向量正交性的观测而实现的。4.cvPreCornerDetect:计算一个二阶导多项式,角点被认为是函数的局部最大值。其实就是利用了梯度的变化率在边缘走向的投影能反映尖锐程度。实验表明这是一种比cvGoodFeaturesToTrack粗略的办法【1,2,4都是检测像素级的角点】【END角点检测】【图像处理函数】分割多通道数函数:cvCvtPixToPlane函数使用该函数必须包括#includecv.h头文件可看作:#definecvCvtPlitToPlanecvSplitvoidcvSplit(constCvArr*src,CvArr*dst0,CvArr*dst1,CvArr*dst2,CvArr*dst3);作用:分割多通道数组成几个单通道数组或者从数组中提取一个通道第一个参数是源数组(源图像),后面的是分离的单通道数组(单通道图像),若原数组为3通道的,最后一个参数为NULL或者0。cvCvtPlaneToPix函数#definecvCvtPlaneToPixcvMergevoidcvMerge(constCvArr*src0,constCvArr*src1,constCvArr*src2,constCvArr*src3,C
本文标题:OpenCv学习心得之程序
链接地址:https://www.777doc.com/doc-5233483 .html