我在txt文件中有两个灰度图像,一个是主图像的较小块。我已经将图像读入两个不同的二维矢量矩阵。
图像的行和列是:
Main:M = 768 N = 1024
SubImg:R = 49℃= 36
int R = 49; int C = 36; //Sub Image Rows / Columns
int M = 768; int N = 1024; //Main Image Rows / Columns
我想通过宽度为49和高度:36的块来循环主图像,并将每个块放入一个数组中,这样我就可以将数组与Sub图像(使用最近邻搜索)进行比较,看看哪个块有与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 ++++++++++++++++++++++++++++++++++++++++++++++
调试后
_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乘以= 1008(28 * 36)至by = 1008 + 35 = 1043>的同样问题。 1024. - J. Piquard
如果我增加宽度和高度,我的主图像会拉长。有没有解决的办法?
答案 0 :(得分: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 - 在for-loop退出条件中阻止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) << " ";
}
}
}