2012-10-23 45 views
0

我使用下面的函數返回0到1之間的值的權重矩陣,取決於特定矩陣位置的中心有多近。在閾值之後,所有值都是1(它類似於平臺,距離中心的值接近1的點並且距離閾值從邊緣線性地從1下降到0時離開中心)?爲什麼這個OpenCV矩陣的大小和值不正確?

cv::Mat2f getWeightsMatrix(int N, int M, float r){ 
    cv::Mat2f weights = cv::Mat2f(N,M); 
    int i,j; 
    for(i=0;i<N;i++){ 
     for(j=0;j<M;j++){ 
      if(i<=floor(N*(1-r)/2)){ 
       if(j<=floor(M*(1-r)/2)){ 
        weights[i][j]=((float)(i/N-j/M)/(1-r)); 
       } 
       else{ 
        weights[i][j]=(2*(float)(i/N)/(1-r)); 
       } 
      } 
      else if (i>=floor(N*(1+r)/2)){ 
       if(j>=floor(M*(1+r)/2)){ 
        weights[i][j]=(((float)((N-i)/N))-((float)((M-j)/M)))/(1-r); 
       } 
       else{ 
        weights[i][j]=(2*(float)((N-i)/N)/(1-r)); 
       } 
      } 
      else{ 
       if(j<=floor(M*(1-r)/2)){ 
        weights[i][j]=(2*(float)(j/M)/(1-r)); 
       } 
       else if(j>=floor(M*(1+r)/2)){ 
        weights[i][j]=(2*(float)((M-j)/M)/(1-r)); 
       } 
       else{ 
        weights[i][j]=1; 
       } 
      } 
     } 
    } 
    cout << weights << endl; 
    return weights; 
} 

現在我的問題是,我有一些問題,鑄造,只值0和1被退回(不浮動)。當我用N = 10,M = 10和r = 0.5調用函數時,我的矩陣大小顯示的cout爲20x10。

請幫助!

編輯:這是輸出,因爲當你在做的整數基本操作,結果就會自動四捨五入

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0; 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

回答

4

你的矩陣由只有整數。

例如:當你寫

weights[i][j]=((float)(i/N-j/M)/(1-r)); 

i/N結果被舍入到整數,j/M也舍入爲整數,最後由(1-r)分割也圓形的。您的(float)劇組是一個好主意,但它的應用太晚了

你可以做幾件事情:

  • 基本操作裏面演員,例如,中float(i)/N代替i/N
  • 使用浮點數而不是整數:寫的1.0代替1
  • 使用您的內部漂浮物循環和語句

例如:

for(float i = 0; i < N-0.5; i++) { 
    for(float j = 0; j < M-0.5; j++) { 
     if(i <= floor(N*(1.0-r)/2.0)) { 
      // ... 

這一點很重要,你知道,因爲浮點精度,測試如i < N可能會或可能不會通過float i = N時。這就是爲什麼我通過從你的循環邊界NM減去0.5做了一個小技巧。

+0

在解決方案中,您將數組索引變爲浮點數。所以我需要在那裏演員。你認爲哪種方法最短(分鐘)來解決這個問題? –

+1

最簡單的事情就是** double **你的循環變量:你聲明'int i; float ii;'然後在你的循環中增加'for(i = 0; i alestanis

+0

是的,我只是最後纔想到。謝謝。這個問題解決了。但你能幫我弄清楚爲什麼尺寸是20x10而不是10x10? –