close

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]:

NewM_0_0.png

按[Next]。在Phone & Tablet Module視窗輸入名稱,例如[Samples-test],Minimum SDK選API 26。

NewM_0_1.png

按[Next]。Activity選[Empty Activity]即可。

NewM_0_2.png

按[Next]。

NewM_0_3.png

按[Finish]即完成新增。

在opencv_samples下會新增samples-test目錄,在settings.gradle也會自動加入:

include ':sample-test'

 

步驟2:dependencies加入OpenCV

打開samples-test的build.gradle,在dependencies{  }內增加implementation project(':opencv'),如下圖:

NewOpenCV_0.png

也可能從其他的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);
        }
    }
}

 

arrow
arrow

    KOEI 發表在 痞客邦 留言(0) 人氣()