前话
我是一个重度强迫症患者,不能忍受一点瑕疵,当然,在一定风险条件下,微小的瑕疵可是容忍。
由于跨专业读了图像处理方面的烟酒僧,从此就入行了计算机编程,也爱上了编程,虽然我水平很次,非常次的那种,虽然我还停留在计算机专业的本科大一水平,但是还是很喜欢,喜欢被大神虐,喜欢羡慕大神!搞图像的人几乎都用opencv,优点不用多说,就结合实际体验说说使用方面的事情。
1. 用什么IDE?
在这个问题上纠结的人恐怕不在少数,这首先要看你用什么操作系统了。
- 如果你是个壕,用着我梦寐以求的MacBook,那么不要犹豫,不要哔哔,不要傻了吧唧的给她安装Windows,你首选的IDE就是Xcode,虽然我没用过,但是听师兄说很好用,很强大,opencv源码对其支持非常好,调试发布神马的很easy,绝对是学习利器!
- 如果你是个有着开源精神,喜欢在高大上的Terminal上捣鼓一番的Geeker,那么你肯定是用Linux无疑了。linux下的选择可多了去了,可以用高大上的Qt,不用麻烦着每个工程都配置库文件,一个pkgconfig完美解决,方便。还有Codelite,一个开源的轻量级C++IDE,界面美观大方,插件丰富,功能强大,配置过程类似VS,快速上手。还有一个不得不说的神器就是Eclipse CDT,配合opencv堪称完美,如果你是非常普通的用户,不需要写UI,像我这样万年的控制台程序党,真的非常适合,三者的对比下面会继续侃。除此之外,如果你也想向高手看齐(你肯定不是高手,高手是不会鸟这篇文章的),信仰vim 和emacs,那么很遗憾,本文章可能不适合您,我目前的能力只能在vim上借助ctag进行opencv的代码补全,进行简单的小程序,了解不多,就不班门弄斧了。
- 最后,如果你是Windows用户,当然官方推荐的就是VS了,预编译的库都是为VS量身定做的,VS也的确好用,可是好用的代价也是巨大的:
- 炒鸡占用硬盘空间。对于花了300软妹币安装的120G固态硬盘的穷哔来说,一个VS2010(没试过2008,2012,2013,以及最近的2015)在自定义安装只要VC组件的条件下,硬生生吃掉了4个多G的空间,存储成本约为10元;
- 活生生的给系统安装了许多不知名又几乎用不到的服务,每次刷新软件管家的卸载列表,满满的都是无法名状的草泥马,我就是想写个控制台程序,至于这么虐待我讲卫生爱整洁的心么?
- 我承认VS牛逼,知道它是一个高级的从项目开发到管理面面俱到的神器,可是我真的用不着,你就安静的离开吧!之前也有用过VC++6.0,一代经典,即便现在还依然有很多死忠粉,占用空间少,不会捆绑一堆用不着的东西,基本没有微软的那套意欲在所有领域树立行业标杆的某框架,某库,某,,,,,对c++的支持很好(c99和c11就不要难为它了)功能齐全,实乃业界良心,,,可是,你妹的,opencv2.0之后已经不再支持vc++6.0了,,,那么就让opencv1.0伴随着它淹没在历史的长河中吧!
- 这里贴出几篇王垠大神的文章,从他的文章中我们也应该对Windows、Linux、Mac有一个理性的认识。
完全用 Gnu/Linux 工作
谈 Linux,Windows 和 Mac
编辑器与IDE
其所有文章的归档- 还有很多题外话,下面就穿插在下文中吧。
为表示我的抠门到了何种程度,顺便晒晒固态硬盘的空间分配,25G for Win7, 40G for Win7/Softwares, 20G for Ubuntu, 4G for Swap, 13G for Ubuntu/home,10G for WinXP,没错,三系统,各有所用,也实属无奈之举,穷哔买不起新本本。
- 轮到重点了:不是非用Windows不可,用Linux作为日常学习使用环境完全可行,可是偏偏我现在的状况是:
- 院内学校工作学习方面的消息统一在扣扣群发布通知,需要经常和老师同学朋友传达信息,经常传个文件什么的,而企鹅不给开发Linux版的企鹅,现存的Wine版几乎已经报废;
- 看个外文paper使用金山词霸很方便的划译个单词什么的,Linux下找不到最优的替代品;
- 最坑爹的,偶尔看知网的文章,其学位论文只提供caj格式,话说真心不喜欢这格式,通用的pdf多好,非得显示自己牛逼造个新格式弄个新阅读器,而且也不给开发Linux版,为此我也经常轰炸式发邮件反馈,却至今不鸟我,,,
- 实验室的DSP板子的仿真器坑爹的只提供32位系统的驱动,害我不得不安装一个丑哭了的WinXP(因为装32位的Win7对空间实属浪费)。
- 以上问题成为我实现全面Linux风格化的最主要障碍,至今无解。
- 回归正题,Windows下用Linux风格代码+第三方实用IDE也完全可行,Eclipse CDT + MinGW乃正解
- 为什么不用CodeBlock? ans:丑
- Codelite辣么好看,为什么不用? ans:代码提示功能太鸡肋,怎么说呢,就是无法像VS下VA的超强代码提示,包括原型和注释什么的都能查看,Eclipse的代码提示也很强大,没有源代码实现时给出原型和注释,有源代码实现时直接给出实现;在Codelite中,当使用带返回值的函数时,只要那个函数写在等号右边,就死活打不开代码提示功能了。因为codelite和VS都已卸载,所以给不了示意图,给个Eclipse的吧,已经强大到令人发指了
就是如图所示功能,Codelite不行- 有人说Eclipse CDT效率很差,不如某某,,,? ans:萝卜白菜,各有所爱
基本的选择困难症已经治愈,下面开始正餐
2. 怎么用?
- 下载MinGW并安装,(新版改了,下载的是一个在线安装器)安装过程请自行尝试;
- 下载OpenCV,建议不要下载3.0版的,在Windows上用MinGW编译不过,2.4.9和2.4.11我都尝试过,没有问题。下载完毕请解压,稍后编译仅用到Source文件夹下的源码,预编译好的Biuld文件夹下的X64, X86如果你不用,可以尽情的Delete;
- 下载Cmake并安装;
- 下载Eclipse CDT,此版本无需安装,解压即用,前提是要安装Java环境,请根据自己情况对号入座
- 如果你需要用CUDA,请下载CUDA开发库。注意:这货在Windows平台默认支持VS,而且工程模版都是VS版的。有人说不用VS照样使用CUDA,总之我没尝试,不太了解,就不瞎哔哔了
材料已经准备齐全,下面开始使用
1. 使用MinGW和Cmake重新编译OpenCV
上简图和渣文描述,细节请教度娘,网文一大堆
- 点击Configure
BIULD_TYPE项请填写Debug 或Release,不能同时填两个,会出错,两个版本的库都想要的话请分两次编译
IPP库不是免费的,Cmake会帮你自动下载,但是建议该项不要勾选,否则编译会出错,我试过两次,都失败了- 至于其他的库,比如CUDA、TBB、EIGEN、Qt等,请根据实际情况酌情勾选,还有一个组件opencv_world,据说这个是十几个库的总和,以后工程配置中只需连接这一个库文件即可满足所有需求,应该是为OpenCV3.0准备的,在2.4.11上我试过,失败了,所以不建议勾选
- 再次点击Configure,不出意外的话所有红色会消失,点击Generate即可
- 从资源管理器中找到目标目录,即.\build\mingw,按住shift,右键,选择“在此处打开命令窗口”,键入命令:mingw32-make 漫长的等待,视电脑配置不同时间也会差别很大
- make完成之后,继续在命令行中键入命令:mingw32-make install , 刷刷的就完成了
- 去.\build\mingw目录下把bin目录和lib目录通通导出,剩下的文件如果你没用就可以删了。
- 再从头折腾一遍,这次是编译Debug版的库,注意在BUILD_TYPE中填写Debug,完成之后再导出,删掉垃圾文件,将Debug和Release版的bin和lib合并,放到你喜欢的文件夹内,记得顺便把原版opencv解压后的build目录中的include文件夹也顺走,和库文件放到一起,并把bin目录添加到系统的环境变量Path下(不要添加多于一个版本的OpenCV路径,否则你会死的很难看),至此,编译完成
2. 使用EclipseCDT + OpenCV + MinGW
和前面一样,细节不哔哔,只有简图和渣文描述
- 新建C++工程,选择Empty Project 或 Hello World随你,编译器选择MinGW GCC
- 工程配置,右键点击工程,选择最下面的属性,分别设置include路径,Lib路径和具体的lib名称,Debug和Release两种配置最好分别都设置下。**注意:**Eclipse中库文件的设置是不需要填写后缀名.dll.a的,有点蛋疼的是其选项必须一条一条添加,不能像Codelite那样设置成一连串的字符串形式,一次性添加所有文件;而且Debug版的库文件最后一个字母为d,看清楚了。建议做一个OpenCV空工程或者模板工程,配置好所有的路径和库文件之后就搁置,每次新建OpenCV工程只需复制那个模板工程,再重命名即可。不罗嗦了,继续上图
- 如果你需要C++11的新特性,请添加:-std=c++11 ,如图
至此,配置完毕,可以开森的使用了,测试程序神马的就不发了,按照以上过程配置的,不出错,不会有问题的。
关于安装和配置方面的内容到此为止,不再详述,下面的内容为我使用过程遇到的常见问题,以及我的解决方法,会持续更新。
如果我文章中有错或者不妥的地方,也请能够批评指正,我非常愿意与大家共同学习共同进步
3. 常见问题与解决方法 Q&A
1. 为什么Debug时,imread()不能读取图片,而直接在命令行运行程序却可以读取?
- 这是一个悲伤的故事,我看网上很多人都在头疼这个问题,连很多老外都去stackflow求助,或者干脆在OpenCV论坛反馈bug,,我当初也是无法解决这个问题,一直使用宏 FUNCTION 、LINE 加到代码中,使用命令行运行可执行文件,在运行中根据输出信息找BUG,外加各种烧脑的模拟运行过程,也是直到今天才发现完美的解决方法,想想也真是一把辛酸泪,故而决心写这么一篇文章。
- 网上给出的解决方法是:Debug用Debug版的库,Release用Release版的库,,,,这么弱智的解决方法你以为我没有想到么,我前面的教程不是特别交代要你编译两次,分别编译出Debug和Release么,,,还有一种解决方法是:设置工程为“多线程调试”即MTd(指的是VS环境,我不知是否有效,因为我没用过),总之Eclipse CDT找不到这么一个选项
- 当我今天偶然开窍发现了真相,感慨万千,不禁给跪了,,,真相竟然是:读取图片或视频请使用绝对路径
- 原因很简单,Eclipse CDT仅仅是一个外壳,调试时需要调用gdb,而gdb的位置在你安装MinGW的路径下,那个路径下没有你要读取的图片,所以在Eclipse CDT直接点击调试或者运行是绝对跑不通的。反过来看,编译生成的可执行文件要么在工程中的Debug目录,要么在Release目录,一般开发者喜欢把图片或视频神马的放在在该目录下以方便快速查看运行效果,所以在改路径下直接运行可执行文件是没有任何问题的。
- 所以,以后写代码,尽量使用绝对路径吧,省的出现这么多乱七八糟的问题。
2. 为什么Eclipse CDT的调试会卡在62%,一直在launching gdb service ?
- 因为你没有设置Eclipse CDT中调用gdb的位置,点击Window -> Preference,如图,重新设置gdb的路径到你安装MinGW目录中gdb所在的位置即可
以后遇到其他问题再更新