コード例 #1
0
        private void GetImageAsync()
        {
            currentXRImage = new XRCameraImage();

            if (cameraManager.TryGetLatestImage(out currentXRImage))
            {
                currentXRImage.ConvertAsync(new XRCameraImageConversionParams
                {
                    inputRect        = new RectInt(0, 0, currentXRImage.width, currentXRImage.height),
                    outputDimensions = new Vector2Int(ScapeImgWidth, ScapeImgHeight),
                    outputFormat     = TextureFormat.R8
                }, ProcessImage);

                currentXRImage.Dispose();

                ScapeLogging.LogDebug("GetImageAsync() " + (Time.time - requestTime));
                measurementsRequested = false;
            }
        }
    // Convert image to correct size, rotate it, send it off to TorchServe, and draw resulting bounding boxes
    private IEnumerator ProcessImage(XRCameraImage image)
    {
        using (var request = image.ConvertAsync(new XRCameraImageConversionParams
        {
            inputRect = new RectInt(0, 0, image.width, image.height),
            outputDimensions = new Vector2Int((int)Width, (int)Height),
            outputFormat = TextureFormat.RGBA32,
            transformation = CameraImageTransformation.MirrorY
        }))
        {
            while (!request.status.IsDone())
            {
                yield return(null);
            }

            if (request.status != AsyncCameraImageConversionStatus.Ready)
            {
                Debug.LogErrorFormat("Image request failed with status {0}", request.status);
                yield break;
            }

            _currentJpgBytes = ConvertBufferToJpg(request.GetData <byte>(), request.conversionParams);
        }

        using (var client = new HttpClient {
            Timeout = TimeSpan.FromMilliseconds(2000)
        })
        {
            if (settingsManager.SettingsModel.activeEndpoint?.url == null)
            {
                Debug.LogWarning("Null Model Endpoint URL");
                yield break;
            }

            var content = new ByteArrayContent(_currentJpgBytes);
            content.Headers.Add("Content-Type", "image/jpg");

            var startTime = Time.realtimeSinceStartup;

            Task <HttpResponseMessage> webRequestTask;
            try
            {
                _activeRequests += 1;
                webRequestTask   = client.PostAsync(new Uri(settingsManager.SettingsModel.activeEndpoint?.url), content);
            }
            catch (Exception e)
            {
                _activeRequests -= 1;

                Console.WriteLine(e);
                yield break;
            }

            yield return(Utils.WaitForTaskToComplete(webRequestTask));

            _activeRequests -= 1;

            Console.WriteLine("Round trip: " + (Time.realtimeSinceStartup - startTime));

            if (!webRequestTask.Result.IsSuccessStatusCode)
            {
                Debug.LogErrorFormat("Error While Sending: {0}", webRequestTask.Result.ReasonPhrase);
                yield break;
            }

            var stringReadingTask = webRequestTask.Result.Content.ReadAsStringAsync();
            yield return(Utils.WaitForTaskToComplete(stringReadingTask));

            // Wrap output in top-level object for JsonUtility
            var text = "{\"objects\":" + stringReadingTask.Result + "}";

            // If JSON output does not have an array, the response was not a 200 OK
            if (!text.Contains("["))
            {
                Debug.LogErrorFormat("Prediction error: {0}\n", stringReadingTask.Result);
                yield break;
            }

            var rotation = RotationForScreenOrientation();
            if (!rotation.HasValue)
            {
                Debug.LogErrorFormat("Invalid screen orientation: {0}", _orientationObserver.ScreenOrientation);
                yield break;
            }

            _currentClassifications = JsonUtility.FromJson <JsonWrapper>(text).objects
                                      .FindAll(it => it.score >= settingsManager.SettingsModel.predictionScoreThreshold);

            var classifications = _currentClassifications
                                  .ConvertAll(old => new ObjectClassification(old.label,
                                                                              old.label_id,
                                                                              old.box
                                                                              .RotatedBy(rotation.Value, new Vector2(Width, Height))
                                                                              .ScaledBy(ScaleFactor),
                                                                              old.score));

            boundingBoxManager.SetObjectClassifications(classifications);
        }
    }
コード例 #3
0
    IEnumerator ProcessImage(XRCameraImage image)
    {
        // Create the async conversion request.
        var request = image.ConvertAsync(new XRCameraImageConversionParams
        {
            // Use the full image.
            inputRect = new RectInt(0, 0, image.width, image.height),

            // Downsample by 2.
            outputDimensions = new Vector2Int(image.width / 2, image.height / 2),

            // Color image format.
            outputFormat = TextureFormat.RGB24,

            // Flip across the Y axis.
            transformation = CameraImageTransformation.MirrorY
        });

        // Wait for the conversion to complete.
        while (!request.status.IsDone())
        {
            yield return(null);
        }

        // Check status to see if the conversion completed successfully.
        if (request.status != AsyncCameraImageConversionStatus.Ready)
        {
            // Something went wrong.
            Debug.LogErrorFormat("Request failed with status {0}", request.status);

            // Dispose even if there is an error.
            request.Dispose();
            yield break;
        }

        // Image data is ready. Let's apply it to a Texture2D.
        var rawData = request.GetData <byte>();

        m_LastCameraTexture = new Texture2D(
            request.conversionParams.outputDimensions.x,
            request.conversionParams.outputDimensions.y,
            request.conversionParams.outputFormat,
            false);

        // Copy the image data into the texture.
        m_LastCameraTexture.LoadRawTextureData(rawData);
        m_LastCameraTexture.Apply();

        // Need to dispose the request to delete resources associated
        // with the request, including the raw data.
        request.Dispose();

        // enable mesh + set shader properties
        arInstance.gameObject.SetActive(true);
        arInstance.transform.position = ARCamera.transform.position;
        arInstance.transform.rotation = ARCamera.transform.rotation;
        mat.SetTexture("Albedo", m_LastCameraTexture);

        // update ui
        raw.texture = m_LastCameraTexture;

        // TODO update size of image to match texture
    }
コード例 #4
0
    IEnumerator ProcessImage(XRCameraImage image)
    {
        // Create the async conversion request
        var request = image.ConvertAsync(new XRCameraImageConversionParams
        {
            // Use the full image
            inputRect = new RectInt(0, 0, image.width, image.height),

            // Downsample by 2
            outputDimensions = new Vector2Int(image.width / 8, image.height / 8),

            // Color image format
            outputFormat = TextureFormat.RGB24,

            // Flip across the Y axis
            transformation = CameraImageTransformation.MirrorY
        });

        // Wait for it to complete
        while (!request.status.IsDone())
        {
            yield return(null);
        }

        // Check status to see if it completed successfully.
        if (request.status != AsyncCameraImageConversionStatus.Ready)
        {
            // Something went wrong
            Debug.LogErrorFormat("Request failed with status {0}", request.status);

            // Dispose even if there is an error.
            request.Dispose();
            yield break;
        }

        // Image data is ready. Let's apply it to a Texture2D.
        var rawData = request.GetData <byte>();


        Texture2D texture = new Texture2D(
            request.conversionParams.outputDimensions.x,
            request.conversionParams.outputDimensions.y,
            request.conversionParams.outputFormat,
            false);

        // Copy the image data into the texture
        texture.LoadRawTextureData(rawData);
        texture.Apply();
        texture.Compress(false);

        m_Texture = Common.Util.TextureUtil.AnticlockwiseRotate90(texture);

        Debug.Log("生成图片!");

        byte[] bytes = m_Texture.EncodeToPNG();
        //SaveImage("temp", bytes);
        ImageRecognition(bytes);

        // Need to dispose the request to delete resources associated
        // with the request, including the raw data.
        request.Dispose();
    }