【发布时间】:2016-05-30 19:29:59
【问题描述】:
我正在尝试在 opencv 中隐藏 android 相机预览。我正在将 opencv3.1.0 用于带有 xamarin c# 的 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;
}
}
}
非常感谢。
【问题讨论】:
-
你能发布你当前的代码吗?
-
@Giorgi 我添加了我的活动和视图。谢谢
标签: java android opencv xamarin opencv4android