前一段时间,我一直在制作OpenCV基础知识的课件(《学习OpenCV3.0初级实战视频课程》 http://edu.51cto.com/course/10381.html,《学习OpenCV3.0中级实战视频课程》http://edu.51cto.com/course/10712.html)。因为一方面我感觉如果仅仅是有比如“答题卡识别”http://edu.51cto.com/course/8637.html,“图像拼接”http://edu.51cto.com/course/9313.html这一类的视频,总是缺乏一个系统的过程;另一方面我也在做视频的过程中,反省自己对基础知识是否掌握牢靠了,千万不能误人子弟。那么课件的制作,包括内容的顺序,主要还是基于《learningOpenCV3》的。结合制作课件,我对《learningOpenCV3》书后的习题较为仔细的解决,并且push到了Github上https://github.com/oreillymedia/Learning-OpenCV-3_examples。有push当然也就有commit了,可喜的是这个commit是由Opencv类库的创始者,也是《learningOpenCV3》这本书的作者Gary操作的。一来二去混熟了,我就问Gary这书怎么还没中文版呀?他说开始搞了呀。我就说我能不能加入呀?他说行。要了我的email,接着联系上了清华出版社,也看到了部分初稿。由于书已经翻译的差不多了,我就作为reviewer加入,主要是看一看语法和程序方面的错误。review的过程,实际上还是一个重复学习的过程,很多在以前学习过程中一笔带过,或者看不懂就拉倒的地方,现在就必须认真仔细地来看——多多少少要担负责任的呀。这个过程中,反思走过的路,悟出了一些东西,主要是当时是如何一步一步学习起图像处理的,和大家分享:
第一个过程,从不了解到了解
我一开始是用csharp的,而且刚开始做图像处理用的是halcon。halcon的官方自带的例程很多,百十来个吧,我当时一个一个跑着玩,感觉很有意思;然后就想办法融合到csharp中去。csharp不是写界面快嘛,加上halcon的函数效果,就能够得到完整的程序。然后我开始修改这些例程,实际上,我一开始使用halcon来做图像拼接,并且实现了出来http://www.cnblogs.com/jsxyhelu/p/3390598.html。但是halcon的版权的呀,还有和界面的交互的问题也多,苦恼时看到一本书,叫做《学习OpenCV2》,听老师傅说这个很厉害,翻了一翻——完全看不懂呀!
第二个过程,抄袭,形成自己的东西
版权是硬伤呀,没有办法只能学习OpenCV,一开始不是看《学习OpenCV2》,而是其他书。我采用的方法是在当当、china-pub中搜索opencv这个关键字,然后找到所有已经翻译成中文的opencv方面的书,然后再亚马逊上面搜索opencv,再找到那些还没有翻译的原版。基本上,OpenCV相关的书英文的我都有,比较重要的有中文的。书拿到了,我认为比较高效的方法就是——快速过一遍,有了基础;然后跑里面的例子,增加感性的认识;然后再根据需要重构,反复反复。这个过程中,也生成自己的专用函数GOCVhelper(位github开源,简介http://www.cnblogs.com/jsxyhelu/p/5904251.html)为了使用OpenCV,从头学习mfc,虽然现在c++发展很迅速了,windows这块还是mfc支持的比较好;偶尔看到于世琪的dshow对mfc的支持,感觉这个太好了,多次封装成为了GOMFCTemplate2(位github开源,简介http://www.cnblogs.com/jsxyhelu/p/GOMFCTemplate2.html),成为一个比较完整的库了,也发给于世琪看了,他说很好!还帮在微博上推了一下。
但是mfc写界面实在太慢呀,怎么办?两条路。一个是用csharp来写,在这个方向研究,形成了《Csharp调用基于Opencv编写的类库文件》http://www.cnblogs.com/jsxyhelu/p/GOCW.html 这种方法,但是有缺陷,传递的图片不能太大太快;另一个方向是mfc形成更全面的类库,实现了GreenOpenPainthttp://www.cnblogs.com/jsxyhelu/p/6350260.html,类似于画图程序,带文件列表,能够放大缩小还带阴影,最重要的还是带准确的标尺,还能够画矩形框。要知道,想在mfc中实现这种效果,全部要底层实现呀,我可是翻遍了github,codeproject,问遍了stackoverflow才得到这样的结果的。
当然,这些模型的推动,都是有实际项目拉动的。首先实现项目,然后从项目中将模型精良出来,方便下次使用。我基本上采用这个模式吧。
这样,csharp通过clr调用opencv , GreenOpenPaint实现多图像处理,再加上GOMFCTemplate2实现实时视频处理。那么对于桌面来说,基本够用了。下一步就是手机端和webapi了,这些已经思考到了,在研究。
第三个过程,算法原创
做到这个过程,还只是使用OpenCV做项目。但是随着项目的深入,很多时候客户的要求,不是有现成的算法的,也不是通过现有算法进行拼接能够解决的。怎么办?只能自己去研究,有一些问题是有论文的,也可能有书,运气比较好还有matlab代码;也会遇到了太少见了,论文也比较少。这个时候,需要的能力,还是最基本的英语和数学。能够快速阅读得到自己要的东西,但是往往一篇重要的的论文也得读个十几、几十遍吧,数学这块,我主要从线性代数开始,包括做《learningOpenCV3》课后习题的时候,只要涉及到数学问题,都想办法给解决掉,推导出来!而不是跳过去。因为我已经认识到,数学对于灵感呀、思维呀综合能力的影响很重要;能够把一个定理,比如pca中svd分解给推导一个例题出来,再使用这个函数,那感觉绝对不一样的(《学习OpenCV3》第7章第4题-SVD奇异值分解的验算http://www.cnblogs.com/jsxyhelu/p/7029283.html)。
图像处理涉及方面很多,无论是理论、实现还是应用场景,再加上软件、硬件,我也只是接触、了解、实现了很小的一个部分。但是反思这几年的过程,感觉还是有必要小结一下的,这里把自己博客中的一些东西串了一下——每一篇博客的发布都肯定是有原因的,不是随便发布出来的。写博客是总结,也是分享。现在感觉博客看的人还是比较少,感觉有里面的一些资源,还是有自己的思考在里面的,是有一定价值的东西。大家如果有机会,还是帮忙宣传宣传。有机会也多来踩一踩,增增人气!
最后,放些图,有图有真相嘛~