简体   繁体   English

Opencv 3.1.0 Android隐藏相机预览

[英]Opencv 3.1.0 Android Hide Camera Preview

I am trying to hide android camera preview in opencv. 我试图在opencv中隐藏android摄像机预览。 I am using opencv3.1.0 for android(java binding library) with xamarin c#. 我正在使用xamarin c#将opencv3.1.0用于android(java绑定库)。 I look up all questions here but i couldt do this. 我在这里查找所有问题,但我不能这样做。 In my view I have org.opencv.android.JavaCameraView in my Activity onCreate method I get it with CameraBridgeViewBase if I change visibility of it to GONE or Invisible, OnCameraFrame method is not firing. 在我看来,我的Activity onCreate方法中具有org.opencv.android.JavaCameraView。如果将其可见性更改为GONE或Invisible,则可以通过CameraBridgeViewBase获取它,而不会触发OnCameraFrame方法。 And If I return null in OnCameraFrame method it is working preview is not showing but other components in view(textview,button) not showing too. 而且,如果我在OnCameraFrame方法中返回null,则正在工作的预览未显示,但视图(文本视图,按钮)中的其他组件也未显示。 I need to hide camera preview but still receive preview callback with opencv4android. 我需要隐藏相机预览,但仍会使用opencv4android接收预览回调。

In My View 在我看来

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

 <org.opencv.android.JavaCameraView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/game_screen_surface_view" />
    <TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/game_screen_text_view" />
</LinearLayout>

In My Activity 在我的活动中

 [Activity(Label = "GameActivity")]
public class GameActivity : Activity, CameraBridgeViewBase.ICvCameraViewListener2
{
    private CameraBridgeViewBase mOpenCvCameraView;
    private Mat mIntermediateMat;
    private TextView _wordText;
    private Callback mLoaderCallback;
    private int tryCount = 15;
    private int currentTry = 0;
    private int circleCount = 0;
    Dictionary<int, char> letters = new Dictionary<int, char>();
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Window.AddFlags(WindowManagerFlags.KeepScreenOn);
        SetContentView(Resource.Layout.game_screen);

        mOpenCvCameraView = FindViewById<CameraBridgeViewBase>(Resource.Id.game_screen_surface_view);
        _wordText = FindViewById<TextView>(Resource.Id.game_screen_text_view);
        mOpenCvCameraView.Visibility = ViewStates.Visible;//If set GONE or Invisible OnCameraFrame Method not firing

        mOpenCvCameraView.SetCvCameraViewListener2(this);
        mLoaderCallback = new Callback(this, mOpenCvCameraView);

    }


    protected override void OnPause()
    {
        base.OnPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.DisableView();
    }

    protected override void OnResume()
    {
        base.OnResume();
        if (!OpenCVLoader.InitDebug())
        {
            OpenCVLoader.InitAsync(OpenCVLoader.OpencvVersıon300, this, mLoaderCallback);
        }
        else
        {
            mLoaderCallback.OnManagerConnected(LoaderCallbackInterface.Success);
        }


    }

    protected override void OnDestroy()
    {
        base.OnDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.DisableView();
    }


    public Mat OnCameraFrame(CameraBridgeViewBase.ICvCameraViewFrame inputFrame)
    {

        Mat rgba = inputFrame.Rgba();
        Mat mat = rgba;
        //some opengl code.

        return mat;  //If I return null preview is not showing but If ay add button to view it is not showing too
    }

    public void OnCameraViewStarted(int width, int height)
    {
        mIntermediateMat = new Mat();

    }

    public void OnCameraViewStopped()
    {
        // Explicitly deallocate Mats
        if (mIntermediateMat != null)
            mIntermediateMat.Release();

        mIntermediateMat = null;
    }

    private char GetLetter(int r = 0, int g = 0, int b = 0)
    {
        return letters[getEqualofRGB(0, 0, 2)];
    }

}

class Callback : BaseLoaderCallback
{
    private readonly CameraBridgeViewBase mOpenCvCameraView;
    public Callback(Context context, CameraBridgeViewBase cameraView)
        : base(context)
    {
        mOpenCvCameraView = cameraView;
    }

    public override void OnManagerConnected(int status)
    {
        switch (status)
        {
            case LoaderCallbackInterface.Success:
                {
                    mOpenCvCameraView.EnableView();
                }
                break;
            default:
                {
                    base.OnManagerConnected(status);
                }
                break;
        }
    }
}

Thanks a lot. 非常感谢。

You can set your preview (in this case a CameraBridgeViewBase ) transparent by setting the alpha value of the view, with 0 being completely invisible. 您可以通过设置视图的Alpha值将预览(在本例中为CameraBridgeViewBase )设置为透明,而0则完全不可见。

mOpenCvCameraView.setAlpha(0);

This should make your preview "disappear". 这将使您的预览“消失”。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM