public void SetParameters(PatternMatcherParameters parameters) { EMatcher1_.MinReducedArea = parameters.MinReducedArea; EMatcher1_.FilteringMode = parameters.FilteringMode; EMatcher1_.SetPixelDimensions(parameters.PixelDimension_Width, parameters.PixelDimension_Height); EMatcher1_.MaxPositions = parameters.MaxPositions; EMatcher1_.MaxInitialPositions = parameters.MaxInitialPositions; EMatcher1_.MinScore = parameters.MinScore; EMatcher1_.FinalReduction = parameters.FinalReduction; EMatcher1_.Interpolate = parameters.Interpolate; EMatcher1_.ContrastMode = parameters.ContrastMode; EMatcher1_.CorrelationMode = parameters.CorrelationMode; EMatcher1_.MinAngle = parameters.MinAngle; EMatcher1_.MaxAngle = parameters.MaxAngle; EMatcher1_.MinScale = parameters.MinScale; EMatcher1_.MaxScale = parameters.MaxScale; EMatcher2_.MinReducedArea = parameters.MinReducedArea; EMatcher2_.FilteringMode = parameters.FilteringMode; EMatcher2_.SetPixelDimensions(parameters.PixelDimension_Width, parameters.PixelDimension_Height); EMatcher2_.MaxPositions = parameters.MaxPositions; EMatcher2_.MaxInitialPositions = parameters.MaxInitialPositions; EMatcher2_.MinScore = parameters.MinScore; EMatcher2_.FinalReduction = parameters.FinalReduction; EMatcher2_.Interpolate = parameters.Interpolate; EMatcher2_.ContrastMode = parameters.ContrastMode; EMatcher2_.CorrelationMode = parameters.CorrelationMode; EMatcher2_.MinAngle = parameters.MinAngle; EMatcher2_.MaxAngle = parameters.MaxAngle; EMatcher2_.MinScale = parameters.MinScale; EMatcher2_.MaxScale = parameters.MaxScale; isParametersSet = true; }
public void SaveEMatcher_Blank( PatternMatcherParameters param, string pattern1_FilePath, string pattern2_FilePath, string pattern1_ImageFilePath, string pattern2_ImageFilePath) { EImageBW8 blackImage = new EImageBW8(512, 512); EasyImage.Oper(EArithmeticLogicOperation.Copy, new EBW8(0), blackImage); // make it black EROIBW8 blackEROI = new EROIBW8(); blackEROI.OrgX = 0; blackEROI.OrgY = 0; blackEROI.Width = 512; blackEROI.Height = 512; blackEROI.Attach(blackImage); TeachAndSaveEMatcher( param, blackEROI, blackEROI, pattern1_FilePath, pattern2_FilePath, pattern1_ImageFilePath, pattern2_ImageFilePath); }
public static EuresysPatternMatcher CreatePatternMatcher(PatternMatcherParameters parameters) { EuresysPatternMatcher patternMatcher = new EuresysPatternMatcher(new EMatcher()); patternMatcher.SetParameters(parameters); return(patternMatcher); }
private static void CorrectParameters(PatternMatcherParameters parameters) { if (parameters.MaxPositions == 0) { parameters.MaxPositions = 1; } if (parameters.MinReducedArea < 4) { parameters.MinReducedArea = 64; } if (parameters.PixelDimension_Width == 0) { parameters.PixelDimension_Width = 1.00f; } if (parameters.PixelDimension_Height == 0) { parameters.PixelDimension_Height = 1.00f; } if (parameters.MinScale == 0) { parameters.MinScale = 1; } if (parameters.MaxScale == 0) { parameters.MaxScale = 1; } if (parameters.MaxAngle == 0) { parameters.MaxAngle = 360; } }
public static EuresysDoublePatternMatcher CreateDoublePatternMatcher(PatternMatcherParameters parameters) { CorrectParameters(parameters); EuresysDoublePatternMatcher patternMatcher = new EuresysDoublePatternMatcher(new EMatcher(), new EMatcher()); patternMatcher.SetParameters(parameters); return(patternMatcher); }
//public void TeachAndSaveEMatcher( // PatternMatcherParameters param, // EROIBW8 patternforTeaching1, // EROIBW8 patternforTeaching2, // string pattern1_FilePath, // string pattern2_FilePath) //{ // SetParameters(param); // LearningPatternTask(patternforTeaching1, patternforTeaching2); // if (!Directory.Exists(pattern1_FilePath)) Directory.CreateDirectory(Path.GetDirectoryName(pattern1_FilePath)); // if (!Directory.Exists(pattern2_FilePath)) Directory.CreateDirectory(Path.GetDirectoryName(pattern2_FilePath)); // EMatcher1_.Save(pattern1_FilePath); // EMatcher2_.Save(pattern2_FilePath); //} public void TeachAndSaveEMatcher( PatternMatcherParameters param, EROIBW8 patternforTeaching1, EROIBW8 patternforTeaching2, string pattern1_FilePath, string pattern2_FilePath, string pattern1_ImageFilePath, string pattern2_ImageFilePath) { SetParameters(param); LearningPatternTask(patternforTeaching1, patternforTeaching2); Directory.CreateDirectory(Path.GetDirectoryName(pattern1_FilePath)); Directory.CreateDirectory(Path.GetDirectoryName(pattern2_FilePath)); EMatcher1_.Save(pattern1_FilePath); EMatcher2_.Save(pattern2_FilePath); patternforTeaching1.Save(pattern1_ImageFilePath); patternforTeaching2.Save(pattern2_ImageFilePath); }
public static void CopyPatterns( string existingRecipeName, string newRecipeName, PatternMatcherParameters param ) { var patternMatcher = CreateDoublePatternMatcher(param); string s1 = GetLeftPatternFilePath(existingRecipeName); string s2 = GetRightPatternFilePath(existingRecipeName); string s3 = GetLeftPatternImageFilePath(existingRecipeName); string s4 = GetRightPatternImageFilePath(existingRecipeName); CheckPatternFilePath(s1); CheckPatternFilePath(s2); CheckPatternImageFilePath(s3); CheckPatternImageFilePath(s4); patternMatcher.LoadPatterns( s1, s2, s3, s4); s1 = GetLeftPatternFilePath(newRecipeName); s2 = GetRightPatternFilePath(newRecipeName); s3 = GetLeftPatternImageFilePath(newRecipeName); s4 = GetRightPatternImageFilePath(newRecipeName); if (!System.IO.Directory.Exists(s1)) { Directory.CreateDirectory(Path.GetDirectoryName(s1)); } patternMatcher.SavePatterns( s1, s2, s3, s4); }
public void GetParametersFromPattern(PatternMatcherParameters param) { float pixelDimension_Height = 0; float pixelDimension_Width = 0; EMatcher1_.GetPixelDimensions(out pixelDimension_Width, out pixelDimension_Height); param.MinReducedArea = EMatcher1_.MinReducedArea; param.FilteringMode = EMatcher1_.FilteringMode; param.PixelDimension_Width = pixelDimension_Width; param.PixelDimension_Height = pixelDimension_Height; param.MaxPositions = EMatcher1_.MaxPositions; param.MaxInitialPositions = EMatcher1_.MaxInitialPositions; param.MinScore = EMatcher1_.MinScore; param.FinalReduction = EMatcher1_.FinalReduction; param.Interpolate = EMatcher1_.Interpolate; param.ContrastMode = EMatcher1_.ContrastMode; param.CorrelationMode = EMatcher1_.CorrelationMode; param.MinAngle = EMatcher1_.MinAngle; param.MaxAngle = EMatcher2_.MaxAngle; param.MinScale = EMatcher2_.MinScale; param.MaxScale = EMatcher2_.MaxScale; }
public static PatternMatchingTransformationResult ExecuteWithoutRotation( EImageBW8 eImage, float max_XTranslateOffset, float max_YTranslateOffset, int maxNumberOfTrial, PatternMatcherParameters patternMatcherParameters, ELineGauge gauge1, ELineGauge gauge2, ELineGauge gauge3, ELineGauge gauge4, double filterTolerance, double fiducialOffset, WaferOrientation fiducialOrientation, bool isIncludeFiducialTolerance, Func <ELineGauge, ELineGauge, ELineGauge, ELineGauge, EImageBW8, double, double, WaferOrientation, bool, PointF> FindCenter) { List <string> messages = new List <string>(); float thetaOffset = -1; float xOffset = -1; float yOffset = -1; bool isPass = false; bool isXOffsetWithinTolerance = false; bool isYOffsetWithinTolerance = false; int xTranslationCount = -1; int yTranslationCount = -1; PointF calibratedCenterPoint = new PointF( patternMatcherParameters.WaferCenterXPos, patternMatcherParameters.WaferCenterYPos); PointF currentWaferCenterPoint = new PointF(-1, -1); EuresysDoubleMatcherResults matchedResult = null; messages.Add("Maximum NumberOfTrial is " + maxNumberOfTrial); messages.Add("Accepted X Offset is below " + max_XTranslateOffset); messages.Add("Accepted Y Offset is below " + max_YTranslateOffset); #region X Offset for (int i = 0; i < maxNumberOfTrial; i++) { // Find X Offset currentWaferCenterPoint = FindCenter.Invoke( gauge1, gauge2, gauge3, gauge4, eImage, filterTolerance, fiducialOffset, fiducialOrientation, isIncludeFiducialTolerance); xOffset = calibratedCenterPoint.X - currentWaferCenterPoint.X; if (Math.Abs(xOffset) < max_XTranslateOffset) { isXOffsetWithinTolerance = true; xTranslationCount = i; messages.Add("XOffset within tolerance"); messages.Add("Number of X tranlation performed = " + xTranslationCount); break; } else { isXOffsetWithinTolerance = false; messages.Add(string.Format("XOffset: {0} out of tolerance", xOffset)); eImage = ImageTransformer.TranslateImage_X(eImage, xOffset); messages.Add("Image X Translated by " + xOffset); } if (i == maxNumberOfTrial) { xTranslationCount = i; messages.Add("Maximum number of trials for XOffset reached"); } } #endregion XOffset #region Y Offset for (int i = 0; i <= maxNumberOfTrial; i++) { // Find Y Offset currentWaferCenterPoint = FindCenter.Invoke( gauge1, gauge2, gauge3, gauge4, eImage, filterTolerance, fiducialOffset, fiducialOrientation, isIncludeFiducialTolerance); yOffset = calibratedCenterPoint.Y - currentWaferCenterPoint.Y; if (Math.Abs(yOffset) < max_YTranslateOffset) { isYOffsetWithinTolerance = true; yTranslationCount = i; messages.Add("YOffset within tolerance"); messages.Add("Number of Y tranlation performed = " + yTranslationCount); break; } else { isYOffsetWithinTolerance = false; messages.Add(string.Format("YOffset: {0} out of tolerance", yOffset)); eImage = ImageTransformer.TranslateImage_Y(eImage, yOffset); messages.Add("Image Y Translated by " + yOffset); } if (i == maxNumberOfTrial) { yTranslationCount = i; messages.Add("Maximum number of trials for YOffset reached"); } } #endregion Y offset #region Theta Offset thetaOffset = 0; messages.Add("Theta Offset is skipped"); #endregion Theta Offset #region Final Result messages.Add("Final Angle is " + Math.Round(thetaOffset, 4)); messages.Add("Final X Offset is " + Math.Round(xOffset, 4)); messages.Add("Final Y Offset is " + Math.Round(yOffset, 4)); if (isXOffsetWithinTolerance && isYOffsetWithinTolerance) { isPass = true; messages.Add("Result is Pass"); } else { isPass = false; messages.Add("Result is False"); } return(new PatternMatchingTransformationResult() { MatchedResult = matchedResult, eImageAfterTransformation = eImage, FinalAngleOffset = thetaOffset, FinalXOffset = xOffset, FinalYOffset = yOffset, IsPass = isPass, IsThetaOffsetWithinTolerance = true, IsXOffsetWithinTolerance = isXOffsetWithinTolerance, IsYOffsetWithinTolerance = isXOffsetWithinTolerance, XTranlastionCount = xTranslationCount, YTranslationCount = yTranslationCount, ThetaTranslationCount = 0, FinalWaferCenter = currentWaferCenterPoint, Messages = messages, }); #endregion Final Result }
public static PatternMatchingTransformationResult Execute( EImageBW8 eImage, float max_AngleOffset, float max_XTranslateOffset, float max_YTranslateOffset, int maxNumberOfTrial, EuresysDoublePatternMatcher eMatcher, PatternMatcherParameters patternMatcherParameters, EROIBW8 matcherROI, ELineGauge gauge1, ELineGauge gauge2, ELineGauge gauge3, ELineGauge gauge4, double filterTolerance, double fiducialOffset, WaferOrientation fiducialOrientation, bool isIncludeFiducialTolerance, Func <ELineGauge, ELineGauge, ELineGauge, ELineGauge, EImageBW8, double, double, WaferOrientation, bool, PointF> FindCenter, PointF TeacherMidPoint) { List <string> messages = new List <string>(); float thetaOffset = -1; float xOffset = -1; float yOffset = -1; bool isPass = false; bool isThetaOffsetWithinTolerance = false; bool isXOffsetWithinTolerance = false; bool isYOffsetWithinTolerance = false; int xTranslationCount = -1; int yTranslationCount = -1; int thetaTranslationCount = -1; PointF calibratedCenterPoint = new PointF( patternMatcherParameters.WaferCenterXPos, patternMatcherParameters.WaferCenterYPos); PointF currentWaferCenterPoint = new PointF(-1, -1); EuresysDoubleMatcherResults matchedResult = null; messages.Add("Maximum NumberOfTrial is " + maxNumberOfTrial); messages.Add("Accepted AngleOffset is below " + max_AngleOffset); messages.Add("Accepted X Offset is below " + max_XTranslateOffset); messages.Add("Accepted Y Offset is below " + max_YTranslateOffset); #region X Offset for (int i = 0; i < maxNumberOfTrial; i++) { // Find X Offset currentWaferCenterPoint = FindCenter.Invoke( gauge1, gauge2, gauge3, gauge4, eImage, filterTolerance, fiducialOffset, fiducialOrientation, isIncludeFiducialTolerance); xOffset = calibratedCenterPoint.X - currentWaferCenterPoint.X; if (Math.Abs(xOffset) < max_XTranslateOffset) { isXOffsetWithinTolerance = true; xTranslationCount = i; messages.Add("XOffset within tolerance"); messages.Add("Number of X tranlation performed = " + xTranslationCount); break; } else { isXOffsetWithinTolerance = false; messages.Add(string.Format("XOffset: {0} out of tolerance", xOffset)); eImage = ImageTransformer.TranslateImage_X(eImage, xOffset); messages.Add("Image X Translated by " + xOffset); } if (i == maxNumberOfTrial) { xTranslationCount = i; messages.Add("Maximum number of trials for XOffset reached"); } } #endregion XOffset #region Y Offset for (int i = 0; i <= maxNumberOfTrial; i++) { // Find Y Offset currentWaferCenterPoint = FindCenter.Invoke( gauge1, gauge2, gauge3, gauge4, eImage, filterTolerance, fiducialOffset, fiducialOrientation, isIncludeFiducialTolerance); yOffset = calibratedCenterPoint.Y - currentWaferCenterPoint.Y; if (Math.Abs(yOffset) < max_YTranslateOffset) { isYOffsetWithinTolerance = true; yTranslationCount = i; messages.Add("YOffset within tolerance"); messages.Add("Number of Y tranlation performed = " + yTranslationCount); break; } else { isYOffsetWithinTolerance = false; messages.Add(string.Format("YOffset: {0} out of tolerance", yOffset)); eImage = ImageTransformer.TranslateImage_Y(eImage, yOffset); messages.Add("Image Y Translated by " + yOffset); } if (i == maxNumberOfTrial) { yTranslationCount = i; messages.Add("Maximum number of trials for YOffset reached"); } } #endregion Y offset #region Theta Offset if (isXOffsetWithinTolerance && isYOffsetWithinTolerance) { for (int i = 0; i <= maxNumberOfTrial; i++) { currentWaferCenterPoint = FindCenter.Invoke( gauge1, gauge2, gauge3, gauge4, eImage, filterTolerance, fiducialOffset, fiducialOrientation, isIncludeFiducialTolerance); EuresysEROIHelper.AttachROI(eImage, matcherROI); eMatcher.MatchPatterns(matcherROI); WaferOrientation patternOrientation = FindWaferOrientation(currentWaferCenterPoint, TeacherMidPoint); matchedResult = PatternMatcherParameterHelper.CreateDoublePatternMatcherResult( eMatcher, matcherROI, patternMatcherParameters.OriginalXPos_pattern1, patternMatcherParameters.OriginalYPos_pattern1, currentWaferCenterPoint, patternMatcherParameters.DefaultAngleOffset, patternOrientation); thetaOffset = matchedResult.AngleBetweenResult; if (thetaOffset > 180) { throw new ArgumentOutOfRangeException("theta Offset must not be higher than 180"); } else if (thetaOffset < -180) { throw new ArgumentOutOfRangeException("theta Offset must not be lesser than 180"); } if (Math.Abs(thetaOffset) < max_AngleOffset) { isThetaOffsetWithinTolerance = true; thetaTranslationCount = i; messages.Add("Theta Offset within tolerance"); messages.Add("Number of Theta tranlation performed = " + thetaTranslationCount); break; } else { isThetaOffsetWithinTolerance = false; messages.Add(string.Format("Theta Offset: {0} out of tolerance", thetaOffset)); eImage = ImageTransformer.RotateImage(eImage, thetaOffset, calibratedCenterPoint); messages.Add("Image Theta Rotated by " + thetaOffset + " around calibrated Center Point"); } if (i == maxNumberOfTrial) { thetaTranslationCount = i; messages.Add("Maximum number of trials for Theta Offset reached"); } } } else { if (!isXOffsetWithinTolerance) { messages.Add("Theta offset correction skipped due to X Offset out of tolerance"); } if (!isYOffsetWithinTolerance) { messages.Add("Theta offset correction skipped due to X Offset out of tolerance"); } } #endregion Theta Offset #region Final Result messages.Add("Final Angle is " + Math.Round(thetaOffset, 4)); messages.Add("Final X Offset is " + Math.Round(xOffset, 4)); messages.Add("Final Y Offset is " + Math.Round(yOffset, 4)); if (isThetaOffsetWithinTolerance && isXOffsetWithinTolerance && isYOffsetWithinTolerance) { isPass = true; messages.Add("Result is Pass"); } else { isPass = false; messages.Add("Result is False"); } return(new PatternMatchingTransformationResult() { MatchedResult = matchedResult, eImageAfterTransformation = eImage, FinalAngleOffset = thetaOffset, FinalXOffset = xOffset, FinalYOffset = yOffset, IsPass = isPass, IsThetaOffsetWithinTolerance = isThetaOffsetWithinTolerance, IsXOffsetWithinTolerance = isXOffsetWithinTolerance, IsYOffsetWithinTolerance = isXOffsetWithinTolerance, XTranlastionCount = xTranslationCount, YTranslationCount = yTranslationCount, ThetaTranslationCount = thetaTranslationCount, FinalWaferCenter = currentWaferCenterPoint, Messages = messages, }); #endregion Final Result }
public static bool TeachTeacherROI( string RecipeName, EuresysDoublePatternMatcher PatternMatcher_, PatternMatcherParameters PatternMatcherParameters_, EROIBW8 eROIForPatternTeaching1_, EROIBW8 eROIForPatternTeaching2_, iEuresysROI MatcherEROI, PointF WaferCenterPoint, WaferOrientation patternOrientation) { string PatternFilePath_One = PatternMatcherParameterHelper.GetLeftPatternFilePath(RecipeName); string PatternFilePath_Two = PatternMatcherParameterHelper.GetRightPatternFilePath(RecipeName); string PatternImageFilePath_One = PatternMatcherParameterHelper.GetLeftPatternImageFilePath(RecipeName); string PatternImageFilePath_Two = PatternMatcherParameterHelper.GetRightPatternImageFilePath(RecipeName); PatternMatcher_.TeachAndSaveEMatcher( PatternMatcherParameters_, eROIForPatternTeaching1_, eROIForPatternTeaching2_, PatternFilePath_One, PatternFilePath_Two, PatternImageFilePath_One, PatternImageFilePath_Two); if (PatternMatcher_.Pattern1.IsVoid) { goto Fail; } if (PatternMatcher_.Pattern2.IsVoid) { goto Fail; } // Match EROIBW8 matcherROI = MatcherEROI.GetROI(0); PatternMatcher_.MatchPatterns(matcherROI); EMatcher eMatcher1 = PatternMatcher_.EMatcher1; EMatcher eMatcher2 = PatternMatcher_.EMatcher2; if (eMatcher1.NumPositions != 1) { string errorMessage = "Pattern 1: Number of patterns matched is not equal to one"; VisionLogger.Log(LogType.Exception, "PatternMatcherManager", errorMessage); VisionNotifier.AddNotification(errorMessage); goto Fail; } if (eMatcher2.NumPositions != 1) { string errorMessage = "Pattern 2: Number of patterns matched is not equal to one"; VisionLogger.Log(LogType.Exception, "PatternMatcherManager", errorMessage); VisionNotifier.AddNotification(errorMessage); goto Fail; } EROIBW8 matcherEROI_1 = MatcherEROI.GetROI(0); float OriginalXPos_pattern1 = eMatcher1.GetPosition(0).CenterX + (matcherEROI_1.OrgX); float OriginalYPos_pattern1 = eMatcher1.GetPosition(0).CenterY + (matcherEROI_1.OrgY); float OriginalXPos_pattern2 = eMatcher2.GetPosition(0).CenterX + (matcherEROI_1.OrgX); float OriginalYPos_pattern2 = eMatcher2.GetPosition(0).CenterY + (matcherEROI_1.OrgY); float WaferCenterXPos = WaferCenterPoint.X; float WaferCenterYPos = WaferCenterPoint.Y; PointF p1 = new PointF(OriginalXPos_pattern1, OriginalYPos_pattern1); PointF p2 = new PointF(OriginalXPos_pattern2, OriginalYPos_pattern2); float PatternDefaultAngleOffset = (float)CalculateAngleBetween3Points.Execute( p1, p2, WaferCenterPoint, 0, true, patternOrientation); // Replace value PatternMatcherParameters_.OriginalXPos_pattern1 = OriginalXPos_pattern1; PatternMatcherParameters_.OriginalYPos_pattern1 = OriginalYPos_pattern1; PatternMatcherParameters_.OriginalXPos_pattern2 = OriginalXPos_pattern2; PatternMatcherParameters_.OriginalYPos_pattern2 = OriginalYPos_pattern2; PatternMatcherParameters_.WaferCenterXPos = WaferCenterXPos; PatternMatcherParameters_.WaferCenterYPos = WaferCenterYPos; PatternMatcherParameters_.DefaultAngleOffset = PatternDefaultAngleOffset; return(true); Fail: return(false); }