Android计算机视觉:JavaCV、OpenCV和FastCV比较

12

我正在进行学校项目,其中一部分应该是关于Android计算机视觉库的当前情况。我充满热情地去了解它,因为计算机视觉似乎是一个迷人的主题,但我已经搜索了一个多星期,没有找到太多信息。我希望能够提供有关库本身以及它们之间比较的信息。

以下是我目前发现的:

OpenCV

  • 看起来是最先进和最受欢迎的。

  • 提供最多的功能

  • 它存在向后兼容性问题

  • 速度很快(至少我听说是这样,但我没有任何信息)

  • 有最多的书籍(至少对于C++版本)

JavaCV

  • 是几个其他库的包装器,包括OpenCV

FastCv

  • 由高通公司推出的新库。

Wikitude

  • 这更多是用于增强现实,但其核心仍然是计算机视觉。

正如您所看到的,我对此了解甚少,而且对每个库进行自己的测试远远超出了我的计算机视觉技能。

敬礼,彼得。


1
之前有其他人做过类似的项目:http://www.cs.brown.edu/courses/csci1290/results/final/sbnguyen/ - Samuel Audet
@SamuelAudet,你应该把那个作为官方答案,这样我就可以点赞了! :) - Peter
@SamuelAudet 现在看起来,链接中的信息似乎已经过时了。 - Peter
有没有关于fastcv与opencv速度比较的数据?谢谢! - ch271828n
6个回答

26

基本上有两个选择:OpenCV 和 FastCV

OpenCV是一个更成熟的库,比FastCV拥有更多功能。在许多计算机视觉任务中,您只能在FastCV中找到最基本的功能,而在OpenCV中,几乎所有流行的替代方案都可以找到。例如,请检查可用的特征检测器。OpenCV有Harris、SURF、SIFT、FAST等,而FastCV仅有Harris和FAST。OpenCV包含了针对不同硬件的硬件优化,包括桌面计算机和移动计算设备。在桌面上使用OpenCV提供了更灵活的开发选项,因为您可以在快速的台式计算机上调整和测试代码,然后再开始移动开发工作。此外,OpenCV被认为是Khronos计算机视觉组提案的一部分 。如果这得到批准,OpenCV可以成为计算机视觉的标准API。就我所知,FastCV为Snapdragon CPU提供了卓越的优化。这在短期内可能在决策中起重要作用,但我相信如果有的话,OpenCV将会迅速填补差距。

如果您选择OpenCV路径,则有两个子路径:OpenCV + Android NDK 和JavaCV + Android SDK。JavaCV是基于JavaCpp的OpenCV包装器。JavaCV主要包装C API,尽管OpenCV也提供了面向对象的C++ API。例如,C++ API可以自动处理未使用内存的释放。但是,C API(因此JavaCV)需要您手动处理未使用图像的释放。而当您遇到JavaCV问题时,很难解决该问题,因为有太多间接检查。当您直接使用OpenCV时,问题更容易定位。但是,在Android的情况下,不应忘记NDK的额外困难。

如果特定应用需要使用OpenCV功能,且不需要自定义像素级别处理代码,那么JavaCV是首选。但是,如果需要大量自定义图像处理代码,则Java代码会减慢速度,您需要切换到NDK。在后一种情况下,选择OpenCV作为替代方案。

谢谢您,Vizier。这正是我在寻找的答案。 - Peter
顺便提一下,我们可以使用JavaCPP而不是直接使用NDK。 - Samuel Audet
值得注意的是,SIFT和SURF都是受专利保护的,商业使用需要付费。不确定,但可能这就是为什么FastCV没有包含它们的原因。 - user334911
有没有关于fastcv与opencv相比速度的数据?谢谢! - ch271828n

7
我会使用OpenCV,因为它是目前最好的计算机视觉库。您将在C++中编写函数,然后使用JNI库编译Android应用程序。您可以在官方文档中了解如何操作。
我已经使用这种配置并且OpenCV在Android上的性能非常好。如果您使用定点算术制作一些函数,您将会注意到一些优势。祝你好运!

1
嗨 @jav_Rock,感谢您的回答,但正如我上面所述,我真的在寻找一些严肃的比较。 - Peter

5
针对基于Android的项目,使用JavaCV很容易上手。它几乎包含了OpenCV中可用的所有功能。
但是JavaCV的文档不太丰富,而OpenCV有详细的文档。因此,您可以从OpenCV文档中找到相关方法,并在JavaCV中使用这些方法(方法名相同)。
这里有一份完整的文档:http://code.google.com/p/javacv/,其中讨论了如何在Eclipse-Android环境中设置JavaCV。

1
谢谢您的回答,但我不是在寻找要使用的库,正如标题所说,我正在寻找一般比较。 - Peter

3
vizier的回答非常好,但我认为他的分析有误。我认为他不知道Opencv有一个针对Android的版本叫做OpenCV4Android。它是c++功能的Java封装,这意味着您可以避免使用Android NDK并在Java中编写所有内容。除了封装opencv之外,这个库还封装了许多其他不错的CV库,这使得JavaCV“非官方”库变得多余。
编辑:
这并不改变vizier关于推荐OpenCV的结论,实际上它增加了选择它的更多理由。

1

Android有一种新的CV选项,Google Mobile Vision API。该API通过com.google.android.gms.vision暴露,可以在任意图像位图中检测各种类型的对象(面部、条形码和面部特征)。


0

从OpenCV开始,然后移植重要的功能,如特征跟踪、卷积、膨胀/腐蚀,可能还有SVM。在编译Android应用时,使用#ifdef __ANDROID__包装这些调用,然后只需调用FastCV的等效函数。抽象是你的朋友。


有没有关于fastcv与opencv速度比较的数据?谢谢! - ch271828n

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接