此示例的SDK版本为:3.4.12
一:导入OpenCV模块
选择File,New,Import Module…
然后此时会弹出如下窗口,并在Source directory内选择解压后的sdk包内java文件夹
可以看到我这里路径为解压后的文件夹/OpenCV-android-sdk/sdk/java。
接下来两部按照系统提示即可,无需做出变动。最后点击Finish即可
二:修改Gradle文件
完成第一步之后界面会变成如下图所示(可以看到Gradle提示报错):
打开下图内红色框内的两个gradle文件,先后顺序无所谓
注意openCVLibrary3412(就是第一步中Import Moudle自动命名生成的文件)的gradle文件,其内compileSdkversion,minSdkVersion,targetSdkVersion要与app的gradle这三个数值相同
修改完毕后更新Gradle,仍然会报错,不予理会
三:修改AndroidManifest.xml文件
上述步骤操作完毕后界面如下图所示:
先单击1内的内容,此时工作台会跳转到opencv的AndroidManifest.xml文件;然后直接删除2的内容。随后更新
四:加入依赖(Dependency)
选择File,Project Structure
按数字进行如下图所示步骤操作
勾选内容,单击OK等内容,在Aplly等操作
五:复制so文件
在app的main文件夹下创建名为jniLibs的文件夹
将sdk包内的sdk/native/libs内所有文件复制到上述新建文件夹下
(网络上有说仅复制so文件,其余不予理会,这里不用。因为此示例的sdk版本较高)
六:测试
加入如下内容:
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status){
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "Load OK.");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "Load Failed.");
break;
}
}
};
@Override
public void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
完整示例:
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button testButton;
private ImageView imageView;
private String TAG = "MainActivity";
private void initView(){
testButton = (Button) findViewById(R.id.button_test);
imageView = (ImageView) findViewById(R.id.test_image_view);
}
private void setListener(){
testButton.setOnClickListener(this);
}
private void testOpenCV(){
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.scene);
Mat src = new Mat();
Mat dst = new Mat();
Utils.bitmapToMat(bitmap, src);
Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
imageView.setImageBitmap(bitmap);
src.release();
dst.release();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setListener();
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
// TODO Auto-generated method stub
switch (status){
case BaseLoaderCallback.SUCCESS:
Log.i(TAG, "Load OK.");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "Load Failed.");
break;
}
}
};
@Override
public void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_test:
testOpenCV();
break;
default:
break;
}
}
}