2016-12-16 82 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) << " "; 
     } 
    } 
}