2014-11-24 42 views
0

我有兩種方法,它們應該將模板的絕對差值和來自原始圖片的相同大小的色塊的像素值寫入像素,其中色塊和模板座標均爲0,0。從圖片和模板中獲得絕對差異。 [模板匹配]

這是我的兩種方法。

private void normalizeAndDraw(double biggest, double[] temporaryPixels, int[] dstPixels ){ 
     double normalize = 255/biggest; 
      for (int c = 0; c < temporaryPixels.length; c++) { 
      int value = (int) (temporaryPixels[c] * normalize); 
      dstPixels[c] = 0xFF000000 | (value << 16) | (value << 8) | value; 
     } 
    } 

    private void getAbsolutePicture(int srcPixels[], int srcWidth, int srcHeight, int dstPixels[], int dstWidth, int dstHeight, int templatePixels[], int tmpHeight, int tmpWidth) { 
     double temporaryPixels[] = new double[dstHeight * dstWidth]; 
     double biggest = 0; 

     double sumR = 0; 
     for (int j = 0; j < tmpHeight; j++) { 
      for (int i = 0; i < tmpWidth; i++) { 

       int posTmp = j * tmpWidth + i; 
       sumR += templatePixels[posTmp] & 0xFF; 
      } 
     } 

     for (int y = 0; y < dstHeight; y++) { 
      for (int x = 0; x < dstWidth; x++) { 
       double sumI = 0; 
       for (int j = 0; j < tmpHeight; j++) { 
        for (int i = 0; i < tmpWidth; i++) { 
         int pos = (y + j) * dstWidth + (x + i); 
         sumI += srcPixels[pos] & 0xFF; 
        } 
       } 
       double absDifference = Math.abs(sumI - sumR); 

       biggest = Math.max(absDifference, biggest); 

       temporaryPixels[y * dstWidth + x] = absDifference; 
      } 
     } 

     normalizeAndDraw(biggest, temporaryPixels, dstPixels); 

    } 

他們會這樣調用。

getAbsolutePicture(srcPixels, srcWidth, srcHeight, dstPixels, dstWidth, dstHeight, templatePixels, templateWidth, templateHeight); 

如果將值寫入dstPixels數組,它們將自動顯示。

不幸的是,而不是正確的解決方案,它看起來像這樣

http://i.stack.imgur.com/cqlD3.png

我得到的結果看起來像這樣

http://i.stack.imgur.com/2Cjhz.png

我敢肯定,我的錯誤在於sumR和sumI的計算,但我不知道?

我的代碼究竟出了什麼問題?

回答

0

我的代碼實際上沒問題。最大的問題是當我調用getAbsolutePicture()時,我混淆了tmpWdith和tmpHeight。