OpenCV "координатно-специфический" шаблон соответствия - PullRequest
0 голосов
/ 08 мая 2018

У меня есть изображение, где мне нужно как можно быстрее обнаружить объект. Я также знаю, что мне нужно только обнаружить объект, ближайший к центру.

AFAIK MatchTemplate Opencv работает примерно так (псевдокод):

for(x in width):
    for(y in height):
        value = calcSimilarity(inputImage, searchedImage, x, y)
        matched[x][y] = value

После этого мне нужно пройтись по полученному изображению и найти точку, ближайшую к центру, что является довольно пустой тратой.

Так что мне интересно, могу ли я сделать что-то вроде:

coordsGen = new CoordsGen() // a class that generates specific coords for me
while(!coordsGen.stop):
    x, y = coordsGen.next()
    value = calcSimilarity(inputImage, searchedImage, x, y)
    if(value > treshold)
        return x, y

В основном здесь мне нужна функция calcShoity. Это позволило бы мне значительно оптимизировать процесс.

1 Ответ

0 голосов
/ 08 мая 2018

Существует множество вариантов оценки подобия для сопоставления с шаблоном в целом. *

OpenCV имеет 3 доступных режима сопоставления шаблонов:

  • сумма квадратов разностей (евклидово расстояние)
  • Кросс-корреляция
  • коэффициент корреляции Пирсона

И в OpenCV каждая из этих трех версий также имеет нормированную / масштабированную версии:

  • Нормализованная сумма квадратов разностей
  • Нормализованная взаимная корреляция
  • Нормализованный коэффициент корреляции Пирсона

Фактические формулы, используемые в документах OpenCV, вы можете найти в TemplateMatchModes , хотя они согласуются с общими формулами, которые можно найти везде для вышеуказанных методов.


Вы можете закодировать соответствующий шаблон вместо использования OpenCV. Тем не менее, обратите внимание, что OpenCV оптимизирован для этих операций и в целом работает быстро при сопоставлении шаблонов. OpenCV использует DFT для выполнения некоторых из этих вычислений, чтобы уменьшить вычислительную нагрузку. Например, см .:

Вы также можете использовать OpenCV minMaxLoc(), чтобы найти минимальное / максимальное значение вместо того, чтобы проходить через себя. Кроме того, вы не указали способ доступа к своим значениям, но не все методы поиска работают так же быстро, как другие. См. Как сканировать изображения , чтобы увидеть самые быстрые Mat операции доступа. Спойлер: сырые указатели.


Основное ускорение, которое должна обеспечить оптимизация, - это досрочное прекращение работы функции. Тем не менее, я не думаю, что вы достигнете более быстрых времен в целом, если будете кодировать его самостоятельно, если только нет значительно меньшего подмножества исходного изображения, в котором обычно находится шаблон.

Лучшим методом сокращения времени поиска, если ваши изображения очень большие, будет использование подхода с разрешением по пирамиде. В основном, сделайте шаблон и ищите изображения 1/2 вашего изображения с тех пор, 1/2 от этого, 1/2 от этого и так далее. Затем вы начинаете сопоставление шаблона с небольшим изображением 1/16 или любого другого размера и находите общее местоположение шаблона. Затем вы делаете то же самое для следующего размера изображения, но вы ищете только небольшое подмножество, где ваш шаблон был в предыдущем масштабе. Затем, каждый раз, когда вы увеличиваете размер изображения ближе к оригиналу, вам нужны только небольшие различия в несколько пикселей, чтобы точнее зафиксировать положение. Общее местоположение сначала определяется по наименьшему масштабированному изображению, поиск которого занимает лишь небольшую часть времени по сравнению с исходным размером изображения, а затем вы просто уточняете его путем увеличения.


* Обратите внимание, что OpenCV не включает другие методы сопоставления шаблонов, которые вы можете увидеть в других местах. В частности, OpenCV имеет сумму квадратов, но нет метода абсолютных расстояний. Разности фаз также используются в качестве показателя сходства, но не существуют в OpenCV. В любом случае, взаимная корреляция и сумма разностей квадратов чрезвычайно распространены при обработке изображений, и если у вас нет специальной области изображений, она должна работать нормально.

...