Эх сурвалжийг харах

fix 半自动未评估黑边线条

ZIM 11 сар өмнө
parent
commit
b4f0382b6a

+ 3 - 2
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/LineGuess.cs → Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/InterLineGuess.cs

@@ -7,8 +7,9 @@ using UnityEngine;
 
 namespace o0.Project
 {
+    // 猜测屏幕内部的线,用于识别屏幕的黑边
     // 大于阈值则猜测是Line,但是这个类不考虑梯度,外部仍需结合梯度评估
-    public class LineGuess
+    public class InterLineGuess
     {
         public static float isLineThreshold = 1.0f;
         // 记录分段的线段数据
@@ -66,7 +67,7 @@ namespace o0.Project
         public float GradientLength;
         public float MinLineLength;
 
-        public LineGuess(List<Matrix> screenLocateMatList, float gradientLength, float minLineLength)
+        public InterLineGuess(List<Matrix> screenLocateMatList, float gradientLength, float minLineLength)
         {
             ScreenLocateMatList = screenLocateMatList;
             GradientLength = gradientLength;

+ 0 - 0
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/LineGuess.cs.meta → Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/InterLineGuess.cs.meta


+ 10 - 0
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/LineIdentify/LineIdentified.cs

@@ -46,6 +46,16 @@ namespace o0.Project
                 DrawLine = lineParams.line;
         }
 
+        bool? _isInterLine;
+        // 评估是否是屏幕内部的线
+        public bool GuessIsInterLine(InterLineGuess guess)
+        {
+            if (_isInterLine == null)
+                _isInterLine = guess.GuessIsLine(this);
+
+            return _isInterLine.Value;
+        }
+
         public void Offset(Vector offset)
         {
             Line += offset;

+ 6 - 4
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/ScreenIdentification.cs

@@ -979,6 +979,8 @@ namespace o0.Project
 
             // 角度阈值,用来判断线段的梯度方向是否指向屏幕中心(avgPoint)
             var avaAngleHalf = 75f;
+            // 评估屏幕内部的Line
+            var interLineGuess = new InterLineGuess(screenLocateMatList, gradientLength * 2, minLength);
 
             #region 内部函数
             float ScreenGrad(LineIdentified line)
@@ -1078,7 +1080,7 @@ namespace o0.Project
             }
             // 新增功能(解决黑边问题):根据 result 再找平行线,判断是否替换(1-在 result 内部,且离中点最近,2-接近平行)
             UpdateResultlines(resultSemiAuto, FindInterLinePair(
-                (i) => true,
+                interLineGuess,
                 GetInterSelectableLines(quadLinesSemiAuto, resultSemiAuto, resultSemiAutoPedal, avgPoint)));
 
             #endregion
@@ -1103,7 +1105,7 @@ namespace o0.Project
             }
             // 新增功能(解决黑边问题):根据 resultAuto 再找平行线,判断是否替换(1-在 result 内部,且离中点最近,2-接近平行,3-LineGuess判断是直线)
             UpdateResultlines(resultAuto, FindInterLinePair(
-                new LineGuess(screenLocateMatList, gradientLength * 2, minLength).GuessIsLine,
+                interLineGuess,
                 GetInterSelectableLines(quadLinesAuto, resultAuto, resultAutoPedal, avgPoint)));
             #endregion
 
@@ -1145,7 +1147,7 @@ namespace o0.Project
                 result[inter.b.ScreenLineIndex] = inter.b;
         }
 
-        (LineIdentified a, LineIdentified b) FindInterLinePair(Func<LineIdentified, bool> guessIsLine, List<LineIdentified> interSelectable, int maxCountToSelect = 8)
+        (LineIdentified a, LineIdentified b) FindInterLinePair(InterLineGuess lineGuess, List<LineIdentified> interSelectable, int maxCountToSelect = 8)
         {
             Debug.Log("[ScreenIdentification] selectable inter line count: " + interSelectable.Count);
             interSelectable.Sort((a, b) => b.ZIMGradient.CompareTo(a.ZIMGradient));
@@ -1153,7 +1155,7 @@ namespace o0.Project
             LineIdentified[] selected = new LineIdentified[4];
             foreach (var line in interSelectable)
             {
-                if (guessIsLine(line))        // 评价是不是Line, 并且找到离中心点最近的
+                if (line.GuessIsInterLine(lineGuess))        // 评价是不是Line, 并且找到离中心点最近的
                 {
                     if (ScreenLocate.Main.DebugOnZIMDemo)
                         Debug.Log($"[ScreenIdentification] {interSelectable.IndexOf(line)}, guess is line: (index)" + line.ScreenLineIndex);