MR e Azure 302: Pesquisa Visual ComputacionalMR and Azure 302: Computer vision


Observação

Os tutoriais do Mixed Reality Academy foram projetados com o HoloLens (1ª geração) e os headsets imersivos de realidade misturada em mente.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Dessa forma, achamos que é importante continuar disponibilizando esses tutoriais para os desenvolvedores que ainda buscam obter diretrizes para o desenvolvimento visando esses 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. Esses tutoriais não serão atualizados com os conjuntos de ferramentas mais recentes nem com as interações usadas para o HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Eles serão mantidos para continuar funcionando nos dispositivos compatíveis.They will be maintained to continue working on the supported devices. Haverá uma nova série de tutoriais que serão publicados no futuro, que demonstrarão como desenvolver para o 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. Esse aviso será atualizado com um link para esses tutoriais quando eles forem postados.This notice will be updated with a link to those tutorials when they are posted.


Neste curso, você aprenderá a reconhecer o conteúdo visual dentro de uma imagem fornecida, usando os recursos de Pesquisa Visual Computacional do Azure em um aplicativo de realidade misturada.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.

Os resultados de reconhecimento serão exibidos como marcas descritivas.Recognition results will be displayed as descriptive tags. Você pode usar esse serviço sem a necessidade de treinar um modelo de aprendizado de máquina.You can use this service without needing to train a machine learning model. Se sua implementação exigir treinamento de um modelo de aprendizado de máquina, consulte Mr e Azure 302b.If your implementation requires training a machine learning model, see MR and Azure 302b.

resultado do laboratório

O Microsoft Pesquisa Visual Computacional é um conjunto de APIs projetado para fornecer aos desenvolvedores o processamento e a análise de imagens (com informações de retorno), usando algoritmos avançados, tudo da nuvem.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. Os desenvolvedores carregam uma URL de imagem ou imagem, e os algoritmos de API da Pesquisa Visual Computacional da Microsoft analisam o conteúdo visual, com base nas entradas escolhidas pelo usuário, que podem retornar informações, incluindo, identificar o tipo e a qualidade de uma imagem, detectar faces humanas (retornando suas coordenadas) e marcando ou categorizando imagens.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 obter mais informações, visite a página de API da pesquisa Visual computacional do Azure.For more information, visit the Azure Computer Vision API page.

Após a conclusão deste curso, você terá um aplicativo de HoloLens de realidade misturada, que poderá fazer o seguinte:Having completed this course, you will have a mixed reality HoloLens application, which will be able to do the following:

  1. Usando o gesto de toque, a câmera do HoloLens capturará uma imagem.Using the Tap gesture, the camera of the HoloLens will capture an image.
  2. A imagem será enviada para o serviço de API da Pesquisa Visual Computacional do Azure.The image will be sent to the Azure Computer Vision API Service.
  3. Os objetos reconhecidos serão listados em um grupo de interface do usuário simples posicionado na cena do Unity.The objects recognized will be listed in a simple UI group positioned in the Unity Scene.

Em seu aplicativo, cabe a você como você integrará os resultados com seu design.In your application, it is up to you as to how you will integrate the results with your design. Este curso foi projetado para ensinar a você como integrar um serviço do Azure com seu projeto do Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. É seu trabalho usar o conhecimento obtido deste curso para aprimorar seu aplicativo de realidade misturada.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Suporte a dispositivosDevice support

CursoCourse HoloLensHoloLens Headsets imersivosImmersive headsets
MR e Azure 302: Pesquisa Visual ComputacionalMR and Azure 302: Computer vision ✔️✔️ ✔️✔️

Observação

Embora este curso se concentre principalmente no HoloLens, você também pode aplicar o que aprende neste curso a fones de ouvido (VR) de realidade mista do Windows.While this course primarily focuses on HoloLens, you can also apply what you learn in this course to Windows Mixed Reality immersive (VR) headsets. Como os headsets de imersão (VR) não têm câmeras acessíveis, você precisará de uma câmera externa conectada ao seu PC.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. Ao acompanhar o curso, você verá observações sobre as alterações que talvez precise empregar para dar suporte a headsets de imersão (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.

Pré-requisitosPrerequisites

Observação

Este tutorial foi projetado para desenvolvedores que têm experiência básica com o Unity e o C#.This tutorial is designed for developers who have basic experience with Unity and C#. Além disso, lembre-se de que os pré-requisitos e as instruções escritas neste documento representam o que foi testado e verificado no momento da gravação (maio de 2018).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). Você está livre para usar o software mais recente, conforme listado no artigo instalar as ferramentas , embora não seja recomendável que as informações neste curso irão se adequar perfeitamente ao que você encontrará em softwares mais recentes do que as listadas abaixo.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.

Recomendamos o seguinte hardware e software para este curso:We recommend the following hardware and software for this course:

Antes de começarBefore you start

  1. Para evitar problemas de criação desse projeto, é altamente recomendável que você crie o projeto mencionado neste tutorial em uma pasta raiz ou quase raiz (caminhos de pasta longos podem causar problemas em tempo de compilação).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 e teste seu HoloLens.Set up and test your HoloLens. Se você precisar de suporte para configurar seu HoloLens, visite o artigo configuração do hololens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. É uma boa ideia executar a calibragem e o ajuste do sensor ao começar a desenvolver um novo aplicativo do HoloLens (às vezes, ele pode ajudar a executar essas tarefas para cada usuário).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 obter ajuda sobre calibragem, siga este link para o artigo Calibration do HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Para obter ajuda sobre o ajuste do sensor, siga este link para o artigo de ajuste do sensor do HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Capítulo 1 – o portal do AzureChapter 1 – The Azure Portal

Para usar o serviço de API da pesquisa Visual computacional no Azure, você precisará configurar uma instância do serviço a ser disponibilizada para seu aplicativo.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. Primeiro, faça logon no portal do Azure.First, log in to the Azure Portal.

    Observação

    Se você ainda não tiver uma conta do Azure, será necessário criar uma.If you do not already have an Azure account, you will need to create one. Se você estiver seguindo este tutorial em uma situação de sala de aula ou laboratório, peça ao instrutor ou a uma das proctors para obter ajuda para configurar sua nova conta.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. Depois de fazer logon, clique em novo no canto superior esquerdo e procure API da pesquisa Visual computacional e clique em Enter.Once you are logged in, click on New in the top left corner, and search for Computer Vision API, and click Enter.

    Criar um novo recurso no Azure

    Observação

    A palavra novo pode ter sido substituída por criar um recurso, em portais mais recentes.The word New may have been replaced with Create a resource, in newer portals.

  3. A nova página fornecerá uma descrição do serviço API da pesquisa Visual computacional .The new page will provide a description of the Computer Vision API service. Na parte inferior esquerda desta página, selecione o botão criar para criar uma associação com esse serviço.At the bottom left of this page, select the Create button, to create an association with this service.

    Sobre o serviço de API da pesquisa Visual computacional

  4. Depois de clicar em criar:Once you have clicked on Create:

    1. Insira o nome desejado para esta instância de serviço.Insert your desired Name for this service instance.

    2. Selecione uma Assinatura.Select a Subscription.

    3. Selecione o tipo de preço apropriado para você, se esta for a primeira vez que criar um serviço de API da pesquisa Visual computacional , uma camada gratuita (chamada F0) deverá estar disponível para você.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. Escolha um grupo de recursos ou crie um novo.Choose a Resource Group or create a new one. Um grupo de recursos fornece uma maneira de monitorar, controlar o acesso, provisionar e gerenciar a cobrança de uma coleção de ativos do Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. É recomendável manter todos os serviços do Azure associados a um único projeto (por exemplo, esses laboratórios) em um grupo de recursos comum).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).

      Se você quiser ler mais sobre grupos de recursos do Azure, visite o artigo grupo de recursos.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Determine o local do seu grupo de recursos (se você estiver criando um novo grupo de recursos).Determine the Location for your resource group (if you are creating a new Resource Group). O local ideal seria na região em que o aplicativo seria executado.The location would ideally be in the region where the application would run. Alguns ativos do Azure só estão disponíveis em determinadas regiões.Some Azure assets are only available in certain regions.

    6. Você também precisará confirmar que entendeu os termos e condições aplicados a esse serviço.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Clique em Criar.Click Create.

      Informações de criação de serviço

  5. Depois de clicar em criar, você precisará aguardar até que o serviço seja criado, isso pode levar um minuto.Once you have clicked on Create, you will have to wait for the service to be created, this might take a minute.

  6. Uma notificação será exibida no portal assim que a instância do serviço for criada.A notification will appear in the portal once the Service instance is created.

    Consulte a nova notificação para seu novo serviço

  7. Clique na notificação para explorar sua nova instância de serviço.Click on the notification to explore your new Service instance.

    Selecione o botão ir para o recurso.

  8. Clique no botão ir para recurso na notificação para explorar sua nova instância de serviço.Click the Go to resource button in the notification to explore your new Service instance. Você será levado para sua nova instância do serviço API da Pesquisa Visual Computacional.You will be taken to your new Computer Vision API service instance.

    Sua nova imagem do serviço API da Pesquisa Visual Computacional

  9. Neste tutorial, seu aplicativo precisará fazer chamadas para seu serviço, o que é feito por meio do uso da chave de assinatura do serviço.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. Na página início rápido , do seu serviço de API da pesquisa Visual computacional , navegue até a primeira etapa, pegue as chaves e clique em chaves (você também pode conseguir isso clicando nas teclas de hiperlink azul, localizadas no menu de navegação serviços, indicado pelo ícone de chave).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). Isso revelará suas chaves de serviço.This will reveal your service Keys.

  11. Faça uma cópia de uma das chaves exibidas, pois você precisará dela posteriormente em seu projeto.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. Volte para a página início rápido e, a partir daí, busque seu ponto de extremidade.Go back to the Quick start page, and from there, fetch your endpoint. Lembre-se de que seu pode ser diferente, dependendo de sua região (que, se for, você precisará fazer uma alteração no código posteriormente).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). Faça uma cópia deste ponto de extremidade para uso posterior:Take a copy of this endpoint for use later:

    Seu novo serviço de API da Pesquisa Visual Computacional

    Dica

    Você pode verificar quais são os vários pontos de extremidade aqui.You can check what the various endpoints are HERE.

Capítulo 2 – configurar o projeto do UnityChapter 2 – Set up the Unity project

A seguir está uma configuração típica para o desenvolvimento com realidade misturada e, como tal, é um bom modelo para outros projetos.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Abra o Unity e clique em novo.Open Unity and click New.

    Inicie o novo projeto do Unity.

  2. Agora, você precisará fornecer um nome de projeto de Unity.You will now need to provide a Unity Project name. Inserir MR_ComputerVision.Insert MR_ComputerVision. Verifique se o tipo de projeto está definido como 3D.Make sure the project type is set to 3D. Defina o local como algum lugar apropriado para você (Lembre-se de que, mais próximo de diretórios raiz é melhor).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Em seguida, clique em criar projeto.Then, click Create project.

    Forneça detalhes para o novo projeto do Unity.

  3. Com o Unity Open, vale a pena verificar se o Editor de script padrão está definido como Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Vá para Editar preferências de > e, em seguida, na nova janela, navegue até Ferramentas externas.Go to Edit > Preferences and then from the new window, navigate to External Tools. Altere o Editor de script externo para o Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Feche a janela preferências .Close the Preferences window.

    Atualize a preferência do editor de script.

  4. Em seguida, vá para arquivo > configurações de Build e selecione plataforma universal do Windows e, em seguida, clique no botão alternar plataforma para aplicar sua seleção.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Janela de configurações de compilação, alterne a plataforma para UWP.

  5. Ainda no arquivo > configurações de compilação e certifique-se de que:While still in File > Build Settings and make sure that:

    1. O dispositivo de destino está definido como HoloLensTarget Device is set to HoloLens

      Para os headsets de imersão, defina dispositivo de destino para qualquer dispositivo.For the immersive headsets, set Target Device to Any Device.

    2. O tipo de compilação está definido como D3DBuild Type is set to D3D

    3. O SDK está definido para o mais recente instaladoSDK is set to Latest installed

    4. A versão do Visual Studio está definida para o mais recente instaladoVisual Studio Version is set to Latest installed

    5. Compilar e executar é definido como computador localBuild and Run is set to Local Machine

    6. Salve a cena e adicione-a à compilação.Save the scene and add it to the build.

      1. Faça isso selecionando Adicionar abrir cenas.Do this by selecting Add Open Scenes. Uma janela salvar será exibida.A save window will appear.

        Clique no botão Adicionar cenas abertas

      2. Crie uma nova pasta para isso e qualquer cena futura, em seguida, selecione o botão nova pasta , para criar uma nova pasta, nomeie-a como cenas.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Criar nova pasta de scripts

      3. Abra sua pasta de cenas recém-criada e, no campo nome do arquivo:, digite MR_ComputerVisionScene e clique em salvar.Open your newly created Scenes folder, and then in the File name: text field, type MR_ComputerVisionScene, then click Save.

        Dê um nome à nova cena.

        Lembre-se de que você deve salvar as cenas do Unity na pasta ativos , pois elas devem ser associadas ao projeto do Unity.Be aware, you must save your Unity scenes within the Assets folder, as they must be associated with the Unity Project. Criar a pasta de cenas (e outras pastas semelhantes) é uma maneira típica de estruturar um projeto do Unity.Creating the scenes folder (and other similar folders) is a typical way of structuring a Unity project.

    7. As configurações restantes, em configurações de compilação, devem ser deixadas como padrão por enquanto.The remaining settings, in Build Settings, should be left as default for now.

  6. Na janela configurações de compilação , clique no botão configurações do Player , isso abrirá o painel relacionado no espaço onde o Inspetor está localizado.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 as configurações do Player.

  7. Nesse painel, algumas configurações precisam ser verificadas:In this panel, a few settings need to be verified:

    1. Na guia outras configurações :In the Other Settings tab:

      1. A versão de tempo de execução de script deve ser estável (.net 3,5 equivalente).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. O back-end de script deve ser .netScripting Backend should be .NET

      3. O nível de compatibilidade da API deve ser .NET 4,6API Compatibility Level should be .NET 4.6

        Atualize outras configurações.

    2. Na guia configurações de publicação , em recursos, marque:Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. WebcamWebcam

        Atualizando configurações de publicação.

    3. Mais adiante no painel, em configurações de XR (encontradas abaixo de configurações de publicação), suporte à realidade virtual em escala, verifique se o SDK do Windows Mixed Reality foi adicionado.Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Atualize as configurações de X R.

  8. De volta nas configurações de Build , projetos do Unity C# não estão mais esmaecidos; Marque a caixa de seleção ao lado deste.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Feche a janela Configurações de Build.Close the Build Settings window.

  10. Salve sua cena e projeto (arquivo > salvar cena/arquivo > salvar projeto).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capítulo 3 – configuração principal da câmeraChapter 3 – Main Camera setup

Importante

Se você quiser ignorar o componente de configuração do Unity deste curso e continuar diretamente no código, fique à vontade para baixar esse . unitypackage, importe-o para seu projeto como um pacote personalizadoe, em seguida, continue no 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. No painel hierarquia, selecione a câmera principal.In the Hierarchy Panel, select the Main Camera.

  2. Depois de selecionado, você poderá ver todos os componentes da câmera principal no painel Inspetor.Once selected, you will be able to see all the components of the Main Camera in the Inspector Panel.

    1. O objeto de câmera deve ser nomeado como a câmera principal (Observe a grafia!)The Camera object must be named Main Camera (note the spelling!)

    2. A marca da câmera principal deve ser definida como MainCamera (Observe a ortografia!)The Main Camera Tag must be set to MainCamera (note the spelling!)

    3. Verifique se a posição de transformação está definida como 0, 0, 0Make sure the Transform Position is set to 0, 0, 0

    4. Defina limpar sinalizadores como cor sólida (ignore isto para fone de ouvido de imersão).Set Clear Flags to Solid Color (ignore this for immersive headset).

    5. Defina a cor do plano de fundo do componente da câmera como preto, alfa 0 (código hex: #00000000) (ignorar isso para headsets de imersão).Set the Background Color of the Camera Component to Black, Alpha 0 (Hex Code: #00000000) (ignore this for immersive headset).

      Atualize os componentes da câmera.

  3. Em seguida, você precisará criar um objeto "cursor" simples anexado à câmera principal, o que ajudará a posicionar a saída da análise de imagem quando o aplicativo estiver em execução.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. Esse cursor determinará o ponto central do foco da câmera.This Cursor will determine the center point of the camera focus.

Para criar o cursor:To create the Cursor:

  1. No painel hierarquia, clique com o botão direito do mouse na câmera principal.In the Hierarchy Panel, right-click on the Main Camera. Em objeto 3D, clique em esfera.Under 3D Object, click on Sphere.

    Selecione o objeto de cursor.

  2. Renomeie a esfera para cursor (clique duas vezes no objeto de cursor ou pressione o botão de teclado "F2" com o objeto selecionado) e verifique se ele está localizado como filho da câmera 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. No painel hierarquia, clique com o botão esquerdo do cursor.In the Hierarchy Panel, left click on the Cursor. Com o cursor selecionado, ajuste as seguintes variáveis no painel Inspetor:With the Cursor selected, adjust the following variables in the Inspector Panel:

    1. Defina a posição de transformação como 0, 0, 5Set the Transform Position to 0, 0, 5

    2. Defina a escala como 0, 2, 0, 2, 0, 2Set the Scale to 0.02, 0.02, 0.02

      Atualize a posição e a escala de transformação.

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

Depois de capturar uma imagem com a câmera do HoloLens, essa imagem será enviada para a instância do serviço de API da pesquisa Visual computacional do Azure para análise.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.

Os resultados dessa análise serão uma lista de objetos reconhecidos chamados marcas.The results of that analysis will be a list of recognized objects called Tags.

Você usará rótulos (como um texto 3D no espaço de mundo) para exibir essas marcas no local em que a foto foi tirada.You will use Labels (as a 3D text in world space) to display these Tags at the location the photo was taken.

As etapas a seguir mostrarão como configurar o objeto Label .The following steps will show how to setup the Label object.

  1. Clique com o botão direito do mouse em qualquer lugar no painel hierarquia (o local não importa nesse ponto), em objeto 3D, adicione um texto 3D.Right-click anywhere in the Hierarchy Panel (the location does not matter at this point), under 3D Object, add a 3D Text. Nomeie-o como LabelText.Name it LabelText.

    Criar objeto de texto 3D.

  2. No painel hierarquia, clique no botão esquerdo do LabelText.In the Hierarchy Panel, left click on the LabelText. Com o LabelText selecionado, ajuste as seguintes variáveis no painel Inspetor:With the LabelText selected, adjust the following variables in the Inspector Panel:

    1. Defina a posição como 0, 0, 0Set the Position to 0,0,0
    2. Defina a escala como 0, 1, 0, 1, 0, 1Set the Scale to 0.01, 0.01, 0.01
    3. Na malha de texto do componente:In the component Text Mesh:
    4. Substituir todo o texto no texto, por "..."Replace all the text within Text, with "..."
    5. Definir a âncora para o Centro centralSet the Anchor to Middle Center
    6. Definir o alinhamento como centralizadoSet the Alignment to Center
    7. Defina o tamanho da guia como 4Set the Tab Size to 4
    8. Defina o tamanho da fonte como 50Set the Font Size to 50
    9. Defina a cor como #FFFFFFFFSet the Color to #FFFFFFFF

    Componente de texto

  3. Arraste o LabelText do painel hierarquia para a pasta ativo, dentro do painel Projeto.Drag the LabelText from the Hierarchy Panel, into the Asset Folder, within in the Project Panel. Isso fará com que o LabelText um pré-fabricado, para que possa ser instanciado no código.This will make the LabelText a Prefab, so that it can be instantiated in code.

    Crie um pré-fabricado do objeto LabelText.

  4. Você deve excluir o LabelText do painel hierarquia, de modo que ele não será exibido na cena de abertura.You should delete the LabelText from the Hierarchy Panel, so that it will not be displayed in the opening scene. Como agora é um pré-fabricado, que você chamará para instâncias individuais da sua pasta de ativos, não há necessidade de mantê-la dentro da cena.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. A estrutura final do objeto no painel hierarquia deve ser parecida com a mostrada na imagem abaixo:The final object structure in the Hierarchy Panel should be like the one shown in the image below:

    Estrutura final do painel de hierarquia.

Capítulo 5 – criar a classe ResultsLabelChapter 5 – Create the ResultsLabel class

O primeiro script que você precisa criar é a classe ResultsLabel , que é responsável pelo seguinte:The first script you need to create is the ResultsLabel class, which is responsible for the following:

  • Criando os rótulos no espaço do mundo apropriado, em relação à posição da câmera.Creating the Labels in the appropriate world space, relative to the position of the Camera.
  • Exibindo as marcas da imagem Analysis.Displaying the Tags from the Image Anaysis.

Para criar esta classe:To create this class:

  1. Clique com o botão direito do mouse no painel Projeto e crie > pasta.Right-click in the Project Panel, then Create > Folder. Nomeie a pasta scripts.Name the folder Scripts.

    Criar pasta de scripts.

  2. Com a pasta scripts Create, clique duas vezes nela para abrir.With the Scripts folder create, double click it to open. Em seguida, dentro dessa pasta, clique com o botão direito do mouse e selecione criar > em seguida script C#.Then within that folder, right-click, and select Create > then C# Script. Nomeie o script ResultsLabel.Name the script ResultsLabel.

  3. Clique duas vezes no novo script ResultsLabel para abri-lo com o Visual Studio.Double click on the new ResultsLabel script to open it with Visual Studio.

  4. Dentro da classe, insira o seguinte código na classe 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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  6. De volta ao Editor do Unity, clique e arraste a classe ResultsLabel da pasta scripts para o objeto da câmera principal no painel hierarquia.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. Clique na câmera principal e examine o painel Inspetor.Click on the Main Camera and look at the Inspector Panel.

Você observará que, a partir do script que acabou de arrastar para a câmera, há dois campos: cursor e Label pré-fabricado.You will notice that from the script you just dragged into the Camera, there are two fields: Cursor and Label Prefab.

  1. Arraste o objeto chamado cursor do painel hierarquia para o slot chamado cursor, conforme mostrado na imagem abaixo.Drag the object called Cursor from the Hierarchy Panel to the slot named Cursor, as shown in the image below.

  2. Arraste o objeto chamado LabelText da pasta ativos no painel Projeto para o slot chamado rótulo pré-fabricado, conforme mostrado na imagem abaixo.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.

    Defina os destinos de referência no Unity.

Capítulo 6 – criar a classe ImageCaptureChapter 6 – Create the ImageCapture class

A próxima classe que você vai criar é a classe ImageCapture .The next class you are going to create is the ImageCapture class. Essa classe é responsável por:This class is responsible for:

  • Capturando uma imagem usando a câmera do HoloLens e armazenando-a na pasta do aplicativo.Capturing an Image using the HoloLens Camera and storing it in the App Folder.
  • Capturando gestos de toque do usuário.Capturing Tap gestures from the user.

Para criar esta classe:To create this class:

  1. Vá para a pasta scripts que você criou anteriormente.Go to the Scripts folder you created previously.

  2. Clique com o botão direito do mouse dentro da pasta, crie > script C#.Right-click inside the folder, Create > C# Script. Chame o script ImageCapture.Call the script ImageCapture.

  3. Clique duas vezes no novo script ImageCapture para abri-lo com o Visual Studio.Double click on the new ImageCapture script to open it with Visual Studio.

  4. Adicione os seguintes namespaces à parte superior do arquivo: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. Em seguida, adicione as seguintes variáveis dentro da classe ImageCapture , acima do 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;
    

A variável tapsCount armazenará o número de gestos de toque capturados do usuário.The tapsCount variable will store the number of tap gestures captured from the user. Esse número é usado na nomenclatura das imagens capturadas.This number is used in the naming of the images captured.

  1. O código para os métodos ativo () e Iniciar () agora precisa ser adicionado.Code for Awake() and Start() methods now needs to be added. Eles serão chamados quando a classe for inicializada: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 um manipulador que será chamado quando ocorrer um gesto de toque.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();
            }
        }
    

O método TapHandler () incrementa o número de toques capturados do usuário e usa a posição atual do cursor para determinar onde posicionar um novo rótulo.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.

Esse método chama o método ExecuteImageCaptureAndAnalysis () para iniciar a funcionalidade principal deste aplicativo.This method then calls the ExecuteImageCaptureAndAnalysis() method to begin the core functionality of this application.

  1. Depois que uma imagem for capturada e armazenada, os seguintes manipuladores serão chamados.Once an Image has been captured and stored, the following handlers will be called. Se o processo for bem-sucedido, o resultado será passado para o visionmanager (que você ainda deseja criar) para análise.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. Em seguida, adicione o método que o aplicativo usa para iniciar o processo de captura de imagem e armazenar a imagem.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;
                });   
            });    
        }
    

Aviso

Neste ponto, você observará um erro exibido no painel de console do editor do Unity.At this point you will notice an error appearing in the Unity Editor Console Panel. Isso ocorre porque o código faz referência à classe visionmanager que você criará no próximo capítulo.This is because the code references the VisionManager class which you will create in the next Chapter.

Capítulo 7 – chamar o Azure e a análise de imagemChapter 7 – Call to Azure and Image Analysis

O último script que você precisa criar é a classe visionmanager .The last script you need to create is the VisionManager class.

Essa classe é responsável por:This class is responsible for:

  • Carregando a imagem mais recente capturada como uma matriz de bytes.Loading the latest image captured as an array of bytes.
  • Enviando a matriz de bytes para a instância do serviço de API da pesquisa Visual computacional do Azure para análise.Sending the byte array to your Azure Computer Vision API Service instance for analysis.
  • Recebendo a resposta como uma cadeia de caracteres JSON.Receiving the response as a JSON string.
  • Desserializar a resposta e passar as marcas resultantes para a classe ResultsLabel .Deserializing the response and passing the resulting Tags to the ResultsLabel class.

Para criar esta classe:To create this class:

  1. Clique duas vezes na pasta scripts para abri-la.Double click on the Scripts folder, to open it.

  2. Clique com o botão direito do mouse na pasta scripts , clique em criar > script C#.Right-click inside the Scripts folder, click Create > C# Script. Nomeie o script visionmanager.Name the script VisionManager.

  3. Clique duas vezes no novo script para abri-lo com o Visual Studio.Double click on the new script to open it with Visual Studio.

  4. Atualize os namespaces para que sejam iguais aos seguintes, na parte superior da classe 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. Na parte superior do seu script, dentro da classe visionmanager (acima do método Start () ), agora você precisa criar duas classes que irão representar a resposta JSON desserializada do 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;
        }
    

    Observação

    As classes TagData e AnalysedObject precisam ter o atributo [System. Serializable] adicionado antes que a declaração possa ser desserializada com as bibliotecas do 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. Na classe Visionmanager, você deve adicionar as seguintes variáveis: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;
    

    Aviso

    Certifique-se de inserir sua chave de autenticação na variável authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable. Você terá anotado sua chave de autenticação no início deste curso, capítulo 1.You will have noted your Auth Key at the beginning of this course, Chapter 1.

    Aviso

    A variável visionAnalysisEndpoint pode ser diferente da especificada neste exemplo.The visionAnalysisEndpoint variable might differ from the one specified in this example. O oeste-US se refere estritamente a instâncias de serviço criadas para a região oeste dos EUA.The west-us strictly refers to Service instances created for the West US region. Atualize isso com a URL do ponto de extremidade; Aqui estão alguns exemplos de como isso pode ser:Update this with your endpoint URL; here are some examples of what that might look like:

    • Europa Ocidental: 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 da Ásia: 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
    • Leste da Austrália: 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. O código para ativo agora precisa ser adicionado.Code for Awake now needs to be added.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Em seguida, adicione a corrotina (com o método de fluxo estático abaixo dela), que obterá os resultados da análise da imagem capturada pela classe 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. Certifique-se de salvar suas alterações no Visual Studio antes de retornar ao Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  10. De volta ao editor do Unity, clique e arraste as classes visionmanager e ImageCapture da pasta scripts para o objeto da câmera principal no painel hierarquia.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 executar um teste completo de seu aplicativo, você precisará Sideload-lo no seu HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Antes de fazer isso, verifique se:Before you do, ensure that:

  • Todas as configurações mencionadas no capítulo 2 estão definidas corretamente.All the settings mentioned in Chapter 2 are set correctly.
  • Todos os scripts são anexados ao objeto da câmera principal .All the scripts are attached to the Main Camera object.
  • Todos os campos no painel principal do Inspetor de câmera são atribuídos corretamente.All the fields in the Main Camera Inspector Panel are assigned properly.
  • Certifique-se de inserir sua chave de autenticação na variável authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable.
  • Verifique se você também verificou seu ponto de extremidade em seu script do visionmanager e se ele está alinhado à sua região (este documento usa o Oeste-EUA por padrão).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 – criar a solução UWP e sideloadr o aplicativoChapter 9 – Build the UWP Solution and sideload the application

Tudo o que é necessário para a seção do Unity deste projeto foi concluído, portanto, é hora de compilá-lo a partir do Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Navegue até criar configurações - arquivo > configurações de Build...Navigate to Build Settings - File > Build Settings…

  2. Na janela configurações de compilação , clique em Compilar.From the Build Settings window, click Build.

    Compilando o aplicativo do Unity

  3. Se ainda não estiver, projetos do Tick Unity C#.If not already, tick Unity C# Projects.

  4. Clique em Compilar.Click Build. O Unity iniciará uma janela Explorador de arquivos , onde você precisará criar e, em seguida, selecionar uma pasta na qual o aplicativo será compilado.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Crie essa pasta agora e nomeie-a como aplicativo.Create that folder now, and name it App. Em seguida, com a pasta de aplicativo selecionada, pressione Selecionar pasta.Then with the App folder selected, press Select Folder.

  5. O Unity começará a criar seu projeto na pasta do aplicativo .Unity will begin building your project to the App folder.

  6. Depois que o Unity terminar a compilação (pode levar algum tempo), ele abrirá uma janela do Explorador de arquivos no local de sua compilação (verifique sua barra de tarefas, pois ela nem sempre aparecerá acima das janelas, mas o notificará sobre a adição de uma nova janela).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 – implantar no HoloLensChapter 10 – Deploy to HoloLens

Para implantar no HoloLens:To deploy on HoloLens:

  1. Você precisará do endereço IP do seu HoloLens (para implantação remota) e para garantir que seu HoloLens esteja no modo de desenvolvedor.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Para fazer isso:To do this:

    1. Enquanto estiver desgastando seu HoloLens, abra as configurações.Whilst wearing your HoloLens, open the Settings.
    2. Vá para rede & Internet > Wi-Fi > opções avançadasGo to Network & Internet > Wi-Fi > Advanced Options
    3. Anote o endereço IPv4 .Note the IPv4 address.
    4. Em seguida, navegue de volta para configurações e, em seguida, atualize & > de segurança para desenvolvedoresNext, navigate back to Settings, and then to Update & Security > For Developers
    5. Defina o modo de desenvolvedor em.Set Developer Mode On.
  2. Navegue até sua nova compilação do Unity (a pasta do aplicativo ) e abra o arquivo de solução com o Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. Na configuração da solução, selecione depurar.In the Solution Configuration select Debug.

  4. Na plataforma da solução, selecione x86, computador remoto.In the Solution Platform, select x86, Remote Machine.

    Implante a solução do Visual Studio.

  5. Vá para o menu Compilar e clique em implantar solução para Sideload o aplicativo ao seu HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. Seu aplicativo agora deve aparecer na lista de aplicativos instalados em seu HoloLens, pronto para ser iniciado!Your App should now appear in the list of installed apps on your HoloLens, ready to be launched!

Observação

Para implantar em headsets de imersão, defina a plataforma da solução como computador local e defina a configuração a ser depurada, com x86 como a plataforma.To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. Em seguida, implante no computador local, usando o menu Compilar, selecionando implantar solução.Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Seu aplicativo API da Pesquisa Visual Computacional concluídoYour finished Computer Vision API application

Parabéns, você criou um aplicativo de realidade misturada que aproveita a API da Pesquisa Visual Computacional do Azure para reconhecer objetos do mundo real e exibir a confiança do que foi visto.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 do laboratório

Exercícios de bônusBonus exercises

Exercício 1Exercise 1

Assim como você usou o parâmetro Tags (como evidenciado no ponto de extremidade usado no visionmanager), estenda o aplicativo para detectar outras informações; Veja a quais outros parâmetros você tem acesso aqui.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.

Exercício 2Exercise 2

Exiba os dados do Azure retornados, de forma mais conversada e legível, talvez ocultando os números.Display the returned Azure data, in a more conversational, and readable way, perhaps hiding the numbers. Embora um bot possa estar falando para o usuário.As though a bot might be speaking to the user.