public static bool Save(string pathName, VisionFlow flow) { if (flow == null) { return(false); } Common.CommonHelper.CreatePath($"{pathName}{flow.FlowName}/"); try { foreach (Detect detect in flow.Detects) { if (detect.GetType() == typeof(DetectGeometric)) { (detect as DetectGeometric).Temp.WriteVisionFile($"{pathName}{flow.FlowName}/{detect.UnitID}.bmp"); } else if (detect.GetType() == typeof(DetectPttern)) { (detect as DetectPttern).Temp.WriteVisionFile($"{pathName}{flow.FlowName}/{detect.UnitID}.bmp"); } else if (detect.GetType() == typeof(DetectShapeMatch)) { (detect as DetectShapeMatch).ShapeModel.WriteShapeModel($"{pathName}{flow.FlowName}/{detect.UnitID}.temp"); } } } catch { return(false); } Common.SerializableHelper <VisionFlow> helper = new Common.SerializableHelper <VisionFlow>(flow); return(helper.JsonSerialize(pathName + flow.FlowName + "/Vision.vp")); }
private void toolNewProgram_Click(object sender, EventArgs e) { fmCreateVisionProgram fm = new fmCreateVisionProgram(); if (fm.ShowDialog() == DialogResult.OK) { this.Flow = new VisionFlow(); this.Flow.FlowName = fm.VisionProgram; ChangedPresstion(true); } }
public fmVisionOutput(VisionFlow flow) { this.flow = flow; InitializeComponent(); this.cb_X.Items.AddRange(flow.GetItem(ResultType.XY).ToArray()); this.cb_Y.Items.AddRange(flow.GetItem(ResultType.XY).ToArray()); this.cb_Angle.Items.AddRange(flow.GetItem(ResultType.Angle).ToArray()); this.cb_Area.Items.AddRange(flow.GetItem(ResultType.Area).ToArray()); this.cb_OrgCrood.Items.AddRange(flow.GetItem(ResultType.Init).ToArray()); this.cb_Code.Items.AddRange(flow.GetItem(ResultType.Code).ToArray()); this.cb_X.Text = flow.ResultX; this.cb_Y.Text = flow.ResultY; this.cb_Angle.Text = flow.Angle; this.cb_Area.Text = flow.Area; this.cb_OrgCrood.Text = flow.OrgCrood; this.cb_Code.Text = flow.Code; }
private void toolReadProgram_Click(object sender, EventArgs e) { fmCreateVisionProgram fm = new fmCreateVisionProgram(false); if (fm.ShowDialog(this) == DialogResult.OK) { var flow = VisionFlow.Load(sPathVision + fm.VisionProgram); if (flow == null) { MessageBox.Show($"导入视觉程式失败!!!"); ChangedPresstion(false); return; } this.Flow = flow; ChangedPresstion(true); ReadToUI(); } }
private void toolSave_Click(object sender, EventArgs e) { fmVisionOutput fm = new fmVisionOutput(this.flow); if (fm.ShowDialog() == DialogResult.Yes) { this.SaveToProgram(); if (this.Flow != null) { if (VisionFlow.Save(sPathVision, this.Flow)) { MessageBox.Show("保存成功!!"); } else { MessageBox.Show("保存失败!!"); } } } }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { if (parent.Detects.Count > 0 && Result != null) { if (Result.ContainsKey(this.Line1ID) && Result.ContainsKey(this.Line2ID)) { rtn.Point = Algorithms.FindIntersectionPoint(Result[this.Line1ID].Line, Result[this.Line2ID].Line); image.Overlays.Default.AddPoint(rtn.Point, Rgb32Value.RedColor, new PointSymbol(PointSymbolType.Cross)); this.AddVisionResc(rtn, $"焦点({rtn.Point.X:n2},{rtn.Point.Y:n2})"); rtn.State = VisionResultState.OK; } } else { rtn.State = VisionResultState.NG; } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; if (parent != null && Result != null) { if (Result.ContainsKey(this.StartPt) && Result.ContainsKey(this.EndPt)) { rtn.Line = new LineContour(Result[this.StartPt].Point, Result[this.EndPt].Point); image.Overlays.Default.AddLine(rtn.Line, Rgb32Value.GreenColor); rtn.Angle = Common.MathHelper.GetAngle(rtn.Line.Start.X, rtn.Line.Start.Y, rtn.Line.End.X, rtn.Line.End.Y); } this.AddVisionResc(rtn, "拟合直线成功"); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "拟合直线失败"); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { if (parent != null && image != null && Result != null) { Collection <PointContour> pt = new Collection <PointContour>(); if (CrossList.Count >= 3) { for (int i = 0; i < CrossList.Count; ++i) { if (Result.ContainsKey(this.CrossList[i])) { pt.Add(Result[this.CrossList[i]].Point); } else { return(rtn); } } FitCircleReport report = Algorithms.FitCircle(pt); rtn.Point = report.Center; this.AddVisionResc(rtn, "拟合成功"); image.Overlays.Default.AddOval(report.Circle, Rgb32Value.RedColor); image.Overlays.Default.AddPoint(rtn.Point, Rgb32Value.RedColor); image.Overlays.Default.AddRoi(report.Circle.ConvertToRoi()); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "拟合点数据少于3"); rtn.State = VisionResultState.NG; } } else { throw new Exception("没有找到对应结果"); } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { var op1 = (this.OptionList[0] as DetectCurveOptions).Options; var roi = this.ROI; if (newRoi != null) { roi = newRoi; } Collection <GeometricEdgeBasedPatternMatch> report = null; lock (locked) { report = Algorithms.MatchGeometricPatternEdgeBased(image, this.Temp, op1, DetectGeometric.MatchOptions, roi.ConvertToRoi()); } if (report.Count > 0) { report[0].Rotation = this.AdjuestAngle(report[0].Rotation); rtn.Point = report[0].Position; rtn.Angle = report[0].Rotation; image.Overlays.Default.AddPoint(rtn.Point, Rgb32Value.RedColor, new PointSymbol(PointSymbolType.Cross)); foreach (var match in report) { image.Overlays.Default.AddPolygon(new PolygonContour(match.Corners), Rgb32Value.BlueColor); } this.AddVisionResc(rtn, $"边缘匹配成功 角度:{rtn.Angle}"); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "边缘匹配失败"); rtn.State = VisionResultState.NG; } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { using (HImage hImage = VisionHelper.Image(image)) { var roi = this.ROI; if (newRoi != null) { roi = newRoi; } RectangleContour rect = roi as RectangleContour; using (HImage reduceImage = hImage.ReduceDomain( new HRegion(rect.Top, rect.Left, rect.Top + rect.Height, rect.Left + rect.Width))) { HRegion hRegion = new HRegion(); hRegion = reduceImage.Threshold(this.MinThreshold, this.MaxThreshold); rtn.Area = hRegion.Area.D; this.AddVisionResc(rtn, $"面积侦测成功 面积值:{rtn.Area:N3}"); rtn.State = VisionResultState.OK; } } //using (VisionImage imageMask = new VisionImage(ImageType.U8, 7)) //{ // using (VisionImage image2Process = new VisionImage(ImageType.U8, 7)) // { // //Algorithms.Copy(image, image2Process); // Algorithms.Threshold(image, image2Process, new Range(this.Threshold, 255), true, 255); // PixelValue fillValue = new PixelValue(255); // Range intervalRange = new Range(0, 0); // var roi = this.ROI; // if (newRoi != null) // roi = newRoi; // Algorithms.RoiToMask(imageMask, roi.ConvertToRoi(), fillValue, image2Process); // HistogramReport a = new HistogramReport(); // a = Algorithms.Histogram(image2Process, 256, intervalRange, imageMask); // image2Process?.Dispose(); // imageMask?.Dispose(); // if (a.Histogram.Count >= 256) // { // if (CheckWhite) // rtn.Area = a.Histogram[255];//白色区域面积 // else // rtn.Area = a.Histogram[0];//黑色区域面积 // } // this.AddVisionResc(rtn, $"面积:{rtn.Area}"); // rtn.State = VisionResultState.OK; // } //} } catch (VisionException ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); try { var roi = this.ROI.ConvertToRoi(); if (parent != null && Result != null && !string.IsNullOrEmpty(parent.OrgCrood) && Result.ContainsKey(parent.OrgCrood)) { CoordinateSystem old = new CoordinateSystem(parent.OrgPoint, parent.BaseAngle); CoordinateSystem newCrood = new CoordinateSystem(Result[parent.OrgCrood].Point, Result[parent.OrgCrood].Angle); Algorithms.TransformRoi(roi, new CoordinateTransform(old, newCrood)); } var op2 = (this.OptionList[0] as DetectEdgeOptions).Options; var op1 = (this.OptionList[1] as DetectStraightEdgeOptions).Options; StraightEdgeReport report = Algorithms.StraightEdge2(image, roi, this.SearchDir, op2, op1, this.OptimizedMode); image.Overlays.Default.AddRectangle(roi.GetBoundingRectangle(), Rgb32Value.BlueColor); if (report.StraightEdges.Count > 0) { rtn.Line = report.StraightEdges[0].StraightEdge; image.Overlays.Default.AddLine(rtn.Line, Rgb32Value.YellowColor); rtn.Angle = Common.MathHelper.GetAngle(rtn.Line.Start.X, rtn.Line.Start.Y, rtn.Line.End.X, rtn.Line.End.Y); if (this.SearchDir == SearchDirection.LeftToRight || this.SearchDir == SearchDirection.RightToLeft) { if (rtn.Angle > 0) { rtn.Angle = 90 - rtn.Angle; } else if (rtn.Angle < 0) { rtn.Angle = 90 + rtn.Angle; } } else { rtn.Angle = -rtn.Angle; } this.AddVisionResc(rtn, $"侦测直线成功 角度:{rtn.Angle}"); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "侦测直线失败"); rtn.State = VisionResultState.NG; } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { image.Type = ImageType.U16; PixelValue va1 = this.SetPixelValue(image.Type, (float)this.Gain, 0, 0, 0); Algorithms.Multiply(image, va1, image); PixelValue va2 = this.SetPixelValue(image.Type, (float)this.Offset, 0, 0, 0); Algorithms.Subtract(image, va2, image); Algorithms.Cast(image, image, ImageType.U8, -1); this.AddVisionResc(rtn, "增强成功"); rtn.State = VisionResultState.OK; } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { Collection <RotationAngleRange> list = new Collection <RotationAngleRange>(); list.Add(new RotationAngleRange(this.MinAngle, this.MaxAngle)); list.Add(new RotationAngleRange(0, 0)); var roi = this.ROI; if (newRoi != null) { roi = newRoi; } Collection <PatternMatchReport> report = null; lock (locked) { report = Algorithms.MatchPattern3(image, this.Temp, this.MatchingAlgorithm, 1, this.MinScore, list, roi.ConvertToRoi(), PatternOption); } if (report.Count > 0) { rtn.Point = report[0].Position; rtn.Angle = this.AdjuestAngle(report[0].Rotation); foreach (PatternMatchReport match in report) { image.Overlays.Default.AddPolygon(new PolygonContour(match.Corners), Rgb32Value.BlueColor); } image.Overlays.Default.AddPoint(report[0].Position); rtn.Point.X = report[0].Position.X; rtn.Point.Y = report[0].Position.Y; this.AddVisionResc(rtn, $"灰度匹配成功 角度:{rtn.Angle}"); rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "匹配失败"); rtn.State = VisionResultState.NG; } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
/// <summary> /// 找圆 /// </summary> /// <param name="image"></param> /// <param name="roi"></param> /// <returns></returns> public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { var op1 = (this.OptionList[0] as DetectCurveOptions).Options; var roi = this.ROI.ConvertToRoi(); if (parent != null && Result != null && !string.IsNullOrEmpty(parent.OrgCrood) && Result.ContainsKey(parent.OrgCrood)) { CoordinateSystem old = new CoordinateSystem(parent.OrgPoint); CoordinateSystem newCrood = new CoordinateSystem(Result[parent.OrgCrood].Point); Algorithms.TransformRoi(roi, new CoordinateTransform(old, newCrood)); } else if (newRoi != null) { roi = newRoi.ConvertToRoi(); } CircleDescriptor dsec = new CircleDescriptor(new Range(this.MinRadius, this.MaxRadius)); var circles = Algorithms.DetectCircles(image, dsec, roi, op1); if (circles.Count > 0) { image.Overlays.Default.AddOval(circles[0].Circle, Rgb32Value.RedColor); image.Overlays.Default.AddPoint(circles[0].Center, Rgb32Value.RedColor); this.AddVisionResc(rtn, $"半径[{circles[0].Radius:N2}] 侦测到个数{circles.Count}"); rtn.Point = circles[0].Center; rtn.State = VisionResultState.OK; } else { this.AddVisionResc(rtn, "没有侦测到圆"); rtn.State = VisionResultState.NG; } } catch (VisionException ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { if (parent.Detects.Count > 0 && Result != null) { if (parent.ResultX != string.Empty && parent.ResultY != string.Empty && parent.Angle != string.Empty && Result.ContainsKey(parent.ResultX) && Result.ContainsKey(parent.ResultY) && Result.ContainsKey(parent.Angle)) { PointContour center = new PointContour(Result[parent.ResultX].Point.X, Result[parent.ResultX].Point.Y); PointContour offset = new PointContour(center.X + this.OffsetX, center.Y + this.OffsetY); PointContour output = new PointContour(); this.PtRotate(offset, center, Result[parent.Angle].Angle - this.BaseAngle, out output); Result[parent.ResultX].Point.X = output.X; Result[parent.ResultY].Point.Y = output.Y; rtn.Point = output; image.Overlays.Default.AddPoint(output, Rgb32Value.YellowColor, new PointSymbol(PointSymbolType.Cross)); this.AddVisionResc(rtn, $"焦点({rtn.Point.X:n2},{rtn.Point.Y:n2})"); rtn.State = VisionResultState.OK; } } else { rtn.State = VisionResultState.NG; } } catch (Exception ex) { this.AddVisionResc(rtn, ex.Message); rtn.State = VisionResultState.NG; } return(rtn); }
/// <summary> /// 视觉计算 /// </summary> /// <param name="image">图像计算</param> /// <param name="parent">流程</param> /// <param name="newRoi">新的ROI</param> /// <returns></returns> public virtual VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { return(new VisionResult()); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; try { lock (locked) { using (VisionImage temp = new VisionImage()) { var roi = this.ROI; if (newRoi != null) { roi = newRoi; } using (HImage hImage = VisionHelper.Image(image)) { RectangleContour rect = roi as RectangleContour; using (HImage reduceImage = hImage.ReduceDomain( new HRegion(rect.Top, rect.Left, rect.Top + rect.Height, rect.Left + rect.Width))) { HTuple numLevels = new HTuple(); numLevels.TupleAdd(this.MaxNumLevels); numLevels.TupleAdd(this.MinNumLevels); HTuple row, col, scaleX, scaleY, score, angle; reduceImage.FindAnisoShapeModel(this.ShapeModel, this.StartAngle, this.EndAngle - this.StartAngle, this.YMinScale, this.YMaxScale, this.XMinScale, this.XMaxScale, this.MinScore, 1, this.MaxOverlap, this.Pixel.ToString(), 0, this.Greediness, out row, out col, out angle, out scaleY, out scaleX, out score); if (score.Length > 0) { rtn.State = VisionResultState.OK; image.Overlays.Default.AddLine (new LineContour(new PointContour(col.D - 50, row.D), new PointContour(col.D + 50, row.D)), Rgb32Value.RedColor); image.Overlays.Default.AddLine (new LineContour(new PointContour(col.D, row.D - 50), new PointContour(col.D, row.D + 50)), Rgb32Value.RedColor); rtn.Point = new PointContour(col.D, row.D); rtn.Angle = angle.TupleDeg().D; this.AddVisionResc(rtn, $"轮廓匹配成功 角度:{rtn.Angle:N3} 分数:{score[0].D:N3}"); } else { rtn.State = VisionResultState.NG; this.AddVisionResc(rtn, $"没有找到匹配模板"); } } } } } } catch (HalconException ex) { this.AddVisionResc(rtn, $"轮廓匹配失败 {ex.GetErrorMessage()}"); } return(rtn); }
public override VisionResult Detected(VisionImage image, Dictionary <string, VisionResult> Result = null, VisionFlow parent = null, Shape newRoi = null) { VisionResult rtn = new VisionResult(); rtn.State = VisionResultState.WaitCal; if (ROI == null || image == null) { rtn.State = VisionResultState.NG; return(rtn); } try { using (VisionImage temp = new VisionImage()) { var roi = this.ROI; if (newRoi != null) { roi = newRoi; } using (HImage hImage = VisionHelper.Image(image)) { RectangleContour rect = roi as RectangleContour; using (HImage reduceImage = hImage.ReduceDomain( new HRegion(rect.Top, rect.Left, rect.Top + rect.Height, rect.Left + rect.Width))) { string code = string.Empty; switch (CodeType) { case CodeType.Code_2D_Mat: code = "Data Matrix ECC 200"; break; case CodeType.Code_QR: code = "QR Code"; break; } using (HDataCode2D code2D = new HDataCode2D(code, "default_parameters", "maximum_recognition")) { HTuple result = new HTuple(); HTuple resultString = new HTuple(); code2D.FindDataCode2d(reduceImage, "stop_after_result_num", 1, out result, out resultString); if (resultString.Length > 0) { rtn.BarCode = resultString.SArr[0]; this.AddVisionResc(rtn, $"条码寻找成功:{rtn.BarCode}"); rtn.State = VisionResultState.OK; image.Overlays.Default.AddText(rtn.BarCode, new PointContour(rect.Left, rect.Top), Rgb32Value.BlueColor, new OverlayTextOptions("Consolas", 128)); } else { rtn.State = VisionResultState.NG; this.AddVisionResc(rtn, $"没有找到条码"); } } } } } } catch (HalconException ex) { this.AddVisionResc(rtn, $"没有找到条码 {ex.GetErrorMessage()}"); } return(rtn); }