private IEnumerator Capture(bool anchor) { yield return(new WaitForSeconds(0.25f)); XRCameraImage image; ARCameraManager cameraManager = sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; if (cameraSubsystem != null && cameraSubsystem.TryGetLatestImage(out image)) { CoroutineJobCapture j = new CoroutineJobCapture(); j.onConnect = onConnect; j.onFailedToConnect = onFailedToConnect; j.server = this.server; j.token = this.token; j.bank = this.bank; j.run = (int)(this.imageRun & 0xEFFFFFFF); j.index = this.imageIndex++; j.anchor = anchor; Camera cam = Camera.main; Quaternion _q = cam.transform.rotation; Matrix4x4 r = Matrix4x4.Rotate(new Quaternion(_q.x, _q.y, -_q.z, -_q.w)); Vector3 _p = cam.transform.position; Vector3 p = new Vector3(_p.x, _p.y, -_p.z); j.rotation = r; j.position = p; j.intrinsics = ARHelper.GetIntrinsics(cameraManager); j.width = image.width; j.height = image.height; if (rgbCapture) { ARHelper.GetPlaneDataRGB(out j.pixels, image); j.channels = 3; } else { ARHelper.GetPlaneData(out j.pixels, image); j.channels = 1; } j.sessionFirstImage = sessionFirstImage; if (sessionFirstImage) { sessionFirstImage = false; } jobs.Add(j); image.Dispose(); m_cameraShutterClick.Play(); } }
public override void LocalizeServer() { bool rgb = false; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; XRCameraImage image; if (cameraSubsystem.TryGetLatestImage(out image)) { CoroutineJobLocalizeServer j = new CoroutineJobLocalizeServer(); j.host = this; if (this.useGPS) { j.useGPS = true; j.latitude = m_Latitude; j.longitude = m_Longitude; j.radius = DefaultRadius; } Camera cam = this.mainCamera; j.rotation = cam.transform.rotation; j.position = cam.transform.position; j.intrinsics = ARHelper.GetIntrinsics(); j.width = image.width; j.height = image.height; if (rgb) { ARHelper.GetPlaneDataRGB(out j.pixels, image); j.channels = 3; } else { ARHelper.GetPlaneData(out j.pixels, image); j.channels = 1; } m_Jobs.Add(j); image.Dispose(); } }
virtual public async void Capture() { await Task.Delay(250); m_bCaptureRunning = true; float captureStartTime = Time.realtimeSinceStartup; float uploadStartTime = Time.realtimeSinceStartup; XRCpuImage image; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; if (cameraSubsystem != null && cameraSubsystem.TryAcquireLatestCpuImage(out image)) { JobCaptureAsync j = new JobCaptureAsync(); j.run = (int)(m_ImageRun & 0xEFFFFFFF); j.index = m_ImageIndex++; j.anchor = false; if (AutomaticCaptureLocationProvider.Instance.gpsOn) { j.latitude = AutomaticCaptureLocationProvider.Instance.latitude; j.longitude = AutomaticCaptureLocationProvider.Instance.longitude; j.altitude = AutomaticCaptureLocationProvider.Instance.altitude; } else { j.latitude = j.longitude = j.altitude = 0.0; } ARHelper.GetIntrinsics(out j.intrinsics); Quaternion rot = m_MainCamera.transform.rotation; Vector3 pos = m_MainCamera.transform.position; ARHelper.GetRotation(ref rot); j.rotation = ARHelper.SwitchHandedness(Matrix4x4.Rotate(rot)); j.position = ARHelper.SwitchHandedness(pos); int width = image.width; int height = image.height; byte[] pixels; int channels = 1; if (m_RgbCapture) { ARHelper.GetPlaneDataRGB(out pixels, image); channels = 3; } else { ARHelper.GetPlaneData(out pixels, image); } byte[] capture = new byte[channels * width * height + 1024]; Task <icvCaptureInfo> captureTask = Task.Run(() => { return(Core.CaptureImage(capture, capture.Length, pixels, width, height, channels)); }); await captureTask; string path = string.Format("{0}/{1}", tempImagePath, System.Guid.NewGuid()); using (BinaryWriter writer = new BinaryWriter(File.OpenWrite(path))) { writer.Write(capture, 0, captureTask.Result.captureSize); } j.imagePath = path; j.encodedImage = ""; j.OnStart += () => { uploadStartTime = Time.realtimeSinceStartup; }; j.OnResult += (SDKImageResult result) => { float et = Time.realtimeSinceStartup - uploadStartTime; Debug.Log(string.Format("Image uploaded successfully in {0} seconds", et)); OnImageUploaded?.Invoke(); }; j.Progress.ProgressChanged += (s, progress) => { int value = (int)(100f * progress); Debug.Log(string.Format("Upload progress: {0}%", value)); }; j.OnError += (e) => { Debug.Log(string.Format("Capture error: " + e)); }; m_Jobs.Add(j); image.Dispose(); float elapsedTime = Time.realtimeSinceStartup - captureStartTime; Debug.Log(string.Format("Capture in {0} seconds", elapsedTime)); } m_bCaptureRunning = false; }
protected override async void Capture(bool anchor) { await Task.Delay(250); m_bCaptureRunning = true; float captureStartTime = Time.realtimeSinceStartup; float uploadStartTime = Time.realtimeSinceStartup; #if PLATFORM_LUMIN XRCameraImage image; #else XRCpuImage image; #endif ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; #if PLATFORM_LUMIN if (cameraSubsystem != null && cameraSubsystem.TryGetLatestImage(out image)) #else if (cameraSubsystem != null && cameraSubsystem.TryAcquireLatestCpuImage(out image)) #endif { JobCaptureAsync j = new JobCaptureAsync(); j.run = (int)(m_ImageRun & 0xEFFFFFFF); j.index = m_ImageIndex++; j.anchor = anchor; if (mapperSettings.useGps) { j.latitude = m_Latitude; j.longitude = m_Longitude; j.altitude = m_Altitude; } else { j.latitude = j.longitude = j.altitude = 0.0; } Camera cam = this.mainCamera; Quaternion _q = cam.transform.rotation; Matrix4x4 rot = Matrix4x4.Rotate(new Quaternion(_q.x, _q.y, -_q.z, -_q.w)); Vector3 _p = cam.transform.position; Vector3 pos = new Vector3(_p.x, _p.y, -_p.z); j.rotation = rot; j.position = pos; ARHelper.GetIntrinsics(out j.intrinsics); int width = image.width; int height = image.height; byte[] pixels; int channels = 1; if (mapperSettings.captureRgb) { ARHelper.GetPlaneDataRGB(out pixels, image); channels = 3; } else { ARHelper.GetPlaneData(out pixels, image); } byte[] capture = new byte[channels * width * height + 1024]; Task <icvCaptureInfo> captureTask = Task.Run(() => { return(Core.CaptureImage(capture, capture.Length, pixels, width, height, channels)); }); await captureTask; string path = string.Format("{0}/{1}", this.tempImagePath, System.Guid.NewGuid()); using (BinaryWriter writer = new BinaryWriter(File.OpenWrite(path))) { writer.Write(capture, 0, captureTask.Result.captureSize); } j.imagePath = path; j.encodedImage = ""; NotifyIfConnected(captureTask.Result); if (m_SessionFirstImage) { m_SessionFirstImage = false; } j.OnStart += () => { uploadStartTime = Time.realtimeSinceStartup; mappingUIManager.SetProgress(0); mappingUIManager.ShowProgressBar(); }; j.OnResult += (SDKImageResult result) => { float et = Time.realtimeSinceStartup - uploadStartTime; Debug.Log(string.Format("Image uploaded successfully in {0} seconds", et)); mappingUIManager.HideProgressBar(); }; j.Progress.ProgressChanged += (s, progress) => { int value = (int)(100f * progress); //Debug.Log(string.Format("Upload progress: {0}%", value)); mappingUIManager.SetProgress(value); }; j.OnError += (e) => { mappingUIManager.HideProgressBar(); }; m_Jobs.Add(j.RunJobAsync()); image.Dispose(); float elapsedTime = Time.realtimeSinceStartup - captureStartTime; Debug.Log(string.Format("Capture in {0} seconds", elapsedTime)); } m_bCaptureRunning = false; var captureButton = workspaceManager.captureButton.GetComponent <Button>(); captureButton.interactable = true; }
public override async void LocalizeServer() { bool rgb = false; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; #if PLATFORM_LUMIN XRCameraImage image; if (cameraSubsystem.TryGetLatestImage(out image)) #else XRCpuImage image; if (cameraSubsystem.TryAcquireLatestCpuImage(out image)) #endif { JobLocalizeServerAsync j = new JobLocalizeServerAsync(); if (mapperSettings.serverLocalizationWithIds) { int n = pcr.Count; j.mapIds = new SDKMapId[n]; int count = 0; foreach (int id in pcr.Keys) { j.mapIds[count] = new SDKMapId(); j.mapIds[count++].id = id; } } else { j.useGPS = true; j.latitude = m_Latitude; j.longitude = m_Longitude; j.radius = DefaultRadius; } byte[] pixels; Camera cam = this.mainCamera; Vector3 camPos = cam.transform.position; Quaternion camRot = cam.transform.rotation; int channels = 1; int width = image.width; int height = image.height; j.rotation = camRot; j.position = camPos; j.param1 = mapperSettings.param1; j.param2 = mapperSettings.param2; j.param3 = mapperSettings.param3; j.param4 = mapperSettings.param4; ARHelper.GetIntrinsics(out j.intrinsics); if (rgb) { ARHelper.GetPlaneDataRGB(out pixels, image); channels = 3; } else { ARHelper.GetPlaneData(out pixels, image); } Task <(byte[], icvCaptureInfo)> t = Task.Run(() => { byte[] capture = new byte[channels * width * height + 1024]; icvCaptureInfo info = Immersal.Core.CaptureImage(capture, capture.Length, pixels, width, height, channels); Array.Resize(ref capture, info.captureSize); return(capture, info); }); await t; j.image = t.Result.Item1; j.OnResult += (SDKLocalizeResult result) => { if (result.success) { Matrix4x4 m = Matrix4x4.identity; Matrix4x4 cloudSpace = Matrix4x4.identity; cloudSpace.m00 = result.r00; cloudSpace.m01 = result.r01; cloudSpace.m02 = result.r02; cloudSpace.m03 = result.px; cloudSpace.m10 = result.r10; cloudSpace.m11 = result.r11; cloudSpace.m12 = result.r12; cloudSpace.m13 = result.py; cloudSpace.m20 = result.r20; cloudSpace.m21 = result.r21; cloudSpace.m22 = result.r22; cloudSpace.m23 = result.pz; Matrix4x4 trackerSpace = Matrix4x4.TRS(camPos, camRot, Vector3.one); this.stats.locSucc++; Debug.Log("*************************** On-Server Localization Succeeded ***************************"); Debug.Log(string.Format("params: {0}, {1}, {2}, {3}", j.param1, j.param2, j.param3, j.param4)); Debug.Log("fc 4x4\n" + cloudSpace + "\n" + "ft 4x4\n" + trackerSpace); m = trackerSpace * (cloudSpace.inverse); foreach (KeyValuePair <int, PointCloudRenderer> p in this.pcr) { if (p.Key == result.map) { p.Value.go.transform.position = m.GetColumn(3); p.Value.go.transform.rotation = m.rotation; break; } } JobEcefAsync je = new JobEcefAsync(); je.id = result.map; je.OnResult += (SDKEcefResult result2) => { LocalizerPose lastLocalizedPose; LocalizerBase.GetLocalizerPose(out lastLocalizedPose, result.map, cloudSpace.GetColumn(3), cloudSpace.rotation, m.inverse, result2.ecef); this.lastLocalizedPose = lastLocalizedPose; }; m_Jobs.Add(je.RunJobAsync()); } else { this.stats.locFail++; Debug.Log("*************************** On-Server Localization Failed ***************************"); } }; m_Jobs.Add(j.RunJobAsync()); image.Dispose(); } }
protected override IEnumerator Capture(bool anchor) { yield return(new WaitForSeconds(0.25f)); m_bCaptureRunning = true; float captureStartTime = Time.realtimeSinceStartup; float uploadStartTime = Time.realtimeSinceStartup; XRCpuImage image; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; if (cameraSubsystem != null && cameraSubsystem.TryAcquireLatestCpuImage(out image)) { CoroutineJobCapture j = new CoroutineJobCapture(); j.host = this; j.run = (int)(m_ImageRun & 0xEFFFFFFF); j.index = m_ImageIndex++; j.anchor = anchor; if (gpsOn) { j.latitude = m_Latitude; j.longitude = m_Longitude; j.altitude = m_Altitude; } else { j.latitude = j.longitude = j.altitude = 0.0; } Camera cam = this.mainCamera; Quaternion _q = cam.transform.rotation; Matrix4x4 r = Matrix4x4.Rotate(new Quaternion(_q.x, _q.y, -_q.z, -_q.w)); Vector3 _p = cam.transform.position; Vector3 p = new Vector3(_p.x, _p.y, -_p.z); j.rotation = r; j.position = p; j.intrinsics = ARHelper.GetIntrinsics(); int width = image.width; int height = image.height; byte[] pixels; int channels = 0; if (m_RgbCapture) { ARHelper.GetPlaneDataRGB(out pixels, image); channels = 3; } else { ARHelper.GetPlaneData(out pixels, image); channels = 1; } byte[] capture = new byte[channels * width * height + 1024]; Task <icvCaptureInfo> captureTask = Task.Run(() => { return(Core.CaptureImage(capture, capture.Length, pixels, width, height, channels)); }); Task <string> convertTask = captureTask.ContinueWith <string>((antecedent) => { return(Convert.ToBase64String(capture, 0, antecedent.Result.captureSize)); }); while (!convertTask.IsCompleted) { yield return(null); } j.encodedImage = convertTask.Result; NotifyIfConnected(captureTask.Result); if (m_SessionFirstImage) { m_SessionFirstImage = false; } j.OnStart += () => { uploadStartTime = Time.realtimeSinceStartup; mappingUIManager.SetProgress(0); mappingUIManager.ShowProgressBar(); }; j.OnSuccess += (SDKImageResult result) => { if (result.error == "none") { float et = Time.realtimeSinceStartup - uploadStartTime; Debug.Log(string.Format("Image uploaded successfully in {0} seconds", et)); } mappingUIManager.HideProgressBar(); }; j.OnProgress += (float progress) => { int value = (int)(100f * progress); Debug.Log(string.Format("Upload progress: {0}%", value)); mappingUIManager.SetProgress(value); }; m_Jobs.Add(j); image.Dispose(); float elapsedTime = Time.realtimeSinceStartup - captureStartTime; Debug.Log(string.Format("Capture in {0} seconds", elapsedTime)); } m_bCaptureRunning = false; var captureButton = workspaceManager.captureButton.GetComponent <Button>(); captureButton.interactable = true; }
public override void LocalizeServer() { bool rgb = false; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; XRCpuImage image; if (cameraSubsystem.TryAcquireLatestCpuImage(out image)) { CoroutineJobLocalizeServer j = new CoroutineJobLocalizeServer(); if (gpsOn) { j.useGPS = true; j.latitude = m_Latitude; j.longitude = m_Longitude; j.radius = DefaultRadius; } else { int n = pcr.Count; j.mapIds = new SDKMapId[n]; int count = 0; foreach (int id in pcr.Keys) { j.mapIds[count] = new SDKMapId(); j.mapIds[count++].id = id; } } Camera cam = this.mainCamera; Vector3 camPos = cam.transform.position; Quaternion camRot = cam.transform.rotation; j.host = this; j.rotation = camRot; j.position = camPos; j.intrinsics = ARHelper.GetIntrinsics(); j.width = image.width; j.height = image.height; if (rgb) { ARHelper.GetPlaneDataRGB(out j.pixels, image); j.channels = 3; } else { ARHelper.GetPlaneData(out j.pixels, image); j.channels = 1; } j.OnResult += (SDKLocalizeResult result) => { /*if (result.error == "none") * {*/ if (result.success) { Matrix4x4 m = Matrix4x4.identity; Matrix4x4 cloudSpace = Matrix4x4.identity; cloudSpace.m00 = result.r00; cloudSpace.m01 = result.r01; cloudSpace.m02 = result.r02; cloudSpace.m03 = result.px; cloudSpace.m10 = result.r10; cloudSpace.m11 = result.r11; cloudSpace.m12 = result.r12; cloudSpace.m13 = result.py; cloudSpace.m20 = result.r20; cloudSpace.m21 = result.r21; cloudSpace.m22 = result.r22; cloudSpace.m23 = result.pz; Matrix4x4 trackerSpace = Matrix4x4.TRS(camPos, camRot, Vector3.one); this.stats.locSucc++; Debug.Log("*************************** On-Server Localization Succeeded ***************************"); Debug.Log("fc 4x4\n" + cloudSpace + "\n" + "ft 4x4\n" + trackerSpace); m = trackerSpace * (cloudSpace.inverse); foreach (KeyValuePair <int, PointCloudRenderer> p in this.pcr) { if (p.Key == result.map) { p.Value.go.transform.position = m.GetColumn(3); p.Value.go.transform.rotation = m.rotation; break; } } CoroutineJobEcef je = new CoroutineJobEcef(); je.host = this; je.id = result.map; je.OnSuccess += (SDKEcefResult result2) => { if (result2.error == "none") { Debug.Log(result2.ecef); LocalizerPose lastLocalizedPose; LocalizerBase.GetLocalizerPose(out lastLocalizedPose, result.map, cloudSpace.GetColumn(3), cloudSpace.rotation, m.inverse, result2.ecef); this.lastLocalizedPose = lastLocalizedPose; } else { Debug.LogError(result2.error); } }; m_Jobs.Add(je); } else { this.stats.locFail++; Debug.Log("*************************** On-Server Localization Failed ***************************"); } /*} * else * { * Debug.LogError(result.error); * }*/ }; m_Jobs.Add(j); image.Dispose(); } }
protected override IEnumerator Capture(bool anchor) { yield return(new WaitForSeconds(0.25f)); m_bCaptureRunning = true; XRCameraImage image; ARCameraManager cameraManager = m_Sdk.cameraManager; var cameraSubsystem = cameraManager.subsystem; if (cameraSubsystem != null && cameraSubsystem.TryGetLatestImage(out image)) { CoroutineJobCapture j = new CoroutineJobCapture(); j.host = this; j.run = (int)(m_ImageRun & 0xEFFFFFFF); j.index = m_ImageIndex++; j.anchor = anchor; if (useGPS) { j.latitude = m_Latitude; j.longitude = m_Longitude; j.altitude = m_Altitude; } else { j.latitude = j.longitude = j.altitude = 0.0; } Camera cam = this.mainCamera; Quaternion _q = cam.transform.rotation; Matrix4x4 r = Matrix4x4.Rotate(new Quaternion(_q.x, _q.y, -_q.z, -_q.w)); Vector3 _p = cam.transform.position; Vector3 p = new Vector3(_p.x, _p.y, -_p.z); j.rotation = r; j.position = p; j.intrinsics = ARHelper.GetIntrinsics(); j.width = image.width; j.height = image.height; if (m_RgbCapture) { ARHelper.GetPlaneDataRGB(out j.pixels, image); j.channels = 3; } else { ARHelper.GetPlaneData(out j.pixels, image); j.channels = 1; } if (m_SessionFirstImage) { m_SessionFirstImage = false; } m_Jobs.Add(j); image.Dispose(); } m_bCaptureRunning = false; var captureButton = workspaceManager.captureButton.GetComponent <Button>(); captureButton.interactable = true; }