private void DrawEllipseFindCaliper() { if (!AlgoInitFlag) { return; } CogEllipseAlgo _CogEllipseAlgoRcp = new CogEllipseAlgo(); _CogEllipseAlgoRcp.CaliperNumber = Convert.ToInt32(numUpDownCaliperNumber.Value) * 2; _CogEllipseAlgoRcp.CaliperSearchLength = Convert.ToDouble(numUpDownSearchLength.Value); _CogEllipseAlgoRcp.CaliperProjectionLength = Convert.ToDouble(numUpDownProjectionLength.Value); _CogEllipseAlgoRcp.CaliperSearchDirection = Convert.ToInt32(graLabelSearchDirection.Text); _CogEllipseAlgoRcp.CaliperIgnoreNumber = Convert.ToInt32(numUpDownIgnoreNumber.Value); _CogEllipseAlgoRcp.CaliperPolarity = Convert.ToInt32(graLabelPolarity.Text); _CogEllipseAlgoRcp.ArcCenterX = Convert.ToDouble(numUpDownArcCenterX.Value); _CogEllipseAlgoRcp.ArcCenterY = Convert.ToDouble(numUpDownArcCenterY.Value); _CogEllipseAlgoRcp.ArcRadiusX = Convert.ToDouble(numUpDownArcRadiusX.Value); _CogEllipseAlgoRcp.ArcRadiusY = Convert.ToDouble(numUpDownArcRadiusY.Value); _CogEllipseAlgoRcp.ArcAngleSpan = Convert.ToDouble(numUpDownAngleSpan.Value); var _DrawEllipseCaliperEvent = DrawEllipseCaliperEvent; if (_DrawEllipseCaliperEvent != null) { _DrawEllipseCaliperEvent(_CogEllipseAlgoRcp); } }
private void ApplySettingValue() { CogEllipseResult _CogEllipseResult = new CogEllipseResult(); CogEllipseAlgo _CogEllipseAlgoRcp = new CogEllipseAlgo(); _CogEllipseAlgoRcp.CaliperNumber = Convert.ToInt32(numUpDownCaliperNumber.Value) * 2; _CogEllipseAlgoRcp.CaliperSearchLength = Convert.ToDouble(numUpDownSearchLength.Value); _CogEllipseAlgoRcp.CaliperProjectionLength = Convert.ToDouble(numUpDownProjectionLength.Value); _CogEllipseAlgoRcp.CaliperSearchDirection = Convert.ToInt32(graLabelSearchDirection.Text); _CogEllipseAlgoRcp.CaliperIgnoreNumber = Convert.ToInt32(numUpDownIgnoreNumber.Value); _CogEllipseAlgoRcp.CaliperPolarity = Convert.ToInt32(graLabelPolarity.Text); _CogEllipseAlgoRcp.ArcCenterX = Convert.ToDouble(numUpDownArcCenterX.Value); _CogEllipseAlgoRcp.ArcCenterY = Convert.ToDouble(numUpDownArcCenterY.Value); _CogEllipseAlgoRcp.ArcRadiusX = Convert.ToDouble(numUpDownArcRadiusX.Value); _CogEllipseAlgoRcp.ArcRadiusY = Convert.ToDouble(numUpDownArcRadiusY.Value); _CogEllipseAlgoRcp.ArcAngleSpan = Convert.ToDouble(numUpDownAngleSpan.Value); var _ApplyEllipseValueEvent = ApplyEllipseValueEvent; if (_ApplyEllipseValueEvent != null) { _ApplyEllipseValueEvent(_CogEllipseAlgoRcp, ref _CogEllipseResult); } if (_CogEllipseResult.IsGood) { textBoxCenterX.Text = (_CogEllipseResult.CenterXReal).ToString("F3"); textBoxCenterY.Text = (_CogEllipseResult.CenterYReal).ToString("F3"); textBoxRadiusX.Text = (_CogEllipseResult.RadiusXReal).ToString("F3"); textBoxRadiusY.Text = (_CogEllipseResult.RadiusYReal).ToString("F3"); OriginX = _CogEllipseResult.CenterX; OriginY = _CogEllipseResult.CenterY; } else { textBoxCenterX.Text = "-"; textBoxCenterY.Text = "-"; textBoxRadiusX.Text = "-"; textBoxRadiusY.Text = "-"; _CogEllipseAlgoRcp.OriginX = 0; _CogEllipseAlgoRcp.OriginY = 0; } }
public void SetAlgoRecipe(Object _Algorithm, double _BenchMarkOffsetX, double _BenchMarkOffsetY, double _ResolutionX, double _ResolutionY) { if (_Algorithm != null) { AlgoInitFlag = false; CogEllipseAlgoRcp = _Algorithm as CogEllipseAlgo; ResolutionX = _ResolutionX; ResolutionY = _ResolutionY; BenchMarkOffsetX = _BenchMarkOffsetX; BenchMarkOffsetY = _BenchMarkOffsetY; numUpDownCaliperNumber.Value = Convert.ToDecimal(CogEllipseAlgoRcp.CaliperNumber / 2); numUpDownSearchLength.Value = Convert.ToDecimal(CogEllipseAlgoRcp.CaliperSearchLength); numUpDownProjectionLength.Value = Convert.ToDecimal(CogEllipseAlgoRcp.CaliperProjectionLength); numUpDownIgnoreNumber.Value = Convert.ToDecimal(CogEllipseAlgoRcp.CaliperIgnoreNumber); numUpDownArcCenterX.Value = Convert.ToDecimal(CogEllipseAlgoRcp.ArcCenterX - BenchMarkOffsetX); numUpDownArcCenterY.Value = Convert.ToDecimal(CogEllipseAlgoRcp.ArcCenterY - BenchMarkOffsetY); numUpDownArcRadiusX.Value = Convert.ToDecimal(CogEllipseAlgoRcp.ArcRadiusX); numUpDownArcRadiusY.Value = Convert.ToDecimal(CogEllipseAlgoRcp.ArcRadiusY); numUpDownAngleSpan.Value = Convert.ToDecimal(CogEllipseAlgoRcp.ArcAngleSpan); textBoxCenterX.Text = (CogEllipseAlgoRcp.OriginX * ResolutionX).ToString("F3"); textBoxCenterY.Text = (CogEllipseAlgoRcp.OriginY * ResolutionY).ToString("F3"); textBoxRadiusX.Text = CogEllipseAlgoRcp.OriginRadiusX.ToString("F3"); textBoxRadiusY.Text = CogEllipseAlgoRcp.OriginRadiusY.ToString("F3"); graLabelSearchDirection.Text = CogEllipseAlgoRcp.CaliperSearchDirection.ToString(); graLabelPolarity.Text = CogEllipseAlgoRcp.CaliperPolarity.ToString(); SetSearchDirection(CogEllipseAlgoRcp.CaliperSearchDirection); SetPolarity(CogEllipseAlgoRcp.CaliperPolarity); numUpDownDiameterSize.Value = Convert.ToDecimal(CogEllipseAlgoRcp.DiameterSize); numUpDownDiameterMinus.Value = Convert.ToDecimal(CogEllipseAlgoRcp.DiameterMinus); numUpDownDiameterPlus.Value = Convert.ToDecimal(CogEllipseAlgoRcp.DiameterPlus); AlgoInitFlag = true; } else { //LOG } }
public bool Run(CogImage8Grey _SrcImage, CogRectangle _InspRegion, CogEllipseAlgo _CogEllipseAlgo, ref CogEllipseResult _CogEllipseResult, double _OffsetX = 0, double _OffsetY = 0, int _NgNumber = 0) { bool _Result = true; #region Caliper Center XY 구하기 -> Blob으로 Center 위치 Search #region GetAutoThresholdValue CogHistogramTool _HistoTool = new CogHistogramTool(); _HistoTool.InputImage = _SrcImage; _HistoTool.Region = _InspRegion; _HistoTool.Run(); int[] _HistoValue = _HistoTool.Result.GetHistogram(); double _TotSize = _InspRegion.Width * _InspRegion.Height; double _ThresholdSum = 0; int _ThresholdValue = 0; for (int iLoopCount = 0; iLoopCount < 256; ++iLoopCount) { _ThresholdSum += iLoopCount * _HistoValue[iLoopCount]; } double _ThresholdSum2 = 0; double _WeightBack = 0, _WeightFore = 0, _VarMax = 0; for (int iLoopCount = 0; iLoopCount < 256; ++iLoopCount) { _WeightBack += _HistoValue[iLoopCount]; if (0 == _WeightBack) { continue; } _WeightFore = _TotSize - _WeightBack; if (0 == _WeightFore) { break; } _ThresholdSum2 += (double)(iLoopCount * _HistoValue[iLoopCount]); double _MeanBack = _ThresholdSum2 / _WeightBack; double _MeanFore = (_ThresholdSum - _ThresholdSum2) / _WeightFore; double _VarBetween = _WeightBack * _WeightFore * Math.Pow((_MeanBack - _MeanFore), 2); if (_VarBetween > _VarMax) { _VarMax = _VarBetween; _ThresholdValue = iLoopCount; } } #endregion #region Blob Search CogBlobTool _BlobTool = new CogBlobTool(); _BlobTool.InputImage = _SrcImage; _BlobTool.Region = _InspRegion; _BlobTool.RunParams.SegmentationParams.Mode = CogBlobSegmentationModeConstants.HardFixedThreshold; _BlobTool.RunParams.SegmentationParams.Polarity = CogBlobSegmentationPolarityConstants.LightBlobs; _BlobTool.RunParams.ConnectivityMode = CogBlobConnectivityModeConstants.GreyScale; _BlobTool.RunParams.ConnectivityCleanup = CogBlobConnectivityCleanupConstants.Fill; _BlobTool.RunParams.SegmentationParams.HardFixedThreshold = _ThresholdValue; _BlobTool.RunParams.ConnectivityMinPixels = 10000; _BlobTool.Run(); CogBlobResults _BlobResults = _BlobTool.Results; double _MaxSize = 0; double _CaliperCenterX = 0; double _CaliperCenterY = 0; if (_BlobResults.GetBlobs().Count > 0) { for (int iLoopCount = 0; iLoopCount < _BlobResults.GetBlobs().Count; ++iLoopCount) { CogBlobResult _BlobResult = _BlobResults.GetBlobByID(iLoopCount); if (_BlobResult.Area > _MaxSize) { _MaxSize = _BlobResult.Area; _CaliperCenterX = _BlobResult.CenterOfMassX; _CaliperCenterY = _BlobResult.CenterOfMassY; } } } else { _CaliperCenterX = _CogEllipseAlgo.ArcCenterX - _OffsetX; _CaliperCenterY = _CogEllipseAlgo.ArcCenterY - _OffsetY; } //CogSerializer.SaveObjectToFile(_BlobTool, string.Format(@"D:\CircleBlob.vpp")); #endregion #endregion SetCaliperDirection(_CogEllipseAlgo.CaliperSearchDirection, _CogEllipseAlgo.CaliperPolarity); SetCaliper(_CogEllipseAlgo.CaliperNumber, _CogEllipseAlgo.CaliperSearchLength, _CogEllipseAlgo.CaliperProjectionLength, _CogEllipseAlgo.CaliperIgnoreNumber); //LJH 2019.05.23 Caliper Center 기준점 변경 //SetEllipticalArc(_CogEllipseAlgo.ArcCenterX - _OffsetX, _CogEllipseAlgo.ArcCenterY - _OffsetY, _CogEllipseAlgo.ArcRadiusX, _CogEllipseAlgo.ArcRadiusY, _CogEllipseAlgo.ArcAngleSpan); SetEllipticalArc(_CaliperCenterX, _CaliperCenterY, _CogEllipseAlgo.ArcRadiusX, _CogEllipseAlgo.ArcRadiusY, _CogEllipseAlgo.ArcAngleSpan); if (true == Inspection(_SrcImage)) { GetResult(); } if (FindEllipseResults != null && FindEllipseResults.Count > 0) { _CogEllipseResult.IsGood = true; } else { _CogEllipseResult.IsGood = false; } if (!_CogEllipseResult.IsGood) { CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Ellipse Find Fail!!", CLogManager.LOG_LEVEL.MID); _CogEllipseResult.CenterX = _CogEllipseAlgo.ArcCenterX; _CogEllipseResult.CenterY = _CogEllipseAlgo.ArcCenterY; _CogEllipseResult.RadiusX = _CogEllipseAlgo.ArcRadiusX; _CogEllipseResult.RadiusY = _CogEllipseAlgo.ArcRadiusY; _CogEllipseResult.OriginX = 0; _CogEllipseResult.OriginY = 0; _CogEllipseResult.Rotation = 0; _CogEllipseResult.NgNumber = _NgNumber; } else { if (FindEllipseResults.GetEllipse() != null) { CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Ellipse Complete", CLogManager.LOG_LEVEL.MID); _CogEllipseResult.PointFoundCount = FindEllipseResults.NumPointsFound; _CogEllipseResult.CenterX = FindEllipseResults.GetEllipse().CenterX; _CogEllipseResult.CenterY = FindEllipseResults.GetEllipse().CenterY; _CogEllipseResult.RadiusX = FindEllipseResults.GetEllipse().RadiusX; _CogEllipseResult.RadiusY = FindEllipseResults.GetEllipse().RadiusY; _CogEllipseResult.OriginX = FindEllipseResults.GetEllipse().CenterX; _CogEllipseResult.OriginY = FindEllipseResults.GetEllipse().CenterY; _CogEllipseResult.Rotation = FindEllipseResults.GetEllipse().Rotation; _CogEllipseResult.NgNumber = _NgNumber; _CogEllipseResult.PointPosXInfo = new double[FindEllipseResults.Count]; _CogEllipseResult.PointPosYInfo = new double[FindEllipseResults.Count]; _CogEllipseResult.PointStatusInfo = new bool[FindEllipseResults.Count]; for (int iLoopCount = 0; iLoopCount < FindEllipseResults.Count; ++iLoopCount) { if (true == FindEllipseResults[iLoopCount].Found) { _CogEllipseResult.PointPosXInfo[iLoopCount] = FindEllipseResults[iLoopCount].X; _CogEllipseResult.PointPosYInfo[iLoopCount] = FindEllipseResults[iLoopCount].Y; } _CogEllipseResult.PointStatusInfo[iLoopCount] = FindEllipseResults[iLoopCount].Used; } _CogEllipseResult.DiameterMinAlgo = _CogEllipseAlgo.DiameterSize - _CogEllipseAlgo.DiameterMinus; _CogEllipseResult.DiameterMaxAlgo = _CogEllipseAlgo.DiameterSize + _CogEllipseAlgo.DiameterPlus; CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, String.Format(" - Center X : {0}, Y : {1}", _CogEllipseResult.CenterX.ToString("F2"), _CogEllipseResult.CenterY.ToString("F2")), CLogManager.LOG_LEVEL.MID); CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, String.Format(" - Radius X : {0}, Y : {1}", _CogEllipseResult.RadiusX.ToString("F2"), _CogEllipseResult.RadiusY.ToString("F2")), CLogManager.LOG_LEVEL.MID); } else { CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Ellipse Find Fail!!", CLogManager.LOG_LEVEL.MID); _CogEllipseResult.CenterX = _CogEllipseAlgo.ArcCenterX; _CogEllipseResult.CenterY = _CogEllipseAlgo.ArcCenterY; _CogEllipseResult.RadiusX = _CogEllipseAlgo.ArcRadiusX; _CogEllipseResult.RadiusY = _CogEllipseAlgo.ArcRadiusY; _CogEllipseResult.OriginX = 0; _CogEllipseResult.OriginY = 0; _CogEllipseResult.NgNumber = _NgNumber; _CogEllipseResult.IsGood = false; } } CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Result : " + _CogEllipseResult.IsGood.ToString(), CLogManager.LOG_LEVEL.MID); return(_Result); }