我对opencv和C ++比较陌生,我想对我的代码提供一些帮助。对于我的项目,我目前正在研究一个简单的blob检测器,但是当我运行它时,我在cvGetMat中得到“OpenCV错误:错误标志(参数或结构字段)(无法识别或不支持的数组类型),文件C:\ builds \ master_PackSlave-win64-vc12-shared \ opencv \ modules \ core \ src \ array.cpp,第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);
}
答案 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
,或使用绝对路径加载图像。