一、OpenCV 包下载
下载链接:OpenCV。选择Android pack下载。然后解压。我下载的是最新版本3.4.0。
二、导入OpenCV
第一步
新建一个android application 项目OpenCVTest。
第二步
选择File—>New—>Import Module…
然后路径选择解压目录—>opencv-3.4.0-android-sdk—>OpenCV-android-sdk—>sdk—>java。因为我已经导入过了,所以提醒项目中已经存在一个同名的module。
第三步
修改OpenCVLibrary340的build.gradle,使其和OpenCVTest的build.gradle对应项一致。可以在OpenCVTest的工程目录下找到OpenCVLibrary340的build.gradle文件。重新clean一下项目。
三、将OpenCV应用到自己的项目
第一步
点击File-Project Structure会出现下图:Modules下边找你新建的android项目后点击Dependencies。点击右边的+ 号,选择Module dependcy,选择openCVLibrary340,导入。
第二步
设计一个简单的UI界面,做一张图片的灰度处理。
Layout文件:
<?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:paddingBottom="0dp"
android:paddingLeft="0dp"
android:paddingRight="0dp"
android:paddingTop="0dp"
tools:context="com.example.dx.opencvtest.MainActivity">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="原图"
android:id="@+id/textView" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView_before"
android:src="@drawable/duling"
android:scaleType="fitXY" />
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="3dp"
android:background="@color/material_grey_900"></LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="灰度化"
android:id="@+id/textView_togray" />
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/imageView_after" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
MainActivity.java文件:
package com.example.dx.opencvtest;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
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 implements View.OnClickListener{
ImageView img_after;
TextView text_togray;
Bitmap srcBitmap;
Bitmap grayBitmap;
private static boolean flag = true;
//private static boolean isFirst = true;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_after=(ImageView)findViewById(R.id.imageView_after);
text_togray=(TextView)findViewById(R.id.textView_togray);
text_togray.setOnClickListener(this);
}
//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, "成功加载");
Toast toast = Toast.makeText(getApplicationContext(),
"成功加载!", Toast.LENGTH_LONG);
toast.setGravity(Gravity.CENTER, 0, 0);
toast.show();
break;
default:
super.onManagerConnected(status);
Log.i(TAG, "加载失败");
Toast toast1 = Toast.makeText(getApplicationContext(),
"加载失败!", Toast.LENGTH_LONG);
toast1.setGravity(Gravity.CENTER, 0, 0);
toast1.show();
break;
}
}
};
public void procSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.duling);
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...");
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.textView_togray:
procSrc2Gray();
img_after.setImageBitmap(grayBitmap) ;
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);
}
}
}
编译成功以后,将.apk文件发到手机上安装,打开,提示要安装opencv manager的apk,但是你不可能开发一个APP以后还要别人必须安装这个APP才能运行。所以将opencv manager拼接到你的项目中,具体方法如下:
四、拼接opencv manager
第一步
把OpenCV sdk for Android文件下F:\OpenCV-android-sdk\sdk\native下的libs文件夹拷贝到你的安卓项目下,即自己的项目\src\main下面,并且将libs改名为:jniLibs。
第二步
将OpenCV-android-sdk\samples\image-manipulations\res\layout下的xml文件拷贝到自己的项目\src\main\res下面
第三步
将OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations下的java文件拷到自己的项目\src\main\java\你MainActivity所在的包名,即和MainActivity同级目录
至此,我的项目目录如下所示:
可以发现,我的jniLibs下面只有一个文件夹。因为我把其他的给删掉了,保留了一个适合自己手机CPU的lib,如果都添加进来的话,apk会有70多M,非常大,这里剪切一下,可减少包的体积,不过适配性能会有所降低。调试已经足够了。
第四步
修改项目的Manifest.xml。因为新添加了Activity,这个Activity用到了相机权限等,所以要注册权限。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.dx.opencvtest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ImageManipulationsActivity"
android:label="MyTest"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation"></activity>
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front.autofocus"
android:required="false" />
</manifest>
五、实现效果
华为荣耀8测试通过。项目链接:OpenCVTest 提取密码:vdp0