public double DistanceSquared(IWhiskerSegment whisker) { double deltaX = whisker.X - X; double deltaY = whisker.Y - Y; double xSquared = Math.Pow(deltaX, 2); double ySquared = Math.Pow(deltaY, 2); return(xSquared + ySquared); }
public WhiskerSegmentXml(IWhiskerSegment whiskerSegment) { X = whiskerSegment.X; Y = whiskerSegment.Y; Angle = whiskerSegment.Angle; LineP1 = new PointXml(whiskerSegment.Line.P1); LineP2 = new PointXml(whiskerSegment.Line.P2); AverageIntensity = whiskerSegment.AvgIntensity; HtmlColor = ColorTranslator.ToHtml(whiskerSegment.Color); }
public IWhiskerSegment GetSegment() { IWhiskerSegment whiskerSegment = ModelResolver.Resolve <IWhiskerSegment>(); whiskerSegment.X = X; whiskerSegment.Y = Y; whiskerSegment.Angle = Angle; whiskerSegment.Line = new LineSegment2D(LineP1.GetPoint(), LineP2.GetPoint()); whiskerSegment.Color = ColorTranslator.FromHtml(HtmlColor); whiskerSegment.AvgIntensity = AverageIntensity; whiskerSegment.DataLoadComplete(); return(whiskerSegment); }
public void FindPotentialWhisker(int frameNumber, IEnumerable <IWhiskerSegment> whiskers) { if (CurrentWhisker == null) { throw new Exception("Must initalise whisker before finding other potential ones"); } SortedList <double, IWhiskerSegment> closeWhiskers = new SortedList <double, IWhiskerSegment>(new DuplicateKeyComparer <double>()); foreach (IWhiskerSegment whisker in whiskers) { //Find closest double cDist = CurrentWhisker.Distance(whisker); if (cDist < (DistanceThreshold * MissingFrameCount)) { closeWhiskers.Add(cDist, whisker); } } //No close whiskers found if (!closeWhiskers.Any()) { MissingFrameCount++; return; } IWhiskerSegment bestWhisker = null; for (int i = 0; i < closeWhiskers.Count; i++) { if (CurrentWhisker.DeltaAngle(closeWhiskers.Values[i]) < (AngleThreshold * MissingFrameCount)) { //Found it! bestWhisker = closeWhiskers.Values[i]; break; } } if (bestWhisker == null) { MissingFrameCount++; return; } bestWhisker.Color = Color; WhiskerList.Add(frameNumber, bestWhisker); CurrentWhisker = bestWhisker; MissingFrameCount = 1; }
public void Initialise(IWhiskerSegment whisker) { CurrentWhisker = whisker; }
public Dictionary <IWhiskerSegment, ITrackSingleWhisker> AllocateWhiskers(int frameNumber, IEnumerable <ITrackSingleWhisker> singleWhiskers, IEnumerable <IWhiskerSegment> currentWhiskers, PointF nosePoint, PointF midPoint) { List <ITrackSingleWhisker> whiskers = singleWhiskers.ToList(); List <HolderClass> holders = new List <HolderClass>(); Vector forwardVec = new Vector(nosePoint.X - midPoint.X, nosePoint.Y - midPoint.Y); double extensionFactor = 10; double forwardX = nosePoint.X + (forwardVec.X * extensionFactor); double forwardY = nosePoint.Y + (forwardVec.Y * extensionFactor); double rearX = midPoint.X - (forwardVec.X * extensionFactor); double rearY = midPoint.Y - (forwardVec.Y * extensionFactor); System.Windows.Point newForwardPoint = new System.Windows.Point(forwardX, forwardY); System.Windows.Point newRearPoint = new System.Windows.Point(rearX, rearY); foreach (IWhiskerSegment foundWhisker in currentWhiskers) { //Find most likely tracked whisker foreach (ITrackSingleWhisker tWhisker in whiskers) { double dist = tWhisker.CurrentWhisker.Distance(foundWhisker); double angle = tWhisker.CurrentWhisker.DeltaAngle(foundWhisker); if (dist < (6 * tWhisker.MissingFrameCount) && angle < (20 * tWhisker.MissingFrameCount)) { HolderClass holder = new HolderClass(); holder.Whisker = foundWhisker; holder.TrackedWhisker = tWhisker; holder.Score = dist; holder.PotentialTracks.Add(tWhisker, dist); System.Windows.Point centerPoint = GetCenterPoint(foundWhisker.Line); System.Windows.Point linePoint; MathExtension.FindDistanceToSegmentSquared(centerPoint, newForwardPoint, newRearPoint, out linePoint); double forwardVecDist = linePoint.DistanceSquared(nosePoint); holder.DistanceFromNose = forwardVecDist; holders.Add(holder); } } } //We now have every whisker associated with a tracked whisker, need to find lowest values //HolderClass[] newHolders = holders.OrderBy(x => x.Score).ThenBy(x => x.DistanceFromNose).ToArray(); List <ITrackSingleWhisker> usedTrackedWhiskers = new List <ITrackSingleWhisker>(); List <IWhiskerSegment> usedWhiskers = new List <IWhiskerSegment>(); Dictionary <IWhiskerSegment, ITrackSingleWhisker> finalWhiskers = new Dictionary <IWhiskerSegment, ITrackSingleWhisker>(); int maxPos = singleWhiskers.Select(x => x.PositionId).Max(); double currentDistFromNose = 0; for (int currentPos = 0; currentPos <= maxPos; currentPos++) { //Get holders for position index IEnumerable <HolderClass> bestHolders = holders.Where(x => x.TrackedWhisker.PositionId == currentPos && x.DistanceFromNose > currentDistFromNose).OrderBy(x => x.Score); if (!bestHolders.Any()) { continue; } HolderClass bestHolder = bestHolders.First(); currentDistFromNose = bestHolder.DistanceFromNose; ITrackSingleWhisker tSingle = bestHolder.TrackedWhisker; IWhiskerSegment tWhisker = bestHolder.Whisker; if (usedTrackedWhiskers.Contains(tSingle)) { continue; } if (usedWhiskers.Contains(tWhisker)) { continue; } finalWhiskers.Add(tWhisker, tSingle); tWhisker.Color = tSingle.Color; usedTrackedWhiskers.Add(tSingle); usedWhiskers.Add(tWhisker); tSingle.MissingFrameCount = 1; } //for (int i = 0; i < newHolders.Length; i++) //{ // HolderClass cHolder = newHolders[i]; // ITrackSingleWhisker tSingle = cHolder.TrackedWhisker; // IWhiskerSegment tWhisker = cHolder.Whisker; // if (usedTrackedWhiskers.Contains(tSingle)) // { // continue; // } // if (usedWhiskers.Contains(tWhisker)) // { // continue; // } // finalWhiskers.Add(tWhisker, tSingle); // tWhisker.Color = tSingle.Color; // usedTrackedWhiskers.Add(tSingle); // usedWhiskers.Add(tWhisker); // tSingle.MissingFrameCount = 1; //} foreach (ITrackSingleWhisker tWhisker in whiskers) { if (!usedTrackedWhiskers.Contains(tWhisker)) { tWhisker.MissingFrameCount++; } } return(finalWhiskers); }
public double DeltaAngle(IWhiskerSegment whisker) { return(Math.Abs(Angle - whisker.Angle)); }