我正在使用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());
}
}
正如您想要一步一步的程序,所以我将从头开始创建一个SampleOpenCV
项目,并建议在新项目中执行以下步骤,一旦它开始工作,您可以尝试将更改迁移到您的主项目。
SampleOpenCV
项目,然后在File - > New - > Import Module,这将打开一个新的弹出窗口进入模块路径,选择{unzipped_opencv}/sdk/java
,这将创建一个OpenCVLibrary310
SampleOpenCV
下的目录。SampleOpenCV/OpenCVLibrary310/build.gradle
并从SampleOpenCV/app/build.gradle
复制以下字段:
compileSdkVersion
buildToolsVersion
的minSdkVersion
targetSdkVersionSampleOpenCV
项目并单击Open Module Settings,查找Modules >> app
并选择DependenciesOpencvLibrary310
。关闭弹出窗口,让gradle同步。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需要一些时间,具体取决于手机。因此,如果您加载它,请使用qisxswpoi,然后它将在主线程中执行,这可能会阻止UI一段时间。因此建议在后台加载OpenCV,这可以使用initDebug()
实现
更新的答案
如果你已完成所有步骤并获得initAsync()
,可能你缺少java.lang.UnsatisfiedLinkError
或者你没有正确实施第6步。
在您的应用级别gradle中添加此代码:
jniLibs
在gradle sync之后,jniLibs会像这样出现
andriod{
sourceSets.main {
jniLibs.srcDirs = ['libs']
}
}
与我分享我的方式。
--
https://opencv.org/releases.html
我的settings.gradle文件示例
def opencvsdk = '<path_to_opencv_android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
--
include ':app'
def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
--
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
....
implementation project(':opencv')
}
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以获取更多选项