迭代cv :: Mat中包含的cv :: Points

时间:2013-07-31 16:05:18

标签: c++ loops opencv template-matching

我正在使用OpenCV模板匹配来查找另一个图像中的图像。

具体而言matchTemplate()返回包含匹配的相似性映射的cv::Mat

除了使用cv::Point之外,有没有办法对cv::Mat中包含的minMaxLoc()进行排序?

    minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);

我试过了:

    cv::Mat_<uchar>::iterator it = result.begin<uchar>();
    cv::Mat_<uchar>::iterator end = result.end<uchar>();
    for (; it != end; ++it)
    {
        cv::Point test(it.pos());
    }

成效有限。

1 个答案:

答案 0 :(得分:4)

如果我理解正确,您希望按匹配分数对像素进行排序,然后按排序顺序获取与这些像素对应的点。您可以通过将result重新整形为单行,然后调用cv::sortIdx()以按排序顺序获取像素的索引来完成此操作。然后,您可以使用索引作为result开头的偏移量来获取该特定像素的位置。

更新:我发现您的代码中存在一个可能的问题。看起来您假设result包含uchar数据。 cv::matchTemplate()要求result包含float数据。

cv::Mat_<int> indices;
cv::sortIdx(result.reshape(0,1), indices, CV_SORT_DESCENDING + CV_SORT_EVERY_ROW);

cv::Mat_<float>::const_iterator begin = result.begin<float>();
cv::Mat_<int>::const_iterator it = indices.begin();
cv::Mat_<int>::const_iterator end = indices.end();
for (; it != end; ++it)
{
    cv::Point pt = (begin + *it).pos();
    // Do something with pt...
}