抛出 'cv::Exception' 实例后,OpenCV 中出现错误标志错误。 cvGetMat 中不支持的数组类型

Posted

技术标签:

【中文标题】抛出 \'cv::Exception\' 实例后,OpenCV 中出现错误标志错误。 cvGetMat 中不支持的数组类型【英文标题】:Bad flag error in OpenCV after throwing an instance of 'cv::Exception' . Unsupported array type in cvGetMat抛出 'cv::Exception' 实例后,OpenCV 中出现错误标志错误。 cvGetMat 中不支持的数组类型 【发布时间】:2013-12-26 13:43:17 【问题描述】:

我是 OpenCV 新手,正在尝试读取文件夹中的图像序列。我的代码如下:

#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std;


   void loadImage(Mat image,int number)
    
      char filename[100];
       strcpy(filename, "/home/folder1/imagefolder/");

     char frameNo[10];
       sprintf(frameNo, "%08i", number); 
       strcat(filename, frameNo);
       strcat(filename, ".png");
       cout<< filename;

       image = imread(filename);
       if (image.empty()) //check whether the image is loaded or not
    
    cout << "Error : Image not loaded." << endl;
        
    

    int main()
    
     Mat image;
     int nImages=8;
     for (int i = 1; i < nImages; i++)
    
     loadImage(image,i);
     namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
     imshow( "Display Image", image );
     waitKey(100000);
     return 0;

    
    

它被编译了,但是在运行可执行文件时,它给出了以下错误:

OpenCV 错误:cvGetMat,文件 /home/vuadmin/OpenCV-2.3.1/modules/core/src/array.cpp,第 2482 行中的错误标志(参数或结构字段)(无法识别或不支持的数组类型) 在抛出 'cv::Exception' 的实例后调用终止 what():/home/vuadmin/OpenCV-2.3.1/modules/core/src/array.cpp:2482:错误:(-206)函数cvGetMat中无法识别或不支持的数组类型 中止(核心转储)

请帮我找出错误。

我还尝试了其他方法 OpenCV: Reading image series from a folder

但在我的情况下,它只显示第一张图片。

【问题讨论】:

【参考方案1】:

我发现您的代码中有几个错误:

您的原型void loadImage(Mat image,int number) 复制了 cv::Mat 图像,因此在调用此函数后,image 为空。您应该通过引用设置图像

void loadImage(Mat& image,int number)

在这种情况下,imshow( "Display Image", image ); image 参数可能不为空。这可能会导致您的 openCV 错误

在程序的入口点中还有一件事,您在循环中创建了一个return 0;,因此程序在第一次迭代时以代码值 0 退出。将 return 放在循环之后。顺便说一句,你应该“打开”一次窗口,而不是每次迭代,但我认为这不会导致任何错误。

 int main()
    
     Mat image;
     int nImages=8;
     namedWindow( "Display Image", CV_WINDOW_AUTOSIZE );
     for (int i = 1; i < nImages; i++)
      
        loadImage(image,i);
        imshow( "Display Image", image );
        waitKey(100000);

      

     return 0;
    

您必须在调用 loadImage(image, i) 后检查图像的有效性,因为在您的函数内部,标准输出上会打印一条错误消息,但在您的循环中,您不会对图像进行任何检查

loadImage(image, i);
if ( ! image.empty ())
    imshow( "Display Image", image );
waitKey(100000);

【讨论】:

非常感谢您的回答!我没有改变return语句的位置,但是Mat Image创建了一个pr0blem.....需要刷基本的c++:(【参考方案2】:

我在 Java 中使用 OpenCV 时遇到了同样的错误。我意识到问题不在于我使用的图像或框架,而是 HaarCascade 文件。我会尝试不同的级联文件(您可以在 OpenCV 网站上找到它们),包括 Haar 级联文件和 LBP 级联文件。

希望对您有所帮助。干杯

【讨论】:

以上是关于抛出 'cv::Exception' 实例后,OpenCV 中出现错误标志错误。 cvGetMat 中不支持的数组类型的主要内容,如果未能解决你的问题,请参考以下文章

Opencv 解决抛出 cv::Exception

从 std::vector<int> 模糊 Mat 导致的错误指针:cv::Exception

(c++) 在抛出一个实例后调用终止

导入 tensorflow 错误:在抛出“Xbyak::Error”实例后调用终止

在抛出 'std::length_error' 的实例后调用终止

在抛出 'std::system_error' 的实例后调用终止