一. 準備工作
參考鏈接: 【OpenCV4Android學習一】 Android Studio配置OpenCV(最新版)
二. UI界面的設計
1. 複製lena.jpg圖片放到下圖目錄中
2. 將activity_main.xml切換到Design模式,分別向右邊界面拖放Button和ImageView (在下圖界面選擇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