2014-01-08 25 views
1

我正在做一些基於計算機視覺的手勢識別的東西。在這裏,我想檢測一下我手上的一個圓圈(一個圓圈運動)。我的初始階段工作正常,我能夠從我繪製的每一幀中獲得一個質心。這實質上是我的數據集。二維座標點的集合。現在我想檢測一個循環類型的動作,並且說要生成一個調用「檢測到圓圈」的函數。圓形檢測器將給出YES/NO布爾輸出。 以下是我生成的40幀數據集示例The x, y values are just plotted to a bitmap image using MATLAB從2D數據集的圓估計

x,y值只是使用MATLAB繪製爲位圖圖像。 我最初的手部動作很慢,後來我拿起速度在規定的時間內(40幀)完成這個圈子。關於幀數目沒有硬性規定,但現在我使用40幀滑動窗口進行圓圈檢測(0-39),然後是(1-40),然後是(2-41)等。 我也是計算使用連續點之間的反正切:

angle = atan2(prev_y - y, prev_x - x) * 180/pi; 

現在是什麼方法應該採取我用於檢測圓(該樣品圖像應導致YES)。我注意到的角度並不穩定地從0增加到360.它確實增加了,但是隨着跳躍的增加而增加。

回答

1

如果你只在完全或接近滿圈興趣:

我認爲,標準的參數估計方法:霍夫/ RANSAC不會在這種情況下很好地工作。由於你有幀順序,因此連續的斑點中心之間的距離,你可以創建一個接近均勻的數據子樣本(比方說,均勻間隔選取20個點),計算中心並測量所有點的距離來自該中心。

如果它接近一個圓圈,所有的點距離中心的距離都是相似的。

如果你想要做的事稍微更健壯,您可以:

  • 計算中心的所有點的(平均)。
  • 執行漸變下降更新中心:應該相當容易,你不會有局部最小值。誤差項我可能會使用是max(D) - min(D)其中D是塊中心和估計圓心之間的距離向量(但你可以使用強大的統計數據,而不是最大&分鐘)
  • 評估圓
+0

是的,我已經嘗試Hough變換,但它不工作..我現在將嘗試你的第一種方法。謝謝.. – Soumyajit

+0

沒問題,我相當肯定,只要你擁有大部分的圈子,並且你能夠或多或少地均勻地對斑點中心進行採樣,簡單的方法就可以工作。 –

+0

好吧,我嘗試了第一種方法。我手部運動的速度必須或多或少一致,否則質心向緩慢畫出的點(更密集的區域)移動。我想也許是在各點之間畫一條線,然後估計中心。但是這將是計算成本高昂的。 – Soumyajit

0

一可能的方法是: 獲取傾斜角度爲90 - angle的線,並通過點[(x + prev_x)/2 (y + prev_y)/2]。該線與點[x y][prev_x prev_y]之間的線相垂直。你可以獲得40條這樣的線路。

你也可以在連續兩行之間得到intersection point。檢查所有40個交點是否位於驗收範圍內。返回一個布爾值。

0

我會使用最小二乘估計。在數字上你可以使用Nelder-Mead方法。你得到最接近你的點的圓,並根據剩餘誤差值決定是否考慮該圓是否有效。

作爲點陣列的點的,XC,YC連接的中心的座標和半徑R,這可能是錯誤的一個例子,以儘量減少:

class Circle 
{ 
    private PointF[] _points; 
    public Circle(PointF[] points) 
    { 
     _points = points; 
    } 
    public double MinimizeFunction(double xc, double yc, double r) 
    { 
     double d, d2, dx, dy, sum; 

     sum = 0; 
     foreach(PointF p in _points) 
     { 
      dx = p.X - xc; 
      dy = p.Y - yc; 
      d2 = dx * dx + dy * dy; 
      // sum += d2 - r * r; 
      d = Math.Sqrt(d2) - r; 
      sum += d * d; 
     } 
     return sum; 
    } 
    public double ResidualError(double xc, double yc, double r) 
    { 
     return Math.Sqrt(MinimizeFunctional(xc, yc, r))/(_points.Length - 3); 
    } 

} 

有註釋的之間的微小差異功能和未註釋,但由於實際原因,這種差異是沒有意義的。相反,從理論的角度來看,差異很重要。由於您需要提供一個初始值集(xc,yc,r),因此您可以計算出給定三個點的圓,選擇三個彼此遠離的點。

如果您需要更多關於「給出三分的圓圈」或Nelder-Mead的詳細信息,您可以在這裏谷歌或問我。