异步初始化
使用异步初始化是应用程序开发的推荐方法。它使用 OpenCV Manager 访问外部安装在目标系统中的 OpenCV 库。
实现异步初始化的代码片段:
public class MainActivity extends Activity implements CvCameraViewListener2 {
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch(status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG,"OpenCV Manager Connected");
//from now onwards, you can use OpenCV API
Mat m = new Mat(5, 10, CvType.CV_8UC1, new Scalar(0));
break;
case LoaderCallbackInterface.INIT_FAILED:
Log.i(TAG,"Init Failed");
break;
case LoaderCallbackInterface.INSTALL_CANCELED:
Log.i(TAG,"Install Cancelled");
break;
case LoaderCallbackInterface.INCOMPATIBLE_MANAGER_VERSION:
Log.i(TAG,"Incompatible Version");
break;
case LoaderCallbackInterface.MARKET_ERROR:
Log.i(TAG,"Market Error");
break;
default:
Log.i(TAG,"OpenCV Manager Install");
super.onManagerConnected(status);
break;
}
}
};
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallback);
}
...
}
在这种情况下,我们的应用程序以异步方式与 OpenCV Manager 一起使用。初始化完成后,将在 UI 线程中调用 OnManagerConnected
回调。
请注意,在调用此回调之前,不允许使用 OpenCV 调用或加载依赖于 OpenCV 的本机库。在 OpenCV 初始化成功后,加载你自己的依赖 OpenCV 的本机库。
默认的 BaseLoaderCallback
实现将应用程序上下文视为 Activity
,并在初始化失败时调用 Activity.finish()
方法退出。要覆盖此行为,你需要覆盖 BaseLoaderCallback
类的 finish()
方法并实现自己的终结方法。
OpenCV 经理
OpenCV Manager 是一项 Android 服务,旨在管理最终用户设备上的 OpenCV 库二进制文件。它允许在同一设备上的应用程序之间共享 OpenCV 动态库。
经理提供以下好处:
- 内存使用量减少(约 40MB)。所有应用程序都使用来自服务的相同二进制文件,并且不会将本机库保留在自身内部。
- 针对所有受支持平台的硬件特定优化。
- 受信任的 OpenCV 库源。所有包含 OpenCV 的软件包都在 Google Play 市场上发布。
- 定期更新和错误修复。
唯一的缺点是提示用户下载和额外的应用程序,因此用户体验略有下降。
更多信息: Android OpenCV Manager
更新于 2016 年 10 月 18 日:
在 Play 商店中分发的 OpenCV Manager 版本中有一个错误 (更新时间为 21/09/15)。
它仅影响 OpenCV 3.1.0 版本。当你运行一些 OpenCV 函数时,你会收到SIGSEGV
错误。随 Android SDK 一起发布的版本运行正常(OpenCV-android-sdk/apk/OpenCV_3.1.0_Manager_3.10_{platform}.apk
)。它可以从 OpenCV 网站下载。
更多信息: 问题#6247 。