2013-05-04 1 views
1

Хорошо, что я использую метод SimpleShapeChecker.IsCircle для обнаружения моего ученика. Он работает очень хорошо, но когда я смотрю в стороны, зрачок поворачивается, как овальная/эллиптическая форма. Есть ли способ обнаружения овалов ?, или есть способ «расслабить» метод IsCircle()?AForge ShapeCheker.IsCircle метод

Благодаря

ответ

2

Unfurtunately в AForge нет IsOval функция().

Но вы можете взглянуть на исходный код проверки фигуры!

https://code.google.com/p/aforge/source/browse/trunk/Sources/Math/Geometry/SimpleShapeChecker.cs?r=1402

Вы можете увидеть функцию IsCircle() и изменить его, чтобы увидеть, если овальное или нет.

Это функция:

public bool IsCircle(List<IntPoint> edgePoints, out Point center, out float radius) 
     { 
      // make sure we have at least 8 points for curcle shape 
      if (edgePoints.Count < 8) 
      { 
       center = new Point(0, 0); 
       radius = 0; 
       return false; 
      } 

      // get bounding rectangle of the points list 
      IntPoint minXY, maxXY; 
      PointsCloud.GetBoundingRectangle(edgePoints, out minXY, out maxXY); 
      // get cloud's size 
      IntPoint cloudSize = maxXY - minXY; 
      // calculate center point 
      center = minXY + (Point) cloudSize/2; 

      radius = ((float) cloudSize.X + cloudSize.Y)/4; 

      // calculate mean distance between provided edge points and estimated circle’s edge 
      float meanDistance = 0; 

      for (int i = 0, n = edgePoints.Count; i < n; i++) 
      { 
       meanDistance += (float) Math.Abs(center.DistanceTo(edgePoints[i]) - radius); 
      } 
      meanDistance /= edgePoints.Count; 

      float maxDitance = Math.Max(minAcceptableDistortion, 
       ((float) cloudSize.X + cloudSize.Y)/2 * relativeDistortionLimit); 

      return (meanDistance <= maxDitance); 
     } 

Может быть, если вы играете с переменной minAcceptableDistortion, вы можете обнаружить овалы тоже!

Надеюсь, это помогло.