遍历cv::Mat中包含的cv::点

Iterate through cv::Points contained in a cv::Mat

本文关键字:cv 包含 Mat 遍历      更新时间:2023-10-16

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

具体地,返回包含匹配的相似性映射的CCD_ 2的matchTemplate()

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

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

成功有限。

如果我理解正确,您希望根据匹配分数对像素进行排序,然后按排序顺序获得与这些像素对应的点。您可以通过将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...
}