2016-12-16 16 views
-1

私は、txtファイルに2つのグレースケール画像を持っています.1つは、メイン画像のより小さいブロックです。私は2つの異なる2次元ベクトル行列に画像を読みました。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 

Iのをループしたいですメイン画像を幅: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; 
    } 

誰かが間違ったことを教えてもらえますか?

おかげ

EDIT ++++++++++++++++++++++++++++++++++++++++ +

M = 768、R = 49で割り切れない

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

をデバッグした後、最後のループはBX = 735(* 49 15)で始まりべきBX = 735 + 48 = 783>に終了768 ... N = 1024、C = 36、= 1008(28 * 36)、by = 1008 + 35 = 1043> 1024に同じ問題があります。 - J. Piquard

幅を大きくすると、高さ、私の主なイメージストレッチ。これを回避する方法はありますか?

+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)〜by = 1008 + 35 = 1043> 1024。 –

答えて

0

二つの方法が検討される可能性:

ウェイ1から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の最高の除算器に値R(およびC)を変更 - 防ぎますforループ終了条件のout of range error

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) << " "; 
     } 
    } 
}