2013-07-07 54 views
-2

我想在不使用cvcanny函數的情況下將canny邊緣檢測應用於圖像,因此所需步驟的一部分是應用我所擁有的高斯蒙版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有什麼價值?如果SIGMA大於0.3333,則在'gaussian_mask()'中出現訪問越界。 – Bull

+0

@ user2151446我之前使用的值爲1,按照您的建議我也嘗試了0.333,但它沒有幫助。 – user2558879

回答

-1

當您創建遮罩,轉換圖像或進行卷積時,可能會發生訪問衝突。您可以先註釋掉所有代碼,然後從頂部取消註釋,同時觀察哪個行/塊會給出錯誤。還可以使用IDE的調試器查看索引的值,並檢查超出範圍的值。

+0

它正在發生,當我正在進行卷積;當我將價值分配給convx和convy數組是特定的。 代碼對前480行運行良好,然後突然中斷。 – user2558879

+0

如果你的圖像是640 * 480,行數是480​​,列數是640.你有任何交換這兩個機會嗎? – Totoro

+0

Ehm,只是想知道爲什麼我的答案被低估了,當它被標記爲這個問題的答案時:-( – Totoro