如何在没有OpenCv Manager的情况下运行OpenCV代码

use*_*121 19 android opencv opencv4android

我正在使用OpenCV4Android版本2.4.10,我在三星Galayx GT-I9300上测试我的代码.我的问题是,我必须从Play商店下载Opencv Manager,以便我的opencv代码运行,否则App将无法启动.我提到了一些postes"如此处所示如何在Android应用程序中集成OpenCV管理器 ",以了解如何在Android上运行opncv代码而无需下载OpenCV管理器,但遗憾的是,只要未安装OpenCV Manager,App就无法启动.

我尝试了以下

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解决问题.请告诉我如何在不下载Opencv Manager的情况下在Android上运行opencv代码?

更新:

使用initAsync:

请你提供一个如何在App的生产版本中使用"initAsync()"的例子吗?因为我试图这样做但当然我不能在静态块中使用它,因为"intiAsync"的签名如下"OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this,mLoaderCallback);" 我不能使用"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());
}
}
Run Code Online (Sandbox Code Playgroud)

Zda*_*daR 33

正如您想要的一步一步程序,所以我将从头开始创建SampleOpenCV项目,并建议在新项目中执行以下步骤,一旦开始工作,您可以尝试将更改迁移到主项目.

  1. Opencv.org下载适用于Android的OpenCV软件包[ 直接下载链接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:
    • compileSdkVersion
    • buildToolsVersion
    • 的minSdkVersion
    • targetSdkVersion
  4. 现在右键单击您的SampleOpenCV项目,然后单击" 打开模块设置",查找Modules >> app并选择" 依赖项"

在此输入图像描述

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

  2. 将libs文件夹{unzipped_opencv}/sdk/native/libs复制到app/src/main下的Android Studio并从中重命名为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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:OpenCVLoader.initDebug()必须仅用于在计算机上本地开发时进行调试.但对于需要在Play商店等发布应用程序的生产目的,您必须使用OpenCVLoader.initAsync().实际上,初始化OpenCVLoader需要一些时间,具体取决于手机.因此,如果您加载它initDebug(),那么它将在主线程中执行,这可能会阻止UI一段时间.因此建议在后台加载OpenCV,这可以通过使用来实现initAsync()