Android Studio——配置OpenCV的方法及灰度化demo范例

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棉花糖版本)


到这里就结束了本次的讲解,希望对大家的学习带来帮助~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值