【问题标题】:Mat::at<double>(i,j) SIGSEGV, Segmentation faultMat::at<double>(i,j) SIGSEGV,分段错误
【发布时间】:2014-01-14 07:09:16
【问题描述】:

我一直在关注我正在维护的特定代码,但似乎不知道为什么会发生错误。 我在 this locationhere 检查了类似的错误,但提供的建议似乎无法解决我的问题

给定一个带有rows 261cols 264Mat 图像

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 %f\n", 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,分段错误。 现在,它甚至不再适用于单个图像。

我不确定是否有我的眼睛没有注意到的错误。

等待您的建议

【问题讨论】:

    标签: c++ opencv matrix segmentation-fault


    【解决方案1】:

    矩阵坐标是零索引的,所以给定一个Matrows = 261,如果你调用at(i, j),那么i 的范围可能是0 到260。请参阅http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-at 的示例代码。

    【讨论】:

      猜你喜欢
      • 2012-12-27
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多