2013-04-25 89 views
0

我試圖在已經預處理的圖像中實現霍夫變換用於行檢測。 所以我的輸入圖像是一個黑白色的邊緣圖像,0-背景和255-前景。我不希望OpenCV使用內置的HoughLines庫。 我實際上堅持創建累加器並正確增加其值。我無法弄清楚我錯了哪裏,所以這裏是我的代碼塊:實現行的霍夫變換

int diagonal = sqrt(height * height + width * width); 

IplImage *acc = cvCreateImage (cvSize(180, 2 * diagonal),IPL_DEPTH_8U, 1); 
unsigned char* accData = (unsigned char *)acc->imageData; 

for (int i=0; i<height; i++) 
{ 
    for (int j=0; j<step; j++) 
    { 
     if (data[i*step + j] > 200) 
     { 
      for (int theta=0; theta<180; theta++) 
      { 
       int p = j * cos(theta) + i * sin(theta); 
       if (p > 0) 
        accData[theta*180 + p] += 1; 
      } 
     } 
    } 
} 

我在acc中得到的輸出圖像不是它應該的樣子。我沒有得到任何正弦曲線,只有白色的補丁在這裏和那裏。任何人都可以提供任何關於我哪裏出錯的反饋?

+0

*「我不希望通過OpenCV的使用內置的HoughLines庫」 * - 出於興趣,爲什麼不呢? – 2013-04-25 08:32:43

+0

cos和sin以弧度爲單位的輸入,而不是度數 – moonshadow 2013-04-25 08:39:07

+0

我使用了[類似的](https://sourceforge.net/p/fitsviewhartman/code/ci/tip/tree/src/NOCUDA.c#l69),但它效果很好。爲了讓它更快速,首先你應該填充sin/cos(和@moonshadow所說的,你的錯誤在參數中)。 – 2013-04-25 08:39:23

回答

1

我看到那裏的是,你不使用竇與弧度值,但與度值可以按如下更改:

int p = j * cos((double)theta*PI/180) + i * sin((double)theta*PI/180); 
+0

非常感謝..結果現在更像它應該是。我將繼續這個過程來獲得確切的座標。 – Soumyajit 2013-04-25 09:07:02