2011-07-14 30 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,