文|Seraph
软件版本:本文使用的Android Studio版本为3.0,OpenCV版本为2.4.13.6
-
下载OpenCV安卓版开发包,并解压;
如上所述的2.4.13 (Android pack)。如无效,请自行去官网下载想要版本。 -
打开菜单
File-New-Import Module
,选择Opecv android SDK路径,如下
SDK路径
-
打开菜单
File-Project Structure
,选择App-Dependencies
,点击+
,添加Module Dependency
,如下说是选择opencvLibrary24136
添加Module Dependency
-
换成
Project
工程视图,app-src-main
中的build.grable文件,如下:
工程build.grable
再找到opencvLibrary24136-src-main
中的build.grable文件,如下:
opencv的build.grable
将compileSdkVersion 和targetSdkVersion的值换成上图的26,miniSdkVersion值换成上图的15。(即使其与工程保持一致) -
上述步骤就已经把Opencv依赖库添加完了,然后修改如下测试代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:paddingTop="16dp"
android:paddingBottom="16dp"
tools:context="top.liushupeng.opencv0603.MainActivity">
<ImageView
android:id="@+id/img_2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
<Button
android:id="@+id/btn_gray_process"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/img_2"
android:layout_centerHorizontal="true"
android:text="灰度化"/>
</RelativeLayout>
MainActivity.java
ackage top.liushupeng.opencvtest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
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;
public class MainActivity extends AppCompatActivity {
Button btnProcess;
Bitmap srcBitmap;
Bitmap grayBitmap;
ImageView imgHuaishi;
private static boolean flag = true;
//private static boolean isFirst = true;
private static final String TAG = "MainActivity";
//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;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
btnProcess.setOnClickListener(new ProcessClickListener());
}
public void initUI() {
btnProcess = (Button) findViewById(R.id.btn_gray_process);
imgHuaishi = (ImageView) findViewById(R.id.img_2);
Log.i(TAG, "initUI sucess...");
}
public void procSrc2Gray() {
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.img_2);
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...");
}
private class ProcessClickListener implements View.OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
procSrc2Gray();
if (flag) {
imgHuaishi.setImageBitmap(grayBitmap);
btnProcess.setText("查看原图");
flag = false;
} else {
imgHuaishi.setImageBitmap(srcBitmap);
btnProcess.setText("灰度化");
flag = true;
}
}
}
@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_2_4_13, this, mLoaderCallback);
}
else{
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
}
-
在工程res路径下放置img_2.png图片(彩色图片)
-
运行程序,会发现apk会弹出如下提示:
安装OpenCV Manager提示
意思是需要安装OpenCV Manager,但这种对于用户来说,体验很差。
所以一般使用静态加载编译时将库写入APK中,不过会增加APK大约0.5M左右。 -
拷贝
OpenCV-android-sdk/sdk/native
下的libs到(工程名)/app/main
目录下,并修改文件夹名为jniLibs -
重新运行程序,则AVD显示如下:
界面
点击中间按钮,便能看见图片灰度化效果。
网友评论