/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using CogCommon; using VisionCommon; using Hermes; using Cognex.VisionPro; using Cognex.VisionPro.PMAlign; using System; using Aurora.Api; namespace CogPattern { public class ImageModelFinderTrainParam : ImageTrainParam, ICloneable { public ICogImage TrainMask { get; set; } public object Clone() { return new ImageModelFinderTrainParam() { TrainMask = TrainMask.CopyBase(CogImageCopyModeConstants.CopyPixels), TrainImage = ((ICogImage)TrainImage).CopyBase(CogImageCopyModeConstants.CopyPixels), TrainRoi = TrainRoi.Clone() as ROI, TrainOrigin = TrainOrigin.Clone() as Cross, TrainOriginInModel = TrainOriginInModel.Clone() as Cross }; } } public static class MmfImage { private static Logger _Logger = new Logger(typeof(MmfImage).Name); public static ITrainParam GetTrainParam(CogPMAlignTool cogPMAlignTool) { var trainParam = new ImageModelFinderTrainParam(); if (MmfCommon.IsTrained(cogPMAlignTool)) { trainParam.TrainImage = cogPMAlignTool.Pattern.TrainImage; trainParam.TrainMask = cogPMAlignTool.Pattern.TrainImageMask; trainParam.TrainRoi = GetTrainROI(cogPMAlignTool); trainParam.TrainOrigin = GetFixtureOrigin(cogPMAlignTool); trainParam.TrainOriginInModel = GetTrainOriginInModel(cogPMAlignTool); } return trainParam; } public static ROI GetTrainROI(CogPMAlignTool cogPMAlignTool) { if (MmfCommon.IsTrained(cogPMAlignTool)) { var trainRoi = cogPMAlignTool.Pattern.TrainRegion as CogRectangleAffine; var angle = new Angle() { // trainRoi의 Rotation이 항상 0으로 저장되기 때문에, trainOrigin의 Rotation으로 Set해준다. Degree = CogMisc.RadToDeg(cogPMAlignTool.Pattern.Origin.Rotation) //Degree = CogMisc.RadToDeg(trainRoi.Rotation) }; return new ROI( trainRoi.CenterX, trainRoi.CenterY, (int)trainRoi.SideXLength, (int)trainRoi.SideYLength, angle); } return new ROI(); } public static Cross GetFixtureOrigin(CogPMAlignTool cogPMAlignTool) { if (MmfCommon.IsTrained(cogPMAlignTool)) { double originalX = cogPMAlignTool.Pattern.Origin.TranslationX; double originalY = cogPMAlignTool.Pattern.Origin.TranslationY; Angle angle = Angle.CreateWithRadian(cogPMAlignTool.Pattern.Origin.Rotation); return new Cross(new ImagePoint(originalX, originalY), angle); } return new Cross(new ImagePoint()); } public static Cross GetTrainOriginInModel(CogPMAlignTool cogPMAlignTool) { if (MmfCommon.IsTrained(cogPMAlignTool)) { var trainRoi = cogPMAlignTool.Pattern.TrainRegion as CogRectangleAffine; double trainOriginInModelX = cogPMAlignTool.Pattern.Origin.TranslationX - trainRoi.CornerOriginX; double trainOriginInModelY = cogPMAlignTool.Pattern.Origin.TranslationY - trainRoi.CornerOriginY; Angle angle = Angle.CreateWithRadian(cogPMAlignTool.Pattern.Origin.Rotation); return new Cross(new ImagePoint(trainOriginInModelX, trainOriginInModelY), angle); } return new Cross(new ImagePoint()); } public static int Train(CogPMAlignTool cogPMAlignTool, ITrainParam trainParam) { if (trainParam is ImageModelFinderTrainParam) { var param = trainParam as ImageModelFinderTrainParam; return DefineModel(cogPMAlignTool, param); } return E1.GENERIC; } private static int DefineModel(CogPMAlignTool cogPMAlignTool, ImageModelFinderTrainParam param) { if ((ICogImage)param.TrainImage == null) { return E1.ARGUMENT; } if (SetPatternTrainParameter(cogPMAlignTool, param) == E1.OK) { cogPMAlignTool.InputImage = param.TrainImage as ICogImage; cogPMAlignTool.Pattern.Train(); return E1.OK; } else { _Logger.FuncE("SetPatternTrainParameter Failed!!"); return E1.GENERIC; } } public static int SetPatternTrainParameter(CogPMAlignTool cogPMAlignTool, ImageModelFinderTrainParam trainParam) { try { cogPMAlignTool.Pattern.Origin.TranslationX = trainParam.TrainOrigin.Origin.X; cogPMAlignTool.Pattern.Origin.TranslationY = trainParam.TrainOrigin.Origin.Y; cogPMAlignTool.Pattern.Origin.Rotation = trainParam.TrainRoi.Angle.Radian; cogPMAlignTool.Pattern.TrainImage = (CogImage8Grey)trainParam.TrainImage; cogPMAlignTool.Pattern.TrainImageMask = (CogImage8Grey)trainParam.TrainMask; cogPMAlignTool.Pattern.TrainMode = CogPMAlignTrainModeConstants.Image; // 트레인시 마스크 이미지가 돌아가지 않도록 TrainRoi를 항상 0도로 Set해준다. var roi = trainParam.TrainRoi.Clone() as ROI; roi.Angle = Angle.CreateWithDegree(0); cogPMAlignTool.Pattern.TrainRegion = CogEnvironment.ConvertToCogRectangleAffine(roi); //cogPMAlignTool.Pattern.TrainRegion = CogEnvironment.ConvertToCogRectangleAffine(trainParam.TrainRoi); cogPMAlignTool.Pattern.TrainRegionMode = CogRegionModeConstants.PixelAlignedBoundingBoxAdjustMask; return E1.OK; } catch (Exception e) { _Logger.FuncE("{0}", e.Message); } return E1.GENERIC; } public static ICogImage GetModelImage(CogPMAlignTool cogPMAlignTool) { if (MmfCommon.IsTrained(cogPMAlignTool)) { var modelImage = CogEnvironment.CropImage( cogPMAlignTool.Pattern.TrainImage, CogEnvironment.ConvertToRoi(cogPMAlignTool.Pattern.TrainRegion as CogRectangleAffine)); return modelImage; } return null; } public static ICogImage GetMaskImage(CogPMAlignTool cogPMAlignTool) { if (cogPMAlignTool.Pattern.TrainImageMask == null) { if (MmfCommon.IsTrained(cogPMAlignTool)) { var trainRoi = GetTrainROI(cogPMAlignTool); var maskImage = new CogImage8Grey( (int)trainRoi.Width, (int)trainRoi.Height); CogEnvironment.ClearImage(maskImage, 255); return maskImage; } } return cogPMAlignTool.Pattern.TrainImageMask; } public static int SetMaskImage(CogPMAlignTool cogPMAlignTool, ICogImage maskImage) { if (maskImage != null) { var trainRoi = cogPMAlignTool.Pattern.TrainRegion as CogRectangleAffine; cogPMAlignTool.Pattern.TrainImageMask = maskImage as CogImage8Grey; cogPMAlignTool.Pattern.TrainImageMaskOffsetX = (int)trainRoi.CornerOriginX; cogPMAlignTool.Pattern.TrainImageMaskOffsetY = (int)trainRoi.CornerOriginY; return E1.OK; } return E1.GENERIC; } public static int SetTrainOrigin(CogPMAlignTool cogPMAlignTool, Cross trainOrigin) { cogPMAlignTool.Pattern.Origin.TranslationX = trainOrigin.Origin.X; cogPMAlignTool.Pattern.Origin.TranslationY = trainOrigin.Origin.Y; cogPMAlignTool.Pattern.Train(); return E1.OK; } public static int SetTrainOriginInModel(CogPMAlignTool cogPMAlignTool, Cross trainOriginInModel) { var trainRoi = cogPMAlignTool.Pattern.TrainRegion as CogRectangleAffine; cogPMAlignTool.Pattern.Origin.TranslationX = trainRoi.CornerOriginX + trainOriginInModel.Origin.X; cogPMAlignTool.Pattern.Origin.TranslationY = trainRoi.CornerOriginY + trainOriginInModel.Origin.Y; cogPMAlignTool.Pattern.Train(); return E1.OK; } } }