我正在尝试学习OpenCV,并且是一个顽固的人,我正在尝试运行以下算法:
cv::Mat cur_features;
cv::goodFeaturesToTrack(current_image, cur_features, 400, 0.01, 0.01);
现在,作为一个头脑冷静的人,我有兴趣看看cur_features正在举办什么......我期待一个400x2 cv :: Mat但是我得到了一个400x1 cv :: Mat
没什么大不了的,我想也许它是一个直接索引。但是,对于我的生活,我无法从cur_features.at(0)中提取值并将其打印出来。
我做错了什么?我见过goodFeaturesToTrack_Demo.cpp。关于该演示的一些注意事项与我的不同。我尝试了以下调用,例如:
std::cout << cur_features.size() << std::endl; // This throws a compile time error even though its in the example
std::cout << cur_features.at<Point2f>(0).x << std::endl; //This throws a run time error.
有人能指导我一些解释如何实现目标的文档吗? goodFeaturesToTrack告诉你它返回一个OutputArray,它是一个角的向量,但它没有描述这些角的类型。如果我用其他方法得到它,我会在文档中寻找这个答案吗?
编辑:此外,最重要的是Mat :: type()。我找不到可以解释返回值的位置...我正在寻找文档中的枚举但是找不到它。
std::cout << current_image.type() << std::endl; //This returns 0
std::cout << cur_features.type() << std::endl; //This returns 13
答案 0 :(得分:5)
作为建议,尝试使用维度和类型
初始化矩阵 cv::Mat cur_features(400,1,CV_32_FC1); //400x1 32 bits, 1 channel
cv::Mat cur_features2(400,1,CV_32_FC2); //400x1 32 bits, 2 channels
获取Mat的值
int pos = 0;
foat value = cur_features.at<float>(pos);
cv::Vec2f value2 = cur_features2.at<Vec2f>(pos); // for a two channel, CV_23F image
Visual Studio的一个方便的调试技术帮助了我很多
3-写下这个:
(浮子*)cur_features.data,400
4-您将看到数组的所有值
答案 1 :(得分:4)
事实证明,即使我的goodFeaturesToTrack返回400x1,我也是在黑色图像上进行,因此没有任何角落。这导致了
cur_features.data == NULL
有趣的情况,C代码似乎比C ++代码更容易和更友好。
答案 2 :(得分:2)
它在这里说:http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html
你应该给它一个vector<Point2f>
作为输出数组。
在我的本地OpenCV副本中的goodFeaturesToTrack_Demo.cpp中声明它是这样的:
vector<Point2f> corners;
...
/// Apply corner detection
goodFeaturesToTrack( src_gray,
corners,
maxCorners,
qualityLevel,
minDistance,
Mat(),
blockSize,
useHarrisDetector,
k );
更新:我上面给出的链接使用模板 OutputArray
参数进行转角。 2.1版本库的http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html文档会声明vector<Point2f>