EmguCV学习 与opencv的区别和联系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EmguCV学习 与opencv的区别和联系相关的知识,希望对你有一定的参考价值。

openCV是因特尔的一个开源的视觉库,里面几乎
包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作。不过
opencv有个很大的不足,这在于它几乎没有提供gui这方面接口,很难满足目前应用程序开发的需要,而万恶的MFC框架丑陋的界面也成为了我的噩
梦,MFC与opencv和界面优化几乎让我在图像处理这一块儿无法动弹。
C#
是.net平台上的明星语言,可以很容易做出漂亮的界面。EmguCV是将opencv封装的一个.net库可以被VC++,VC#,VB.net调用。
网上对于EmguCV的介绍很少,不是因为它没用,而是因为它的使用方法几乎和opencv一摸一样,opencv的资料完全可以直接用于EmguCV。
不过不少新手在使用EmguCV在使用几次之后便放弃。这有以下几个原因:
1.
舆论影响,很多人都说C#的运行效率低,采用C/C++,opencv是C和C++编写的,理所当然应该在VC++中运行,图像处理又是一个计算量很大的
工作,C#不行。C#运行效率肯定比C/C++差,但是采用混合编程的方法就可以啦,用C#的框架和运行机制,计算交给C就好啦。EmguCV很多处理函
数都是采用托管调用opencv。这个在EmguCV的安装包里可以看到,里面含有所有Opencv的dll。

2.
缺少资料,学习受挫而放弃(我放弃这个大概有半年)。不得不承认EmguCV方面的学习资料实在是太少啦。很多时候出现问题,在网上基本上找不到答案。而
且EmguCV前期版本对opencv封装不全面,很多基本的函数没有被封装,使用起来很不方便,网上很多人以讹传讹,编写很困难。不过使用2.3版本就
没有这个问题,opencv基本函数都得到了很好的封装。opencv图像处理的函数都封装在cvInvoke中

而Image<>结构是连接opencv与emgucv的重要桥梁。其中C#的Intptr类型可以很好地传递IplImage*指针结构,下面我用一个实验来验证我的判断。
创建一个winform工程,添加一个button和picturebox控件

添加如下代码
Capture cam;

private void btopen_Click(object sender, EventArgs e)

cam = new Capture();
Application.Idle += new EventHandler(processframe);



private void processframe(object sender, EventArgs arg)

Image<Bgr, Byte> frame = cam.QueryFrame();
Image<Gray,Byte> Ecanny=frame.Convert<Gray,Byte>();
CvInvoke.cvCanny(Ecanny.Ptr, Ecanny.Ptr, 50, 150, 3);
//cvCanny是opencv中常用的函数,原本的参数应该是IplImage*类型,这里使用Intpr代替,即Ecanny.ptr
pictureBox1.Image = Ecanny.Bitmap;

运行结果如下

当然如果只是简单的canny算法,使用EmguCV封装的结构Image<>更加简单,将代码如下图所示修改

运行结果如下图所示

上述实验表明,EmguCV可以很好地连接C#与opencv,能够弥补opencv在gui这方面的不足,有利于机器视觉开发者得工作
参考技术A openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作。不过opencv有个很大的不足,这在于它几乎没有提供gui这方面接口,很难满足目前应用程序开发的需要,而万恶的MFC框架丑陋的界面也成为了我的噩梦,MFC与opencv和界面优化几乎让我在图像处理这一块儿无法动弹。

C#是.net平台上的明星语言,可以很容易做出漂亮的界面。EmguCV是将opencv封装的一个.net库可以被VC++,VC#,VB.net调用。网上对于EmguCV的介绍很少,不是因为它没用,而是因为它的使用方法几乎和opencv一摸一样,opencv的资料完全可以直接用于EmguCV。不过不少新手在使用EmguCV在使用几次之后便放弃。这有以下几个原因:

1.舆论影响,很多人都说C#的运行效率低,采用C/C++,opencv是C和C++编写的,理所当然应该在VC++中运行,图像处理又是一个计算量很大的工作,C#不行。C#运行效率肯定比C/C++差,但是采用混合编程的方法就可以啦,用C#的框架和运行机制,计算交给C就好啦。EmguCV很多处理函数都是采用托管调用opencv。这个在EmguCV的安装包里可以看到,里面含有所有Opencv的dll。
2.缺少资料,学习受挫而放弃(我放弃这个大概有半年)。不得不承认EmguCV方面的学习资料实在是太少啦。很多时候出现问题,在网上基本上找不到答案。而且EmguCV前期版本对opencv封装不全面,很多基本的函数没有被封装,使用起来很不方便,网上很多人以讹传讹,编写很困难。不过使用2.3版本就没有这个问题,opencv基本函数都得到了很好的封装。opencv图像处理的函数都封装在cvInvoke中。
而Image<>结构是连接opencv与emgucv的重要桥梁。其中C#的Intptr类型可以很好地传递IplImage*指针结构,下面我用一个实验来验证我的判断。
创建一个winform工程,添加一个button和picturebox控件本回答被提问者采纳
参考技术B openCV是因特尔的一个开源的视觉库,里面几乎包含了所有的图像处理的经典算法,并且采用C和少量的C++编写,运行效率很高,对于做图像处理这方面工作的,认识opencv是必须的工作。不过opencv有个很大的不足,这在于它几乎没有提供gui这方面接口,很难满足目前应用程序开发的需要,而万恶的MFC框架丑陋的界面也成为了我的噩梦,MFC与opencv和界面优化几乎让我在图像处理这一块儿无法动弹。
C#是.net平台上的明星语言,可以很容易做出漂亮的界面。EmguCV是将opencv封装的一个.net库可以被VC++,VC#,VB.net调用。网上对于EmguCV的介绍很少,不是因为它没用,而是因为它的使用方法几乎和opencv一摸一样,opencv的资料完全可以直接用于EmguCV。不过不少新手在使用EmguCV在使用几次之后便放弃。这有以下几个原因:
1.舆论影响,很多人都说C#的运行效率低,采用C/C++,opencv是C和C++编写的,理所当然应该在VC++中运行,图像处理又是一个计算量很大的工作,C#不行。C#运行效率肯定比C/C++差,但是采用混合编程的方法就可以啦,用C#的框架和运行机制,计算交给C就好啦。EmguCV很多处理函数都是采用托管调用opencv。这个在EmguCV的安装包里可以看到,里面含有所有Opencv的dll。

2.缺少资料,学习受挫而放弃(我放弃这个大概有半年)。不得不承认EmguCV方面的学习资料实在是太少啦。很多时候出现问题,在网上基本上找不到答案。而且EmguCV前期版本对opencv封装不全面,很多基本的函数没有被封装,使用起来很不方便,网上很多人以讹传讹,编写很困难。不过使用2.3版本就没有这个问题,opencv基本函数都得到了很好的封装。opencv图像处理的函数都封装在cvInvoke中

而Image<>结构是连接opencv与emgucv的重要桥梁。其中C#的Intptr类型可以很好地传递IplImage*指针结构,下面我用一个实验来验证我的判断。
创建一个winform工程,添加一个button和picturebox控件

添加如下代码
Capture cam;

private void btopen_Click(object sender, EventArgs e)

cam = new Capture();
Application.Idle += new EventHandler(processframe);



private void processframe(object sender, EventArgs arg)

Image<Bgr, Byte> frame = cam.QueryFrame();
Image<Gray,Byte> Ecanny=frame.Convert<Gray,Byte>();
CvInvoke.cvCanny(Ecanny.Ptr, Ecanny.Ptr, 50, 150, 3);
//cvCanny是opencv中常用的函数,原本的参数应该是IplImage*类型,这里使用Intpr代替,即Ecanny.ptr
pictureBox1.Image = Ecanny.Bitmap;

运行结果如下

当然如果只是简单的canny算法,使用EmguCV封装的结构Image<>更加简单,将代码如下图所示修改

运行结果如下图所示

上述实验表明,EmguCV可以很好地连接C#与opencv,能够弥补opencv在gui这方面的不足,有利于机器视觉开发者得工作

Emgucv3.0的安装与配置

环境:vs2015+Emgucv3.0

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的人放弃学习,这样的一个恶性循环。

第一步:下载EmguCv3.0

emgucv3.0安装包下载地址:

官网下载地址:https://sourceforge.net/projects/emgucv/files/emgucv/

第二步:安装EmguCv

解压到一个文件夹(记住文件夹的位置,最好路径中是没有中文的,比如:D:emgucv)

 

第三步:配置EmguCv

配置流程如下。

【计算机】→【(右击)属性】→【高级系统设置】→【高级】→【环境变量】。双击系统变量下的Path变量,在变量值(V)中添加D:\emgucv\libemgucv-windows-universal-cuda-3.0.0.2157\bin(D:\emgucv为笔者安装目录)(如果前面有其他的路径需要使用英文的”;”隔开)。如果用户是32位操作系统添加D:\EMgu\libemgucv-windows-universal-cuda-3.0.0.2157\bin\x86,如果用户是64位操作系统添加D:\EMgu\libemgucv-windows-universal-cuda-3.0.0.2157\bin\x64。

 

第四步:使用Emgu Cv

打开vs2015,创建一个c#窗体应用程序。

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

技术分享

 

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

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

(【工具】→【选择工具箱】→【单击选择工具箱】→【在.NET Framework组件栏中单击浏览】→【选择安装路径下的bin文件夹下的Emgu.CV.UI.dll】→【单击确定进行添加】→【添加完成在工具箱中就有所选择的工具】。

技术分享 

技术分享技术分享

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

 

然后开始我们的编程 :

首先拖入一个Button,然后拖入一个ImageBox

错误提示:创建组件“XXX”失败,错误消息为:System.Runtime.InteropServices.COMException (0x8004D745):项目中已经存在对组件“XXX”的引用

解决办法如下:
在解决方案资源管理器中显示所有文件,展开引用项,删除提示已引用的组件。此时会爆出N多的错误提示。没关系的,在任一窗口添加该控件,自动重新正确引用

双击Button,进入代码编辑:输入下面的代码

Image<Bgr, byte> image = new Image<Bgr, byte>(320, 240, new Bgr(0, 0, 255));//创建一张320*240尺寸颜色为红色的图像。
 imageBox1.Image = image;//在ImageBox1控件中显示所创建好的图像。

生成解决方案——运行

点击button,是不是在图像框中显示出红色的图像了!

 


以上是关于EmguCV学习 与opencv的区别和联系的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV.NET、OpenCVSharp 和 EmguCV 有啥区别?

ffmpeg 和 SDL 的区别和联系? 谢谢

OpenCV和Emgu CV啥关系?

opencv-PIL-matplotlib-Skimage-Pytorch图片读取区别与联系

LR和SVM的联系与区别

javacv跟opencv有啥区别