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