1. 程式人生 > >在Android Studio上搭建OpenCV 開發環境

在Android Studio上搭建OpenCV 開發環境

        這裡預設你已經成功安裝了Android Studio IDE;我這裡使用的AS版本是3.0.1;截止目前,AS穩定版本已經升級至3.2.1,至於版本間的區別,這裡不多做區分和說明。如果對於AS的下載和安裝有問題也可以參加我的關於AS介紹的部落格。下面就來看看如何搭建OpenCV的開發環境。

 

1,環境搭建

第一步:下載SDK

下載地址

點選下圖中的紅色方框中SDK,也即最新發布的openCV3.4.4

 

第二步:解壓與分析

下載完成解壓之後的目錄如下:

其中:

  • apk資料夾中儲存的是對應不同cpu的代理(manager)應用
  • samples中儲存的是官方給出Demo原始碼示例,但是遺憾的是這裡都是Eclipse專案
  • sdk中儲存的就是我們接下來搭建環境需要使用的一些材料

下面就來簡單看一下sdk中究竟有什麼東西:

  • etc中存放的是訓練好的級聯分類器資料(HAAR和LBP)
  • java中存放的是我們接下來使用的Android SDK
  • native中存放基於c/c++編譯好的本地庫檔案,JNI層開發需要的標頭檔案和CMake檔案

 

第三步:匯入SDK

(1)建立一個新的工程,點選“File”-->"New"-->"Import Module",然後選擇上圖中的java資料夾點選OK“”即可;待工程構建完成之後,專案結構如下圖所示:

 

(2)把native資料夾中libs目錄下面的所以檔案copy到我們專案的libs目錄中

(3)到目前為止,我們的工作也快結束了,但是還需要修改一下gradle檔案

  • 在上圖中的build.gradle(Module:app)中最外層新增如下程式碼:
task nativeLibsToJar(type: Jar, description: 'create a jar archive of the native libs') {
    destinationDir file("$buildDir/native-libs")
    baseName 'native-libs'
    from fileTree(dir: 'libs', include: '**/*.so')
    into 'lib/'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn(nativeLibsToJar)
}
  • 在我們匯入上面Module的時候,上一步的gradle檔案還會新增如下依賴(自動新增):
 implementation project(':openCVLibrary344')
  • 此外,我們還需要在依賴中載入libs目錄的檔案
 implementation fileTree(include: ['*.jar'], dir: 'libs')
 implementation fileTree(dir: "$buildDir/native-libs", include: 'native-libs.jar')
 implementation fileTree(dir: 'libs', include: ['*.jar'])

這樣,整個環境就算搭建完成了,到後面NDK相關開發的時候,還會去介紹相關的環境搭建,這裡就先不多說了,還是來看看一下環境是否搭建成功了吧。

 

2,校驗

還是使用一個別人舉的例子也是一個很簡單的API呼叫--圖片的灰度化;先看一下效果示意圖:

 

佈局activity_test.xml程式碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="com.hfut.operationopencvmain.TestActivity">

    <LinearLayout
        android:gravity="center_horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <ImageView
        android:id="@+id/test_image"
        android:layout_width="400dp"
        android:layout_height="400dp" />
    </LinearLayout>

    <Button
        android:layout_marginTop="10dp"
        android:text="灰度圖片"
        android:onClick="grayImage"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

TestActivity.java程式碼:

package com.hfut.operationopencvmain;

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.ImageView;

import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;

/**
 * @author why
 * @date 2018-11-26 23:00:06
 */
public class TestActivity extends AppCompatActivity {

    private ImageView imageView;
    private static final String TAG = "TestActivity";


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

        boolean status = OpenCVLoader.initDebug();
        if (status) {
            Log.e(TAG, "onCreate: Succese");
        } else {
            Log.e(TAG, "onCreate: Failed");
        }
        imageView = findViewById(R.id.test_image);
        imageView.setImageDrawable(getResources().getDrawable(R.drawable.test));

    }

    public void grayImage(View view) {
        Mat src = new Mat();
        Mat dst = new Mat();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test);
        Utils.bitmapToMat(bitmap, src);
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
        Utils.matToBitmap(dst, bitmap);
        imageView.setImageBitmap(bitmap);
        //如果不用,直接釋放資源
        //src.release();
        //dst.release();
    }
}

好了,到這裡就基本介紹完了,整個的環境搭建還是很簡單的;但是如果你嘗試著把下載下來的samples裡面的Eclipse專案移植到AS中並且能成功的在裝置上執行起來還是要費一點功夫的,這個在後面會介紹其中的一些坑。

 

下一篇:關於OpenCV的主要資訊基本介紹