本人做图像处理处理很多年了,最开始是用VC6,尽管有一些源码例子,但好多库还得自己创建,什么都得自己写,工作量巨大。VS是从2003版本开始入门的,这也是VS的第一个版本,这个版本其实是个测试版,有很多问题,一直到VS2005版才完善。VS总算有了自带的Bitmap类,已经是个巨大的进步。EmguCV我是从2.X版本开始用的,觉得实在太方便的,之前也用过OpenCV1.X,但做图像处理总免不了涉及到人机交互界面,比较之下还是C#+EmguCV方便得多。
最近刚入手了新本本,装得是Win11系统,新系统再用老软件就不太好了,总要与时俱进的,就安装了最新的VS2022,EmguCV当然也要最新的4.6版本。以前我用过的最高版本是Win7+VS2017+EmguCV3.10。
EmguCV有个很不好的地方,很多博文也提到了,就是各个大版本的配置方法都不太一样,这对于初学者来说很不友好,一定程度上影响了推广普及。比如这次我配置EmguCV4.6,一开始就摸不着头脑,网上的相关博文稀少,感觉写得也不全面,但还是对我起了很大帮助,这回,我就把我的安装配置经验给大家分享一下。
安装
有两种安装方法,一是从网站:https://sourceforge.net/projects/emgucv/
下载安装包,然后安装配置,我选的是CUDA版本:
libemgucv-windesktop_x64-cuda-4.6.0.5131.zip.selfextract.exe
这是一个压缩包,然后在C盘建了一个文件夹Emgu,把这个压缩包解压到这个文件夹里,则EmguCV的安装路径为:
C:\Emgu\libemgucv-windesktop_x64-cuda-4.6.0.5131。
另一种是从VS的工具->NuGet中下载,如图1所示,然后在图2中搜索emgucv,直接自动安装配置,更方便,但由于我不确定从这里下载的是不是CUDA版,所以还是按照第一个方法。
图1
图2
配置
建立一个C#的WinForm工程,然后在工程下的引用中,从libemgucv-windesktop_x64-cuda-4.6.0.5131\libs中添加引用Emgu.CV.dll、Emgu.CV.Platform.NetFramework.dll、System.Runtime.InteropServices.RuntimeInformation.dll,如图3所示。
图3
按添加后,出现图4。这三个dll前的CheckBox本来都是打上勾的,按确定即可。但是发现System.Runtime.InteropServices.RuntimeInformation.dll没法添加上去,提示是在引用下已经有这个dll了,仔细看了下,果然已有,这应该是VS2022的先进性吧,所以把这个dll前的CheckBox钩去掉了。之前在Win7+VS2017下也试过,这三个都要添加的,引用不会自动添加这个dll。
图4
最后再来一张引用添加后的截图,如图5所示。请注意图5中的Systen.Drawing.Common此时还没有,要到本文最后一步配置完才会出现。
图5
添加EmguCV的控件
打开VS2022的工具->选择工具箱项,点击浏览,在libemgucv-windesktop_x64-cuda-4.6.0.5131\libs路径下选择Emgu.CV.Platform.NetFramework.dll,出现如图6所示的4个控件,前面的CheckBox打上勾,按确定,你的工程的工具箱中就会增加这4个控件可供使用,即图7中的最后4个。
图6
图7
使用using添加EmguCV的命名空间
在工程中,Emgu中的这几个命名空间几乎肯定是要被用到,你可以毫不犹豫的将以下4行添加到你的程序中去。
using Emgu.CV;
using Emgu.CV.UI;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
随着功能的渐趋复杂,你当然还可能添加其他的命名空间。
其他的安装配置
在WinForm工程的主界面Form1中添加一个ImageBox控件imageBox1,然后再添加一个Button控件button1,写一段载入图像的程序。
private void button1_Click(object sender,EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
if (ofd.ShowDialog() == DialogResult.OK)
{
string filename = ofd.FileName;
Image<Bgr, byte> originalImage= newImage<Bgr, byte>(filename);
imageBox1.Image=originalImage;
}
}
程序运行后,执行到Image<Bgr, byte> originalImage= new Image<Bgr, byte>(filename);这一句时,提示找不到cvextern.dll,解决方法有二:
(一)、将libemgucv-windesktop_x64-cuda-4.6.0.5131\libs\runtimes\win-x64\native下的所有的.dll拷到你的工程的.exe同目录里。在这个目录里,你能发现cvextern.dll就在那里,如果你只拷这个,那么当你再次运行程序,还是会提示其他的.dll缺失,因此索性就全部拷贝吧。
(二)、通过环境变量添加,环境变量如何添加不再赘述,我只上图,在系统变量Path中,你们可以看到该添加什么。我倾向于这种方法。
图8
通过以上配置,解决了.dll找不到的问题,再次执行程序,当执行到Image<Bgr, byte> originalImage = new Image<Bgr, byte>(filename);这一句时,又出错,提示需要System.Drawing.Common6.0。解决的方法是:在Nuget的搜索栏里,输入System.Drawing.Common,如图9所示。
图9
选择图9中的第1项,在右侧中你的工程前打上勾(我这里叫bottle),表示将这个System.Drawing.Common添加到你的工程中去,如图10所示。版本处可以选择6.0.0,也可以选择最新的7.0.0,我都测过没有问题。但是我在以前的Win7+VS2017的机子上试过,7.0.0是不行的,只能用6.0.0,这应该和.net framework的版本有关,Win7的.net framework的版本升不上去了,System.Drawing.Common也只能用较低版本。
图10
以上就是我在安装配置EmguCV4.6时遇到的问题和解决方法。