Функция onCameraFrame не вызывается в OpenCV Camera Android Fragment - PullRequest
0 голосов
/ 12 апреля 2020

У меня есть приложение в Android, которое использует OpenCV CvCameraViewListener2 для доступа к Android камере. Это приложение работает нормально, когда я реализую CvCameraViewListener2 из своей функции MainActivity, и я могу видеть выходные данные моей камеры. Однако, когда я реализую CvCameraViewListener2 из фрагмента, onCameraFrame не вызывается, даже несмотря на отсутствие сообщений об ошибках и обнаружение библиотек OpenCV.

Код фрагмента:

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.

...