An unique Monkey

Be what you wanted to be

Android Studio + Opencv 配置教程

Android Studio + Opencv

晚上能找到很多Eclipse + Opencv的教程,可是对于Android Studio + Opencv的资料却比较少,而且写的都比较简单,为了让新人少一点掉到坑里,特意整理一下AS+opencv的方法哈

配置教程

  1. 下载Opencv的android版本SDK:opencv官网
  2. 新建一个工程起名为TestOpenCV
    step2
  3. 导入OpenCV的工程:点击File->New->Import Module,然后把要导入的opencv路径设为下载的OpenCV-android-sdk/sdk/java的路径,点击确定。
    step3

step3-2

  1. 在你左边的Project试图页面,可以看到新添加了一个OpenCVlibrary2411的文件夹(具体数字会根据你的opencv sdk版本而定)。
    step4
    修改OpenCVlibrary2411目录下的那个build.gradle文件,主要改这其中4项:

    android {
        compileSdkVersion 22
        buildToolsVersion "22.0.1"
    
    defaultConfig {
        minSdkVersion 15
        targetSdkVersion 22
        }
    buildTypes {
        ......
        }
    }
    

    其中的compileSdkVersion,buildToolsVersion,minSdkVersion,targetSdkVersion四项可以参考app/build.gradle设为一模一样的

  2. 在左边的project视图里面右键点击Open Modeule Setting,然后点击Dependencies标签页,点击右上角的+号图标,选择Module dependency,选择openCVLibrary2411
    step5
  3. 将下载的opencv SDK库里面的OpenCV-android-sdk/sdk/native下面的libs文件夹拷贝到TestOpenCV/app/src/main下面,并将这个libs文件夹改名为jniLibs
    到这里所有OpenCV的配置就完成了!接下来是用OpenCV的示例代码。

android studio + opencv示例代码

还是接上面的工程

  1. 修改app/src/res/layout/activity_main.xml的布局文件

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" />
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="test"
        android:id="@+id/button"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
    

    就是添加一个ImageView和一个Button的控件(注意他们的id号,等下要与MainActivityt.java文件里面的id号对应)

  2. 在TestOpenCV\app\src\main\res\drawable路径下面放上一张lena.png的图片
    step7

  3. 修改MainActivity的代码:

    package com.brucehou.testopencv;
    
    import android.support.v7.app.ActionBarActivity;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.os.Bundle;
    import android.app.Activity;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Bitmap.Config;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    
    import com.brucehou.testopencv.R;
    
    import org.opencv.android.Utils;
    import org.opencv.core.Mat;
    import org.opencv.imgproc.Imgproc;
    public class MainActivity extends Activity implements OnClickListener{
    
        private Button btnProc;
        private ImageView imageView;
        private Bitmap bmp;
    
        static{ System.loadLibrary("opencv_java"); }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            imageView = (ImageView) findViewById(R.id.imageView);
            bmp = BitmapFactory.decodeResource(getResources(), R.drawable.lena);
            imageView.setImageBitmap(bmp);
            btnProc = (Button) findViewById(R.id.button);
            btnProc.setOnClickListener(this);
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.menu_main, menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
    
            int id = item.getItemId();
    
        //noinspection SimplifiableIfStatement
            if (id == R.id.action_settings) {
            return true;
            }
    
            return super.onOptionsItemSelected(item);
        }
    
        @Override
        public void onClick(View v) {
            //test opencv
            Mat rgbMat = new Mat();
            Mat grayMat = new Mat();
            Utils.bitmapToMat(bmp, rgbMat);
            Imgproc.cvtColor(rgbMat, grayMat, Imgproc.COLOR_RGB2GRAY);
            Bitmap grayBmp = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Config.RGB_565);
            Utils.matToBitmap(grayMat, grayBmp);
            imageView.setImageBitmap(grayBmp);
    
        }
    

    }
    编译、run就可以了
    app1
    app2

其中有几点要注意的:
一定要记得动态载入opencv的so:
static{ System.loadLibrary(“opencv_java”); }
比较容易坑人的一点是OpenCV sdk中的sample都是静态载入:这就需要你安装Opencv Manager,在android5.0上还会有崩溃的情况。。。

HouXin

A designer, developer and entrepreneur. Spends his time travelling the world with a bag of kites. Likes journalism and publishing platforms.

Comments

<% if(config.disqus_shortname) { %>
<% } %>