2012-12-22 6 views
6

Neu bei Android und OpenCV. Versuchen Sie, Code aus dem neuen Buch zu implementieren, Mastering OpenCV mit praktischen Computer Vision Projects. Die App macht im Grunde kokonisierte Bilder in der Kameravorschau mit OpenCV. Sie können den Bildschirm berühren, um das Cartoonbild zu speichern.OpenCV/Android BufferQueue Fehler: Oberflächenstruktur wurde aufgegeben

Quellcode von Autoren befindet sich here.

ich eine kleine Änderung (siehe unten) zu CartoonifierApp.java Datei, so dass ich statisch die cartoonifier Bibliothek mit dem OpenCV Manager app (der Original-Code warf einen UnsatisfiedLinkError) laden kann.

Das Problem, mit dem ich konfrontiert bin, ist, dass wenn ich die App auf meinem Galaxy Nexus (Android 4.1.1) lade ich einen leeren schwarzen Bildschirm bekommen. Mein LogCat sagt:

E/BufferQueue(4744): [unnamed-4744-0] setBufferCount: SurfaceTexture has been abandoned! E/Cartoonifier::SurfaceView(4744): startPreview() failed

Ich denke, es ist ein Speicherproblem. Ich weiß, dass der cpp-Code funktioniert, weil er auf meinem Computer gut läuft - obwohl das Rendern auf einem relativ neuen Laptop (Asus U46E) langsam ist.

Ich habe keine Ahnung, wie das zu beheben ist. Der einzige hilfreiche Rat, den ich fand, war here. Wenn ich in CatoonifierVewBase.java

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

mit

mCamera.setPreviewDisplay(mHolder); 

dann meine setPreview Methode ersetzen, was passiert, ist die Kamera funktioniert wie normal und ich kann durch Berühren des Bildschirms cartoonified Bilder speichern. Beachten Sie, dass dies nicht genau das gewünschte Ergebnis ist, da ich das Bild in der Kameravorschau kontinuierlich karikieren möchte. Die Kamera funktioniert nur, weil ich nicht in die Oberflächenansicht schreibe (zumindest verstehe ich das). Die Antwort in der zuvor erwähnten site hat einige Abhilfe, aber ich habe keine Ahnung, wovon er spricht.

BTW Ich habe alle Beispiel OpenCV4Android-Anwendungen ausprobiert und sie funktionieren gut. Ich benutze auch OpenCV Version 2.4.3. API-Level-Ziel ist 15.

Voll Logcat:

12-22 15:33:07.966: I/CartoonifierApp(5999): Instantiated new class com.Cartoonifier.CartoonifierApp 12-22 15:33:07.966: I/CartoonifierApp(5999): called onCreate 12-22 15:33:07.966: I/CartoonifierApp(5999): Trying to load OpenCV library 12-22 15:33:07.982: I/Cartoonifier::SurfaceView(5999): Instantiated new class 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): Service connection created 12-22 15:33:08.099: D/OpenCVManager/Helper(5999): Trying to get library path 12-22 15:33:08.138: D/OpenCVManager/Helper(5999): Trying to get library list 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): Library list: "" 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): First attempt to load libs 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): Trying to init OpenCV libs 12-22 15:33:08.169: D/OpenCVManager/Helper(5999): Trying to load library /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15:33:08.169:

D/dalvikvm(5999): Trying to load lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15:33:08.193: D/dalvikvm(5999): Added shared lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15:33:08.193: D/OpenCVManager/Helper(5999): OpenCV libs init was ok!

12-22 15:33:08.193: D/OpenCVManager/Helper(5999): First attempt to load libs is OK 12-22 15:33:08.193: D/OpenCVManager/Helper(5999): Init finished with status 0 12-22 15:33:08.193: D/OpenCVManager/Helper(5999): Unbind from service 12-22 15:33:08.200: D/OpenCVManager/Helper(5999): Calling using callback 12-22 15:33:08.200: I/CartoonifierApp(5999): OpenCV loaded successfully

12-22 15:33:08.200: D/dalvikvm(5999): Trying to load lib /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

15:33:08.200: D/dalvikvm(5999): Added shared lib /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

15:33:08.200: D/dalvikvm(5999): No JNI_OnLoad found in /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40, skipping init 12-22 15:33:08.200: D/OpenCVManager/Helper(5999): Service connection created 12-22 15:33:08.200: D/OpenCVManager/Helper(5999): Trying to get library path 12-22

15:33:08.232: D/OpenCVManager/Helper(5999): Trying to get library list 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Library list: ""

12-22 15:33:08.271: D/OpenCVManager/Helper(5999): First attempt to load libs 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Trying to

init OpenCV libs 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Trying to load library /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15:33:08.271: D/dalvikvm(5999): Trying to load lib /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

15:33:08.271: D/dalvikvm(5999): Shared lib '/data/data/org.opencv.engine/lib/libopencv_java.so' already loaded in same CL 0x41936a40 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): OpenCV libs init was ok! 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): First attempt to load libs is OK

12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Init finished with status 0 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Unbind from service 12-22 15:33:08.271: D/OpenCVManager/Helper(5999): Calling using callback 12-22 15:33:08.271: I/CartoonifierApp(5999): OpenCV loaded successfully 12-22 15:33:08.279: D/dalvikvm(5999): Trying to load lib /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22 15:33:08.279: D/dalvikvm(5999): Shared lib '/data/data/com.Cartoonifier/lib/libcartoonifier.so' already loaded in same CL 0x41936a40 12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): surfaceCreated 12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): surfaceChanged(). Window size: 1196x670 12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): setupCamera(1196x670) 12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): Starting processing thread 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 1920x1080 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 1280x720 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 960x720 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 800x480 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 720x576 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 720x480 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 768x576 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 640x480 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 320x240 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 352x288 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 240x160 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 176x144 12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 128x96 12-22 15:33:08.318: I/Cartoonifier::SurfaceView(5999): Chosen Camera Preview Size: 1280x720 12-22 15:33:08.333: D/dalvikvm(5999): GC_FOR_ALLOC freed 131K, 2% free 10807K/11011K, paused 13ms, total 13ms

12-22 15:33:08.333: I/dalvikvm-heap(5999): Grow heap (frag case) to 11.902MB for 1382416-byte allocation

12-22 15:33:08.357: D/dalvikvm(5999): GC_CONCURRENT freed 1K, 3% free 12156K/12423K, paused 12ms+1ms, total 24ms

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

12-22 15:33:08.365: D/dalvikvm(5999): GC_FOR_ALLOC freed 0K, 3% free 12156K/12423K, paused 9ms, total 9ms

12-22 15:33:08.372: I/dalvikvm-heap(5999): Grow heap (frag case) to 13.219MB for 1382416-byte allocation

12-22 15:33:08.388: D/dalvikvm(5999): GC_CONCURRENT freed 0K, 3% free 13506K/13831K, paused 11ms+1ms, total 21ms

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

12-22 15:33:08.404: D/dalvikvm(5999): GC_FOR_ALLOC freed <1K, 3% free 13506K/13831K, paused 9ms, total 10ms

12-22 15:33:08.411: I/dalvikvm-heap(5999): Grow heap (frag case) to 16.735MB for 3686416-byte allocation

12-22 15:33:08.427: D/dalvikvm(5999): GC_CONCURRENT freed <1K, 3% free 17106K/17479K, paused 12ms+1ms, total 22ms

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

12-22 15:33:08.443: D/dalvikvm(5999): GC_FOR_ALLOC freed <1K, 3% free 17106K/17479K, paused 10ms, total 10ms

12-22 15:33:08.450: I/dalvikvm-heap(5999): Grow heap (frag case) to 20.250MB for 3686416-byte allocation

12-22 15:33:08.466: D/dalvikvm(5999): GC_CONCURRENT freed 0K, 2% free 20706K/21127K, paused 12ms+2ms, total 22ms

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

12-22 15:33:08.466: I/Cartoonifier::SurfaceView(5999): start preview

12-22 15:33:08.497: E/BufferQueue(5999): [unnamed-5999-0] setBufferCount: SurfaceTexture has been abandoned!

12-22 15:33:08.505: E/Cartoonifier::SurfaceView(5999): mCamera.startPreview() failed

Snippet von CartoonifierApp.java meine Modifikation zeigt

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

Antwort

9

Dieses Problem vor einiger Zeit in OpenCV workarounded wurde.

Nicht sicher, ob es sich um einen Programm- oder Betriebssystemfehler handelt. Das Problem ist, dass der Aufruf an Bitmap.createBitmap löst SurfaceTexture Objekt für die Visualisierung verwendet.

Die Abhilfe war die setupCamera Methode der Basis View Klasse zu modifizieren und

try { 
    setPreview(); 
} catch (IOException e) { 
    Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); 
} 

/* Notify that the preview is about to be started and deliver preview size */ 
onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); 

zu

/* Notify that the preview is about to be started and deliver preview size */ 
onPreviewStarted(params.getPreviewSize().width, params.getPreviewSize().height); 

try { 
    setPreview(); 
} catch (IOException e) { 
    Log.e(TAG, "mCamera.setPreviewDisplay/setPreviewTexture fails: " + e); 
} 

(die Reihenfolge der Zeilen geändert wird)

ändern
Verwandte Themen