Ver Fonte

自动识别算法细节更新

snowaterr há 1 ano atrás
pai
commit
b9b97f9909

+ 8 - 0
Assets/InfraredProject/TestImage.meta

@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 078e827f48c0363458d080470b1beace
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 0 - 0
Assets/InfraredProject/屏幕定位数据20230505_151919.png → Assets/InfraredProject/TestImage/屏幕定位数据20230505_151919.png


+ 0 - 0
Assets/InfraredProject/屏幕定位数据20230505_151919.png.meta → Assets/InfraredProject/TestImage/屏幕定位数据20230505_151919.png.meta


+ 0 - 0
Assets/InfraredProject/微信截图_20240606133301.png → Assets/InfraredProject/TestImage/微信截图_20240606133301.png


+ 0 - 0
Assets/InfraredProject/微信截图_20240606133301.png.meta → Assets/InfraredProject/TestImage/微信截图_20240606133301.png.meta


BIN
Assets/InfraredProject/TestImage/测试图片.png


+ 135 - 0
Assets/InfraredProject/TestImage/测试图片.png.meta

@@ -0,0 +1,135 @@
+fileFormatVersion: 2
+guid: f894060e71995eb41a8fd983d40deeb3
+TextureImporter:
+  internalIDToNameTable: []
+  externalObjects: {}
+  serializedVersion: 12
+  mipmaps:
+    mipMapMode: 0
+    enableMipMap: 1
+    sRGBTexture: 1
+    linearTexture: 0
+    fadeOut: 0
+    borderMipMap: 0
+    mipMapsPreserveCoverage: 0
+    alphaTestReferenceValue: 0.5
+    mipMapFadeDistanceStart: 1
+    mipMapFadeDistanceEnd: 3
+  bumpmap:
+    convertToNormalMap: 0
+    externalNormalMap: 0
+    heightScale: 0.25
+    normalMapFilter: 0
+  isReadable: 1
+  streamingMipmaps: 0
+  streamingMipmapsPriority: 0
+  vTOnly: 0
+  ignoreMasterTextureLimit: 0
+  grayScaleToAlpha: 0
+  generateCubemap: 6
+  cubemapConvolution: 0
+  seamlessCubemap: 0
+  textureFormat: 1
+  maxTextureSize: 2048
+  textureSettings:
+    serializedVersion: 2
+    filterMode: 1
+    aniso: 1
+    mipBias: 0
+    wrapU: 0
+    wrapV: 0
+    wrapW: 0
+  nPOTScale: 1
+  lightmap: 0
+  compressionQuality: 50
+  spriteMode: 0
+  spriteExtrude: 1
+  spriteMeshType: 1
+  alignment: 0
+  spritePivot: {x: 0.5, y: 0.5}
+  spritePixelsToUnits: 100
+  spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+  spriteGenerateFallbackPhysicsShape: 1
+  alphaUsage: 1
+  alphaIsTransparency: 0
+  spriteTessellationDetail: -1
+  textureType: 0
+  textureShape: 1
+  singleChannelComponent: 0
+  flipbookRows: 1
+  flipbookColumns: 1
+  maxTextureSizeSet: 0
+  compressionQualitySet: 0
+  textureFormatSet: 0
+  ignorePngGamma: 0
+  applyGammaDecoding: 0
+  cookieLightType: 0
+  platformSettings:
+  - serializedVersion: 3
+    buildTarget: DefaultTexturePlatform
+    maxTextureSize: 512
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Standalone
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Server
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  - serializedVersion: 3
+    buildTarget: Android
+    maxTextureSize: 2048
+    resizeAlgorithm: 0
+    textureFormat: -1
+    textureCompression: 1
+    compressionQuality: 50
+    crunchedCompression: 0
+    allowsAlphaSplitting: 0
+    overridden: 0
+    androidETC2FallbackOverride: 0
+    forceMaximumCompressionQuality_BC6H_BC7: 0
+  spriteSheet:
+    serializedVersion: 2
+    sprites: []
+    outline: []
+    physicsShape: []
+    bones: []
+    spriteID: 
+    internalID: 0
+    vertices: []
+    indices: 
+    edges: []
+    weights: []
+    secondaryTextures: []
+    nameFileIdTable: {}
+  spritePackingTag: 
+  pSDRemoveMatte: 0
+  pSDShowRemoveMatteOption: 0
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

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

@@ -56,7 +56,7 @@ namespace ZIM
         public InfraredSpot(ScreenMap screenMap, InfraredMatch match)
         {
             this.screenMap = screenMap;
-            MinVerifyLength = screenMap.UVSize.y / 5;
+            MinVerifyLength = screenMap.UVSize.y / 6;
             Match = match;
             spots = new List<PixelSpotArea>();
             Reset();

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

@@ -8,7 +8,6 @@ using System.Threading.Tasks;
 using UnityEngine;
 using ZIM;
 using ZIM.Unity;
-using static Serenegiant.UVC.UVCManager;
 
 namespace o0.Project
 {
@@ -71,12 +70,13 @@ namespace o0.Project
         // 自动识别开始的入口
         public void LocateScreen(int Capture = 30, int Delay = 30)  //数值单位是frame
         {
-            if (ScreenLocate.Main.DebugScreenImage != null)     // 这段仅用于测试图片
+            if (ScreenLocate.Main.DebugScreenImage != null && ScreenLocate.Main.DebugOnEditorWin)     // 这段仅用于测试图片
             {
+                Size = new Geometry2D.Vector<int>(ScreenLocate.Main.DebugScreenImage.width, ScreenLocate.Main.DebugScreenImage.height);
                 DebugImage(ScreenLocate.Main.DebugScreenImage);
                 Screen.QuadInCamera = new QuadrilateralInCamera(quadTemp[0], new Vector(ScreenLocate.Main.DebugScreenImage.width, ScreenLocate.Main.DebugScreenImage.height));
                 ScreenLocate.SetScreen(null);
-                ScreenLocate.Main.ShowScreen(Screen.QuadInCamera);
+                ScreenLocate.Main.ShowScreen(ScreenLocate.Main.ScreenQuad, Screen.QuadInCamera);
                 delay = 0;
                 capture = 0;
                 ScreenWhiteTexture = null;
@@ -101,10 +101,20 @@ namespace o0.Project
 
         void DebugImage(Texture2D image)
         {
-            QuadrilateralFit(out Texture2D LocateTex, out Texture2D DrawLineTex, image);
+            QuadrilateralFit(out Texture2D LocateTex, out Texture2D DrawLineTex, 5, image);
             ScreenLocate.DebugTexture(2, LocateTex);
             ScreenLocate.DebugTexture(3, DrawLineTex);
-            //Debug.Log(quadTemp[0]);
+
+            // 融合线段和原图
+            var pixel0 = image.GetPixels();
+            var pixel1 = DrawLineTex.GetPixels();
+            for (int i = 0; i < pixel0.Length; i++)
+                pixel0[i] += pixel1[i];
+            var texAdd = new Texture2D(image.width, image.height);
+            texAdd.SetPixels(pixel0);
+            texAdd.Apply();
+            ScreenLocate.DebugTexture(4, texAdd);
+
             //var watch = new System.Diagnostics.Stopwatch();
             //watch.Start();
             //var times = new List<double>() { 0.0 };
@@ -113,8 +123,10 @@ namespace o0.Project
 #endif
             if (quadTemp.Count > 0)
             {
-                // 透视变换
                 var quad = quadTemp[0];
+                ScreenLocate.Main.ShowScreen(ScreenLocate.Main.rawImage4.transform.GetChild(0) as RectTransform, new QuadrilateralInCamera(quad, image.Size().o0Vector()));
+
+                // 透视变换
                 var srcWidth = LocateTex.width;
                 var transformWidth = (int)((quad.B.x - quad.A.x + quad.D.x - quad.C.x) / 2);
                 var transformHeight = (int)((quad.C.y - quad.A.y + quad.D.y - quad.B.y) / 2);
@@ -133,7 +145,7 @@ namespace o0.Project
                 });
                 transformTex.SetPixels(dstPixel);
                 transformTex.Apply();
-                ScreenLocate.DebugTexture(1, transformTex);
+                //ScreenLocate.DebugTexture(1, transformTex);
 #if (!NDEBUG && DEBUG && ENABLE_LOG)
                 Console.WriteLine($"{TAG} ScreenLocate.DebugTexture 1:{transformTex.GetNativeTexturePtr()}");
 #endif
@@ -165,7 +177,7 @@ namespace o0.Project
             else                // 退出屏幕黑白控制
             {
                 ScreenLocate.SetScreen(null);
-                ScreenLocate.Main.ShowScreen(Screen.QuadInCamera);
+                ScreenLocate.Main.ShowScreen(ScreenLocate.Main.ScreenQuad, Screen.QuadInCamera);
                 Reset();
             }
         }
@@ -573,7 +585,7 @@ namespace o0.Project
             return sum;
         }
 
-        void QuadrilateralFit(out Texture2D LocateTex, out Texture2D DrawLineTex, Texture2D debugImage = null)
+        void QuadrilateralFit(out Texture2D LocateTex, out Texture2D DrawLineTex, float lineWidth = 10, Texture2D debugImage = null)
         {
             QuadrilateralInCamera screen = null;
             UnityEngine.Color[] differPixel = new UnityEngine.Color[Size.x * Size.y];
@@ -626,15 +638,19 @@ namespace o0.Project
             //ScreenLocate.DebugTexture(4, ScreenLocateTexLighted.Too0Mat().IdentifyEdgeGradient().ToTex());
             //ScreenLocate.DebugTexture(4, edge.ToTex());
 
+            var drawLineMap = new Matrix(ScreenLocateTexLightedMat.Size, Tiling: true);
             var minLength = locateIndex == -1 ? 50 : 50 * areaPercent;
             var quadLines = ScreenLocateTexLightedMat.ZIMIdentifyQuadLSD(edge, edgeDir, out List<Line> lightLines, conSize, minLength);
-            var drawLineMap = new Matrix(edge.Size, Tiling: true);
+
             int lineCount = 0;
-            foreach (var l in quadLines)
+            // LSD计算得到的矩阵尺寸较小(因为卷积),这里必须进行位移
+            var offset = new Vector((conSize - 1) / 2, (conSize - 1) / 2);
+            for (int i = 0; i < quadLines.Count; i++)
             {
-                if (l != null)
+                if (quadLines[i] != null)
                 {
-                    drawLineMap.DrawLine(l, (x, y) => 1, new Geometry2D.Float.Vector(0, 10));
+                    quadLines[i] += offset;
+                    drawLineMap.DrawLine(quadLines[i], (x, y) => 1, new Geometry2D.Float.Vector(0, lineWidth));
                     lineCount++;
                 }
             }
@@ -663,7 +679,6 @@ namespace o0.Project
                 if (!screen.IsQuadComplete())
                     screen = null;
             }
-            //if (quad != null && debugImage == null)
             if (screen != null)
                 quadTemp.Add(screen.Quad);
 

+ 29 - 25
Assets/InfraredProject/WebCamera/Script/ZIM/ScreenLocate.cs

@@ -193,7 +193,7 @@ public partial class ScreenLocate : MonoBehaviour
 
     public void ReSizeTexture(int width, int height)
     {
-        Debug.Log("Cur mUVCTexture Size: [" + mUVCTexture.width + ","+ mUVCTexture.height + "]");
+        Debug.Log("Cur mUVCTexture Size: [" + mUVCTexture.width + "," + mUVCTexture.height + "]");
         return;
         if (mUVCTexture.width < width || mUVCTexture.height < height)       // 如果当前分辨率太小,则重新new一个texture
         {
@@ -244,13 +244,11 @@ public partial class ScreenLocate : MonoBehaviour
 
         mode = Mode.InfraredLocate;
 
-        //if (DebugScreenImage)
-        //{
-        //    screenIdentification = new o0.Project.ScreenIdentification(new o0.Geometry2D.Vector<int>(DebugScreenImage.width, DebugScreenImage.height));
-
-        //    WebCamIsReady(DebugScreenImage);
-        //    screenIdentification.LocateScreen();
-        //}
+        if (DebugScreenImage && DebugOnEditorWin)
+        {
+            screenIdentification = new o0.Project.ScreenIdentification();
+            screenIdentification.LocateScreen();
+        }
 
         infraredCount = InfraredCount.Single;
 
@@ -362,6 +360,9 @@ public partial class ScreenLocate : MonoBehaviour
             SyncInfraredScreenPositioningView();
             Debug.Log("[ScreenLocate] RefreshCameraSize 屏幕size改变:[" + (int)getUVCCameraInfoSize.x + "," + (int)getUVCCameraInfoSize.y + "]");
             Debug.Log("[ScreenLocate] RefreshCameraSize 屏幕size改变,刷新quadUnityVectorList:" + PrintVector2List(quadUnityVectorList));
+
+            if (DebugOnEditorWin)
+                Main.ShowScreen(Main.ScreenQuad, screenIdentification.Screen.QuadInCamera);
         }
 
         if (mode == Mode.ScreenLocateManual)
@@ -424,7 +425,7 @@ public partial class ScreenLocate : MonoBehaviour
                 }
             }
             //如果是连接了蓝牙设备,并且不是9轴设备。不进行识别算法处理
-            if (BluetoothAim.ins.status == BluetoothStatusEnum.ConnectSuccess && AimHandler.ins && AimHandler.ins.bRuning9Axis()) return;
+            if (BluetoothAim.ins?.status == BluetoothStatusEnum.ConnectSuccess && AimHandler.ins && AimHandler.ins.bRuning9Axis()) return;
 
             //根据getUVCCameraInfoSize 分辨率渲染
             CreateUVCTexture2DIfNeeded((int)getUVCCameraInfoSize.x, (int)getUVCCameraInfoSize.y);
@@ -687,7 +688,7 @@ public partial class ScreenLocate : MonoBehaviour
         screenIdentification.Screen.QuadInCamera = null;
         DefaultResolutionIndex = InfraredDemoMain?.ResolutionIndex ?? 0;        // 记录一下进入前的分辨率(游戏场景的分辨率,比识别时更低)
         //HighScreenLocateResolutionIndex = InfraredDemoMain.getTextureToResolutionNewIndex(); //  index = 0
-        Debug.Log("[ScreenLocate] 开始捕获 DefaultResolutionIndex:" + DefaultResolutionIndex + " ,HighScreenLocateResolutionIndex:"+ HighScreenLocateResolutionIndex);
+        Debug.Log("[ScreenLocate] 开始捕获 DefaultResolutionIndex:" + DefaultResolutionIndex + " ,HighScreenLocateResolutionIndex:" + HighScreenLocateResolutionIndex);
         InfraredDemoMain?.SetResolutionNew(HighScreenLocateResolutionIndex);
         //CreateUVCTexture2DIfNeeded();
         log1 = true;
@@ -724,18 +725,18 @@ public partial class ScreenLocate : MonoBehaviour
                 };
         foreach (var frameType in frameTypes)
         {
-           // Debug.Log("Resize frameType:" + frameType + " = " + width + " : " + height);
+            // Debug.Log("Resize frameType:" + frameType + " = " + width + " : " + height);
             if (UVCManager.onResize(mUVCCameraInfo.device.id, frameType, width, height) == 0)
             {
-           //     Debug.Log("frameType:" + frameType);
+                //     Debug.Log("frameType:" + frameType);
                 break;
             }
         }
 
         //ReSizeTexture(width, height);
         mUVCCameraInfo.SetSize(width, height);      // 手动记录分辨率,这里可能会有问题 width和height是期望的分辨率而不是当前摄像机实际分辨率
-        
-        Debug.Log("[ScreenLocate] Resize mUVCCameraInfo.SetSize: [" + mUVCCameraInfo.CurrentWidth +","+ mUVCCameraInfo .CurrentHeight+ "]");
+
+        Debug.Log("[ScreenLocate] Resize mUVCCameraInfo.SetSize: [" + mUVCCameraInfo.CurrentWidth + "," + mUVCCameraInfo.CurrentHeight + "]");
     }
     #endregion
     public void BtnScreenMap()
@@ -761,9 +762,12 @@ public partial class ScreenLocate : MonoBehaviour
     {
         if (screenIdentification == null || !screenIdentification.Screen.Active) return "[]";
         string result = "";
-        if (list.Count == 4) {
+        if (list.Count == 4)
+        {
             result = "左下" + list[0].ToString() + ",右下" + list[1].ToString() + ",左上" + list[2].ToString() + ",右上" + list[3].ToString();
-        } else {
+        }
+        else
+        {
             result = "count != 4 error";
         }
         //foreach (Vector2 vector in list)
@@ -773,8 +777,9 @@ public partial class ScreenLocate : MonoBehaviour
         //Debug.Log(result);
         return result;
     }
-    // 标记屏幕的四个角
-    public void ShowScreen(QuadrilateralInCamera screen)
+
+    // 标记屏幕的四个角, ScreenQuadObject 下挂了4个子节点用于标记
+    public void ShowScreen(RectTransform ScreenQuadObject, QuadrilateralInCamera screen)
     {
         if (screen == null)
         {
@@ -783,17 +788,17 @@ public partial class ScreenLocate : MonoBehaviour
         }
         Info.text = "已识别到屏幕";
 
-        if (ShowScreenQuad)
+        if (ScreenQuadObject && ScreenQuadObject.childCount >= 4)
         {
-            ScreenQuad.gameObject.SetActive(true);
+            ScreenQuadObject.gameObject.SetActive(true);
             //quadUnityVectorList.Clear();
 
             for (int i = 0; i < 4; i++)
             {
                 if (DebugOnEditorWin)
                 {
-                    RectTransform t = ScreenQuad.GetChild(i) as RectTransform;
-                    t.anchoredPosition = screen.Quad[i].pixelToLocalPosition_AnchorCenter(screen.CameraSize, ScreenQuad.rect);
+                    RectTransform t = ScreenQuadObject.GetChild(i) as RectTransform;
+                    t.anchoredPosition = screen.Quad[i].pixelToLocalPosition_AnchorCenter(screen.CameraSize, ScreenQuadObject.rect);
                 }
                 //mUVCCameraInfo.Size
                 //自动识别时候,记录四个点
@@ -806,10 +811,9 @@ public partial class ScreenLocate : MonoBehaviour
             SyncInfraredDemo();
             SyncInfraredScreenPositioningView();
             Debug.Log("[ScreenLocate] ShowScreen 已识别到屏幕,更新quadUnityVectorList:" + PrintVector2List(quadUnityVectorList));
-
         }
-
     }
+    public void ShowScreen(QuadrilateralInCamera screen) => ShowScreen(ScreenQuad, screen);
 
     /// <summary>
     /// 校准点位置存储到本地
@@ -841,7 +845,7 @@ public partial class ScreenLocate : MonoBehaviour
             return true;
         }
         else return false;
-        
+
     }
 
     /// <summary>

+ 10 - 0
Assets/InfraredProject/WebCamera/Script/ZIM/ZIMUnity/Extension.cs

@@ -31,6 +31,8 @@ namespace ZIM
             return new o0.Color(c.r, c.g, c.b, c.a);
         }
 
+        public static Vector2 Size(this Texture tex) => new Vector2(tex.width, tex.height);
+
         private static Dictionary<Color, string> colorNames = new Dictionary<Color, string>()
         {
             { Color.red, "Red" },
@@ -108,6 +110,14 @@ namespace ZIM
             return new Vector2(dstRect.width * xp, dstRect.height * yp);
         }
 
+        public static Vector2 pixelToLocalPosition_AnchorLeftBottom(this Vector2 pixel, o0.Geometry2D.Vector<int> size, Rect dstRect)
+        {
+            var xp = pixel.x / size.x;
+            var yp = pixel.y / size.y;
+            //var origin = rawImage.anchoredPosition;
+            return new Vector2(dstRect.width * xp, dstRect.height * yp);
+        }
+
         public static float DegreeToXAxis(this Vector2 v)
         {
             var a = v.x > 0 ? Math.Atan(v.y / v.x) * 180 / Math.PI : 180 + Math.Atan(v.y / v.x) * 180 / Math.PI;

+ 373 - 30
Assets/InfraredProject/WebCamera/zimWebCamera.unity

@@ -38,7 +38,7 @@ RenderSettings:
   m_ReflectionIntensity: 1
   m_CustomReflection: {fileID: 0}
   m_Sun: {fileID: 0}
-  m_IndirectSpecularColor: {r: 0.3708985, g: 0.3783704, b: 0.35722548, a: 1}
+  m_IndirectSpecularColor: {r: 0.37089851, g: 0.3783701, b: 0.3572253, a: 1}
   m_UseRadianceAmbientProbe: 0
 --- !u!157 &3
 LightmapSettings:
@@ -732,6 +732,79 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 424028710}
   m_CullTransparentMesh: 1
+--- !u!1 &437411983
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 437411984}
+  - component: {fileID: 437411986}
+  - component: {fileID: 437411985}
+  m_Layer: 5
+  m_Name: RawImage (2)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &437411984
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  m_RootOrder: 2
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &437411985
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0, g: 1, b: 0, 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_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &437411986
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 437411983}
+  m_CullTransparentMesh: 1
 --- !u!1 &476763547
 GameObject:
   m_ObjectHideFlags: 0
@@ -749,7 +822,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 0
+  m_IsActive: 1
 --- !u!224 &476763548
 RectTransform:
   m_ObjectHideFlags: 0
@@ -761,14 +834,15 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
-  m_Children: []
+  m_Children:
+  - {fileID: 713242658}
   m_Father: {fileID: 1867793102}
   m_RootOrder: 7
   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: -155}
-  m_SizeDelta: {x: 600, y: 300}
+  m_AnchoredPosition: {x: 782, y: -248}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &476763550
 MonoBehaviour:
@@ -836,7 +910,7 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   m_Material: {fileID: 0}
-  m_Color: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1}
+  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
@@ -882,8 +956,8 @@ RectTransform:
   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: 950.4842, y: 101.02}
-  m_SizeDelta: {x: 201.4479, y: 589.97}
+  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 &557727040
 GameObject:
@@ -1377,13 +1451,13 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children: []
-  m_Father: {fileID: 1261583876}
-  m_RootOrder: 0
+  m_Father: {fileID: 2101632896}
+  m_RootOrder: 3
   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: 768, y: 432}
+  m_AnchoredPosition: {x: 786, y: 0}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &681002958
 MonoBehaviour:
@@ -1468,8 +1542,8 @@ RectTransform:
   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: -450, y: -263}
-  m_SizeDelta: {x: 768, y: 432}
+  m_AnchoredPosition: {x: -780, y: -248.00002}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &682249275
 MonoBehaviour:
@@ -1506,6 +1580,55 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 682249272}
   m_CullTransparentMesh: 1
+--- !u!1 &713242657
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 713242658}
+  - component: {fileID: 713242659}
+  m_Layer: 5
+  m_Name: ScreenQuad
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 0
+--- !u!224 &713242658
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 713242657}
+  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: 1718554403}
+  - {fileID: 1810361247}
+  - {fileID: 437411984}
+  - {fileID: 968799190}
+  m_Father: {fileID: 476763548}
+  m_RootOrder: 0
+  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 &713242659
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 713242657}
+  m_CullTransparentMesh: 1
 --- !u!1 &819462429
 GameObject:
   m_ObjectHideFlags: 0
@@ -1962,6 +2085,79 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 962801984}
   m_CullTransparentMesh: 1
+--- !u!1 &968799189
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 968799190}
+  - component: {fileID: 968799192}
+  - component: {fileID: 968799191}
+  m_Layer: 5
+  m_Name: RawImage (3)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &968799190
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  m_RootOrder: 3
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &968799191
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0, g: 1, b: 0, 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_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &968799192
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 968799189}
+  m_CullTransparentMesh: 1
 --- !u!1 &1092870241
 GameObject:
   m_ObjectHideFlags: 0
@@ -2508,15 +2704,14 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
-  m_Children:
-  - {fileID: 681002957}
+  m_Children: []
   m_Father: {fileID: 1867793102}
   m_RootOrder: 6
   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: 450, y: -263}
-  m_SizeDelta: {x: 768, y: 432}
+  m_AnchoredPosition: {x: 3, y: -248.00002}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1261583878
 MonoBehaviour:
@@ -2722,8 +2917,8 @@ RectTransform:
   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: 605, y: -155}
-  m_SizeDelta: {x: 600, y: 300}
+  m_AnchoredPosition: {x: 605, y: -143.15001}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1309947139
 MonoBehaviour:
@@ -2871,12 +3066,12 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 2101632896}
-  m_RootOrder: 0
+  m_RootOrder: 1
   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: 400, y: 400}
+  m_SizeDelta: {x: 300, y: 300}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1361341704
 MonoBehaviour:
@@ -3024,8 +3219,8 @@ RectTransform:
   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: 450, y: 180}
-  m_SizeDelta: {x: 768, y: 432}
+  m_AnchoredPosition: {x: 781, y: 191.84999}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &1426786008
 MonoBehaviour:
@@ -3305,6 +3500,79 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1697954113}
   m_CullTransparentMesh: 1
+--- !u!1 &1718554402
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1718554403}
+  - component: {fileID: 1718554405}
+  - component: {fileID: 1718554404}
+  m_Layer: 5
+  m_Name: RawImage
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1718554403
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1718554404
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0, g: 1, b: 0, 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_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1718554405
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1718554402}
+  m_CullTransparentMesh: 1
 --- !u!1 &1728164015
 GameObject:
   m_ObjectHideFlags: 0
@@ -3568,7 +3836,7 @@ RectTransform:
   - {fileID: 1738715396}
   - {fileID: 943874011}
   m_Father: {fileID: 2101632896}
-  m_RootOrder: 2
+  m_RootOrder: 0
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0}
   m_AnchorMax: {x: 1, y: 1}
@@ -3614,7 +3882,7 @@ RectTransform:
   m_ConstrainProportionsScale: 0
   m_Children: []
   m_Father: {fileID: 2101632896}
-  m_RootOrder: 1
+  m_RootOrder: 2
   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,6 +3989,79 @@ MonoBehaviour:
   m_ChildScaleWidth: 0
   m_ChildScaleHeight: 0
   m_ReverseArrangement: 0
+--- !u!1 &1810361246
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1810361247}
+  - component: {fileID: 1810361249}
+  - component: {fileID: 1810361248}
+  m_Layer: 5
+  m_Name: RawImage (1)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1810361247
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 0.5, y: 0.5, z: 0.5}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 713242658}
+  m_RootOrder: 1
+  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: 100, y: 100}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1810361248
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 0, g: 1, b: 0, 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_Texture: {fileID: 10912, guid: 0000000000000000f000000000000000, type: 0}
+  m_UVRect:
+    serializedVersion: 2
+    x: 0
+    y: 0
+    width: 1
+    height: 1
+--- !u!222 &1810361249
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1810361246}
+  m_CullTransparentMesh: 1
 --- !u!1 &1819346505
 GameObject:
   m_ObjectHideFlags: 0
@@ -3957,6 +4298,7 @@ MonoBehaviour:
   - {fileID: 1092870242}
   ScreenQuad: {fileID: 1759782642}
   SaveToggle: {fileID: 601288813}
+  ScreenLocateCameraSize: {x: 0, y: 0}
   ShowScreenQuad: 1
   rawImage: {fileID: 2101632897}
   rawImage1: {fileID: 1426786008}
@@ -3966,7 +4308,7 @@ MonoBehaviour:
   rawImage5: {fileID: 1309947139}
   FullScreenImage: {fileID: 1697954115}
   InfraredSpotSettings: {fileID: 11400000, guid: ca2f3b215f8d9d64caed905436a89b86, type: 2}
-  DebugScreenImage: {fileID: 2800000, guid: 88a6607d0916f0f4c84b91abc839b38c, type: 3}
+  DebugScreenImage: {fileID: 2800000, guid: f894060e71995eb41a8fd983d40deeb3, type: 3}
   DebugOnEditorWin: 1
   bSinglePoint: 1
   m_UITime: {fileID: 849339071}
@@ -4155,16 +4497,17 @@ RectTransform:
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
   m_Children:
+  - {fileID: 1759782642}
   - {fileID: 1361341703}
   - {fileID: 1793996698}
-  - {fileID: 1759782642}
+  - {fileID: 681002957}
   m_Father: {fileID: 1867793102}
   m_RootOrder: 3
   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: -450, y: 180}
-  m_SizeDelta: {x: 768, y: 432}
+  m_AnchoredPosition: {x: -783, y: 191.84999}
+  m_SizeDelta: {x: 720, y: 420}
   m_Pivot: {x: 0.5, y: 0.5}
 --- !u!114 &2101632897
 MonoBehaviour: