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*指针结构,下面我用一个实验来验证我的判断。

  1. 创建一个winform工程,添加一个button和picturebox控件

    技术分享

  2. 添加如下代码

    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;

           }

  3. 运行结果如下

    技术分享

     

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

    技术分享

     

  5. 运行结果如下图所示

    技术分享

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

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

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

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

OpenCV和Emgu CV啥关系?

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

LR和SVM的联系与区别

javacv跟opencv有啥区别