cv::Exception: /build/master_pack-android/opencv/modules/core/src/matrix.cpp

Я пытаюсь разработать приложение для обнаружения объектов и отслеживания их, поэтому я просмотрел несколько статей и узнал, что BackgroundsubtractionMOG является наилучшим подходящим способом для достижения этой цели, и я пытаюсь сделать то же самое, в основном я могу загрузить OpenCv успешно, и в классе я получаю эту ошибку в строке Imgproc.erode(mFGMask, mGray, erodeElement);(разработанная ошибка:CvException [org.opencv.core.CvException: cv::Exception: /build/master_pack-android/opencv/modules/core/src/matrix.cpp:991: ошибка: (-215) dims <= 2 && step[0] > 0 в функции void cv::Mat::locateROI(cv::Size&, cv::Point&) const ]), поэтому, пожалуйста, помогите мне, как я могу пройти через это, спасибо заранее. Ниже мой код:

public class NewTestOwn extends Activity implements CameraBridgeViewBase.CvCameraViewListener2 {
    private static final String TAG = "NewTestOwn";
    private CameraBridgeViewBase mOpenCvCameraView;
    private Mat mGray;
    private Mat mRgb;
    private Mat mFGMask;
    private List<MatOfPoint> contours;
    private double lRate = 0.5;

    private BackgroundSubtractorMOG sub;

    /**
     * Called when the activity is first created.
     */
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS: {
                    Log.i(TAG, "OpenCV loaded successfully");
                    mOpenCvCameraView.enableView();
                }
                break;
                default: {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.new_test_own);
        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.HelloOpenCvView);
        mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);

    }

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

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

    public void onCameraViewStarted(int width, int height) {
        //creates a new BackgroundSubtractorMOG class with the arguments
        sub = new BackgroundSubtractorMOG(3, 4, 0.8, 0.5);

        //creates matrices to hold the different frames
        mRgb = new Mat();
        mFGMask = new Mat();
        mGray = new Mat();

        //arraylist to hold individual contours
        contours = new ArrayList<MatOfPoint>();
    }

    public void onCameraViewStopped() {
    }

    public Mat onCameraFrame(CameraBridgeViewBase.CvCameraViewFrame inputFrame) {

        contours.clear();
        //gray frame because it requires less resource to process
        mGray = inputFrame.gray();
        //this function converts the gray frame into the correct RGB format for the BackgroundSubtractorMOG apply function
        Imgproc.cvtColor(mGray, mRgb, Imgproc.COLOR_GRAY2RGB);

        //apply detects objects moving and produces a foreground mask
        //the lRate updates dynamically dependent upon seekbar changes
        sub.apply(mRgb, mFGMask, lRate);

//        //erode and dilate are used  to remove noise from the foreground mask
//        Imgproc.erode(mFGMask, mFGMask, new Mat());
//        Imgproc.dilate(mFGMask, mFGMask, new Mat());

        Mat dilateElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(24, 24));
        Mat erodeElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(12, 12));

        Imgproc.erode(mFGMask, mGray, erodeElement);
        Imgproc.erode(mFGMask, mGray, erodeElement);

        Imgproc.dilate(mFGMask, mGray, dilateElement);
        Imgproc.dilate(mFGMask, mGray, dilateElement);

        //drawing contours around the objects by first called findContours and then calling drawContours
        //RETR_EXTERNAL retrieves only external contours
        //CHAIN_APPROX_NONE detects all pixels for each contour
        Imgproc.findContours(mFGMask, contours, new Mat(), Imgproc.RETR_EXTERNAL , Imgproc.CHAIN_APPROX_NONE);

        //draws all the contours in red with thickness of 2
        Imgproc.drawContours(mRgb, contours, -1, new Scalar(255, 0, 0), 2);


        return inputFrame.rgba();
    }
    public void onResume()
    {
        super.onResume();
        OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
    }
}

0 ответов

Другие вопросы по тегам