//public void DrawStaticLine(double _StartX, double _StartY, double _EndX, double _EndY, int _Tickness, string _GroupName, CogColorConstants _Color) //{ // StaticLineSegment.Color = _Color; // StaticLineSegment.Interactive = false; // StaticLineSegment.LineStyle = CogGraphicLineStyleConstants.Solid; // StaticLineSegment.LineWidthInScreenPixels = _Tickness; // StaticLineSegment.SetStartEnd(_StartX, _StartY, _EndX, _EndY); // kCogDisplay.StaticGraphics.Add(StaticLineSegment, _GroupName); //} public void DrawStaticLine(CogLineSegment _Line, string _GroupName, CogColorConstants _Color, CogGraphicLineStyleConstants _LineStyle = CogGraphicLineStyleConstants.Solid) { StaticLineSegment = _Line; StaticLineSegment.Color = _Color; StaticLineSegment.Interactive = false; StaticLineSegment.LineStyle = _LineStyle; kCogDisplay.StaticGraphics.Add(StaticLineSegment, _GroupName); }
public void AddLine(double dStartX, double dStartY, double dEndX, double dEndY, CogColorConstants color) { CogLineSegment cogLineSegment = new CogLineSegment(); cogLineSegment.StartX = dStartX; cogLineSegment.StartY = dStartY; cogLineSegment.EndX = dEndX; cogLineSegment.EndY = dEndY; ICogGraphic icogGraphic = cogLineSegment as ICogGraphic; icogGraphic.Color = color; AddStaticGraphic(icogGraphic, ""); }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //수정 : //목적 : Run //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public override bool HLRun(System.Drawing.Bitmap bipmapImage, out CResultData objResultData) { objResultData = new CResultData(); bool bReturn = false; do { try { m_dScore = 0; m_objFindLineTool.InputImage = new CogImage8Grey(bipmapImage); m_objFindLineTool.Run(); if (0 < m_objFindLineTool.Results.Count) { m_objResultLine = m_objFindLineTool.Results.GetLine(); m_objResultLineSegment = m_objFindLineTool.Results.GetLineSegment(); m_objGraphics = m_objFindLineTool.Results[0].CreateResultGraphics(CogFindLineResultGraphicConstants.All); m_objResultLine.GetXYRotation(out m_dLinePositionX, out m_dLinePositionY, out m_dAngle); m_dAngle = m_dAngle * (180 / Math.PI); } else { m_dLinePositionX = 0; m_dLinePositionY = 0; m_dAngle = 0; MakeErrorMessage("HLSaveRecipe", 5305, "Line Fail"); break; } } catch (System.Exception ex) { Trace.Write(ex.Message + "-> " + ex.StackTrace); break; } m_dScore = 1; bReturn = true; } while(false); // objResultData.objGraphics = new CogCompositeShape(); objResultData.dLinePositionX[0] = m_dLinePositionX; objResultData.dLinePositionY[0] = m_dLinePositionY; objResultData.dLineAngle[0] = m_dAngle; objResultData.dScore[0] = m_dScore; // objResultData.objGraphics = m_objGraphics; objResultData.bitmapInputImage = bipmapImage; objResultData.bResult = bReturn; m_objResultData = ( CResultData )objResultData.Clone(); return(bReturn); }
private void ApplyLineFindValueFunction(CogLineFindAlgo _CogLineFindAlgo, ref CogLineFindResult _CogLineFindResult) { if (eTeachStep.ALGO_SET != CurrentTeachStep) { MessageBox.Show("Not select \"Algorithm Set\" button"); return; } AlgorithmAreaDisplayRefresh(); CogImage8Grey _DestImage = new CogImage8Grey(); bool _Result = InspLineFindProcess.Run(InspectionImage, ref _DestImage, AlgoRegionRectangle, _CogLineFindAlgo, ref _CogLineFindResult); CogLineSegment _CogLine = new CogLineSegment(); if (_CogLineFindResult.StartX != 0 && _CogLineFindResult.StartY != 0 && _CogLineFindResult.Length != 0) { _CogLine.SetStartLengthRotation(_CogLineFindResult.StartX, _CogLineFindResult.StartY, _CogLineFindResult.Length, _CogLineFindResult.Rotation); kpTeachDisplay.DrawStaticLine(_CogLine, "LineFind", CogColorConstants.Green); } }
//public void DrawFindLineCaliper(CogLineSegment _CogFindLine = null) public void DrawFindLineCaliper(CogFindLine _CogFindLine = null) { ICogRecord _Record; CogGraphicCollection _Region; LineCaliperTool.InputImage = (CogImage8Grey)kCogDisplay.Image; LineCaliperTool.RunParams = _CogFindLine; _Record = LineCaliperTool.CreateCurrentRecord(); InteractiveLine = (CogLineSegment)_Record.SubRecords["InputImage"].SubRecords["ExpectedShapeSegment"].Content; _Region = (CogGraphicCollection)_Record.SubRecords["InputImage"].SubRecords["CaliperRegions"].Content; kCogDisplay.InteractiveGraphics.Add(InteractiveLine, "Line", false); foreach (ICogGraphic _ICogGra in _Region) { kCogDisplay.InteractiveGraphics.Add((ICogGraphicInteractive)_ICogGra, "", false); } GC.Collect(); }
private Boolean make_results() { string ProcID = System.Reflection.MethodInfo.GetCurrentMethod().Name.ToString(); try { if (mFindLineTool.Results != null) { CogLine iLine = mFindLineTool.Results.GetLine(); CogLineSegment iLineSegment = mFindLineTool.Results.GetLineSegment(); if (iLine != null && iLineSegment != null) { mFindLineTool_Results.lineX = iLine.X; mFindLineTool_Results.lineY = iLine.Y; mFindLineTool_Results.rotation = iLine.Rotation; mFindLineTool_Results.startX = iLineSegment.StartX; mFindLineTool_Results.startY = iLineSegment.StartY; mFindLineTool_Results.endX = iLineSegment.EndX; mFindLineTool_Results.endY = iLineSegment.EndY; return(true); } else { SaveLog.Msg_("iLine or iLineSegment is null!"); return(false); } } else { SaveLog.Msg_("FindLineTool Doesn't have any result!"); return(false); //MessageBox.Show("Didn't find any line"); } } catch (Exception ex) { SaveLog.Msg_("FindLineTool make_results Failed : " + ModularID + ":\r\n" + ProcID + ":\r\n" + ex.ToString()); return(false); } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //수정 : //목적 : 초기화 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public override bool HLInitialize(HLDevice.Abstract.CVisionLibraryAbstract.CInitializeParameter objInitializeParameter) { bool bReturn = false; do { m_objResultLine = new CogLine(); m_objResultLineSegment = new CogLineSegment(); m_objGraphics = new CogCompositeShape(); m_objFindLineTool = new CogFindLineTool(); m_iIndex = m_objInitializeParameter.iIndex; m_objInitializeParameter = ( CInitializeParameter )objInitializeParameter.Clone(); HLLoadRecipe(m_objInitializeParameter.strRecipePath, m_objInitializeParameter.strRecipeName); bReturn = true; } while(false); return(bReturn); }
/// <summary> /// Displays a alignment reticle in middle of image /// </summary> public void DisplayReticle2(int cameraModule, CogDisplay cogDisplay) { if (cogDisplay != null) { // remove any old group foreach (string groupName in cogDisplay.StaticGraphics.ZOrderGroups) { if (groupName == "Reticle") { cogDisplay.StaticGraphics.Remove("Reticle"); } } // image must be visible to see CogLineSegment cogLineSegment; cogLineSegment = new CogLineSegment(); // vertical line cogLineSegment.SelectedSpaceName = "#"; cogLineSegment.StartX = this.displaySizeX[cameraModule] / 2; cogLineSegment.StartY = 0; cogLineSegment.EndX = this.displaySizeX[cameraModule] / 2; cogLineSegment.EndY = this.displaySizeY[cameraModule]; cogLineSegment.Color = CogColorConstants.Blue; cogLineSegment.LineWidthInScreenPixels = 1; cogDisplay.StaticGraphics.Add(cogLineSegment, "Reticle"); // horizontal line cogLineSegment.StartX = 0; cogLineSegment.StartY = this.displaySizeY[cameraModule] / 2; cogLineSegment.EndX = this.displaySizeX[cameraModule]; cogLineSegment.EndY = this.displaySizeY[cameraModule] / 2; cogDisplay.StaticGraphics.Add(cogLineSegment, "Reticle"); } }
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //생성 : //수정 : //목적 : 초기화 //설명 : ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public override bool HLInitialize(HLDevice.Abstract.CVisionLibraryAbstract.CInitializeParameter objInitializeParameter) { bool bReturn = false; do { m_objInitializeParameter = (HLDevice.Abstract.CVisionLibraryAbstract.CInitializeParameter)objInitializeParameter.Clone(); m_objFindLineTool = new CogFindLineTool[( int )CResultData.enumLine.LINE_FINAL]; m_objResultLine = new CogLine[( int )CResultData.enumLine.LINE_FINAL]; m_objResultLineSegment = new CogLineSegment[( int )CResultData.enumLine.LINE_FINAL]; m_objLineGraphics = new CogCompositeShape[( int )CResultData.enumLine.LINE_FINAL]; m_dLinePositionX = new double[( int )CResultData.enumLine.LINE_FINAL]; m_dLinePositionY = new double[( int )CResultData.enumLine.LINE_FINAL]; m_dLineAngle = new double[( int )CResultData.enumLine.LINE_FINAL]; for (int iLoopCount = 0; iLoopCount < ( int )CResultData.enumLine.LINE_FINAL; iLoopCount++) { m_objFindLineTool[iLoopCount] = new CogFindLineTool(); m_objResultLine[iLoopCount] = new CogLine(); m_objResultLineSegment[iLoopCount] = new CogLineSegment(); m_objLineGraphics[iLoopCount] = new CogCompositeShape(); } m_objIntersectTool = new CogIntersectLineLineTool(); m_iIndex = m_objInitializeParameter.iIndex; m_objInitializeParameter = ( CInitializeParameter )objInitializeParameter.Clone(); HLLoadRecipe(m_objInitializeParameter.strRecipePath, m_objInitializeParameter.strRecipeName); bReturn = true; } while(false); return(bReturn); }
private void ApplyLeadInspValueFunction(CogLeadAlgo _CogLeadAlgo, ref CogLeadResult _CogLeadResult, bool _IsDisplay = true) { if (eTeachStep.ALGO_SET != CurrentTeachStep) { MessageBox.Show("Not select \"Algorithm Set\" button"); return; } if (_IsDisplay) { AlgorithmAreaDisplayRefresh(); } bool _Result = InspLeadProcess.Run(InspectionImage, AlgoRegionRectangle, _CogLeadAlgo, ref _CogLeadResult); #region Result Display if (_IsDisplay) { for (int iLoopCount = 0; iLoopCount < _CogLeadResult.BlobCount; ++iLoopCount) { //Blob Boundary CogRectangleAffine _BlobRectAffine = new CogRectangleAffine(); _BlobRectAffine.SetCenterLengthsRotationSkew(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount], _CogLeadResult.PrincipalHeight[iLoopCount], _CogLeadResult.Angle[iLoopCount], 0); kpTeachDisplay.DrawStaticShape(_BlobRectAffine, "BlobRectAffine" + (iLoopCount + 1), CogColorConstants.Green); kpTeachDisplay.DrawBlobResult(_CogLeadResult.ResultGraphic[iLoopCount], "BlobRectGra" + (iLoopCount + 1)); CogLineSegment _CenterLine = new CogLineSegment(); kpTeachDisplay.DrawStaticLine(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2 + 20, _CogLeadResult.Angle[iLoopCount], 2, "CenterLine+_" + (iLoopCount + 1), CogColorConstants.Cyan); kpTeachDisplay.DrawStaticLine(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2 + 20, (Math.PI) + _CogLeadResult.Angle[iLoopCount], 2, "CenterLine-_" + (iLoopCount + 1), CogColorConstants.Cyan); CogPointMarker _PitchPoint = new CogPointMarker(); _PitchPoint.SetCenterRotationSize(_CogLeadResult.LeadPitchTopX[iLoopCount], _CogLeadResult.LeadPitchTopY[iLoopCount], 0, 1); kpTeachDisplay.DrawStaticShape(_PitchPoint, "PointStart" + (iLoopCount + 1), CogColorConstants.Yellow, 2); _PitchPoint.SetCenterRotationSize(_CogLeadResult.LeadPitchBottomX[iLoopCount], _CogLeadResult.LeadPitchBottomY[iLoopCount], 0, 1); kpTeachDisplay.DrawStaticShape(_PitchPoint, "PointEnd" + (iLoopCount + 1), CogColorConstants.Orange, 2); } } #endregion Result Display #region Pitch Average 측정 try { double[] _LeadPitchX = new double[_CogLeadResult.BlobCount]; Array.Copy(_CogLeadResult.LeadPitchTopX, _LeadPitchX, _CogLeadResult.BlobCount); Array.Sort(_LeadPitchX); double[] _LeadPitches = new double[_CogLeadResult.BlobCount - 1]; for (int iLoopCount = 0; iLoopCount < _CogLeadResult.BlobCount - 1; ++iLoopCount) { _LeadPitches[iLoopCount] = _LeadPitchX[iLoopCount + 1] - _LeadPitchX[iLoopCount]; } Array.Sort(_LeadPitches); double _Gab = _LeadPitches[4]; int _Index = 1; double _PitchSum = _LeadPitches[4], _PitchArray = 0; for (int iLoopCount = 5; iLoopCount < _CogLeadResult.BlobCount - 1; ++iLoopCount) { if (_Gab + 20 < _LeadPitches[iLoopCount]) { break; } _PitchSum += _LeadPitches[iLoopCount]; _Index++; } _PitchArray = _PitchSum / _Index; _CogLeadResult.LeadPitchAvg = _PitchArray; } catch { _CogLeadResult.LeadPitchAvg = 0; CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.ERR, "ApplyLeadInspValueFunction Exception", CLogManager.LOG_LEVEL.LOW); } #endregion Pitch Average 측정 #region Lead Angle Average 측정 try { double[] _LeadAngles = new double[_CogLeadResult.BlobCount]; Array.Copy(_CogLeadResult.Angle, _LeadAngles, _CogLeadResult.BlobCount); Array.Sort(_LeadAngles); int _Index = 0; double _AngleSum = 0, _AngleAvg = 0; for (int iLoopCount = 5; iLoopCount < _CogLeadResult.BlobCount - 5; ++iLoopCount) { _AngleSum += _CogLeadResult.Angle[iLoopCount]; _Index++; } _AngleAvg = _AngleSum / _Index; _CogLeadResult.LeadAngleAvg = _AngleAvg; } catch { _CogLeadResult.LeadAngleAvg = 0; CLogManager.AddInspectionLog(CLogManager.LOG_TYPE.ERR, "ApplyLeadInspValueFunction Exception", CLogManager.LOG_LEVEL.LOW); } #endregion Lead Angle Average 측정 }
private SendResultParameter GetLeadInspectionResultAnalysis() { SendResultParameter _SendResParam = new SendResultParameter(); _SendResParam.ID = ID; _SendResParam.NgType = eNgType.GOOD; _SendResParam.IsGood = true; _SendResParam.ProjectItem = ProjectItem; SendLeadResult _SendResult = new SendLeadResult(); for (int iLoopCount = 0; iLoopCount < AlgoResultParamList.Count; ++iLoopCount) { if (eAlgoType.C_LEAD == AlgoResultParamList[iLoopCount].ResultAlgoType) { var _AlgoResultParam = AlgoResultParamList[iLoopCount].ResultParam as CogLeadResult; _SendResult.LeadCount = _AlgoResultParam.LeadCount; _SendResult.LeadAngle = _AlgoResultParam.Angle; _SendResult.LeadWidth = _AlgoResultParam.Width; _SendResult.LeadLength = _AlgoResultParam.LeadLength; _SendResult.LeadPitchTopX = _AlgoResultParam.LeadPitchTopX; _SendResult.LeadPitchTopY = _AlgoResultParam.LeadPitchTopY; _SendResult.IsLeadBendGood = _AlgoResultParam.IsLeadBentGood; _SendResParam.IsGood &= _AlgoResultParam.IsGood; _SendResParam.SendResult = _SendResult; if (_SendResParam.NgType == eNgType.GOOD) { _SendResParam.NgType = (_AlgoResultParam.IsGood == true) ? eNgType.GOOD : eNgType.LEAD_BENT; } _SendResParam.IsGood &= _AlgoResultParam.IsLeadCountGood; if (false == _AlgoResultParam.IsLeadCountGood) { _SendResParam.NgType = eNgType.LEAD_CNT; } } else if (AlgoResultParamList[iLoopCount].ResultAlgoType == eAlgoType.C_LINE_FIND) { var _AlgoResultParam = AlgoResultParamList[iLoopCount].ResultParam as CogLineFindResult; _SendResult.BodyReferenceX = (_AlgoResultParam.StartX + _AlgoResultParam.EndX) / 2; _SendResult.BodyReferenceY = (_AlgoResultParam.StartY + _AlgoResultParam.EndY) / 2; } else if (AlgoResultParamList[iLoopCount].ResultAlgoType == eAlgoType.C_BLOB_REFER) { } else if (AlgoResultParamList[iLoopCount].ResultAlgoType == eAlgoType.C_PATTERN) { } } //Mergy Result if (_SendResult.LeadPitchTopX != null && _SendResult.LeadPitchTopY != null && _SendResult.LeadLength != null) { _SendResult.LeadWidthReal = new double[_SendResult.LeadPitchTopX.Length]; _SendResult.LeadLengthReal = new double[_SendResult.LeadPitchTopX.Length]; for (int iLoopCount = 0; iLoopCount < _SendResult.LeadPitchTopX.Length; ++iLoopCount) { _SendResult.LeadLength[iLoopCount] = Math.Abs(_SendResult.BodyReferenceY - _SendResult.LeadPitchTopY[iLoopCount]); _SendResult.LeadLengthReal[iLoopCount] = _SendResult.LeadLength[iLoopCount] * ResolutionY; _SendResult.LeadWidthReal[iLoopCount] = _SendResult.LeadWidth[iLoopCount] * ResolutionY; CogLineSegment _LengthLine = new CogLineSegment(); _LengthLine.SetStartEnd(_SendResult.LeadPitchTopX[iLoopCount], _SendResult.LeadPitchTopY[iLoopCount], _SendResult.LeadPitchTopX[iLoopCount], _SendResult.BodyReferenceY); ResultDisplay(_LengthLine, "LengthLine" + (iLoopCount + 1), CogColorConstants.Green); } } return(_SendResParam); }
public bool Run(CogImage8Grey _SrcImage, CogRectangle _InspRegion, CogLeadAlgo _CogLeadAlgo, ref CogLeadResult _CogLeadResult, double _ReferX = -1, double _ReferY = -1) { bool _Result = true; SetHardFixedThreshold(_CogLeadAlgo.ThresholdMin); SetConnectivityMinimum((int)_CogLeadAlgo.BlobAreaMin); SetPolarity(Convert.ToBoolean(_CogLeadAlgo.ForeGround)); if (true == Inspection(_SrcImage, _InspRegion)) { GetResult(true); } if (GetResults().BlobCount > 0) { _CogLeadResult = GetResults(); _CogLeadResult.LeadCount = _CogLeadResult.BlobCount; #region Lead Pitch Point Get for (int iLoopCount = 0; iLoopCount < _CogLeadResult.BlobCount; ++iLoopCount) { #region Lead Bent Check double _Angle = _CogLeadResult.Angle[iLoopCount] * 180 / Math.PI; if (_Angle > 0) { _Angle = 90 - (_CogLeadResult.Angle[iLoopCount] * 180 / Math.PI); } else { _Angle = -(90 + (_CogLeadResult.Angle[iLoopCount] * 180 / Math.PI)); } _CogLeadResult.IsLeadBentGood[iLoopCount] = true; if (_CogLeadAlgo.IsLeadBentInspection) { if ((_Angle > _CogLeadAlgo.LeadBentMax) || (_Angle < -_CogLeadAlgo.LeadBentMin)) { _CogLeadResult.IsLeadBentGood[iLoopCount] = false; _CogLeadResult.IsGood &= _CogLeadResult.IsLeadBentGood[iLoopCount]; } } #endregion Lead Bent Check #region Pitch Point 구하기 if (_CogLeadResult.Angle[iLoopCount] > 0) { CogLineSegment _CenterLine = new CogLineSegment(); _CenterLine.SetStartLengthRotation(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2, (Math.PI) + _CogLeadResult.Angle[iLoopCount]); _CogLeadResult.LeadPitchTopX[iLoopCount] = _CenterLine.EndX; _CogLeadResult.LeadPitchTopY[iLoopCount] = _CenterLine.EndY; _CenterLine.SetStartLengthRotation(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2, _CogLeadResult.Angle[iLoopCount]); _CogLeadResult.LeadPitchBottomX[iLoopCount] = _CenterLine.EndX; _CogLeadResult.LeadPitchBottomY[iLoopCount] = _CenterLine.EndY; } else { CogLineSegment _CenterLine = new CogLineSegment(); _CenterLine.SetStartLengthRotation(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2, _CogLeadResult.Angle[iLoopCount]); _CogLeadResult.LeadPitchTopX[iLoopCount] = _CenterLine.EndX; _CogLeadResult.LeadPitchTopY[iLoopCount] = _CenterLine.EndY; _CenterLine.SetStartLengthRotation(_CogLeadResult.BlobCenterX[iLoopCount], _CogLeadResult.BlobCenterY[iLoopCount], _CogLeadResult.PrincipalWidth[iLoopCount] / 2, (Math.PI) + _CogLeadResult.Angle[iLoopCount]); _CogLeadResult.LeadPitchBottomX[iLoopCount] = _CenterLine.EndX; _CogLeadResult.LeadPitchBottomY[iLoopCount] = _CenterLine.EndY; } #endregion Pitch Point 구하기 #region Length 구하기 if (_ReferY != -1 && _ReferY != -1) { _CogLeadResult.LeadLength[iLoopCount] = Math.Abs(_ReferY - _CogLeadResult.LeadPitchTopY[iLoopCount]); _CogLeadResult.LeadLengthStartX[iLoopCount] = _CogLeadResult.LeadPitchTopX[iLoopCount]; _CogLeadResult.LeadLengthStartY[iLoopCount] = _ReferY; } #endregion Length 구하기 } #endregion Lead Pitch Point Get #region Lead Length Get #endregion Lead Length Get _CogLeadResult.IsGood &= true; } else { _CogLeadResult.IsGood = false; } return(_Result); }