2014-10-22 3 views
-2

Я использую 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, которая может помочь в получении правильных индексов, чтобы я не столкнулся с этой ошибкой? Или я ошибаюсь в доступе к правильным индексам?

+0

В самом начале: i == j == jj == 0. Тогда y == 0. Тогда z == (0 - 1 + 0) == -1. –

+0

сейчас 2014 год. прекратите использование устаревшего c-api. – berak

ответ

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 ; 

На первой итерации, i и j равны 0. как и k и jj

Это означает, что:

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 

Это, конечно, за пределами поля, что приводит к аварии.

+0

Глядя на вашу ссылку, я не вижу, как она не страдает от того же. Также в этом коде есть странные вещи, например. 'index, a, b, c' инициализируются и не используются,' d' даже не заходит так далеко. – Baldrickk

Смежные вопросы