OpenCV
OpenCV是一个很流行的图像处理库,它为图像处理算法研究提供了很好的平台,甚至很多产品在OpenCV的基础上稍作修改就可以达到目标。有关OpenCV的介绍,abruzzi有一篇不错的介绍帖子(
http://www.iteye.com/topic/463668),所以这里就不再做详细介绍。
Why OpenCV + Ruby ?
学院派的图像处理研究者喜欢用MATLAB,而实际产品开发,则用C/C++居多,特别是嵌入式系统,最终都要用C/C++重新实现算法甚至要用汇编优化部分代码。
当然,很多公司是学院派和工程派兼之。
用MATLAB的好处是可以快速实现算法,缺点是当你想把算法变成产品的时候,要经过一个比较长的过程,要把算法用C/C++再实现一遍。
OpenCV本身就是用C++写的,而且很多算法已经经过了优化,性能不错。因此如果直接基于OpenCV开发算法,在最终转化为产品的时候就很方便。
直接基于OpenCV开展算法研究的一个最大问题是缺乏快速验证的平台。虽然OpenCV提供了highgui用于简单的结果展示,但是离“方便”还是缺很远。我过去是用VC/MFC构建开发平台,提供了很多方便的功能辅助算法研究,但是平台的构建和维护,以及功能的增加都要花费巨大的努力,算法研究人员要为维护平台而煞费苦心。
一个通用的,易于维护,可扩展的平台对图像处理算法研究非常有帮助。
Ruby语言拥有容易学习,语法优雅,表达能力强的特点,而且加上RubyGnome2 GUI库,可以很方便地实现理想中的图像处理算法研究平台。
另外,还有其他几个因素使得Ruby适合做这样的平台:
1. RubyInline可以让你在ruby程序中嵌入C代码,这对于尝试一些贴近底层的算法调整非常方便。
2. Ruby的C扩展还算比较容易编写。
3. Ruby是动态语言,可以方便地为平台增添插件功能,或者提供一个脚本控制台。
在这里不能不提到Python,Python是一门优秀的脚步语言,也有很多库支持,特别是OpenCV官方就提供了Python的绑定。用Ruby或是Python只是个人喜好的问题。
Tui Image Studio
这是一个用Ruby写的,支持OpenCV的跨平台图像算法研究平台软件。它为图像处理研究提供了许多基本设施,例如直方图查看,区域分割与选择,摄像头连接等,而更多的图像处理算法则通过插件的形式来提供。
当你想尝试一个新的算法的时候,如果现有的插件中不能实现,就可以新写一个插件。多个插件可以以链接的方式协同工作,当然插件也可以暴露供外部调用的接口。
插件的界面和流程控制用ruby编写。当需要用C的时候,你可以编写C扩展或者直接在插件的ruby代码中嵌入C代码,Tui平台会通过RubyInline自动为你编译。
通常情况下,为OpenCV本身提供的功能编写插件,包括UI代码都在100行以内。
在Tui中算法验证通过以后,把这个算法在实际产品中实现则相对简单:因为都是基于OpenCV,增加的算法代码也都是用C写的。
你编写的插件越多,积累的算法也就越多,下一步算法研究也就越容易。
另外,Tui平台还提供分布式处理工具:有些算法需要巨大的运算量,要对一个数万张图片的图库验证一个算法需要很长的时间,这个时候你就需要几台或数十台PC来进行并行运算。Tui为你提供了这样的便捷工具,你可以发布你的插件到所有安装了Tui的机器并分配验证任务,最后收集结果报告。
Tui Image Studio截图:
图中演示了Canny边缘检测,直方图,高通滤波,以及一个从摄像头获取实时视频并做人脸检测的插件。
Conclusion
OpenCV+Ruby为图像处理研究提供了一个利器,可以快速验证算法并平滑过渡到最终产品。Ruby用作GUI程序开发已不仅仅是玩具而已,RubyGnome2可以用于开发复杂的,严肃的桌面应用程序。
Tui: 一种本地的很聪明的鸟,有独特的双频鸣叫声,非常动听。我开发这个软件的时候窗外经常有它陪伴,故取名Tui。