我选取了自己最关心的部分。来源:http://www.cnblogs.com/xrwang/archive/2010/01/26/TheComparisonOfImageProcessingLibraries.html
作者:王先荣
前言
近期需要做一些图像处理方面的学习和研究,首要任务就是选择一套合适的图像处理类库。目前较知名且功能完善的图像处理类库有OpenCv、EmguCv、AForge.net等等。本文将从许可协议、下载、安装、文档资料、易用性、性能等方面对这些类库进行比较,然后给出选择建议。
文档资料
类库 | 总体评价 | 书籍 | 网站 | 文档 | 示例 | 社区 | 备注 |
OpenCv | 中等 | 中英文 | 中英文 | 中英文 | 较多 | 中文论坛 | 有中文资料但不完整 |
EmguCv | 少 | 无 | 英文 | 英文 | 少 | 英文论坛 | 论坛人气很差 |
AForge.net | 少 | 无 | 英文 | 英文 | 少 | 英文论坛 | 论坛人气很差 |
OpenCv有一些中文资料,另外两种的资料全是英文的;不过EmguCv建立在OpenCv的基础上,大部分OpenCv的资料可以用于EmguCv;而AForge.net是原生的.net类库,对GDI+有很多扩展,一些MSDN的资料可以借鉴。如果在查词典的基础上还看不懂英文文档,基本上可以放弃使用这些类库了。
性能
这些类库能做的事情很多,我选了最基础的部分来进行性能测试,那就是将一幅彩色图像转换成灰度图,然后再将灰度图转换成二值图像。因为图像处理大部分时间都用于内存读写及运算(特别是矩阵运算),所以这两种操作有一定的代表性。
我分别用以下方式实现了图像的灰度化及二值化:(1)C语言调用OpenCv库;(2)C#调用AForge.net库;(3)C#调用EmguCv库;(4)C#中用P/INVOKE的形式调用OpenCv函数;(5)C#调用自己写的灰度和二值化方法。
分别用上述5种形式处理10次,记录下运行时间,去掉每种的最大和最小数据,然后计算平均值。结果如下所示(单位是毫秒):
语言 | 类库 | 灰度化 | 二值化 | 性能排名 |
C | OpenCv | 16.89721 | 7.807766 | 1 |
C# | Aforge.net | 48.9403 | 25.32473 | 5 |
C# | EmguCv | 18.86898 | 13.74628 | 3 |
C# | OpenCv(P/Invoke) | 18.68938 | 10.0149 | 2 |
C# | 自定义处理方法 | 48.33593 | 21.46168 | 4 |
测试环境如下:CPU-奔腾4 2.4G,内存-512M,操作系统-Windows XP SP2,显卡-nVidia GForce4 64M,进程数-49,线程数-611,句柄数-13004,可用内存101M。
结论
将上面的内容汇总结果如下表所示:
类库 | OpenCv | EmguCv | AForge.net |
许可协议 | BSD | GPL v3或商业授权 | LGPL v3 |
下载 | 方便 | 方便 | 方便 |
安装 | 比较容易 | 容易 | 容易 |
文档资料 | 中等 | 少 | 少 |
易用性 | 比较差 | 比较好 | 好 |
性能 | 很好 | 比较好 | 不好 |
综上所述,我的选择是使用EmguCv作为我的图像处理类库,在必要的时候用P/Invoke的形式调用没有被封装的OpenCv函数。你呢?
因为之前用过openCV,所以继续使用这个了。