2014-12-04 4 views
0

Я хочу выполнить сопоставление шаблона с маской. В общем случае сопоставление шаблонов может быть выполнено быстрее путем преобразования изображения из Spacial домена в частотную область. Но есть ли какой-либо метод, который я могу применить, если я хочу сделать то же самое с маской? Я использую opencv C++. Есть ли какая-либо соответствующая функция уже в opencv для этой задачи?Шаблон, соответствующий маскам

Мой текущий подход:

  • побитовое исключающее ИЛИ Изображение & Изображение B с маской.

  • Подсчитайте ненулевые пиксели.

  • Заполните результирующую матрицу этим количеством.

  • Поиск maxi-ma.

Несколько параметров я угадывание сейчас:

  • Пропустить положение плитки, если матчи менее чем на 25%.
  • Пропустить положение плитки, если совпадения составляют менее 25%.

  • Пропустить положение плитки, если предыдущие плитки имеют совпадения менее 50%.

Мой вопрос: есть ли какой-либо алгоритм для этого соответствия уже? Есть ли математическая операция, которая может ускорить этот процесс?

ответ

0

С бинарными изображениями вы можете напрямую использовать расстояние HU-Moments и Mahalanobis, чтобы найти, похоже ли изображение A на изображение B. Если расстояние имеет тенденцию к 0, то изображения одинаковы.

Конечно, вы можете использовать также функции детектора, так что см. , что соответствует, но для таких изображений, как HU Moments или Detection, будут получены примерно одинаковые результаты, но HU Moments более эффективны.

Используя findContours, вы можете извлечь черные участки внутри белой звездой и заполнить их, чтобы иметь изображение A = изображение B.

Другой подход: использование findContours на вашей маске и применить результат изображения A (извлекая область интересов), вы можете извлечь то, что находится внутри звезды, и подсчитать, сколько черных пикселей у вас (несоответствующие).

+0

извините! Я пересмотрел свой вопрос, чтобы дать понять. Я не сравниваю функции в этих изображениях! Я хочу подсчитать общее количество совпадающих пикселей в изображениях с помощью маски! –

+0

Итак, просто используйте операцию bitwise_and и получите количество белых пикселей. – madduci

0

У меня такое же требование, и я пробовал почти так же. Как и в изображении, я хочу соответствовать замку. У замка есть другое изображение щита и имя клана переменной длины, а также фон травы (это изображение происходит из игры Clash of Clans). Обычный opencv matchTemplate не работает. Поэтому я пишу сам. Я следую путям matchTemplate для создания изображения результата, но с другим алгоритмом. Основная идея - подсчитать согласованный пиксель под маской. Код следующий, это просто. Это прекрасно работает, но стоимость времени высока. Как вы можете видеть, это стоит 457 мс. Теперь я работаю над оптимизацией.

Исходные и шаблонные изображения - это CV_8U3C, изображение маски CV_8U. Совпадение одного канала в порядке. Это быстрее, но все равно стоит дорого.

Mat tmp(matTempl.cols, matTempl.rows, matTempl.type()); 

int matchCount  = 0; 
float maxVal  = 0; 
double areaInvert = 1.0/countNonZero(matMask); 

for (int j = 0; j < resultRows; j++) 
{ 
    float* data = imgResult.ptr<float>(j); 
    for (int i = 0; i < resultCols; i++) 
    { 
     Mat matROI(matSource, Rect(i, j, matTempl.cols, matTempl.rows)); 

     tmp.setTo(Scalar(0)); 
     bitwise_xor(matROI, matTempl, tmp); 
     bitwise_and(tmp, matMask, tmp); 

     data[i] = 1.0f - float(countNonZero(tmp) * areaInvert); 
     if (data[i] > matchingDegree) 
     { 
      SRect rc; 
      rc.left  = i; 
      rc.top  = j; 
      rc.right = i + imgTemplate.cols; 
      rc.bottom = j + imgTemplate.rows; 
      rcOuts.push_back(rc); 

      if (data[i] > maxVal) 
      { 
       maxVal = data[i]; 
       maxIndex = rcOuts.size() - 1; 
      } 

      if (++matchCount == maxMatchs) 
      { 
       Log_Warn("Too many matches, stopped at: " << matchCount); 
       return true; 
      } 
     } 
    } 
} 

Он говорит, что я не хватает репутации, чтобы получить возможность отправлять изображение .... http://i.stack.imgur.com/mJrqU.png

Новый добавил: успеха оптимизировать алгоритм с помощью ключевых точек. Вычислить все точки - это стоимость, но быстрее вычислять только ключевые точки сервера. См. Изображение, стоимость значительно снижается, теперь это около 7 мс.

Я до сих пор не могу изображения, пожалуйста, посетите: http://i.stack.imgur.com/ePcD9.png

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

Смежные вопросы