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

Android和OpenCV的新功能.一直在努力实施新书中的代码,掌握OpenCV与实用计算机视觉项目.该应用程序基本上使用OpenCV在相机预览上呈现卡通化图像.您可以触摸屏幕以保存卡通图像.

作者的源代码位于here.

我对CartoonifierApp.java文件进行了一些小修改(见下文),以便我可以使用OpenCV Manager应用程序静态加载漫画器库(原始代码抛出了UnsatisfiedLinkError).

我面临的问题是当我将应用程序加载到我的Galaxy Nexus(Android 4.1.1)上时,我得到一个空的黑屏.我的LogCat说:

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

我认为这是一个记忆问题.我知道cpp代码可以工作,因为它在我的计算机上运行良好 – 虽然在相对较新的笔记本电脑(华硕U46E)上渲染很慢.

我不知道如何解决这个问题.我找到的唯一有用的建议是here.如果我在CatoonifierVewBase.java中替换我的setPreview方法

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

mCamera.setPreviewDisplay(mHolder);

然后发生的事情是相机正常工作,我可以通过触摸屏幕保存卡通图像.请注意,这并不是理想的结果,因为我想在相机预览上不断地对图像进行漫画.相机只是工作,因为我没有写到表面视图(至少这是我的理解).前面提到的site中的答案有一些解决方法,但我不知道他在说什么.

顺便说一句,我已经尝试了所有OpenCV4Android应用程序示例,它们的工作正常.我也在使用OpenCV版本2.4.3. API级别目标是15.

完整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: 1196×670
12-22 15:33:08.302: I/Cartoonifier::SurfaceView(5999): setupCamera(1196×670)
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 1920×1080
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 1280×720
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 960×720
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 800×480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 720×576
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 720×480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 768×576
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 640×480
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 320×240
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 352×288
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 240×160
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 176×144
12-22 15:33:08.310: I/Cartoonifier::SurfaceView(5999): Found Camera Resolution 128×96
12-22 15:33:08.318: I/Cartoonifier::SurfaceView(5999): Chosen Camera Preview Size: 1280×720
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,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,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,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,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

来自CartoonifierApp.java的片段显示我的修改

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

解决方法

这个问题不久前在OpenCV中得到了解决.

不确定它是应用程序还是操作系统错误.问题是调用Bitmap.createBitmap会分离用于可视化的SurfaceTexture对象.

解决方法是修改基本View类的setupCamera方法并进行更改

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

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

(线的顺序改变了)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


更新Android SDK到3.0版本时,遇到Failed to rename directory E:\android\tools to E:\android\temp\ToolPackage.old01问题,导致无法更新,出现该问题的原因是由于3.0版本与较早的sdk版本之间文件结构有冲突,解决
Android 如何解决dialog弹出时无法捕捉Activity的back事件 在一些情况下,我们需要捕捉back键事件,然后在捕捉到的事件里写入我们需要进行的处理,通常可以采用下面三种办法捕捉到back事件: 1)重写onKeyDown或者onKeyUp方法 2)重写onBackPressed方
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法。一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawable
Android中的&quot;Unable to start activity ComponentInfo&quot;的错误 最近在做一款音乐播放器的时候,然后在调试的过程中发现一直报这个错误&quot;Unable to start activity ComponentInfo&quot;,从字面
Android 关于长按back键退出应用程序的实现最近在做一个Android上的应用,碰到一个问题就是如何实现长按back键退出应用程序。在网上查找了很多资料,发现几乎没有这样的实现,大部分在处理时是双击back键来退出应用程序。参考了一下双击back键退出应用程序的代码,网上主流的一种方法是下面
android自带的时间选择器只能精确到分,但是对于某些应用要求选择的时间精确到秒级,此时只有自定义去实现这样的时间选择器了。下面介绍一个可以精确到秒级的时间选择器。 先上效果图: 下面是工程目录: 这个控件我也是用的别人的,好像是一个老外写的,com.wheel中的WheelView是滑动控件的主
Android平台下利用zxing实现二维码开发 现在走在大街小巷都能看到二维码,而且最近由于项目需要,所以研究了下二维码开发的东西,开源的二维码扫描库主要有zxing和zbar,zbar在iPos平台上应用比较成熟,而在Android平台上主流还是用zxing库,因此这里主要讲述如何利用zxing
Android ListView的item背景色设置以及item点击无响应等相关问题 在Android开发中,listview控件是非常常用的控件,在大多数情况下,大家都会改掉listview的item默认的外观,下面讲解以下在使用listview时最常见的几个问题。1.如何改变item的背景色和按
如何向Android模拟器中导入含有中文名称的文件在进行Android开发的时候,如果需要向Android模拟器中导入文件进行测试,通过DDMS下手动导入或者在命令行下通过adb push命令是无法导入含有中文文件名的文件的。后来发现借用其他工具可以向模拟器中导入中文名称的文件,这个工具就是Ultr
Windows 下搭建Android开发环境一.下载并安装JDK版本要求JDK1.6+,下载JDK成功后进行安装,安装好后进行环境变量的配置【我的电脑】-——&gt;【属性】——&gt;【高级】 ——&gt;【环境变量】——&gt;【系统变量】中点击【新建】:变量名:CLASSPATH变量值:……
如何利用PopupWindow实现弹出菜单并解决焦点获取以及与软键盘冲突问题 在android中有时候可能要实现一个底部弹出菜单,此时可以考虑用PopupWindow来实现。下面就来介绍一下如何使用PopupWindow实现一个弹出窗。 主Activity代码:public void onCreat
解决Android中的ERROR: the user data image is used by another emulator. aborting的方法 今天调试代码的时候,突然出现这个错误,折腾了很久没有解决。最后在google上找到了大家给出的两种解决方案,下面给出这两种方法的链接博客:ht
AdvserView.java package com.earen.viewflipper; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory;
ImageView的scaleType的属性有好几种,分别是matrix(默认)、center、centerCrop、centerInside、fitCenter、fitEnd、fitStart、fitXY。 |值|说明| |:--:|:--| |center|保持原图的大小,显示在ImageVie
文章浏览阅读8.8k次,点赞9次,收藏20次。本文操作环境:win10/Android studio 3.21.环境配置 在SDK Tools里选择 CMAKE/LLDB/NDK点击OK 安装这些插件. 2.创建CMakeLists.txt文件 在Project 目录下,右键app,点击新建File文件,命名为CMakeLists.txt点击OK,创建完毕! 3.配置文件 在CMa..._link c++ project with gradle
文章浏览阅读1.2w次,点赞15次,收藏69次。实现目的:由mainActivity界面跳转到otherActivity界面1.写好两个layout文件,activity_main.xml和otherxml.xmlactivity_main.xml&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;RelativeLayout ="http://schemas..._android studio 界面跳转
文章浏览阅读3.8w次。前言:最近在找Android上的全局代理软件来用,然后发现了这两款神作,都是外国的软件,而且都是开源的软件,因此把源码下载了下来,给有需要研究代理这方面的童鞋看看。不得不说,国外的开源精神十分浓,大家相互使用当前基础的开源软件,然后组合成一个更大更强的大开源软件。好吧,废话不多说,下面简单介绍一下这两款开源项目。一、ProxyDroid:ProxyDroid功能比较强大,用到的技术也比较多,源码也_proxydroid
文章浏览阅读2.5w次,点赞17次,收藏6次。创建项目后,运行项目时Gradle Build 窗口却显示错误:程序包R不存在通常情况下是不会出现这个错误的。我是怎么遇到这个错误的呢?第一次创建项目,company Domain我使用的是:aven.com,但是创建过程在卡在了Building 'Calculator' Gradle Project info这个过程中,于是我选择了“Cancel”第二次创建项目,我还是使用相同的项目名称和项目路_r不存在
文章浏览阅读8.9w次,点赞4次,收藏43次。前言:在Android上使用系统自带的代理,限制灰常大,仅支持系统自带的浏览器。这样像QQ、飞信、微博等这些单独的App都不能使用系统的代理。如何让所有软件都能正常代理呢?ProxyDroid这个软件能帮你解决!使用方法及步骤如下:一、推荐从Google Play下载ProxyDroid,目前最新版本是v2.6.6。二、对ProxyDroid进行配置(基本配置:) (1) Auto S_proxydroid使用教程
文章浏览阅读1.1w次,点赞4次,收藏17次。Android Studio提供了一个很实用的工具Android设备监视器(Android device monitor),该监视器中最常用的一个工具就是DDMS(Dalvik Debug Monitor Service),是 Android 开发环境中的Dalvik虚拟机调试监控服务。可以进行的操作有:为测试设备截屏,查看特定进程中正在运行的线程以及堆栈信息、Logcat、广播状态信息、模拟电话_安卓摄像头调试工具