4

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

具体来说matchTemplate(),它返回一个cv::Mat包含匹配的相似性图。

除了使用之外,还有什么方法可以对其中cv::Point包含的 s 进行排序?cv::MatminMaxLoc()

    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());
    }

成功有限。

4

1 回答 1

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...
}
于 2013-07-31T18:05:54.457 回答