Android studio新增OpenCV APP-初始化
新增一個OpenCV的APP module,初學者可從下載且import完成的OpenCV samples環境開始,在opencv_samples project下新增module,不需太多設定,就可以使用OpenCV。
前置工作:OpenCV sapmles已經正確import,而且正常執行,可參考:Android studio載入OpenCV範例@KOEI的旅行。
新增OpenCV APP並初始化步驟如下:
步驟1:新增Module
開啟opencv_samples project,點選File->New->New Module,Module Type選擇[Phone & Tablet Module]:
按[Next]。在Phone & Tablet Module視窗輸入名稱,例如[Samples-test],Minimum SDK選API 26。
按[Next]。Activity選[Empty Activity]即可。
按[Next]。
按[Finish]即完成新增。
在opencv_samples下會新增samples-test目錄,在settings.gradle也會自動加入:
include ':sample-test'
步驟2:dependencies加入OpenCV
打開samples-test的build.gradle,在dependencies{ }內增加implementation project(':opencv'),如下圖:
也可能從其他的sample的build.gradle,例如15-puzzle的build.gradle找到這行,並複製過來。
dependencies {
implementation project(':opencv')
}
步驟3:OpenCV 初始化
1.在onResume呼叫OpenCVLoader.initDebug(),判斷本機是否包含OpenCV:
(1)如果沒有包含OpenCV,則顯示"Package not found",呼叫OpenCVLoader.initAsync(),使用OpenCV Manager下載apk,進行異步初始化。下載後呼叫BaseLoaderCallback()。
(2)如果有包含,則執行BaseLoaderCallback的onManagerConnected()。
第(1)項異步初始化的優點是程式不包OpenCV apk,所以所需儲存空間較小(約少40M),且如果OpenCV apk有更新,可以下載更新。但使用看到這個下載安裝步驟,常覺得麻煩,就取消執行APP,反而不建議使用。
2.執行BaseLoaderCallback
在BaseLoaderCallback設定連結(onManagerConnected)OpenCV成功(LoaderCallbackInterface.SUCCESS)或失敗時的動作。
其他sample有onResumed和BaseLoaderCallback相關的程式碼可以複製,例如15-puzzle的Puzzle15Activity.java有下列程式碼可複製(已刪除其他Camera的設定):
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
|
將它複製到MainActivity.java,並在MainActivity增加TAG的設定,例如:
private static final String TAG = "Sample-test::Activity";
步驟4:測試sample-test
選擇samples-test,執行APP ([Run 'samples-test']),在Logcat(Edit Filter Configuration的Log Tag輸入Sample-test::Activity)顯示如下,則表示OpenCV載入成功。
| com.example.sample_test D/Sample-test::Activity: OpenCV library found inside package. Using it! com.example.sample_test I/Sample-test::Activity: OpenCV loaded successfully |
可以開始寫有關OpenCV的程式了。
使用sample成功OpenCV初始化,下一步可在Android studio新增project後,載入OpenCV 4.3 module,參考:Android studio載入OpenCV 4.3 module@KOEI的旅行
完整MainActivity.java:
package com.example.sample_test;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "Sample-test::Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume()
{
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
}
|
