public static byte[] GetCameraImage(ARInterface arInterface) { var cameraImage = new ARInterface.CameraImage(); if (arInterface.TryGetCameraImage(ref cameraImage)) { var displayTransform = arInterface.GetDisplayTransform(); var textureSize = displayTransform.MultiplyVector(new Vector3(cameraImage.width, cameraImage.height)); var textureWidth = Math.Abs((int)textureSize.x); var textureHeight = Math.Abs((int)textureSize.y); var inverse = displayTransform.inverse; var texture = new Texture2D(textureWidth, textureHeight, TextureFormat.RGB24, false); for (int j = 0; j < cameraImage.height; j++) { for (var i = 0; i < cameraImage.width; i++) { var textureIdx = inverse.MultiplyVector(new Vector3(i, j)); var x = textureWidth - Math.Abs((int)textureIdx.x) - 1; var y = textureHeight - Math.Abs((int)textureIdx.y) - 1; var idxY = j * cameraImage.width + i; var idxUV = j / 2 * cameraImage.width / 2 + i / 2; texture.SetPixel(x, y, YUVtoRGB(cameraImage.y[idxY], cameraImage.uv[idxUV * 2], cameraImage.uv[idxUV * 2 + 1])); } } texture.Apply(); var png = texture.EncodeToPNG(); return(png); } return(null); }
public static CaptureInstance fromArInterface(ARInterface arInterface) { var pose = new Pose(); arInterface.TryGetPose(ref pose); var displayTransform = arInterface.GetDisplayTransform(); var aspect = Camera.main.aspect; return(new CaptureInstance(pose, displayTransform, aspect)); }
private void OnGUI() { if (GUILayout.Button("Take Photo")) { var cameraImage = new ARInterface.CameraImage(); if (_arInterface.TryGetCameraImage(ref cameraImage)) { var displayTransform = _arInterface.GetDisplayTransform(); var textureSize = displayTransform.MultiplyVector(new Vector3(cameraImage.width, cameraImage.height)); var textureWidth = Math.Abs((int)textureSize.x); var textureHeight = Math.Abs((int)textureSize.y); var inverse = displayTransform.inverse; var texture = new Texture2D(textureWidth, textureHeight, TextureFormat.RGB24, false); for (int j = 0; j < cameraImage.height; j++) { for (var i = 0; i < cameraImage.width; i++) { var textureIdx = inverse.MultiplyVector(new Vector3(i, j)); var x = textureWidth - Math.Abs((int)textureIdx.x) - 1; var y = textureHeight - Math.Abs((int)textureIdx.y) - 1; var idxY = j * cameraImage.width + i; var idxUV = j / 2 * cameraImage.width / 2 + i / 2; texture.SetPixel(x, y, YUVtoRGB(cameraImage.y[idxY], cameraImage.uv[idxUV * 2], cameraImage.uv[idxUV * 2 + 1])); } } texture.Apply(); var png = texture.EncodeToPNG(); File.WriteAllBytes(Application.persistentDataPath + "/output.png", png); File.WriteAllText(Application.persistentDataPath + "/output.json", JsonUtility.ToJson(CaptureInstance.fromArInterface(_arInterface))); } } if (GUILayout.Button("Open Photo")) { var plane = GameObject.CreatePrimitive(PrimitiveType.Quad); var png = File.ReadAllBytes(Application.persistentDataPath + "/output.png"); var texture = new Texture2D(0, 0, TextureFormat.RGB24, false); texture.LoadImage(png); plane.GetComponent <MeshRenderer>().material.mainTexture = texture; var json = File.ReadAllText(Application.persistentDataPath + "/output.json"); var meta = JsonUtility.FromJson <CaptureInstance>(json); plane.transform.localRotation = meta.pose.rotation; plane.transform.localScale = new Vector3(meta.aspect, 1, 1) / 3; var offset = meta.pose.rotation * new Vector3(0, 0, 0.5f); plane.transform.position = meta.pose.position + offset; } }