Я использую сопоставление с шаблоном 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());
}
С ограниченным успехом.
Если я вас правильно понимаю, вы хотите отсортировать пиксели по их количеству совпадений, а затем получить точки, соответствующие этим пикселям, в отсортированном порядке. Вы можете сделать это, изменив форму 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...
}
Других решений пока нет …