EMGUCV基础.docx
《EMGUCV基础.docx》由会员分享,可在线阅读,更多相关《EMGUCV基础.docx(47页珍藏版)》请在冰点文库上搜索。
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
在官网进入界面选择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#窗体应用程序
【在解决方案的引用中添加引用(图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)//在“打开本地图片”按钮的单击事件中写入代码。
{
Openop=newOpen();//实例化打开对画框。
if(op.ShowDialog()==DialogResult.OK)
{
Matscr=newMat(op.,Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定路径加载图片。
imageBox1.Image=scr;//显示加载完成的图片。
}
}
在代码编写完成之后,运行程序。
在单击创建按钮之后出现异常程序,如图1.15
图1.15初始化异常
这个由两方面造成
1.之前的配置出错:
在系统环境变量Path中添加的路径不对,或者在路径前面没有使用分号与其他路径隔开。
2.在确保配置没有出错的情况下,单击【项目】→【属性】→【生成】→【目标平台】。
根据用户的操作系位数决定,32为则选择x86,64为的选择x64如图1.16。
3.如果以上两种方法都不行,请重启电脑。
网上安装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.dll
Emgu.Util.TypeEnum;
Emgu.UI.dll
Emgu.CV.UI(为之前添加EmguCv控件的命名空间,控件也是类);
Emgu.CV.Contirb.dll
Emgu.CV.BgSegm、Emgu.CV.Face、Emgu.CV.Text、
Emgu.CV.XFeatures2D;
Emgu.CV.Cuda.dll
Emgu.CV.Cuda(Cuda加速);
Emgu.CV.ML.dll
Emgu.CV.ML、Emgu.CV.ML.MlEnum、Emgu.CV.ML.Structure(机器学习);
Emgu.CV.Stitching.dll
Emgu.CV.Stitching(图像拼接);
Emgu.CV.OCR.dll
Emgu.CV.OCR(OpticalCharacterRecognition,光学字符识别)
...........
等等。
表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具有相同的用法,这边主要分析类型之间的相互转换。
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.5
EmguCv“线段”结构类型介绍:
在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