cv::erode causes error: OpenCV Error: Assertion failed (m.dims >= 2) in Mat

cv::erode causes error: OpenCV Error: Assertion failed (m.dims >= 2) in Mat

所以我正在使用 cvBlob 和背景减法库。当我处理我的图像并得到蒙版时,我会尝试腐蚀和膨胀它。

我尝试腐蚀图像时出现错误。这是错误:

OpenCV Error: Assertion failed (m.dims >= 2) in Mat, file /home/opencv-3.0.0/modules/core/src/matrix.cpp, line 441
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/opencv-3.0.0/modules/core/src/matrix.cpp:441: error: (-215) m.dims >= 2 in function Mat

Aborted (core dumped)

这是我的代码。

using namespace cv;
using namespace std;
int keyboard; //input from keyboard

int main(int argc, char **argv)
{
IBGS *bgs;

BlobTracking* blobTracking;
blobTracking = new BlobTracking();

bgs = new FrameDifferenceBGS;

Mat img_input;
Mat img_blob;

//create the capture object
VideoCapture capture(argv[1]);

if(!capture.isOpened()){
    //error in opening the video input
    cerr << "Unable to open video file: " << argv[1] << endl;
    exit(EXIT_FAILURE);
}

//read input data. ESC or 'q' for quitting
while( (char)keyboard != 'q' && (char)keyboard != 27 ){
    //read the current frame
    if(!capture.read(img_input)) {
        cerr << "Unable to read next frame." << endl;
        cerr << "Exiting..." << endl;
        exit(EXIT_FAILURE);
    }

    cv::Mat img_mask;
    cv::Mat img_bkgmodel;

    // by default, it shows automatically the foreground mask image
    bgs->process(img_input, img_mask, img_bkgmodel);

    cv::Mat img_mask_erode_and_dilate;
    int erosion_size=3;

    cv::Mat element = cv::getStructuringElement( cv::MORPH_RECT,
                                           cv::Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                                           cv::Point( erosion_size, erosion_size ) );

    // Erode the frame
    cv::erode(img_mask, img_mask_erode_and_dilate, element);

    // Dilate the frame
    cv::dilate(img_mask, img_mask_erode_and_dilate, element);

    // Show before and after dilate and erode
    cv::imshow("Frame Before Erode or Dilate", img_mask);
    cv::imshow("Frame AFTER Erode and Dilate", img_mask_erode_and_dilate

    //get the input from the keyboard
    keyboard = waitKey( 30 );
}

//delete capture object
capture.release();

delete bgs;

cvDestroyAllWindows();

return 0;

}

如果我使用原始帧而不是处理后的帧,那么一切都可以。我怀疑背景减法算法返回的灰度图像有问题

该错误告诉您您的输入图像有多个通道。 morph operatora 是在二进制掩码图像上执行的,例如灰度图像的精明函数或阈值处理的结果。

因此请检查您的输入掩码中包含的内容。