/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using CogCommon; using VisionCommon; using Hermes; using Cognex.VisionPro; using Cognex.VisionPro.Blob; using System; using System.IO; using System.Drawing; using VisionCommonUI; namespace CogPattern { /// /// 패턴 Blob /// public class Blob : PatternBase, IPatternFinder, IDisposable { /// /// 패턴 파일 확장자 /// public string FILE_EXT_PATTERN { get; set; } = "_Blob.vpp"; private BlobParamExt _paramExt = null; private Logger _logger; private PatternInfo _patternInfo; private CogBlobTool _CogBlobTool; /// /// 생성자 /// /// 패턴 정보 public Blob(PatternInfo patternInfo) { _patternInfo = patternInfo; _logger = new Logger( $"Blob_{patternInfo.GetPatternIndex()}"); InitContext(); } private void InitContext() { if (E1.OK != Load()) { Create(); } } /// /// 패턴 경로 가져오기 /// /// 패턴 경로 public string GetPatternFilePath(string patternName = PatternConstants.FILE_NAME_PATTERN) { return Path.Combine(new string[] { PatternConstants.GetSubPatternDirPath(_patternInfo), patternName + FILE_EXT_PATTERN }); } /// /// 패턴 불러오기 /// /// 성공 유무 public int Load() { var patternFilePath = GetPatternFilePath(); if (!File.Exists(patternFilePath)) { _logger.I($"Pattern File does NOT exist : {patternFilePath}"); return E2.NOT_FOUND; } CogBlob.FreeTool(_CogBlobTool); _CogBlobTool = CogBlob.LoadTool(patternFilePath); _paramExt = LoadParamExt(); return E1.OK; } /// /// 패턴 저장 /// /// 성공 유무 public int Save() { var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (!Directory.Exists(patternDirPath)) { Directory.CreateDirectory(patternDirPath); } SaveParamExt(_paramExt); return CogBlob.SaveTool(_CogBlobTool, patternFilePath); } /// /// 패턴 생성 /// /// 성공 유무 public int Create() { CogBlob.FreeTool(_CogBlobTool); _CogBlobTool = CogBlob.CreateTool(); _paramExt = LoadParamExt(); return E1.OK; } /// /// 패턴 제거 /// /// 성공 유무 public int Remove() { CogBlob.FreeTool(_CogBlobTool); var patternFilePath = GetPatternFilePath(); var patternDirPath = Path.GetDirectoryName(patternFilePath); if (Directory.Exists(patternDirPath)) { Directory.Delete(patternDirPath, recursive: true); } return E1.OK; } /// /// 패턴 찾기 영역 가져오기 /// /// 패턴 찾기 영역 public ROI GetFindROI() { return CogBlob.GetFindROI(_CogBlobTool); } /// /// 패턴 찾기 영역 지정하기 /// /// 패턴 찾기 영역 /// 성공 유무 public int SetFindROI(ROI findRoi) { if (ROI.IsNullOrEmpty(findRoi)) { return E1.GENERIC; } CogBlob.SetFindROI(_CogBlobTool, findRoi); return E1.OK; } /// /// 패턴 파라미터 가져오기 /// /// 패턴 파라미터 public IRunParam GetRunParam() { return new BlobRunParam() { BlobParamExt = _paramExt.Clone() as BlobParamExt, ForegroundColor = GetForegroundColor(_CogBlobTool), FindROI = CogBlob.GetFindROI(_CogBlobTool) }; } /// /// 타겟 컬러 가져오기 /// /// Tool /// 기본 컬러 private eForegroundColor GetForegroundColor(CogBlobTool cogBlobTool) { if (cogBlobTool.RunParams.SegmentationParams.Polarity == CogBlobSegmentationPolarityConstants.LightBlobs) { return eForegroundColor.White; } else { return eForegroundColor.Black; } } /// /// 패턴 파라미터 설정 /// /// 패턴 파라미터 /// 성공 유무 public int SetRunParam(IRunParam runParam) { _paramExt = ((BlobRunParam)runParam).BlobParamExt.Clone() as BlobParamExt; return CogBlob.SetRunParam(_CogBlobTool, runParam); } /// /// 패턴 찾기 /// /// 이미지 /// 패턴 결과 public PatternResult Find(object image) { var findRoi = CogBlob.GetFindROI(_CogBlobTool); return Find((ICogImage)image, findRoi); } /// /// 패턴 찾기 /// /// 이미지 /// 패턴 찾기 영역 /// 패턴 결과 public PatternResult Find(object image, ROI findRoi) { return CogBlob.Find(_CogBlobTool, (ICogImage)image, findRoi, _paramExt); } public PatternResult GetNotFoundPatternResult() { return CogBlob.GetNotFoundPatternResult(); } /// /// 패턴 Tool 가져오기 /// /// 패턴 Tool public object GetTool() { return _CogBlobTool; } /// /// 패턴 결과 그리기 /// /// 패턴 결과 /// 카메라 디스플레이 /// 픽스쳐 패턴 여부 public void Draw( PatternResult patternResult, ICameraDisplay cameraDisplay, bool isFixturePattern = false) { CogBlob.Draw(patternResult, cameraDisplay as ICogCameraDisplay); } /// /// 패턴 미리보기 가져오기 /// /// 패턴 미리보기 public Bitmap GetThumbnail() { return ThumbnailImage.Blob(); } #region IDisposible /// /// 자원 회수 /// public void Dispose() { CogBlob.FreeTool(_CogBlobTool); } #endregion #region Blob Specific internal BlobParamExt LoadParamExt() { return BlobParamExt.Load(PatternConstants.GetSubPatternDirPath(_patternInfo)); } internal int SaveParamExt(BlobParamExt blobParamExt) { return BlobParamExt.Save( PatternConstants.GetSubPatternDirPath(_patternInfo), blobParamExt); } #endregion } }