public override bool Process_image(HObject ho_Image, VisionControl visionControl) { if (ModeID == null) { MessageBox.Show(m_strStepName + ":模板不存在,请登录模板", "Err", MessageBoxButtons.OK, MessageBoxIcon.Error); _logger.Warn(m_strStepName + ":模板不存在,请登录模板"); return(false); } if (ho_Image == null || !ho_Image.IsInitialized()) { _logger.Warn(m_strStepName + ":匹配图片不存在,请读取或采集图片"); MessageBox.Show(m_strStepName + ":匹配图片不存在,请读取或采集图片", "Err", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } HObject ReduceImg = null; try { visionShapParam.ResultRow.Clear(); visionShapParam.ResultCol.Clear(); visionShapParam.ResultAngle.Clear(); visionShapParam.OutPointInResultImg.Clear(); HTuple hv_Row1 = null, hv_Column1 = null, hv_Row2 = null; HTuple hv_Column2 = null, hv_Row = null; HTuple hv_Column = null, hv_Angle = null, hv_ScaleR = null; HTuple hv_ScaleC = null, hv_Score = null; // HOperatorSet.SetSystem("border_shape_models", "true"); if (RegionSearch != null && RegionSearch.IsInitialized()) { HOperatorSet.ReduceDomain(ho_Image, RegionSearch, out ReduceImg); } if (visionShapParam.ModeType.ToString() == "形状") { if (ReduceImg != null && ReduceImg.IsInitialized()) { HOperatorSet.FindScaledShapeModel(ReduceImg, ModeID, (new HTuple(visionShapParam.AngleStart)).TupleRad(), (new HTuple(visionShapParam.AngleExtent)).TupleRad(), visionShapParam.MinRowScale, visionShapParam.MaxRowScale, visionShapParam.dSorce, visionShapParam.nNum, visionShapParam.MaxOverlap, "least_squares", (new HTuple(visionShapParam.MatchPyamidLow)).TupleConcat(new HTuple(visionShapParam.MatchPyamidHigh)), 0.7, out hv_Row, out hv_Column, out hv_Angle, out hv_ScaleR, out hv_Score); } else { HOperatorSet.FindScaledShapeModel(ho_Image, ModeID, (new HTuple(visionShapParam.AngleStart)).TupleRad(), (new HTuple(visionShapParam.AngleExtent)).TupleRad(), visionShapParam.MinRowScale, visionShapParam.MaxRowScale, visionShapParam.dSorce, visionShapParam.nNum, visionShapParam.MaxOverlap, "least_squares", (new HTuple(visionShapParam.MatchPyamidLow)).TupleConcat(new HTuple(visionShapParam.MatchPyamidHigh)), 0.9, out hv_Row, out hv_Column, out hv_Angle, out hv_ScaleR, out hv_Score); } } else { if (ReduceImg != null && ReduceImg.IsInitialized()) { HOperatorSet.FindNccModel(ReduceImg, ModeID, (new HTuple(visionShapParam.AngleStart)).TupleRad(), (new HTuple(visionShapParam.AngleExtent)).TupleRad(), visionShapParam.dSorce, visionShapParam.nNum, visionShapParam.MaxOverlap, "true", 0, out hv_Row, out hv_Column, out hv_Angle, out hv_Score); } else { HOperatorSet.FindNccModel(ho_Image, ModeID, (new HTuple(visionShapParam.AngleStart)).TupleRad(), (new HTuple(visionShapParam.AngleExtent)).TupleRad(), visionShapParam.dSorce, visionShapParam.nNum, visionShapParam.MaxOverlap, "true", 0, out hv_Row, out hv_Column, out hv_Angle, out hv_Score); } } if (hv_Row.Length > 0) { for (int i = 0; i < hv_Row.Length; i++) { visionShapParam.ResultRow.Add(hv_Row[i].D); visionShapParam.ResultCol.Add(hv_Column[i].D); visionShapParam.ResultAngle.Add(hv_Angle[i].D); HOperatorSet.VectorAngleToRigid(visionShapParam.ModlePoint.y, visionShapParam.ModlePoint.x, visionShapParam.ModlePoint.u, hv_Row[i].D, hv_Column[i].D, hv_Angle[i].D, out HTuple hom2d); if (visionShapParam.bSetOutPoint) { HOperatorSet.VectorAngleToRigid(visionShapParam.ModlePoint.y, visionShapParam.ModlePoint.x, visionShapParam.ModlePoint.u, hv_Row[i].D, hv_Column[i].D, hv_Angle[i].D, out hom2d); HOperatorSet.AffineTransPixel(hom2d, visionShapParam.OutPointInModleImage.y, visionShapParam.OutPointInModleImage.x, out HTuple rowTrans, out HTuple colTrans); if (visionControl != null && visionControl.isOpen()) { HOperatorSet.SetColor(visionControl.GetHalconWindow(), "blue"); HOperatorSet.DispCross(visionControl.GetHalconWindow(), rowTrans, colTrans, 80, 0); } visionShapParam.OutPointInResultImg.Add(new Point2d(colTrans.D, rowTrans.D)); } else { if (visionControl != null && visionControl.isOpen()) { HOperatorSet.DispCross(visionControl.GetHalconWindow(), hv_Row[i].D, hv_Column[i].D, 20, 0); } } int indexsel = 0; shapeparamResults?.Clear(); HTuple rowTransUser = 0; HTuple colTransUser = 0; shapeparam shapeparamInstance; foreach (var temp in shapeslist) { shapeparamInstance = temp.Clone(); switch (temp.shapeType) { case ShapeType.点: HOperatorSet.AffineTransPixel(hom2d, ((UsrShapePoint)temp.usrshape).Y, ((UsrShapePoint)temp.usrshape).X, out rowTransUser, out colTransUser); ((UsrShapePoint)shapeparamInstance.usrshape).X = colTransUser[0].D; ((UsrShapePoint)shapeparamInstance.usrshape).Y = rowTransUser[0].D; shapeparamResults.Add(shapeparamInstance); break; case ShapeType.圆形: ((UsrShapeCircle)shapeparamInstance.usrshape).CircleRadius = ((UsrShapeCircle)temp.usrshape).CircleRadius; HOperatorSet.AffineTransPixel(hom2d, ((UsrShapeCircle)temp.usrshape).CircleCenterY, ((UsrShapeCircle)temp.usrshape).CircleCenterX, out rowTransUser, out colTransUser); ((UsrShapeCircle)shapeparamInstance.usrshape).CircleCenterX = colTransUser[0].D; ((UsrShapeCircle)shapeparamInstance.usrshape).CircleCenterY = rowTransUser[0].D; ((UsrShapeCircle)shapeparamInstance.usrshape).CircleRadius = ((UsrShapeCircle)temp.usrshape).CircleRadius; shapeparamResults.Add(shapeparamInstance); try { HOperatorSet.DispCircle(visionControl.GetHalconWindow(), ((UsrShapeCircle)shapeparamInstance.usrshape).CircleCenterY, ((UsrShapeCircle)shapeparamInstance.usrshape).CircleCenterX, ((UsrShapeCircle)shapeparamInstance.usrshape).CircleRadius); // HOperatorSet.DispObj(rectobj, visionControl.GetHalconWindow()); } catch (Exception e) { } break; case ShapeType.仿射矩形: ((UsrShapeRect2)shapeparamInstance.usrshape).Len1 = ((UsrShapeRect2)temp.usrshape).Len1; ((UsrShapeRect2)shapeparamInstance.usrshape).Len2 = ((UsrShapeRect2)temp.usrshape).Len2; ((UsrShapeRect2)shapeparamInstance.usrshape).Phi = ((UsrShapeRect2)temp.usrshape).Phi + hv_Angle[i].D; HOperatorSet.AffineTransPixel(hom2d, ((UsrShapeRect2)temp.usrshape).CenterY, ((UsrShapeRect2)temp.usrshape).CenterX, out rowTransUser, out colTransUser); ((UsrShapeRect2)shapeparamInstance.usrshape).CenterX = colTransUser[0].D; ((UsrShapeRect2)shapeparamInstance.usrshape).CenterY = rowTransUser[0].D; shapeparamResults.Add(shapeparamInstance); try { HOperatorSet.DispRectangle2(visionControl.GetHalconWindow(), ((UsrShapeRect2)shapeparamInstance.usrshape).CenterY, ((UsrShapeRect2)shapeparamInstance.usrshape).CenterX, ((UsrShapeRect2)shapeparamInstance.usrshape).Phi, ((UsrShapeRect2)shapeparamInstance.usrshape).Len1, ((UsrShapeRect2)shapeparamInstance.usrshape).Len2 ); // HOperatorSet.DispObj(rectobj, visionControl.GetHalconWindow()); } catch (Exception e) { } break; case ShapeType.矩形: HOperatorSet.AffineTransPixel(hom2d, ((UsrShapeRect)temp.usrshape).Y1, ((UsrShapeRect)temp.usrshape).X1, out rowTransUser, out colTransUser); ((UsrShapeRect)shapeparamInstance.usrshape).X1 = colTransUser[0].D; ((UsrShapeRect)shapeparamInstance.usrshape).Y1 = rowTransUser[0].D; HOperatorSet.AffineTransPixel(hom2d, ((UsrShapeRect)temp.usrshape).Y2, ((UsrShapeRect)temp.usrshape).X2, out rowTransUser, out colTransUser); ((UsrShapeRect)shapeparamInstance.usrshape).X2 = colTransUser[0].D; ((UsrShapeRect)shapeparamInstance.usrshape).Y2 = rowTransUser[0].D; shapeparamResults.Add(shapeparamInstance); try { // HOperatorSet.GenRectangle1(out HObject rectobj, ((UsrShapeRect)shapeparamInstance.usrshape).Y1, // ((UsrShapeRect)shapeparamInstance.usrshape).X1, //((UsrShapeRect)shapeparamInstance.usrshape).Y2, // ((UsrShapeRect)shapeparamInstance.usrshape).X2); // HOperatorSet.DispObj(rectobj, visionControl.GetHalconWindow()); if (((UsrShapeRect)shapeparamInstance.usrshape).Y2 > ((UsrShapeRect)shapeparamInstance.usrshape).Y1) { HOperatorSet.DispRectangle1(visionControl.GetHalconWindow(), ((UsrShapeRect)shapeparamInstance.usrshape).Y1, ((UsrShapeRect)shapeparamInstance.usrshape).X1, ((UsrShapeRect)shapeparamInstance.usrshape).Y2, ((UsrShapeRect)shapeparamInstance.usrshape).X2 ); // HOperatorSet.DispObj(rectobj, visionControl.GetHalconWindow()); } else { HOperatorSet.DispRectangle1(visionControl.GetHalconWindow(), ((UsrShapeRect)shapeparamInstance.usrshape).Y2, ((UsrShapeRect)shapeparamInstance.usrshape).X2, ((UsrShapeRect)shapeparamInstance.usrshape).Y1, ((UsrShapeRect)shapeparamInstance.usrshape).X1); // HOperatorSet.DispObj(rectobj, visionControl.GetHalconWindow()); } // HOperatorSet.DispRectangle1(visionControl.GetHalconWindow(), //((UsrShapeRect)shapeparamInstance.usrshape).Y1, // ((UsrShapeRect)shapeparamInstance.usrshape).X1, //((UsrShapeRect)shapeparamInstance.usrshape).Y2, // ((UsrShapeRect)shapeparamInstance.usrshape).X2 //); } catch (Exception e) { } break; } } } Save(); if (visionControl != null && visionControl.isOpen()) { HOperatorSet.SetColor(visionControl.GetHalconWindow(), "green"); } if (RegionSearch != null && RegionSearch.IsInitialized() && visionControl != null && visionControl.isOpen()) { HOperatorSet.DispObj(RegionSearch, visionControl.GetHalconWindow()); } if (visionControl != null && visionControl.isOpen()) { HalconExternFunExport.dev_display_shape_matching_results(ModeID, visionControl.GetHalconWindow(), "green", hv_Row, hv_Column, hv_Angle, 1, 1, 0); for (int i = 0; i < hv_Row.Length; i++) { HTuple hTuple = string.Format("x:{0},y:{1},u:{2},score{3}", hv_Column[i].D, hv_Row[i].D, hv_Angle[i].D / Math.PI * 180, hv_Score[i].D); string strmsg = string.Format("x:{0},y:{1},u:{2},score{3},Numlevels", hv_Column[i].D.ToString("F2"), hv_Row[i].D.ToString("F2"), (hv_Angle[i].D / Math.PI * 180).ToString("F2"), hv_Score[i].D.ToString("F2"), visionShapParam.MatchPyamidHigh); HalconExternFunExport.disp_message(visionControl.GetHalconWindow(), strmsg, "window", 0 + i * 20, 100, "green", "false"); } } } else { if (visionControl != null && visionControl.isOpen()) { HOperatorSet.SetColor(visionControl.GetHalconWindow(), "red"); } if (RegionSearch != null && RegionSearch.IsInitialized() && visionControl != null && visionControl.isOpen()) { HOperatorSet.DispObj(RegionSearch, visionControl.GetHalconWindow()); } if (visionControl != null && visionControl.isOpen()) { HalconExternFunExport.disp_message(visionControl.GetHalconWindow(), "没有找到", "window", 100, 100, "red", "false"); } return(false); } } catch (HalconException e) { _logger.Warn(m_strStepName + ": 寻找模板失败:" + e.Message); MessageBox.Show(m_strStepName + ": 寻找模板失败:" + e.Message, "Err", MessageBoxButtons.OK, MessageBoxIcon.Error); return(false); } finally { ReduceImg?.Dispose(); GC.Collect(); } return(true); }