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

问题描述:

我正在使用OpenCV4Android版本2.4.10,并在三星Galayx GT-I9300上测试我的代码。我的问题是,我必须从Play商店下载Opencv管理器,以便我的opencv代码能够运行,否则应用程序无法启动。 我提到了一些postes“How to integrate OpenCV Manager in Android App”,知道如何在android上运行opncv代码,而无需下载OpenCV管理器 ,但不幸的是,只要未安装OpenCV管理器,该应用程序无法启动。如何在没有OpenCv管理器的情况下运行OpenCV代码

我试过follwoing

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管理器的情况下在android上运行opencv代码?

更新

使用initAsync的:

请你提供一个示例演示如何使用 “initAsync()” 中的应用程序的生产版本?因为我试图这样做,但当然我不能在静态块中使用它,因为“intiAsync”的签名如下所示:“OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10,this,mLoaderCallback);”我不能使用“this”关键字,也不是静态块

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

当你想一步一步的过程中回调“mLoaderCallback”的引用,所以我会从头开始创建SampleOpenCV项目启动,并会还建议在新项目中执行以下步骤,一旦开始工作,您可以尝试将更改迁移到主项目。

  1. 下载OpenCV的包为Android从Opencv.org [Direct Download Link V3.1]
  2. 拆开压缩到您选择的位置,在Android Studio中打开SampleOpenCV项目,然后文件 - >新建 - >导入模块,这会打开一个新的弹出窗口进入模块路径,选择{unzipped_opencv}/sdk/java,这将在SampleOpenCV下创建一个OpenCVLibrary310目录。
  3. 现在打开SampleOpenCV/OpenCVLibrary310/build.gradleSampleOpenCV/app/build.gradle复制以下字段:
    • compileSdkVersion
    • buildToolsVersion
    • 的minSdkVersion
    • targetSdkVersion
  4. SampleOpenCV项目现在右键单击,然后单击打开模块Srttings,寻找Modules >> app只选择依赖

enter image description here

  1. 点击在右上方+符号,在弹出窗口中,并选择3模块依赖 。现在选择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需要一些时间,具体取决于手机。所以如果你加载它,那么它会在主线程中执行,这可能会阻塞UI的一小部分时间。因此,建议加载在后台OpenCV的可使用实现initAsync()

开始=>
+0

谢谢您的回答和你的努力..我只是混淆生产版本和调试版本! ..regarding我正在开发包含opencv代码的应用程序是它的调试版本还是生产版本?请咨询 – user2121

+0

编辑... @ user2121 – ZdaR

+0

非常感谢您的详细答案..但请耐心等待,我仍然有一个问题,请......如你在更新的答案中提到的 - “所以建议加载OpenCV在后台可以使用initAsync()实现 - “为什么不总是使用”initAsync()“而不是”initDebug()“? – user2121

有GitHub上提供的示例代码,使用initAsync()方法,并解决了opencv的经理依赖的问题Example to integrate NDK and remove Opencv dependency