我有同样的要求,我尝试了几乎相同的方式。就像在图像中,我想匹配城堡。城堡有不同的盾牌形象和可变长度的氏族名称以及草地背景(此图像来自游戏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
新增: 我成功通过关键点优化算法。计算所有点是成本,但只计算服务器关键点更快。看到图片,成本大大降低,现在是7ms左右。
我还不能发布图片,请访问:http://i.stack.imgur.com/ePcD9.png
请给我的声誉,所以我可以发表图片。 :)
来源
2014-12-13 14:35:38
ZHK
对不起!我修改了我的问题来说清楚。我没有比较这些图像中的功能!我想用蒙版来计算图像中匹配像素的总数! – 2014-12-04 17:41:48
所以只需使用bitwise_and操作并获取白色像素的数量。 – madduci 2014-12-04 17:43:45