当前位置: 首页 > 知识库问答 >
问题:

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

慕容宇
2023-03-14

Android和OpenCV的新版本。正在尝试实现新书中的代码,用实际的计算机视觉项目掌握OpenCV。这个应用程序基本上是用OpenCV在相机预览中渲染卡通化的图像。你可以触摸屏幕来保存卡通化的图像。

来自作者的源代码位于此处。

我对CartoonifierApp.java文件做了一个小修改(见下文),这样我就可以用OpenCV Manager应用程序静态加载cartoonifier库(原始代码抛出了一个UnsatisfiedLinkError)。

我不知道怎么解决这个问题。我找到的唯一有用的建议就是这里。如果我在catoonifiervewbase.java中替换我setPreview方法

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

 mCamera.setPreviewDisplay(mHolder);

然后发生的是相机工作正常,我可以通过触摸屏幕保存卡通化的图像。注意,这不完全是期望的结果,因为我想要连续卡通图像在相机预览。相机是工作的,因为我不是写的表面视图(至少这是我的理解)。在前面提到的网站的答案有一些变通办法,但我不知道他在说什么。

15:33:08.193:d/OpenCvManager/Helper(5999):OpenCV库初始化正常!

12-22 15:33:08.193:D/OpenCvManager/Helper(5999):第一次尝试加载库成功12-22 15:33:08.193:D/OpenCvManager/Helper(5999):已完成初始化,状态为0 12-22 15:33:08.193:D/OpenCvManager/Helper(5999):取消与服务的绑定12-22 15:33:08.200:D/OpenCvManager/Helper(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):添加共享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,跳过init 12-22 15:33:08.200:D/OpenCvManager/Helper(5999):创建服务连接12-22 15:33:08.200:D/OpenCvManager/Helper(5999):尝试获取库路径12-22

15:33:08.232:d/OpenCvManager/Helper(5999):尝试获取库列表12-22 15:33:08.271:d/OpenCvManager/Helper(5999):库列表:“”

12-22 15:33:08.271:D/OpenCvManager/Helper(5999):第一次尝试加载库12-22 15:33:08.271:D/OpenCvManager/Helper(5999):尝试

init OpenCV libs 12-22 15:33:08.271:d/OpenCvManager/helper(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/helper(5999):OpenCV库初始化正常!12-22 15:33:08.271:D/OpenCvManager/Helper(5999):第一次尝试加载库可以

12-22 15:33:08.333:I/dalvikvm-heap(5999):将堆(frag大小写)增长到11.902MB,以分配1382416字节

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

12-22 15:33:08.357:D/DalvikVM(5999):WAIT_FOR_CONCURRENT_GC阻塞11ms

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-heap(5999):将堆(frag大小写)增长到13.219MB,用于1382416字节分配

12-22 15:33:08.388:D/DalvikVM(5999):WAIT_FOR_CONCURRENT_GC阻塞7ms

12-22 15:33:08.404:D/DalvikVM(5999):GC_FOR_ALLOC释放<1K,3%释放13506K/13831K,暂停9ms,总计10ms

12-22 15:33:08.411:I/dalvikvm-heap(5999):将堆(frag大小写)增长到16.735MB,用于3686416字节分配

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,3%释放17106K/17479K,暂停10ms,总计10ms

12-22 15:33:08.450:I/dalvikvm-heap(5999):将堆(frag大小写)增长到20.250MB,用于3686416字节分配

12-22 15:33:08.466:D/DalvikVM(5999):WAIT_FOR_CONCURRENT_GC阻塞5ms

12-22 15:33:08.466:I/Cartoonifier::SurfaceView(5999):开始预览

12-22 15:33:08.497:E/BufferQueue(5999):[unnamed-5999-0]SetBufferCount:SurfaceTexture已放弃!

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

共有1个答案

张晔
2023-03-14

这个问题已经在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);
}
 类似资料:
  • 我有一个在Tomcat 9中运行的程序。 当我重新启动该问题时,它显示了上述警告: Tomcat版本: Tomcat 9 JVM: java-8-openjdk-amd64 MySQL驱动程序: mysql连接器-java-8.0.20 服务器xml 我已经试着把server.xml变成 但是Catalina.out.仍然有警告 有解决这个问题的指南吗? 非常感谢。

  • 这是我的全部剧本 运行时产生: 我刚刚经历了更新的一切: 壁虎河:0.29.0 我已经搜索了几个关于同一个错误的问题,但仍然完全不知道这里的问题是什么。我几乎什么都没做。这是Selenium Python的开始示例,或者至少是开始示例的开始。

  • 这是我的代码,意味着在 youtube 上进行搜索测试,但是当我运行它时,youtube 打开并收到一条错误消息,说“弃用警告:executable_path已被弃用,请传入服务对象。我的chromedriver与我的python文件位于同一文件夹中。

  • 问题内容: 我试图通过发送一个整数,但我不断收到此错误 表达已弃用的res.send(status):改用res.sendStatus(status) 我没有发送状态,我的代码是 问题答案: 您可以尝试以下方法: 伙计们是正确的- 它不允许数字。证明链接:http://expressjs.com/4x/api.html#res.send

  • deprecated:mysql_connect():mysql扩展不推荐使用,以后将删除:在/home/website/public_html/wp-includes/wp-db.php第1568行中使用mysqli或PDO 警告:不能修改标题信息--标题已经由第1195行/home/website/public_html/wp-includes/pluggable.php中的/home/web

  • cmake-d cmake_build_type=release-d cmake_install_prefix=/usr/local-d with_tbb=on-d build_new_python_support=on-d with_v4l=on-d install_c_examples=on-d install_python_examples=on-d build_examples=on-d