首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenCV3.0中的坏旗误差

OpenCV3.0中的坏旗误差
EN

Stack Overflow用户
提问于 2016-11-08 15:52:29
回答 1查看 908关注 0票数 0

我对opencv和C++比较陌生,我想在我的代码上提供一些帮助。对于我的项目,我目前正在处理一个简单的blob检测器,但是当我运行它时,我得到了"OpenCV错误: cvGetMat中的坏标志(参数或结构字段)(不被识别或不支持的数组类型),文件OpenCV行2494按任意键继续……“。我非常肯定,错误要么来自Mat im_with_keypoints;,要么是链接器中的问题。下面是我的密码。如果你能帮我那就太好了。

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

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

代码语言:javascript
复制
#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);

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 02:19:14

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

代码语言:javascript
复制
#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);
}

控制台包含

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

我从detector->detect获得了一个异常消息

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

Sidenote:如果为库提供了调试符号(PDB),那么在调试器中错误的来源将更加明显。不幸的是,带有从OpenCV站点分发的预编译二进制文件的包不包含这些二进制文件,这就是为什么我更喜欢构建自己的二进制文件。

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

代码语言:javascript
复制
#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后立即添加类似的内容

代码语言:javascript
复制
if (im.empty()) {
    std::cerr << "Failed to load image.\n";
    return -1;
}

现在,关于为什么图像加载不正确。一个选项,因为您使用的是Visual,您没有正确地设置您的工作目录--默认情况下,这是项目文件所在的位置,这可能不是exe所在的位置。要么在项目属性中适当设置Debugging > Working Directory,要么使用绝对路径加载映像。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40491164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档