2014-08-16
最近要进行图像识别,准备利用几天的时间研究一下Emgu CV,花了一晚上功夫进行调试环境安装,期间遇到了不少问题,现梳理一下安装过程和调试过程中出现的问题。
中间有转载别人的部分,有简体和繁体,还掺杂英文,就不整理了,基本都能看懂。
一、环境建立准备
本篇著在於使用Visual C# 2010 Express + EmguCV環境的建置。
環境:
Visual C# 2010 Express 下載點:
http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-csharp-express
EmguCV 下載點:
文件名是2.9版本,但个人感觉是2.4.9版本。
libemgucv-windows-universal-cuda-2.9.0.1922-beta.exe (214.0 MB)
2.4.0版本下载地址
thunder://QUFodHRwOi8vaXdlYi5kbC5zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdC9lbWd1Y3YvZW1ndWN2LzIuNC4wL2xpYmVtZ3Vjdi13aW5kb3dzLXg4Ni0yLjQuMC4xNzE3LmV4ZVpa/
截至2014年8月16日,emgucv的版本为2.9.0.1922-beta。2.4.2及之前版本,若安装文件文件名中带gpu字样的,则仅限支持CUDA的显卡使用;不带gpu字样的,则通用。而通用版目前的最高版本为2.4.0。
OpenCV下載點:
截至2014年8月16日,OpenCV的稳定版本为opencv-2.4.9.exe (365.7 MB)
鉴于目前调试功能不是很复杂,根据部分网友反馈和调试经验,即使不安装opencv,emgucv也能正常运行。但据反馈,如果两个版本不匹配,会出现错误,如果要装opencv,最好保证两个软件版本一致。
二、安装调试环境
opencv安装
为了便于管理,我在C盘根目录下新建了文件夹,然后解压至下面。
EmguCV:
过程类似。我安装在C盘下面,以便统一管理。
三、参数配置(转载)
转载部分是以2.3.0版为基础,但和2.4.0配置方式一样,供参考。
Emgucv完整路徑是C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin
OpenCV完整路徑是C:\opencv\opencv\build\x86\vc10\bin
因此要將這兩個路徑加進Windows環境變數裡。实际只添加了opencv环境变量。
環境變數的設定方法與設定Java的方法一樣,將
C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin;C:\opencv\opencv\build\x86\vc10\bin;
填入Variable value欄位內的最前面。要注意到路徑中間及最後面需要加上“;”,如果漏加了,评论就是一长串的问题,然后我也不知道你的问题在哪里。
到目前已經算是把軟體都安裝好,也設定完成了。
四、调试环境配置
將Emgu.CV.UI.dll加入工具箱內
工具>選擇工具箱項目>.NetFrameworkm元件頁籤點內選瀏覽>
Emgu.CV.UI.dll的路徑在C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin
加入工具箱以後,我們可以確認一下有沒有成功加入成功。
若成功加入工具箱則會在工具箱內自動新增四個元件
最後在加入開發程式時所需的dll函式庫,就可以開始编程。
包括Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll等文件。
相關的dll檔一樣在C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin底下
至於需要加那些dll,則看需求。
到目前為止,從環境的建置一直到建立專案完整的步驟都如上面所述。
五、调试测试
是否能正常运行,用下面的例子可以测试一下,如果正常,可以弹出窗口显示一张图片。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.Util; namespace EmguDemo { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { CvInvoke.cvNamedWindow("Hello"); IntPtr img = CvInvoke.cvLoadImage("C:\\1.jpg", Emgu.CV.CvEnum.LOAD_IMAGE_TYPE.CV_LOAD_IMAGE_ANYCOLOR); CvInvoke.cvShowImage("Hello", img); CvInvoke.cvWaitKey(0); CvInvoke.cvReleaseImage(ref img); CvInvoke.cvDestroyWindow("Hello"); } } }
注意更改图片的绝对路径。这种错误不要再犯。
六、错误处理
大部分遇到的问题都是一样,“cvinvoke”异常。
Have you installed MSVCRT?
是否安装了Microsoft Visual C++ 2010 SP1可再发行组件包x86,现在基本都带了,这个不是问题。
Have you copied the OpenCV dlls to the execution directory?
Make sure the unmanaged DLLs are in the execution directory.
cudart64_42_9.dll, cvextern.dll, npp64_42_9.dll, opencv_calib3dXXX.dll, opencv_contribXXX.dll, opencv_coreXXX.dll, opencv_features2dXXX.dll, opencv_flannXXX.dll, opencv_highguiXXX.dll, opencv_imgprocXXX.dll, opencv_legacyXXX.dll, opencv_mlXXX.dll, opencv_nonfreXXX.dll, opencv_objectdetectXXX.dll, opencv_videoXXX.dll,
where XXX
is the OpenCV version number.确认unmanaged DLLs 是否已经拷贝到程序文件夹。o(╯□╰)o 天生的缺陷。
具体dll文件列表可参考上述名称。
这步很重要,把相关dll拷贝过去就OK了。
The best way to set up your project is: