private void UpdateDevice(BlobData blob, Marker marker = null) { var device = Devices.Single(d => d.BlobId == blob.Id); var center = new Point(blob.Center.X, blob.Center.Y); device.Key = blob.Key; //device.BlobId = blob.Id; device.Center = center; device.State = blob.State; device.Shape = blob.Polygon; device.Area = blob.Area; if (marker != null) { device.DeviceId = marker.Id; device.IsIdentified = true; device.Angle = marker.Angle; device.RgbImageToDisplayRatio = marker.RgbImageToDisplayRatio; } else { var deltaAngle = blob.Angle - device.LastBlobAngle; // this is a hack but it works pretty good //if (deltaAngle > 45) //{ // deltaAngle -= 90; // //return; //} //else if (deltaAngle < -45) //{ // deltaAngle += 90; //} //Console.WriteLine("Delta Angle {0}", deltaAngle); device.LastBlobAngle = blob.Angle; device.Angle += deltaAngle; } }
private Marker FindDisplayInImage(ref Image<Gray, byte> grayscaleImage, Rectangle roi, int width, int height, Marker marker, ref Image<Rgb, byte> debugImage) { var imageWidth = grayscaleImage.Width; var imageHeight = grayscaleImage.Height; var x = (int)(marker.RelativeCenter.X * imageWidth) - roi.X; var y = (int)(marker.RelativeCenter.Y * imageHeight) - roi.Y; var grayscaleImageRoi = grayscaleImage.ROI; grayscaleImage.ROI = roi; var enclosingRectangle = FindEnclosingRectangle(ref grayscaleImage, new Point(x, y), ref debugImage, roi); grayscaleImage.ROI = grayscaleImageRoi; if (enclosingRectangle == null) return null; return new Marker(this, "Display") { Id = marker.Id, Center = marker.Center, Angle = marker.Angle, RgbImageToDisplayRatio = new Ratio { X = width / enclosingRectangle.LongEdge.Length, Y = height / enclosingRectangle.ShortEdge.Length }, EnclosingRectangle = enclosingRectangle }; }