2016-12-16 139 views
-1

我在txt文件中有兩個灰度圖像,其中一個是主圖像的較小塊。我已經將圖像讀入兩個不同的2d向量矩陣。C++圖像處理循環

行和圖像的列是:

主:M = 768 N = 1024

SubImg:R = 49 C = 36

int R = 49; int C = 36;  //Sub Image Rows/Columns 
int M = 768; int N = 1024; //Main Image Rows/Columns 

欲通過環主圖像的寬度爲49,高爲36,並將每個塊放入一個數組中,因此我可以將該數組與Sub圖像(使用Nearest Neighbor Search)進行比較,以查看哪個塊具有與Sub圖像最接近的結果。

我遇到的問題是我無法獲得顯示所有塊的循環。當我運行循環時,只會出現一定數量的程序段並且程序發生衝突。

// Testing Main 2D Vector in block format 
for (int bx = 0; bx < M; bx += R) 
    for (int by = 0; by < N; by += C) 
    { 
     for (int x = 0; x < R; ++x) 
     { 
      for (int y = 0; y < C; ++y) 
      { 
       cout << MainIMG_2DVector[bx + x][by + y] << " "; 
      } 
     } 
     cout << "\n\n" << endl; 
    } 

有人可以告訴我我做錯了什麼。

感謝

編輯++++++++++++++++++++++++++++++++++++++++ +

調試之後

_DEBUG_ERROR("vector subscript out of range"); 
_SCL_SECURE_OUT_OF_RANGE; 

M = 768是不通過R = 49整除,最後循環與BX開始= 735(15 * 49)和應端部至BX = 735 + 48 = 783> 768 ...同樣的問題在N = 1024和C = 36 by = 1008(28 * 36)到by = 1008 + 35 = 1043> 1024. - J. Piquard

如果我增加寬度a高度,我的主要形象舒展。有沒有解決的辦法?

+0

使用正確的工具來解決這些問題是你的調試器。在*堆棧溢出問題之前,您應該逐行執行您的代碼。如需更多幫助,請閱讀[如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您應該\編輯您的問題,以包含一個[最小,完整和可驗證](http://stackoverflow.com/help/mcve)示例,該示例再現了您的問題,以及您在調試器。 –

+0

@πάνταῥεῖ這是我得到的錯誤_DEBUG_ERROR(「矢量下標超出範圍」); \t \t \t _SCL_SECURE_OUT_OF_RANGE; – QWERTY

+0

因爲M = 768不能被R = 49整除,最後一個循環以bx = 735(15 * 49)開始,並且應該結束爲bx = 735 + 48 = 783> 768 ...在N = 1024和C = 36 by = 1008(28 * 36)to by = 1008 + 35 = 1043> 1024. –

回答

0

兩種方式可以探討:

路1 - 值R(和C)更改爲M(和N

int M = 768; int N = 1024; //Main Image Rows/Columns 
int R = 48; int C = 32;  //Sub Image Rows (768=16*48)/Columns (1024=32*32) 

路2最好的除法 - 預防out of range error在for循環退出條件

對於x,條件(x < R)((bx + x) < M))應爲 true

而對於y,這兩個條件(y < C)((by + y) < N))true

for (int x = 0; ((x < R)&&((bx + x) < M)); ++x) 
{ 
    for (int y = 0; ((y < C)&&((by + y) < N)); ++y) 
    { 
     if ((bx + x)>=M) { 
      std::cout << (bx + x) << (by + y) << " "; 
     } 
    } 
} 

相反的:

for (int x = 0; x < R; ++x) 
{ 
    for (int y = 0; y < C; ++y) 
    { 
     if ((bx + x)>=M) { 
      std::cout << (bx + x) << (by + y) << " "; 
     } 
    } 
}