我看到了在Android设备中使用OpenCV的两种方法:
- 使用Java OpenCV API
- 使用C++OpenCV API
我的问题是:哪一个更好、更快、更容易配置/编码?或者,如果我的问题是错的,每种方式的利弊是什么?我阅读了OpenCV文档和几篇文章,但找不到问题的答案。
我想它必须对应用程序的实现做更多的工作。它是java还是c++(本机(应用程序?图像处理是应用程序的重要负载吗?您需要计算速度还是实现速度?无论如何,我已经通过JNI和NDK在java中使用了OpenCV(C++实现(。我的应用程序的核心是图像处理,处理速度非常符合我的兴趣(几乎是实时的(。一切都是用C++编写的,因为我的成像系统既有桌面实现,也有移动实现。
在移动应用程序(适用于android(中,我的成像系统嵌入在一个java应用程序中。从这里,我看到处理分为两部分:图像采集(通过设备摄像头(和图像处理(通过OpenCV(。图像采集都是用java实现的。这项工作并非微不足道,因为我发现的主要问题是从相机(本机为YUV(获取RGB帧,将它们传递给OpenCV,从OpenCV接收结果,并将它们渲染到应用程序的surfaceview。
相机和OpenCV的接口确实会让人头疼,这主要取决于您的设备功能和SDK版本。在获取图像后,处理相对来说是无痛的。我所有的系统之前都在我的电脑上调试过,我完全知道会发生什么。所有的OpenCV函数都正常工作,所以我对这部分几乎没有任何问题。
我也花了很多时间在C++中工作,所以这是决定选择哪种实现的一个因素。现在,应用程序基本上已经设置好了。我可以添加新功能并在我的电脑中进行测试,并相当快地更新移动端口。
OpenCV Java API是在Android上使用OpenCV的标准方式。它基本上是C++API之上的Java层,其中每个OpenCV Java函数都通过JNI(Java Native Interface(调用其C++等价物。
当使用Javaneneneba API时,进行JNI调用会导致少量开销,从而增加OpenCV函数的执行时间。如果您的图像处理管道对OpenCV函数进行了大量调用(比如说N次调用(,那么JNI调用开销将影响管道的N倍,这可能会降低您的总计算时间。
另一种选择是用C++实现整个图像处理管道,并从Java调用该C++代码,从而将开销减少到只有一个JNI调用。
OpenCV C++优点:
- 速度
- 现有C++代码的可重用性
- 所有OpenCV API可用
OpenCV Java专业人士:
- 更易于部署
- 更易于实施
- 更易于调试
请查看它的开放cv android版本
https://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/O4A_SDK.html