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

问题描述 投票:16回答:3

我正在使用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:

请你提供一个如何在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());
}
}
android opencv opencv4android
3个回答
31
投票

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

  1. Opencv.org [Direct Download Link V3.1]下载适用于Android的OpenCV软件包
  2. 将zip解压缩到您选择的位置,在Android Studio中打开SampleOpenCV项目,然后在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项目并单击Open Module Settings,查找Modules >> app并选择Dependencies

enter image description here

  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);
    }
}

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

更新的答案

如果你已完成所有步骤并获得initAsync(),可能你缺少java.lang.UnsatisfiedLinkError或者你没有正确实施第6步。

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

jniLibs

在gradle sync之后,jniLibs会像这样出现

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


4
投票

与我分享我的方式。

  1. 下载opencv sdk for android:enter image description here
  2. 解压opencv sdk
  3. 在您的项目(ex ADVisionProject)中,打开settings.gradle文件并在下面添加配置

--

https://opencv.org/releases.html

我的settings.gradle文件示例

def opencvsdk = '<path_to_opencv_android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. 在app / build.gradle中,将opencv模块添加到依赖项

--

include ':app'

def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
  1. 写一些代码进行测试。关于下面的代码,它将可绘制的图像读取到Mat并将颜色转换为灰色模式,将Mat转换为Bitmap并将Bitmap显示到ImageView中。

--

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

}
  1. 尝试构建apk并安装到Android设备。它不需要OpenCV经理。但我意识到apk大小相当大,初始大约80MB

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(); } } }

使用opencv-3.4.1-android-sdk和Android Studio 3.1.3进行测试

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


0
投票

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

enter image description here
© www.soinside.com 2019 - 2024. All rights reserved.