Android Studio——配置OpenCV的方法及灰度化demo范例
前言:本人最近半年在做一个有关机器视觉的机器人项目,是用的安卓平台开发的,对android studio也是一个刚入门的客人,在这半年里也是全靠自学才变得熟练许多,为了大家少走些弯路才打算做这个文章。
准备工作
第一步:下载并安装Android Studio,这个可以自己去Android Studio 中文社区下载,还有SDK、NDK等,这里就不多说了,过程略。
第二步:官网下载OpenCV for Androidhttps: //opencv.org/releases.html
这是我的版本:
第三步:将OpenCV for Android压缩包解压,解压后的目录是这样的:
Android Studio 导入 OpenCV
1. 新建一个project,进入工作页面后点击File->New->Import Module如下图:
2.键入你解压OpenCV-android-sdk ->sdk->java的位置,直接拷贝,拷贝完毕后会出现Module name(我的因为已经导入过了所以会有感叹号)如下图:
3.然后点开File->Project Structure
4.选择Module中的app,选中Dependencies的右上角有一个绿色箭头,选择第三个选项并添加OpenCVLibrary2411
5.到这里为止呢OpenCV就算导入完成了,但是按照官方的说法就是还要在手机上下载OpenCV Manager,但考虑到我的机器人在需要识别一类的功能同时还要手动安装opencv manager的apk,实在是太费事了,所以在这里介绍一种方法省去这个麻烦。
解决方案:(参考https://jingyan.baidu.com/article/60ccbceb53533364cab197db.html)
1. 把OpenCV-android-sdk文件下H:\OpenCV-android-sdk\sdk\native下的libs文件夹拷贝到你的安卓项目下,即自己的项目\src\main下面,并且将libs改名为 jniLibs
2. 将OpenCV-android-sdk\samples\image-manipulations\res\layout下的xml文件拷贝到自己的项目\src\main\res\layout下面
3.将OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations下的java文件拷到自己的项目\src\main\java\你MainActivity所在的包名,即和MainActivity同级目录
4 .在AndroidManifest.xml中为刚才导入的java文件进行定义:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.a29637.opencv1029">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".ImageManipulationsActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
android:configChanges="keyboardHidden|orientation">
</activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<supports-screens android:resizeable="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:anyDensity="true"/>
</manifest>
好啦,到这里就结束了所有的导入步骤,就来做个测试吧~
activity_main.xml代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="灰度化" />"
</RelativeLayout>
MainActicity.java代码:
package com.example.a29637.opencv1029;
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.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 {
private Button btn;
private ImageView img;
private Bitmap srcBitmap;
private Bitmap grayBitmap;
private static boolean flag = true;
private static boolean ifFirst = true;
private static final String TAG = "MainActivity";
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
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);
img =(ImageView)findViewById(R.id.img);
img.setImageDrawable(getResources().getDrawable(R.drawable.android));
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new ProcessClickListener());
}
public void proSrc2Gray(){
Mat rgbMat = new Mat();
Mat grayMat = new Mat();
srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.android);
grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.RGB_565);
Utils.bitmapToMat(srcBitmap,rgbMat);
Imgproc.cvtColor(rgbMat,grayMat,Imgproc.COLOR_RGB2GRAY);
Utils.matToBitmap(grayMat,grayBitmap);
Log.i(TAG,"proSrc2Gray success...");
}
public class ProcessClickListener implements View.OnClickListener{
@Override
public void onClick(View v){
if(ifFirst){
proSrc2Gray();
ifFirst = false;
}
if(flag){
img.setImageBitmap(grayBitmap);
btn.setText("查看原图");
flag = false;
}else{
img.setImageBitmap(srcBitmap);
btn.setText("灰度化");
flag = true;
}
}
}
@Override
protected void onResume(){
super.onResume();
if(!OpenCVLoader.initDebug()){
Log.d(TAG,"Internal OpenCV libirary not found.Using OpenCV Manager for initialization" );
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_11, getApplicationContext(),mLoaderCallback);
}else{
Log.i(TAG, "OpenCV library found inside package.Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
}
然后就点开激动人心的测试环节:
(这是一个灰度化软件程序,API:23,安卓:6.0棉花糖版本)
到这里就结束了本次的讲解,希望对大家的学习带来帮助~~