楼主读研阶段研究图像处理,想用C#实现PTAM/PTAMM算法并用UNITY创建相关应用。对于PTAM(Parallel Tracking and Mapping)算法,使用了大量的第三方库,实现语言是C/C++。之所以选择C#,是因为楼主想要使用Unity将PTAM算法用于AR系统。那么问题来了,C/C++处理图像使用Open CV,C#就只能使用Open CV的兄弟Emgu CV了,Emgu CV对Open CV的函数进行了封装,使其能运行在.net环境中。
首先我们到Emgu CV的官网那个下载最新3.0.0-rc1版本(http://sourceforge.net/projects/emgucv/files/emgucv/),对应封装的是3.0.0-rc1版本的Open CV。注意我们不需要安装Open CV!对于普通版和CUDA版,如果你不涉及显卡编程的话,没区别。如果需用CUDA或OpenCL对显卡编程,则需要下载CUDA版。楼主认为以后的图像处理,极有可能广泛应用显卡编程。
下载完后,安装或解压。(楼主机子为windows 8.1 64位系统,IDE为VS2012 Update4.)开始配置环境变量。在用户变量里新建PATH,里面填上安装或解压后的Emgu目录下的bin和bin里的x86和x64。如下图所示:(32位只需x86,64位需加上x64)
完成后注销或重启。打开VS2012,新建一个C# windows窗体应用程序(注意如果想以后使用unity的话,.net framework应该选3.5一下),打开 工具-选择工具箱项 浏览添加Emgu.CV.UI.dll(在bin目录里),然后右键 解决方案资源管理器里-引用-添加引用-浏览 添加bin目录下的Emgu.CV.dll、Emgu.CV.ML.dll、Emgu.CV.UI.dll、Emgu.Util.dll、ZedGraph.dll共五个DLL文件即可完成配置。注意每次新建一个工程都需要这一步。
接下来奉上图片读取和灰度处理的代码:(需在头部加上using Emgu.CV; using Emgu.Util;)
代码里创建里三个imagebox控件。imagebox1显示由button1加载的彩色图片,imagebox2显示imagebox1中彩色图片通过灰度处理后的灰度图片,imagebox3
显示由button3加载的灰度图片。button2使用的是灰度处理函数CvInvoke.CvtColor(),将已经加载好的彩色图像转化为灰度图像。button3中直接在加载时就处理为灰度图像。 本程序还使用Stopwatch计时器对三个过程进行了计时,分别显示在对应的textbox里。
(PS: 对于button2里的灰度处理过程,第一次运行的时间长达200ms+,之后每次在3ms左右,楼主估计是第一次从库中检索并加载灰度处理函数的时间,之后都是直接调用,所以3ms为灰度处理过程的时间。)
欢迎大家给出意见,共同学习!
未来,属于一心实现自己预言的人。
--cc 2015/5/27