Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了OpenCV / Android BufferQueue错误:表面纹理已被放弃大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Android和OpenCV的新功能.一直在努力实施新书中的代码,掌握OpenCV与实用计算机视觉项目.该应用程序基本上使用OpenCV在相机预览上呈现卡通化图像.您可以触摸屏幕以保存卡通图像.

作者的源代码位于here.

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

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

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

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

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

@H_165_12@mCamera.setPreviewDisplay(mHolder);

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

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

完整Logcat:

来自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);
}

(线的顺序改变了)

大佬总结

以上是大佬教程为你收集整理的OpenCV / Android BufferQueue错误:表面纹理已被放弃全部内容,希望文章能够帮你解决OpenCV / Android BufferQueue错误:表面纹理已被放弃所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。