Я использую 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, которая может помочь в получении правильных индексов, чтобы я не столкнулся с этой ошибкой? Или я ошибаюсь в доступе к правильным индексам?
В самом начале: i == j == jj == 0. Тогда y == 0. Тогда z == (0 - 1 + 0) == -1. –
сейчас 2014 год. прекратите использование устаревшего c-api. – berak