来自 Mat 的 OpenCV 访问元素

Posted

技术标签:

【中文标题】来自 Mat 的 OpenCV 访问元素【英文标题】:OpenCV access element from Mat 【发布时间】:2012-06-08 23:09:15 【问题描述】:

我正在尝试学习 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

【问题讨论】:

关于类型枚举,查看types_c.h,你会发现#define CV_8UC1 CV_MAKETYPE(CV_8U,1)等等。这就是 type() 返回的内容 【参考方案1】:

作为建议,尝试使用维度和类型初始化矩阵

 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 调试技术,对我帮助很大

1- 调试时右键单击 cur_features。 2- 快速观看

3- 写这个:

(float*)cur_features.data,400

4- 你会看到数组的所有值

【讨论】:

修正错误:通道数也会影响单个像素的数据类型,也不是32_FC1而是CV_32_FC1。【参考方案2】:

事实证明,尽管我的 goodFeaturesToTrack 返回 400x1,但我是在黑色图像上进行的,因此没有角落。这导致了

 cur_features.data == NULL

有趣的情况是,C 代码似乎比 C++ 代码更容易和用户友好。

【讨论】:

【参考方案3】:

这里写着:http://opencv.itseez.com/modules/imgproc/doc/feature_detection.html

你应该给它一个vector&lt;Point2f&gt; 作为输出数组。

它在我的本地 OpenCV 副本的 goodFeaturesToTrack_Demo.cpp 中声明:

  vector<Point2f> corners;
  ...
  /// Apply corner detection
  goodFeaturesToTrack( src_gray, 
               corners,
               maxCorners,
               qualityLevel,
               minDistance,
               Mat(),
               blockSize,
               useHarrisDetector,
               k );

更新:我上面给出的链接使用 a 模板 OutputArray 角的参数。 http://opencv.willowgarage.com/documentation/cpp/imgproc_feature_detection.html 的 2.1 版本库的文档确实声明了 vector&lt;Point2f&gt;

【讨论】:

嗨,巴勃罗,感谢您的回复。我很难找到文档中指出它应该是vector 的位置。但是,我同意这些示例说明了 Point2f 结构的 std::vector 的使用。 std::vectorcv::vector 是一样的(方便typedef,查看标题)。不一样的是cv::Vec&lt;N,_Tp&gt;

以上是关于来自 Mat 的 OpenCV 访问元素的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV-无法访问 Mat 的元素(描述符)

opencv怎么给mat赋值

opencv 访问 CV_32FC3 BGR cv::Mat 的颜色元素

02OpenCV数据载入显示与保存

了解一个 Mat 元素 Opencv 的值

OPENCV学习笔记2-8_Mat_类