Błąd OpenCV / Android BufferQueue: porzucono teksturę powierzchni

Nowy na Androida i OpenCV. Próbowałem wdrożyć kod z nowej książki,Opanowanie OpenCV za pomocą praktycznych projektów komputerowych. Aplikacja zasadniczo wyświetla animowane obrazy na podglądzie kamery za pomocą OpenCV. Możesz dotknąć ekranu, aby zapisać animowany obraz.

Znajduje się kod źródłowy autorówtutaj.

Zrobiłem małą modyfikację (patrz poniżej) do pliku CartoonifierApp.java, dzięki czemu mogę statycznie załadować bibliotekę animatora za pomocąMenedżer OpenCV aplikacja (oryginalny kod rzucił UnsatisfiedLinkError).

Problem, przed którym stoję, polega na tym, że po załadowaniu aplikacji na mój Galaxy Nexus (Android 4.1.1) otrzymuję pusty czarny ekran. Mój LogCat mówi:

E / BufferQueue (4744): [unnamed-4744-0] setBufferCount: SurfaceTexture został porzucony! E / Cartoonifier :: SurfaceView (4744): startPreview () nie powiódł się

Myślę, że to problem z pamięcią. Wiem, że kod cpp działa, ponieważ działa dobrze na moim komputerze - chociaż renderowanie jest powolne na stosunkowo nowym laptopie (Asus U46E).

Nie mam pojęcia, jak to naprawić. Jedyna pomocna rada, jaką znalazłem, byłatutaj. Jeśli zastąpię moją metodę setPreview w CatoonifierVewBase.java

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     mCamera.setPreviewTexture( new SurfaceTexture(10) );
 else
     mCamera.setPreviewDisplay(null);

z

 mCamera.setPreviewDisplay(mHolder);

wtedy to, co się dzieje, jest normalne, a ja mogę zapisać rysowane obrazy, dotykając ekranu. Zwróć uwagę, że nie jest to dokładnie pożądany wynik, ponieważ chcę stale rysować obraz na podglądzie kamery. Kamera działa tylko dlatego, że nie piszę do widoku powierzchni (przynajmniej tak rozumiem). Odpowiedź we wcześniej wspomnianymteren ma pewne obejście, ale nie mam pojęcia, o czym on mówi.

BTW Próbowałem wszystkich przykładowych aplikacji OpenCV4Android i działają dobrze. Używam także OpenCV w wersji 2.4.3. Docelowy poziom API to 15.

Pełny Logcat:

12-22 15: 33: 07.966: I / CartoonifierApp (5999): Utworzenie nowej klasy com.Cartoonifier.CartoonifierApp 12-22 15: 33: 07.966: I / CartoonifierApp (5999): wywołano onCreate 12-22 15: 33: 07.966 : I / CartoonifierApp (5999): Próba załadowania biblioteki OpenCV 12-22 15: 33: 07.982: I / Cartoonifier :: SurfaceView (5999): Utworzenie nowej klasy com.Cartoonifier.CartoonifierView 12-22 15: 33: 07.990: I / CartoonifierApp (5999): onResume 12-22 15: 33: 07.990: I / Cartoonifier :: SurfaceView (5999): openCamera 12-22 15: 33: 07.990: I / Cartoonifier :: SurfaceView (5999): releaseCamera 12-22 15: 33: 08.099: D / OpenCVManager / Helper (5999): Utworzono połączenie serwisowe 12-22 15: 33: 08.099: D / OpenCVManager / Helper (5999): Próba pobrania ścieżki do biblioteki 12-22 15: 33: 08.138: D / OpenCVManager / Helper (5999): Próba pobrania listy bibliotek 12-22 15: 33: 08.169: D / OpenCVManager / Helper (5999): Lista bibliotek: „” 12-22 15: 33: 08.169: D / OpenCVManager / Helper (5999): Pierwsza próba załadowania bibliotek 12-22 15: 33: 08.169: D / OpenCVManager / Helper (5999): Próba zainicjowania bibliotek OpenCV 12-22 15: 3 3: 08.169: D / OpenCVManager / Helper (5999): Próba załadowania biblioteki /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15: 33: 08.169:

D / dalvikvm (5999): Próba załadowania lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15: 33: 08.193: D / dalvikvm (5999): Dodano współdzieloną lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15: 33: 08.193: D / OpenCVManager / Helper (5999): init biblioteki OpenCV był w porządku!

12-22 15: 33: 08.193: D / OpenCVManager / Helper (5999): Pierwsza próba załadowania lib jest OK 12-22 15: 33: 08.193: D / OpenCVManager / Helper (5999): Init zakończony stanem 0 12- 22 15: 33: 08.193: D / OpenCVManager / Helper (5999): Odłącz od usługi 12-22 15: 33: 08.200: D / OpenCVManager / Helper (5999): Wywołanie przy użyciu wywołania zwrotnego 12-22 15: 33: 08.200: I / CartoonifierApp (5999): OpenCV został pomyślnie załadowany

12-22 15: 33: 08.200: D / dalvikvm (5999): Próba załadowania lib /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

15: 33: 08.200: D / dalvikvm (5999): Dodano współdzieloną bibliotekę /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

15: 33: 08.200: D / dalvikvm (5999): Nie JNI_OnLoad znaleziony w /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40, pomijając init 12-22 15: 33: 08.200: D / OpenCVManager / Helper ( 5999): Utworzono połączenie serwisowe 12-22 15: 33: 08.200: D / OpenCVManager / Helper (5999): Próba pobrania ścieżki do biblioteki 12-22

15: 33: 08.232: D / OpenCVManager / Helper (5999): Próba pobrania listy bibliotek 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Lista bibliotek: „”

12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Pierwsza próba załadowania bibliotek 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Próba

init OpenCV libs 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Próba załadowania biblioteki /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15: 33: 08.271: D / dalvikvm (5999): Próba załadowania lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15: 33: 08.271: D / dalvikvm (5999): Współdzielona lib '/data/data/org.opencv.engine/lib/libopencv_java.so' już załadowana w tym samym CL 0x41936a40 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): init biblioteki OpenCV był w porządku! 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Pierwsza próba załadowania bibliotek jest OK

12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Init zakończony stanem 0 12-22 15: 33: 08.271: D / OpenCVManager / Helper (5999): Usuń powiązanie z usługi 12-22 15:33 : 08.271: D / OpenCVManager / Helper (5999): Wywołanie przy użyciu wywołania zwrotnego 12-22 15: 33: 08.271: I / CartoonifierApp (5999): OpenCV został pomyślnie załadowany 12-22 15: 33: 08.279: D / dalvikvm (5999): Próba załadowania lib /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22 15: 33: 08.279: D / dalvikvm (5999): Współdzielona lib '/data/data/com.Cartoonifier/lib/libcartoonifier .so 'już załadowany w tym samym CL 0x41936a40 12-22 15: 33: 08.302: I / Cartoonifier :: SurfaceView (5999): surface Utworzono 12-22 15: 33: 08.302: I / Cartoonifier :: SurfaceView (5999): surfaceChanged ( ). Rozmiar okna: 1196x670 12-22 15: 33: 08.302: I / Cartoonifier :: SurfaceView (5999): setupCamera (1196x670) 12-22 15: 33: 08.302: I / Cartoonifier :: SurfaceView (5999): Rozpoczęcie wątku przetwarzania 12 -22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 1920x1080 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 1280x720 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 960x720 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 800x480 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 720x576 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 720x480 12-22 15: 33: 08.310: I / Cartoonifier: : SurfaceView (5999): Znaleziono rozdzielczość kamery 768x576 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 640x480 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999 ): Znaleziono rozdzielczość kamery 320x240 12-22 15: 33: 08.310: I / Cartoonifie r :: SurfaceView (5999): Znaleziono rozdzielczość kamery 352x288 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 240x160 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 176x144 12-22 15: 33: 08.310: I / Cartoonifier :: SurfaceView (5999): Znaleziono rozdzielczość kamery 128x96 12-22 15: 33: 08.318: I / Cartoonifier :: SurfaceView (5999): Rozmiar podglądu wybranej kamery: 1280x720 12-22 15: 33: 08.333: D / dalvikvm (5999): GC_FOR_ALLOC uwolniony 131K, 2% wolnego 10807K / 11011K, wstrzymany 13 ms, łącznie 13 ms

12-22 15: 33: 08.333: I / dalvikvm-heap (5999): Zwiększ stertę (przypadek frag) do 11,902 MB dla alokacji 1382416-bajtów

12-22 15: 33: 08.357: D / dalvikvm (5999): GC_CONCURRENT zwolniony 1K, 3% darmowy 12156K / 12423K, wstrzymany 12 ms + 1 ms, łącznie 24 ms

12-22 15: 33: 08.357: D / dalvikvm (5999): WAIT_FOR_CONCURRENT_GC zablokował 11ms

12-22 15: 33: 08.365: D / dalvikvm (5999): GC_FOR_ALLOC zwolniony 0K, 3% darmowy 12156K / 12423K, wstrzymany 9ms, łącznie 9ms

12-22 15: 33: 08.372: I / dalvikvm-heap (5999): Zwiększ stertę (przypadek frag) do 13.219 MB dla alokacji 1382416-bajtów

12-22 15: 33: 08.388: D / dalvikvm (5999): GC_CONCURRENT zwolniony 0K, 3% wolnego 13506K / 13831K, wstrzymany 11 ms + 1 ms, łącznie 21 ms

12-22 15: 33: 08.388: D / dalvikvm (5999): WAIT_FOR_CONCURRENT_GC zablokował 7ms

12-22 15: 33: 08.404: D / dalvikvm (5999): uwolniono GC_FOR_ALLOC <1K, 3% wolnego 13506K / 13831K, wstrzymano 9 ms, łącznie 10 ms

12-22 15: 33: 08.411: I / dalvikvm-heap (5999): Rosną sterty (przypadek frag) do 16.735 MB dla alokacji 3686416-bajtów

12-22 15: 33: 08.427: D / dalvikvm (5999): GC_CONCURRENT uwolniony <1K, 3% za darmo 17106K / 17479K, wstrzymany 12 ms + 1 ms, łącznie 22ms

12-22 15: 33: 08.427: D / dalvikvm (5999): WAIT_FOR_CONCURRENT_GC zablokował 10 ms

12-22 15: 33: 08.443: D / dalvikvm (5999): uwolniono GC_FOR_ALLOC <1K, 3% za darmo 17106K / 17479K, wstrzymano 10 ms, łącznie 10 ms

12-22 15: 33: 08.450: I / dalvikvm-heap (5999): Rosną sterty (przypadek frag) do 20.250 MB dla alokacji 3686416-bajtów

12-22 15: 33: 08.466: D / dalvikvm (5999): GC_CONCURRENT zwolniony 0K, 2% za darmo 20706K / 21127K, wstrzymany 12 ms + 2 ms, łącznie 22 ms

12-22 15: 33: 08.466: D / dalvikvm (5999): WAIT_FOR_CONCURRENT_GC zablokował 5 ms

12-22 15: 33: 08.466: I / Cartoonifier :: SurfaceView (5999): rozpoczęcie podglądu

12-22 15: 33: 08.497: E / BufferQueue (5999): [unnamed-5999-0] setBufferCount: SurfaceTexture został porzucony!

12-22 15: 33: 08.505: E / Cartoonifier :: SurfaceView (5999): mCamera.startPreview () nie powiodło się

Fragment z CartoonifierApp.java pokazujący moją modyfikację

private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
    @Override
    public void onManagerConnected(int status) {
        switch (status) {
            case LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG, "OpenCV loaded successfully");

                // Load native library after(!) OpenCV initialization
                System.loadLibrary("cartoonifier");
            } break;
            default:
            {
                super.onManagerConnected(status);
            } break;
        }
    }
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    Log.i(TAG, "called onCreate");
    super.onCreate(savedInstanceState);

    Log.i(TAG, "Trying to load OpenCV library");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
    {
      Log.e(TAG, "Cannot connect to OpenCV Manager");
    }

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    mView = new CartoonifierView(this);
    setContentView(mView);

    // Call our "onTouch()" callback function whenever the user touches the screen.
    mView.setOnTouchListener(this);
}


@Override
protected void onPause() {
    Log.i(TAG, "onPause");
    super.onPause();
    mView.releaseCamera();
}

@Override
public void onResume()
{
    super.onResume();
    Log.i(TAG, "onResume");
    if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback))
    {
      Log.e(TAG, "Cannot connect to OpenCV Manager");
    }   

    if( !mView.openCamera() ) {
        AlertDialog ad = new AlertDialog.Builder(this).create();  
        ad.setCancelable(false); // This blocks the 'BACK' button  
        ad.setMessage("Fatal error: can't open camera!");  
        /*ad.setButton("OK", new DialogInterface.OnClickListener() {  
            public void onClick(DialogInterface dialog, int which) {  
                dialog.dismiss();                      
                finish();
            }  
        });  */
        ad.show();
    }
}

questionAnswers(1)

yourAnswerToTheQuestion