2014-12-04 154 views
0

我想用模板執行模板匹配。一般來說,通過將圖像從空間域轉換到頻域可以使模板匹配更快。但是,如果我想要執行相同的掩碼,是否還有任何方法可以應用?我正在使用opencv C++。在這個任務中,opencv中是否有匹配函數?帶模板匹配的模板

我目前的做法:

  • 按位異或圖像的掩模A &圖像B。

  • 計數的非零像素。

  • 裝滿這個計數的結果矩陣。

  • 搜索MAXI-MA。

現在我猜幾個參數是:

  • 跳過瓷磚的位置,如果比賽少於25%。
  • 如果匹配小於25%,則跳過拼貼位置。

  • 跳過平鋪位置如果先前的磁磚具有匹配是小於50%。

我的問題:是否有任何的算法已經做到這一點匹配?有沒有可以加速這個過程的數學運算?

回答

0

隨着二值圖像,你可以直接使用HU-矩及馬氏距離找到,如果圖像與類似圖像B.如果距離趨於0,然後將圖像是相同的。

當然你也可以使用還具有檢測器,使得看什麼的比賽,但對於喜歡這些圖片,Hu矩或功能的探測器將給出大致相同的結果,但胡時刻都更有效。

使用findContours,可以提取黑色區域的白星內填充它們,纔能有像A =圖像B.

其他方法:使用你的面具findContours和應用結果來成像(提取感興趣區域),可以提取星體內部的內容並計算您擁有多少黑色像素(不匹配的像素)。

+0

對不起!我修改了我的問題來說清楚。我沒有比較這些圖像中的功能!我想用蒙版來計算圖像中匹配像素的總數! – 2014-12-04 17:41:48

+0

所以只需使用bitwise_and操作並獲取白色像素的數量。 – madduci 2014-12-04 17:43:45

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

新增: 我成功通過關鍵點優化算法。計算所有點是成本,但只計算服務器關鍵點更快。看到圖片,成本大大降低,現在是7ms左右。

我還不能發佈圖片,請訪問:http://i.stack.imgur.com/ePcD9.png

請給我的聲譽,所以我可以發表圖片。 :)