EMGUCV基础

更新时间:2024-05-31 08:31:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第一章

Emgu Cv简介:

Emgu CV 是.NET 平台下对OpenCV 图像处理库的封装。也就是OpenCV的.NET 版。它运行在.NET 兼容的编程语言下调用OpenCV 的函数,如C#、VB、VC++等。同时这个封装库可以在Mono 下编译和在Linux / Mac OS X 上运行。Emgu Cv的优势在于.net非常完美的界面,给用户操作带来非常直观的感觉。Emgu Cv每个版本都有修改一部分函数,在兼容旧版本下做的不是很好。本书主要采用VS2013+EmguCv3.0版本,希望读者也采用相同的版本进行学习,从而避免一些版本兼容上的问题。在国内并不流行Emgu Cv,因此关于Emgu Cv的资料比较少,从而导致了新手学习起来比较费劲,同时使更多想去学习Emgu Cv的人放弃学习,这样的一个恶性循环。

Emgu Cv安装和配置:

Emgu Cv的安装还算比较简单,这边采用Emgu Cv3.0版本进行安装解析。 第一步:下载EmguCv3.0

在官网https://sourceforge.net/projects/emgucv/files/emgucv/进入界面选择3.0.0版本进行下载,如图1.1所示。(写作时间为2016年4月,因此3.1版本也已经发布。这边边通过对某一个版本的学习,在去了解其它版本的也是非常简单的。)

图1.1 Emgu Cv安装下载列表

点击3.0.0进入下载界面,如图1.2所示。

图1.2 EmguCv3.0.0下载界面

前两者是带有Cuda加速的Emgu CV,后两者则为没有带Cuda加速的Emgu Cv。读者可以查看电脑是否支持Cuda加速进行选择。这边笔者下载第二个。

第二部:安装EmguCv

下载完成之后,如图1.3所示。双击安装包进行提取文件,如图1.4所示,安装Emgu Cv的过程和安装其它软件的过程基本一致。

图1.4 提取EmguCv文件

图1.3 EmguCv安装程序

提取完成之后,如图1.5所示,得到EmguCv文件。

图1.5 EmguCv全部文件

第三步:配置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 编辑系统变量

第四步:使用Emgu Cv

【打开VS2013(图1.8)】

图1.8 打开Vs2013 【创建Visual C#窗体应用程序(图1.9)】

图1.9 创建Visual C#窗体应用程序

【在解决方案的引用中添加引用(图1.10)】

图1.10 在解决方案的引用中添加引用

图中所选的三个.dll最常用的.dll。

【加载Emgu.Cv.UI.dll中的控件】

(【工具】→【选择工具箱(如图1.11)】→【单击选择工具箱】→【在.NET Framework组件栏中单击浏览】→【选择安装路径下的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.13 Form1界面 图1.14 ImageBox1属性设置

编写代码如下:

在程序最上端需要添加这两行。对于作用之后将会详细解答。

using Emgu.CV.Structure; using Emgu.CV;

private void button1_Click(object sender, EventArgs e)//在“创建图片”按钮的单击事件中写入代码。

{

Image image = new Image(320, 240, new Bgr(0, 0, 255));//创建一张320*240尺寸颜色为红色的图像。

imageBox1.Image = image;//在ImageBox1控件中显示所创建好的图像。 } private void button2_Click(object sender, EventArgs e)//在“打开本地图片”按钮的单击事件中写入代码。

{

OpenFileDialog op = new OpenFileDialog();//实例化打开对画框。 if(op.ShowDialog ()==DialogResult .OK ) {

Mat scr=new Mat(op.FileName, Emgu.CV.CvEnum.LoadImageType.AnyColor);//指定路径加载图片。

imageBox1.Image = scr;//显示加载完成的图片。 } }

在代码编写完成之后,运行程序。在单击创建按钮之后出现异常程序,如图1.15

图 1.15初始化异常

这个由两方面造成

1. 之前的配置出错:在系统环境变量Path中添加的路径不对,或者在路径前面没有使用分号与其他路径隔开。

2. 在确保配置没有出错的情况下,单击【项目】→【属性】→【生成】→【目标平台】。根据用户的操作系位数决定,32为则选择x86,64为的选择x64如图1.16。

3. 如果以上两种方法都不行,请重启电脑。网上安装Emgu Cv的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是最基本的两个两个命名空间。

Emgu CV命名空间:

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.TypeEnum; Emgu.CV.UI(为之前添加EmguCv控件的命名空间,控件也是类); Emgu.CV.BgSegm、Emgu.CV.Face、Emgu.CV.Text、 Emgu.CV.XFeatures2D; Emgu.CV.Cuda(Cuda加速); Emgu.Util.dll Emgu.UI.dll Emgu.CV.Contirb.dll Emgu.CV.Cuda.dll Emgu.CV.ML.dll Emgu.CV.ML、Emgu.CV.ML.MlEnum、Emgu.CV.ML.Structure(机器学习); Emgu.CV.Stitching(图像拼接); Emgu.CV.Stitching.dll Emgu.CV.OCR.dll Emgu.CV.OCR(Optical Character Recognition,光学字符识别) ........... 等等。 表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.23 Erode函数详细解析

这样通过文档的学习和不断积累的过程,我们最终将会熟练掌握这门技术。

EmguCV自带的历程:

正如上面所说,我们可以通过别人写好的demo来学习EmguCv,开发者专门为我们写好了非常优秀的代码给我们参考,学习。

在安装目录中有一个文件夹名字为Emgu.CV.Example。这个文件夹里面有非常多的具有代表性的demo,如图1.24所示。

图1.24 EmguCv自带demo

读者可以通过这些例程更好的来了解和学习EmguCv。

本章内容到此为止,接下来会通过录制视频讲解使读者更加详细的了解和使用以上内容。

第二章

数据结构

本章节,我们将学习到EmguCv常用到的数据结构,为EmguCv学习打下坚实的基础。由于EmguCv的数据结构过多,这边主要讲解常用到的数据结构类型。

.net系统中“点”结构类型介绍:

Point:为二维坐标系下的”点“类型,以图像左上角为坐标原点。Point类型并非是EmguCv中的类型,而是在System.Drawing命名空间中。

常见创建方法:

public Point(int x, int y);//指定坐标创建Point。

public Point(Size sz)://指定大小创建Point,se宽度为x坐标,se高度为y坐标。

常见使用方法:

Point point = new Point(10, 10); int x = point.X;//获得点的x坐标。 int y = point.Y;//获得点的y坐标。

PointF:表示二维坐标系下的点,以图像左上角为坐标原点,数据类型为单精度浮点类型。在System.Drawing命名空间中。

PointF和Point具有相同的用法,这边主要分析类型之间的相互转换。

Point系统可以默认转换为PointF类型。类似于Int类型可以转成Float类型。PointF类型转成Point类型这边可以使用函数Point结构体中的Truncate函数实现:

public static Point Truncate(PointF value);//把PointF类型转成Point类型。

Emgu Cv“点”结构类型介绍:

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.3 MCvPoint3D64f信息

常见创建方法:

public MCvPoint3D32f(float x, float y, float z)//指定坐标创建MCvPoint3D32f。 常见使用方法:

MCvPoint3D64f mcvPoint=new MCvPoint3D64f (0,0,0); 分别获得X,Y,Z坐标。 double x=mcvPoint.X; double y=mcvPoint.Y; double z=mcvPoint.Z;

MCvPoint2D64f信息如图2.4。MCvPoint2D64f的信息操作如上,这边不再列举。

图2.4 MCvPoint2D64f信息

双击每个类型前面的如图2.5所示。

符号,便可以查看官方给定的注释。

图 2.5

EmguCv“线段”结构类型介绍:

在EmguCv中主要有LineSegment2D 、LineSegment2DF、LineSegment3DF表示线段的数据类型,以Emgu.CV.Structure为命名空间。LineSegment2D表示2维平面整型数据结构的线段。LineSegment2DF表示2维平面单精度浮点数据结构的线段。LineSegment3DF表示3维空间单精度浮点数据结构的线段。以LineSegment2DF为例,解析使用方法。(也可以转到定义去了解更全面的介绍信息。如图2.6所示。)

常见创建方法:

public LineSegment2DF(PointF p1, PointF p2);指定坐标点创建 LineSegment2DF类型。 常见使用方法:

public PointF Direction { get; }//获得直线的方向。 public double Length { get; }//获得直线的夹角。 public PointF P1 { get; set; }//操作直线的首点。 public PointF P2 { get; set; }//操作图像的末点。

public double GetExteriorAngleDegree(LineSegment2DF otherLine);得到两直线的夹角。

public int Side(PointF point);//判断点坐标相对于直线的位置。 public float YByX(float x);//输入X点,输出所在直线的Y点。

图2.6 LineSegment2DF结构信息

Emgu Cv”圆形“结构类型介绍:

圆形主要包括圆和椭圆两种类型,以下分别介绍。以Emgu.CV.Structure为命名空间。

CircleF:圆

常见创建方法:

public CircleF(PointF center, float radius);//指定圆心半径创建 CircleF。 常见使用方法:

public double Area { get; }//获得圆的面积。

public PointF Center { get; set; }//操作圆的圆心。 public float Radius { get; set; }//操作圆的半径。

Ellipse:椭圆

常见创建方法:

public Ellipse(RotatedRect box2d);//指定带角度的矩阵创建Ellipse类型。

public Ellipse(PointF center, SizeF size, float angle)//指定参数创建Ellipse类型。

Emgu Cv”三角形“结构类型介绍:

EmguCv“三角形”主要包括Triangle2DF、Triangle2DF、Triangle3DF类型。以Emgu.CV.Structure为命名空间。

Triangle2DF:二维三角形。

常见创建方法:

public Triangle2DF(PointF v0, PointF v1, PointF v2);//指定三个顶点创建Triangle2DF三角形。 常见使用方法:

public double Area { get; }//获得三角形面积。 public PointF Centeroid { get; }//获得三角形重心。 //依次获得三角形的三个顶点坐标。

public PointF V0 { get; set; }; public PointF V1 { get; set; }; public PointF V2 { get; set; };

public PointF[] GetVertices();//直接获得三角形的三个顶点。

Triangle3DF:三维三角形:

常见创建方法:

public Triangle3DF(MCvPoint3D32f v0, MCvPoint3D32f MCvPoint3D32f v2);//指定三个MCvPoint3D32f类型的点创建

Triangle3DF。 常见使用方法:

public double Area { get; }//获得三角形面积。

public MCvPoint3D32f Centeroid { get; }//获得三角形重心。 //依次获得三角形的三个顶点坐标。 public MCvPoint3D32f V0 { get; set; }; Public MCvPoint3D32f V1 { get; set; }; public MCvPoint3D32f V2 { get; set; };

v1,

Emgu Cv和.Net”矩形“结构类型介绍:

我们将会用到三种类型来表示矩形。 RotatedRect:

RotatedRect:以 Emgu.CV.Structure为命名空间。表示带有旋转角度的矩形。

常见创建方法:

public RotatedRect(PointF center, SizeF size, float angle)//指定中心,大小,角度创建RotatedRect类型。

常见使用方法:

public Rectangle MinAreaRect();获得最小面积的外接矩形。 public float Angle;//获得角度。

public PointF Center;//获得中心点。

public SizeF Size;获得大小。

Rectangle:

Rectangle矩形不带旋转角度,或者旋转角度为0,命名空间为System.Drawing并非是EmguCv矩形。

常见创建方法:

public Rectangle(Point location, Size size);//指定左上角点和大小创建Rectangle类型。

public Rectangle(int x, int y, int width, int height);//指定左上角坐标和宽度,高度创建Rectangle。

常见使用方法:

常用的方法:

public void Push(byte[] value);//向数组中添加数据。 public byte[] ToArray();//VectorOfByte转成byte[]类型。

类型转换

在图像处理中存在各种各样的数据类型,当我们不熟悉如何把一种类型转换成另外一种类型,这对于编程者带来非常多的困扰。接下来主要分析Emgu Cv常用到的数据类型。

常用容器:

Bitmap:

Bitmap位图文件,是Windows标准格式,也是.Net主要的图像存储格式。

Bitmap类以System.Drawing为命名空间,继承抽象类Image,同时里面封装了非常多对图像操作的函数。

Image

Image是Emgu Cv3.0版本之前的主要存储图像类型,

同时也在3.0之后也是兼容。TColor是一个颜色类型,TDepth是一个图像深度类型。Image的父类为(CvArray, IImage, IDisposable, ICloneable, IInputOutputArray, IOutputArray, IInputArrayOfArrays, IInputArray, IEquatable)。当有些函数的参数为以上类型,就可以用Image来替换。以Emgu.CV为命名空间。

Mat:

在Emgu Cv3.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 常用容器类型转换

目标类型 实现代码 Bitmap Image Image Bitmap Image Mat Mat Image Mat UMat UMat Mat UMat Image Image UMat Image m = new Image(_bitmap);//_bitmap为Bitmap类型。 Bitmap _bitmap= image.ToBitmap();或者image.Bitmap;//image为Image类型。 Mat _mat = image.Mat//image为Image类型。或者Mat _mat = image.ToUMat().ToMat(Emgu.CV.CvEnum.AccessType);//先转成UMat再转成Mat。 Image image=_mat.ToImage ();//_mat为Mat类型。 UMat umat = _mat.ToUMat(Emgu.CV.CvEnum.AccessType);//_mat为Mat类型。这边需要使用一个枚举类型,标志UMat的接受类型。 Mat mat = umat.ToMat(Emgu.CV.CvEnum.AccessType);//umat为UMat类型,这边需要使用一个枚举类型,标志Mat的接受类型 Image image=umat.ToImage ();//umat为UMat类型。 UMat umat = image.ToUMat//image为Image类型。

颜色类型转换:

在上面内容中已经介绍过Emgu Cv存在的颜色空间。接下来,做颜色空间的转换操作。这边主要对Image和Mat容器的颜色空间介绍。

Image

可以通过对TColor的更改从而更改颜色空间,对TDepth更改从而更改

代码如下:

Image image = new Image().Convert();

例子:

Image ycc_iamge = new Image(100, 100, new Ycc(0, 255, 0));//指定参数创建一个Image 格式的图像。

Image bgr_image = ycc_iamge.Convert();//把Image格式的图片转成Image

这边我还是比较喜欢Image类型的容器,可以清晰看出图像的颜色空间和储存数据类型。

Mat:

通过CVInvoke类的CvtColor函数来实现:

public static void CvtColor(IInputArray src, IOutputArray dst, ColorConversion code, int dstCn = 0);//一种颜色空间转成另外一种颜色空间:

参数解析:

IInputArray src,:输入图像。 IOutputArray dst:目标图像。

ColorConversion code:Emgu.CV.CvEnum的一个枚举标识符。

这边总共有140多种类型转换,这边就不全部列举(如表2.2所示)。

表2.2 颜色类型转换标识符

标识符 转换类型

Bgr2Gray = 6 Bgr转成Gray

Bgr2Hsv = 40 Bgr转成Hsv

Bgr2Lab = 44 Bgr转成Lab

Hsv2Rgb Hsv转成Bgr

..... 等等

本章内容到此为止,接下来会通过编写代码和录制视频讲解使读者更加详细的了解和使用以上内容。

第三章 图像处理基础篇

1. 创建图片:

Image:

采用Image类来创建图片,有九种方法。如图3.1所示。

图 3.1 Image创建图片。

常用的的方法如下:

public Image(Bitmap bmp);//采用Bitmap图像创建。 public Image(string fileName);//指定路径创建图像。

public Image(int width, int height, TColor value);//采用固定大小和颜色创建图像。

详细介绍public Image(string fileName)方法:

string fileName:为图片的路径。如果直接添加图片的名字,系统将会自动添加Application.StartupPath+\。如图3.2所示。

Imageimage=newImage(Application.StartupPath+\\你好.jpg\创建工程运行目录下的“你好.jpg”图像。

Image image1 = new Image(\你好.jpg\创建工程运行目录下的“你好.jpg”图像。

Image image2 = new Image(@\Desktop\\你好.png\创建桌面一张你好.png图片。

Image image3 = new Image(\

Desktop\\\\你好.png\创建桌面一张你好.png图片。

OpenFileDialog op = new OpenFileDialog();

if(op.ShowDialog ()==DialogResult .OK ) {

Image image4 = new Image

(op.FileName);//通过打开文件对话框来加载选中的图片。

}

图 3.2 Image 指定目录创建图像

Mat:

采用Mat来创建图片总共有8总方法,如图3.3所示。

图 3.3 Mat创建图像方法

常用到的方法如下:

public Mat();//实例化一个空容器。

public Mat(string fileName, LoadImageType loadType);//指定目录指定类型创建图片。

public Mat(int rows, int cols, DepthType type, int channels);//指定大小,类型,通道数创建Mat容器。

详细介绍第二种方法:

String fileName:和Image参数中的string fileName一样。

LoadImageType loadType:是一个Emgu.CV.Cvenum的一个标识符。标识图像类型,类似于Image中的TColor和TDepyh类型。

标识符如表3.1所示。

表示符 Unchanged = -1 Grayscale = 0 TCloor类型 8位bit类型(byte) 8位类型(byte) TDepth类型 无关 灰度(gray)

Color = 1 AnyDepth = 2 AnyColor = 4 无关 无关 任何类型 无关 任何类型 无关

2. 保存图片:

Image:

Image中采用函数public override void Save(string fileName)来保存图片。String fileName参数和创建图片的String fileName一样。这边不再重复介绍。

Mat:

Mat类中的public void Save(string fileName)函数用于保存图片。

3. 显示图片:

显示图片通常使用控件ImageBox(EmguCv 控件)或者PictureBox(.Net控件);

PictureBox显示图片的类型为.Net类型,ImageBox显示图片为EmguCv图像类型。常见错误如图3.4,3.5所示。

图3.4 PictureBox 无法显示EmguCv图像类型

图3.5 ImageBox无法显示.Net类型

正确使用方法:

如图3.6所示。

图3.6 显示图像正确方法

4. 获得控件中的图片:(这边主要讲解PictureBox和ImageBox控件,其他控件实现方法类似)

PictureBox控件:

PictureBox显示的图片为Bitmap类型,则获得PictureBox控件中的代码如下:

Image _picture = new Image(new Bitmap( pictureBox1.Image));

如果需要转成Mat类型,即Image类型转成Mat类型。 ImageBox控件:

获取ImageBox图片代码为:

Image

byte>

_picture

=

new

Image

byte>(new

Bitmap( imageBox1.Image.Bitmap)); 5. 绘画图形:

在图像上绘画一些图形是非常常见的,接下来介绍常用到的绘画方法。 Image:

在Image 类存在draw()方法来提供用户绘画图形。具体使用方法解析:

public virtual void Draw(Rectangle rect, TColor color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);//绘画矩形

参数解析:

Rectangle rect:需要绘画的矩形。 TColor color:画笔颜色类型。 int thickness = 1:画笔宽度。

LineType lineType = LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。

int shift = 0:部分比特数中心坐标和半径值,默认为0。

表 3.2 线类型

表示符 解析 FourConnected = 4 四方向连接

EightConnected = 8 八方向连接

AntiAlias = 16 锯齿线连接

public virtual void Draw(CircleF circle, TColor color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);//绘画圆形。

参数解析:

CircleF circle:需要绘画的圆。 TColor color:画笔颜色类型。 int thickness = 1:画笔宽度。

LineType lineType = LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。

int shift = 0:部分比特数中心坐标和半径值,默认为0。

通过上面两种函数参数的解析,相信读者已经对绘画图像的参数有所了解,第一个为所需要绘画图形的类型。第二个为画笔颜色,第三个为画笔宽度,第四个线条类型,等一些参数。基本绘画参数就是这些。

public virtual void Draw(string message, Point bottomLeft, FontFace fontFace, double fontScale, TColor color, int thickness = 1, LineType lineType = LineType.EightConnected, bool bottomLeftOrigin = false);//在图像上绘画字符串。

参数解析:

string message:绘画字符串的内容。 Point bottomLeft:字符串左上角的点。

FontFace fontFace:字体类型。一个Emgu.Cv.Cvenum的标识符。具体如图3.7所示。

double fontScale:字体放大倍数。 TColor color:画笔颜色类型。 int thickness = 1:画笔宽度。

LineType lineType = LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。如表3.2。

bool bottomLeftOrigin = false:true表示图像数据以左下角为源。false:左上角为源。

图 3.7 文字类型标识符

实现代码:

如图3.8所示。

图3.8 绘画代码

实现效果:

如图3.9所示。

图 3.9 实现效果

经过上面的学习,相信大家已经对Image Draw()方法基本了解。

接下来介绍Image DrawPolyline()方法。从字面上可以猜测这个方法为画多边直线的方法。

public void DrawPolyline(Point[] pts, bool isClosed, TColor color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);//绘画一个多边形。

public void DrawPolyline(Point[][] pts, bool isClosed, TColor color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);//绘画多个多边形。

参数解析:

Point[] pts:一维点集合。(Point[][] pts:二维点集合)。 bool isClosed:是否为闭合。即首点和末点是否连接。 TColor color:画笔颜色类型。 int thickness = 1:画笔宽度。

LineType lineType = LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。为如表3.2。

int shift = 0:部分比特数中心坐标和半径值,默认为0。

实现代码:

如图3.10所示。

图3.10绘画多边形代码。

实现效果:

如图3.11所示。

图3.11 绘画多边形效果

Mat:

Mat图像采用CvInvoke类内部函数进行绘画。Mat类本身并没有写入绘画函数。(Mat类和Image类各有千秋,并没有完全取代。)

CvInvoke类的绘画函数:

public static void PutText(IInputOutputArray img, string text, Point org, FontFace fontFace, double fontScale, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, bool bottomLeftOrigin = false);//绘画字符串。

public static void Rectangle(IInputOutputArray img, Rectangle rect, MCvScalar color, int thickness = 1, LineType lineType =

LineType.EightConnected, int shift = 0);//绘画矩形。

public static void Circle(IInputOutputArray img, Point center, int radius, MCvScalar color, int thickness = 1, LineType lineType = LineType.EightConnected, int shift = 0);//绘画圆形。

对Circle()函数参数解析:

IInputOutputArray img:输入输出图像,输入背景图像,输出绘画后图像。

Point center:圆的中心。 int radius:圆的半径。

MCvScalar color:画笔颜色。 int thickness = 1:画笔宽度。

LineType lineType = LineType.EightConnected:线的类型,一个Emgu.CV.Cvenum的标识符。

int shift = 0:部分比特数中心坐标和半径值,默认为0。

实现代码:

如图3.12 所示。

图 3.12 Mat绘画图形代码

实现效果:

如图3.13所示

图 3.13 实现效果

6. 图像遍历

在EmguCv中进行图像遍历是比较耗时的,而在Mat类型中作者并没有找到合适的方法用于图像的遍历像素。这边介绍Image类型的图像进行遍历操作方法主要有三种。

第一种:

实现代码:

如图3.14所示。

图 3.14 遍历图像方法

第二种:

实现代码:

如图3.15所示。

图 3.15 遍历图像方法

第三种:

实现代码:

如图3.16所示。

图 3.16 遍历图像方法

三种方法实现效果:

如图3.17所示。

图3.17 实现效果

未完待续。。。。

本文来源:https://www.bwwdw.com/article/hq06.html

Top