我正在使用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());
}
成效有限。
答案 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...
}