OpenCV4.2.0 SDK下載及Android Java環境搭建

本文中,我們主要爲大家介紹以下內容:

  • OpenCV4Android SDK下載
  • Android項目中導入OpenCV Module
  • Android項目中剔除OpenCVManager apk的依賴
  • 使用OpenCV完成圖像灰度化

OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在LinuxWindowsAndroidMac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了PythonRubyMATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法(更多介紹參見百度百科)

簡單來說,OpenCV就是一個用於圖像處理及計算機視覺的跨平臺開源算法庫,我們可以利用OpenCV內部提供的算法進行圖像處理應用開發,或者從事計算機視覺相關方向的研發工作。

那麼如何在Android平臺使用OpenCV呢?我們一起來看下。

OpenCV4Android SDK

和大多數開源庫一樣,針對不同的平臺打包不同的SDK依賴庫,OpenCV也是一樣的。我們可以在其官網下載OpenCV4Android SDK,這是OpenCV Android平臺的依賴庫,其內部包含OpenCVAndroid平臺的demo項目代碼以及OpenCV 源碼文件。

首先打開OpenCV官網:OpenCV官網(https://opencv.org/)

進入官網後點擊右上角的release菜單,如下圖:
在這裏插入圖片描述
隨後在這個頁面我們就可以看到當前OpenCV發佈過的所有版本,每個版本內部都會列舉各個平臺的依賴包,我們選擇最新版本4.2.0中的Android下載4.2.0版本對應的Android平臺依賴包,如下圖:

在這裏插入圖片描述
下載完成後解壓,我們可以得到如下文件目錄:
在這裏插入圖片描述
其中各目錄包含的主要內容如下:

  • sdk:OpenCV源碼目錄,該目錄包含OpenCV java moduleOpenCV libs文件以及OpenCV C++源碼文件
  • samples:OpenCV Android 示例項目目錄

導入OpenCV4Android SDK

Android Studio內新建Android項目(PS:記得勾選C++支持),構建成功後,切換到Project視圖,如下所示:
在這裏插入圖片描述
隨後在項目名稱(圖中OpenCV01處)右鍵依次選擇new->Module,選擇完成後彈出下圖界面:
在這裏插入圖片描述
向下滾動選擇import eclipse adt project,隨後點擊next,在接下來的窗口中選在OpenCV_SDK_PATH/sdk/java,命名導入的Module名稱爲lib_opencv,如下圖所示:
在這裏插入圖片描述
點擊next,不做操作繼續點擊finish
在這裏插入圖片描述
(PS:上述步驟是通用的Module導入方式)

等待項目導入完成,切換到Android視圖,導入成功的項目結構如下圖所示:
在這裏插入圖片描述
從上圖可以看出,目前lib_opencv這個module處於不可用狀態,我們修改該modulebuild.gradle文件,如下圖所示:
在這裏插入圖片描述
在這裏我們修改了lib_opencv 的構建類型爲library,刪除了原始文件中包含的applicationidbuildtoolsversion信息,重新構建模塊即可發現該module已經處於可用狀態,隨後在app Module內部依賴lib_opencv Moduleapp Modulebuild.gradle文件如下圖:
在這裏插入圖片描述

至此我們就完成了OpenCV java 模塊的導入。

圖片灰度化

打開app模塊的MainActivity,在其onResume中進行OpenCV的初始化,代碼如下:

private ImageView mImageView;

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            super.onManagerConnected(status);
            if (status == LoaderCallbackInterface.SUCCESS) {
                //服務啓動成功,灰度化圖片顯示到ImageView上
                filterImage();
            }
        }
};

Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = findViewById(R.id.sample_image);
}

@Override
protected void onResume() {
    super.onResume();
    if (!OpenCVLoader.initDebug()) {
        //啓動OpenCV服務
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, getApplicationContext(), mLoaderCallback);
    } else {
       mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
    }
}

//灰度化圖片,暫不做代碼說明,複製即可
private void filterImage() {
        Mat imgMat = null;
        try {
            imgMat = Utils.loadResource(this, R.drawable.demo);
            Imgproc.cvtColor(imgMat, imgMat, Imgproc.COLOR_RGB2BGRA);
            Mat resultMat = imgMat.clone();
            Imgproc.Canny(imgMat, resultMat, 80, 90);
            Bitmap bitmap = Bitmap.createBitmap(resultMat.cols(), resultMat.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(resultMat, bitmap);
            mImageView.setImageBitmap(bitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
}

哇,看起來成功了,運行一下看下呢?
在這裏插入圖片描述
我去,OpenCV Manager是個什麼鬼?原來OpenCV考慮到應用包體積,提供了一個應用,其內部封裝了OpenCV所需要的so庫,那麼就沒有辦法不安裝OpenCV Manager這個應用嗎?畢竟我們是面向用戶的,我們總不可能要求用戶下載我們的應用之前再去下載一個OpenCV Manager吧?

作爲一個擁有OpenCV源碼的開發,我們是站在上帝視角的,可以隨意造作,那麼自己加載OpenCVso文件不就好,首先看下OpenCV SDK裏面的so文件都在哪兒呢?在OPENCV_SDK_PATH/sdk/native/libs下,廢話不多說,首先把該目錄下的所有文件拷貝到app模塊的app/src/main/jniLibs目錄下(jniLibs目錄需新建,區分大小寫),如下圖所示:
在這裏插入圖片描述
隨後就是加載so文件了,按理說OpenCV SDK裏面應該有so包加載代碼或者類,搜索上圖中的opencv_java4.so試下,果然找到了一個類,如下:

public class OpenCVNativeLoader implements OpenCVInterface {

    public void init() {
        System.loadLibrary("opencv_java4");
        Logger.getLogger("org.opencv.osgi").log(Level.INFO, "Successfully loaded OpenCV native library.");
    }
}

進而修改MainActivity代碼如下:

private ImageView mImageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mImageView = findViewById(R.id.sample_image);
    new OpenCVNativeLoader().init();
}


@Override
protected void onResume() {
    super.onResume();
    filterImage();
}

private void filterImage() {
    Mat imgMat = null;
    try {
        imgMat = Utils.loadResource(this, R.drawable.demo);
        Imgproc.cvtColor(imgMat, imgMat, Imgproc.COLOR_RGB2BGRA);
        Mat resultMat = imgMat.clone();
        Imgproc.Canny(imgMat, resultMat, 80, 90);
        Bitmap bitmap = Bitmap.createBitmap(resultMat.cols(), resultMat.rows(), Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(resultMat, bitmap);
        mImageView.setImageBitmap(bitmap);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

運行下,有可能運行失敗,如果你是高版本的NDK的話,就會應用崩潰,爆出如下錯誤:
在這裏插入圖片描述
這是因爲我們沒有指定C++標準庫,在build.gradle defaultconfig節點添加如下代碼(這裏就是剛開始新建爲C++支持項目的原因,當然也可以選擇降低ndk版本):

externalNativeBuild {
            cmake {
                cppFlags "-std=c++11 -frtti -fexceptions"
                arguments "-DANDROID_STL=c++_shared"
            }
}

運行效果如下:
在這裏插入圖片描述
關注公衆號,獲取Android開發最新博文,掃描下方二維碼加入吧:
在這裏插入圖片描述

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