ZIM пре 1 година
родитељ
комит
3420f2d97d

+ 1 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/DebugOnWin.cs

@@ -17,7 +17,7 @@ public class DebugOnWin : MonoBehaviour
 
     void Update()
     {
-        if (Input.GetButtonDown("FullScreen"))
+        if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && Input.GetKeyDown(KeyCode.Return))
         {
             Screen.fullScreen = !Screen.fullScreen;
         }

+ 1 - 1
Assets/InfraredProject/WebCamera/Script/ZIM/InfraredLocate/InfraredLocate.cs

@@ -294,7 +294,7 @@ namespace ZIM
             }
 
             texture.Apply();
-            ScreenLocate.DebugTexture(5, texture);
+            ScreenLocate.DebugTexture(6, texture);
         }
 
         private List<PixelSpotArea> DbscanToSpotAreas(DbscanResult<Vector2> db, List<Vector2> brightPoint)

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

@@ -131,11 +131,11 @@ namespace o0.Project
         void DebugImage(Texture2D image)
         {
             QuadrilateralFit(out Texture2D LocateLightedRedTex,out Texture2D ChoosableLineTex, out Texture2D ScreenQuadTex, 5, image);
-            ScreenLocate.DebugTexture(1, LocateLightedRedTex);
-            ScreenLocate.DebugTexture(2, ScreenQuadTex);
+            ScreenLocate.DebugTexture(2, LocateLightedRedTex);
+            ScreenLocate.DebugTexture(3, ScreenQuadTex);
             // 融合线段和原图
-            ScreenLocate.DebugTexture(3, image.Merge(ScreenQuadTex));
-            ScreenLocate.DebugTexture(4, ChoosableLineTex);
+            ScreenLocate.DebugTexture(4, image.Merge(ScreenQuadTex));
+            ScreenLocate.DebugTexture(5, ChoosableLineTex);
 
             //var watch = new System.Diagnostics.Stopwatch();
             //watch.Start();
@@ -146,7 +146,7 @@ namespace o0.Project
             if (quadTemp.Count > 0)
             {
                 var quad = quadTemp[0];
-                ScreenLocate.Main.ShowScreen(ScreenLocate.Main.outputRawImages[3].transform.GetChild(0) as RectTransform, 
+                ScreenLocate.Main.ShowScreen(ScreenLocate.Main.outputRawImages[4].transform.GetChild(0) as RectTransform, 
                     new QuadrilateralInCamera(quad, image.Size().o0Vector()));
 
                 // 透视变换
@@ -283,11 +283,11 @@ namespace o0.Project
                 QuadrilateralFit(out Texture2D LocateLightedRedTex,out Texture2D ChoosableLineTex, out Texture2D ScreenQuadTex);
                 if (ScreenLocate.Main.DebugOnEditorWin)
                 {
-                    ScreenLocate.DebugTexture(1, LocateLightedRedTex);
-                    ScreenLocate.DebugTexture(2, ScreenQuadTex);
+                    ScreenLocate.DebugTexture(2, LocateLightedRedTex);
+                    ScreenLocate.DebugTexture(3, ScreenQuadTex);
                     // 融合线段和原图
-                    ScreenLocate.DebugTexture(3, LocateLightedRedTex.Merge(ScreenQuadTex));
-                    ScreenLocate.DebugTexture(4, ChoosableLineTex);
+                    ScreenLocate.DebugTexture(4, LocateLightedRedTex.Merge(ScreenQuadTex));
+                    ScreenLocate.DebugTexture(5, ChoosableLineTex);
                 }
 
                 if (quadTemp.Count != LocateAreaData[0].Length)
@@ -297,7 +297,7 @@ namespace o0.Project
                 else if (quadTemp.Count == 1)
                 {
                     Screen.QuadInCamera = new QuadrilateralInCamera(quadTemp[0], new Vector(Size.x, Size.y));
-                    Debug.Log($"<color=#ADD8E6>[ScreenIdentification] 拟合成功,Quad: {Screen.QuadInCamera.QuadString}</color>");
+                    Debug.Log($"<color=#ADD8E6>[ScreenIdentification] 拟合成功,Quad: {Screen.QuadInCamera.QuadString}____{Screen.QuadInCamera.SizeString}</color>");
                 }
                 else
                 {
@@ -336,7 +336,7 @@ namespace o0.Project
                         }
                     }
                     Screen.QuadInCamera = new QuadrilateralInCamera(predicts, new Vector(Size.x, Size.y));
-                    Debug.Log($"<color=#ADD8E6>[ScreenIdentification] 拟合成功,RSquared: {rs}, Quad: {Screen.QuadInCamera.QuadString}</color>");
+                    Debug.Log($"<color=#ADD8E6>[ScreenIdentification] 拟合成功,RSquared: {rs}, Quad: {Screen.QuadInCamera.QuadString}____{Screen.QuadInCamera.SizeString}</color>");
                     //if (rs < 0.8) Screen.Quad = null;
                 }
 

+ 19 - 8
Assets/InfraredProject/WebCamera/Script/ZIM/ScreenLocate.cs

@@ -8,6 +8,7 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
+using UnityEngine.Experimental.AI;
 using UnityEngine.UI;
 using ZIM;
 using ZIM.Unity;
@@ -93,10 +94,15 @@ public partial class ScreenLocate : MonoBehaviour
     public List<RectTransform> CrosshairInScreen;
     public RectTransform ScreenQuad;
     public Toggle SaveToggle;
+    public Toggle FullScreenToggle;
+    public LineGenerator UILineGenerator;
 
     public bool ShowScreenQuad = false;
 
+    // output的图像
+    // 图0是摄像机原图,图1是屏幕识别的全部可选线段,图2是识别出的屏幕画面,图3是识别出的屏幕四条边,图4是图2和图3的叠加,图5显示3种不同颜色的算法识别线段
     public List<RawImage> outputRawImages;
+    [NonSerialized] public Texture[] outputTexture2D;
     public RawImage FullScreenImage;
 
     public PixelCheaker ScreenPixelCheaker;
@@ -112,11 +118,9 @@ public partial class ScreenLocate : MonoBehaviour
     //是否单点显示
     public bool bSinglePoint = true;//默认单点识别
 
-    [NonSerialized]
-    public float ReDoLocateCalibrationRatio = 0.04f;  // 重复定位时校准的距离比例,例如先手动定位,再自动定位,会以手动的结果来校准
+    [NonSerialized] public float ReDoLocateCalibrationRatio = 0.04f;  // 重复定位时校准的距离比例,例如先手动定位,再自动定位,会以手动的结果来校准
 
-    [NonSerialized]
-    public InfraredCount infraredCount = InfraredCount.Single;
+    [NonSerialized] public InfraredCount infraredCount = InfraredCount.Single;
 
     bool bIdentifyRed = true;//默认设备红色
 
@@ -164,22 +168,23 @@ public partial class ScreenLocate : MonoBehaviour
     bool bAutomaticRecognitionStart { get; set; } = false;//是否进行捕获
     bool bAutomaticRecognitionEnd { get; set; } = false;//是否结束捕获
 
-    public RectTransform BackQuad = null;
+    [NonSerialized] public RectTransform BackQuad = null;
 
     static public ScreenLocate Main;
 
     static public void AutoLightPixels(Color[] pixels, int width, int height)
     {
         var newTex = pixels.zimAutoLightSimple(width, height);
-        DebugTexture(6, newTex);
+        DebugTexture(7, newTex);
         Main.FullScreenImage.texture = newTex;
     }
 
     static public void DebugTexture(int index, Texture texture)
     {
-        //Application.
         LateDestory(Main.outputRawImages[index].texture);
         Main.outputRawImages[index].texture = texture;
+        if (Main.outputTexture2D != null) 
+            Main.outputTexture2D[index] = texture;
     }
     static void LateDestory(UnityEngine.Object o) => Main.StartCoroutine(Main.LateDestoryIEnum(o));
 
@@ -265,6 +270,7 @@ public partial class ScreenLocate : MonoBehaviour
     {
         //mainContext = SynchronizationContext.Current;
 
+        outputTexture2D = new Texture[8];
         canvas = transform.GetComponent<RectTransform>();
 
         mode = Mode.InfraredLocate;
@@ -275,6 +281,11 @@ public partial class ScreenLocate : MonoBehaviour
             screenIdentification.LocateScreen();
         }
 
+        FullScreenToggle.onValueChanged.AddListener((i) =>
+        {
+            Screen.fullScreen = i;
+        });
+
         infraredCount = InfraredCount.Single;
 
         #region 性能检测相关
@@ -1023,7 +1034,7 @@ public partial class ScreenLocate : MonoBehaviour
             //DebugTexture(1, TextureToTexture2D(rawImage.texture));
 
             CreateUVCTexture2DIfNeeded();
-            DebugTexture(6, mUVCTexture2D.zimAutoLight(brightness));
+            DebugTexture(7, mUVCTexture2D.zimAutoLight(brightness));
             //mUVCTexture2DTemp = TextureToTexture2D(mUVCCameraInfo.previewTexture);
             //DebugTexture(6, mUVCTexture2DTemp.zimAutoLight(brightness));
             this.mode = Mode.ScreenLocateManual;

+ 405 - 17
Assets/InfraredProject/WebCamera/zimWebCamera.unity

@@ -147,7 +147,7 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 2705055563425357307, guid: ab30c51d9dbef7d4db660e2ae2075902, type: 3}
       propertyPath: m_RootOrder
-      value: 19
+      value: 20
       objectReference: {fileID: 0}
     - target: {fileID: 2705055563425357307, guid: ab30c51d9dbef7d4db660e2ae2075902, type: 3}
       propertyPath: m_AnchorMax.x
@@ -247,6 +247,82 @@ RectTransform:
   m_CorrespondingSourceObject: {fileID: 2705055563425357307, guid: ab30c51d9dbef7d4db660e2ae2075902, type: 3}
   m_PrefabInstance: {fileID: 36100229}
   m_PrefabAsset: {fileID: 0}
+--- !u!1 &54605587
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 54605588}
+  - component: {fileID: 54605590}
+  - component: {fileID: 54605589}
+  m_Layer: 5
+  m_Name: Checkmark
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &54605588
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 1731784227}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &54605589
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 0
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &54605590
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 54605587}
+  m_CullTransparentMesh: 1
 --- !u!1 &102676394
 GameObject:
   m_ObjectHideFlags: 0
@@ -941,7 +1017,7 @@ GameObject:
   - component: {fileID: 476763551}
   - component: {fileID: 476763550}
   m_Layer: 5
-  m_Name: CameraImage4
+  m_Name: CameraImage5
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -1075,13 +1151,100 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 16
+  m_RootOrder: 17
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
   m_AnchoredPosition: {x: 781.9999, y: 441.49}
   m_SizeDelta: {x: 720, y: 62.985}
   m_Pivot: {x: 0.5, y: 0.5}
+--- !u!1 &517576267
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 517576268}
+  - component: {fileID: 517576269}
+  m_Layer: 5
+  m_Name: ToggleFullScreen
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &517576268
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 517576267}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 1731784227}
+  - {fileID: 619252550}
+  m_Father: {fileID: 1867793102}
+  m_RootOrder: 13
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: -90, y: 516}
+  m_SizeDelta: {x: 160, y: 20}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &517576269
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 517576267}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Navigation:
+    m_Mode: 3
+    m_WrapAround: 0
+    m_SelectOnUp: {fileID: 0}
+    m_SelectOnDown: {fileID: 0}
+    m_SelectOnLeft: {fileID: 0}
+    m_SelectOnRight: {fileID: 0}
+  m_Transition: 1
+  m_Colors:
+    m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
+    m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1}
+    m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
+    m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
+    m_ColorMultiplier: 1
+    m_FadeDuration: 0.1
+  m_SpriteState:
+    m_HighlightedSprite: {fileID: 0}
+    m_PressedSprite: {fileID: 0}
+    m_SelectedSprite: {fileID: 0}
+    m_DisabledSprite: {fileID: 0}
+  m_AnimationTriggers:
+    m_NormalTrigger: Normal
+    m_HighlightedTrigger: Highlighted
+    m_PressedTrigger: Pressed
+    m_SelectedTrigger: Selected
+    m_DisabledTrigger: Disabled
+  m_Interactable: 1
+  m_TargetGraphic: {fileID: 1731784228}
+  toggleTransition: 1
+  graphic: {fileID: 54605589}
+  m_Group: {fileID: 0}
+  onValueChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_IsOn: 0
 --- !u!1 &557727040
 GameObject:
   m_ObjectHideFlags: 0
@@ -1463,6 +1626,86 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 614532336}
   m_CullTransparentMesh: 1
+--- !u!1 &619252549
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 619252550}
+  - component: {fileID: 619252552}
+  - component: {fileID: 619252551}
+  m_Layer: 5
+  m_Name: Label
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &619252550
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 517576268}
+  m_RootOrder: 1
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 28.445, y: -11.119999}
+  m_SizeDelta: {x: -13.989996, y: 37.959995}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &619252551
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0}
+    m_FontSize: 32
+    m_FontStyle: 0
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 0
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: "\u5168\u5C4F"
+--- !u!222 &619252552
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 619252549}
+  m_CullTransparentMesh: 1
 --- !u!1 &641569779
 GameObject:
   m_ObjectHideFlags: 0
@@ -1494,7 +1737,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 18
+  m_RootOrder: 19
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
@@ -1642,7 +1885,7 @@ GameObject:
   - component: {fileID: 682249276}
   - component: {fileID: 682249275}
   m_Layer: 5
-  m_Name: CameraImage2
+  m_Name: CameraImage3
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -1856,7 +2099,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 17
+  m_RootOrder: 18
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 1}
   m_AnchorMax: {x: 0, y: 1}
@@ -2064,7 +2307,7 @@ RectTransform:
   - {fileID: 1092870242}
   - {fileID: 1728164016}
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 14
+  m_RootOrder: 15
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -2513,7 +2756,7 @@ RectTransform:
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
-  m_AnchoredPosition: {x: 28.445, y: -11.119998}
+  m_AnchoredPosition: {x: 28.445, y: -11.119999}
   m_SizeDelta: {x: -13.989996, y: 37.959995}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1120077962
@@ -2854,7 +3097,7 @@ GameObject:
   - component: {fileID: 1261583879}
   - component: {fileID: 1261583878}
   m_Layer: 5
-  m_Name: CameraImage3
+  m_Name: CameraImage4
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -3062,7 +3305,7 @@ GameObject:
   - component: {fileID: 1309947140}
   - component: {fileID: 1309947139}
   m_Layer: 5
-  m_Name: CameraImage5
+  m_Name: CameraImage6
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -3364,7 +3607,7 @@ GameObject:
   - component: {fileID: 1426786009}
   - component: {fileID: 1426786008}
   m_Layer: 5
-  m_Name: CameraImage1
+  m_Name: CameraImage2
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -3454,7 +3697,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 13
+  m_RootOrder: 14
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0.5, y: 0.5}
   m_AnchorMax: {x: 0.5, y: 0.5}
@@ -3721,7 +3964,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 1867793102}
-  m_RootOrder: 15
+  m_RootOrder: 16
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -3912,6 +4155,83 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1728164015}
   m_CullTransparentMesh: 1
+--- !u!1 &1731784226
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1731784227}
+  - component: {fileID: 1731784229}
+  - component: {fileID: 1731784228}
+  m_Layer: 5
+  m_Name: Background
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1731784227
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children:
+  - {fileID: 54605588}
+  m_Father: {fileID: 517576268}
+  m_RootOrder: 0
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 1}
+  m_AnchorMax: {x: 0, y: 1}
+  m_AnchoredPosition: {x: 10, y: -10}
+  m_SizeDelta: {x: 40, y: 40}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1731784228
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0}
+  m_Type: 1
+  m_PreserveAspect: 0
+  m_FillCenter: 1
+  m_FillMethod: 4
+  m_FillAmount: 1
+  m_FillClockwise: 1
+  m_FillOrigin: 0
+  m_UseSpriteMesh: 0
+  m_PixelsPerUnitMultiplier: 1
+--- !u!222 &1731784229
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1731784226}
+  m_CullTransparentMesh: 1
 --- !u!1 &1732438111
 GameObject:
   m_ObjectHideFlags: 0
@@ -4506,6 +4826,7 @@ RectTransform:
   - {fileID: 3098480069149916812}
   - {fileID: 557727041}
   - {fileID: 601288812}
+  - {fileID: 517576268}
   - {fileID: 1438266374}
   - {fileID: 922494663}
   - {fileID: 1697954114}
@@ -4563,16 +4884,18 @@ MonoBehaviour:
   - {fileID: 1092870242}
   ScreenQuad: {fileID: 1759782642}
   SaveToggle: {fileID: 601288813}
+  FullScreenToggle: {fileID: 517576269}
+  UILineGenerator: {fileID: 1922585535}
   ShowScreenQuad: 1
   outputRawImages:
   - {fileID: 2101632897}
+  - {fileID: 2004094257}
   - {fileID: 1426786008}
   - {fileID: 682249275}
   - {fileID: 1261583878}
   - {fileID: 476763550}
   - {fileID: 1309947139}
   - {fileID: 2452220216917731427}
-  - {fileID: 2004094257}
   FullScreenImage: {fileID: 1697954115}
   ScreenPixelCheaker: {fileID: 36100230}
   InfraredSpotSettings: {fileID: 11400000, guid: ca2f3b215f8d9d64caed905436a89b86, type: 2}
@@ -4582,8 +4905,72 @@ MonoBehaviour:
   m_UITime: {fileID: 849339071}
   updateInterval: 0.5
   m_FPS: {fileID: 641569781}
-  BackQuad: {fileID: 0}
   filterDis: 3
+--- !u!1 &1922585531
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1922585532}
+  - component: {fileID: 1922585534}
+  - component: {fileID: 1922585535}
+  m_Layer: 0
+  m_Name: LineGenerator
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1922585532
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 1
+  m_Children: []
+  m_Father: {fileID: 2101632896}
+  m_RootOrder: 4
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0, y: 0}
+  m_AnchorMax: {x: 1, y: 1}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!222 &1922585534
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  m_CullTransparentMesh: 1
+--- !u!114 &1922585535
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1922585531}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 3bd83e7684ce1a542bbd5e6d3120fe62, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0}
+  m_Color: {r: 0, g: 1, b: 0, a: 1}
+  m_RaycastTarget: 0
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  LineThickness: 4
+  Loop: 1
+  _points: []
 --- !u!1 &1946863618
 GameObject:
   m_ObjectHideFlags: 0
@@ -4747,7 +5134,7 @@ GameObject:
   - component: {fileID: 2004094258}
   - component: {fileID: 2004094257}
   m_Layer: 5
-  m_Name: CameraImage7
+  m_Name: CameraImage1
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
@@ -4842,6 +5229,7 @@ RectTransform:
   - {fileID: 1361341703}
   - {fileID: 1793996698}
   - {fileID: 681002957}
+  - {fileID: 1922585532}
   m_Father: {fileID: 1867793102}
   m_RootOrder: 3
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -4944,7 +5332,7 @@ GameObject:
   - component: {fileID: 8554853341612612686}
   - component: {fileID: 2452220216917731427}
   m_Layer: 5
-  m_Name: CameraImage6
+  m_Name: CameraImage7
   m_TagString: Untagged
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0

+ 2 - 2
Assets/InfraredProject/o0/zimIdentifyLineLSD.cs

@@ -132,7 +132,7 @@ namespace o0.Project
                     if (l.Item1 != null)
                         LSDLineMap.DrawLine(l.Item1, (x, y) => 3, new Geometry2D.Float.Vector(0, 2), true); // 其他的备选线段
                 }
-                ScreenLocate.DebugTexture(7, LSDLineMap.ToTexRGBA(ScreenIdentification.FloatValueToColor));
+                ScreenLocate.DebugTexture(1, LSDLineMap.ToTexRGBA(ScreenIdentification.FloatValueToColor));
             }
 
             //Debug.Log("[IdentifyLineLSD] lines.Count: " + lines.Count);
@@ -188,7 +188,7 @@ namespace o0.Project
                             index = j;
                         }
                     }
-                    Debug.Log(minDistance +", -----------"+ calibration);
+                    //Debug.Log(minDistance +", -----------"+ calibration);
                     if (minDistance < calibration)      // 垂足的距离足够近
                     {
                         quadLines[index].Add((averageGradient(i.Item1), i.Item1));

+ 81 - 0
Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/LineGenerator.cs

@@ -0,0 +1,81 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEditor;
+using UnityEngine;
+using UnityEngine.UI;
+
+namespace ZIM
+{
+    [RequireComponent(typeof(CanvasRenderer))]
+    public class LineGenerator : Graphic
+    {
+        [Tooltip("线段的粗细")]
+        public float LineThickness = 2f;
+        public bool Loop;
+
+        [SerializeField]
+        private Vector2[] _points;
+        /// <summary>
+        /// 设置线条的顶点,范围在 -1到1
+        /// </summary>
+        public Vector2[] Points
+        {
+            get => _points;
+            set
+            {
+                _points = value;
+                SetVerticesDirty();
+            }
+        }
+
+        protected override void OnPopulateMesh(VertexHelper vh)
+        {
+            vh.Clear();
+
+            if (Points == null || Points.Length < 2)
+                return;
+
+            // Adjust width and height to account for the [-1, 1] range
+            float width = rectTransform.rect.width / 2;
+            float height = rectTransform.rect.height / 2;
+            float pivotX = rectTransform.pivot.x * rectTransform.rect.width - width;
+            float pivotY = rectTransform.pivot.y * rectTransform.rect.height - height;
+
+            for (int i = Loop ? -1 : 0; i < Points.Length - 1; i++)
+            {
+                Vector2 start = Points[i < 0 ? i + Points.Length : i];
+                Vector2 end = Points[i + 1];
+
+                start = new Vector2(start.x * width - pivotX, start.y * height - pivotY);
+                end = new Vector2(end.x * width - pivotX, end.y * height - pivotY);
+
+                DrawLine(vh, start, end, LineThickness);
+            }
+        }
+
+        private void DrawLine(VertexHelper vh, Vector2 start, Vector2 end, float thickness)
+        {
+            Vector2 direction = (end - start).normalized;
+            Vector2 normal = new Vector2(-direction.y, direction.x) * thickness / 2;
+
+            UIVertex[] verts = new UIVertex[4];
+            verts[0].position = start + normal;
+            verts[1].position = start - normal;
+            verts[2].position = end - normal;
+            verts[3].position = end + normal;
+
+            for (int i = 0; i < 4; i++)
+                verts[i].color = color;
+
+            vh.AddUIVertexQuad(verts);
+        }
+
+        void Update()
+        {
+            //SetVerticesDirty();
+        }
+
+    }
+}
+
+

+ 11 - 0
Assets/SmartBow/Resources/SmartBow/Prefabs/ZIM/LineGenerator.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 3bd83e7684ce1a542bbd5e6d3120fe62
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 7 - 1
Assets/SmartBow/Scripts/Views/InfraredViewParts/InfraredScreenPositioningView.cs

@@ -187,7 +187,7 @@ public class InfraredScreenPositioningView : JCUnityLib.ViewBase
     {
         if (enterFromZimWebCamera && ScreenLocate.Main.DebugOnEditorWin) {
             // ZimWebCamera场景测试
-            rawImage.texture = ScreenLocate.Main.outputRawImages[6].texture;
+            rawImage.texture = ScreenLocate.Main.outputRawImages[7].texture;
             if (ScreenLocate.Main.infraredSpotBuffer[0].CameraLocation.HasValue)
             {
                 // 检测到光点
@@ -580,6 +580,12 @@ public class InfraredScreenPositioningView : JCUnityLib.ViewBase
         ScreenLocate.quadUnityVectorList.Add(new Vector2(_locatePointList[2].x, _locatePointList[2].y));
         ScreenLocate.SaveScreenLocateVectorList();
 
+        var lo = new Vector2(-0.5f, -0.5f);
+        ScreenLocate.Main.UILineGenerator.Points = new Vector2[4] {
+            2 * (_locatePointList[0] + lo),
+            2 * (_locatePointList[1] + lo),
+            2 * (_locatePointList[2] + lo),
+            2 * (_locatePointList[3] + lo) };
     }
 
     void setPointsLocation(List<Vector2> targetList ,GameObject pointsTF2,bool active = true) {

+ 0 - 16
ProjectSettings/InputManager.asset

@@ -293,20 +293,4 @@ InputManager:
     type: 0
     axis: 0
     joyNum: 0
-  - serializedVersion: 3
-    m_Name: FullScreen
-    descriptiveName: 
-    descriptiveNegativeName: 
-    negativeButton: 
-    positiveButton: return
-    altNegativeButton: left ctrl
-    altPositiveButton: 
-    gravity: 1000
-    dead: 0.001
-    sensitivity: 1000
-    snap: 0
-    invert: 0
-    type: 0
-    axis: 0
-    joyNum: 0
   m_UsePhysicalKeys: 0

+ 3 - 0
ProjectSettings/TagManager.asset

@@ -45,3 +45,6 @@ TagManager:
   - name: Default
     uniqueID: 0
     locked: 0
+  - name: Popup
+    uniqueID: 1198953963
+    locked: 0