private void btnFind_Click(object sender, EventArgs e) { CogPatternResult _CogPatternResult = new CogPatternResult(); CogPatternAlgo _CogPatternAlgoRcp = new CogPatternAlgo(); _CogPatternAlgoRcp.MatchingScore = Convert.ToDouble(numericUpDownFindScore.Value); _CogPatternAlgoRcp.MatchingCount = Convert.ToInt32(numericUpDownFindCount.Value); _CogPatternAlgoRcp.MatchingAngle = Convert.ToDouble(numericUpDownAngleLimit.Value); _CogPatternAlgoRcp.IsShift = Convert.ToBoolean(checkBoxShift.Checked); _CogPatternAlgoRcp.AllowedShiftX = Convert.ToDouble(numericUpDownAllowedShiftX.Value); _CogPatternAlgoRcp.AllowedShiftY = Convert.ToDouble(numericUpDownAllowedShiftY.Value); _CogPatternAlgoRcp.PatternCount = CogPatternAlgoRcp.ReferenceInfoList.Count; _CogPatternAlgoRcp.ReferenceInfoList = new References(); for (int iLoopCount = 0; iLoopCount < CogPatternAlgoRcp.ReferenceInfoList.Count; ++iLoopCount) { ReferenceInformation _ReferInfo = new ReferenceInformation(); _ReferInfo = CogPatternAlgoRcp.ReferenceInfoList[iLoopCount]; _CogPatternAlgoRcp.ReferenceInfoList.Add(_ReferInfo); } var _ApplyPatternMatchingValueEvent = ApplyPatternMatchingValueEvent; _ApplyPatternMatchingValueEvent?.Invoke(_CogPatternAlgoRcp, ref _CogPatternResult); }
public bool Run(CogImage8Grey _SrcImage, CogRectangle _InspRegion, CogPatternAlgo _CogPatternAlgo, ref CogPatternResult _CogPatternResult) { bool _Result = false; if (_CogPatternAlgo.ReferenceInfoList.Count > 0) { //LDH, 2019.01.04, Score 80%로 설정 double _MinMatchingScore = _CogPatternAlgo.MatchingScore * 0.8; PatternProc.RunParams.AcceptThreshold = _MinMatchingScore / 100; PatternProc.RunParams.ApproximateNumberToFind = _CogPatternAlgo.MatchingCount; PatternProc.RunParams.ZoneAngle.Configuration = CogPMAlignZoneConstants.LowHigh; PatternProc.RunParams.ZoneAngle.Low = _CogPatternAlgo.MatchingAngle * -1 * Math.PI / 180; PatternProc.RunParams.ZoneAngle.High = _CogPatternAlgo.MatchingAngle * 1 * Math.PI / 180; for (int iLoopCount = 0; iLoopCount < _CogPatternAlgo.ReferenceInfoList.Count; ++iLoopCount) { List <int> _PatternIndexList = new List <int>(); if (false == Inspection(_SrcImage, _InspRegion, _CogPatternAlgo.ReferenceInfoList[iLoopCount].Reference)) { continue; } if (PatternResults != null && PatternResults.Count > 0) { CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Find Count : " + PatternResults.Count.ToString(), CLogManager.LOG_LEVEL.MID); _CogPatternResult.FindCount = 0; for (int jLoopCount = 0; jLoopCount < PatternResults.Count; ++jLoopCount) { if (PatternResults[jLoopCount].Score * 100 >= _MinMatchingScore) { _CogPatternResult.FindCount++; //LDH, 2019.01.04, Score 순서로 Index 정렬 if (_PatternIndexList.Count == 0 || PatternResults[jLoopCount].Score <= PatternResults[_PatternIndexList[0]].Score) { _PatternIndexList.Add(jLoopCount); } else { _PatternIndexList.Insert(0, jLoopCount); } } } if (_CogPatternResult.FindCount > _CogPatternAlgo.MatchingCount) { _CogPatternResult.FindCount = _CogPatternAlgo.MatchingCount; } if (_CogPatternResult.FindCount > 0) { _CogPatternResult.Score = new double[_CogPatternResult.FindCount]; _CogPatternResult.Scale = new double[_CogPatternResult.FindCount]; _CogPatternResult.Angle = new double[_CogPatternResult.FindCount]; _CogPatternResult.CenterX = new double[_CogPatternResult.FindCount]; _CogPatternResult.CenterY = new double[_CogPatternResult.FindCount]; _CogPatternResult.OriginPointX = new double[_CogPatternResult.FindCount]; _CogPatternResult.OriginPointY = new double[_CogPatternResult.FindCount]; _CogPatternResult.Width = new double[_CogPatternResult.FindCount]; _CogPatternResult.Height = new double[_CogPatternResult.FindCount]; _CogPatternResult.IsGoods = new bool[_CogPatternResult.FindCount]; _CogPatternResult.IsGood = false; //int _Index = 0; for (int jLoopCount = 0; jLoopCount < _CogPatternResult.FindCount; ++jLoopCount) { //if (PatternResults[jLoopCount].Score * 100 >= _CogPatternAlgo.MatchingScore) if (PatternResults[jLoopCount].Score * 100 >= _MinMatchingScore) { _CogPatternResult.Score[jLoopCount] = PatternResults[_PatternIndexList[jLoopCount]].Score; _CogPatternResult.Scale[jLoopCount] = PatternResults[_PatternIndexList[jLoopCount]].GetPose().Scaling; _CogPatternResult.Angle[jLoopCount] = PatternResults[_PatternIndexList[jLoopCount]].GetPose().Rotation; _CogPatternResult.OriginPointX[jLoopCount] = PatternResults[_PatternIndexList[jLoopCount]].GetPose().TranslationX; _CogPatternResult.OriginPointY[jLoopCount] = PatternResults[_PatternIndexList[jLoopCount]].GetPose().TranslationY; _CogPatternResult.CenterX[jLoopCount] = _CogPatternResult.OriginPointX[_PatternIndexList[jLoopCount]] + _CogPatternAlgo.ReferenceInfoList[iLoopCount].OriginPointOffsetX; _CogPatternResult.CenterY[jLoopCount] = _CogPatternResult.OriginPointY[_PatternIndexList[jLoopCount]] + _CogPatternAlgo.ReferenceInfoList[iLoopCount].OriginPointOffsetY; _CogPatternResult.Width[jLoopCount] = _CogPatternAlgo.ReferenceInfoList[iLoopCount].Width; _CogPatternResult.Height[jLoopCount] = _CogPatternAlgo.ReferenceInfoList[iLoopCount].Height; //_Index++; if (PatternResults[_PatternIndexList[jLoopCount]].Score * 100 >= _CogPatternAlgo.MatchingScore) { _CogPatternResult.IsGood = true; _CogPatternResult.IsGoods[jLoopCount] = true; } else { _CogPatternResult.IsGoods[jLoopCount] = false; } CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Find Score : " + (_CogPatternResult.Score[jLoopCount] * 100).ToString("F2"), CLogManager.LOG_LEVEL.MID); } } //_CogPatternResult.IsGood = true; break; } else { _CogPatternResult.IsGood = false; } } else { _CogPatternResult.IsGood = false; } } } else { _CogPatternResult.IsGood = false; } if (0 == _CogPatternResult.FindCount) { _CogPatternResult.Score = new double[1]; _CogPatternResult.Scale = new double[1]; _CogPatternResult.Angle = new double[1]; _CogPatternResult.CenterX = new double[1]; _CogPatternResult.CenterY = new double[1]; _CogPatternResult.OriginPointX = new double[1]; _CogPatternResult.OriginPointY = new double[1]; _CogPatternResult.Width = new double[1]; _CogPatternResult.Height = new double[1]; _CogPatternResult.Score[0] = 0; _CogPatternResult.Scale[0] = 0; _CogPatternResult.Angle[0] = 0; _CogPatternResult.OriginPointX[0] = _InspRegion.CenterX; _CogPatternResult.OriginPointY[0] = _InspRegion.CenterY; _CogPatternResult.CenterX[0] = _InspRegion.CenterX; _CogPatternResult.CenterY[0] = _InspRegion.CenterY; _CogPatternResult.Width[0] = _InspRegion.Width; _CogPatternResult.Height[0] = _InspRegion.Height; } CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.INFO, " - Result : " + (_CogPatternResult.IsGood).ToString(), CLogManager.LOG_LEVEL.MID); return(_Result); }
private void ApplyPatternMatchingValueFunction(CogPatternAlgo _CogPatternAlgo, ref CogPatternResult _CogPatternResult) { if (eTeachStep.ALGO_SET != CurrentTeachStep) { MessageBox.Show("Not select \"Algorithm Set\" button"); return; } AlgorithmAreaDisplayRefresh(); bool _Result = InspPatternProcess.Run(InspectionImage, AlgoRegionRectangle, _CogPatternAlgo, ref _CogPatternResult); for (int iLoopCount = 0; iLoopCount < _CogPatternResult.FindCount; ++iLoopCount) { CogRectangle _PatternRect = new CogRectangle(); _PatternRect.SetCenterWidthHeight(_CogPatternResult.CenterX[iLoopCount], _CogPatternResult.CenterY[iLoopCount], _CogPatternResult.Width[iLoopCount], _CogPatternResult.Height[iLoopCount]); kpTeachDisplay.DrawStaticShape(_PatternRect, "PatternRect" + (iLoopCount + 1), CogColorConstants.Green); CogPointMarker _Point = new CogPointMarker(); _Point.SetCenterRotationSize(_CogPatternResult.OriginPointX[iLoopCount], _CogPatternResult.OriginPointY[iLoopCount], 0, 2); kpTeachDisplay.DrawStaticShape(_Point, "PatternOrigin" + (iLoopCount + 1), CogColorConstants.Green, 12); string _MatchingName = string.Format($"Rate = {_CogPatternResult.Score[iLoopCount]:F2}, X = {_CogPatternResult.OriginPointX[iLoopCount]:F2}, Y = {_CogPatternResult.OriginPointY[iLoopCount]:F2}"); kpTeachDisplay.DrawText(_MatchingName, _CogPatternResult.OriginPointX[iLoopCount], _CogPatternResult.OriginPointY[iLoopCount] + 30, CogColorConstants.Green, 10, CogGraphicLabelAlignmentConstants.BaselineCenter); } }