我有同樣的要求,我嘗試了幾乎相同的方式。就像在圖像中,我想匹配城堡。城堡有不同的盾牌形象和可變長度的氏族名稱以及草地背景(此圖像來自遊戲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