[英]Opencv 3.1.0 Android Hide Camera Preview
我试图在opencv中隐藏android摄像机预览。 我正在使用xamarin c#将opencv3.1.0用于android(java绑定库)。 我在这里查找所有问题,但我不能这样做。 在我看来,我的Activity onCreate方法中具有org.opencv.android.JavaCameraView。如果将其可见性更改为GONE或Invisible,则可以通过CameraBridgeViewBase获取它,而不会触发OnCameraFrame方法。 而且,如果我在OnCameraFrame方法中返回null,则正在工作的预览未显示,但视图(文本视图,按钮)中的其他组件也未显示。 我需要隐藏相机预览,但仍会使用opencv4android接收预览回调。
在我看来
<?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>
在我的活动中
[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;
}
}
}
非常感谢。
您可以通过设置视图的Alpha值将预览(在本例中为CameraBridgeViewBase
)设置为透明,而0则完全不可见。
mOpenCvCameraView.setAlpha(0);
这将使您的预览“消失”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.