我提到了一些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()); } }正如您想要的一步一步,我将从头开始创建一个SampleOpenCV项目,并建议在新项目中执行以下步骤,一旦开始工作,您可以尝试将更改迁移到主项目.
>从Opencv.org下载适用于Android的OpenCV软件包[Direct Download Link V3.1]
>将zip解压缩到您选择的位置,在Android Studio中打开SampleOpenCV项目,然后在File – >中打开.新 – >导入模块,将打开一个新的弹出窗口进入模块路径,选择{unzipped_opencv} / sdk / java,这将在SampleOpenCV下创建一个OpenCVLibrary310目录.
>现在打开SampleOpenCV / OpenCVLibrary310 / build.gradle并从SampleOpenCV / app / build.gradle复制以下字段:
> compileSdkVersion
> buildToolsVersion
> minSdkVersion
> targetSdkVersion
>现在右键单击SampleOpenCV项目并单击Open Module Settings,查找Modules>>应用程序并选择依赖项
>单击弹出窗口中右上方的符号,然后选择3 Module Dependency.现在选择OpencvLibrary310.关闭弹出窗口,让gradle同步.
>将libs文件夹{unzipped_opencv} / sdk / native / libs复制到app / src / main下的Android Studio,并将其重命名为jniLibs(请注意这里的情况).
>你完成了.
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需要一些时间,具体取决于手机.因此,如果你加载uisng initDebug(),那么它将在主线程中执行,这可能会阻止UI一段时间.因此建议在后台加载OpenCV,这可以使用initAsync()实现
更新的答案
如果您已完成所有步骤并获得java.lang.UnsatisfiedLinkError,可能您缺少jniLibs或者您没有正确实现步骤6.
在您的应用级转换中添加此代码:
andriod{ sourceSets.main { jniLibs.srcDirs = ['libs'] } }
在graddle sync之后,jniLibs会像这样显示出来