【问题标题】:Bad Flag error in opencv 3.0opencv 3.0 中的 Bad Flag 错误
【发布时间】:2017-03-22 07:55:44
【问题描述】:

我对 opencv 和 C++ 比较陌生,我希望对我的代码有所帮助。对于我的项目,我目前正在开发一个简单的 blob 检测器,但是当我运行它时,我得到 "OpenCV Error: Bad flag (parameter or structure field) (Unrecognized or unsupported array type) in cvGetMat, file C:\ builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\array.cpp,第 2494 行 按任意键继续 。 . ."。我很确定错误来自 Mat im_with_keypoints;,或者链接器中的问题。下面是我的代码。如果你能帮助我,那就太好了。

  • 更新:我通过调试器运行了这个程序并出现了这个错误
    • 我也在使用 Visual Studio 2015

这是我试图检测斑点的图像:

#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/features2d.hpp"
#include "opencv2/opencv.hpp"
#include <opencv2/core/core.hpp>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{


    Mat im = imread("Eagle_coins.jpg", IMREAD_GRAYSCALE);


    SimpleBlobDetector::Params params;

    params.minThreshold = 10;
    params.maxThreshold = 200;

    params.filterByColor = true;

    params.filterByCircularity = true;
    params.minCircularity = 0.1;
    params.maxCircularity = 0.28;


    params.filterByConvexity = true;
    params.minConvexity = 0.87;
    params.maxConvexity = 2.8;


    params.filterByInertia = true;
    params.minInertiaRatio = 0.01;
    params.maxInertiaRatio = 2;

    vector<KeyPoint> keypoints;

    Ptr<SimpleBlobDetector> detector = SimpleBlobDetector::create(params);

    detector->detect(im, keypoints);

    Mat im_with_keypoints;
    drawKeypoints(im, keypoints, im_with_keypoints, Scalar(0, 0, 255),                       DrawMatchesFlags::DRAW_RICH_KEYPOINTS);

    imshow("white", im_with_keypoints);
    waitKey(0);

}

【问题讨论】:

  • 您是否尝试在调试器中运行它?那告诉了你什么?无需猜测。
  • @Dan Mašek 我通过调试器运行程序并出现运行时错误
  • 您应该能够在错误发生时中断调试器,并检查堆栈跟踪以查看代码中发生这种情况的确切位置。然后,您可以使用调试器进一步检查您调用失败的参数,以便更深入地了解问题。 |如果您附加输入图像的副本以允许其他人复制它,这将很有用。 |您可以提及的另一件事是您在哪种模式下编译程序(调试或发布?)以及您将其链接到哪些库(名称)。
  • @Dan Mašek 抱歉,回复晚了,我按照您的建议在整个代码中放置断点,但是,无论我在哪里放置断点,程序都不会运行(我从结束并努力乞讨)。我的代码处于调试模式。我链接的库是 vc12,以及用于附加依赖项的 opencv_world300d.lib。
  • 没问题。我是否正确假设您使用的是 Visual Studio 2013?请编辑您的问题并添加您用于测试的图片,以便我们尝试重现问题。

标签: c++ opencv visual-c++


【解决方案1】:

重现您提到的错误的最小代码如下所示:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char** argv)
{
    cv::Mat im;

    cv::SimpleBlobDetector::Params params;
    std::vector<cv::KeyPoint> keypoints;
    cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
    detector->detect(im, keypoints);
}

控制台包含

OpenCV 错误:cvGetMat,文件 C:\builds\master_PackSlave-win64-vc12-shared\opencv\modules\core\src\array.cpp 中的错误标志(参数或结构字段)(无法识别或不支持的数组类型),第 2494 行

我收到来自detector-&gt;detect 的异常消息

so03.exe 中 0x00007FF9A88C7788 处未处理的异常:Microsoft C++ 异常:内存位置 0x0000005BA676E230 处的 cv::Exception。

旁注:如果您有可用于库的调试符号 (PDB),则错误的来源在调试器中会更加明显。不幸的是,从 OpenCV 站点分发的带有预编译二进制文件的包不包含这些,这就是我更喜欢自己构建的原因。

当我们将非空的cv::Mat 传递给detect 时,它就会消失:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char** argv)
{
    cv::Mat im(100, 100, CV_8UC3);

    cv::SimpleBlobDetector::Params params;
    std::vector<cv::KeyPoint> keypoints;
    cv::Ptr<cv::SimpleBlobDetector> detector = cv::SimpleBlobDetector::create(params);
    detector->detect(im, keypoints);
}

由此我们可以得出结论,在您的示例中,imread 无法加载图像。这是完全可能的,因为您不检查这种情况。

在您致电imread 后立即添加类似内容:

if (im.empty()) {
    std::cerr << "Failed to load image.\n";
    return -1;
}

现在,关于为什么图片没有正确加载。由于您使用的是 Visual Studio,因此一种选择是您的工作目录设置不正确——默认情况下,这是项目文件所在的位置,可能不是 exe 所在的位置。在项目的属性中适当地设置Debugging &gt; Working Directory,或者使用绝对路径来加载图像。

【讨论】:

  • 没问题。如果您认为这可以适当地回答您的问题,请随时将其标记为已接受,并可能对其进行投票。 (就是这两个箭头,我猜是答案左上角的勾号)。
猜你喜欢
  • 2015-03-05
  • 2015-08-07
  • 2016-12-26
  • 2016-03-29
  • 2016-06-12
  • 2023-03-13
  • 1970-01-01
  • 2016-01-08
  • 2015-12-29
相关资源
最近更新 更多