OpenCV的/ Android的BufferQueue错误:表面纹理已被放弃已被、纹理、表面、错误

2023-09-04 11:50:12 作者:或许你已不在

新到Android和OpenCV。一直在努力,以实现从新书code, OpenCV的掌握与现实计算机视觉项目的。该应用程序基本上呈现使用OpenCV的相机preVIEW cartoonified图像。你可以触摸屏幕来保存cartoonified形象。

从作者来源$ C ​​$ C位于这里。

我做了一个小的修改(见下文)CartoonifierApp.java文件,这样我可以静态加载使用的 OpenCV的经理应用程序(原code抛出的UnsatisfiedLinkError)

我面临的问题是,当我加载的应用程序到我的Galaxy Nexus的(安卓4.1.1),我得到一个空的黑屏幕。我的LogCat中说:

  

E / BufferQueue(4744):未命名-4744-0] setBufferCount:表面纹理   已被抛弃! E / Cartoonifier :: SurfaceView(4744):   启动preVIEW()失败。

我认为这是一个记忆的问题。我知道CPP code ++工程,因为它本身我的电脑上运行得很好 - 虽然呈现是一个相对较新的笔记本电脑(华硕U46E)慢

我不知道如何解决这一问题。唯一有用的建议,我发现了这里。如果我更换我的设置preVIEW方法CatoonifierVewBase.java

 如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB)
     mCamera.set previewTexture(新表面纹理(10));
 其他
     mCamera.set previewDisplay(空);
 

  mCamera.set previewDisplay(mHolder);
 

那么会发生什么是摄像头的工作原理是正常的,我可以通过触摸屏幕保存cartoonified图像。请注意,这是不完全想要的结果,因为我想在摄像头preVIEW不断cartoonify图像。相机唯一的工作,因为我不写表面来看(至少这是我的理解)。在$ p $的答案pviously提到有网站一些替代方法,但我不知道他在说什么。

BTW我已经尝试了所有的样本OpenCV4Android的应用程序,他们工作得很好。另外我使用OpenCV的版本2.4.3。 API级别目标为15。

完整logcat的:

  

12-22 15:33:07.966:I / CartoonifierApp(5999):实例化新类   com.Cartoonifier.CartoonifierApp 12-22 15:33:07.966:   I / CartoonifierApp(5999):所谓的onCreate 12-22 15:33:07.966:   I / CartoonifierApp(5999):试图加载OpenCV库12-22   15:33:07.982:I / Cartoonifier :: SurfaceView(5999):实例化新   类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 /助手(5999):服务连接创建12-22   15:33:08.099:D / OpenCVManager /助手(5999):试图让库路径   12-22 15:33:08.138:D / OpenCVManager /助手(5999):试图让   库列表12-22 15:33:08.169:D / OpenCVManager /助手(5999):库   列表:12-22 15:33:08.169:D / OpenCVManager /助手(5999):首先   试图加载库12-22 15:33:08.169:D / OpenCVManager /助手(5999):   试图初始化的OpenCV库12-22 15:33:08.169:   D / OpenCVManager /助手(5999):试图加载库   /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15:33:08.169:

     

D / dalvikvm(5999):试图加载LIB   /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

     

15:33:08.193:D / dalvikvm(5999):增加了共享库   /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

     

15:33:08.193:D / OpenCVManager /助手(5999):OpenCV的库的init是确定​​

     

12-22 15:33:08.193:D / OpenCVManager /助手(5999):第一次尝试   负载库即可12-22 15:33:08.193:D / OpenCVManager /助手(5999):初始化   完成了状态0 12-22 15:33:08.193:   D / OpenCVManager /助手(5999):33:08.200的服务12-22 15取消绑定:   D / OpenCVManager /助手(5999):使用回调12-22呼唤   15:33:08.200:I / CartoonifierApp(5999):OpenCV的成功加载

     

12-22 15:33:08.200:D / dalvikvm(5999):试图加载LIB   /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

     

15:33:08.200:D / dalvikvm(5999):增加了共享库   /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40 12-22

     

15:33:08.200:D / dalvikvm(5999):没有JNI_OnLoad中找到   /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40,   跳过INIT 12-22 15:33:08.200:D / OpenCVManager /助手(5999):   服务方面创造了12-22 15:33:08.200:   D / OpenCVManager /助手(5999):试图让库路径12-22

     

15:33:08.232:D / OpenCVManager /助手(5999):试图让库列表   12-22 15:33:08.271:D / OpenCVManager /助手(5999):库列表:

     

12-22 15:33:08.271:D / OpenCVManager /助手(5999):第一次尝试   负载库12-22 15:33:08.271:D / OpenCVManager /助手(5999):试图

     

初​​始化的OpenCV库12-22 15:33:08.271:D / OpenCVManager /助手(5999):   试图加载库   /data/data/org.opencv.engine/lib/libopencv_java.so 12-22 15:33:08.271:   D / dalvikvm(5999):试图加载LIB   /data/data/org.opencv.engine/lib/libopencv_java.so 0x41936a40 12-22

     

15:33:08.271:D / dalvikvm(5999):共享库   /data/data/org.opencv.engine/lib/libopencv_java.so中已经加载   同样的CL 0x41936a40 12-22 15:33:08.271:D / OpenCVManager /助手(5999):   OpenCV的库初始化是确定的! 12-22 15:33:08.271:   D / OpenCVManager /助手(5999):第一次尝试加载库是确定

     

12-22 15:33:08.271:D / OpenCVManager /助手(5999):初始化完成后,状态0   12-22 15:33:08.271:D / OpenCVManager /助手(5999):从服务解除绑定   12-22 15:33:08.271:D / OpenCVManager /助手(5999):使用回调调用   12-22 15:33:08.271:I / CartoonifierApp(5999):OpenCV的成功加载   12-22 15:33:08.279:D / dalvikvm(5999):试图加载LIB /data/data/com.Cartoonifier/lib/libcartoonifier.so 0x41936a40   12-22 15:33:08.279:D / dalvikvm(5999):共享库/data/data/com.Cartoonifier/lib/libcartoonifier.so已经装载在同一CL 0x41936a40   12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):surfaceCreated   12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):surfaceChanged()。窗口尺寸:1196x670   12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):setupCamera(1196x670)   12-22 15:33:08.302:I / Cartoonifier :: SurfaceView(5999):开始处理线程   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率1920×1080   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率1280×720   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率960x720   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率800×480   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率720×576   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率720×480   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):发现相机分辨率768X576   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率640×480   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率320×240   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率352×288   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率240x160   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率176×144   12-22 15:33:08.310:I / Cartoonifier :: SurfaceView(5999):找到摄像头分辨率128x96   12-22 15:33:08.318:I / Cartoonifier :: SurfaceView(5999):选的摄像头preVIEW尺寸:1280×720   12-22 15:33:08.333:D / dalvikvm(5999):GC_FOR_ALLOC释放131K,2%自由10807K / 11011K,暂停13毫秒,共13毫秒

     

12-22 15:33:08.333:I / dalvikvm堆(5999):成长堆(破片的情况下),以11.902MB为1382416字节分配

     

12-22 15:33:08.357:D / dalvikvm(5999):GC_CONCURRENT释放1K,免费12156K / 12423K 3%,暂停12毫秒+ 1毫秒,总24ms

     

12-22 15:33:08.357:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GC阻塞11毫秒

     

12-22 15:33:08.365:D / dalvikvm(5999):GC_FOR_ALLOC释放0K,3%的自由12156K / 12423K,暂停9ms的,总9ms的

     

12-22 15:33:08.372:I / dalvikvm堆(5999):成长堆(破片的情况下),以13.219MB为1382416字节分配

     

12-22 15:33:08.388:D / dalvikvm(5999):GC_CONCURRENT释放0K,免费13506K / 13831K 3%,暂停11毫秒+ 1毫秒,总21ms

     

12-22 15:33:08.388:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GC阻塞7毫秒

     

12-22 15:33:08.404:D / dalvikvm(5999):GC_FOR_ALLOC释放< 1K,免费13506K / 13831K,暂停9ms的3%,共为10ms

     

12-22 15:33:08.411:I / dalvikvm堆(5999):成长堆(破片的情况下),以16.735MB为3686416字节分配

     

12-22 15:33:08.427:D / dalvikvm(5999):GC_CONCURRENT释放< 1K,免费17106K / 17479K 3%,暂停12毫秒+ 1毫秒,共有22毫秒

     

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

     

12-22 15:33:08.443:D / dalvikvm(5999):GC_FOR_ALLOC释放< 1K,免费17106K / 17479K 3%,暂停10毫秒,10毫秒总

     

12-22 15:33:08.450:I / dalvikvm堆(5999):成长堆(破片的情况下),以20.250MB为3686416字节分配

     

12-22 15:33:08.466:D / dalvikvm(5999):GC_CONCURRENT释放0K,免费20706K / 21127K 2%,暂停12ms的+ 2ms的,共有22毫秒

     

12-22 15:33:08.466:D / dalvikvm(5999):WAIT_FOR_CONCURRENT_GC受阻5毫秒

     

12-22 15:33:08.466:I / Cartoonifier :: SurfaceView(5999):启动preVIEW

     

12-22 15:33:08.497:E / BufferQueue(5999):未命名-5999-0] setBufferCount:表面纹理已被放弃

     

12-22 15:33:08.505:E / Cartoonifier :: SurfaceView(5999):mCamera.start preVIEW()失败。

片段从CartoonifierApp.java显示我的修改

 私人BaseLoaderCallback mLoaderCallback =新BaseLoaderCallback(本){
    @覆盖
    公共无效onManagerConnected(INT状态){
        开关(状态){
            案例LoaderCallbackInterface.SUCCESS:
            {
                Log.i(TAG,OpenCV的加载成功);

                //之后(!)OpenCV的初始化加载机库
                的System.loadLibrary(cartoonifier);
            } 打破;
            默认:
            {
                super.onManagerConnected(状态);
            } 打破;
        }
    }
};

/ **第一次创建活动时调用。 * /
@覆盖
公共无效的onCreate(包savedInstanceState){
    Log.i(TAG,所谓的onCreate);
    super.onCreate(savedInstanceState);

    Log.i(TAG,试图加载OpenCV库);
    如果(!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3,这一点,mLoaderCallback))
    {
      Log.e(TAG,无法连接到OpenCV的经理);
    }

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    MVIEW =新CartoonifierView(本);
    的setContentView(MVIEW);

    //调用我们的onTouch()回调函数,每当用户触摸屏幕。
    mView.setOnTouchListener(本);
}


@覆盖
保护无效的onPause(){
    Log.i(TAG的onPause);
    super.onPause();
    mView.releaseCamera();
}

@覆盖
公共无效onResume()
{
    super.onResume();
    Log.i(TAG,onResume);
    如果(!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3,这一点,mLoaderCallback))
    {
      Log.e(TAG,无法连接到OpenCV的经理);
    }

    如果(!mView.openCamera()){
        AlertDialog广告=新AlertDialog.Builder(本).create();
        ad.setCancelable(假); //这个块的返回按钮
        ad.setMessage(致命错误:无法打开摄像头!);
        /*ad.setButton("OK,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface对话,诠释它){
                dialog.dismiss();
                完();
            }
        }); * /
        ad.show();
    }
}
 
Android 12 S 图形显示系统 BufferQueue的工作流程 八

解决方案

这个问题前一段时间被workarounded在OpenCV中。

不知道,如果它是应用程序或操作系统错误。现在的问题是用于可视化呼叫 Bitmap.createBitmap 分离表面纹理对象。

解决方法是修改setupCamera该基地的方法查看类和变更

 尝试{
    设置preVIEW();
}赶上(IOException异常E){
    Log.e(TAG,mCamera.set previewDisplay /套previewTexture失败:+ E);
}

/ *通知了preVIEW即将开始,并提供preVIEW尺寸* /
在previewStarted(params.get previewSize()宽,params.get previewSize()的高度。);
 

  / *通知了preVIEW即将开始,并提供preVIEW尺寸* /
在previewStarted(params.get previewSize()宽,params.get previewSize()的高度。);

尝试 {
    设置preVIEW();
}赶上(IOException异常E){
    Log.e(TAG,mCamera.set previewDisplay /套previewTexture失败:+ E);
}
 

(行的顺序被改变)

New to Android and OpenCV. Been trying to to implement code from new book, Mastering OpenCV with Practical Computer Vision Projects. The app basically renders cartoonified images on camera preview using OpenCV. You can touch the screen to save the cartoonified image.

Source code from authors is located here.

I made a small modification (see below) to CartoonifierApp.java file so that I can statically load the cartoonifier library with the OpenCV Manager app (the original code threw an UnsatisfiedLinkError).

The problem I'm facing is that when I load the app onto my Galaxy Nexus (Android 4.1.1) I get an empty black screen. My LogCat says:

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

I think it's a memory issue. I know the cpp code works because it runs fine by itself on my computer -- although rendering is slow on a relatively new laptop (Asus U46E).

I have no idea how to fix this. The only helpful advice I found was here. If I replace my setPreview method in CatoonifierVewBase.java

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

with

 mCamera.setPreviewDisplay(mHolder);

then what happens is the camera works like normal and I can save cartoonified images by touching the screen. Note that this is not exactly the desired outcome as I want to continually cartoonify image on camera preview. The camera is only working because I'm not writing to surface view (at least that's my understanding). The answer in the previously mentioned site has some workaround but I have no idea what he is talking about.

BTW I've tried all the sample OpenCV4Android apps and they work just fine. Also I'm using OpenCV version 2.4.3. API level target is 15.

Full 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 from CartoonifierApp.java showing my modification

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

解决方案

This issue was workarounded in OpenCV some time ago.

Not sure if it is application or OS bug. The problem is that call to Bitmap.createBitmap detaches SurfaceTexture object used for visualization.

The workaround was to modify the setupCamera method of the base View class and change

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

to

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

(the order of lines is changed)