У меня такое же требование, и я пробовал почти так же. Как и в изображении, я хочу соответствовать замку. У замка есть другое изображение щита и имя клана переменной длины, а также фон травы (это изображение происходит из игры 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
Пожалуйста, дайте мне репутацию, так что я могу размещать изображения. :)
извините! Я пересмотрел свой вопрос, чтобы дать понять. Я не сравниваю функции в этих изображениях! Я хочу подсчитать общее количество совпадающих пикселей в изображениях с помощью маски! –
Итак, просто используйте операцию bitwise_and и получите количество белых пикселей. – madduci