android - 如何在没有 OpenCv 管理器的情况下运行 OpenCV 代码

标签 android opencv opencv4android

我使用的是 OpenCV4Android 版本 2.4.10,并在三星 Galayx GT-I9300 上测试我的代码。我遇到的问题是,我必须从 Play 商店下载 Opencv Manager 才能运行我的 opencv 代码,否则应用程序将无法启动。 我引用了一些帖子“如图所示How to integrate OpenCV Manager in Android App”,以了解如何在无需下载 OpenCV 管理器的情况下在 android 上运行 opncv 代码 但不幸的是,只要没有安装 OpenCV Manager,应用程序就不会启动。

我尝试了以下方法

static {
    if (!OpenCVLoader.initDebug()) {
        // Handle initialization error
    }
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");
                mOpenCvCameraView.enableView();
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};
...
...
...

@Override
public void onResume() {
    super.onResume();
    Log.w(TAG, "onResume");

    if (!OpenCVLoader.initDebug()) {
        Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, getActivity(), mLoaderCallback);
    } else {
        Log.d(TAG, "OpenCV library found inside package. Using it!");
        mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

但这并没有解决问题。 请让我知道如何在不下载 Opencv Manager 的情况下在 android 上运行 opencv 代码?

更新:

使用 initAsync:

您能否举例说明如何在应用程序的生产版本中使用“initAsync()”?因为我试图这样做,但我当然不能在静态 block 中使用它,因为“intiAsync”的签名如下“OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback);”我不能在静态 block 中使用“this”关键字,也不能引用回调“mLoaderCallback”

public class MainActivity extends AppCompatActivity {

static {
    //OpenCVLoader.initDebug();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); //this keyword and "mLoaderCallback" are not defined in this scope
}

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS: {
                Log.i("MainActivity", "OpenCV loaded successfully");
            }
            break;
            default: {
                super.onManagerConnected(status);
            }
            break;
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Mat m = new Mat(100, 100, CvType.CV_8UC4);
    Log.d("MainActivity", "m.width()" + m.width());
    Log.d("MainActivity", "m.height()" + m.height());
}
}

最佳答案

如您所愿,我将从创建 SampleOpenCV 开始从头开始项目,并且还建议在一个新项目中执行以下步骤,一旦它开始工作,您可以尝试将更改迁移到您的主项目。

  1. Opencv.org 下载适用于 android 的 OpenCV 包[ Direct Download Link V3.1 ]
  2. 将 zip 解压到您选择的位置,打开 SampleOpenCV Android Studio 中的项目,然后 File -> New -> Import Module,这将打开一个新的弹出窗口以输入模块路径,选择 {unzipped_opencv}/sdk/java ,这将创建一个 OpenCVLibrary310 SampleOpenCV 下的目录.
  3. 现已开放SampleOpenCV/OpenCVLibrary310/build.gradle并从 SampleOpenCV/app/build.gradle 复制以下字段:
    • 编译SdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  4. 现在右击您的SampleOpenCV项目并单击打开模块设置,查找Modules >> app并选择依赖项

enter image description here

  1. 在弹出窗口中点击右上角的+符号,然后选择3 Module Dependency。现在选择OpencvLibrary310 .关闭弹出窗口并让 gradle 同步。

  2. 将 libs 文件夹 {unzipped_opencv}/sdk/native/libs 复制到 Android Studio 下的 app/src/main 并从它重命名为 jniLibs (注意这里的情况)。

  3. 你已经完成了。

public class MainActivity extends AppCompatActivity {
    static {
        OpenCVLoader.initDebug();
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Mat m = new Mat(100, 100, CvType.CV_8UC4);
    }
}

注意:OpenCVLoader.initDebug()必须仅用于调试目的,就像您在计算机上进行本地开发时一样。但是对于需要在 Play Store 上发布应用程序等的生产目的,您必须使用 OpenCVLoader.initAsync() .实际上初始化 OpenCVLoader 需要一些时间,具体取决于手机。所以如果你加载它 uisng initDebug() ,然后它将在主线程中执行,这可能会阻塞 UI 一小部分时间。因此建议在后台加载 OpenCV,这可以使用 initAsync() 来实现。

更新答案

如果您已完成所有步骤并获得 java.lang.UnsatisfiedLinkError ,可能你错过了jniLibs或者您没有正确执行第 6 步。

在您的应用级 graddle 中添加此代码:

 andriod{
        sourceSets.main {
                    jniLibs.srcDirs = ['libs'] 
        }
  }

graddle 同步后 jniLibs 会这样显示

enter image description here

关于android - 如何在没有 OpenCv 管理器的情况下运行 OpenCV 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40681578/

相关文章:

python - OpenCV Python中的手势

java - 加快 Firebase 存储下载

c++ - mxGetPr() 的返回值——等效循环

c++ - OpenCV 环境变量已更改

android - 如何使用 Android Studio 设置 OpenCV v3.4.0

android - 查找用于构建 OpenCV Android 原生库的 NDK 版本

android - medianBlur 在 opencv4android 中不起作用

android - 如何从sqlite数据库读取然后显示它然后在android中删除它?

Android 5(HTC) EACCES(权限被拒绝)

android - 有没有办法判断 Android MediaPlayer 当前是否正在播放歌曲?