Realidad mixta y Azure (302): Computer VisionMR and Azure 302: Computer vision


Nota

Los tutoriales de Mixed Reality Academy se han diseñado teniendo en cuenta HoloLens (1.ª generación) y los cascos envolventes de realidad mixta.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos.As such, we feel it is important to leave these tutorials in place for developers who are still looking for guidance in developing for those devices. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles.They will be maintained to continue working on the supported devices. Habrá una nueva serie de tutoriales que se publicarán en el futuro que mostrarán cómo desarrollar para HoloLens 2.There will be a new series of tutorials that will be posted in the future that will demonstrate how to develop for HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.This notice will be updated with a link to those tutorials when they are posted.


En este curso, aprenderá a reconocer el contenido visual dentro de una imagen proporcionada, con las funcionalidades de Azure Computer Vision en una aplicación de realidad mixta.In this course, you will learn how to recognize visual content within a provided image, using Azure Computer Vision capabilities in a mixed reality application.

Los resultados del reconocimiento se mostrarán como etiquetas descriptivas.Recognition results will be displayed as descriptive tags. Puede usar este servicio sin necesidad de entrenar un modelo de aprendizaje automático.You can use this service without needing to train a machine learning model. Si su implementación requiere entrenar un modelo de aprendizaje automático, consulte Mr y Azure 302B.If your implementation requires training a machine learning model, see MR and Azure 302b.

resultado de laboratorio

Microsoft Computer Vision es un conjunto de API diseñadas para ofrecer a los desarrolladores el procesamiento y el análisis de imágenes (con información de retorno), mediante algoritmos avanzados, todo desde la nube.The Microsoft Computer Vision is a set of APIs designed to provide developers with image processing and analysis (with return information), using advanced algorithms, all from the cloud. Los desarrolladores cargan una imagen o una dirección URL de imagen, y los algoritmos de Microsoft Computer Vision API analizan el contenido visual, en función de las entradas elegidas para el usuario, que pueden devolver información, incluido, identificar el tipo y la calidad de una imagen, detectar caras humanas (devolver sus coordenadas) y etiquetar o clasificar imágenes.Developers upload an image or image URL, and the Microsoft Computer Vision API algorithms analyze the visual content, based upon inputs chosen the user, which then can return information, including, identifying the type and quality of an image, detect human faces (returning their coordinates), and tagging, or categorizing images. Para obtener más información, visite la Página de Computer Vision API de Azure.For more information, visit the Azure Computer Vision API page.

Una vez completado este curso, tendrá una aplicación de realidad HoloLens mixta, que podrá hacer lo siguiente:Having completed this course, you will have a mixed reality HoloLens application, which will be able to do the following:

  1. Con el gesto de TAP, la cámara de HoloLens capturará una imagen.Using the Tap gesture, the camera of the HoloLens will capture an image.
  2. La imagen se enviará al servicio Azure Computer Vision API.The image will be sent to the Azure Computer Vision API Service.
  3. Los objetos reconocidos se enumerarán en un grupo de interfaz de usuario simple situado en la escena de Unity.The objects recognized will be listed in a simple UI group positioned in the Unity Scene.

En su aplicación, depende del modo en que va a integrar los resultados con el diseño.In your application, it is up to you as to how you will integrate the results with your design. Este curso está diseñado para enseñarle a integrar un servicio de Azure con su proyecto de Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. Es su trabajo usar el conocimiento que obtiene de este curso para mejorar su aplicación de realidad mixta.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Compatibilidad con dispositivosDevice support

CursoCourse HoloLensHoloLens Cascos envolventesImmersive headsets
Realidad mixta y Azure (302): Computer VisionMR and Azure 302: Computer vision ✔️✔️ ✔️✔️

Nota

Aunque este curso se centra principalmente en HoloLens, también puede aplicar lo que aprenda en este curso a los auriculares con Windows Mixed Reality inmersivo (VR).While this course primarily focuses on HoloLens, you can also apply what you learn in this course to Windows Mixed Reality immersive (VR) headsets. Dado que los auriculares envolventes (VR) no tienen cámaras accesibles, necesitará una cámara externa conectada al equipo.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. A medida que siga con el curso, verá notas sobre cualquier cambio que deba usar para admitir auriculares envolventes (VR).As you follow along with the course, you will see notes on any changes you might need to employ to support immersive (VR) headsets.

PrerrequisitosPrerequisites

Nota

Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Unity y C#.This tutorial is designed for developers who have basic experience with Unity and C#. Tenga en cuenta también que los requisitos previos y las instrucciones escritas dentro de este documento representan lo que se ha probado y comprobado en el momento de la escritura (2018 de mayo).Please also be aware that the prerequisites and written instructions within this document represent what has been tested and verified at the time of writing (May 2018). Puede usar el software más reciente, como se indica en el artículo instalar las herramientas , aunque no se debe suponer que la información de este curso se ajusta perfectamente a lo que encontrará en el software más reciente que el que se indica a continuación.You are free to use the latest software, as listed within the install the tools article, though it should not be assumed that the information in this course will perfectly match what you'll find in newer software than what's listed below.

Se recomienda el siguiente hardware y software para este curso:We recommend the following hardware and software for this course:

Antes de empezarBefore you start

  1. Para evitar que se produzcan problemas al compilar este proyecto, se recomienda encarecidamente que cree el proyecto mencionado en este tutorial en una carpeta raíz o cerca de la raíz (las rutas de acceso de carpeta largas pueden producir problemas en tiempo de compilación).To avoid encountering issues building this project, it is strongly suggested that you create the project mentioned in this tutorial in a root or near-root folder (long folder paths can cause issues at build-time).
  2. Configure y pruebe su HoloLens.Set up and test your HoloLens. Si necesita ayuda para configurar HoloLens, asegúrese de visitar el artículo de configuración de hololens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. Es una buena idea realizar la calibración y el ajuste del sensor al empezar a desarrollar una nueva aplicación de HoloLens (a veces puede ayudar a realizar esas tareas para cada usuario).It is a good idea to perform Calibration and Sensor Tuning when beginning developing a new HoloLens App (sometimes it can help to perform those tasks for each user).

Para obtener ayuda sobre la calibración, siga este vínculo al artículo sobre la calibración de HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Para obtener ayuda sobre la optimización de sensores, siga este vínculo al artículo sobre la optimización del sensor de HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Capítulo 1: Azure portalChapter 1 – The Azure Portal

Para usar el servicio de Computer Vision API en Azure, tendrá que configurar una instancia del servicio para que esté disponible para la aplicación.To use the Computer Vision API service in Azure, you will need to configure an instance of the service to be made available to your application.

  1. En primer lugar, inicie sesión en Azure portal.First, log in to the Azure Portal.

    Nota

    Si aún no tiene una cuenta de Azure, tendrá que crear una.If you do not already have an Azure account, you will need to create one. Si sigue este tutorial en una situación de aula o de laboratorio, pregunte al instructor o a uno de los Proctors para obtener ayuda para configurar la nueva cuenta.If you are following this tutorial in a classroom or lab situation, ask your instructor or one of the proctors for help setting up your new account.

  2. Una vez que haya iniciado sesión, haga clic en nuevo en la esquina superior izquierda y busque Computer Vision API y haga clic en entrar.Once you are logged in, click on New in the top left corner, and search for Computer Vision API, and click Enter.

    Creación de un nuevo recurso en Azure

    Nota

    Es posible que la palabra nuevo se haya reemplazado por crear un recurso, en portales más recientes.The word New may have been replaced with Create a resource, in newer portals.

  3. La nueva página proporcionará una descripción del servicio Computer Vision API .The new page will provide a description of the Computer Vision API service. En la parte inferior izquierda de esta página, seleccione el botón crear para crear una asociación con este servicio.At the bottom left of this page, select the Create button, to create an association with this service.

    Acerca del servicio Computer Vision API

  4. Una vez que haya hecho clic en crear:Once you have clicked on Create:

    1. Inserte el nombre que desee para esta instancia de servicio.Insert your desired Name for this service instance.

    2. Seleccione una opción en Suscripción.Select a Subscription.

    3. Seleccione el plan de tarifa adecuado para usted; si es la primera vez que crea un servicio de Computer Vision API , debe tener a su disposición un nivel gratis (denominado F0).Select the Pricing Tier appropriate for you, if this is the first time creating a Computer Vision API Service, a free tier (named F0) should be available to you.

    4. Elija un grupo de recursos o cree uno nuevo.Choose a Resource Group or create a new one. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar la facturación de una colección de recursos de Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos laboratorios) en un grupo de recursos común).It is recommended to keep all the Azure services associated with a single project (e.g. such as these labs) under a common resource group).

      Si desea leer más información sobre los grupos de recursos de Azure, visite el artículo sobre el grupo de recursos.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Determine la ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos).Determine the Location for your resource group (if you are creating a new Resource Group). Idealmente, la ubicación estará en la región donde se ejecutará la aplicación.The location would ideally be in the region where the application would run. Algunos recursos de Azure solo están disponibles en determinadas regiones.Some Azure assets are only available in certain regions.

    6. También deberá confirmar que ha comprendido los términos y condiciones que se aplican a este servicio.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Haga clic en Crear.Click Create.

      Información de creación del servicio

  5. Una vez que haya hecho clic en crear, tendrá que esperar a que se cree el servicio, lo que puede tardar un minuto.Once you have clicked on Create, you will have to wait for the service to be created, this might take a minute.

  6. Una vez que se crea la instancia de servicio, aparecerá una notificación en el portal.A notification will appear in the portal once the Service instance is created.

    Vea la nueva notificación del nuevo servicio

  7. Haga clic en la notificación para explorar la nueva instancia de servicio.Click on the notification to explore your new Service instance.

    Seleccione el botón ir a recurso.

  8. Haga clic en el botón ir a recurso de la notificación para explorar la nueva instancia de servicio.Click the Go to resource button in the notification to explore your new Service instance. Se le dirigirá a la nueva instancia de servicio de Computer Vision API.You will be taken to your new Computer Vision API service instance.

    La nueva imagen de servicio de Computer Vision API

  9. En este tutorial, la aplicación necesitará realizar llamadas al servicio, lo que se realiza mediante el uso de la clave de suscripción del servicio.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. En la página Inicio rápido , de su servicio de Computer Vision API , navegue hasta el primer paso, grabe sus claves y haga clic en claves (también puede conseguirlo haciendo clic en las teclas de hipervínculo azul, que se encuentran en el menú de navegación servicios, indicado por el icono de llave).From the Quick start page, of your Computer Vision API service, navigate to the first step, Grab your keys, and click Keys (you can also achieve this by clicking the blue hyperlink Keys, located in the services navigation menu, denoted by the key icon). Esto revelará las claves de servicio.This will reveal your service Keys.

  11. Realice una copia de una de las claves que se muestran, ya que la necesitará más adelante en el proyecto.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. Vuelva a la página Inicio rápido y, desde ahí, recupere el punto de conexión.Go back to the Quick start page, and from there, fetch your endpoint. Tenga en cuenta que el suyo puede ser diferente, en función de su región (que, si es así, deberá realizar un cambio en el código más adelante).Be aware yours may be different, depending on your region (which if it is, you will need to make a change to your code later). Realice una copia de este punto de conexión para usarlo más adelante:Take a copy of this endpoint for use later:

    El nuevo servicio de Computer Vision API

    Sugerencia

    Puede comprobar los distintos puntos de conexión aquí.You can check what the various endpoints are HERE.

Capítulo 2: configurar el proyecto de UnityChapter 2 – Set up the Unity project

Lo siguiente es una configuración típica para desarrollar con la realidad mixta y, como tal, es una buena plantilla para otros proyectos.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Abra Unity y haga clic en nuevo.Open Unity and click New.

    Inicie el nuevo proyecto de Unity.

  2. Ahora tendrá que proporcionar un nombre de proyecto de Unity.You will now need to provide a Unity Project name. Inserte MR_ComputerVision.Insert MR_ComputerVision. Asegúrese de que el tipo de proyecto está establecido en 3D.Make sure the project type is set to 3D. Establezca la Ubicación en algún lugar adecuado para usted (Recuerde que, más cerca de los directorios raíz es mejor).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). A continuación, haga clic en crear proyecto.Then, click Create project.

    Proporcione los detalles del nuevo proyecto de Unity.

  3. Con Unity abierto, merece la pena comprobar que el Editor de scripts predeterminado está establecido en Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Vaya a editar > preferencias y, a continuación, en la nueva ventana, vaya a herramientas externas.Go to Edit > Preferences and then from the new window, navigate to External Tools. Cambie el Editor de script externo a Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Cierre la ventana preferencias .Close the Preferences window.

    Actualice las preferencias del editor de scripts.

  4. A continuación, vaya a archivo > configuración de compilación y seleccione plataforma universal de Windows y, después, haga clic en el botón cambiar plataforma para aplicar la selección.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Ventana Configuración de compilación, cambiar plataforma a UWP.

  5. Mientras sigue en el archivo > la configuración de compilación y asegúrese de que:While still in File > Build Settings and make sure that:

    1. El dispositivo de destino está establecido en HoloLensTarget Device is set to HoloLens

      Para los auriculares envolventes, establezca el dispositivo de destino en cualquier dispositivo.For the immersive headsets, set Target Device to Any Device.

    2. El tipo de compilación se establece en D3DBuild Type is set to D3D

    3. SDK está establecido en la versión más reciente instaladaSDK is set to Latest installed

    4. La versión de Visual Studio está establecida en la más reciente instaladaVisual Studio Version is set to Latest installed

    5. Compilar y ejecutar está establecido en equipo localBuild and Run is set to Local Machine

    6. Guarde la escena y agréguela a la compilación.Save the scene and add it to the build.

      1. Para ello, seleccione Agregar escenas abiertas.Do this by selecting Add Open Scenes. Aparecerá una ventana de guardar.A save window will appear.

        Haga clic en el botón Agregar escenas abiertas

      2. Cree una nueva carpeta para este, y en cualquier momento, en el futuro, seleccione el botón nueva carpeta para crear una nueva carpeta, asígnele el nombre Scenes.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Crear nueva carpeta de scripts

      3. Abra la carpeta Scenes recién creada y, a continuación, en el campo nombre de archivo:, escriba MR_ComputerVisionScene y, a continuación, haga clic en Guardar.Open your newly created Scenes folder, and then in the File name: text field, type MR_ComputerVisionScene, then click Save.

        Asigne un nombre a la nueva escena.

        Tenga en cuenta que debe guardar las escenas de Unity dentro de la carpeta assets , ya que deben estar asociadas con el proyecto Unity.Be aware, you must save your Unity scenes within the Assets folder, as they must be associated with the Unity Project. La creación de la carpeta Scenes (y otras carpetas similares) es una forma habitual de estructurar un proyecto de Unity.Creating the scenes folder (and other similar folders) is a typical way of structuring a Unity project.

    7. El resto de la configuración, en la configuración de compilación, debe dejarse como predeterminada por ahora.The remaining settings, in Build Settings, should be left as default for now.

  6. En la ventana configuración de compilación , haga clic en el botón Configuración del reproductor ; se abrirá el panel relacionado en el espacio donde se encuentra el Inspector .In the Build Settings window, click on the Player Settings button, this will open the related panel in the space where the Inspector is located.

    Abra configuración del reproductor.

  7. En este panel, deben comprobarse algunas opciones de configuración:In this panel, a few settings need to be verified:

    1. En la pestaña otros valores :In the Other Settings tab:

      1. La versión de scripting en tiempo de ejecución debe ser estable (.net 3,5 equivalente).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. El back-end de scripting debe ser .netScripting Backend should be .NET

      3. El nivel de compatibilidad de API debe ser .net 4,6API Compatibility Level should be .NET 4.6

        Actualice otras opciones de configuración.

    2. En la pestaña configuración de publicación , en capacidades, seleccione:Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. Cámara webWebcam

        Actualizando la configuración de publicación.

    3. Más abajo en el panel, en la configuración de XR (se encuentra debajo de configuración de publicación), tick Virtual Reality compatible, asegúrese de que se agrega el SDK de Windows Mixed Reality .Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Actualice la configuración de X R.

  8. De nuevo en la configuración de compilación , los proyectos de C# de Unity ya no están atenuados; Marque la casilla situada junto a este.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Cierre la ventana Build Settings (Configuración de compilación).Close the Build Settings window.

  10. Guarde la escena y el proyecto (archivo > guardar la escena o el archivo > guardar proyecto).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capítulo 3: configuración de la cámara principalChapter 3 – Main Camera setup

Importante

Si desea omitir el componente de configuración de Unity de este curso y continuar directamente en el código, no dude en descargar este . unitypackage Tools, impórtelo en el proyecto como un paquete personalizadoy, después, continúe con el capítulo 5.If you wish to skip the Unity Set up component of this course, and continue straight into code, feel free to download this .unitypackage, import it into your project as a Custom Package, and then continue from Chapter 5.

  1. En el Panel jerarquía, seleccione la cámara principal.In the Hierarchy Panel, select the Main Camera.

  2. Una vez seleccionado, podrá ver todos los componentes de la cámara principal en el panel del inspector.Once selected, you will be able to see all the components of the Main Camera in the Inspector Panel.

    1. El objeto de cámara debe tener el nombre de la cámara principal (tenga en cuenta la ortografía).The Camera object must be named Main Camera (note the spelling!)

    2. La etiqueta de cámara principal se debe establecer en MainCamera (tenga en cuenta la ortografía).The Main Camera Tag must be set to MainCamera (note the spelling!)

    3. Asegúrese de que la posición de transformación está establecida en 0, 0, 0Make sure the Transform Position is set to 0, 0, 0

    4. Establezca marcas de borrado en color sólido (Ignore esto para los auriculares inmersivo).Set Clear Flags to Solid Color (ignore this for immersive headset).

    5. Establezca el color de fondo del componente de la cámara en negro, alfa 0 (código hexadecimal: #00000000) (no se tiene en cuenta para el casco inmersivo).Set the Background Color of the Camera Component to Black, Alpha 0 (Hex Code: #00000000) (ignore this for immersive headset).

      Actualice los componentes de la cámara.

  3. A continuación, tendrá que crear un objeto de "cursor" simple adjunto a la cámara principal, lo que le ayudará a colocar la salida del análisis de la imagen cuando la aplicación se esté ejecutando.Next, you will have to create a simple “Cursor” object attached to the Main Camera, which will help you position the image analysis output when the application is running. Este cursor determinará el punto central del foco de la cámara.This Cursor will determine the center point of the camera focus.

Para crear el cursor:To create the Cursor:

  1. En el Panel jerarquía, haga clic con el botón secundario en la cámara principal.In the Hierarchy Panel, right-click on the Main Camera. En objeto 3D, haga clic en Sphere.Under 3D Object, click on Sphere.

    Seleccione el objeto Cursor.

  2. Cambie el nombre de la esfera a cursor (haga doble clic en el objeto cursor o presione el botón de teclado ' F2 ' con el objeto seleccionado) y asegúrese de que se encuentra como elemento secundario de la cámara principal.Rename the Sphere to Cursor (double click the Cursor object or press the ‘F2’ keyboard button with the object selected), and make sure it is located as child of the Main Camera.

  3. En el Panel jerarquía, haga clic con el botón izquierdo en el cursor.In the Hierarchy Panel, left click on the Cursor. Con el cursor seleccionado, ajuste las siguientes variables en el panel del inspector:With the Cursor selected, adjust the following variables in the Inspector Panel:

    1. Establecer la posición de la transformación en 0, 0,5Set the Transform Position to 0, 0, 5

    2. Establezca la escala en 0,02, 0,02, 0,02Set the Scale to 0.02, 0.02, 0.02

      Actualice la posición y la escala de transformación.

Capítulo 4: configurar el sistema de etiquetasChapter 4 – Setup the Label system

Una vez que haya capturado una imagen con la cámara de HoloLens, esa imagen se enviará a la instancia de servicio de Azure Computer Vision API para su análisis.Once you have captured an image with the HoloLens’ camera, that image will be sent to your Azure Computer Vision API Service instance for analysis.

Los resultados de ese análisis serán una lista de objetos reconocidos denominados etiquetas.The results of that analysis will be a list of recognized objects called Tags.

Usará etiquetas (como texto en 3D en el espacio universal) para mostrar estas etiquetas en la ubicación en la que se tomó la foto.You will use Labels (as a 3D text in world space) to display these Tags at the location the photo was taken.

En los pasos siguientes se muestra cómo configurar el objeto de etiqueta .The following steps will show how to setup the Label object.

  1. Haga clic con el botón secundario en cualquier lugar del panel jerarquía (la ubicación no importa en este momento), en objeto 3D, agregue un texto 3D.Right-click anywhere in the Hierarchy Panel (the location does not matter at this point), under 3D Object, add a 3D Text. Asígnele el nombre LabelText.Name it LabelText.

    Cree un objeto de texto 3D.

  2. En el Panel jerarquía, haga clic con el botón izquierdo en el LabelText.In the Hierarchy Panel, left click on the LabelText. Con el LabelText seleccionado, ajuste las siguientes variables en el panel del inspector:With the LabelText selected, adjust the following variables in the Inspector Panel:

    1. Establezca la posición en 0, 0,0Set the Position to 0,0,0
    2. Establezca la escala en 0,01, 0,01, 0,01Set the Scale to 0.01, 0.01, 0.01
    3. En la malla de texto del componente:In the component Text Mesh:
    4. Reemplace todo el texto dentro del texto, con "..."Replace all the text within Text, with "..."
    5. Establecer el anclaje en el Centro centralSet the Anchor to Middle Center
    6. Establecer la alineación en CenterSet the Alignment to Center
    7. Establecer el tamaño de tabulación en 4Set the Tab Size to 4
    8. Establezca el tamaño de fuente en 50Set the Font Size to 50
    9. Establezca el color en #FFFFFFFFSet the Color to #FFFFFFFF

    Componente de texto

  3. Arrastre LabelText desde el Panel jerarquía, a la carpeta Asset, dentro del panel Proyecto.Drag the LabelText from the Hierarchy Panel, into the Asset Folder, within in the Project Panel. Esto hará que el LabelText sea recurso prefabricado, de modo que se puedan crear instancias en el código.This will make the LabelText a Prefab, so that it can be instantiated in code.

    Cree un recurso prefabricado del objeto LabelText.

  4. Debe eliminar el LabelText del panel de jerarquías, de modo que no se muestre en la escena de apertura.You should delete the LabelText from the Hierarchy Panel, so that it will not be displayed in the opening scene. Como es ahora un recurso prefabricado, al que se llamará para las instancias individuales de la carpeta Assets, no hay necesidad de mantenerla dentro de la escena.As it is now a prefab, which you will call on for individual instances from your Assets folder, there is no need to keep it within the scene.

  5. La estructura final del objeto en el Panel jerarquía debe ser como la que se muestra en la imagen siguiente:The final object structure in the Hierarchy Panel should be like the one shown in the image below:

    Estructura final del panel de jerarquía.

Capítulo 5: crear la clase ResultsLabelChapter 5 – Create the ResultsLabel class

El primer script que necesita crear es la clase ResultsLabel , que es responsable de lo siguiente:The first script you need to create is the ResultsLabel class, which is responsible for the following:

  • Crear las etiquetas en el espacio del mundo adecuado, con respecto a la posición de la cámara.Creating the Labels in the appropriate world space, relative to the position of the Camera.
  • Mostrar las etiquetas de la imagen ardua.Displaying the Tags from the Image Anaysis.

Para crear esta clase:To create this class:

  1. Haga clic con el botón derecho en el panel Proyecto y, a continuación, cree > carpeta.Right-click in the Project Panel, then Create > Folder. Asigne a la carpeta el nombre scripts.Name the folder Scripts.

    Crear carpeta de scripts.

  2. Con la carpeta scripts creada, haga doble clic en ella para abrirla.With the Scripts folder create, double click it to open. Después, dentro de esa carpeta, haga clic con el botón derecho y seleccione crear > después script de C#.Then within that folder, right-click, and select Create > then C# Script. Asigne al script el nombre ResultsLabel.Name the script ResultsLabel.

  3. Haga doble clic en el nuevo script ResultsLabel para abrirlo con Visual Studio.Double click on the new ResultsLabel script to open it with Visual Studio.

  4. Dentro de la clase, inserte el siguiente código en la clase ResultsLabel :Inside the Class insert the following code in the ResultsLabel class:

        using System.Collections.Generic;
        using UnityEngine;
    
        public class ResultsLabel : MonoBehaviour
        {   
            public static ResultsLabel instance;
    
            public GameObject cursor;
    
            public Transform labelPrefab;
    
            [HideInInspector]
            public Transform lastLabelPlaced;
    
            [HideInInspector]
            public TextMesh lastLabelPlacedText;
    
            private void Awake()
            {
                // allows this instance to behave like a singleton
                instance = this;
            }
    
            /// <summary>
            /// Instantiate a Label in the appropriate location relative to the Main Camera.
            /// </summary>
            public void CreateLabel()
            {
                lastLabelPlaced = Instantiate(labelPrefab, cursor.transform.position, transform.rotation);
    
                lastLabelPlacedText = lastLabelPlaced.GetComponent<TextMesh>();
    
                // Change the text of the label to show that has been placed
                // The final text will be set at a later stage
                lastLabelPlacedText.text = "Analysing...";
            }
    
            /// <summary>
            /// Set the Tags as Text of the last Label created. 
            /// </summary>
            public void SetTagsToLastLabel(Dictionary<string, float> tagsDictionary)
            {
                lastLabelPlacedText = lastLabelPlaced.GetComponent<TextMesh>();
    
                // At this point we go through all the tags received and set them as text of the label
                lastLabelPlacedText.text = "I see: \n";
    
                foreach (KeyValuePair<string, float> tag in tagsDictionary)
                {
                    lastLabelPlacedText.text += tag.Key + ", Confidence: " + tag.Value.ToString("0.00 \n");
                }    
            }
        }
    
  5. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  6. De nuevo en el Editor de Unity, haga clic y arrastre la clase ResultsLabel desde la carpeta scripts hasta el objeto cámara principal en el Panel jerarquía.Back in the Unity Editor, click and drag the ResultsLabel class from the Scripts folder to the Main Camera object in the Hierarchy Panel.

  7. Haga clic en la cámara principal y mire en el panel del inspector.Click on the Main Camera and look at the Inspector Panel.

Observará que, desde el script que acaba de arrastrar a la cámara, hay dos campos: cursor y etiqueta recurso prefabricado.You will notice that from the script you just dragged into the Camera, there are two fields: Cursor and Label Prefab.

  1. Arrastre el objeto denominado cursor desde el Panel jerarquía hasta la ranura denominada cursor, tal como se muestra en la imagen siguiente.Drag the object called Cursor from the Hierarchy Panel to the slot named Cursor, as shown in the image below.

  2. Arrastre el objeto llamado LabelText desde la carpeta assets del panel Proyecto hasta la ranura denominada etiqueta recurso prefabricado, tal como se muestra en la imagen siguiente.Drag the object called LabelText from the Assets Folder in the Project Panel to the slot named Label Prefab, as shown in the image below.

    Establezca los destinos de referencia en Unity.

Capítulo 6: crear la clase ImageCaptureChapter 6 – Create the ImageCapture class

La clase siguiente que va a crear es la clase ImageCapture .The next class you are going to create is the ImageCapture class. Esta clase es responsable de:This class is responsible for:

  • Captura de una imagen con la cámara de HoloLens y su almacenamiento en la carpeta de la aplicación.Capturing an Image using the HoloLens Camera and storing it in the App Folder.
  • Captura de gestos de TAP del usuario.Capturing Tap gestures from the user.

Para crear esta clase:To create this class:

  1. Vaya a la carpeta scripts que creó anteriormente.Go to the Scripts folder you created previously.

  2. Haga clic con el botón derecho dentro de la carpeta, cree > script de C#.Right-click inside the folder, Create > C# Script. Llame al script ImageCapture.Call the script ImageCapture.

  3. Haga doble clic en el nuevo script ImageCapture para abrirlo con Visual Studio.Double click on the new ImageCapture script to open it with Visual Studio.

  4. Agregue los siguientes espacios de nombres al principio del archivo:Add the following namespaces to the top of the file:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. A continuación, agregue las siguientes variables dentro de la clase ImageCapture , sobre el método Start () :Then add the following variables inside the ImageCapture class, above the Start() method:

        public static ImageCapture instance; 
        public int tapsCount;
        private PhotoCapture photoCaptureObject = null;
        private GestureRecognizer recognizer;
        private bool currentlyCapturing = false;
    

La variable tapsCount almacenará el número de gestos de TAP capturados por el usuario.The tapsCount variable will store the number of tap gestures captured from the user. Este número se usa en el nombre de las imágenes capturadas.This number is used in the naming of the images captured.

  1. Ahora es necesario agregar el código para los métodos activo () e Inicio () .Code for Awake() and Start() methods now needs to be added. Se llamará cuando se inicialice la clase:These will be called when the class initializes:

        private void Awake()
        {
            // Allows this instance to behave like a singleton
            instance = this;
        }
    
        void Start()
        {
            // subscribing to the HoloLens API gesture recognizer to track user gestures
            recognizer = new GestureRecognizer();
            recognizer.SetRecognizableGestures(GestureSettings.Tap);
            recognizer.Tapped += TapHandler;
            recognizer.StartCapturingGestures();
        }
    
  2. Implemente un controlador que se llamará cuando se produzca un gesto de TAP.Implement a handler that will be called when a Tap gesture occurs.

        /// <summary>
        /// Respond to Tap Input.
        /// </summary>
        private void TapHandler(TappedEventArgs obj)
        {
            // Only allow capturing, if not currently processing a request.
            if(currentlyCapturing == false)
            {
                currentlyCapturing = true;
    
                // increment taps count, used to name images when saving
                tapsCount++;
    
                // Create a label in world space using the ResultsLabel class
                ResultsLabel.instance.CreateLabel();
    
                // Begins the image capture and analysis procedure
                ExecuteImageCaptureAndAnalysis();
            }
        }
    

El método TapHandler () incrementa el número de pulsaciones capturadas por el usuario y usa la posición del cursor actual para determinar dónde se debe colocar una nueva etiqueta.The TapHandler() method increments the number of taps captured from the user and uses the current Cursor position to determine where to position a new Label.

A continuación, este método llama al método ExecuteImageCaptureAndAnalysis () para comenzar la funcionalidad básica de esta aplicación.This method then calls the ExecuteImageCaptureAndAnalysis() method to begin the core functionality of this application.

  1. Una vez capturada y almacenada una imagen, se llamará a los siguientes controladores.Once an Image has been captured and stored, the following handlers will be called. Si el proceso se realiza correctamente, el resultado se pasa a VisionManager (que aún no se ha creado) para el análisis.If the process is successful, the result is passed to the VisionManager (which you are yet to create) for analysis.

        /// <summary>
        /// Register the full execution of the Photo Capture. If successful, it will begin 
        /// the Image Analysis process.
        /// </summary>
        void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
        {
            // Call StopPhotoMode once the image has successfully captured
            photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
        }
    
        void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
        {
            // Dispose from the object in memory and request the image analysis 
            // to the VisionManager class
            photoCaptureObject.Dispose();
            photoCaptureObject = null;
            StartCoroutine(VisionManager.instance.AnalyseLastImageCaptured()); 
        }
    
  2. A continuación, agregue el método que utiliza la aplicación para iniciar el proceso de captura de imagen y almacenar la imagen.Then add the method that the application uses to start the Image capture process and store the image.

        /// <summary>    
        /// Begin process of Image Capturing and send To Azure     
        /// Computer Vision service.   
        /// </summary>    
        private void ExecuteImageCaptureAndAnalysis()  
        {    
            // Set the camera resolution to be the highest possible    
            Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();    
    
            Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
    
            // Begin capture process, set the image format    
            PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)    
            {    
                photoCaptureObject = captureObject;    
                CameraParameters camParameters = new CameraParameters();    
                camParameters.hologramOpacity = 0.0f;    
                camParameters.cameraResolutionWidth = targetTexture.width;    
                camParameters.cameraResolutionHeight = targetTexture.height;    
                camParameters.pixelFormat = CapturePixelFormat.BGRA32;
    
                // Capture the image from the camera and save it in the App internal folder    
                captureObject.StartPhotoModeAsync(camParameters, delegate (PhotoCapture.PhotoCaptureResult result)
                {    
                    string filename = string.Format(@"CapturedImage{0}.jpg", tapsCount);
    
                    string filePath = Path.Combine(Application.persistentDataPath, filename);
    
                    VisionManager.instance.imagePath = filePath;
    
                    photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);
    
                    currentlyCapturing = false;
                });   
            });    
        }
    

Advertencia

En este punto, observará que aparece un error en el Panel de la consola del editor de Unity.At this point you will notice an error appearing in the Unity Editor Console Panel. Esto se debe a que el código hace referencia a la clase VisionManager que creará en el siguiente capítulo.This is because the code references the VisionManager class which you will create in the next Chapter.

Capítulo 7: llamada a Azure y análisis de imágenesChapter 7 – Call to Azure and Image Analysis

El último script que debe crear es la clase VisionManager .The last script you need to create is the VisionManager class.

Esta clase es responsable de:This class is responsible for:

  • Cargar la imagen más reciente capturada como una matriz de bytes.Loading the latest image captured as an array of bytes.
  • Envío de la matriz de bytes a la instancia de servicio de Azure Computer Vision API para su análisis.Sending the byte array to your Azure Computer Vision API Service instance for analysis.
  • Recibir la respuesta como una cadena JSON.Receiving the response as a JSON string.
  • Deserializar la respuesta y pasar las etiquetas resultantes a la clase ResultsLabel .Deserializing the response and passing the resulting Tags to the ResultsLabel class.

Para crear esta clase:To create this class:

  1. Haga doble clic en la carpeta scripts para abrirla.Double click on the Scripts folder, to open it.

  2. Haga clic con el botón derecho en la carpeta scripts y haga clic en crear > script de C#.Right-click inside the Scripts folder, click Create > C# Script. Asigne al script el nombre VisionManager.Name the script VisionManager.

  3. Haga doble clic en el nuevo script para abrirlo con Visual Studio.Double click on the new script to open it with Visual Studio.

  4. Actualice los espacios de nombres para que sean los mismos que los que se indican a continuación, en la parte superior de la clase VisionManager :Update the namespaces to be the same as the following, at the top of the VisionManager class:

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. En la parte superior del script, dentro de la clase VisionManager (encima del método Start () ), ahora debe crear dos clases que representen la respuesta JSON deserializada de Azure:At the top of your script, inside the VisionManager class (above the Start() method), you now need to create two Classes that will represent the deserialized JSON response from Azure:

        [System.Serializable]
        public class TagData
        {
            public string name;
            public float confidence;
        }
    
        [System.Serializable]
        public class AnalysedObject
        {
            public TagData[] tags;
            public string requestId;
            public object metadata;
        }
    

    Nota

    Las clases TagData y AnalysedObject deben tener el atributo [System. Serializable] agregado antes de que se pueda deserializar con las bibliotecas de Unity.The TagData and AnalysedObject classes need to have the [System.Serializable] attribute added before the declaration to be able to be deserialized with the Unity libraries.

  6. En la clase VisionManager, debe agregar las siguientes variables:In the VisionManager class, you should add the following variables:

        public static VisionManager instance;
    
        // you must insert your service key here!    
        private string authorizationKey = "- Insert your key here -";    
        private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key";
        private string visionAnalysisEndpoint = "https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags";   // This is where you need to update your endpoint, if you set your location to something other than west-us.
    
        internal byte[] imageBytes;
    
        internal string imagePath;
    

    Advertencia

    Asegúrese de insertar la clave de autenticación en la variable authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable. Habrá anotado la clave de autenticación al principio de este curso, capítulo 1.You will have noted your Auth Key at the beginning of this course, Chapter 1.

    Advertencia

    La variable visionAnalysisEndpoint podría diferir de la especificada en este ejemplo.The visionAnalysisEndpoint variable might differ from the one specified in this example. West-US hace referencia estrictamente a las instancias de servicio creadas para la región oeste de EE. UU.The west-us strictly refers to Service instances created for the West US region. Actualícelo con la dirección URL del punto de conexión; Estos son algunos ejemplos de lo que podría ser similar a:Update this with your endpoint URL; here are some examples of what that might look like:

    • Oeste de Europa: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=TagsWest Europe: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Sudeste Asiático: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=TagsSoutheast Asia: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Este de Australia: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=TagsAustralia East: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Ahora es necesario agregar el código para activo.Code for Awake now needs to be added.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. A continuación, agregue la corutina (con el método de secuencia estático debajo), que obtendrá los resultados del análisis de la imagen capturada por la clase ImageCapture .Next, add the coroutine (with the static stream method below it), which will obtain the results of the analysis of the image captured by the ImageCapture Class.

        /// <summary>
        /// Call the Computer Vision Service to submit the image.
        /// </summary>
        public IEnumerator AnalyseLastImageCaptured()
        {
            WWWForm webForm = new WWWForm();
            using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(visionAnalysisEndpoint, webForm))
            {
                // gets a byte array out of the saved image
                imageBytes = GetImageAsByteArray(imagePath);
                unityWebRequest.SetRequestHeader("Content-Type", "application/octet-stream");
                unityWebRequest.SetRequestHeader(ocpApimSubscriptionKeyHeader, authorizationKey);
    
                // the download handler will help receiving the analysis from Azure
                unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
    
                // the upload handler will help uploading the byte array with the request
                unityWebRequest.uploadHandler = new UploadHandlerRaw(imageBytes);
                unityWebRequest.uploadHandler.contentType = "application/octet-stream";
    
                yield return unityWebRequest.SendWebRequest();
    
                long responseCode = unityWebRequest.responseCode;     
    
                try
                {
                    string jsonResponse = null;
                    jsonResponse = unityWebRequest.downloadHandler.text;
    
                    // The response will be in Json format
                    // therefore it needs to be deserialized into the classes AnalysedObject and TagData
                    AnalysedObject analysedObject = new AnalysedObject();
                    analysedObject = JsonUtility.FromJson<AnalysedObject>(jsonResponse);
    
                    if (analysedObject.tags == null)
                    {
                        Debug.Log("analysedObject.tagData is null");
                    }
                    else
                    {
                        Dictionary<string, float> tagsDictionary = new Dictionary<string, float>();
    
                        foreach (TagData td in analysedObject.tags)
                        {
                            TagData tag = td as TagData;
                            tagsDictionary.Add(tag.name, tag.confidence);                            
                        }
    
                        ResultsLabel.instance.SetTagsToLastLabel(tagsDictionary);
                    }
                }
                catch (Exception exception)
                {
                    Debug.Log("Json exception.Message: " + exception.Message);
                }
    
                yield return null;
            }
        }
    
        /// <summary>
        /// Returns the contents of the specified file as a byte array.
        /// </summary>
        private static byte[] GetImageAsByteArray(string imageFilePath)
        {
            FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
            BinaryReader binaryReader = new BinaryReader(fileStream);
            return binaryReader.ReadBytes((int)fileStream.Length);
        }  
    
  9. Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  10. De nuevo en el editor de Unity, haga clic y arrastre las clases VisionManager y ImageCapture desde la carpeta scripts hasta el objeto cámara principal en el Panel jerarquía.Back in the Unity Editor, click and drag the VisionManager and ImageCapture classes from the Scripts folder to the Main Camera object in the Hierarchy Panel.

Capítulo 8: antes de compilarChapter 8 – Before building

Para realizar una prueba exhaustiva de la aplicación, debe transferirla a su HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Antes de hacerlo, asegúrese de que:Before you do, ensure that:

  • Toda la configuración mencionada en el capítulo 2 se establece correctamente.All the settings mentioned in Chapter 2 are set correctly.
  • Todos los scripts se adjuntan al objeto de cámara principal .All the scripts are attached to the Main Camera object.
  • Todos los campos del panel Inspector de cámara principal están asignados correctamente.All the fields in the Main Camera Inspector Panel are assigned properly.
  • Asegúrese de insertar la clave de autenticación en la variable authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable.
  • Asegúrese de que también ha comprobado el punto de conexión en el script de VisionManager y que está alineado con su región (este documento usa West-US de forma predeterminada).Ensure that you have also checked your endpoint in your VisionManager script, and that it aligns to your region (this document uses west-us by default).

Capítulo 9: compilar la solución UWP y transferir localmente la aplicaciónChapter 9 – Build the UWP Solution and sideload the application

Ya se ha completado todo lo necesario para la sección Unity de este proyecto, por lo que es el momento de compilarla desde Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Vaya a la configuración de compilación - archivo > configuración de compilación...Navigate to Build Settings - File > Build Settings…

  2. En la ventana configuración de compilación , haga clic en compilar.From the Build Settings window, click Build.

    Compilar la aplicación desde Unity

  3. Si aún no lo está, marque los proyectos de C# de Unity.If not already, tick Unity C# Projects.

  4. Haga clic en Generar.Click Build. Unity iniciará una ventana del Explorador de archivos , donde tendrá que crear y seleccionar una carpeta en la que compilar la aplicación.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Cree esa carpeta ahora y asígnele el nombre App.Create that folder now, and name it App. Después, con la carpeta de la aplicación seleccionada, presione Seleccionar carpeta.Then with the App folder selected, press Select Folder.

  5. Unity comenzará a compilar el proyecto en la carpeta de la aplicación .Unity will begin building your project to the App folder.

  6. Una vez que Unity termine de compilar (puede tardar algún tiempo), se abrirá una ventana del Explorador de archivos en la ubicación de la compilación (Compruebe la barra de tareas, ya que es posible que no aparezca siempre por encima de las ventanas, pero le notificará la adición de una nueva ventana).Once Unity has finished building (it might take some time), it will open a File Explorer window at the location of your build (check your task bar, as it may not always appear above your windows, but will notify you of the addition of a new window).

Capítulo 10: implementación en HoloLensChapter 10 – Deploy to HoloLens

Para implementar en HoloLens:To deploy on HoloLens:

  1. Necesitará la dirección IP de HoloLens (para la implementación remota) y para asegurarse de que HoloLens está en modo de desarrollador.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Para hacerlo:To do this:

    1. Mientras se contenga HoloLens, abra la configuración.Whilst wearing your HoloLens, open the Settings.
    2. Vaya a red & Internet > Wi-Fi > opciones avanzadasGo to Network & Internet > Wi-Fi > Advanced Options
    3. Anote la dirección IPv4 .Note the IPv4 address.
    4. A continuación, vuelva a configuración y, a continuación, actualice & seguridad > para desarrolladoresNext, navigate back to Settings, and then to Update & Security > For Developers
    5. Establezca el modo de Desarrollador en.Set Developer Mode On.
  2. Vaya a la nueva compilación de Unity (la carpeta de la aplicación ) y abra el archivo de solución con Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. En la configuración de soluciones, seleccione depurar.In the Solution Configuration select Debug.

  4. En la plataforma de la solución, seleccione x86, equipo remoto.In the Solution Platform, select x86, Remote Machine.

    Implemente la solución desde Visual Studio.

  5. Vaya al menú compilar y haga clic en implementar solución para transferir localmente la aplicación a HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. La aplicación debe aparecer ahora en la lista de aplicaciones instaladas en HoloLens, lista para su lanzamiento.Your App should now appear in the list of installed apps on your HoloLens, ready to be launched!

Nota

Para implementar en auriculares inmersivo, establezca la plataforma de la solución en el equipo local y establezca la configuración en depurar, con x86 como plataforma.To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. A continuación, implemente en el equipo local, mediante el menú compilar, seleccionando implementar solución.Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

La aplicación Computer Vision API finalizadaYour finished Computer Vision API application

Enhorabuena, ha creado una aplicación de realidad mixta que aprovecha el Computer Vision API de Azure para reconocer objetos reales y mostrar la confianza de lo que se ha detectado.Congratulations, you built a mixed reality app that leverages the Azure Computer Vision API to recognize real world objects, and display confidence of what has been seen.

resultado de laboratorio

Ejercicios extraBonus exercises

Ejercicio 1Exercise 1

Del mismo modo que ha usado el parámetro Tags (como se evidencia en el punto de conexión usado dentro del VisionManager), extienda la aplicación para detectar otra información; Observe a qué otros parámetros tiene acceso aquí.Just as you have used the Tags parameter (as evidenced within the endpoint used within the VisionManager), extend the app to detect other information; have a look at what other parameters you have access to HERE.

Ejercicio 2Exercise 2

Muestre los datos de Azure devueltos, de forma más conversación y legibles, y quizás oculte los números.Display the returned Azure data, in a more conversational, and readable way, perhaps hiding the numbers. Como si un bot pudiera estar hablando al usuario.As though a bot might be speaking to the user.