我正在研究学校项目,其中一部分应该是关于Android计算机视觉库的现状。我以极大的热情去了它,因为计算机视觉看起来像是一个引人入胜的主题,但我一直在搜索超过一周而且我找不到多少。我希望能够提供有关库本身以及它们之间的比较的信息。
我将分享到目前为止我发现的内容。
OpenCV
似乎是最先进的,也是最受欢迎的。
提供最多的功能
它存在向后兼容性问题
很快(至少我听说过,但我没有关于它的信息)
JavaCV
FastCv
Wikitude
正如您所看到的,我有一些关于它的信息,并且对每个图书馆进行自己的测试远远超出了我目前的计算机视觉技能。
亲切的问候,彼得。
答案 0 :(得分:24)
基本上有两种选择:OpenCV和FastCV
OpenCV是一个更成熟的库,其功能远远超过FastCV。对于许多计算机视觉任务,您只能在FastCV中找到最基本的功能,而OpenCV中几乎可以找到所有常用的替代功能。例如,检查可用的功能检测器。 OpenCV有Harris,SURF,SIFT,FAST等。另一方面,FastCV只有Harris和FAST。 OpenCV包含针对不同硬件的硬件优化,包括台式计算机和移动计算设备。在桌面中使用OpenCV的能力为您提供了更灵活的开发选项,因为您可以在开始进行移动开发之前在快速桌面计算机上调整和测试代码。 OpenCV也被视为a Khronos Computer Vision Group Proposal的一部分。因此,如果获得批准,OpenCV可以成为计算机视觉的标准API。据我所知,FastCV为Snapdragon CPU提供了卓越的优化。这可能在短期内在决策中发挥重要作用,但我确信OpenCV会很快缩小差距,如果有的话。
如果选择OpenCV路径,则有两个子路径:使用Android NDK的OpenCV与使用Android SDK的JavaCV。 JavaCV是基于JavaCpp的OpenCV的包装器。 JavaCV主要包装C API,尽管OpenCV也提供了面向对象的C ++ API。例如,C ++ API自动处理未使用内存的释放。但是,C API(因此JavaCV)要求您手动处理未使用的图像的释放。此外,当您在JavaCV中遇到问题时,很难解决问题,因为有太多的间接检查。直接使用OpenCV时,更容易找到问题。但是,在Android的情况下,不应忘记NDK的额外难度。
如果可用OpenCV功能对于特定应用程序是必需的,并且不需要自定义像素级处理代码,JavaCV是可行的方法。但是,如果需要大量的自定义图像处理代码,Java代码会降低您的速度,无论如何您都需要切换到NDK。在后一种情况下,OpenCV是可供选择的替代方案。
答案 1 :(得分:7)
我会使用OpenCV,因为它是目前最好的计算机视觉库。您将使用C ++编写函数,然后使用JNI库编译Android应用程序。您可以在official documentation上获得有关如何执行此操作的信息。
我已经使用过这个配置,并且android中的OpenCV性能非常好。如果使用定点算术创建一些函数,您会注意到好处。祝你好运
答案 2 :(得分:5)
对于基于android的项目,很容易从JavaCV开始。它几乎包含OpenCV上可用的所有功能。
但是没有关于JavaCV的丰富文档,但是OpenCV有。因此,您可以从OpenCV文档中找到相关方法,并在JavaCV中使用相同的方法(相同的方法名称)。
here有一份完整的文件。这是关于如何在eclipse - android环境下设置JavaCV的讨论。
答案 3 :(得分:3)
编辑:
这并没有改变推荐OpenCV的结论,实际上它增加了更多的选择点。
答案 4 :(得分:1)
Android上有CV的新选项Google Mobile Vision API。 API通过com.google.android.gms.vision
公开,允许您在给定任意图像位图的情况下检测各种类型的对象(面部,条形码和面部特征)。
答案 5 :(得分:0)
从OpenCV开始,然后移植重要功能,如功能跟踪,卷积,扩张/侵蚀,以及SVM。在编译android的情况下,用#ifdef __ANDROID__调用那些调用然后只调用FastCV等效。抽象是你的朋友。