2016-11-18 23 views
11

Używam OpenCV4Android w wersji 2.4.10 i testuję mój kod na Samsung Galayx GT-I9300. Problem polega na tym, że muszę pobrać Opencv Manager ze sklepu Play, aby mój kod opencv działał, w przeciwnym razie aplikacja się nie uruchomi. Odniosłem się do niektórych postów "jak pokazano tutaj How to integrate OpenCV Manager in Android App", aby wiedzieć, w jaki sposób mogę uruchomić kod opncv na Androidzie bez konieczności pobierania menedżera OpenCV , ale niestety aplikacja nie zaczyna się tak długo, jak OpenCV Manager nie jest zainstalowany.Jak uruchomić kod OpenCV bez OpenCv Manager

Próbowałem follwoing

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); 
    } 
} 

ale to nie rozwiązuje problemu. Proszę dać mi znać, jak uruchomić kod OpenCV na Androida bez pobierania Menedżera OpenCv?

Aktualizacja:

wykorzystanie initAsync:

to proszę podać przykład jak używać "initAsync()" w wersji produkcyjnej aplikacji? ponieważ próbowałem to zrobić, ale oczywiście nie mogę tego użyć w bloku statycznym, ponieważ sygnatura "intiAsync" jest następująca: "OpenCVLoader.initAsync (OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback);" i nie mogę użyć „to” słowo kluczowe, ani odniesienia do zwrotnego „mLoaderCallback” wewnątrz statycznego bloku

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()); 
} 
} 

Odpowiedz

20

jak chcesz krok po kroku, więc chciałbym zacząć tworzenie SampleOpenCV projekt od zera, i sugerują również wykonanie następujących kroków w nowym projekcie. Gdy zacznie działać, możesz spróbować przenieść zmiany do głównego projektu.

  1. Pobierz OpenCV pakiet dla Androida z Opencv.org [Direct Download Link V3.1]
  2. Rozpakuj zip do wybranej lokalizacji, Otwórz projekt SampleOpenCV w Android Studio, następnie Plik -> Nowy -> Importuj Moduł, który otworzyłoby nowe okienko wyskakujące, aby wejść do ścieżki modułu, wybierz {unzipped_opencv}/sdk/java, aby utworzyć katalog OpenCVLibrary310 pod SampleOpenCV.
  3. Teraz Otwarte SampleOpenCV/OpenCVLibrary310/build.gradle i skopiuj następujące pola z SampleOpenCV/app/build.gradle:
    • compileSdkVersion
    • buildToolsVersion
    • minSdkVersion
    • targetSdkVersion
  4. Teraz kliknij prawym przyciskiem myszy na projekcie SampleOpenCV i kliknij Otwórz moduł Srttings, poszukaj Modules >> app i wybierz Zależności

enter image description here

  1. kliknij w prawym górnym + znak w oknie, a następnie wybierz 3 Module Zależność . Teraz wybierz OpencvLibrary310. Zamknij wyskakujące okienko i pozwól na stopniową synchronizację.

  2. Skopiuj folder libs {unzipped_opencv}/sdk/native/libs do Android Studio w folderze app/src/main i zmień jego nazwę na jniLibs (Weź tutaj przykład).

  3. Zostało wykonane.

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); 
    } 
} 

UWAGA: OpenCVLoader.initDebug() mogą być wykorzystywane do celów debugowania tylko kiedy rozwijają się lokalnie na komputerze. Ale do celów produkcyjnych, w których musisz zwolnić aplikację w Sklepie Play itp., Musisz użyć OpenCVLoader.initAsync(). Właściwie zainicjowanie OpenCVLoader zajmuje trochę czasu w zależności od telefonu. Więc jeśli załadujesz go pod initDebug(), zostanie on wykonany w głównym wątku, co może zablokować UI przez ułamek czasu. Dlatego zaleca się, aby załadować OpenCV w tle, które można osiągnąć za pomocą initAsync()

+0

dzięki za odpowiedź i twój wysiłek ... po prostu myliłem się między wersją produkcyjną a wersją do debugowania !! ... w odniesieniu do tworzonej przeze mnie Aplikacji, która zawiera kod opencv, czy jest to wersja do debugowania lub wersja produkcyjna? proszę o poradę – user2121

+0

Zmieniono ... @ user2121 – ZdaR

+0

Bardzo dziękuję za szczegółową odpowiedź .. ale proszę o zachowanie mnie, nadal mam pytanie proszę ... jak wspomniałeś w swojej zaktualizowanej odpowiedzi - "Dlatego zaleca się załadowanie OpenCV w tle, który można osiągnąć za pomocą initAsync() "- dlaczego więc nie używać zawsze" initAsync() "zamiast" initDebug() "? – user2121