使用JavaCameraView的自定义类会使应用程序崩溃

使用JavaCameraView的自定义类会使应用程序崩溃,java,android,opencv,android-camera,opencv4android,Java,Android,Opencv,Android Camera,Opencv4android,我正在使用OpenCV for android,我正在尝试设置自定义帧速率。好的,现在我正在尝试设置帧速率的范围。我还试图设置自定义分辨率 我正在学习openCV教程3“摄影机控制”。当我开始在我的设备上运行应用程序时,应用程序正在崩溃。我正在使用Nexus 7 2013平板电脑 以下是我的代码: public class Tutorial2Activity extends Activity implements CvCameraViewListener2 { private stat

我正在使用OpenCV for android,我正在尝试设置自定义帧速率。好的,现在我正在尝试设置帧速率的范围。我还试图设置自定义分辨率

我正在学习openCV教程3“摄影机控制”。当我开始在我的设备上运行应用程序时,应用程序正在崩溃。我正在使用Nexus 7 2013平板电脑

以下是我的代码:

public class Tutorial2Activity extends Activity implements CvCameraViewListener2

{
    private static final String    TAG = "OCVSample::Activity";

    private static final int       VIEW_MODE_RGBA     = 0;
    private static final int       VIEW_MODE_GRAY     = 1;
    private static final int       VIEW_MODE_CANNY    = 2;
    private static final int       VIEW_MODE_FEATURES = 5;

    private int                    mViewMode;
    private Mat                    mRgba;
    private Mat                    mIntermediateMat;
    private Mat                    mGray;

    private MenuItem               mItemPreviewRGBA;
    private MenuItem               mItemPreviewGray;
    private MenuItem               mItemPreviewCanny;
    private MenuItem               mItemPreviewFeatures;

    private CustomizeCameraView   mOpenCvCameraView;
    private List<Size> mResolutionList;

    private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    Log.i(TAG, "OpenCV loaded successfully");

                    // Load native library after(!) OpenCV initialization
                    System.loadLibrary("mixed_sample");

                    mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };

    public Tutorial2Activity() {
        Log.i(TAG, "Instantiated new " + this.getClass());
    }


    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.tutorial2_surface_view);

        mOpenCvCameraView = (CustomizeCameraView) findViewById(R.id.tutorial2_activity_surface_view);
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        Log.i(TAG, "called onCreateOptionsMenu");
        mItemPreviewRGBA = menu.add("Preview RGBA");
        mItemPreviewGray = menu.add("Preview GRAY");
        mItemPreviewCanny = menu.add("Canny");
        mItemPreviewFeatures = menu.add("Find features");



        return true;
    }

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

    @Override
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
    }

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

    public void onCameraViewStarted(int width, int height) {
        mRgba = new Mat(height, width, CvType.CV_8UC4);
        mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
        mGray = new Mat(height, width, CvType.CV_8UC1);

        mResolutionList = mOpenCvCameraView.getResolutionList();


        int mFrameWidth = (int) mResolutionList.get(7).width;
        int mFrameHeight = (int) mResolutionList.get(7).height;

        mOpenCvCameraView.setResolution(mFrameHeight,mFrameWidth);
        //mOpenCvCameraView.setPreviewFPS(1000, 31000);


    }

    public void onCameraViewStopped() {
        mRgba.release();
        mGray.release();
        mIntermediateMat.release();

    }

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

        return inputFrame.rgba();
    }

    public boolean onOptionsItemSelected(MenuItem item) {
        Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);

        if (item == mItemPreviewRGBA) {
            mViewMode = VIEW_MODE_RGBA;
        } else if (item == mItemPreviewGray) {
            mViewMode = VIEW_MODE_GRAY;
        } else if (item == mItemPreviewCanny) {
            mViewMode = VIEW_MODE_CANNY;
        } else if (item == mItemPreviewFeatures) {
            mViewMode = VIEW_MODE_FEATURES;
        }

        return true;
    }

    public native void FindFeatures(long matAddrGr, long matAddrRgba);
}
我找到了解决办法

问题出在我的布局文件上。我插入了用于视频显示的标记,以便直接使用JavaCameraView,而不是使用继承自JavaCameraView的类

问题:

< org.opencv.JavaCameraView />

更正:

< "package_name"."Class_name_that_you_inherited_from_JavaCameraView" />
<“包名”。“您从JavaCameraView继承的类名”/>
我希望它能帮助其他人:)

< org.opencv.JavaCameraView />
< "package_name"."Class_name_that_you_inherited_from_JavaCameraView" />