193 lines
8.4 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|