Example #1
0
        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;
        }
Example #2
0
        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);
        }
Example #6
0
        //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);
        }
Example #8
0
        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;
        }
Example #9
0
        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
        }
Example #10
0
        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);
        }