2013-07-07 3 views
-2

Я хочу применить обнаружение canny edge к изображению без использования функции cvcanny, поэтому часть необходимых шагов - применить гауссовую маску, для которой у меня есть 2 маски для направления x и y. Теперь проблема в том, что всякий раз, когда я пытаюсь сверлить маску на моем изображении, выполнение прерывается из-за «нарушения доступа». Почему это происходит и как я могу это преодолеть?свертывание гауссовской маски на изображении без использования встроенных функций

//DECLARATIONS.. 
double maskx[3][3]; 
double masky[3][3]; 
double convx[1000][1000]={0}; 
double convy[1000][1000]={0}; 
double M[1000][1000]={0}; //magnitude 
double slope[1000][1000]; 


int gaussian_mask() 
{ 
int MaskRadius=SIGMA*3; 
double eq1; 
double exp=2.71828183; 

for(int p=-MaskRadius; p<=MaskRadius; p++) 
{ 
for(int q=-MaskRadius; q<=MaskRadius; q++) 
{ 
    eq1=-1*(p*p + q*q)/(2*SIGMA); 
    maskx[p+MaskRadius][q+MaskRadius]=-1*q*(pow(exp,eq1)); 
    masky[p+MaskRadius][q+MaskRadius]=-1*p*(pow(exp,eq1)); 
} 
} 

return MaskRadius; 
} 

IplImage* convolve(IplImage *im) 
{ 
int MaskRadius=gaussian_mask(); 
int row=im->width; 
int col=im->height; 
printf("row: %d, col= %d",row,col); 

//-----------------------------------------------------------------------------------// 

IplImage *pix=cvCreateImage(cvGetSize(im), im->depth, 1);  //converting 3 channel to 1 channel 
cvSetImageCOI(im,1); 
cvCopy(im,pix); 
cout<<endl<<"No. of channels = "<<pix->nChannels; 
//-----------------------------------------------------------------------------------------------// 

for(int i=MaskRadius; i<=row-MaskRadius; i++)    //convolving the image 
{ 
uchar* ptr1 = (uchar*) (pix->imageData + i * pix->widthStep); 
uchar* ptr0 = (uchar*) (pix->imageData + (i-1) * pix->widthStep); 
uchar* ptr2 = (uchar*) (pix->imageData + (i+1) * pix->widthStep); 
for(int j=MaskRadius; j<=col-MaskRadius; j++) 
{ 
    cout<<endl<<i<<" , "<<j; 
    convx[i][j]=(double)ptr1[j-1]*maskx[1][0]+ptr1[j]*maskx[1][1]+ptr1[j+1]*maskx[1][2] + (ptr2[j-1]*maskx[0][0]+ptr2[j]*maskx[0][1]+ptr2[j+1]*maskx[0] + ptr0[j-1]*maskx[2][0]+ptr0[j]*maskx[2][1]+ptr0[j+1]*maskx[2][2]); 

    convy[i][j]=(double)ptr1[j-1]*masky[1][0]+ptr1[j]*masky[1][1]+ptr1[j+1]*masky[1][2] + (ptr2[j-1]*masky[0][0]+ptr2[j]*masky[0][1]+ptr2[j+1]*masky[0] + ptr0[j-1]*masky[2][0]+ptr0[j]*masky[2][1]+ptr0[j+1]*masky[2][2]); 

    double eq2=pow(convx[i][j],2)+pow(convy[i][j],2); 
    M[i][j]=(double)sqrt(eq2); 
} 
} 
+2

Нарушение прав доступа обычно означает, что вы пытаетесь получить доступ к памяти, которой не должно быть. A) можете ли вы рассказать нам, по какой строке это происходит, B) уверены ли вы, что ваши индексы находятся в правильном диапазоне? – Borgleader

+0

Какое значение имеет SIGMA? Доступ за пределы происходит в 'gaussian_mask()', если SIGMA больше 0,3333. – Bull

+0

@ user2151446 Я раньше использовал значение 1, следуя вашему предложению, я также пробовал его с 0.333, но это не помогло. – user2558879

ответ

-1

Нарушение прав доступа может произойти, когда вы создаете маску, когда вы конвертируете изображение, или когда вы делаете свертку. Вы можете начать с комментирования всего кода, а затем раскомментировать его сверху, заметив, какая строка/блок дает вам ошибку. Также используйте отладчик IDE для просмотра значений индексов и проверки для тех, кто выходит за пределы диапазона.

+0

Это происходит, когда я делаю свертку; и когда я присваиваю значения конвективным и конвейерным массивам, чтобы быть конкретными. код работает отлично для первых 480 строк, а затем он внезапно ломается. – user2558879

+0

Если ваше изображение составляет 640 * 480, количество строк - 480 и количество столбцов 640. Вы обменялись этими двумя случайно? – Totoro

+0

Эмм, просто интересно, почему мой ответ был проголосован, когда он отмечен как ответ на этот вопрос :-( – Totoro

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