88 lines
3.5 KiB
C#
88 lines
3.5 KiB
C#
using Aurora.Api;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace VisionCommon {
|
|
/// <summary>
|
|
/// 패턴 유틸 클래스
|
|
/// </summary>
|
|
public static class PatternUtil {
|
|
private static Logger _logger = new Logger(typeof(PatternUtil).Name);
|
|
|
|
/// <summary>
|
|
/// UI 콤보 박스용 패턴 설명 생성
|
|
/// </summary>
|
|
/// <param name="patternInfo">패턴 정보</param>
|
|
/// <returns>패턴 설명</returns>
|
|
public static string GetPatternDescription(PatternInfo patternInfo) {
|
|
var patternSymbol = "";
|
|
if (patternInfo is FovPatternInfo) {
|
|
patternSymbol = "[FP]"; // Fov Pattern
|
|
}
|
|
else {
|
|
patternSymbol = "[CP]"; // Cam Pattern
|
|
}
|
|
return $"{patternSymbol}_{patternInfo.GetPatternId()}_{patternInfo.PatternType}_{patternInfo.Description}";
|
|
}
|
|
|
|
/// <summary>
|
|
/// 패턴 검출 결과의 레퍼런스 인덱스를 구한다.
|
|
/// </summary>
|
|
/// <typeparam name="T">포인트 타입, 예)ImagePoint, StaticPoint</typeparam>
|
|
/// <param name="measurePoints">패턴 검출 결과</param>
|
|
/// <param name="referencePoints">레퍼런스</param>
|
|
/// <param name="distanceTolerance">허용 거리(Spec)</param>
|
|
/// <returns>패턴의 레퍼런스 인덱스 (성공 : 0 ~ , 실패 : -1)</returns>
|
|
public static List<int> GetNearestPointIndex<T>(
|
|
List<T> measurePoints,
|
|
List<T> referencePoints,
|
|
double distanceTolerance) where T : DoublePoint {
|
|
var results = new List<int>();
|
|
|
|
// 1. 파라미터 체크
|
|
if (measurePoints == null || measurePoints.Count == 0) {
|
|
_logger.FuncE("measurePoints : null or empty");
|
|
return results;
|
|
}
|
|
|
|
if (referencePoints == null || referencePoints.Count == 0) {
|
|
_logger.FuncE("referencePoints : null or empty");
|
|
return results;
|
|
}
|
|
|
|
// 2. 모든 조합의 measure-reference point의 거리를 구한다.
|
|
double[,] distanceMap = new double[measurePoints.Count, referencePoints.Count];
|
|
|
|
// Row (j) : measure point
|
|
for (int j = 0; j < measurePoints.Count; j++) {
|
|
// Col (i) : reference point
|
|
for (int i = 0; i < referencePoints.Count; i++) {
|
|
distanceMap[j, i] = MathUtil.CalculateDistance(
|
|
measurePoints[j],
|
|
referencePoints[i]);
|
|
}
|
|
}
|
|
|
|
// 3. distanceTolerance를 초과하지 않는 최소 거리의 reference인덱스를 구한다.
|
|
// Row (j) : measure point
|
|
for (int j = 0; j < measurePoints.Count; j++) {
|
|
int nearestIndex = -1;
|
|
double nearestDist = Double.MaxValue;
|
|
// Col (i) : reference point
|
|
for (int i = 0; i < referencePoints.Count; i++) {
|
|
double curDistance = distanceMap[j, i];
|
|
if (curDistance <= distanceTolerance && // distanceTolerance 체크
|
|
curDistance < nearestDist) { // 최소 거리 체크
|
|
nearestDist = curDistance;
|
|
nearestIndex = i;
|
|
}
|
|
}
|
|
|
|
results.Add(nearestIndex);
|
|
}
|
|
|
|
return results;
|
|
}
|
|
}
|
|
}
|