2020年8月2日日曜日

在 Android Studio 專案中導入 OpenCV

身為一個 Android BSP 工程師
不只是底層的 system bring up
或是 Linux kernel driver
又或是 HAL,NDK 串接
連上層 application 都要會呢 (´・ω・`)
真的變成名符其實的 Android 全端工程師了=v=

在 Android Studio 中使用 OpenCV for Android
這篇大概已經拖了2、3年了
一直都沒時間寫
然後每次要用就一直重蹈覆轍到處找資料= =
趁現在有時間趕快來寫一下

TL;DR

沒有...

安裝環境

  • Windows 10 1909
  • Android Studio 4.0.1
  • OpenCV 4.4.0

下載 OpenCV for Android

到 OpenCV 官網直接把 Android 版本的壓縮檔給抓下來
https://opencv.org/releases/

解壓縮

把壓縮檔裡面的這個資料夾解壓縮出來
因為這個資料夾的東西匯入專案之後就不重要了
所以隨便找個地方放就可以了

新增一個空專案

如果有舊的專案
這個步驟就直接略過就好

這邊選什麼 template 都可以
因為這個不會對接下來的動作造成影響


找個地方存放專案
然後語言看自己喜好就好
這邊用 kotlin 當示範
選好之後按 [Finish]


然後就會看到它自己開始安裝一些 components

完成之後就會看到專案了

這個時候有件很重要的事

等待它!!


因為這時候 Gradle 會開始下載一些套件跟同步整個專案
所以這個時候不等它的話
等等會出現一堆莫名其妙的錯誤!!
根據每台電腦跟網路的差異性
大約需要 1 ~ 30 分鐘不等的時間
同步完之後
就可以看到 log 裡出現跟下面這張圖差不多的東西了

匯入 OpenCV

[File]→[New]→[Import Module…]

然後就會跳出下面這個匯入用的框框

這邊有件事情很重要
剛剛解壓縮出來的路徑應該是
path/to/OpenCV-android-sdk

但是這邊要指定的 [Source directory]
是它的下一層的 [SDK] 資料夾

不然他會找不到東西的說= =
選完之後就 [Finish]

然後跟舊版的有些差異是
舊版的會需要輸入 [Module Name]
但是新的這個版本沒有地方輸入這個東西
所以等等就會產生一個很微妙的狀況
因為 Module Name 被自動設定成了
被指定的那個資料夾的名稱

所以等等這個 module 的名稱就變成了前面寫的 [SDK]

然後自動 sync 的時候就出現錯誤了Σ( ̄□ ̄|||)

這時候只要按下 error log 中
那行藍色提示安裝 NDK
就會自動跳出跟下面這張圖一樣的安裝畫面了

安裝完成之後按下那顆藍色的 [Finish] 按鈕
它就會自動開始同步專案了

然後根據電腦的效能會需要等個大概幾分鐘不等的時間

最後要在 log 中看到
CONFIGURE SUCCESSFUL 才算成功!!

然後在左上的 Project View 中
找到 [Android] 的字樣
通常專案的顯示預設是用 Android Project 來排列
不過這樣是看不到剛剛匯入的東西的!!
所以這時候要把 Project View 切換成 [Project]

切換完之後
就可以在下面的的 Project View 中
找到剛剛匯入的 [SDK] 資料夾了!!
這個東西就是剛剛匯入的 OpenCV 了!!

然後抱怨一下
以前舊版的還可以設定 module name 的時候
至少可以讓這個顯示的名字好看一點
現在這樣真的很難懂 = =

設定專案相依性

找到左上角的 [File]→[Project Structures…]

然後會跳出專案的設定

最左邊的 column 切換到 [Dependencies]
旁邊的 Modules 切換到 [app]
這邊的 [app] 是你的主要專案
所以有可能會不一樣

然後跟下圖一樣
按一下旁邊的 [+]
選到 [3 Module Dependency]

這時候就會看到跟下圖一樣的相依性追加畫面了
圖中的 [sdk] 就是剛剛匯入的 OpenCV
只是因為前面沒有設定名字
所以這邊根本看不出來他是什麼= =

然後把 [sdk] 打勾按 [OK]
這時候會回到剛剛的畫面
在畫面中的 [Dependency] 就會多了剛剛的 [sdk] 資料夾了

這時候按一下右下角的 [Apply]
然後就會看到跟下圖一樣的浮水印出現了
這時候 Gradle 會開始同步專案
沒意外的話同步完之後按藍色的 [OK] 離開

這時候會在 log 中看到 [CONFIGURE SUCCESSFUL]

到這邊基本上就設定完了!!

變更 compileSdkVersion (非必要)

這個步驟有點神奇
並不是一定要做
如果之後在 build 的時候都沒有出現問題的話
基本上這步可以不用做

不過之後 build 有出問題的話
可以考慮一下這個步驟

先把 Project View 切換回 [Android]
然後找到 Gradle Scripts
底下有個 build.gradle (Module: app)
然後把它打開來
找到 [compileSdkVersion] 這個數值
然後記得它

接著再打開 build.gradle (Module: sdk)
然後把這個的 compileSdkVersion 改成剛剛那個數字

這樣至少可以減少版本不同步的問題

測試

然後在 code 裡面加入測試用的 code

    if (!OpenCVLoader.initDebug()) {
        Log.i("OpenCV", "Failed");
    } else {
        Log.i("OpenCV", "Succeeded");
    }

直接 build …

沒意外的話
就會看到 [BUILD SUCCESSFUL]

這篇就這樣了