首页 > 解决方案 > 在 OpenCV Camera Android Fragment 中未调用 onCameraFrame 函数

问题描述

我在 Android 中有一个应用程序,它使用 OpenCV CvCameraViewListener2 来访问 Android 相机。当我从 MainActivity 实现 CvCameraViewListener2 时,此应用程序运行良好,并且我能够看到我的相机的输出。但是,当我从片段实现 CvCameraViewListener2 时,即使没有错误消息并且正在找到 OpenCV 库,也不会调用 onCameraFrame。

片段代码:

public class FdActivity extends Fragment implements CvCameraViewListener2
{
    private static final String TAG = "CameraViewFragment";
    private CameraBridgeViewBase mOpenCvCameraView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState)
    {
        View rootView = inflater.inflate(R.layout.fragment_fd_activity,
                container, false);

        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_FULLSCREEN);

        getActivity().setContentView(R.layout.fragment_fd_activity);

        mOpenCvCameraView = (CameraBridgeViewBase) getActivity().findViewById(R.id.fd_activity_surface_view);
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);

        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, getActivity(), mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
        return rootView;
    }

    public FdActivity()
    {
        // TODO Auto-generated constructor stub
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if (mOpenCvCameraView != null)
            mOpenCvCameraView.disableView();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, getActivity(), mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }

    }

    @Override
    public void onCameraViewStarted(int width, int height)
    {
        // TODO Auto-generated method stub

    }

    @Override
    public void onCameraViewStopped()
    {
        // TODO Auto-generated method stub

    }

    @Override
    public Mat onCameraFrame(CvCameraViewFrame inputFrame)
    {
        // TODO Auto-generated method stub
        Log.d(TAG, "got here");
        Log.d(TAG, Integer.toString(inputFrame.rgba().channels()));
        return inputFrame.rgba();
    }

    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(getActivity())
    {
        @Override
        public void onManagerConnected(int status)
        {
            switch (status)
            {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded Successfully");
                    //System.loadLibrary("native-lib");
                    mOpenCvCameraView.enableView();
                }
                break;
                default:
                {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };

}

对应的XML代码:

<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:id="@+id/fd_activity_surface_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:visibility="gone" />


</LinearLayout>

我不确定为什么片段代码不起作用,即使在 Activity 中完成完全相同的事情也是如此。

标签: androidopencvandroid-fragmentsopencv4android

解决方案


推荐阅读