コード例 #1
0
        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);
        }