2011-07-14 57 views
2

我想要在圖像[大小:512 X 512]中檢測類型:y^2 = 4a * x的拋物線。我準備了一個累加器陣列,acc [size:512 X 512 X 512]。我準備了與該圖像對應的MATRIX。我用了霍夫變換。這是我如何做到了:OpenCV:使用霍夫變換的拋物線檢測

for x = 1 to 512 
    for y= 1 to 512 
    if image_matrix(x,y)> 245//almost white value, so probable to be in parabola 
    { 
    for x1= 1 to 512 
     for y1= 1 to 512 
     { 
      calculate 'a' from (y-y1)^2 = 4*a*(x-x1). 
      increment acc(i,j,k) by 1 
     } 
    } 

if acc(i,j,k) has a maximum value. 
{ 
    x1=i, y1=j,a =k 
} 

我面臨以下問題:

1)ACC [512] [512] [512]需要大的存儲器。它需要大量的計算。我怎樣才能減少數組的大小,從而最小化計算? 2)不總是acc(i,j,k)的最大值賦值給出預期的輸出。有時候,第二或第三最大值,甚至最大值的第10位給出了預期的輸出。我需要約。 'a','x1','y1'(非精確值)的值。

請幫幫我。我的概念有錯嗎?

+0

你可以發佈一個鏈接到圖像的例子 –

回答

2

我要說的只能部分回答你的問題,但它應該工作。

如果你想找到這些類型的拋物線

y^2 = 4a*x 

然後,他們被只有一個參數是「A」參數化的。因此,我不明白你爲什麼使用3維的累加器。

可以肯定的,如果你想找到一個拋物線與像更一般的等式:

y = ax^2 + bx + c 

或通過由Y x替換y方向,你需要一個3維蓄電池就像在你例。

我覺得你的情況的問題可以很容易解決的,說你只需要一個貯液器(如你只有一個參數積累:一)

這就是我建議:

for every point (x,y) of your image (x=0 exclusive) { 
     calculate (a = y^2/4x) 
     add + 1 in the corresponding 'a' cell of your accumulator 
     (eg: a = index of a simple table) 
    } 

    for all the cells of your accumulator { 
     if (cell[idx] > a certain threshold) there is a certain parabola with a = idx 
    } 

我希望它能幫助你, This is as well an interesting thing to look at : Julien,