public override int Measure(HObject ho_Image) //测量 { base.Measure(ho_Image); //调用基类的测量方法 measureResult = Result.OK; color = "green"; ROI = parameter.rectangle2.GetShapePositioned() as Rectangle2; //获取ROI矩形 HObject ho_ROI = Func_HalconFunction.GenRectangle2(ROI); //创建ROI矩形形状 ho_Shape = Func_ImageProcessing.Threshold_SelectMaxRegion(ho_Image, ho_ROI, parameter.hv_MinGray, parameter.hv_MaxGray); //创建结果形状 HOperatorSet.AreaCenter(ho_Shape, out hv_Area, out centerPoint.hv_Row, out centerPoint.hv_Column); //求取区域面积 ho_ROI.Dispose(); if (minValue > hv_Area || hv_Area > maxValue) //?面积在设定范围内 { measureResult = Result.NG; if (Exist)//?无料 { measureResult = Result.无料; function = "产品有无"; } color = "red"; } MeasureDone = true;//已测量标志为true return(Convert.ToInt32(measureResult)); }
public override int Measure(HObject ho_Image) //测量 { measureResult = Result.OK; //测量结果初始OK try { ho_ROI.Dispose(); } catch (Exception) { }//释放ho_ROI资源 Rectangle2 ROI = parameter.rectangle2.GetShapePositioned() as Rectangle2; //获取ROI矩形 ho_ROI = Func_HalconFunction.GenRectangle2(ROI); //创建ROI //灰度处理,并选出最大面积 try { ho_SelectedRegions.Dispose(); } catch (Exception) { }//释放ho_SelectedRegions资源 ho_SelectedRegions = Func_ImageProcessing.Threshold_SelectMaxRegion(ho_Image, ho_ROI, parameter.hv_MinGray, parameter.hv_MaxGray); if (ROI.hv_Phi.D != 0)//角度不为零? { //hv_HomMat2D;//变换矩阵 HOperatorSet.VectorAngleToRigid(ROI.hv_Row, ROI.hv_Column, 0, ROI.hv_Row, ROI.hv_Column, -ROI.hv_Phi, out HTuple hv_HomMat2D); //将区域旋转为水平的变换矩阵 // ho_RegionRotate;//水平后的Region HOperatorSet.AffineTransRegion(ho_SelectedRegions, out HObject ho_RegionRotate, hv_HomMat2D, "nearest_neighbor"); //应用变换 SetLine(Func_ImageProcessing.getLine_FromRegion(ho_RegionRotate, TPLR, b, AngularPoint)); //从区域获取线 HOperatorSet.VectorAngleToRigid(ROI.hv_Row, ROI.hv_Column, 0, ROI.hv_Row, ROI.hv_Column, ROI.hv_Phi, out hv_HomMat2D); //将线从水平变回原角度的变换矩阵 HOperatorSet.AffineTransPixel(hv_HomMat2D, hv_Row1, hv_Column1, out hv_Row1, out hv_Column1); //应用变换 HOperatorSet.AffineTransPixel(hv_HomMat2D, hv_Row2, hv_Column2, out hv_Row2, out hv_Column2); //应用变换 } else { SetLine(Func_ImageProcessing.getLine_FromRegion(ho_SelectedRegions, TPLR, b, AngularPoint));//从区域获取线 } if (DP == null) { DP = new Point(0, 0); } DP.hv_Column = (hv_Column1); DP.hv_Row = (hv_Row1); AxByC0 = AxByC0.GetAxByC(this); //求该线的一半直线方程 MeasureDone = true; //已测量标志为true return(Convert.ToInt32(measureResult)); }