2014-01-08 22 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的详细信息,您可以在这里谷歌或问我。