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); } } } |
留言列表