OpenCV4Androidバージョン2.4.10を使用していますが、Samsung Galayx GT-I9300でコードをテストしています。私が抱えている問題は、Opencvコードを実行するためにPlayストアからOpencvマネージャーをダウンロードする必要があることです。そうしないと、アプリが起動しません。 「ここに示されているように、いくつかのポストを参照しました Android App "にOpenCV Managerを統合する方法Android OpenCVマネージャーをダウンロードする必要はありませんが、残念ながら、OpenCVマネージャーがインストールされていない限り、アプリは起動しません。
私は次のことを試しました
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
...
...
...
@Override
public void onResume() {
super.onResume();
Log.w(TAG, "onResume");
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, getActivity(), mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
しかしそれは問題を解決しませんでした。 Android Opencv Managerをダウンロードせずにopencvコードを実行する方法を教えてください?
更新:
initAsyncの使用:
アプリの製品版で「initAsync()」を使用する方法の例を提供していただけませんか? 「intiAsync」のシグネチャは次のとおりなので、静的ブロックで使用しようとしましたが、もちろんできません。静的ブロック内で「this」キーワードもコールバック「mLoaderCallback」への参照も使用できません
public class MainActivity extends AppCompatActivity {
static {
//OpenCVLoader.initDebug();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); //this keyword and "mLoaderCallback" are not defined in this scope
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i("MainActivity", "OpenCV loaded successfully");
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Mat m = new Mat(100, 100, CvType.CV_8UC4);
Log.d("MainActivity", "m.width()" + m.width());
Log.d("MainActivity", "m.height()" + m.height());
}
}
段階的な手順が必要な場合は、最初からSampleOpenCV
プロジェクトを作成することから始め、新しいプロジェクトで次の手順を実行することをお勧めします。プロジェクトが機能し始めたら、変更をメインプロジェクトに移行してみてください。
SampleOpenCV
プロジェクトをAndroid Studio、次に File-> New-> Import Module )で開きます。新しいポップアップを開いてモジュールパスを入力し、_{unzipped_opencv}/sdk/Java
_を選択すると、SampleOpenCV
の下に_OpenCVLibrary310
_ディレクトリが作成されます。SampleOpenCV/OpenCVLibrary310/build.gradle
_を開き、次のフィールドを_SampleOpenCV/app/build.gradle
_からコピーします。SampleOpenCV
プロジェクトを右クリックして Open Module Settings をクリックし、_Modules >> app
_を探して Dependencies を選択します右上の+記号をクリックして、ポップアップウィンドウで 3 Module Dependency を選択します。ここで_OpencvLibrary310
_を選択します。ポップアップを閉じて、gradleを同期させます。
Libsフォルダー{unzipped_opencv}/sdk/native/libsをAndroid Studioをapp/src/mainの下にコピーし、名前をjniLibs
に変更します(ここでケースを確認してください)。
_public class MainActivity extends AppCompatActivity {
static {
OpenCVLoader.initDebug();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Mat m = new Mat(100, 100, CvType.CV_8UC4);
}
}
_
[〜#〜]注[〜#〜]:OpenCVLoader.initDebug()
は、ローカルで開発している場合と同様に、デバッグ目的でのみ使用する必要がありますあなたのマシンで。ただし、Playストアなどでアプリをリリースする必要がある本番環境では、OpenCVLoader.initAsync()
を使用する必要があります。 OpenCVLoaderを実際に初期化するには、電話によっては時間がかかります。したがって、それをinitDebug()
を使用してロードすると、メインスレッドで実行され、UIがわずかにブロックされる可能性があります。そのため、initAsync()
を使用して実現できるOpenCVをバックグラウンドでロードすることをお勧めします
私の方法についてあなたに共有します。
-
def opencvsdk = '<path_to_opencv_Android_sdk_rootdir>'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
私のsettings.gradleファイルの例
include ':app'
def opencvsdk = '/Volumes/Data/Projects/machine-learning/OpenCV-Android-sdk'
include ':opencv'
project(':opencv').projectDir = new File(opencvsdk + '/sdk')
-
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
....
implementation project(':opencv')
}
-
import Android.graphics.Bitmap;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.widget.ImageView;
import org.opencv.Android.OpenCVLoader;
import org.opencv.Android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Size;
import org.opencv.imgproc.Imgproc;
import Java.io.IOException;
public class MainActivity extends AppCompatActivity {
static {
OpenCVLoader.initDebug();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = findViewById(R.id.activity_main_iv_result);
try {
Mat img = Utils.loadResource(this, R.drawable.eye);
Mat gryimg = new Mat(img.size(),CvType.CV_8U);
Imgproc.cvtColor(img, gryimg, Imgproc.COLOR_RGB2GRAY);
Bitmap bm = Bitmap.createBitmap(gryimg.cols(), gryimg.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(gryimg, bm);
imageView.setImageBitmap(bm);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Opencv-3.4.1-Android-sdkおよびAndroid Studio 3.1.3でテスト済み
SDKをプロジェクトに統合する方法がいくつかあります。より多くのオプションを取得するには/sdk/build.gradleを読んでください
ネイティブライブラリをロードする正しい方法は次のとおりです。
System.loadLibrary("opencv_Java3");