Итерация через cv :: Точки, содержащиеся в cv :: Mat

Я использую сопоставление с шаблоном 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());
}

С ограниченным успехом.

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...
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]