写一个OpenCV源码解析的博客 -- 图像开发处理之基础介绍
这里先写一个序,是督促自己常常来更新博文(名字没想好,叫OpenCV程序设计的艺术?)!
很久了,想写一点关于OpenCV,FFMPEG,X264等源码解析的博客。
考虑到基础都是相通的,所以决定先写一些基础性的知识。
相对于FFMPEG和X264,OpenCV的基础性更强,计算功能也更单一。换句话说,你完全可以理解OpenCV的一个类型的计算方式而不用理会是否理解了另一个类型,这可能也是视像算法中比较容易深入的,所以从这里开始。
第一点,看这些博文的话,首先必须懂基本的C/C++语言。为什么是C和C++?视像领域讲究的就是效率,java等语言的效率在这些领域实在是捉襟见肘;而且,真正在速度要求高的地方,甚至得使用汇编优化才能充分发挥硬件的性能。
第二点,现代计算技术的核心,就是效率和算法的高度结合。熟悉C语言可以深入到最底层的架构、程序机理等。如果你只是播放个视频,调用系统API或许已经足够。但如果想做到融会贯通,运用自如,甚至能开发自己的解码编码器,那就是必须对底层的函数和原理有很深的理解。
当然,兴趣是成功之母,想学好视像开发,还必须有很浓的兴趣 。学海无涯,这里面涉及到太多的算法和难以理解的程序设计方法,学习过程肯定不会那么轻松。没有兴趣的话,再好的老师你不能保证你学习成功。
为什么要解析源码呢?
首先,原理和算法的讲解往往不是最缺失的,这种教材和教科书不少。然而,理论和实践之中有一道天然的鸿沟,这条鸿沟决定了程序员真正用理论来构建自己的代码的最终水准。要跨过这条鸿沟,就需要面对大段大段的代码。这对初学者尤其明显,在源码的海洋中,你一时半会根本分不清谁是谁,哪个参数代表什么意义。而当你弄明白后,往往是已经投入了大量的时间。
另外一方面,这些源码是有经验的程序员多年经验的总结,其中有不少设计风格和方法值得我们借鉴。比如OpenCV的编码风格比较严谨,举个简单的例子,在并行处理中,程序员通过频繁对()重载符运用,巧妙地实现了各细微功能模块之间的相互调用。我还解析过微软的某些源码,其程序员特别喜欢用类的构造的析构来处理指针,巧妙地避免了内存泄露的可能,其作用非常类似c++11的智能指针shared_ptr。
所以,我想在这里抛砖引玉开个头,把自己解析源代码的体会写出来。在这个过程中,我希望能把注释写得尽可能地简单而清晰,对新来者,哪怕是零基础的初学者,也能通过阅读注释,尽可能快地了解源代码;对那些时间非常有限的朋友,他不必去读完全部相关的代码,就能很快地领悟当前这段代码的作用的意义,以使他们能更快速地进入这个领域的核心世界。
由于时间太过紧张,博文只能边写边更新,往往是想到了就先写上来再说,毕竟时间有限。如果你对深入源码有兴趣,请持续关注。
谁叫咱生活在这个高节凑的程序世界呢?