void Cam_NewFrame(object sender, NewFrameEventArgs eventArgs) { try { /* * if (framecounter >= 30) * { * if (videoCam != null && videoCam.IsRunning) * { * videoCam.SignalToStop(); * // videoSource.WaitForStop(); * //videoSource = null; * } * framecounter = 0; * } * framecounter++; */ Bitmap image = (Bitmap)eventArgs.Frame.Clone(); visionLocation.SetCurrentImage(image); visionLocation.ApplyConvertToGrayscale(); //visionLocation.applySobelEdgeFilter(); visionLocation.ApplyCannyEdgeDetector(); outstr = visionLocation.LocateObjects(); // data.Dispatcher.Invoke( // new UpdateTextCallback(this.UpdateTable), // new object[] { outstr.Loc1X, outstr.Loc1Y, outstr.Loc2X, outstr.Loc2Y, outstr.Loc3X, outstr.Loc3Y, //outstr.Loc4X, outstr.Loc4Y, outstr.ItemWidth, outstr.ItemHeight, outstr.LocAngle, outstr.LocText, //outstr.OffsetX, outstr.OffsetY } // ); img.Dispatcher.BeginInvoke(new ThreadStart(delegate { img.Source = MakeBS(visionLocation.GetCurrentImage()); })); /* * if (outstr != null && outstr.Loc1X > 0) * { * if (videoCam != null && videoCam.IsRunning) * { * videoCam.SignalToStop(); * // videoSource.WaitForStop(); * //videoSource = null; * } * framecounter = 0; * } */ } catch (Exception ex) { MessageBox.Show(ex.ToString()); } }
public VisionLocationResult LocateObjects() { VisionLocationResult ld = new VisionLocationResult(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "", 0, 0, null); int totalwidth = 0; int totalheight = 0; System.Drawing.Point centerpoint = new System.Drawing.Point(); if (currentImage != null) { try { Bitmap image = new Bitmap(this.currentImage); totalwidth = image.Width; totalheight = image.Height; centerpoint.X = image.Width / 2; centerpoint.Y = image.Height / 2; // lock image BitmapData bmData = image.LockBits( new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadWrite, image.PixelFormat); // turn background to black ColorFiltering cFilter = new ColorFiltering(red: new IntRange(0, 64), green: new IntRange(0, 64), blue: new IntRange(0, 64)); //cFilter.Red = new IntRange(0, 64); //cFilter.Green = new IntRange(0, 64); //cFilter.Blue = new IntRange(0, 64); cFilter.FillOutsideRange = false; cFilter.ApplyInPlace(bmData); // locate objects BlobCounter bCounter = new BlobCounter(); bCounter.FilterBlobs = true; bCounter.MinHeight = 10; bCounter.MinWidth = 10; bCounter.ProcessImage(bmData); Blob[] baBlobs = bCounter.GetObjectsInformation(); image.UnlockBits(bmData); // coloring objects SimpleShapeChecker shapeChecker = new SimpleShapeChecker(); Graphics g = Graphics.FromImage(image); Pen bluePen = new Pen(Color.Blue, 2); Pen whitepen = new Pen(Color.White, 1); for (int i = 0, n = baBlobs.Length; i < n; i++) { List <IntPoint> edgePoints = bCounter.GetBlobsEdgePoints(baBlobs[i]); Rectangle[] _rects = bCounter.GetObjectsRectangles(); List <IntPoint> corners; // is triangle or quadrilateral if (shapeChecker.IsConvexPolygon(edgePoints, out corners)) { PolygonSubType subType = shapeChecker.CheckPolygonSubType(corners); Pen pen; if (subType == PolygonSubType.Rectangle && corners.Count == 4) { pen = bluePen; ld.Loc1X = corners[0].X; ld.Loc1Y = corners[0].Y; ld.Loc2X = corners[1].X; ld.Loc2Y = corners[1].Y; ld.Loc3X = corners[2].X; ld.Loc3Y = corners[2].Y; ld.Loc4X = corners[3].X; ld.Loc4Y = corners[3].Y; // find longest side of rectangle double side1 = corners[0].DistanceTo(corners[1]); double side2 = corners[1].DistanceTo(corners[2]); double angleInRadians = 0; double deltaY = 0; double deltaX = 0; int select1 = 0; int select2 = 1; if (side1 < side2) { select1 = 1; select2 = 2; ld.ItemWidth = side2; ld.ItemHeight = side1; } else { ld.ItemWidth = side1; ld.ItemHeight = side2; } // find angle of longest side angleInRadians = Math.Atan2(corners[select1].Y, corners[select1].X) - Math.Atan2(corners[select2].Y, corners[select2].X); deltaY = Math.Abs(corners[select2].Y - corners[select1].Y); deltaX = Math.Abs(corners[select2].X - corners[select1].X); double angleInDegrees = Math.Atan2(deltaY, deltaX) * 180 / Math.PI; ld.LocAngle = angleInDegrees; ld.OffsetY = PixelsToMM((GetCenter(corners).X - (totalwidth / 2)) * -1); ld.OffsetX = PixelsToMM(GetCenter(corners).Y - (totalheight / 2)); ld.LocText = "side1: " + side1.ToString() + Environment.NewLine + "side2: " + side2.ToString() + Environment.NewLine + "Center X: " + GetCenter(corners).X + "Center Y: " + GetCenter(corners).Y + Environment.NewLine + "Image Center: " + (totalwidth / 2).ToString() + " x " + (totalheight / 2).ToString(); System.Drawing.Point[] _coordinates = ToPointsArray(corners); // draw outline and corners g.DrawPolygon(pen, _coordinates); // draw center cross lines on image g.DrawLine(whitepen, new System.Drawing.Point(0, totalheight / 2), new System.Drawing.Point(totalwidth, totalheight / 2)); g.DrawLine(whitepen, new System.Drawing.Point(totalwidth / 2, 0), new System.Drawing.Point(totalwidth / 2, totalheight)); ld.Image = image; } } } whitepen.Dispose(); bluePen.Dispose(); g.Dispose(); this.currentImage = image; return(ld); } catch (Exception e) { MessageBox.Show(e.ToString()); } } return(ld); }