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

#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);
}发布于 2016-11-09 02:19:14
再现您提到的错误的最小代码如下所示:
#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时,它就会消失。
#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,您没有正确地设置您的工作目录--默认情况下,这是项目文件所在的位置,这可能不是exe所在的位置。要么在项目属性中适当设置Debugging > Working Directory,要么使用绝对路径加载映像。
https://stackoverflow.com/questions/40491164
复制相似问题