Exemplo n.º 1
0
    /// <summary>
    /// Set the Tags as Text of the last label created.
    /// </summary>
    public void FinaliseLabel(AnalysisRootObject analysisObject)
    {
        if (analysisObject.predictions != null)
        {
            // Sort the predictions to locate the highest one
            List <Prediction> sortedPredictions = new List <Prediction>();
            sortedPredictions = analysisObject.predictions.OrderByDescending(p => p.probability).ToList();
            foreach (Prediction prediction in sortedPredictions)
            {
                if (prediction.probability < probabilityThreshold)
                {
                    Debug.Log("Already at the threshold. Stopping");
                    break;
                }

                if (prediction.tagName != suitcaseLabel)
                {
                    Debug.Log("Skipping non-suitcase: " + prediction.tagName);
                    break;
                }
                GameObject label = CreateLabel();

                /// <summary>
                /// Reference to the last Label positioned
                /// </summary>
                Transform labelObj = Instantiate(label.transform, cursor.transform.position, transform.rotation);

                /// <summary>
                /// Reference to the last Label positioned
                /// </summary>
                TextMesh labelObjText = labelObj.GetComponent <TextMesh>();

                // Initialize new label
                PlaceAnalysisLabel(label, labelObj, labelObjText);

                quadRenderer = quad.GetComponent <Renderer>() as Renderer;
                Bounds quadBounds = quadRenderer.bounds;

                // Position the label as close as possible to the Bounding Box of the prediction
                // At this point it will not consider depth
                labelObj.transform.parent = quad.transform;
                MyRectangle positionRect = CalculateBoundingBoxPosition(quadBounds, prediction.boundingBox);
                labelObj.transform.localPosition = positionRect.GetCenter();

                // Cast a ray from the user's head to the currently placed label, it should hit the object detected by the Service.
                // At that point it will reposition the label where the ray HL sensor collides with the object,
                // (using the HL spatial tracking)
                Debug.Log("Repositioning Label");
                Vector3    headPosition = Camera.main.transform.position;
                RaycastHit objHitInfo;
                Vector3    objDirection     = labelObj.position;
                string     dimensionsString = "";
                if (Physics.Raycast(headPosition, objDirection, out objHitInfo, 30.0f, SpatialMapping.PhysicsRaycastMask))
                {
                    float widthInMeters  = 0;
                    float heightInMeters = 0;
                    labelObj.position = objHitInfo.point;
                    widthInMeters     = Vector3.Distance(new Vector3(positionRect.topLeft.x, positionRect.topLeft.y, objHitInfo.distance), new Vector3(positionRect.bottomRight.x, positionRect.topLeft.y, objHitInfo.distance));
                    heightInMeters    = Vector3.Distance(new Vector3(positionRect.topLeft.x, positionRect.topLeft.y, objHitInfo.distance), new Vector3(positionRect.topLeft.x, positionRect.bottomRight.y, objHitInfo.distance));
                    dimensionsString  = " - " + widthInMeters + "x" + heightInMeters;
                    // Draw rectangle around
                    DrawRect(positionRect, objHitInfo.distance);
                }

                // Set the tag text
                labelObjText.text = prediction.tagName + " (" + (prediction.probability * 100) + "%)" + dimensionsString;
            }
        }
        // Reset the color of the cursor
        cursor.GetComponent <Renderer>().material.color = Color.green;

        // Stop the analysis process
        ImageCapture.Instance.ResetImageCapture();
    }