MR e Azure 302: Visione artificialeMR and Azure 302: Computer vision


Nota

Le esercitazioni di Mixed Reality Academy sono state progettate in base a HoloLens (prima generazione) e ai visori VR immersive di realtà mista.The Mixed Reality Academy tutorials were designed with HoloLens (1st gen) and Mixed Reality Immersive Headsets in mind. Pertanto, riteniamo importante lasciarle a disposizione degli sviluppatori a cui serve ancora materiale sussidiario per lo sviluppo di questi dispositivi.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. Queste esercitazioni non verranno aggiornate con i set di strumenti o le interazioni più recenti usati per HoloLens 2.These tutorials will not be updated with the latest toolsets or interactions being used for HoloLens 2. Rimarranno invariate per consentire di continuare a lavorare sui dispositivi supportati.They will be maintained to continue working on the supported devices. In futuro sarà disponibile una nuova serie di esercitazioni che illustrano come sviluppare per 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. Questo avviso verrà aggiornato con un collegamento a queste esercitazioni quando vengono pubblicate.This notice will be updated with a link to those tutorials when they are posted.


In questo corso si apprenderà come riconoscere il contenuto visivo in un'immagine fornita, usando le funzionalità di Visione artificiale di Azure in un'applicazione di realtà mista.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.

I risultati del riconoscimento verranno visualizzati come tag descrittivi.Recognition results will be displayed as descriptive tags. È possibile usare questo servizio senza dover eseguire il training di un modello di machine learning.You can use this service without needing to train a machine learning model. Se l'implementazione richiede il training di un modello di apprendimento automatico, vedere Mr e Azure 302B.If your implementation requires training a machine learning model, see MR and Azure 302b.

risultato Lab

Microsoft Visione artificiale è un set di API progettate per fornire agli sviluppatori l'elaborazione e l'analisi delle immagini (con informazioni di ritorno), usando algoritmi avanzati, dal cloud.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. Gli sviluppatori caricano un URL di immagine o immagine e gli algoritmi di Microsoft API Visione artificiale analizzano il contenuto visivo, in base agli input scelti dall'utente, che possono quindi restituire informazioni, tra cui l'identificazione del tipo e della qualità di un'immagine, il rilevamento dei visi umani (restituendo le coordinate) e l'assegnazione di tag o la categorizzazione di immagini.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. Per ulteriori informazioni, visitare la pagina API visione artificiale di Azure.For more information, visit the Azure Computer Vision API page.

Dopo aver completato questo corso, si disporrà di un'applicazione HoloLens in realtà mista, che sarà in grado di eseguire le operazioni seguenti:Having completed this course, you will have a mixed reality HoloLens application, which will be able to do the following:

  1. Usando il gesto Tap, la fotocamera del HoloLens acquisirà un'immagine.Using the Tap gesture, the camera of the HoloLens will capture an image.
  2. L'immagine verrà inviata al servizio API Visione artificiale di Azure.The image will be sent to the Azure Computer Vision API Service.
  3. Gli oggetti riconosciuti saranno elencati in un gruppo di interfaccia utente semplice posizionato nella scena Unity.The objects recognized will be listed in a simple UI group positioned in the Unity Scene.

Nell'applicazione, spetta all'utente come integrare i risultati con la progettazione.In your application, it is up to you as to how you will integrate the results with your design. Questo corso è stato progettato per insegnare come integrare un servizio di Azure con il progetto Unity.This course is designed to teach you how to integrate an Azure Service with your Unity project. Per migliorare l'applicazione di realtà mista, è compito dell'utente sfruttare le conoscenze acquisite in questo corso.It is your job to use the knowledge you gain from this course to enhance your mixed reality application.

Supporto di dispositiviDevice support

CorsoCourse HoloLensHoloLens Visori VR immersiveImmersive headsets
MR e Azure 302: Visione artificialeMR and Azure 302: Computer vision ✔️✔️ ✔️✔️

Nota

Sebbene questo corso sia incentrato principalmente su HoloLens, è anche possibile applicare le informazioni apprese in questo corso agli auricolari per la realtà mista (VR) di 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. Poiché le cuffie immersive (VR) non hanno fotocamere accessibili, sarà necessaria una fotocamera esterna connessa al PC.Because immersive (VR) headsets do not have accessible cameras, you will need an external camera connected to your PC. Seguendo le istruzioni riportate in questo corso, vengono visualizzate le note sulle eventuali modifiche che potrebbero essere necessarie per supportare gli auricolari immersivi (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.

PrerequisitiPrerequisites

Nota

Questa esercitazione è progettata per gli sviluppatori che hanno esperienza di base con Unity e C#.This tutorial is designed for developers who have basic experience with Unity and C#. Tenere inoltre presente che i prerequisiti e le istruzioni scritte in questo documento rappresentano gli elementi testati e verificati al momento della stesura del documento (maggio 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). È possibile utilizzare il software più recente, come indicato nell'articolo installare gli strumenti , ma non si presuppone che le informazioni in questo corso corrispondano perfettamente a quelle disponibili nel software più recente rispetto a quanto indicato di seguito.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.

Per questo corso è consigliabile usare i componenti hardware e software seguenti:We recommend the following hardware and software for this course:

Prima di iniziareBefore you start

  1. Per evitare che si verifichino problemi durante la compilazione di questo progetto, è consigliabile creare il progetto indicato in questa esercitazione in una cartella radice o quasi radice (i percorsi di cartella lunghi possono causare problemi in fase di compilazione).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. Configurare e testare il HoloLens.Set up and test your HoloLens. Se è necessario supporto per la configurazione di HoloLens, vedere l'articolo relativo alla configurazione di HoloLens.If you need support setting up your HoloLens, make sure to visit the HoloLens setup article.
  3. Quando si inizia a sviluppare una nuova app HoloLens, è consigliabile eseguire la taratura e l'ottimizzazione dei sensori, a volte può essere utile per eseguire queste attività per ogni utente.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).

Per informazioni sulla calibrazione, seguire questo collegamento all'articolo relativo alla calibrazione di HoloLens.For help on Calibration, please follow this link to the HoloLens Calibration article.

Per informazioni sull'ottimizzazione dei sensori, seguire questo collegamento all'articolo relativo all'ottimizzazione del sensore HoloLens.For help on Sensor Tuning, please follow this link to the HoloLens Sensor Tuning article.

Capitolo 1: portale di AzureChapter 1 – The Azure Portal

Per usare il servizio API visione artificiale in Azure, sarà necessario configurare un'istanza del servizio da rendere disponibile per l'applicazione.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. Per prima cosa, accedere al portale di Azure.First, log in to the Azure Portal.

    Nota

    Se non si dispone già di un account Azure, sarà necessario crearne uno.If you do not already have an Azure account, you will need to create one. Se si segue questa esercitazione in una classe o in una situazione di laboratorio, rivolgersi all'insegnante o a uno dei Proctor per ottenere assistenza nella configurazione del nuovo account.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 volta effettuato l'accesso, fare clic su nuovo nell'angolo in alto a sinistra e cercare API visione artificiale e premere invio.Once you are logged in, click on New in the top left corner, and search for Computer Vision API, and click Enter.

    Creare una nuova risorsa in Azure

    Nota

    La parola New potrebbe essere stata sostituita con Crea una risorsa, nei portali più recenti.The word New may have been replaced with Create a resource, in newer portals.

  3. La nuova pagina fornirà una descrizione del servizio API visione artificiale .The new page will provide a description of the Computer Vision API service. Nella parte inferiore sinistra della pagina selezionare il pulsante Crea per creare un'associazione con il servizio.At the bottom left of this page, select the Create button, to create an association with this service.

    Informazioni sul servizio API visione artificiale

  4. Una volta fatto clic su Crea:Once you have clicked on Create:

    1. Inserire il nome desiderato per l'istanza del servizio.Insert your desired Name for this service instance.

    2. Selezionare una Sottoscrizione.Select a Subscription.

    3. Selezionare il piano tariffario appropriato. se è la prima volta che si crea un servizio di API visione artificiale , è necessario che sia disponibile un livello gratuito (denominato 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. Scegliere un gruppo di risorse o crearne uno nuovo.Choose a Resource Group or create a new one. Un gruppo di risorse consente di monitorare, controllare l'accesso, effettuare il provisioning e gestire la fatturazione per una raccolta di asset di Azure.A resource group provides a way to monitor, control access, provision and manage billing for a collection of Azure assets. Si consiglia di lasciare tutti i servizi di Azure associati a un singolo progetto (ad esempio questi Lab) in un gruppo di risorse comune).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).

      Per altre informazioni sui gruppi di risorse di Azure, vedere l'articolo relativo al gruppo di risorse.If you wish to read more about Azure Resource Groups, please visit the resource group article.

    5. Determinare il percorso del gruppo di risorse (se si sta creando un nuovo gruppo di risorse).Determine the Location for your resource group (if you are creating a new Resource Group). Il percorso dovrebbe trovarsi idealmente nell'area in cui verrà eseguita l'applicazione.The location would ideally be in the region where the application would run. Alcune risorse di Azure sono disponibili solo in determinate aree geografiche.Some Azure assets are only available in certain regions.

    6. Sarà inoltre necessario confermare di aver compreso i termini e le condizioni applicati a questo servizio.You will also need to confirm that you have understood the Terms and Conditions applied to this Service.

    7. Fare clic su Crea.Click Create.

      Informazioni sulla creazione del servizio

  5. Una volta fatto clic su Crea, sarà necessario attendere il completamento della creazione del servizio. l'operazione potrebbe richiedere 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. Dopo la creazione dell'istanza del servizio, verrà visualizzata una notifica nel portale.A notification will appear in the portal once the Service instance is created.

    Visualizza la nuova notifica per il nuovo servizio

  7. Fare clic sulla notifica per esplorare la nuova istanza del servizio.Click on the notification to explore your new Service instance.

    Selezionare il pulsante Vai alla risorsa.

  8. Fare clic sul pulsante Vai alla risorsa nella notifica per esplorare la nuova istanza del servizio.Click the Go to resource button in the notification to explore your new Service instance. Si verrà portati alla nuova istanza del servizio API Visione artificiale.You will be taken to your new Computer Vision API service instance.

    Nuova immagine del servizio API Visione artificiale

  9. All'interno di questa esercitazione, l'applicazione dovrà effettuare chiamate al servizio, operazione eseguita usando la chiave di sottoscrizione del servizio.Within this tutorial, your application will need to make calls to your service, which is done through using your service’s Subscription Key.

  10. Dalla pagina avvio rapido del servizio API visione artificiale passare al primo passaggio, selezionare le chiavi e fare clic su chiavi . a tale scopo, fare clic sui tasti di collegamento ipertestuale blu, che si trovano nel menu di navigazione dei servizi, indicato dall'icona a forma di chiave.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). Le chiavi del servizio vengono rivelate.This will reveal your service Keys.

  11. Eseguire una copia di una delle chiavi visualizzate, perché sarà necessario in un secondo momento nel progetto.Take a copy of one of the displayed keys, as you will need this later in your project.

  12. Tornare alla pagina avvio rapido e, da qui, recuperare l'endpoint.Go back to the Quick start page, and from there, fetch your endpoint. Tenere presente che l'utente può essere diverso, a seconda dell'area geografica (in questo caso, sarà necessario apportare una modifica al codice in un secondo momento).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). Eseguire una copia di questo endpoint per usarlo in seguito:Take a copy of this endpoint for use later:

    Il nuovo servizio API Visione artificiale

    Suggerimento

    È possibile controllare quali sono i vari endpoint.You can check what the various endpoints are HERE.

Capitolo 2: configurare il progetto UnityChapter 2 – Set up the Unity project

Di seguito è riportata una configurazione tipica per lo sviluppo con realtà mista e, di conseguenza, un modello valido per altri progetti.The following is a typical set up for developing with mixed reality, and as such, is a good template for other projects.

  1. Aprire Unity e fare clic su New.Open Unity and click New.

    Avviare un nuovo progetto Unity.

  2. A questo punto sarà necessario specificare un nome di progetto Unity.You will now need to provide a Unity Project name. Inserire MR_ComputerVision.Insert MR_ComputerVision. Verificare che il tipo di progetto sia impostato su 3D.Make sure the project type is set to 3D. Impostare il percorso su un punto appropriato (ricordare che più vicino alle directory radice è migliore).Set the Location to somewhere appropriate for you (remember, closer to root directories is better). Fare quindi clic su Crea progetto.Then, click Create project.

    Specificare i dettagli per il nuovo progetto Unity.

  3. Con Unity aperto, vale la pena controllare che l' editor di script predefinito sia impostato su Visual Studio.With Unity open, it is worth checking the default Script Editor is set to Visual Studio. Passare a Modifica preferenze > e quindi dalla nuova finestra passare a strumenti esterni.Go to Edit > Preferences and then from the new window, navigate to External Tools. Modificare l' editor di script esterno in Visual Studio 2017.Change External Script Editor to Visual Studio 2017. Chiudere la finestra delle Preferenze .Close the Preferences window.

    Aggiornare la preferenza dell'editor di script.

  4. Passare quindi a File > impostazioni di compilazione e selezionare piattaforma UWP (Universal Windows Platform), quindi fare clic sul pulsante Cambia piattaforma per applicare la selezione.Next, go to File > Build Settings and select Universal Windows Platform, then click on the Switch Platform button to apply your selection.

    Finestra impostazioni di compilazione, passa alla piattaforma UWP.

  5. Sempre in File > impostazioni di compilazione e verificare che:While still in File > Build Settings and make sure that:

    1. Il dispositivo di destinazione è impostato su HoloLensTarget Device is set to HoloLens

      Per gli auricolari immersivi, impostare dispositivo di destinazione su qualsiasi dispositivo.For the immersive headsets, set Target Device to Any Device.

    2. Il tipo di compilazione è impostato su D3DBuild Type is set to D3D

    3. SDK è impostato sull' ultima versione installataSDK is set to Latest installed

    4. La versione di Visual Studio è impostata su installazione più recenteVisual Studio Version is set to Latest installed

    5. Compilazione ed esecuzione è impostato su computer localeBuild and Run is set to Local Machine

    6. Salvare la scena e aggiungerla alla compilazione.Save the scene and add it to the build.

      1. A tale scopo, selezionare Aggiungi scene aperte.Do this by selecting Add Open Scenes. Verrà visualizzata una finestra Salva.A save window will appear.

        Fare clic sul pulsante Aggiungi scene aperte

      2. Creare una nuova cartella per questo e per eventuali scenari futuri, quindi selezionare il pulsante nuova cartella per creare una nuova cartella , assegnarle un nome.Create a new folder for this, and any future, scene, then select the New folder button, to create a new folder, name it Scenes.

        Crea nuova cartella script

      3. Aprire la cartella Scenes appena creata e quindi nel campo nome file: testo digitare MR_ComputerVisionScene e quindi fare clic su Salva.Open your newly created Scenes folder, and then in the File name: text field, type MR_ComputerVisionScene, then click Save.

        Assegnare un nome alla nuova scena.

        Tenere presente che è necessario salvare le scene Unity all'interno della cartella assets , in quanto devono essere associate al progetto Unity.Be aware, you must save your Unity scenes within the Assets folder, as they must be associated with the Unity Project. La creazione della cartella scenes (e di altre cartelle simili) è un modo tipico per strutturare un progetto Unity.Creating the scenes folder (and other similar folders) is a typical way of structuring a Unity project.

    7. Le impostazioni rimanenti, nelle impostazioni di compilazione, devono essere lasciate come predefinite per il momento.The remaining settings, in Build Settings, should be left as default for now.

  6. Nella finestra impostazioni di compilazione fare clic sul pulsante Impostazioni lettore . verrà aperto il pannello correlato nello spazio in cui si trova il controllo .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.

    Aprire le impostazioni del lettore.

  7. In questo pannello è necessario verificare alcune impostazioni:In this panel, a few settings need to be verified:

    1. Nella scheda altre impostazioni :In the Other Settings tab:

      1. La versione di runtime di scripting deve essere stabile (equivalente a .NET 3,5).Scripting Runtime Version should be Stable (.NET 3.5 Equivalent).

      2. Il back-end di scripting deve essere .NETScripting Backend should be .NET

      3. Il livello di compatibilità API deve essere .NET 4,6API Compatibility Level should be .NET 4.6

        Aggiornare altre impostazioni.

    2. Nella scheda impostazioni di pubblicazione , in funzionalità, selezionare:Within the Publishing Settings tab, under Capabilities, check:

      1. InternetClientInternetClient

      2. WebcamWebcam

        Aggiornamento delle impostazioni di pubblicazione.

    3. Nella parte inferiore del pannello, nelle impostazioni di XR (disponibili sotto le impostazioni di pubblicazione), verificare la realtà virtuale supportata, verificare che sia stato aggiunto Windows Mixed Reality SDK .Further down the panel, in XR Settings (found below Publish Settings), tick Virtual Reality Supported, make sure the Windows Mixed Reality SDK is added.

      Aggiornare le impostazioni X R.

  8. Nelle impostazioni di compilazione i progetti C# non sono più disattivati; Selezionare la casella di controllo accanto a questo.Back in Build Settings Unity C# Projects is no longer greyed out; tick the checkbox next to this.

  9. Chiudere la finestra Build Settings (Impostazioni di compilazione).Close the Build Settings window.

  10. Salvare la scena e il progetto (file > Salva scena/file > Salva progetto).Save your Scene and Project (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Capitolo 3-configurazione della fotocamera principaleChapter 3 – Main Camera setup

Importante

Se si desidera ignorare il componente di configurazione di Unity di questo corso e continuare direttamente con il codice, è possibile scaricarlo . file unitypackage Tools, importarlo nel progetto come pacchetto personalizzatoe continuare dal capitolo 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. Nel Pannello gerarchia selezionare la fotocamera principale.In the Hierarchy Panel, select the Main Camera.

  2. Una volta selezionato, sarà possibile visualizzare tutti i componenti della fotocamera principale nel Pannello di controllo.Once selected, you will be able to see all the components of the Main Camera in the Inspector Panel.

    1. L' oggetto fotocamera deve essere denominato Main camera (nota l'ortografia).The Camera object must be named Main Camera (note the spelling!)

    2. Il tag della fotocamera principale deve essere impostato su MainCamera (si noti l'ortografia).The Main Camera Tag must be set to MainCamera (note the spelling!)

    3. Assicurarsi che la posizione di trasformazione sia impostata su 0, 0, 0Make sure the Transform Position is set to 0, 0, 0

    4. Impostare Cancella flag su colore a tinta unita (ignorarlo per l'auricolare immersivo).Set Clear Flags to Solid Color (ignore this for immersive headset).

    5. Imposta il colore di sfondo del componente della fotocamera su nero, alfa 0 (codice esadecimale: #00000000) (ignorarlo per l'auricolare immersivo).Set the Background Color of the Camera Component to Black, Alpha 0 (Hex Code: #00000000) (ignore this for immersive headset).

      Aggiornare i componenti della fotocamera.

  3. Sarà quindi necessario creare un oggetto "Cursor" semplice collegato alla fotocamera principale, che consentirà di posizionare l'output dell'analisi dell'immagine quando l'applicazione è in esecuzione.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. Questo cursore determina il punto centrale dello stato attivo della fotocamera.This Cursor will determine the center point of the camera focus.

Per creare il cursore:To create the Cursor:

  1. Nel Pannello gerarchia, fare clic con il pulsante destro del mouse sulla fotocamera principale.In the Hierarchy Panel, right-click on the Main Camera. In oggetto 3D fare clic su sfera.Under 3D Object, click on Sphere.

    Selezionare l'oggetto cursore.

  2. Rinominare la sfera in cursore (fare doppio clic sull'oggetto cursore o premere il pulsante della tastiera "F2" con l'oggetto selezionato) e verificare che sia posizionato come figlio della fotocamera principale.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. Nel Pannello gerarchia, fare clic sul cursore.In the Hierarchy Panel, left click on the Cursor. Con il cursore selezionato, modificare le variabili seguenti nel Pannello di controllo:With the Cursor selected, adjust the following variables in the Inspector Panel:

    1. Impostare la posizione di trasformazione su 0, 0, 5Set the Transform Position to 0, 0, 5

    2. Impostare la scala su 0,02, 0,02, 0,02Set the Scale to 0.02, 0.02, 0.02

      Aggiornare la posizione e la scala della trasformazione.

Capitolo 4: configurare il sistema di etichetteChapter 4 – Setup the Label system

Una volta acquisita un'immagine con la fotocamera HoloLens, tale immagine verrà inviata all'istanza del servizio API visione artificiale di Azure per l'analisi.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.

I risultati di tale analisi saranno un elenco di oggetti riconosciuti chiamati tag.The results of that analysis will be a list of recognized objects called Tags.

Si useranno le etichette (come testo 3D nello spazio globale) per visualizzare questi tag nella posizione in cui è stata eseguita la foto.You will use Labels (as a 3D text in world space) to display these Tags at the location the photo was taken.

Nei passaggi seguenti viene illustrato come configurare l'oggetto Label .The following steps will show how to setup the Label object.

  1. Fare clic con il pulsante destro del mouse in un punto qualsiasi del pannello gerarchia (il percorso non è rilevante a questo punto), in oggetto 3D, aggiungere un testo 3D.Right-click anywhere in the Hierarchy Panel (the location does not matter at this point), under 3D Object, add a 3D Text. Denominarlo LabelText.Name it LabelText.

    Crea oggetto testo 3D.

  2. Nel Pannello gerarchia fare clic su LabelText.In the Hierarchy Panel, left click on the LabelText. Con LabelText selezionato, modificare le variabili seguenti nel pannello di controllo:With the LabelText selected, adjust the following variables in the Inspector Panel:

    1. Imposta la posizione su 0, 0, 0Set the Position to 0,0,0
    2. Impostare la scala su 0,01, 0,01, 0,01Set the Scale to 0.01, 0.01, 0.01
    3. Nella mesh del testo del componente:In the component Text Mesh:
    4. Sostituire tutto il testo all'interno del testo con "..."Replace all the text within Text, with "..."
    5. Imposta l' ancoraggio sul centro centraleSet the Anchor to Middle Center
    6. Impostare l' allineamento al centroSet the Alignment to Center
    7. Imposta la dimensione della tabulazione su 4Set the Tab Size to 4
    8. Imposta la dimensione del carattere su 50Set the Font Size to 50
    9. Imposta il colore su #FFFFFFFFSet the Color to #FFFFFFFF

    Componente testo

  3. Trascinare LabelText dal Pannello gerarchia, nella cartella Asset, all'interno del Pannello Project.Drag the LabelText from the Hierarchy Panel, into the Asset Folder, within in the Project Panel. In questo modo, LabelText viene creato un prefabbricato, in modo che sia possibile crearne un'istanza nel codice.This will make the LabelText a Prefab, so that it can be instantiated in code.

    Creare una prefabbricata dell'oggetto LabelText.

  4. È necessario eliminare il LabelText dal Pannello gerarchia, in modo che non venga visualizzato nella scena di apertura.You should delete the LabelText from the Hierarchy Panel, so that it will not be displayed in the opening scene. Poiché è ora un prefabbricato, che verrà chiamato per le singole istanze dalla cartella assets, non è necessario mantenerlo all'interno della scena.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 struttura dell'oggetto finale nel Pannello gerarchia deve essere simile a quella illustrata nell'immagine seguente:The final object structure in the Hierarchy Panel should be like the one shown in the image below:

    Struttura finale del pannello gerarchia.

Capitolo 5: creare la classe ResultsLabelChapter 5 – Create the ResultsLabel class

Il primo script che è necessario creare è la classe ResultsLabel , responsabile delle operazioni seguenti:The first script you need to create is the ResultsLabel class, which is responsible for the following:

  • Creazione delle etichette nello spazio globale appropriato rispetto alla posizione della camera.Creating the Labels in the appropriate world space, relative to the position of the Camera.
  • Visualizzazione dei tag dall'immagine onerosa.Displaying the Tags from the Image Anaysis.

Per creare questa classe:To create this class:

  1. Fare clic con il pulsante destro del mouse nel Pannello del progetto, quindi creare > cartella.Right-click in the Project Panel, then Create > Folder. Denominare gli script della cartella.Name the folder Scripts.

    Crea cartella script.

  2. Con la cartella Scripts create, fare doppio clic su di essa per aprirla.With the Scripts folder create, double click it to open. Quindi, all'interno di tale cartella, fare clic con il pulsante destro del mouse e selezionare crea > script C#.Then within that folder, right-click, and select Create > then C# Script. Denominare lo script ResultsLabel.Name the script ResultsLabel.

  3. Fare doppio clic sul nuovo script ResultsLabel per aprirlo con Visual Studio.Double click on the new ResultsLabel script to open it with Visual Studio.

  4. All'interno della classe, inserire il codice seguente nella 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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  6. Nell'editor di Unity fare clic e trascinare la classe ResultsLabel dalla cartella Scripts all'oggetto principale della fotocamera nel Pannello gerarchia.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. Fare clic sulla fotocamera principale ed esaminare il pannello Inspector.Click on the Main Camera and look at the Inspector Panel.

Si noterà che dallo script appena trascinato nella fotocamera sono presenti due campi: cursore ed etichetta prefabbricata.You will notice that from the script you just dragged into the Camera, there are two fields: Cursor and Label Prefab.

  1. Trascinare l'oggetto denominato cursore dal Pannello gerarchia nello slot denominato Cursor, come illustrato nell'immagine seguente.Drag the object called Cursor from the Hierarchy Panel to the slot named Cursor, as shown in the image below.

  2. Trascinare l'oggetto denominato LabelText dalla cartella assets nel Pannello Project allo slot denominato Label prefabric, come illustrato nell'immagine seguente.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.

    Impostare le destinazioni di riferimento all'interno di Unity.

Capitolo 6: creare la classe ImageCaptureChapter 6 – Create the ImageCapture class

La classe successiva che si intende creare è la classe ImageCapture .The next class you are going to create is the ImageCapture class. Questa classe è responsabile di:This class is responsible for:

  • Acquisizione di un'immagine con la fotocamera HoloLens e relativa archiviazione nella cartella dell'app.Capturing an Image using the HoloLens Camera and storing it in the App Folder.
  • Acquisizione dei movimenti Tap dall'utente.Capturing Tap gestures from the user.

Per creare questa classe:To create this class:

  1. Passare alla cartella Scripts creata in precedenza.Go to the Scripts folder you created previously.

  2. Fare clic con il pulsante destro del mouse all'interno della cartella, creare > script C#.Right-click inside the folder, Create > C# Script. Chiamare lo script ImageCapture.Call the script ImageCapture.

  3. Fare doppio clic sul nuovo script ImageCapture per aprirlo con Visual Studio.Double click on the new ImageCapture script to open it with Visual Studio.

  4. Aggiungere i seguenti spazi dei nomi all'inizio del file: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. Aggiungere quindi le variabili seguenti all'interno della classe ImageCapture , sopra il metodo 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;
    

Nella variabile tapsCount viene archiviato il numero di movimenti Tap acquisiti dall'utente.The tapsCount variable will store the number of tap gestures captured from the user. Questo numero viene usato per la denominazione delle immagini acquisite.This number is used in the naming of the images captured.

  1. È ora necessario aggiungere il codice per i metodi svegli () e Start () .Code for Awake() and Start() methods now needs to be added. Questi verranno chiamati quando la classe inizializza: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. Implementare un gestore che verrà chiamato quando si verifica un movimento 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();
            }
        }
    

Il metodo TapHandler () incrementa il numero di rubinetti acquisiti dall'utente e utilizza la posizione corrente del cursore per determinare la posizione in cui posizionare una nuova etichetta.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.

Questo metodo chiama quindi il metodo ExecuteImageCaptureAndAnalysis () per avviare la funzionalità di base di questa applicazione.This method then calls the ExecuteImageCaptureAndAnalysis() method to begin the core functionality of this application.

  1. Una volta acquisita e archiviata un'immagine, verranno chiamati i gestori seguenti.Once an Image has been captured and stored, the following handlers will be called. Se il processo ha esito positivo, il risultato viene passato a VisionManager (che è ancora necessario creare) per l'analisi.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. Aggiungere quindi il metodo usato dall'applicazione per avviare il processo di acquisizione dell'immagine e archiviare l'immagine.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;
                });   
            });    
        }
    

Avviso

A questo punto si noterà un errore nel Pannello console dell'editor di Unity.At this point you will notice an error appearing in the Unity Editor Console Panel. Questo perché il codice fa riferimento alla classe VisionManager che verrà creata nel capitolo successivo.This is because the code references the VisionManager class which you will create in the next Chapter.

Capitolo 7-chiamata ad Azure e analisi delle immaginiChapter 7 – Call to Azure and Image Analysis

L'ultimo script che è necessario creare è la classe VisionManager .The last script you need to create is the VisionManager class.

Questa classe è responsabile di:This class is responsible for:

  • Caricamento dell'immagine più recente acquisita come matrice di byte.Loading the latest image captured as an array of bytes.
  • Invio della matrice di byte all'istanza del servizio API visione artificiale di Azure per l'analisi.Sending the byte array to your Azure Computer Vision API Service instance for analysis.
  • Ricezione della risposta come stringa JSON.Receiving the response as a JSON string.
  • Deserializzazione della risposta e passaggio dei tag risultanti alla classe ResultsLabel .Deserializing the response and passing the resulting Tags to the ResultsLabel class.

Per creare questa classe:To create this class:

  1. Fare doppio clic sulla cartella Scripts per aprirla.Double click on the Scripts folder, to open it.

  2. Fare clic con il pulsante destro del mouse nella cartella Scripts , quindi scegliere Crea > script C#.Right-click inside the Scripts folder, click Create > C# Script. Denominare lo script VisionManager.Name the script VisionManager.

  3. Fare doppio clic sul nuovo script per aprirlo con Visual Studio.Double click on the new script to open it with Visual Studio.

  4. Aggiornare gli spazi dei nomi in modo che corrispondano a quelli riportati di seguito, all'inizio della 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. All'inizio dello script, all'interno della classe VisionManager (sopra il metodo Start () ), è ora necessario creare due classi che rappresenteranno la risposta JSON deserializzata da 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

    Le classi TagData e AnalysedObject devono avere l'attributo [System. Serializable] aggiunto prima della dichiarazione per poter essere deserializzato con le librerie di 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. Nella classe VisionManager è necessario aggiungere le variabili seguenti: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;
    

    Avviso

    Assicurarsi di inserire la chiave di autenticazione nella variabile authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable. Si noterà che la chiave di autenticazione è stata annotata all'inizio di questo corso, capitolo 1.You will have noted your Auth Key at the beginning of this course, Chapter 1.

    Avviso

    La variabile visionAnalysisEndpoint potrebbe essere diversa da quella specificata in questo esempio.The visionAnalysisEndpoint variable might differ from the one specified in this example. Gli Stati Uniti occidentali si riferiscono esclusivamente alle istanze del servizio create per l'area Stati Uniti occidentali.The west-us strictly refers to Service instances created for the West US region. Aggiornarlo con l' URL dell'endpoint. di seguito sono riportati alcuni esempi di ciò che potrebbe essere simile al seguente:Update this with your endpoint URL; here are some examples of what that might look like:

    • Europa occidentale: 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
    • Asia sudorientale: 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
    • Australia orientale: 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. È necessario aggiungere il codice per l'ora di riattivazione.Code for Awake now needs to be added.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Aggiungere quindi la coroutine (con il metodo del flusso statico sotto di essa), che otterrà i risultati dell'analisi dell'immagine acquisita dalla 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. Assicurarsi di salvare le modifiche in Visual Studio prima di tornare a Unity.Be sure to save your changes in Visual Studio before returning to Unity.

  10. Nell'editor di Unity fare clic e trascinare le classi VisionManager e ImageCapture dalla cartella Scripts all'oggetto principale della fotocamera nel Pannello gerarchia.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.

Capitolo 8-prima della compilazioneChapter 8 – Before building

Per eseguire un test completo dell'applicazione, è necessario sideload nel HoloLens.To perform a thorough test of your application you will need to sideload it onto your HoloLens. Prima di procedere, verificare quanto segue:Before you do, ensure that:

  • Tutte le impostazioni indicate nel capitolo 2 sono impostate correttamente.All the settings mentioned in Chapter 2 are set correctly.
  • Tutti gli script sono collegati all'oggetto principale della fotocamera .All the scripts are attached to the Main Camera object.
  • Tutti i campi nel pannello principale di controllo della fotocamera sono assegnati correttamente.All the fields in the Main Camera Inspector Panel are assigned properly.
  • Assicurarsi di inserire la chiave di autenticazione nella variabile authorizationKey .Make sure you insert your Auth Key into the authorizationKey variable.
  • Assicurarsi di aver controllato anche l'endpoint nello script VisionManager e che sia allineato all'area geografica (in questo documento vengono usati Stati Uniti occidentali per impostazione predefinita).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).

Capitolo 9: compilare la soluzione UWP e sideload l'applicazioneChapter 9 – Build the UWP Solution and sideload the application

Tutti gli elementi necessari per la sezione Unity di questo progetto sono stati completati, quindi è giunto il momento di compilarli da Unity.Everything needed for the Unity section of this project has now been completed, so it is time to build it from Unity.

  1. Passare al file delle impostazioni di compilazione - > impostazioni di compilazione...Navigate to Build Settings - File > Build Settings…

  2. Nella finestra impostazioni di compilazione fare clic su Compila.From the Build Settings window, click Build.

    Compilazione dell'app da Unity

  3. Se non è già stato fatto, è necessario che i progetti C# Unity.If not already, tick Unity C# Projects.

  4. Fare clic su Compila.Click Build. Unity avvierà una finestra di Esplora file , in cui è necessario creare e quindi selezionare una cartella in cui compilare l'app.Unity will launch a File Explorer window, where you need to create and then select a folder to build the app into. Creare la cartella adesso e denominarla app.Create that folder now, and name it App. Quindi, con la cartella dell' app selezionata, fare clic su Seleziona cartella.Then with the App folder selected, press Select Folder.

  5. Unity inizierà a compilare il progetto nella cartella dell' app .Unity will begin building your project to the App folder.

  6. Una volta completata la compilazione di Unity (potrebbe richiedere del tempo), verrà aperta una finestra Esplora file nella posizione della compilazione (controllare la barra delle applicazioni, perché potrebbe non essere sempre visualizzata sopra le finestre, ma verrà inviata una notifica sull'aggiunta di una nuova finestra).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).

Capitolo 10: eseguire la distribuzione in HoloLensChapter 10 – Deploy to HoloLens

Per eseguire la distribuzione in HoloLens:To deploy on HoloLens:

  1. È necessario l'indirizzo IP del HoloLens (per la distribuzione remota) e per assicurarsi che il HoloLens sia in modalità sviluppatore.You will need the IP Address of your HoloLens (for Remote Deploy), and to ensure your HoloLens is in Developer Mode. Per eseguire questa operazione:To do this:

    1. Quando si indossa il HoloLens, aprire le Impostazioni.Whilst wearing your HoloLens, open the Settings.
    2. Passare a rete & Internet > Wi-Fi > opzioni avanzateGo to Network & Internet > Wi-Fi > Advanced Options
    3. Prendere nota dell'indirizzo IPv4 .Note the IPv4 address.
    4. Quindi, tornare a Settings (impostazioni) e quindi aggiornare & Security > per gli sviluppatoriNext, navigate back to Settings, and then to Update & Security > For Developers
    5. Impostare la modalità di sviluppo su.Set Developer Mode On.
  2. Passare alla nuova compilazione Unity (cartella app ) e aprire il file della soluzione con Visual Studio.Navigate to your new Unity build (the App folder) and open the solution file with Visual Studio.

  3. Nella configurazione della soluzione selezionare debug.In the Solution Configuration select Debug.

  4. Nella piattaforma soluzione selezionare x86, computer remoto.In the Solution Platform, select x86, Remote Machine.

    Distribuire la soluzione da Visual Studio.

  5. Passare al menu Compila e fare clic su Distribuisci soluzione per sideload l'applicazione in HoloLens.Go to the Build menu and click on Deploy Solution, to sideload the application to your HoloLens.

  6. L'app verrà visualizzata nell'elenco delle app installate nella HoloLens, pronta per l'avvio.Your App should now appear in the list of installed apps on your HoloLens, ready to be launched!

Nota

Per eseguire la distribuzione in un dispositivo headset immersivo, impostare la piattaforma della soluzione su computer locale e impostare la configurazione su debug, con x86 come piattaforma.To deploy to immersive headset, set the Solution Platform to Local Machine, and set the Configuration to Debug, with x86 as the Platform. Quindi eseguire la distribuzione nel computer locale, usando il menu Compila, selezionando Distribuisci soluzione.Then deploy to the local machine, using the Build menu, selecting Deploy Solution.

Applicazione API Visione artificiale completataYour finished Computer Vision API application

Congratulazioni, è stata creata un'app per realtà mista che sfrutta la API Visione artificiale di Azure per riconoscere gli oggetti reali e visualizzare la confidenza di ciò che è stato 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.

risultato Lab

Esercizi aggiuntiviBonus exercises

Esercizio 1Exercise 1

Così come è stato usato il parametro Tags (come evidenziato all'interno dell' endpoint usato in VisionManager), estendere l'app per rilevare altre informazioni; esaminare gli altri parametri a cui si ha accesso.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.

Esercizio 2Exercise 2

Visualizza i dati di Azure restituiti, in modo più colloquiale e leggibile, forse nascondendo i numeri.Display the returned Azure data, in a more conversational, and readable way, perhaps hiding the numbers. Come se un bot potesse parlare con l'utente.As though a bot might be speaking to the user.