opencv 3.0中的错误标记错误

时间:2016-11-08 15:52:30

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

我对opencv和C ++比较陌生,我想对我的代码提供一些帮助。对于我的项目,我目前正在研究一个简单的blob检测器,但是当我运行它时,我在cvGetMat中得到“OpenCV错误:错误标志(参数或结构字段)(无法识别或不支持的数组类型),文件C:\ builds \ master_PackSlave-win64-vc12-shared \ opencv \ modules \ core \ src \ array.cpp,第2494行 按任意键继续 。 。 。“。我很确定错误来自Mat im_with_keypoints;或链接器中的问题。下面是我的代码。如果你可以帮助我那将是很棒的。

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

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

Picture is of 5 coins (eagle coins to be specific)

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

}

1 个答案:

答案 0 :(得分:0)

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

#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->detect获得了一个带有消息

的异常
  

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

旁注:如果您有可用于库的调试符号(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 > Working Directory,或使用绝对路径加载图像。