/* * Copyright (c) 2025 LG Electronics Inc. * SPDX-License-Identifier: LicenseRef-LGE-Proprietary */ using Aurora.Api; using MilCommon; using VisionCommon; using Hermes; using Matrox.MatroxImagingLibrary; using System; using System.Collections.Generic; using System.Text; namespace MilPattern { /// /// String & OCR Reader 모듈 /// internal static class MilOcr { private static Logger _logger = new Logger(typeof(MilOcr).Name); public static OcrRunParam GetRunParam(MIL_ID contextId_Str, MIL_ID contextId_Ocr) { var runParam = new OcrRunParam(); try { // RunParam은 *.msr 혹은 *.mfo 파일에서 관리하기로 한다. // String Read //double threshold = 0; //MIL.MstrInquire(contextId_Str, MIL.M_DEFAULT, MIL.M_THRESHOLD_VALUE + MIL.M_AUTO_COMPUTE, ref threshold); //runParam.OcrParamExt.StrReadParamExt.Threshold = (int)threshold; //runParam.OcrParamExt.StrReadParamExt.Speed = (eMilSpeed)Convert.ToInt32(MIL.MstrInquire(contextId_Str, MIL.M_DEFAULT, MIL.M_SPEED + MIL.M_DEFAULT, MIL.M_NULL)); // OCR Read //MIL.MocrInquire(contextId_Ocr, MIL.M_THRESHOLD + MIL.M_AUTO, ref threshold); //runParam.OcrParamExt.OcrReadParamExt.Threshold = (int)threshold; //runParam.OcrParamExt.OcrReadParamExt.Speed = (eMilSpeed)Convert.ToInt32(MIL.MocrInquire(contextId_Ocr, MIL.M_SPEED, MIL.M_NULL)); } catch (Exception e) { _logger.FuncE(e.Message); } return runParam; } public static int SetRunParam(MIL_ID contextId, IRunParam runParam) { if (runParam is OcrRunParam) { // RunParam은 *.msr 혹은 *.mfo 파일에서 관리하기로 한다. //var param = runParam as OcrRunParam; //MIL.MstrControl(contextId, MIL.M_DEFAULT, MIL.M_SPEED, (double)param.OcrParamExt.StrReadParamExt.Speed); //if (param.OcrParamExt.StrReadParamExt.AutoThreshold) { // MIL.MstrControl(contextId, MIL.M_DEFAULT, MIL.M_THRESHOLD_VALUE, MIL.M_AUTO_COMPUTE); //} //else { // MIL.MstrControl(contextId, MIL.M_DEFAULT, MIL.M_THRESHOLD_VALUE, (double)param.OcrParamExt.StrReadParamExt.Threshold); //} //MIL.MocrControl(contextId, MIL.M_SPEED, (double)param.OcrParamExt.OcrReadParamExt.Speed); //if (param.OcrParamExt.OcrReadParamExt.AutoThreshold) { // MIL.MocrControl(contextId, MIL.M_THRESHOLD, MIL.M_AUTO); //} //else { // MIL.MocrControl(contextId, MIL.M_THRESHOLD, param.OcrParamExt.OcrReadParamExt.Threshold); //} return E1.OK; } return E1.GENERIC; } public static PatternResult GetNotFoundPatternResult() { return new PatternResult() { Status = eFoundStatus.NotFound, Results = new List() }; } public static void Draw(PatternResult patternResult, IMilCameraDisplay milCameraDisplay) { MIL_ID staticGraphicList = 0; MIL.MdispInquire(milCameraDisplay.GetMilDisplayId(), MIL.M_ASSOCIATED_GRAPHIC_LIST_ID, ref staticGraphicList); if (patternResult.Status == eFoundStatus.FoundOK) { var results = patternResult.Results as List; var crosses = new List(); foreach (var result in results) { if (result.ImagePosition.X == 0 && result.ImagePosition.Y == 0) { continue; } var color = GraphicColors.PatternFoundOK; var cross = new Cross(result.ImagePosition.Clone() as ImagePoint, 50); crosses.Add(cross); milCameraDisplay.SetPatternTracking(cross); milCameraDisplay.AddCross(cross, color); var msgs = new List(); msgs.Add(string.Format("OcrType : {0}", result.OcrType)); msgs.Add(string.Format("X : {0:0.00}", result.ImagePosition.X)); msgs.Add(string.Format("Y : {0:0.00}", result.ImagePosition.Y)); msgs.Add(string.Format("Angle : {0:0.00}", result.Angle.Degree)); msgs.Add(string.Format("Score : {0:0.00}", result.Score)); msgs.Add(string.Format("TactTime : {0} ms", Math.Round(patternResult.TactTimeInMilliSec))); msgs.Add(string.Format("Text : {0}", result.Text)); milCameraDisplay.AddTextList( GraphicColors.PatternFoundOK, new ImagePoint(result.ImagePosition.X, result.ImagePosition.Y), msgs); } milCameraDisplay.DrawPatternTrackings(crosses); } } } }