Использование пользовательского класса для JavaCameraView приводит к сбою приложения

Я использую OpenCV для 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
 public class CustomizeCameraView extends JavaCameraView{

    public CustomizeCameraView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

     //@SuppressWarnings("deprecation")
    public void setPreviewFPS(double  min, double max){
            Camera.Parameters params = mCamera.getParameters();
            params.setPreviewFpsRange((int)(min*1000), (int)(max*1000));
            //params.setPreviewFrameRate(min);
            mCamera.setParameters(params);
           // mCamera.getSupportedPreviewFpsRange();
        }

     public List<Size> getResolutionList() {
         return mCamera.getParameters().getSupportedPreviewSizes();
          // return mCamera.getParameters().getPictureSize();
        }

     public void setResolution(int h,int w){
         Camera.Parameters params = mCamera.getParameters();
         params.setPreviewSize(mFrameWidth, mFrameHeight);
            mCamera.setParameters(params); // mCamera is a Camera object

     }

     public Size getResolution() {
            return mCamera.getParameters().getPreviewSize();
        }
}
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

 public class CustomizeCameraView extends JavaCameraView{

    public CustomizeCameraView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

     //@SuppressWarnings("deprecation")
    public void setPreviewFPS(double  min, double max){
            Camera.Parameters params = mCamera.getParameters();
            params.setPreviewFpsRange((int)(min*1000), (int)(max*1000));
            //params.setPreviewFrameRate(min);
            mCamera.setParameters(params);
           // mCamera.getSupportedPreviewFpsRange();
        }

     public List<Size> getResolutionList() {
         return mCamera.getParameters().getSupportedPreviewSizes();
          // return mCamera.getParameters().getPictureSize();
        }

     public void setResolution(int h,int w){
         Camera.Parameters params = mCamera.getParameters();
         params.setPreviewSize(mFrameWidth, mFrameHeight);
            mCamera.setParameters(params); // mCamera is a Camera object

     }

     public Size getResolution() {
            return mCamera.getParameters().getPreviewSize();
        }
}

и вывод logcat выглядит следующим образом:

05-23 14:27:18.192: E/AndroidRuntime(29339): FATAL EXCEPTION: main
05-23 14:27:18.192: E/AndroidRuntime(29339): Process: org.opencv.samples.tutorial2, PID: 29339
05-23 14:27:18.192: E/AndroidRuntime(29339): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.opencv.samples.tutorial2/org.opencv.samples.tutorial2.Tutorial2Activity}: java.lang.ClassCastException: org.opencv.android.JavaCameraView cannot be cast to org.opencv.samples.tutorial2.CustomizeCameraView

person affan_rafique    schedule 23.05.2015    source источник


Ответы (1)


я нашел решение

проблема была с моим файлом макета. я вставил тег для отображения видео для прямого использования JavaCameraView вместо использования унаследованного класса от JavaCameraView

проблема:

< org.opencv.JavaCameraView />

исправлено:

< "package_name"."Class_name_that_you_inherited_from_JavaCameraView" />

я надеюсь, что это поможет другим :)

person affan_rafique    schedule 24.05.2015