【OpenCV4Android學習二】 基於Android Studio的OpenCV簡單使用

一. 準備工作

    參考鏈接: 【OpenCV4Android學習一】 Android Studio配置OpenCV(最新版)

二. UI界面的設計

1. 複製lena.jpg圖片放到下圖目錄中

2. 將activity_main.xml切換到Design模式,分別向右邊界面拖放ButtonImageView (在下圖界面選擇lena.jpg圖片即可)

最終activity_main.xml的代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/gray_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_marginStart="43dp"
        android:text="灰度"
        tools:layout_editor_absoluteX="161dp"
        tools:layout_editor_absoluteY="38dp" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginTop="54dp"
        app:srcCompat="@drawable/lena"
        tools:layout_editor_absoluteX="0dp"
        tools:layout_editor_absoluteY="86dp" />

</RelativeLayout>

三. JNI靜態(static)加載OpenCV

1. 首先將libs目錄下的庫複製到(新建的)jniLibs

2. 在MainActivity.java中添加

// 靜態加載OpenCV庫並初始化
   private void staticLoadCVLibraries() {
       boolean load = OpenCVLoader.initDebug();
       if(load) {
           Log.i("CV", "Open CV Libraries loaded...");
       }
   }

3. 在app\build.gradle文件添加

sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

完整代碼如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.cameratutorial2"
        minSdkVersion 27
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        externalNativeBuild {
            cmake {
                cppFlags "-std=c++11"
            }
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ['src/main/jniLibs']
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
            version "3.10.2"
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation project(path: ':openCVLibrary341')
}

四. 使用OpenCV處理圖像

MainActivity.java文件完整代碼如下:

package com.example.cameratutorial2;

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.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button grayBtn = findViewById(R.id.gray_btn);
        grayBtn.setOnClickListener(this);

        staticLoadCVLibraries();
    }

    // 靜態加載OpenCV庫並初始化
    private void staticLoadCVLibraries() {
        boolean load = OpenCVLoader.initDebug();
        if(load) {
            Log.i("CV", "Open CV Libraries loaded...");
        }
    }


    @Override
    public void onClick(View view) {
        convert2Gray();
    }

    private void convert2Gray() {
        Mat src = new Mat();
        Mat temp = new Mat();
        Mat dst = new Mat();

        Bitmap image = BitmapFactory.decodeResource(this.getResources(), R.drawable.lena);
        Utils.bitmapToMat(image, src);
        Imgproc.cvtColor(src, temp, Imgproc.COLOR_RGB2BGR);
        Log.i("CV", "image type:" + (temp.type() == CvType.CV_8UC3));
        Imgproc.cvtColor(temp, dst, Imgproc.COLOR_BGR2GRAY);

        Utils.matToBitmap(dst, image);
        ImageView imageView = findViewById(R.id.imageView);
        imageView.setImageBitmap(image);

        // release memory
        src.release();
        temp.release();
        dst.release();
    }

}

五. 運行結果

點擊灰度按鈕轉爲灰度圖!!!


參考鏈接: Native OpenCV with Android Studio

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章