负索引运行时错误

时间:2014-10-22 13:26:28

标签: c++ opencv visual-c++

我使用this作为我的参考来实现我的双立方插值版本以调整图像大小。这是我到目前为止所做的一些功能。

    IplImage * bicubic(IplImage *img, int newWidth, int newHeight)
{
    IplImage *img2 ;
    img2 = createImage(newWidth,newHeight);
    uchar * data = (uchar*)img->imageData;
    uchar * Data = (uchar*)img2->imageData;
    //int a,b,c,index;

    uchar Cc;
    uchar C[5];
    uchar d0,d2,d3,a0,a1,a2,a3;
    int i,j,k,jj;
    int x,y;
    float dx,dy;
    float tx,ty;

    tx =  (float)img->width /newWidth ;
    ty =  (float)img->height / newHeight;
    printf("New Width = %d, New Height = %d WidthStep = %d", newWidth, newHeight,img->widthStep);

    for(i = 0; i< newHeight; i++)
    {
        for(j = 0; j< newWidth; j++)
        {       
            x = (int)(tx * j);
            y = (int)(ty * i);

            dx = tx * j - x;
            dy = ty * i - y;

            for(k = 0;k < 3;k++)
            {
                for(jj = 0;jj <= 3 ;jj++)
                {                                       
                    int z = (y - 1 + jj);
                    //if(z > -1){
                    a0 = data[z * img->widthStep + (x)*img->nChannels +k];//===>Throws of runtime error
                    d0 = data[z * img->widthStep + (x-1)*img->nChannels +k] - a0 ;
                    d2 = data[z * img->widthStep + (x+1)*img->nChannels +k] - a0 ;
                    d3 = data[z * img->widthStep + (x+2)*img->nChannels +k] - a0 ;

                    a1 = -1.0/3 * d0 + d2 -1.0/6*d3;
                    a2 =  1.0/2 * d0 + 1.0/2*d2;
                    a3 = -1.0/6 * d0 - 1.0/2*d2 + 1.0/6*d3;
                    C[jj] = a0 + a1*dx + a2*dx*dx + a3*dx*dx*dx;

                    d0 = C[0]-C[1];
                    d2 = C[2]-C[1];
                    d3 = C[3]-C[1];
                    a0 = C[1];
                    a1 = -1.0/3*d0 + d2 -1.0/6*d3;
                    a2 =  1.0/2*d0 + 1.0/2*d2;
                    a3 = -1.0/6*d0 - 1.0/2*d2 + 1.0/6*d3;
                    Cc = a0 + a1*dy + a2*dy*dy + a3*dy*dy*dy;

                    Data[i*img2->widthStep +j*img2->nChannels +k ] = Cc;
                    //}
                }
            }
        }
    }
    return img2;  
}

我面临的问题是,当我调用此bicubic函数时,它会在我找到a0的值的行中抛出无效的访问运行时错误。我正在使用VS 2012调试器,它告诉我z的值计算为-1。这会导致索引访问data数组的无效内存部分。

我的问题是,为什么会发生这种情况?我在OpenCV的图像库中遗漏了哪些东西可以帮助获得正确的索引,以便我不会遇到这个错误?或者我在访问正确的索引时犯了一些错误?

1 个答案:

答案 0 :(得分:0)

for(i = 0; i< newHeight; i++)
    {
        for(j = 0; j< newWidth; j++)
        {       
            x = (int)(tx * j);
            y = (int)(ty * i);

            dx = tx * j - x;
            dy = ty * i - y;

            for(k = 0;k < 3;k++)
            {
                for(jj = 0;jj <= 3 ;jj++)
                {                                       
                    int z = (y - 1 + jj);

                    //if(z > -1){
                    a0 = data[z * img->widthStep + (x)*img->nChannels +k];//===>Throws of runtime error
                    d0 = data[z * img->widthStep + (x-1)*img->nChannels +k] - a0 ;

在第一次迭代中,ij为0. kjj

这意味着:

 y = (int)(ty * i);    //y = ty * 0    (== 0)
int z = (y - 1 + jj);  //z = 0 - 1 + 0 (==-1)

等等:

a0 = data[z * img->widthStep + (x)*img->nChannels +k];//===>Throws of runtime error

索引是:

(-1) * img->widthStep + (x)*img->nChannels +k

简化为:

(-1) * img->widthStep + 0 + 0

是:

-img->widthStep

这当然是出界的,导致了崩溃。