首页 EMGUCV基础

EMGUCV基础

举报
开通vip

EMGUCV基础第一章EmguCv简介:EmguCV是.NET平台下对OpenCV图像处理库的封装。也就是OpenCV的.NET版。它运行在.NET兼容的编程语言下调用OpenCV的函数,如C#、VB、VC++等。同时这个封装库可以在Mono下编译和在Linux/MacOSX上运行。EmguCv的优势在于.net非常完美的界面,给用户操作带来非常直观的感觉。EmguCv每个版本都有修改一部分函数,在兼容旧版本下做的不是很好。本书主要采用VS2013+EmguCv3.0版本,希望读者也采用相同的版本进行学习,从而避免一些版本兼容上的...

EMGUCV基础
第一章EmguCv简介:EmguCV是.NET平台下对OpenCV图像处理库的封装。也就是OpenCV的.NET版。它运行在.NET兼容的编程语言下调用OpenCV的函数,如C#、VB、VC++等。同时这个封装库可以在Mono下编译和在Linux/MacOSX上运行。EmguCv的优势在于.net非常完美的界面,给用户操作带来非常直观的感觉。EmguCv每个版本都有修改一部分函数,在兼容旧版本下做的不是很好。本书主要采用VS2013+EmguCv3.0版本,希望读者也采用相同的版本进行学习,从而避免一些版本兼容上的问题。在国内并不流行EmguCv,因此关于EmguCv的资料比较少,从而导致了新手学习起来比较费劲,同时使更多想去学习EmguCv的人放弃学习,这样的一个恶性循环。EmguCv安装和配置:EmguCv的安装还算比较简单,这边采用EmguCv3.0版本进行安装解析。第一步:下载EmguCv3.0在官网https://sourceforge.net/projects/emgucv/files/emgucv/进入界面选择3.0.0版本进行下载,如图1.1所示。(写作时间为2016年4月,因此3.1版本也已经发布。这边边通过对某一个版本的学习,在去了解其它版本的也是非常简单的。)图1.1EmguCv安装下载列表点击3.0.0进入下载界面,如图1.2所示。图1.2EmguCv3.0.0下载界面前两者是带有Cuda加速的EmguCV,后两者则为没有带Cuda加速的EmguCv。读者可以查看电脑是否支持Cuda加速进行选择。这边笔者下载第二个。第二部:安装EmguCv下载完成之后,如图1.3所示。双击安装包进行提取文件,如图1.4所示,安装EmguCv的过程和安装其它软件的过程基本一致。图1.3EmguCv安装程序图1.4提取EmguCv文件提取完成之后,如图1.5所示,得到EmguCv文件。图1.5EmguCv全部文件第三步:配置EmguCv配置流程如下。【计算机】→【(右击)属性】→【高级系统设置】→【高级】→【环境变量】如图1.6所示。双击系统变量下的Path变量,在变量值(V)中添加D:\EMgu\libemgucv-windows-universal-cuda-3.0.0.2158\bin(D:\EMgu为笔者安装目录)如图1.7所示(如果前面有其他的路径需要使用英文的”;”隔开)。如果用户是32位操作系统也可以添加D:\EMgu\libemgucv-windows-universal-cuda-3.0.0.2158\bin\x86,如果用户是64位操作系统也可以添加D:\EMgu\libemgucv-windows-universal-cuda-3.0.0.2158\bin\x64。图1.6系统变量图1.7编辑系统变量第四步:使用EmguCv【打开VS2013(图1.8)】图1.8打开Vs2013【创建VisualC#窗体应用程序(图1.9)】图1.9创建VisualC#窗体应用程序【在解决 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 的引用中添加引用(图1.10)】图1.10在解决方案的引用中添加引用图中所选的三个.dll最常用的.dll。【加载Emgu.Cv.UI.dll中的控件】(【工具】→【选择工具箱(如图1.11)】→【单击选择工具箱】→【在.NETFramework组件栏中单击浏览】→【选择安装路径下的bin文件夹下的Emgu.CV.UI.dll(如图1.12)】→【单击确定进行添加】→【添加完成在工具箱中就有所选择的工具(如图1.13)】。图1.11选择工具箱图1.12添加Emgu.CV.UI.dll中的控件图1.12已经添加好的控件ImageBox控件为图像主要显示控件。【编写代码】向Form1窗体中添加一个ImageBox控件和两个Button控件,如图1.13。设置imageBox1的SizeMode属性为Zoom,如图1.14。图1.13Form1界面图1.14ImageBox1属性设置编写代码如下:在程序最上端需要添加这两行。对于作用之后将会详细解答。usingEmgu.CV.Structure;usingEmgu.CV;privatevoidbutton1_Click(objectsender,EventArgse)//在“创建图片”按钮的单击事件中写入代码。{Imageimage=newImage(320,240,newBgr(0,0,255));//创建一张320*240尺寸颜色为红色的图像。imageBox1.Image=image;//在ImageBox1控件中显示所创建好的图像。}privatevoidbutton2_Click(objectsender,EventArgse)//在“打开本地图片”按钮的单击事件中写入代码。{OpenFileDialogop=newOpenFileDialog();//实例化打开对画框。if(op.ShowDialog()==DialogResult.OK){Matscr=newMat(op.FileName,Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定路径加载图片。imageBox1.Image=scr;//显示加载完成的图片。}}在代码编写完成之后,运行程序。在单击创建按钮之后出现异常程序,如图1.15图1.15初始化异常这个由两方面造成之前的配置出错:在系统环境变量Path中添加的路径不对,或者在路径前面没有使用分号与其他路径隔开。在确保配置没有出错的情况下,单击【项目】→【属性】→【生成】→【目标平台】。根据用户的操作系位数决定,32为则选择x86,64为的选择x64如图1.16。如果以上两种方法都不行,请重启电脑。网上安装EmguCv的bin文件夹整个复制到程序文件下的Debug文件下。这种方法不推荐,每次操作都需要复制bin文件,显得比较麻烦,应为复制bin文件夹就相当于在环境变量中设置Path路径。图1.16目标平台以上问题解决之后再次运行程序效果如下:单击创建图片按钮如图1.17所示图1.17单击创建按钮单击打开打开本地图片按钮,选择图片,如图1.18所示图1.18单击打开本地图片按钮程序正常执行,说明可以在我们电脑上使用EmguCv。接来下让我们一起打开EmguCv的大门,感受EmguCv的强大之处。如果仍然出现初始化异常,请不要着急,慢慢检查步骤。或者把Emgucv安装目录下整个bin文件夹复制到程序的Debug文件夹下,再设置目标平台。只要坚持下来,相信总是会有收获的。不要被一些小小的困难所压倒,因为接触一个新的软件的同时,总是会遇到七七八八的问题,解决问题的同时也是学习的过程。EmguCv在资料比较少的情况下,所遇到的问题会更多。所以这边希望想真正去学习这个的同学,坚持下来。命名空间介绍:C#的命名空间就相当于用来”装类”的一个箱子,类又相当于用来”装函数”的一个箱子。C#通过命名空间来调用类是非常方便的,操作也很简单。之前我们通过使用Emgu.CV.Structure这个命名空间和Emgu.CV命名空间来调用类Image和Mat。Emgu.CV.Structure和Emgu.CV是最基本的两个两个命名空间。EmguCV命名空间:EmguCv不仅仅只有Emgu.CV.Structure和Emgu.CV两个命名空间。EmguCv和C#接口的命名空间源于添加引用的.dll(动态链接库文件)文件,也就说明了不同的.dll(动态链接库文件)文件有不同的命名空间。这边列举主要的命名空间如表1.1所示。动态链接库文件存在命名空间Emgu.CV.dll(最基本的动态链接库文件)Emgu.CV.Cvb、Emgu.CV.CvEnum、Emgu.CV.Features2D、Emgu.CV.Flann、Emgu.CV.Geodetic、Emgu.CV.Reflection、Emgu.CV.Structure、Emgu.CV.Tiff、Emgu.CV.Util、Emgu.CV.VideoSurveillance;Emgu.Util.dllEmgu.Util.TypeEnum;Emgu.UI.dllEmgu.CV.UI(为之前添加EmguCv控件的命名空间,控件也是类);Emgu.CV.Contirb.dllEmgu.CV.BgSegm、Emgu.CV.Face、Emgu.CV.Text、Emgu.CV.XFeatures2D;Emgu.CV.Cuda.dllEmgu.CV.Cuda(Cuda加速);Emgu.CV.ML.dllEmgu.CV.ML、Emgu.CV.ML.MlEnum、Emgu.CV.ML.Structure(机器学习);Emgu.CV.Stitching.dllEmgu.CV.Stitching(图像拼接);Emgu.CV.OCR.dllEmgu.CV.OCR(OpticalCharacterRecognition,HYPERLINK"http://baike.baidu.com/view/230331.htm"\t"http://baike.baidu.com/_blank"光学字符识别)...........等等。表1.1动态链接库对应的命名空间如何正确使用命名空间:据表1.1不完全列举就有很多命名空间,那么怎样正确使用EmguCv的命名空间呢?笔者举个例子来介绍如何正确添加命名空间。比如OrbFeaturesFinder(ORB特征查找类)。当我们没有添加引用.dll的同时也没有using命名空间,出现错误如图1.19所示。图1.19这时我们需要用到EmguCv自带的一个文档查询库,如图1.20所示。该文件在于EmguCv安装目录下。图1.20文档查询库操作步骤如下:【点击搜索】→【输入搜索 内容 财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容 (OrbFeaturesFinder)】→【点击列出主题】→【双击搜索到的第一个(如图1.21所示)】→【找到命名空间及动态链接库】图1.21搜索相关结果这样我们发现了OrbFeaturesFinder这个类是在命名空间为Emgu.CV.Stitching中,动态链接库为Emgu.CV.Stitching.dll。Emgu.CV.Documentation介绍:这个文档对于学习EmguCV的帮助非常大。本人学习EmguCv主要通过三种路径。通过别人写好的demo去学习EmguCv,这个资源毕竟有限。通过学习OpenCV(资料多)过度到EmguCV。最后就是通过这个文档学习。接下来讲解如何使用文档自学。【打开文档】→【文档界面又侧有所有的命名空间】→【每个命名空间下有对应的类】→【每个类下面又有不同的方法】。接下来举简单的例子来说明。【点击想去了解的命名空间(Emgu.CV命名空间)】→【点击想去了解的类(CvInvoke类)】→【在Methods栏中存在该类的所有函数,函数的右边存在函数的表述(如图1.22所示)】→【点击需要使用的函数(Erode)】→【更详细的函数解析,使用方法和参数(如图1.23所示)】。图1.22图1.23Erode函数详细解析这样通过文档的学习和不断积累的过程,我们最终将会熟练掌握这门技术。EmguCV自带的历程:正如上面所说,我们可以通过别人写好的demo来学习EmguCv,开发者专门为我们写好了非常优秀的代码给我们参考,学习。在安装目录中有一个文件夹名字为Emgu.CV.Example。这个文件夹里面有非常多的具有代表性的demo,如图1.24所示。图1.24EmguCv自带demo读者可以通过这些例程更好的来了解和学习EmguCv。本章内容到此为止,接下来会通过录制视频讲解使读者更加详细的了解和使用以上内容。第二章数据结构本章节,我们将学习到EmguCv常用到的数据结构,为EmguCv学习打下坚实的基础。由于EmguCv的数据结构过多,这边主要讲解常用到的数据结构类型。.net系统中“点”结构类型介绍:Point:为二维坐标系下的”点“类型,以图像左上角为坐标原点。Point类型并非是EmguCv中的类型,而是在System.Drawing命名空间中。常见创建方法:publicPoint(intx,inty);//指定坐标创建Point。publicPoint(Sizesz)://指定大小创建Point,se宽度为x坐标,se高度为y坐标。常见使用方法:Pointpoint=newPoint(10,10);intx=point.X;//获得点的x坐标。inty=point.Y;//获得点的y坐标。PointF:表示二维坐标系下的点,以图像左上角为坐标原点,数据类型为单精度浮点类型。在System.Drawing命名空间中。PointF和Point具有相同的用法,这边主要 分析 定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析 类型之间的相互转换。Point系统可以默认转换为PointF类型。类似于Int类型可以转成Float类型。PointF类型转成Point类型这边可以使用函数Point结构体中的Truncate函数实现:publicstaticPointTruncate(PointFvalue);//把PointF类型转成Point类型。EmguCv“点”结构类型介绍:MCvPoint2D64f、MCvPoint3D32f、MCvPoint3D64f这个三个点均在Emgu.CV.Structure命名空间中。MCvPoint2D64f表示二维64位双精度浮点类型的点,MCvPoint3D32f表示三维32为单精度浮点类型的点。MCvPoint3D64f表三维64位双精度浮点类型的点。查看结构类型的使用方法步骤如下:MCvPoint3D64f为例。【如图2.1所示】→【右击选中的结构体,单击”转到定义“,或者鼠标选中结构体按下”F12“键。如图2.2所示】→【这样可以查看结构体的的信息(如图2.3所示)】查看类或者函数也是这些步骤。图2.1图2.2图2.3MCvPoint3D64f信息常见创建方法:publicMCvPoint3D32f(floatx,floaty,floatz)//指定坐标创建MCvPoint3D32f。常见使用方法:MCvPoint3D64fmcvPoint=newMCvPoint3D64f(0,0,0);分别获得X,Y,Z坐标。doublex=mcvPoint.X;doubley=mcvPoint.Y;doublez=mcvPoint.Z;MCvPoint2D64f信息如图2.4。MCvPoint2D64f的信息操作如上,这边不再列举。图2.4MCvPoint2D64f信息双击每个类型前面的符号,便可以查看官方给定的注释。如图2.5所示。图2.5EmguCv“线段”结构类型介绍:在EmguCv中主要有LineSegment2D、LineSegment2DF、LineSegment3DF表示线段的数据类型,以Emgu.CV.Structure为命名空间。LineSegment2D表示2维平面整型数据结构的线段。LineSegment2DF表示2维平面单精度浮点数据结构的线段。LineSegment3DF表示3维空间单精度浮点数据结构的线段。以LineSegment2DF为例,解析使用方法。(也可以转到定义去了解更全面的介绍信息。如图2.6所示。)常见创建方法:publicLineSegment2DF(PointFp1,PointFp2);指定坐标点创建LineSegment2DF类型。常见使用方法:publicPointFDirection{get;}//获得直线的方向。publicdoubleLength{get;}//获得直线的夹角。publicPointFP1{get;set;}//操作直线的首点。publicPointFP2{get;set;}//操作图像的末点。publicdoubleGetExteriorAngleDegree(LineSegment2DFotherLine);得到两直线的夹角。publicintSide(PointFpoint);//判断点坐标相对于直线的位置。publicfloatYByX(floatx);//输入X点,输出所在直线的Y点。图2.6LineSegment2DF结构信息EmguCv”圆形“结构类型介绍:圆形主要包括圆和椭圆两种类型,以下分别介绍。以Emgu.CV.Structure为命名空间。CircleF:圆常见创建方法:publicCircleF(PointFcenter,floatradius);//指定圆心半径创建CircleF。常见使用方法:publicdoubleArea{get;}//获得圆的面积。publicPointFCenter{get;set;}//操作圆的圆心。publicfloatRadius{get;set;}//操作圆的半径。Ellipse:椭圆常见创建方法:publicEllipse(RotatedRectbox2d);//指定带角度的矩阵创建Ellipse类型。publicEllipse(PointFcenter,SizeFsize,floatangle)//指定参数创建Ellipse类型。EmguCv”三角形“结构类型介绍:EmguCv“三角形”主要包括Triangle2DF、Triangle2DF、Triangle3DF类型。以Emgu.CV.Structure为命名空间。Triangle2DF:二维三角形。常见创建方法:publicTriangle2DF(PointFv0,PointFv1,PointFv2);//指定三个顶点创建Triangle2DF三角形。常见使用方法:publicdoubleArea{get;}//获得三角形面积。publicPointFCenteroid{get;}//获得三角形重心。//依次获得三角形的三个顶点坐标。publicPointFV0{get;set;};publicPointFV1{get;set;};publicPointFV2{get;set;};publicPointF[]GetVertices();//直接获得三角形的三个顶点。Triangle3DF:三维三角形:常见创建方法:publicTriangle3DF(MCvPoint3D32fv0,MCvPoint3D32fv1,MCvPoint3D32fv2);//指定三个MCvPoint3D32f类型的点创建Triangle3DF。常见使用方法:publicdoubleArea{get;}//获得三角形面积。publicMCvPoint3D32fCenteroid{get;}//获得三角形重心。//依次获得三角形的三个顶点坐标。publicMCvPoint3D32fV0{get;set;};PublicMCvPoint3D32fV1{get;set;};publicMCvPoint3D32fV2{get;set;};EmguCv和.Net”矩形“结构类型介绍:我们将会用到三种类型来表示矩形。RotatedRect:RotatedRect:以Emgu.CV.Structure为命名空间。表示带有旋转角度的矩形。常见创建方法:publicRotatedRect(PointFcenter,SizeFsize,floatangle)//指定中心,大小,角度创建RotatedRect类型。常见使用方法:publicRectangleMinAreaRect();获得最小面积的外接矩形。publicfloatAngle;//获得角度。publicPointFCenter;//获得中心点。publicSizeFSize;获得大小。Rectangle:Rectangle矩形不带旋转角度,或者旋转角度为0,命名空间为System.Drawing并非是EmguCv矩形。常见创建方法:publicRectangle(Pointlocation,Sizesize);//指定左上角点和大小创建Rectangle类型。publicRectangle(intx,inty,intwidth,intheight);//指定左上角坐标和宽度,高度创建Rectangle。常见使用方法:publicboolContains(Pointpt);//判断矩形是否包括点。publicstaticRectangleTruncate(RectangleFvalue);//RectangleF类型强制转成Rectangle类型。publicstaticRectangleUnion(Rectanglea,Rectangleb);//获得两个矩形的并集。publicstaticRectangleIntersect(Rectanglea,Rectangleb);//获得两个矩形的交集。RectangleF:为Rectangle的Float类型,在精度上比较高,其他的方法基本一致,这边不再重复介绍。命名空间为System.Drawing。颜色空间结构介绍:Rgb:(三通道颜色空间)RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色,RGB即是代表红、绿、蓝三个通道的颜色(又称三原色),这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。颜色空间模型如图2.7所示(采用01二值模型构建,通常使用0~255表示)。图2.7RGB颜色空间常见创建方法:publicRgb(doublered,doublegreen,doubleblue);//指定每个通道的值进行创建Rgb。publicRgb(ColorwinColor);//指定颜色进行创建Bgr。常见使用方法:RgbRgb=newRgr(255,0,0);//创建红色颜色。Rgb_Rgb=newRgb(Color.Red);创建红色颜色。Rgba:(四通道颜色空间)Rgra基于Rgb的基础上,在添加一个通道a。A:alpha表示透明度。Gray:(单通道颜色空间)Gray为单通道灰度图像空间,通常用于把多维颜色空间降维为单通道Gray格式。Hsv:这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。色调:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°、黄色为60°、绿色为120°、青色为180°、蓝色为240°、品红为300°。饱和度:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。明度:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。Hsv颜色空间模型,如图2.8所示。图2.8Hsv颜色空间模型Hls:Hls颜色空间,是通过对色相(H)、饱和度(S)、明度(L)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色。色相(H):如图2.9所示。饱和度(S):如图2.10所示。明度(L):如图2.11所示。图2.9:色相(H)颜色模型图2.10饱和度(S)颜色模型图2.11亮度(L)颜色模型Bgr:Bgr颜色空间与Rgb类似(通道位置前后颠倒),常用于EmguCv颜色空间。Bgra:Bgra颜色空间在Bgr的基础上添加a通道。A:alpha表示透明度。Ycc:YCbCr:Y:luminance,表示光的浓度且为非线性、Cb和Cr则为蓝色和红色的浓度偏移量成份,常用于肤色聚类算法。其Cb,Cr颜色模型如图2.12所示。图2.12CbCr颜色模型常见创建方法:publicYcc(doubley,doublecr,doublecb);//使用特定的参数创建Ycc。Xyz:Xyz基色系统。是CIE的一个颜色系统,等能量的蓝、绿、红三原色分别作为X、Y、Z轴构成颜色空间。与RGB相关的相像的基色系统,但更适用于颜色的计算。常见创建方法:publicXyz(doublex,doubley,doublez);//指定XYZ的值创建Xyz。Lab:为了解决颜色空间的感知一致性问题,专家们对CIE1931XYZ系统进行了非线性变换,制定了CIE1976L*a*b*颜色空间的 规范 编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载 。为非自照明的颜色空间。Lab对颜色的感知更均匀。L:Luminosity亮度,a和b的值域都是由+127至-128,其中+127就是红色,渐渐过渡到-128的时候就变成绿色;同样原理,+127是黄色,-128是蓝色。常见创建方法:publicLab(doublex,doubley,doublez);//指定参数创建CIElab颜色。Luv:用于自照明的颜色空间,叫做CIELUV。L表示物体亮度,u和v是色度。常见创建方法:publicLuv(doublex,doubley,doublez);//使用特定的参数创建Luv。关于CIE(CommissionInternationaledeL'Eclairage)更多资料见百度百科CIE。MCvScalar:MCvScalar是一个具有单元素到四元素之间的一个,每个元素表示图像每个通道的颜色。如果采用BGR颜色空间表示红色,那么MCvScalar的值为MCvScalar(0,0,255)。类型跟随图像颜色类型,如果图像颜色空间为HSV则MCvScalar的通道分别表示H,S,V。常见创建方法:publicMCvScalar(doublev0,doublev1,doublev2,doublev3);//指定每个通道的颜色值,这边最多为四通道。数组:相信读者对以[]为标志的数组操作已经非常熟悉。这边用几个简单的例子概括以[]为标志的数组操作。简单例子:int[,]data=newint[,]{{1},{2},{3}};//创建一个三行一列Int类型的数组。Bgr[]bgr_data=newBgr[5];//创建一个一维长度为5的Bgr数组。List<>:List是常用与EmguCv处理数组的一种格式。List(T表示泛型)比做一个盒子,盒子里面可以装T数据,而List也同时可以被List<>装起来。常用的方法:Listdata=newList();创建一个List类型,里面存储MCvPoint2D64f数据类型,相当于MCvPoint2D64f[]的一维数组。List>data=newList>();创建一个List类型,里面存储List数据类型,相当于创建MCvPoint2D64f[][]的二维数组。常用的方法:这边最常用到的是Add()和ToArray()方法。publicvoidAdd(Titem);//向List中添加数据T。publicT[]ToArray();//将List转成T[]数组。Vector:类似于Opencv中的Vector<>类型,而EmguCv中的Vector是固定的,并且存在命名空间为Emgu.CV.Util中。Emgu.CV.Uti主要的类为:VectorOfMat,VectorOfDouble,VectorOfVectorOfDMatch,VectorOfRect,VectorOfVectorOfPoint,VectorOfVectorOfPointF,VectorOfPoint,VectorOfFloat,VectorOfColorPoint,VectorOfByte等等。以VectorOfByte为例:常用的方法:publicvoidPush(byte[]value);//向数组中添加数据。publicbyte[]ToArray();//VectorOfByte转成byte[]类型。类型转换在图像处理中存在各种各样的数据类型,当我们不熟悉如何把一种类型转换成另外一种类型,这对于编程者带来非常多的困扰。接下来主要分析EmguCv常用到的数据类型。常用容器:Bitmap:Bitmap位图文件,是Windows标准格式,也是.Net主要的图像存储格式。Bitmap类以System.Drawing为命名空间,继承抽象类Image,同时里面封装了非常多对图像操作的函数。Image:Image是EmguCv3.0版本之前的主要存储图像类型,同时也在3.0之后也是兼容。TColor是一个颜色类型,TDepth是一个图像深度类型。Image的父类为(CvArray,IImage,IDisposable,ICloneable,IInputOutputArray,IOutputArray,IInputArrayOfArrays,IInputArray,IEquatable)。当有些函数的参数为以上类型,就可以用Image来替换。以Emgu.CV为命名空间。Mat:在EmguCv3.0版本之后(包括3.0版本)才出现的,Mat的父类为(MatDataAllocator,IImage,IDisposable,ICloneable,IInputOutputArray,IOutputArray,IInputArrayOfArrays,IInputArray,IEquatable,ISerializable)。当有些函数的参数为以上类型,就可以用Mat来替换。以Emgu.CV为命名空间。UMat:在大多数情况下,您应该使用Matrix类来替换。UMat父类为(MatDataAllocator,IImage,IDisposable,ICloneable,IInputOutputArray,IOutputArray,IInputArrayOfArrays,IInputArray,IEquatable,ISerializable),以Emgu.CV为命名空间。常用容器转换:如表2.1所示。表2.1常用容器类型转换原始类型目标类型实现代码BitmapImageImagem=newImage(_bitmap);//_bitmap为Bitmap类型。ImageBitmapBitmap_bitmap=image.ToBitmap();或者image.Bitmap;//image为Image类型。ImageMatMat_mat=image.Mat//image为Image类型。或者Mat_mat=image.ToUMat().ToMat(Emgu.CV.CvEnum.AccessType);//先转成UMat再转成Mat。MatImageImageimage=_mat.ToImage();//_mat为Mat类型。MatUMatUMatumat=_mat.ToUMat(Emgu.CV.CvEnum.AccessType);//_mat为Mat类型。这边需要使用一个枚举类型,标志UMat的接受类型。UMatMatMatmat=umat.ToMat(Emgu.CV.CvEnum.AccessType);//umat为UMat类型,这边需要使用一个枚举类型,标志Mat的接受类型UMatImageImageimage=umat.ToImage();//umat为UMat类型。ImageUMatUMatumat=image.ToUMat//image为Image类型。颜色类型转换:在上面内容中已经介绍过EmguCv存在的颜色空间。接下来,做颜色空间的转换操作。这边主要对Image和Mat容器的颜色空间介绍。Image:可以通过对TColor的更改从而更改颜色空间,对TDepth更改从而更改、代码如下:Imageimage=newImage().Convert();例子:Imageycc_iamge=newImage(100,100,newYcc(0,255,0));//指定参数创建一个Image格式的图像。Imagebgr_image=ycc_iamge.Convert();//把Image格式的图片转成Image。这边我还是比较喜欢Image类型的容器,可以清晰看出图像的颜色空间和储存数据类型。Mat:通过CVInvoke类的CvtColor函数来实现:publicstaticvoidCvtColor(IInputArraysrc,IOutputArraydst,ColorConversioncode,intdstCn=0);//一种颜色空间转成另外一种颜色空间:参数解析:IInputArraysrc,:输入图像。IOutputArraydst:目标图像。ColorConversioncode:Emgu.CV.CvEnum的一个枚举标识符。这边总共有140多种类型转换,这边就不全部列举(如表2.2所示)。表2.2颜色类型转换标识符标识符转换类型Bgr2Gray=6Bgr转成GrayBgr2Hsv=40Bgr转成HsvBgr2Lab=44Bgr转成LabHsv2RgbHsv转成Bgr.....等等本章内容到此为止,接下来会通过编写代码和录制视频讲解使读者更加详细的了解和使用以上内容。图像处理基础篇1.创建图片:Image:采用Image类来创建图片,有九种方法。如图3.1所示。图3.1Image创建图片。常用的的方法如下:publicImage(Bitmapbmp);//采用Bitmap图像创建。publicImage(stringfileName);//指定路径创建图像。publicImage(intwidth,intheight,TColorvalue);//采用固定大小和颜色创建图像。详细介绍publicImage(stringfileName)方法:stringfileName:为图片的路径。如果直接添加图片的名字,系统将会自动添加Application.StartupPath+"\\"+。如图3.2所示。Imageimage=newImage(Application.StartupPath+"\\"+"你好.jpg");//创建工程运行目录下的“你好.jpg”图像。Imageimage1=newImage("你好.jpg");//创建工程运行目录下的“你好.jpg”图像。Imageimage2=newImage(@"C:\Users\zwz.WJW-PC\Desktop\你好.png");//创建桌面一张你好.png图片。Imageimage3=newImage("C:\\Users\\zwz.WJW-PC\\Desktop\\你好.png");//创建桌面一张你好.png图片。OpenFileDialogop=newOpenFileDialog();if(op.ShowDialog()==DialogResult.OK){Imageimage4=newImage(op.FileName);//通过打开文件对话框来加载选中的图片。}图3.2Image指定目录创建图像Mat:采用Mat来创建图片总共有8总方法,如图3.3所示。图3.3Mat创建图像方法常用到的方法如下:publicMat();//实例化一个空容器。publicMat(stringfileName,LoadImageTypeloadType);//指定目录指定类型创建图片。publicMat(introws,intcols,DepthTypetype,intchannels);//指定大小,类型,通道数创建Mat容器。详细介绍第二种方法:StringfileName:和Image参数中的stringfileName一样。LoadImageTypeloadType:是一个Emgu.CV.Cvenum的一个标识符。标识图像类型,类似于Image中的TColor和TDepyh类型。标识符如表3.1所示。表示符TCloor类型TDepth类型Unchanged=-18位bit类型(byte)无关Grayscale=08位类型(byte)灰度(gray)Color=1无关无关AnyDepth=2无关任何类型AnyColor=4任何类型无关保存图片:Image:Image中采用函数publicoverridevoidSave(stringfileName)来保存图片。StringfileName参数和创建图片的StringfileName一样。这边不再重复介绍。Mat:Mat类中的publicvoidSave(stringfileName)函数用于保存图片。显示图片:显示图片通常使用控件ImageBox(EmguCv控件)或者PictureBox(.Net控件);PictureBox显示图片的类型为.Net类型,ImageBox显示图片为EmguCv图像类型。常见错误如图3.4,3.5所示。图3.4PictureBox无法显示EmguCv图像类型图3.5ImageBox无法显示.Net类型正确使用方法:如图3.6所示。图3.6显示图像正确方法获得控件中的图片:(这边主要讲解PictureBox和ImageBox控件,其他控件实现方法类似)PictureBox控件:PictureBox显示的图片为Bitmap类型,则获得PictureBox控件中的代码如下:Image_picture=newImage(newBitmap(pictureBox1.Image));如果需要转成Mat类型,即Image类型转成Mat类型。ImageBox控件:获取ImageBox图片代码为:Image_picture=newImage(newBitmap(imageBox1.Image.Bitmap));绘画图形:在图像上绘画一些图形是非常常见的,接下来介绍常用到的绘画方法。Image:在Image类存在draw()方法来提供用户绘画图形。具体使用方法解析:publicvirtualvoidDraw(Rectanglerect,TColorcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画矩形参数解析:Rectanglerect:需要绘画的矩形。TColorcolor:画笔颜色类型。intthickness=1:画笔宽度。LineTypelineType=LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。intshift=0:部分比特数中心坐标和半径值,默认为0。表3.2线类型表示符解析FourConnected=4四方向连接EightConnected=8八方向连接AntiAlias=16锯齿线连接publicvirtualvoidDraw(CircleFcircle,TColorcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画圆形。参数解析:CircleFcircle:需要绘画的圆。TColorcolor:画笔颜色类型。intthickness=1:画笔宽度。LineTypelineType=LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。intshift=0:部分比特数中心坐标和半径值,默认为0。通过上面两种函数参数的解析,相信读者已经对绘画图像的参数有所了解,第一个为所需要绘画图形的类型。第二个为画笔颜色,第三个为画笔宽度,第四个线条类型,等一些参数。基本绘画参数就是这些。publicvirtualvoidDraw(stringmessage,PointbottomLeft,FontFacefontFace,doublefontScale,TColorcolor,intthickness=1,LineTypelineType=LineType.EightConnected,boolbottomLeftOrigin=false);//在图像上绘画字符串。参数解析:stringmessage:绘画字符串的内容。PointbottomLeft:字符串左上角的点。FontFacefontFace:字体类型。一个Emgu.Cv.Cvenum的标识符。具体如图3.7所示。doublefontScale:字体放大倍数。TColorcolor:画笔颜色类型。intthickness=1:画笔宽度。LineTypelineType=LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。boolbottomLeftOrigin=false:true表示图像数据以左下角为源。false:左上角为源。图3.7文字类型标识符实现代码:如图3.8所示。图3.8绘画代码实现效果:如图3.9所示。图3.9实现效果经过上面的学习,相信大家已经对ImageDraw()方法基本了解。接下来介绍ImageDrawPolyline()方法。从字面上可以猜测这个方法为画多边直线的方法。publicvoidDrawPolyline(Point[]pts,boolisClosed,TColorcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画一个多边形。publicvoidDrawPolyline(Point[][]pts,boolisClosed,TColorcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画多个多边形。参数解析:Point[]pts:一维点集合。(Point[][]pts:二维点集合)。boolisClosed:是否为闭合。即首点和末点是否连接。TColorcolor:画笔颜色类型。intthickness=1:画笔宽度。LineTypelineType=LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。为如表3.2。intshift=0:部分比特数中心坐标和半径值,默认为0。实现代码:如图3.10所示。图3.10绘画多边形代码。实现效果:如图3.11所示。图3.11绘画多边形效果Mat:Mat图像采用CvInvoke类内部函数进行绘画。Mat类本身并没有写入绘画函数。(Mat类和Image类各有千秋,并没有完全取代。)CvInvoke类的绘画函数:publicstaticvoidPutText(IInputOutputArrayimg,stringtext,Pointorg,FontFacefontFace,doublefontScale,MCvScalarcolor,intthickness=1,LineTypelineType=LineType.EightConnected,boolbottomLeftOrigin=false);//绘画字符串。publicstaticvoidRectangle(IInputOutputArrayimg,Rectanglerect,MCvScalarcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画矩形。publicstaticvoidCircle(IInputOutputArrayimg,Pointcenter,intradius,MCvScalarcolor,intthickness=1,LineTypelineType=LineType.EightConnected,intshift=0);//绘画圆形。对Circle()函数参数解析:IInputOutputArrayimg:输入输出图像,输入背景图像,输出绘画后图像。Pointcenter:圆的中心。intradius:圆的半径。MCvScalarcolor:画笔颜色。intthickness=1:画笔宽度。LineTypelineType=LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。intshift=0:部分比特数中心坐标和半径值,默认为0。实现代码:如图3.12所示。图3.12Mat绘画图形代码实现效果:如图3.13所示图3.13实现效果图像遍历在EmguCv中进行图像遍历是比较耗时的,而在Mat类型中作者并没有找到合适的方法用于图像的遍历像素。这边介绍Image类型的图像进行遍历操作方法主要有三种。第一种:实现代码:如图3.14所示。图3.14遍历图像方法第二种:实现代码:如图3.15所示。图3.15遍历图像方法第三种:实现代码:如图3.16所示。图3.16遍历图像方法三种方法实现效果:如图3.17所示。图3.17实现效果未完待续。。。。
本文档为【EMGUCV基础】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: ¥18.0 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
筱希
暂无简介~
格式:doc
大小:3MB
软件:Word
页数:55
分类:
上传时间:2022-07-12
浏览量:12