2026-01-26 14:51:28 +09:00

193 lines
8.4 KiB
C#

/*
* 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;
}
}
}