我一直在维护我正在维护的特定代码上拔头发,似乎不知道为什么会发生错误。我在此位置和此处检查了类似的错误,但提供的建议似乎无法解决我的问题
给定具有rows 261
和cols 264
的Mat
图像
int i = image.rows;
int j = image.cols;
int nbs[4][2] = {{i-1,j},{i,j-1},{i,j+1},{i+1,j}};
for (int n = 0; n < 4; n ++)
{
int k = nbs[n][0];
int l = nbs[n][1];
renew_gI_gT(k, l);
}
void get_gT( int i, int j )
{
// gT_x
int d = 0;
double sum = 0.0;
if( i >= 0 && j - 1 > 0 && f.at<uchar>( i, j - 1 ) != INSIDE )
{
d += 1;
sum += T.at<double>( i, j ) - T.at<double>( i, j - 1 );
}
if( i >= 0 && j + 1 < image.cols && f.at<uchar>( i, j + 1 ) != INSIDE )
{
d += 1;
sum += T.at<double>( i, j + 1 ) - T.at<double>( i, j );
}
if( d != 0 )
{
sum = sum / d;
gT_x.at<double>( i, j ) = sum;
}
// gT_y
d = 0;
sum = 0.0;
if( i >= 0 && i - 1 > 0 && f.at<uchar>( i - 1, j ) != INSIDE )
{
d += 1;
sum += T.at<double>( i, j ) - T.at<double>( i - 1, j );
}
if( i >= 0 && i + 1 < image.rows && f.at<uchar>( i + 1, j ) != INSIDE )
{
d += 1;
sum += T.at<double>( i + 1, j ) - T.at<double>( i, j );
}
if( d != 0 )
{
sum = sum / d;
gT_y.at<double>( i, j ) = sum; // gdb debugger says this line causes SIGSEGV, Segmentation fault. when i=261, j=249
}
// printf("[%d,%d] &f %fn", i, j, gT_x.at<double>(i, j), gT_y.at<double>(i, j));
// return;
}
void renew_gI_gT( int i, int j )
{
get_gI( i - 1, j );
get_gI( i, j - 1 );
get_gI( i, j );
get_gI( i, j + 1 );
get_gI( i + 1, j );
get_gT( i - 1, j );
get_gT( i, j - 1 );
get_gT( i, j );
get_gT( i, j + 1 );
get_gT( i + 1, j );
// return;
}
Mat图像(全局变量)的初始化如下所示
T = Mat( image.rows, image.cols, CV_64FC1 );
f.create( image.rows, image.cols, CV_8UC1 );
gT_x = Mat( image.rows, image.cols, DataType<double>::type ); //CV_64FC1;
gT_y = Mat( image.rows, image.cols, DataType<double>::type ); //CV_64FC1;
挑战在于,当使用单个图像时,程序首先可以工作。一旦我循环遍历一组图像以对集合中的每个图像使用该程序,我就会得到 SIGSEGV,上面指定的行的分段错误。现在,它甚至不再适用于单个图像。
我不确定是否有我的眼睛没有捕捉到的某个地方的错误。
等待您的建议
矩阵坐标是零索引的,因此给定一个带有 rows = 261
的Mat
,如果您调用at(i, j)
则i
范围可能从 0 到 260。请参阅 http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-at 中的示例代码。