这周继续写坑,电影《后会无期》里,苏米说:从小听了很多大道理,可依旧过不好我的生活。是表达,你没有听过我的故事,你不懂我,你的道理对我没用。是的,每天、每周、每段时间,我们都要面对自己的坑,因为每个人所处的环境都不一样。
今天是想记录一下上周使用opencv时遇到的一些具体问题。
上篇说了为什么要编译opencv源码,当时我电脑的环境是这样的:装了vs2010、vs2012和opencv 2.4.9,然后想编译opencv 3.4.2的vs2010版本。
opencv 3.4.2支持低版本的vs吗?
使用CMake编译opencv源码的教程网上很多,这里就不赘述了。很快,我生成了sln工程,然后编译,报了很多错误,心想3.4.2是不是不支持低版本的vs了?
然后用vs2012编译,还是失败,但心中的疑问还是没消除。就干脆卸载了vs2012,安装上vs2017社区版,然后再编译,成功了,初步判定:opencv 3.4.2不支持vs2010了,可能需要转到2017上面来。
问题是,我之前的代码都是在vs2010环境下写的,要转到2017,得修改不少东西,还要重新测试,风险不小,遂放弃了这个想法。我不得不再次考虑:opencv 3.4.2真的不能直接编译vs2010的版本吗?
然后我把vs2017工程的平台集选项设为v100,即用vs2017编译一个vs2010的库,编译也成功了,仿佛看到了曙光,但在调用时报了莫名其妙的崩溃问题。
我的问题是什么?
我重新把注意力转到3.4.2在vs2010下编译报的error上,比如:
无法打开文件:
“....\lib\Debug\opencv_highgui342d.lib”
将刚才2017(v100)编译时产生的Debug文件夹拷过来,重新编译,失败项减少到2个,其实我的问题是:「验证3.4.2做图像模板匹配的效果如何」,现在尽管还有2个error,但已经编译出我需要的库了。
解决问题过程中的心理变化很有意思
遇到编程方面的问题,到网上去搜,一般都可以找到有类似经历的同学,他们或者在总结、解惑,或者在发问,从中,可以找到解决自己问题的思路。有时会有很多个想法,可以把每个想法都写下来,然后逐一验证。不要只是空想而不去验证,猜想太多,就被困住了。
很多时候,不能完全照搬别人的方法,我们往往需要综合前人的坑才能从自己的坑里出来,重要的是专注于自己的问题,从自己的error出发。吴军老师在昨天的专栏中回答读者问题时说:
如果有一个困难必须克服才能前进,除了克服它,别无他法,不可能绕过去。
OpenCV的版本演进
编译源码其实是使用OpenCV库的基础知识,之所以遇到很多坑,还是因为对这个库不熟悉,这是「初学者困境」,越不熟悉越容易放弃,放弃则没有进步。
OpenCV1.0、2.0、3.0的区别
OpenCV是1999年8月发起的一个关于计算机视觉和模式识别的项目,从C语言开始,现已发展为支持STL和Boost的、更模块化的C++语言。收益于在Git上的分布式开发、持续构建、Google支持的单元测试、大量的文档,OpenCV库已经达到现代软件开发标准。
起初OpenCV就被设计为跨平台的,支持Windows、Linux、Mac OS X这些桌面系统,现在也支持Android、iOS这样的手机操作系统。它还专门为Intel、ARM、GPU、FPGA等芯片做了优化。
1.0版本就是为了建立实用的算法。2.0版本开始,逐渐转变符合了现代C++开发标准,包括代码转移到Git上、进行Google风格的单元测试、支持命名空间,当然还包括提供了C++接口。沿着这个思路,Python、Java、MATLAB接口也增加了进来,而老的C函数则封装在C++代码之中。
OpenCV从2.1版本开始,就是类似STL、Boost这样库的模板元编程风格了,这种设计风格更强大,包括最终的代码质量、速度、以及灵活性方面。OpenCV的这种模板结构让算法以一种抽象的方式执行,而不是仅仅依赖于C++的基本类型、甚至不依赖于OpenCV的基本类型。
OpenCV 3.0开始注重「模块化」,早期开发中,都是native C++(相对于托管代码)写的,这样就只需要维护一个代码库,计算机视觉技术的飞速发展也得益于那些大量实用算法都集合在一起。
OpenCV 3.0保持了核心的完整性,而又将其他部分划分为易于使用和维护的小模块,这样用户就可以根据自己的需要进行独立配置。大量学生和研究人员基于OpenCV开发了更多的新算法,3.0的文档、单元测试、例子代码让这些研究工作更容易开展。
模块化的3.x版本同样有助于云端、嵌入式、手机应用的开发。嵌入式视觉设备可以用于机器人、自动化、环境、教育等很多领域,而在这些领域,内存有限是一个需要重点考虑的问题。同样地,云计算也有内存限制,因为数据量往往很大,内存也常常成为瓶颈。
扩展模块:opencv_contrib
GitHub上有专门的扩展模块的Repository,进去可以看到从3.4.2到3.0.0-beta版本的opencv_contrib。就是从3.0版本开始,OpenCV库被一分为二:成熟部分opencv和opencv_contrib,前者由OpenCV核心团队维护,是稳定的代码,后者则没那么成熟,主要来自社区贡献,可能是非OpenCV许可的,甚至是已经申请了专利的算法。注意,2.0也有扩展模块,就在sources\modules\contrib文件夹下。
这个代码仓库的日常工作都是独立进行的,但遵循OpenCV编码和文档的风格。OpenCV最新的算法和计算机视觉方面的应用进展都体现在opencv_contrib中,它就像一个「vision app store」。
未来方向
OpenCV现在是一个加利福尼亚的非营利基金会项目,旨在开展计算机视觉技术的普及,推动计算机视觉技术教育,为进一步的计算机视觉算法研究和实践提供一个自由和开发的基础设施。之前,该基金会得到Intel、Google、Willow Garage和英伟达的支持,美国国防高级研究计划局也通过Intel资助了该项目。
《Learning OpenCV》这本书的早期版本曾预言OpenCV在未来的发展,比如OpenCV将支持机器人和3D技术,这些都已经实现,现在OpenCV还支持了姿态估计、增强现实等技术。有意思的是,书中也有预言错的地方,比如贝叶斯网络没有继续发展壮大,因为深度学习出现了。另外,一些艺术家们仍然在继续扩大使用OpenCV的范围,这也是书中没有料到的。
未来的方向包括:
深度学习
手机
眼镜
嵌入式应用
3D
简易相机
机器人
云计算
在线教育
12周,坚持周更之7/12,连接开发者,连接迭代成长者
领取专属 10元无门槛券
私享最新 技术干货