【发布时间】:2020-06-28 02:55:38
【问题描述】:
我见过两种在 Android 设备中使用 OpenCV 的方法:
- 使用 Java OpenCV API
- 使用 C++ OpenCV API
我的问题是:哪个更好、更快、更易于配置/编码?或者,如果我的问题是错误的,那么每种方式的优缺点是什么?我阅读了 OpenCV 文档和几篇文章,但找不到我的问题的答案。
【问题讨论】:
我见过两种在 Android 设备中使用 OpenCV 的方法:
我的问题是:哪个更好、更快、更易于配置/编码?或者,如果我的问题是错误的,那么每种方式的优缺点是什么?我阅读了 OpenCV 文档和几篇文章,但找不到我的问题的答案。
【问题讨论】:
open cv android 版本请看一下
https://docs.opencv.org/2.4/doc/tutorials/introduction/android_binary_package/O4A_SDK.html
【讨论】:
我想它必须对您的应用程序的实现做更多的事情。它是 java 还是 c++(本机)应用程序?图像处理是您应用程序的重要负载吗?你需要计算速度还是实现速度?无论如何,我通过 JNI 和 NDK 在 Java 中使用了 OpenCV(C++ 实现)。我的应用程序的核心是图像处理,处理速度非常符合我的兴趣(几乎是实时的)。一切都是用 C++ 编写的,因为我有我的成像系统的桌面和移动实现。
在移动应用程序(适用于 android)中,我的成像系统嵌入在 java 应用程序中。从这里,我看到处理分为两部分:图像采集(通过设备相机)和图像处理(通过 OpenCV)。图像采集都是用java完成的。这项工作并非微不足道,因为我发现的主要问题是从相机(原生 YUV)获取 RGB 帧,将它们传递给 OpenCV,从 OpenCV 接收结果并将它们渲染到应用程序的表面视图。
连接相机和 OpenCV 确实是一件令人头疼的事情,主要取决于您的设备功能和您的 SDK 版本。获取图像后,处理相对轻松。我所有的系统之前都在我的 PC 上调试过,我确切地知道会发生什么。所有 OpenCV 函数的行为都应有尽有,所以我对这部分几乎没有任何问题。
我也花了很多时间在 C++ 上工作,所以这是决定选择哪种实现的一个因素。现在,该应用程序几乎已设置完毕。我可以添加新功能并在我的 PC 中进行测试,并很快更新移动端口。
【讨论】:
OpenCV Java API 是在 Android 中使用 OpenCV 的标准方式。它基本上是 C++ API 之上的 Java 层,其中每个 OpenCV Java 函数都通过 JNI (Java Native Interface) 调用其 C++ 等效函数。
进行 JNI 调用会产生少量开销,从而在使用 Java API 时增加 OpenCV 函数的执行时间。如果您的图像处理管道对 OpenCV 函数进行了大量调用(假设 N 次调用),那么 JNI 调用开销将影响您的管道 N 倍,这会减慢您的总计算时间。
另一种方法是在 C++ 中实现整个图像处理管道,并从 Java 中调用该 C++ 代码,从而将开销减少到仅一次 JNI 调用。
OpenCV C++ 专业人士:
OpenCV Java 专家:
【讨论】: