




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenCV简介OpenCV简介OpenCV的特征OpenCV具有以下的特征:(1)开源计算机视觉采用C/C++编写。(2)使用目的是开发实时应用程序。(3)独立与操作系统、硬件和图形管理器。(4)具有通用的图象/视频载入、保存和获取模块。(5)具有底层和高层的应用开发包。OpenCV的特征OpenCV具有以下的特征:OpenCV的功能应用OpenCV能够实现以下功能:(1)对图象数据的操作,包括分配、释放、复制和转换数据。(2)对图象和视频的输入输出,指文件和摄像头作为输入,图象和视频文件作为输出。(3)具有对距陈和向量的操作以及线性代数的算法程序,包括距阵、解方程、特征值以及奇异值。(4)可对各种动态数据结构,如列表、队列、集合、树和图等进行操作。(5)具有基本的数字图象处理能力,如可进行滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图和图象金字塔等操作。OpenCV的功能应用OpenCV能够实现以下功能:(6)可对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hongh变换、多边形逼近、直线拟合、椭圆拟合和Delaunay三角划分等。(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应。(8)对运动的分析,如对光流、运动分割和跟踪的分析。(9)对目标的识别,可采用特征法和隐马尔科夫模型(HMM)法。(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等。(11)可对图像进行标注,如对线、二次曲线和多边形进行标注,还可以书写文字(目前之支持中文)。(6)可对各种结构进行分析,包括连接部件分析、轮廓处理、距离OpenCV模块OpenCV包括以下几个模块,其具体功能是:(1)CV主要的OpenCV函数。(2)CVAUX辅助的(实验性)OpenCV函数。(3)CXCORE数据结构与线性代数支持。(4)HIGHGUI图像界面函数。(5)ML机器学习,包括模式分类和回归分析等。(6)CVCAM负责读取摄像头数据的模块(在以后版本中,当HIGHGUI模块中加入DirectShow支持后,此模块将被废除)。OpenCV模块OpenCV包括以下几个模块,其具体功能是:学习资源目前,OpenCV方面的资源已经很多,当然最简单的方法还是在网上搜索,比如在Google搜索引擎()中输入”OpenCV”即可进行相关查找,这里给出一些信息作为参考。(1)参考手册英文请打开文件<opencv-root>/docs/index.htm进行查询。中文请打开网页/进行查阅。(2)网络资源官方网站网址是/technology/computing/opencv/。中文官方网站网址是/。软件下载网址是/projects/opencvlibrary/。(3)书籍请阅读北京航空航天大学出版社出版的《OpenCV教程》。学习资源目前,OpenCV方面的资源已经很多,当然最简单的方OpenCV基础1.OpenCV命名规则2.基本数据结构3.矩阵的使用与操作4.图象的使用与操作5.数据结构与数据操作OpenCV基础1.OpenCV命名规则OpenCV命名规则1.函数命名规则通用函数名为
cvActionTargetMod(…)
其中,Action表示核心函数(比如:Set,Create);
Target表示目标图像区域(比如:轮廓,多边形);
Mod表示可选变种(比如:变量类型)。2.矩阵数据类型通用矩阵数据类型为
CV_<bit_depth><S|U|P)C<number_of_channels>
其中,S表示带符号整数;
U表示无符号整数;
F表示浮点数。例如:CV_8UC1表示8位无符号单通道矩阵;
CV_32FC2表示32位浮点数双通道矩阵。OpenCV命名规则1.函数命名规则3.通用图像数据类型为
IPL_DEPTH_<bit_depth>(S|U|F)
其中,S,U,F的意义同矩阵数据类型。例如:IPL_DEPTH_8U表示8位无符号整数图像
IPL_DEPTH_32F表示32位浮点数图像4.头文件OpenCV的头文件有如下几个:#include<cv.h>#include<cvaux.h>#include<highgui.h>#include<cxcore.h>//不是必须的,它包含在cv.h中3.通用图像数据类型为基本的数据结构1.图像结构2.矩阵的与向量结构3.其他的数据结构(1)点的表示(2)长方形维数的表示(3)有偏移量的长方形表示基本的数据结构1.图像结构图像结构Opencv中的所有图像都采用同一个结构IplImage,该图像结构说明参考后面的PPT。实际上,IplImage是借鉴于Intel公司最早发布的IPP图像处理开发包中的定义;但由于IPP并非开源项目,因此对于OpenCV基本采用这个较复杂的图像结构,其版权方面的问题还有待研究。图像结构Opencv中的所有图像都采用同一个结构IplIma矩阵与向量结构矩阵与向量结构的和说明也可以参见后面的PPT。OpenCV采用一种独特的结构CvArr*。该结构是一个通用数组的表现形式,用做函数的参数,说明函数在调用该参数时接受多种类型的输入数据形式,比如IplImage*,CvMat*甚至CvSeq*。具体的数组形式在运行时应根据实际情况来分析。矩阵与向量结构矩阵与向量结构的和说明也可以参见后面的PPT其他数据结构(1)点的表示:CvPointp=cvPoint(intx,inty);CvPoint2D32fp=cvPoint2D32f(floatx,floaty);CvPoint3D32fp=cvPoint3D32f(floatx,floaty,floatz);Eg:p.x=5.0p.y=5.0其他数据结构(1)点的表示:(2)长方形的维数表示:CvSizer=cvSize(intwidth,intheight);CvSize2D32fr=cvSize2D32f(floatwidth,floatheight);(3)有便移量的长方形表示Cvrect
r=cvrect(intx,inty,intwidth,intheight);(2)长方形的维数表示:矩阵的使用和操作1.分配和释放矩阵OpenCV有一个矩阵操作的C语言的接口,另外也有一些C++语言的矩阵操作接口,通常C++语言接口更方便,且同样有效。在OpenCV中,向量是被当成是行或列为1的矩阵,并且矩阵在内存中的存储方式是按行存储,且每行按4字节对齐。矩阵的使用和操作1.分配和释放矩阵
(1)分配矩阵分配矩阵的原型为CvMat*cvCreateMat(introws,intcols,inttype);其中,type表示矩阵元素的类型,可以用如下形式表达CV_<bit_depth>(S|U|F)C<number_of_channels>Eg:CvMat*M=cvCreateMar(4,4CV_32FC1);(2)释放矩阵释放矩阵的函数原型为VoidcvReleaseMat(CvMat**);Eg:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(&M);
(1)分配矩阵(3)复制矩阵复制矩阵的函数原型为CvMat*cvCloneMat(cvMat);Eg:CvMat*M1=cvCreateMat(4,4,CV_32FC1);CvMat*M2;M2=cvCloneMat(M1);(4)初始化矩阵可按如下方法初始化一个3行4列矩阵。Doublea[]={1,2,3,4,5,6,7,8,9,10,11,12};CvMatMa=cvMat(3,4,CV_64FC1,a);或者:CvMatMa;CvInitMatHeader(&Ma,3,4,CV_64FC1,a);(3)复制矩阵(5)初始化单位矩阵可按如下方法初始化一个单位矩阵。CvMat*M=cvCreateMat(4,4,CV_32FC1);cvSetIdentity(M);(5)初始化单位矩阵访问矩阵元素直接访问下例是对元素M(i,j)进行数据赋值和读取。cvmSet(M,I,j,2,0);//setM(i,j)t=cvmGet(M,i,j);//GetM(i,j)(2)已知对齐方式的直接访问下例是对32位对齐方式存储的元素进行赋值。CvMat*M=cvCreateMat(4,4CV_32FC1);intn=M->cots;float*data=M->data.fl;Data[i*n+j]=3.0;访问矩阵元素直接访问(3)未知对齐方式的直接访问下例是对某种对齐方式存储的元素进行赋值。CvMat*M=cvCreateMat(4,4CV_32FC1);int
step=M->step/sizeof(float);float*data=M->data.fl;(data+i*step)[i]=3.0;(4)直接访问一个已初始化的矩阵下例对已出吃化的矩阵a进行数据赋值。Doublea[16];CvMatMa=cvM<at(3,4,CV_64FC1,a);A[i*4+j]=2.0;//Ma(i,j)=2.0;(3)未知对齐方式的直接访问矩阵的向量操作对矩阵和向量的操作分以下几种类型。(1)矩阵与矩阵之间的操作此类型包括:CvMat*Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc);//Ma+Mb->MccvSub(Ma,Mb,Mc);//Ma-Mb->MccvMatMul(Ma,Mb,Mc);//Ma*Mb->Mc矩阵的向量操作对矩阵和向量的操作分以下几种类型。(2)矩阵元素之间的操作此类型包括:CvMat*Ma,*Mb,*Mc;cvMul(Ma,Mb,Mc);//Ma.*Mb->MccvDiv(Ma,Mb,Mc);//Ma./Mb->MccvAddS(Ma,cvScalar(-10.0),Mc);//Ma.-10->Mc(3)向量乘法操作此类型包括:doubleva[]={1,2,3};doublevb[]={0,0,1};doublevc[3];CvMatVa=cvMat(3,1,CV_64FC1,va);CvMatVb=cvMat(3,1,CV_64FC1,vb);CvMatVc=cvMat(3,1,CV_64FC1,vc);doubleres=cvDotProduct(&Va,&Vb);//dotproduct:Va.Vb->rescvCrossProduct(&Va,&Vb,&Vc);//crossproduct:Va*Vb->Vc注意VA,VbVc在叉积中必须是3个元素的向量。(2)矩阵元素之间的操作(4)单个矩阵的操作此类型包括:CvMat*Ma,*Mb;cvTranspose(Ma,Mb);CvScalart=cvTrace(Ma0;Doubled=cvDet(Ma);cvInvert(Ma,Mb);(5)非齐次线性系统求解操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*x=cvCreateMat(3,3,CV_32FC1);CvMat*b=cvCreateMat(3,3,CV_32FC1);cvSolve(&A,&b,&x);(4)单个矩阵的操作(6)特征值分析(对称矩阵)操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*E=cvCreateMat(3,3,CV_32FC1);CvMat*I=cvCreateMat(3,3,CV_32FC1);cvEigenVV(&A,&E,&I);(7)奇异值分解操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*U=cvCreateMat(3,3,CV_32FC1);CvMat*D=cvCreateMat(3,3,CV_32FC1);CvMat*V=cvCreateMat(3,3,CV_32FC1);cvSVD(A,DU,V,CV_SVD_U_T|CV_SVD_V_T);(6)特征值分析(对称矩阵)操作图象的使用与操作1.分配和释放图象(1)分配一幅图象分配图象的函数原型为IplImage*cvCreateImage(CvSizesize,intdepth,intchannels);Eg1:IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);Eg2:IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);图象的使用与操作1.分配和释放图象(2)释放一幅图象释放图象的函数原型为VoidcvReleaseImage(IplImage**);Eg:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);cvReleaseImage(&img);(3)复制一幅图象复制图象的函数原型为IplImage*cvCloneImage(IplImage*);Eg:IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage*img2;Img2=cvCloneImage(img1);(2)释放一幅图象(4)设置或得到感兴趣区域ROI函数原型分别为VoidcvSetImageROI(IplImage*image,CvRecrect);VoidcvResetImageROI(IplImage*image);vRectcvGetImageROI(IplImage*image);大多数OpenCv函数都支持ROI。(5)设置或得到感兴趣区域COI函数原型分别为VoidcvSetImageCOI(IplImage*image,intcoi);//0=allIntcvGetImageCOI(IplImage*image);大多数OpenCv函数都支持COI。(4)设置或得到感兴趣区域ROI图象的读写(1)从文件读区图象IplImage*img=0;img=cvLoadImage(fileName);If(!img)printf(“Couldnotloadimagefile:%s\n”,fileName);默认情况下:img=cvLoadImage(fileName,flag);flag取不同的值表示的意义不同(2)向文件中写图象If(!cvSaveImage(outFileName,img))printf(“Couldnotsave:%s\n”,outFileName);输出的图象文件格式依赖于文件的扩展名。图象的读写(1)从文件读区图象访问图像像素
(坐标是从0开始的,并且是相对图像原点的位置。图像原点或者是左上角(img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL))假设有8-bit1-通道的图像I(IplImage*img):I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x]访问图像像素(坐标是从0开始的,并且是相对图像原点的位置。假设有8-bit3-通道的图像I(IplImage*img):I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3]I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1]I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2]例如,给点(100,100)的亮度增加30,那么可以这样做:CvPointpt={100,100};((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30;((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30;((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30;或者更高效地:CvPointpt={100,100};uchar*temp_ptr=&((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3];temp_ptr[0]+=30;temp_ptr[1]+=30;temp_ptr[2]+=30;假设有8-bit3-通道的图像I(IplImage*假设有32-bit浮点数,1-通道图像I(IplImage*img):I(x,y)~((float*)(img->imageData+img->widthStep*y))[x]假设有32-bit浮点数,1-通道图像I(Ipl现在,一般的情况下,假设有N-通道,类型为T的图像:I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c]你可以使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc)I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c)也有针对各种图像(包括4通道图像)和矩阵的函数(cvGet2D,cvSet2D),但是它们非常慢。
现在,一般的情况下,假设有N-通道,类型为T的图像:数据结构与数据操作1CvPoint2CvPoint2D32f3CvPoint3D32f4CvSize5CvSize2D32f6CvRect7CvScalar8CvTermCriteria9CvMat10CvMatND11CvSparseMat12IplImage13CvArr数据结构与数据操作1CvPointCvPoint二维坐标系下的点,类型为整型typedefstructCvPoint{intx;/*X坐标,通常以0为基点*/inty;/*y坐标,通常以0为基点*/}CvPoint;/*构造函数*/inlineCvPointcvPoint(intx,inty);/*从CvPoint2D32f类型转换得来*/inlineCvPointcvPointFrom32f(CvPoint2D32fpoint)CvPoint二维坐标系下的点,类型为整型CvPoint2D32f二维坐标下的点,类型为浮点typedefstructCvPoint2D32f{floatx;/*X坐标,通常以0为基点*/floaty;/*Y坐标,通常以0为基点*/}CvPoint2D32f;/*构造函数*/inlineCvPoint2D32fcvPoint2D32f(doublex,doubley);/*从CvPoint转换来*/inlineCvPoint2D32fcvPointTo32f(CvPointpoint);CvPoint2D32f二维坐标下的点,类型为浮点CvPoint3D32f
三维坐标下的点,类型为浮点typedefstructCvPoint3D32f{floatx;/*x-坐标,通常基于0*/floaty;/*y-坐标,通常基于0*/floatz;/*z-坐标,通常基于0*/}CvPoint3D32f;/*构造函数*/inlineCvPoint3D32fcvPoint3D32f(doublex,doubley,doublez);CvPoint3D32f三维坐标下的点,类型为浮点CvSize矩形框大小,以像素为精度typedefstructCvSize{intwidth;/*矩形宽*/intheight;/*矩形高*/}CvSize;/*构造函数*/inlineCvSizecvSize(intwidth,intheight);CvSize矩形框大小,以像素为精度CvSize2D32f
以亚像素精度标量矩形框大小typedefstructCvSize2D32f{floatwidth;/*矩形宽*/floatheight;/*矩形高*/}CvSize2D32f;/*构造函数*/inlineCvSize2D32fcvSize2D32f(doublewidth,doubleheight);{CvSize2D32fs;s.width=(float)width;s.height=(float)height;returns;}CvSize2D32f
以亚像素精度标量矩形框大小CvRect矩形框的偏移和大小typedefstructCvRect{intx;/*方形的最左角的x-坐标*/inty;/*方形的最上或者最下角的y-坐标*/intwidth;/*宽*/intheight;/*高*/}CvRect;/*构造函数*/inlineCvRectcvRect(intx,inty,intwidth,intheight);CvRect矩形框的偏移和大小CvScalar可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器typedefstructCvScalar{doubleval[4]}CvScalar;/*构造函数:用val0初始化val[0]用val1初始化val[1],以此类推*/inlineCvScalarcvScalar(doubleval0,doubleval1=0,doubleval2=0,doubleval3=0);/*构造函数:用val0123初始化所有val[0]...val[3]*/inlineCvScalarcvScalarAll(doubleval0123);/*构造函数:用val0初始化val[0],用0初始val[1],val[2],val[3]*/inlineCvScalarcvRealScalar(doubleval0);http://doc.blueruby.mydns.jp/opencv/classes/OpenCV/CvScalar.html
CvScalar可存放在1-,2-,3-,4-TUPLE类CvTermCriteria迭代算法的终止准则#defineCV_TERMCRIT_ITER1#defineCV_TERMCRIT_NUMBERCV_TERMCRIT_ITER#defineCV_TERMCRIT_EPS2typedefstructCvTermCriteria{inttype;/*CV_TERMCRIT_ITER和CV_TERMCRIT_EPS二值之一,或者二者的组合*/intmax_iter;/*最大迭代次数*/doubleepsilon;/*结果的精确性*/}CvTermCriteria;/*构造函数*/inlineCvTermCriteriacvTermCriteria(inttype,intmax_iter,doubleepsilon);在满足max_iter和epsilon的条件下检查终止准则并将其转换使得type=CV_TERMCRIT_ITER+CV_TERMCRIT_EPS*/CvTermCriteriacvCheckTermCriteria(CvTermCriteriacriteria,doubledefault_eps,intdefault_max_iters);CvTermCriteria迭代算法的终止准则CvMat多通道矩阵CvMat多通道矩阵CvMatND
多维、多通道密集数组CvMatND
多维、多通道密集数组CvSparseMat
多维、多通道稀疏数组CvSparseMat
多维、多通道稀疏数组IplImage
IPL图像头IplImage
IPL图像头IplImage结构来自于IntelImageProcessingLibrary(是其本身所具有的)。OpenCV只支持其中的一个子集:alphaChannel在OpenCV中被忽略。colorModel和channelSeq被OpenCV忽略。OpenCV颜色转换的唯一函数cvCvtColor把原图像的颜色空间的目标图像的颜色空间作为一个参数。dataOrder必须是IPL_DATA_ORDER_PIXEL(颜色通道是交叉存取),然而平面图像的被选择通道可以被处理,就像COI(感兴趣的通道)被设置过一样。align是被OpenCV忽略的,而用widthStep去访问后继的图像行。不支持maskROI。处理MASK的函数把他当作一个分离的参数。MASK在OpenCV里是8-bit,然而在IPL他是1-bit。tileInfo不支持。BorderMode和BorderConst是不支持的。每个OpenCV函数处理像素的邻近的像素,通常使用单一的固定代码边际模式。除了上述限制,OpenCV处理ROI有不同的要求。要求原图像和目标图像的尺寸或ROI的尺寸必须(根据不同的操作,例如cvPyrDown目标图像的宽(高)必须等于原图像的宽(高)除以2±1)精确匹配,而IPL处理交叉区域,如图像的大小或ROI大小可能是完全独立的。[编辑]IplImage结构来自于IntelImageProcCvArr不确定数组typedefvoidCvArr;CvArr*仅仅是被用于作函数的参数,用于指示函数接收的数组类型可以不止一个,如IplImage*,CvMat*甚至CvSeq*.最终的数组类型是在运行时通过分析数组头的前4个字节判断。取自/index.php/Cxcore%E5%9F%BA%E7%A1%80%E7%BB%93%E6%9E%84相关函数的运用见实例(PPT)CvArr不确定数组OpenCV简介OpenCV简介OpenCV的特征OpenCV具有以下的特征:(1)开源计算机视觉采用C/C++编写。(2)使用目的是开发实时应用程序。(3)独立与操作系统、硬件和图形管理器。(4)具有通用的图象/视频载入、保存和获取模块。(5)具有底层和高层的应用开发包。OpenCV的特征OpenCV具有以下的特征:OpenCV的功能应用OpenCV能够实现以下功能:(1)对图象数据的操作,包括分配、释放、复制和转换数据。(2)对图象和视频的输入输出,指文件和摄像头作为输入,图象和视频文件作为输出。(3)具有对距陈和向量的操作以及线性代数的算法程序,包括距阵、解方程、特征值以及奇异值。(4)可对各种动态数据结构,如列表、队列、集合、树和图等进行操作。(5)具有基本的数字图象处理能力,如可进行滤波、边缘检测、角点检测、采样与差值、色彩转换、形态操作、直方图和图象金字塔等操作。OpenCV的功能应用OpenCV能够实现以下功能:(6)可对各种结构进行分析,包括连接部件分析、轮廓处理、距离变换、各种距的计算、模板匹配、Hongh变换、多边形逼近、直线拟合、椭圆拟合和Delaunay三角划分等。(7)对摄像头的定标,包括发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计和立体对应。(8)对运动的分析,如对光流、运动分割和跟踪的分析。(9)对目标的识别,可采用特征法和隐马尔科夫模型(HMM)法。(10)具有基本的GUI功能,包括图像与视频显示、键盘和鼠标事件处理及滚动条等。(11)可对图像进行标注,如对线、二次曲线和多边形进行标注,还可以书写文字(目前之支持中文)。(6)可对各种结构进行分析,包括连接部件分析、轮廓处理、距离OpenCV模块OpenCV包括以下几个模块,其具体功能是:(1)CV主要的OpenCV函数。(2)CVAUX辅助的(实验性)OpenCV函数。(3)CXCORE数据结构与线性代数支持。(4)HIGHGUI图像界面函数。(5)ML机器学习,包括模式分类和回归分析等。(6)CVCAM负责读取摄像头数据的模块(在以后版本中,当HIGHGUI模块中加入DirectShow支持后,此模块将被废除)。OpenCV模块OpenCV包括以下几个模块,其具体功能是:学习资源目前,OpenCV方面的资源已经很多,当然最简单的方法还是在网上搜索,比如在Google搜索引擎()中输入”OpenCV”即可进行相关查找,这里给出一些信息作为参考。(1)参考手册英文请打开文件<opencv-root>/docs/index.htm进行查询。中文请打开网页/进行查阅。(2)网络资源官方网站网址是/technology/computing/opencv/。中文官方网站网址是/。软件下载网址是/projects/opencvlibrary/。(3)书籍请阅读北京航空航天大学出版社出版的《OpenCV教程》。学习资源目前,OpenCV方面的资源已经很多,当然最简单的方OpenCV基础1.OpenCV命名规则2.基本数据结构3.矩阵的使用与操作4.图象的使用与操作5.数据结构与数据操作OpenCV基础1.OpenCV命名规则OpenCV命名规则1.函数命名规则通用函数名为
cvActionTargetMod(…)
其中,Action表示核心函数(比如:Set,Create);
Target表示目标图像区域(比如:轮廓,多边形);
Mod表示可选变种(比如:变量类型)。2.矩阵数据类型通用矩阵数据类型为
CV_<bit_depth><S|U|P)C<number_of_channels>
其中,S表示带符号整数;
U表示无符号整数;
F表示浮点数。例如:CV_8UC1表示8位无符号单通道矩阵;
CV_32FC2表示32位浮点数双通道矩阵。OpenCV命名规则1.函数命名规则3.通用图像数据类型为
IPL_DEPTH_<bit_depth>(S|U|F)
其中,S,U,F的意义同矩阵数据类型。例如:IPL_DEPTH_8U表示8位无符号整数图像
IPL_DEPTH_32F表示32位浮点数图像4.头文件OpenCV的头文件有如下几个:#include<cv.h>#include<cvaux.h>#include<highgui.h>#include<cxcore.h>//不是必须的,它包含在cv.h中3.通用图像数据类型为基本的数据结构1.图像结构2.矩阵的与向量结构3.其他的数据结构(1)点的表示(2)长方形维数的表示(3)有偏移量的长方形表示基本的数据结构1.图像结构图像结构Opencv中的所有图像都采用同一个结构IplImage,该图像结构说明参考后面的PPT。实际上,IplImage是借鉴于Intel公司最早发布的IPP图像处理开发包中的定义;但由于IPP并非开源项目,因此对于OpenCV基本采用这个较复杂的图像结构,其版权方面的问题还有待研究。图像结构Opencv中的所有图像都采用同一个结构IplIma矩阵与向量结构矩阵与向量结构的和说明也可以参见后面的PPT。OpenCV采用一种独特的结构CvArr*。该结构是一个通用数组的表现形式,用做函数的参数,说明函数在调用该参数时接受多种类型的输入数据形式,比如IplImage*,CvMat*甚至CvSeq*。具体的数组形式在运行时应根据实际情况来分析。矩阵与向量结构矩阵与向量结构的和说明也可以参见后面的PPT其他数据结构(1)点的表示:CvPointp=cvPoint(intx,inty);CvPoint2D32fp=cvPoint2D32f(floatx,floaty);CvPoint3D32fp=cvPoint3D32f(floatx,floaty,floatz);Eg:p.x=5.0p.y=5.0其他数据结构(1)点的表示:(2)长方形的维数表示:CvSizer=cvSize(intwidth,intheight);CvSize2D32fr=cvSize2D32f(floatwidth,floatheight);(3)有便移量的长方形表示Cvrect
r=cvrect(intx,inty,intwidth,intheight);(2)长方形的维数表示:矩阵的使用和操作1.分配和释放矩阵OpenCV有一个矩阵操作的C语言的接口,另外也有一些C++语言的矩阵操作接口,通常C++语言接口更方便,且同样有效。在OpenCV中,向量是被当成是行或列为1的矩阵,并且矩阵在内存中的存储方式是按行存储,且每行按4字节对齐。矩阵的使用和操作1.分配和释放矩阵
(1)分配矩阵分配矩阵的原型为CvMat*cvCreateMat(introws,intcols,inttype);其中,type表示矩阵元素的类型,可以用如下形式表达CV_<bit_depth>(S|U|F)C<number_of_channels>Eg:CvMat*M=cvCreateMar(4,4CV_32FC1);(2)释放矩阵释放矩阵的函数原型为VoidcvReleaseMat(CvMat**);Eg:CvMat*M=cvCreateMat(4,4,CV_32FC1);cvReleaseMat(&M);
(1)分配矩阵(3)复制矩阵复制矩阵的函数原型为CvMat*cvCloneMat(cvMat);Eg:CvMat*M1=cvCreateMat(4,4,CV_32FC1);CvMat*M2;M2=cvCloneMat(M1);(4)初始化矩阵可按如下方法初始化一个3行4列矩阵。Doublea[]={1,2,3,4,5,6,7,8,9,10,11,12};CvMatMa=cvMat(3,4,CV_64FC1,a);或者:CvMatMa;CvInitMatHeader(&Ma,3,4,CV_64FC1,a);(3)复制矩阵(5)初始化单位矩阵可按如下方法初始化一个单位矩阵。CvMat*M=cvCreateMat(4,4,CV_32FC1);cvSetIdentity(M);(5)初始化单位矩阵访问矩阵元素直接访问下例是对元素M(i,j)进行数据赋值和读取。cvmSet(M,I,j,2,0);//setM(i,j)t=cvmGet(M,i,j);//GetM(i,j)(2)已知对齐方式的直接访问下例是对32位对齐方式存储的元素进行赋值。CvMat*M=cvCreateMat(4,4CV_32FC1);intn=M->cots;float*data=M->data.fl;Data[i*n+j]=3.0;访问矩阵元素直接访问(3)未知对齐方式的直接访问下例是对某种对齐方式存储的元素进行赋值。CvMat*M=cvCreateMat(4,4CV_32FC1);int
step=M->step/sizeof(float);float*data=M->data.fl;(data+i*step)[i]=3.0;(4)直接访问一个已初始化的矩阵下例对已出吃化的矩阵a进行数据赋值。Doublea[16];CvMatMa=cvM<at(3,4,CV_64FC1,a);A[i*4+j]=2.0;//Ma(i,j)=2.0;(3)未知对齐方式的直接访问矩阵的向量操作对矩阵和向量的操作分以下几种类型。(1)矩阵与矩阵之间的操作此类型包括:CvMat*Ma,*Mb,*Mc;cvAdd(Ma,Mb,Mc);//Ma+Mb->MccvSub(Ma,Mb,Mc);//Ma-Mb->MccvMatMul(Ma,Mb,Mc);//Ma*Mb->Mc矩阵的向量操作对矩阵和向量的操作分以下几种类型。(2)矩阵元素之间的操作此类型包括:CvMat*Ma,*Mb,*Mc;cvMul(Ma,Mb,Mc);//Ma.*Mb->MccvDiv(Ma,Mb,Mc);//Ma./Mb->MccvAddS(Ma,cvScalar(-10.0),Mc);//Ma.-10->Mc(3)向量乘法操作此类型包括:doubleva[]={1,2,3};doublevb[]={0,0,1};doublevc[3];CvMatVa=cvMat(3,1,CV_64FC1,va);CvMatVb=cvMat(3,1,CV_64FC1,vb);CvMatVc=cvMat(3,1,CV_64FC1,vc);doubleres=cvDotProduct(&Va,&Vb);//dotproduct:Va.Vb->rescvCrossProduct(&Va,&Vb,&Vc);//crossproduct:Va*Vb->Vc注意VA,VbVc在叉积中必须是3个元素的向量。(2)矩阵元素之间的操作(4)单个矩阵的操作此类型包括:CvMat*Ma,*Mb;cvTranspose(Ma,Mb);CvScalart=cvTrace(Ma0;Doubled=cvDet(Ma);cvInvert(Ma,Mb);(5)非齐次线性系统求解操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*x=cvCreateMat(3,3,CV_32FC1);CvMat*b=cvCreateMat(3,3,CV_32FC1);cvSolve(&A,&b,&x);(4)单个矩阵的操作(6)特征值分析(对称矩阵)操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*E=cvCreateMat(3,3,CV_32FC1);CvMat*I=cvCreateMat(3,3,CV_32FC1);cvEigenVV(&A,&E,&I);(7)奇异值分解操作此类型包括:CvMat*A=cvCreateMat(3,3,CV_32FC1);CvMat*U=cvCreateMat(3,3,CV_32FC1);CvMat*D=cvCreateMat(3,3,CV_32FC1);CvMat*V=cvCreateMat(3,3,CV_32FC1);cvSVD(A,DU,V,CV_SVD_U_T|CV_SVD_V_T);(6)特征值分析(对称矩阵)操作图象的使用与操作1.分配和释放图象(1)分配一幅图象分配图象的函数原型为IplImage*cvCreateImage(CvSizesize,intdepth,intchannels);Eg1:IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);Eg2:IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);图象的使用与操作1.分配和释放图象(2)释放一幅图象释放图象的函数原型为VoidcvReleaseImage(IplImage**);Eg:IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);cvReleaseImage(&img);(3)复制一幅图象复制图象的函数原型为IplImage*cvCloneImage(IplImage*);Eg:IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);IplImage*img2;Img2=cvCloneImage(img1);(2)释放一幅图象(4)设置或得到感兴趣区域ROI函数原型分别为VoidcvSetImageROI(IplImage*image,CvRecrect);VoidcvResetImageROI(IplImage*image);vRectcvGetImageROI(IplImage*image);大多数OpenCv函数都支持ROI。(5)设置或得到感兴趣区域COI函数原型分别为VoidcvSetImageCOI(IplImage*image,intcoi);//0=allIntcvGetImageCOI(IplImage*image);大多数OpenCv函数都支持COI。(4)设置或得到感兴趣区域ROI图象的读写(1)从文件读区图象IplImage*img=0;img=cvLoadImage(fileName);If(!img)printf(“Couldnotloadimagefile:%s\n”,fileName);默认情况下:img=cvLoadImage(fileName,flag);flag取不同的值表示的意义不同(2)向文件中写图象If(!cvSaveImage(outFileName,img))printf(“Couldnotsave:%s\n”,outFileName);输出的图象文件格式依赖于文件的扩展名。图象的读写(1)从文件读区图象访问图像像素
(坐标是从0开始的,并且是相对图像原点的位置。图像原点或者是左上角(img->origin=IPL_ORIGIN_TL)或者是左下角(img->origin=IPL_ORIGIN_BL))假设有8-bit1-通道的图像I(IplImage*img):I(x,y)~((uchar*)(img->imageData+img->widthStep*y))[x]访问图像像素(坐标是从0开始的,并且是相对图像原点的位置。假设有8-bit3-通道的图像I(IplImage*img):I(x,y)blue~((uchar*)(img->imageData+img->widthStep*y))[x*3]I(x,y)green~((uchar*)(img->imageData+img->widthStep*y))[x*3+1]I(x,y)red~((uchar*)(img->imageData+img->widthStep*y))[x*3+2]例如,给点(100,100)的亮度增加30,那么可以这样做:CvPointpt={100,100};((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3]+=30;((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+1]+=30;((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3+2]+=30;或者更高效地:CvPointpt={100,100};uchar*temp_ptr=&((uchar*)(img->imageData+img->widthStep*pt.y))[pt.x*3];temp_ptr[0]+=30;temp_ptr[1]+=30;temp_ptr[2]+=30;假设有8-bit3-通道的图像I(IplImage*假设有32-bit浮点数,1-通道图像I(IplImage*img):I(x,y)~((float*)(img->imageData+img->widthStep*y))[x]假设有32-bit浮点数,1-通道图像I(Ipl现在,一般的情况下,假设有N-通道,类型为T的图像:I(x,y)c~((T*)(img->imageData+img->widthStep*y))[x*N+c]你可以使用宏CV_IMAGE_ELEM(image_header,elemtype,y,x_Nc)I(x,y)c~CV_IMAGE_ELEM(img,T,y,x*N+c)也有针对各种图像(包括4通道图像)和矩阵的函数(cvGet2D,cvSet2D),但是它们非常慢。
现在,一般的情况下,假设有N-通道,类型为T的图像:数据结构与数据操作1CvPoint2CvPoint2D32f3CvPoint3D32f4CvSize5CvSize2D32f6CvRect7CvScalar8CvTermCriteria9CvMat10CvMatND11CvSparseMat12IplImage13CvArr数据结构与数据操作1CvPointCvPoint二维坐标系下的点,类型为整型typedefstructCvPoint{intx;/*X坐标,通常以0为基点*/inty;/*y坐标,通常以0为基点*/}CvPoint;/*构造函数*/inlineCvPointcvPoint(intx,inty);/*从CvPoint2D32f类型转换得来*/inlineCvPointcvPointFrom32f(CvPoint2D32fpoint)CvPoint二维坐标系下的点,类型为整型CvPoint2D32f二维坐标下的点,类型为浮点typedefstructCvPoint2D32f{floatx;/*X坐标,通常以0为基点*/floaty;/*Y坐标,通常以0为基点*/}CvPoint2D32f;/*构造函数*/inlineCvPoint2D32fcvPoint2D32f(doublex,doubley);/*从CvPoint转换来*/inlineCvPoint2D32fcvPointTo32f(CvPointpoint);CvPoint2D32f二维坐标下的点,类型为浮点CvPoint3D32f
三维坐标下的点,类型为浮点typedefstructCvPoint3D32f{floatx;/*x-坐标,通常基于0*/floaty;/*y-坐标,通常基于0*/floatz;/*z-坐标,通常基于0*/}CvPoint3D32f;/*构造函数*/inlineCvPoint3D32fcvPoint3D32f(doublex,doubley,doublez);CvPoint3D32f三维坐标下的点,类型为浮点CvSize矩形框大小,以像素为精度typedefstructCvSize{intwidth;/*矩形宽*/intheight;/*矩形高*/}CvSize;/*构造函数*/inlineCvSizecvSize(intwidth,intheight);CvSize矩形框大小,以像素为精度CvSize2D32f
以亚像素精度标量矩形框大小typedefstructCvSize2D32f{floatwidth;/*矩形宽*/floatheight;/*矩形高*/}CvSize2D32f;/*构造函数*/inlineCvSize2D32fcvSize2D32f(doublewidth,doubleheight);{CvSize2D32fs;s.width=(float)width;s.height=(float)height;returns;}CvSize2D32f
以亚像素精度标量矩形
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 生命爱国教育
- 手术室输血安全的护理
- 滚针操作流程护理
- 临床护理带教老师
- 避孕药知识培训课件下载
- 物联网行业分析24
- 移动互联网技术产业进展与发展趋势讲义
- 湖北省孝感市汉川市第二中学2024-2025学年3月高三适应性考试(一)语文试题含解析
- 广西职业师范学院《数字移动通信原理》2023-2024学年第二学期期末试卷
- 浙江中医药大学《口腔颌面外科学》2023-2024学年第二学期期末试卷
- 新《医院财务制度》课件
- 医院物业项目投标书
- pep人教版英语三年级下册Unit3《Atthezoo》单元作业设计(二)
- 自动扶梯与自动人行道2023版自行检测规则
- 反假货币《外币美元》知识考试题库(含答案)
- 重庆大轰炸优秀课件
- 附件1:中国联通动环监控系统B接口技术规范(V3.0)
- 防浪墙工程招标文件
- 危险化学品安全周知卡(硫酸 )
- 外贸客户报价单中英文格式模板
- 中药学中药性味归经功效归纳
评论
0/150
提交评论