如何在没有OpenCv Manager

时间:2016-11-18 16:12:46

标签: android opencv opencv4android

我正在使用OpenCV4Android版本2.4.10,我在三星Galayx GT-I9300上测试我的代码。我的问题是,我必须从Play商店下载Opencv Manager,以便我的opencv代码运行,否则App将无法启动。 我提到了一些postes"如图所示How to integrate OpenCV Manager in Android App"要知道如何在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);
    }
}

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

更新

使用initAsync

请您举例说明如何使用" initAsync()"在App的生产版本?因为我试图这样做但当然我不能在静态块中使用它,因为" intiAsync"如下" OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this,mLoaderCallback);"我不能使用"这个"关键字也不是对回调的引用" 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());
}
}

3 个答案:

答案 0 :(得分:31)

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

  1. Opencv.org [Direct Download Link V3.1]
  2. 下载适用于Android的OpenCV软件包
  3. 将zip解压缩到您选择的位置,在Android Studio中打开SampleOpenCV项目,然后文件 - >新 - >导入模块,将打开一个新的弹出窗口以输入模块路径,选择{unzipped_opencv}/sdk/java,这将在OpenCVLibrary310下创建一个SampleOpenCV目录。
  4. 现在打开SampleOpenCV/OpenCVLibrary310/build.gradle并从SampleOpenCV/app/build.gradle复制以下字段:
    • compileSdkVersion
    • buildToolsVersion
    • 的minSdkVersion
    • targetSdkVersion
  5. 现在右键单击您的SampleOpenCV项目,然后点击打开模块设置,查找Modules >> app并选择依赖关系
  6. enter image description here

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

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

    3. 你完成了。
    4. 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商店等发布应用程序的制作目的,您必须使用OpenCVLoader.initAsync()。实际上,初始化OpenCVLoader需要一些时间,具体取决于手机。因此,如果你加载它{unsng initDebug(),那么它将在主线程中执行,这可能会阻止UI一段时间。因此建议在后台加载OpenCV,这可以使用initAsync()

      来实现

      更新的答案

      如果您已完成所有步骤并获得java.lang.UnsatisfiedLinkError,则可能缺少jniLibs或您尚未正确实施第6步。

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

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

      同步后, jniLibs 将会显示如下

      enter image description here

答案 1 :(得分:4)

与我分享关于我的方式。

  1. 通过以下网址下载适用于Android的opencv sdk:https://opencv.org/releases.html
  2. 解压缩opencv sdk
  3. 在您的项目(例如ADVisionProject)中,打开settings.gradle文件并在下面添加配置

-

def opencvsdk = '<path_to_opencv_android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')

我的settings.gradle文件示例

include ':app'

def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. 在app / build.gradle中,将opencv模块添加到依赖项中

-

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
   ....
    implementation project(':opencv')

}
  1. 编写一些测试代码。关于以下代码,它将可绘制的图像读取到Mat并将颜色转换为灰度模式,将Mat转换为Bitmap并将Bitmap显示为ImageView。

-

import android.graphics.Bitmap;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;

import java.io.IOException;

public class MainActivity extends AppCompatActivity {

    static {
        OpenCVLoader.initDebug();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageView imageView = findViewById(R.id.activity_main_iv_result);
        try {
            Mat img = Utils.loadResource(this, R.drawable.eye);
            Mat gryimg =  new Mat(img.size(),CvType.CV_8U);
            Imgproc.cvtColor(img, gryimg, Imgproc.COLOR_RGB2GRAY);
            Bitmap bm = Bitmap.createBitmap(gryimg.cols(), gryimg.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(gryimg, bm);
            imageView.setImageBitmap(bm);
        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
  1. 尝试构建apk并安装到android设备。不需要OpenCV管理器。但是我意识到apk很大,最初约为80MB

enter image description here

在opencv-3.4.1-android-sdk和Android Studio 3.1.3中进行了测试

我们有一些方法可以将sdk集成到您的项目中。您应该阅读/sdk/build.gradle以获得更多选项

答案 2 :(得分:0)

加载本机库的正确方法是:

System.loadLibrary("opencv_java3");