У меня есть приложение в 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.