Android Studio 2.2 + OpenCV3.4.1_4_Android_Sdk环境配置
准备文件
首先需要准备一下文件:
1、 opencv-3.4.1-android-sdk.zip,可以去OpenCV官网下载,如下图,选择Android Pack
2、 已经在win7系统上安装好Android Studio2.2、Java JDK1.8 和JRE 1.8。
进行安装
第一步:解压opencv-3.4.1-android-sdk.zip
将下载的opencv-3.4.1-android-sdk.zip解压到目录G:\OpenCV-android-sdk下,目录结构如下图
sdk: 即是我们开发opencv所需要的类库,包括Java和C++,如下图
samples: 存放着若干opencv应用示例(包括人脸检测等),可为我们进行android下的opencv开发提供参考,如下图
注意:要在手机上安装这些apk应用文件,首先要安装OpenCV3.4.1 Manager package,在apk目录下。(华为mate9是64位的,所以选择安装OpenCV_3.4.1_Manager_3.41_arm64-v8a.apk)
apk: 存放着对应于各内核版本的OpenCV应用安装包,如下图
第二步,配置Android Studio
2.1打开Android Studio,新建一个工程,命名为OpencvTest,一直点击Next,最后一步点击finish,如下图
完成之后会出现一些错误,此时,将app目录下build.gradle文件的内容,如图2.1处的两个地方修改成24和compile 'com.android.support:appcompat-v7:24.2.1',点击右上角Sync Now即可消除错误。
图2.1 app目录下build.gradle文件的内容
2.2选择File->New->Import Moudle,然后Source directory:选择G:\OpenCV-android-sdk\sdk\java,选择OK,选择Finish,如下图所示
完成后,编译器会重新编译gradle,然后会出现一些错误,此时打开OpenCVLibrary341目录下的build.gradle,将里面
1)compileSdkVersion
2)buildToolsVersion
3)minSdkVersion
4)targetSdkVersion
将上面四个的内容与app文件夹下的build.gradle中信息相一致,然后点击右上角Try again,此时错误小时。如下图
2.3打开File->Project Structure,选择左侧的app,然后选择里面的Dependencies,点击+号,选择第三个Moudle dependency,选择
2.4右键点击Android Studio的App目录,选择New->Folder->JNI Folder,进入New Android Component窗口,点击change Folder location,在New Folder location中填写src/main/jniLibs,然后点击Finish。这样我们就创建了一个JNILibs的目录。
2.5 进入电脑的G:\OpenCV-android-sdk\sdk\native\libs目录下,复制全部文件夹(这些事CPU架构的文件夹),拷贝到Android Studio中我们刚刚建立的文件夹中。如下图所示:
完了之后,我们会看到jniLibs目录下会有刚刚我们复制的文件夹。这样,我们就把这些CPU架构文件导入到jniLibs文件夹内了。
至此,我们已经完全配置好Android Studio for OpenCV的开发环境了。
第三步,测试OpenCV
3.1我们在MainActivity.java中的public class MainActivity extends AppCompatActivity函数中添加以下代码:
这段代码表示,如果OpenCV加载成功,则在logcat日志中显示OpenCV successfully loaded.否则,显示OpenCV not loaded.
3.2在Android Studio下方选中Android Monitor,然后在Android Monitor窗口中右上角选择Edit Filter Configuration,出现Create New logcat Filter,内容填写如下图所示:
3.3最后,先运行一个Android模拟器,然后点击Run app按钮,即可显示出下图内容
第四步,图片灰度化测试程序
4.1下载一张图片(不要太大,300x300即可),复制粘贴到res/drawable目录下,如图:
4.2修改MainActivity.java中的代码:
package com.example.cvlab.opencvtest;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
// static{
// if(!OpenCVLoader.initDebug()){
// //handle initialization error
// }
// else{
// System.loadLibrary("my_jni_lib1");
// System.loadLibrary("my_jni_lib2");
// }
// }
private Button btn;
private ImageView img;
private Bitmap srcBitmap;
private Bitmap grayBitmap;
private static boolean flag = true;
private static boolean isFirst = true;
private static final String TAG = "gao_chun";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_opencv);
img = (ImageView)findViewById(R.id.img);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new ProcessClickListener());
}
@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);
}
}
//OpenCV库加载并初始化成功后的回调函数
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, "成功加载");
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
break;
}
}
};
public void procSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img1);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
Log.i(TAG, "procSrc2Gray sucess...");
}
public class ProcessClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(isFirst){
procSrc2Gray();
isFirst = false;
}
if(flag){
img.setImageBitmap(grayBitmap);
btn.setText("查看原图");
flag = false;
}else{
img.setImageBitmap(srcBitmap);
btn.setText("灰度化");
flag = true;
}
}
}
}
4.3创建一个activity_opencv.xml,内容为:
4.4打开一个安卓模拟器,点击Run app按钮,如果出现问题:没有找到OpenCV Manager,需要安装OpenCV Manager。
解决办法: 采用静态初始化的方法,将MainActivity.java中的onResume()函数替换。
将代码
protected void onResume() {
super.onResume();
//load OpenCV engine and init OpenCV library
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, getApplicationContext(), mLoaderCallback);
Log.i(TAG, "onResume sucess load OpenCV...");
}
替换为:
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);
}
}
重新Run app,即可解决问题。演示效果如图: