223 lines
7.7 KiB
C#
223 lines
7.7 KiB
C#
/*
|
|
* 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.Caliper;
|
|
using System;
|
|
using System.IO;
|
|
using System.Drawing;
|
|
|
|
namespace CogPattern {
|
|
/// <summary>
|
|
/// LineFinder 클래스
|
|
/// </summary>
|
|
public class LineFinder : PatternBase, IPatternFinder, IDisposable {
|
|
/// <inheritdoc/>
|
|
public string FILE_EXT_PATTERN { get; set; } = "_FindLine.vpp";
|
|
|
|
private readonly Logger _logger;
|
|
private readonly PatternInfo _patternInfo;
|
|
private CogFindLineTool _CogFindLineTool;
|
|
/// <summary>
|
|
/// LineFinder 생성자
|
|
/// </summary>
|
|
/// <param name="patternInfo">패턴 정보</param>
|
|
public LineFinder(PatternInfo patternInfo) {
|
|
_patternInfo = patternInfo;
|
|
_logger = new Logger(
|
|
$"LineFinder_{patternInfo.GetPatternIndex()}");
|
|
Init();
|
|
}
|
|
|
|
private void Init() {
|
|
if (E1.OK != Load()) {
|
|
Create();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// 라인파인더 저장경로 불러오기
|
|
/// </summary>
|
|
/// <returns>문자열</returns>
|
|
public string GetPatternFilePath(string patternName = PatternConstants.FILE_NAME_PATTERN) {
|
|
return Path.Combine(new string[] {
|
|
PatternConstants.GetSubPatternDirPath(_patternInfo),
|
|
patternName + FILE_EXT_PATTERN
|
|
});
|
|
}
|
|
/// <summary>
|
|
/// 라인파인더 불러오기
|
|
/// </summary>
|
|
/// <returns>성공여부</returns>
|
|
public int Load() {
|
|
var patternFilePath = GetPatternFilePath();
|
|
|
|
if (!File.Exists(patternFilePath)) {
|
|
_logger.I($"Pattern File does NOT exist : {patternFilePath}");
|
|
return E2.NOT_FOUND;
|
|
}
|
|
|
|
_CogFindLineTool = CogMeasureLine.LoadTool(patternFilePath);
|
|
return E1.OK;
|
|
}
|
|
/// <summary>
|
|
/// 라인파인더 저장
|
|
/// </summary>
|
|
/// <returns>성공여부</returns>
|
|
public int Save() {
|
|
var patternFilePath = GetPatternFilePath();
|
|
var patternDirPath = Path.GetDirectoryName(patternFilePath);
|
|
if (!Directory.Exists(patternDirPath)) {
|
|
Directory.CreateDirectory(patternDirPath);
|
|
}
|
|
|
|
return CogMeasureLine.SaveTool(_CogFindLineTool, patternFilePath);
|
|
}
|
|
/// <summary>
|
|
/// 라인파인더 툴 생성
|
|
/// </summary>
|
|
/// <returns>성공여부</returns>
|
|
public int Create() {
|
|
FreeTool();
|
|
_CogFindLineTool = CogMeasureLine.CreateTool();
|
|
|
|
return E1.OK;
|
|
}
|
|
/// <summary>
|
|
/// 라인파인더 툴 제거
|
|
/// </summary>
|
|
/// <returns>성공여부</returns>
|
|
public int Remove() {
|
|
FreeTool();
|
|
|
|
var patternFilePath = GetPatternFilePath();
|
|
var patternDirPath = Path.GetDirectoryName(patternFilePath);
|
|
if (Directory.Exists(patternDirPath)) {
|
|
Directory.Delete(patternDirPath, recursive: true);
|
|
}
|
|
|
|
return E1.OK;
|
|
}
|
|
/// <summary>
|
|
/// ROI 불러오기
|
|
/// </summary>
|
|
/// <returns>ROI</returns>
|
|
public ROI GetFindROI() {
|
|
return CogMeasureLine.GetFindROI(_CogFindLineTool);
|
|
}
|
|
/// <summary>
|
|
/// ROI 설정
|
|
/// </summary>
|
|
/// <param name="findRoi">ROI 정보</param>
|
|
/// <returns>성공여부</returns>
|
|
public int SetFindROI(ROI findRoi) {
|
|
return CogMeasureLine.SetFindROI(_CogFindLineTool, findRoi);
|
|
}
|
|
/// <summary>
|
|
/// 실행인자 가져오기
|
|
/// </summary>
|
|
/// <returns>실행인자</returns>
|
|
public IRunParam GetRunParam() {
|
|
return CogMeasureLine.GetRunParam(_CogFindLineTool);
|
|
}
|
|
/// <summary>
|
|
/// 실행인자 설정
|
|
/// </summary>
|
|
/// <param name="runParam">실행인자</param>
|
|
/// <returns>성공여부</returns>
|
|
public int SetRunParam(IRunParam runParam) {
|
|
return CogMeasureLine.SetRunParam(_CogFindLineTool, runParam);
|
|
}
|
|
/// <summary>
|
|
/// 패턴 찾기
|
|
/// </summary>
|
|
/// <param name="image">이미지</param>
|
|
/// <returns>패턴결과</returns>
|
|
public PatternResult Find(object image) {
|
|
return CogMeasureLine.Find(_CogFindLineTool, (ICogImage)image);
|
|
}
|
|
/// <summary>
|
|
/// 패턴 찾기
|
|
/// </summary>
|
|
/// <param name="image">이미지</param>
|
|
/// <param name="findRoi">ROI 영역</param>
|
|
/// <returns>패턴 결과</returns>
|
|
public PatternResult Find(object image, ROI findRoi) {
|
|
return CogMeasureLine.Find(_CogFindLineTool, (ICogImage)image, findRoi);
|
|
}
|
|
/// <summary>
|
|
/// 결과 없음 가져오기
|
|
/// </summary>
|
|
/// <returns>PatternResult</returns>
|
|
public PatternResult GetNotFoundPatternResult() {
|
|
return CogMeasureLine.GetNotFoundPatternResult();
|
|
}
|
|
/// <summary>
|
|
/// 라인툴 가져오기
|
|
/// </summary>
|
|
/// <returns>object</returns>
|
|
public object GetTool() {
|
|
return _CogFindLineTool;
|
|
}
|
|
/// <summary>
|
|
/// 패턴 그리기
|
|
/// </summary>
|
|
/// <param name="patternResult">패턴 결과</param>
|
|
/// <param name="cameraDisplay">Display</param>
|
|
/// <param name="isFixturePattern">픽스처 여부</param>
|
|
public void Draw(
|
|
PatternResult patternResult, ICameraDisplay cameraDisplay, bool isFixturePattern = false) {
|
|
CogMeasureLine.Draw(_CogFindLineTool, patternResult, cameraDisplay as ICogCameraDisplay);
|
|
CogMeasureLine.DrawCaliperROI(_CogFindLineTool, cameraDisplay as ICogCameraDisplay, patternResult.FindRoi);
|
|
}
|
|
/// <summary>
|
|
/// 썸네일 가져오기
|
|
/// </summary>
|
|
/// <returns>비트맵</returns>
|
|
public Bitmap GetThumbnail() {
|
|
try {
|
|
var imageSize = ThumbnailUtil.GetImageSize();
|
|
var thumnailImage = new Bitmap(
|
|
imageSize.Width, imageSize.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
|
|
|
|
var findRoi = GetFindROI();
|
|
var center = new ImagePoint(imageSize.Width / 2, imageSize.Height / 2);
|
|
|
|
using (var graphics = Graphics.FromImage(thumnailImage)) {
|
|
var pen = new Pen(new SolidBrush(Color.FromKnownColor(KnownColor.White)), 3);
|
|
var lineStart = MathUtil.Rotate(new ImagePoint(0, (int)center.Y), findRoi.Angle, center);
|
|
var lineEnd = MathUtil.Rotate(new ImagePoint(imageSize.Width, (int)center.Y), findRoi.Angle, center);
|
|
graphics.DrawLine(
|
|
pen,
|
|
new Point((int)lineStart.X, (int)lineStart.Y),
|
|
new Point((int)lineEnd.X, (int)lineEnd.Y));
|
|
}
|
|
|
|
return thumnailImage;
|
|
}
|
|
catch (Exception e) {
|
|
_logger.FuncE(e.Message);
|
|
}
|
|
|
|
return ThumbnailUtil.GetDefaultImage();
|
|
}
|
|
|
|
#region IDisposible
|
|
/// <summary>
|
|
/// 자원 회수
|
|
/// </summary>
|
|
public void Dispose() {
|
|
FreeTool();
|
|
}
|
|
|
|
private void FreeTool() {
|
|
CogMeasureLine.FreeTool(_CogFindLineTool);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|