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);
}
}