嵌入式技术william hill官网
直播中

高增华

9年用户 542经验值
擅长:嵌入式技术
私信 关注
[经验]

【MediaTek X20开发板试用体验】6.MTX20开发板Android Studio+Opencv310

Android下使用Opencv有三种方式:OpenCVManager、OpencvLibrary和JNI方式。第一种方法需要将Opencv的APK加载到系统中,这样的操作方式只能自己测试一下而已。
第三种方法则需要对Opencv比较熟悉。我们这里先来试试第二种方法。
步骤0:默认在windows下已经安装好了Android Studio2.2。
步骤1:下载android版本OpenCV的sdk,我这里下载OpenCV-3.1.0-android-sdk。下载 ,解压即可。
步骤2:使用Android Studio新建一个工程MyOpencv310,不支持NDK的工程。
MyOpencv310-01.png
MyOpencv310-02.png
将OpenCV-3.1.0-android-sdk加载到工程中。
MyOpencv310-10.png
MyOpencv310-11.png

修改MyOpencv310和openCVLibrary310目录下的build.gradle文件,对其中buildToolsVersion、compileSdkVwesion进行必要修改,以便编译过去。
MyOpencv310-121.png
MyOpencv310-131.png
MyOpencv310-132.png
MyOpencv310-142.png

步骤3:将OpenCV-3.1.0-android-sdk下的libs文件夹拷贝到MyOpencv310下的app目录下,并改名为opencv310_libs,将下面的代码添加到MyOpencv310下的build.gradle文件中。
  1. sourceSets {
  2.         main {
  3.           jniLibs.srcDirs=['F:\MediaTekX20\opencv-project\MyOpencv310\app\src\main\opencv310_libs']
  4.         }
  5.     }

步骤4:添加openCVLibrary310模块
MyOpencv310-143.png
步骤5:准备测试图片happyfish.jpg注意名字里面不能有大写字母
happyfish.jpg
步骤6:layout界面设计

  1. tiveLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:app="http://schemas.android.com/apk/res-auto"
  3.     xmlns:tools="http://schemas.android.com/tools"
  4.     android:id="@+id/activity_main"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     android:paddingBottom="@dimen/activity_vertical_margin"
  8.     android:paddingLeft="@dimen/activity_horizontal_margin"
  9.     android:paddingRight="@dimen/activity_horizontal_margin"
  10.     android:paddingTop="@dimen/activity_vertical_margin"
  11.     tools:context="com.example.administrator.myopencv310.MainActivity">

  12.    
  13.         android:layout_width="wrap_content"
  14.         android:layout_height="wrap_content"
  15.         android:text="Hello World! =0001=" />

  16.    
  17.         android:layout_width="wrap_content"
  18.         android:layout_height="wrap_content"
  19.         android:layout_alignParentBottom="true"
  20.         android:layout_alignParentEnd="true"
  21.         android:layout_marginEnd="75dp"
  22.         android:layout_marginBottom="163dp"
  23.         android:id="@+id/imageView217" />

  24.    
  25.         android:text="Button"
  26.         android:layout_width="wrap_content"
  27.         android:layout_height="wrap_content"
  28.         android:layout_alignParentBottom="true"
  29.         android:layout_alignParentEnd="true"
  30.         android:layout_marginEnd="44dp"
  31.         android:layout_marginBottom="46dp"
  32.         android:id="@+id/button217" />


步骤7:MainActivity.java代码
  1. package com.example.administrator.myopencv310;

  2. import android.graphics.Bitmap;
  3. import android.graphics.BitmapFactory;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.util.Log;
  7. import android.view.View;
  8. import android.widget.Button;
  9. import android.widget.ImageView;

  10. import org.opencv.android.BaseLoaderCallback;
  11. import org.opencv.android.LoaderCallbackInterface;
  12. import org.opencv.android.OpenCVLoader;
  13. import org.opencv.android.Utils;
  14. import org.opencv.core.Mat;
  15. import org.opencv.imgproc.Imgproc;

  16. public class MainActivity extends AppCompatActivity {
  17.     private static String TAG = "MyOpencv310";
  18.     static {
  19.         if (OpenCVLoader.initDebug()) {
  20.             Log.i(TAG, "OpenCV310 initialize success");
  21.         } else {
  22.             Log.i(TAG, "OpenCV310 initialize failed");
  23.         }
  24.     }
  25.         Button btnProcess;
  26.     Bitmap srcBitmap;
  27.     Bitmap grayBitmap;
  28.     ImageView imgHuaishi;
  29.     private static boolean flag = true;
  30.     //private static boolean isFirst = true;

  31.     //OpenCV库加载并初始化成功后的回调函数
  32.     private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {

  33.         @Override
  34.         public void onManagerConnected(int status) {
  35.             // TODO Auto-generated method stub
  36.             switch (status){
  37.                 case BaseLoaderCallback.SUCCESS:
  38.                     Log.i(TAG, "成功加载");
  39.                     break;
  40.                 default:
  41.                     super.onManagerConnected(status);
  42.                     Log.i(TAG, "加载失败");
  43.                     break;
  44.             }

  45.         }
  46.     };
  47.     @Override
  48.     protected void onCreate(Bundle savedInstanceState) {
  49.         super.onCreate(savedInstanceState);
  50.         setContentView(R.layout.activity_main);
  51.         initUI();
  52.         btnProcess.setOnClickListener(new ProcessClickListener());
  53.     }
  54.     public void initUI(){
  55.         btnProcess = (Button)findViewById(R.id.button217);
  56.         imgHuaishi = (ImageView)findViewById(R.id.imageView217);
  57.         Log.i(TAG, "initUI sucess...");

  58.     }

  59.     public void procSrc2Gray(){
  60.         Mat rgbMat = new Mat();
  61.         Mat grayMat = new Mat();
  62.         srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.happyfish);
  63.         grayBitmap = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Bitmap.Config.RGB_565);
  64.         Utils.bitmapToMat(srcBitmap, rgbMat);//convert original bitmap to Mat, R G B.
  65.         Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);//rgbMat to gray grayMat
  66.         Utils.matToBitmap(grayMat, grayBitmap); //convert mat to bitmap
  67.         Log.i(TAG, "procSrc2Gray sucess...");
  68.     }

  69.     private class ProcessClickListener implements View.OnClickListener {

  70.         @Override
  71.         public void onClick(View v) {
  72.             // TODO Auto-generated method stub
  73. //            if(isFirst)
  74. //            {
  75.             procSrc2Gray();
  76. //                isFirst = false;
  77. //            }
  78.             if(flag){
  79.                 imgHuaishi.setImageBitmap(grayBitmap);
  80.                 btnProcess.setText("查看原图");
  81.                 flag = false;
  82.             }
  83.             else{
  84.                 imgHuaishi.setImageBitmap(srcBitmap);
  85.                 btnProcess.setText("灰度化");
  86.                 flag = true;
  87.             }
  88.         }

  89.     }

  90.     @Override
  91.     public void onResume()
  92.     {
  93.         super.onResume();
  94.         if (!OpenCVLoader.initDebug()) {
  95.             Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
  96.             OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
  97.         } else {
  98.             Log.d(TAG, "OpenCV library found inside package. Using it!");
  99.             mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
  100.         }
  101.     }

  102. }

编译运行结果:
result-1.jpg
result-2.jpg

更多回帖

发帖
×
20
完善资料,
赚取积分