Dela via


HoloLens (första generationen) och Azure 302: Visuellt innehåll


Kommentar

Självstudierna för Mixed Reality Academy har utformats med HoloLens (första generationen) och Mixed Reality Immersive Headsets i åtanke. Därför anser vi att det är viktigt att låta de här självstudierna vara kvar för utvecklare som fortfarande letar efter vägledning för att utveckla för dessa enheter. De här självstudierna uppdateras inte med de senaste verktygsuppsättningarna eller interaktionerna som används för HoloLens 2. De underhålls för att fortsätta arbeta med de enheter som stöds. Det kommer att finnas en ny serie självstudier som kommer att publiceras i framtiden som visar hur du utvecklar för HoloLens 2. Det här meddelandet uppdateras med en länk till de självstudierna när de publiceras.


I den här kursen får du lära dig att känna igen visuellt innehåll i en angivet bild med hjälp av Funktioner för Azure Visuellt innehåll i ett program för mixad verklighet.

Igenkänningsresultat visas som beskrivande taggar. Du kan använda den här tjänsten utan att behöva träna en maskininlärningsmodell. Om implementeringen kräver träning av en maskininlärningsmodell läser du MR och Azure 302b.

labbresultat

Microsofts visuellt innehåll är en uppsättning API:er som är utformade för att ge utvecklare bildbearbetning och analys (med returinformation), med hjälp av avancerade algoritmer, allt från molnet. Utvecklare laddar upp en bild- eller bild-URL och API-algoritmerna för Microsoft Visuellt innehåll analyserar det visuella innehållet baserat på indata som valts av användaren, som sedan kan returnera information, inklusive att identifiera typen och kvaliteten på en bild, identifiera mänskliga ansikten (returnera deras koordinater) och tagga eller kategorisera bilder. Mer information finns på sidan api för Azure Visuellt innehåll.

När du har slutfört den här kursen har du ett HoloLens-program för mixad verklighet som kan göra följande:

  1. Med hjälp av Tap-gesten avbildar Kameran på HoloLens en bild.
  2. Avbildningen skickas till Azure Computer Vision API Service.
  3. Objekten som identifieras visas i en enkel användargränssnittsgrupp placerad i Unity Scene.

I ditt program är det upp till dig hur du ska integrera resultaten med din design. Den här kursen är utformad för att lära dig hur du integrerar en Azure-tjänst med ditt Unity-projekt. Det är ditt jobb att använda den kunskap du får från den här kursen för att förbättra din mixed reality-app.

Stöd för enheter

Kurs HoloLens Uppslukande headset
MR och Azure 302: Visuellt innehåll ✔️ ✔️

Kommentar

Den här kursen fokuserar främst på HoloLens, men du kan även tillämpa det du lär dig i den här kursen på Windows Mixed Reality-headset (VR). Eftersom integrerande (VR) headset inte har tillgängliga kameror behöver du en extern kamera ansluten till datorn. När du följer kursen visas anteckningar om eventuella ändringar som du kan behöva använda för att stödja uppslukande (VR) headset.

Förutsättningar

Kommentar

Den här självstudien är utformad för utvecklare som har grundläggande erfarenhet av Unity och C#. Tänk också på att förutsättningarna och de skriftliga instruktionerna i det här dokumentet representerar det som har testats och verifierats i skrivande stund (maj 2018). Du är fri att använda den senaste programvaran, som anges i artikeln installera verktyg , men det bör inte antas att informationen i den här kursen perfekt matchar vad du hittar i nyare programvara än vad som anges nedan.

Vi rekommenderar följande maskinvara och programvara för den här kursen:

Innan du börjar

  1. För att undvika problem med att skapa det här projektet rekommenderar vi starkt att du skapar projektet som nämns i den här självstudien i en rotmapp eller nära rotmapp (långa mappsökvägar kan orsaka problem vid byggtid).
  2. Konfigurera och testa dina HoloLens. Om du behöver stöd för att konfigurera HoloLens ska du gå till installationsartikeln för HoloLens.
  3. Det är en bra idé att utföra kalibrering och sensorjustering när du börjar utveckla en ny HoloLens-app (ibland kan det hjälpa till att utföra dessa uppgifter för varje användare).

Om du behöver hjälp med kalibrering kan du följa den här länken till artikeln HoloLens-kalibrering.

Om du vill ha hjälp med sensorjustering följer du den här länken till artikeln HoloLens Sensor Tuning.

Kapitel 1 – Azure-portalen

Om du vill använda TJÄNSTEN API för visuellt innehåll i Azure måste du konfigurera en instans av tjänsten som ska göras tillgänglig för ditt program.

  1. Logga först in på Azure-portalen.

    Kommentar

    Om du inte redan har ett Azure-konto måste du skapa ett. Om du följer den här självstudien i en klassrums- eller labbsituation ber du din instruktör eller någon av rektorerna om hjälp med att konfigurera ditt nya konto.

  2. När du är inloggad klickar du på Nytt i det övre vänstra hörnet och söker efter API för visuellt innehåll och klickar på Retur.

    Skapa en ny resurs i Azure

    Kommentar

    Ordet Nytt kan ha ersatts med Skapa en resurs i nyare portaler.

  3. Den nya sidan innehåller en beskrivning av API-tjänsten visuellt innehåll . Längst ned till vänster på den här sidan väljer du knappen Skapa för att skapa en association med den här tjänsten.

    Om api-tjänsten för visuellt innehåll

  4. När du har klickat på Skapa:

    1. Infoga önskat namn för den här tjänstinstansen.

    2. Välj en prenumeration.

    3. Välj den prisnivå som är lämplig för dig, om det är första gången du skapar en API-tjänst för visuellt innehåll bör du ha tillgång till en kostnadsfri nivå (med namnet F0).

    4. Välj en resursgrupp eller skapa en ny. En resursgrupp är ett sätt att övervaka, kontrollera åtkomst, etablera och hantera fakturering för en samling Azure-tillgångar. Vi rekommenderar att du behåller alla Azure-tjänster som är associerade med ett enda projekt (t.ex. dessa labb) under en gemensam resursgrupp).

      Om du vill läsa mer om Azure-resursgrupper kan du gå till resursgruppens artikel.

    5. Fastställa platsen för resursgruppen (om du skapar en ny resursgrupp). Platsen skulle helst vara i den region där programmet skulle köras. Vissa Azure-tillgångar är bara tillgängliga i vissa regioner.

    6. Du måste också bekräfta att du har förstått de villkor som gäller för den här tjänsten.

    7. Klicka på Skapa.

      Information om att skapa tjänsten

  5. När du har klickat på Skapa måste du vänta tills tjänsten har skapats. Det kan ta en minut.

  6. Ett meddelande visas i portalen när tjänstinstansen har skapats.

    Se det nya meddelandet för den nya tjänsten

  7. Klicka på meddelandet för att utforska din nya tjänstinstans.

    Välj knappen Gå till resurs.

  8. Klicka på knappen Gå till resurs i meddelandet för att utforska din nya tjänstinstans. Du kommer att tas till din nya API-tjänstinstans för visuellt innehåll.

    Din nya api-tjänstavbildning för visuellt innehåll

  9. I den här självstudien måste ditt program göra anrop till din tjänst, vilket görs med hjälp av tjänstens prenumerationsnyckel.

  10. På sidan Snabbstart går du till det första steget i API-tjänsten Visuellt innehåll, hämtar nycklarna och klickar på Nycklar (du kan också uppnå detta genom att klicka på den blå hyperlänken Nycklar, som finns i navigeringsmenyn för tjänster, som anges av nyckelikonen). Då visas dina tjänstnycklar.

  11. Ta en kopia av en av de nycklar som visas, eftersom du behöver det senare i projektet.

  12. Gå tillbaka till sidan Snabbstart och hämta slutpunkten därifrån. Tänk på att din kan vara annorlunda, beroende på din region (som om den är det, måste du göra en ändring i koden senare). Ta en kopia av den här slutpunkten för användning senare:

    Din nya API-tjänst för visuellt innehåll

    Dricks

    Du kan kontrollera vilka de olika slutpunkterna är HÄR.

Kapitel 2 – Konfigurera Unity-projektet

Följande är en typisk konfiguration för utveckling med mixad verklighet och är därför en bra mall för andra projekt.

  1. Öppna Unity och klicka på Nytt.

    Starta ett nytt Unity-projekt.

  2. Nu måste du ange ett Unity-projektnamn. Infoga MR_ComputerVision. Kontrollera att projekttypen är inställd på 3D. Ange platsen till någonstans som passar dig (kom ihåg att närmare rotkataloger är bättre). Klicka sedan på Skapa projekt.

    Ange information för det nya Unity-projektet.

  3. När Unity är öppet är det värt att kontrollera att standardskriptredigeraren är inställd på Visual Studio. Gå till Redigera > inställningar och gå sedan till Externa verktyg från det nya fönstret. Ändra extern skriptredigerare till Visual Studio 2017. Stäng fönstret Inställningar .

    Uppdatera skriptredigerarens inställningar.

  4. Gå sedan till Inställningar för filbygge > och välj Universell Windows-plattform och klicka sedan på knappen Växla plattform för att tillämpa ditt val.

    Fönstret Skapa inställningar, växla plattform till UWP.

  5. När du fortfarande är i Filversionsinställningar > och se till att:

    1. Målenheten är inställd på HoloLens

      För de uppslukande headseten anger du Målenhet till Valfri enhet.

    2. Byggtyp är inställd på D3D

    3. SDK är inställt på Senaste installerat

    4. Visual Studio-versionen är inställd på Senaste installerad

    5. Build and Run är inställt på Lokal dator

    6. Spara scenen och lägg till den i bygget.

      1. Gör detta genom att välja Lägg till öppna scener. Ett spara-fönster visas.

        Klicka på knappen Lägg till öppna scener

      2. Skapa en ny mapp för detta, och eventuella framtida scenarier, välj sedan knappen Ny mapp , för att skapa en ny mapp, ge den namnet Scener.

        Skapa ny skriptmapp

      3. Öppna den nyligen skapade mappen Scener och skriv sedan MR_ComputerVisionScene i fältet Filnamn: text och klicka sedan på Spara.

        Ge den nya scenen ett namn.

        Tänk på att du måste spara Unity-scenerna i mappen Tillgångar , eftersom de måste associeras med Unity-projektet. Att skapa mappen scener (och andra liknande mappar) är ett typiskt sätt att strukturera ett Unity-projekt.

    7. De återstående inställningarna i Bygginställningar bör vara kvar som standard för tillfället.

  6. I fönstret Bygginställningar klickar du på knappen Spelarinställningar. Då öppnas den relaterade panelen i det utrymme där inspektören finns.

    Öppna spelarinställningar.

  7. I den här panelen måste några inställningar verifieras:

    1. På fliken Andra inställningar :

      1. Skriptkörningsversionen bör vara stabil (.NET 3.5-motsvarighet).

      2. Skriptserverdelen ska vara .NET

      3. API-kompatibilitetsnivån ska vara .NET 4.6

        Uppdatera andra inställningar.

    2. På fliken Publiceringsinställningar går du till Funktioner och kontrollerar:

      1. InternetClient

      2. Webbkamera

        Uppdaterar publiceringsinställningar.

    3. Längre ned på panelen, i XR-inställningar (som finns under Publiceringsinställningar), markerar du Virtual Reality Supported (Virtual Reality Supported) och kontrollerar att Windows Mixed Reality SDK har lagts till.

      Uppdatera X R-inställningarna.

  8. Tillbaka i Bygginställningar Unity C# -projekt är inte längre nedtonade. Markera kryssrutan bredvid detta.

  9. Stäng fönstret Build Settings (Bygginställningar).

  10. Spara scen och projekt (FILE > SAVE SCENE/FILE > SAVE PROJECT).

Kapitel 3 – Installation av huvudkamera

Viktigt!

Om du vill hoppa över Unity Set up-komponenten i den här kursen och fortsätta direkt till kod kan du ladda ned . unitypackage, importera den till projektet som ett anpassat paket och sedan fortsätta från kapitel 5.

  1. I hierarkipanelen väljer du huvudkameran.

  2. När du har valt kan du se alla komponenter i huvudkameran i kontrollpanelen.

    1. Kameraobjektet måste ha namnet Main Camera (notera stavningen!)

    2. Huvudkamerataggen måste vara inställd på MainCamera (observera stavningen!)

    3. Kontrollera att transformeringspositionen är inställd på 0, 0, 0

    4. Ange Clear Flags till Solid Color (ignorera detta för uppslukande headset).

    5. Ange bakgrundsfärgen för kamerakomponenten till Svart, Alpha 0 (Hex Code: #000000000) (ignorera detta för uppslukande headset).

      Uppdatera kamerakomponenter.

  3. Därefter måste du skapa ett enkelt "markör"-objekt som är kopplat till huvudkameran, vilket hjälper dig att placera utdata för bildanalys när programmet körs. Den här markören avgör kamerafokusets mittpunkt.

Så här skapar du markören:

  1. Högerklicka på huvudkameran i hierarkipanelen. Under 3D-objekt klickar du på Sphere.

    Välj markörens objekt.

  2. Byt namn på Sphere till Cursor (dubbelklicka på markörobjektet eller tryck på tangenten F2 med objektet markerat) och kontrollera att det finns som underordnat huvudkameran.

  3. I hierarkipanelen vänsterklickar du på markören. När markören är markerad justerar du följande variabler i Kontrollpanelen:

    1. Ange transformeringspositionen till 0, 0, 5

    2. Ange Skala till 0.02, 0.02, 0.02

      Uppdatera transformeringspositionen och skalan.

Kapitel 4 – Konfigurera etikettsystemet

När du har avbildat en bild med HoloLens kamera skickas den bilden till din Azure Computer Vision API Service-instans för analys.

Resultatet av analysen blir en lista över identifierade objekt som kallas Taggar.

Du använder Etiketter (som en 3D-text i världsrymden) för att visa taggarna på den plats där fotot togs.

Följande steg visar hur du konfigurerar etikettobjektet .

  1. Högerklicka var som helst i hierarkipanelen (platsen spelar ingen roll just nu), under 3D-objekt lägger du till en 3D-text. Ge den namnet LabelText.

    Skapa 3D-textobjekt.

  2. I hierarkipanelen vänsterklickar du på Etiketttext. Med LabelText valt justerar du följande variabler i Kontrollpanelen:

    1. Ange position till 0,0,0
    2. Ange Skala till 0.01, 0.01, 0.01
    3. I komponenten Text mesh:
    4. Ersätt all text i Text med "..."
    5. Ställ in fästpunkten i mitten
    6. Ställ in justeringen till Mitten
    7. Ange flikstorleken till 4
    8. Ange teckenstorleken till 50
    9. Ange färg till #FFFFFFFF

    Textkomponent

  3. Dra LabelText från hierarkipanelen till tillgångsmappen i projektpanelen. Detta gör LabelText till prefab, så att den kan instansieras i kod.

    Skapa en prefab för LabelText-objektet.

  4. Du bör ta bort LabelText från hierarkipanelen så att den inte visas i öppningsscenen. Eftersom det nu är en prefab, som du kommer att anropa för enskilda instanser från mappen Tillgångar, behöver du inte hålla den inom scenen.

  5. Den slutliga objektstrukturen i hierarkipanelen bör vara som den som visas i bilden nedan:

    Den slutliga strukturen i hierarkipanelen.

Kapitel 5 – Skapa klassen ResultsLabel

Det första skriptet du behöver skapa är klassen ResultsLabel , som ansvarar för följande:

  • Skapa etiketterna i lämpligt världsutrymme i förhållande till kamerans position.
  • Visar taggarna från bildanalysen.

Så här skapar du den här klassen:

  1. Högerklicka i projektpanelen och sedan på Skapa > mapp. Ge mappen namnet Skript.

    Skapa skriptmapp.

  2. När mappen Skript har skapats dubbelklickar du på den för att öppna den. Högerklicka sedan i mappen och välj Skapa >sedan C#-skript. Ge skriptet namnet ResultsLabel.

  3. Dubbelklicka på det nya ResultsLabel-skriptet för att öppna det med Visual Studio.

  4. I klassen infogar du följande kod i klassen ResultsLabel :

        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. Se till att spara ändringarna i Visual Studio innan du återvänder till Unity.

  6. Tillbaka i Unity-redigeraren klickar och drar du klassen ResultsLabel från mappen Skript till huvudkameraobjektet i hierarkipanelen.

  7. Klicka på huvudkameran och titta på kontrollpanelen.

Du kommer att märka att från skriptet som du just drog till kameran finns det två fält: Markör och etikettprefab.

  1. Dra objektet markören från hierarkipanelen till platsen med namnet Cursor( Markör) enligt bilden nedan.

  2. Dra objektet LabelText från mappen Assets i projektpanelen till platsen Med namnet Etikettprefab, enligt bilden nedan.

    Ange referensmålen i Unity.

Kapitel 6 – Skapa klassen ImageCapture

Nästa klass som du ska skapa är klassen ImageCapture . Den här klassen ansvarar för:

  • Avbilda en bild med HoloLens-kameran och lagra den i appmappen.
  • Fånga tryckgester från användaren.

Så här skapar du den här klassen:

  1. Gå till mappen Skript som du skapade tidigare.

  2. Högerklicka i mappen Skapa > C#-skript. Anropa skriptet ImageCapture.

  3. Dubbelklicka på det nya ImageCapture-skriptet för att öppna det med Visual Studio.

  4. Lägg till följande namnområden överst i filen:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Lägg sedan till följande variabler i klassen ImageCapture ovanför metoden Start( ):

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

TapsCount-variabeln lagrar antalet tryckgester som hämtats från användaren. Det här talet används i namngivningen av de bilder som tagits.

  1. Kod för metoderna Awake() och Start() måste nu läggas till. Dessa anropas när klassen initieras:

        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. Implementera en hanterare som anropas när en Tryckgest inträffar.

        /// <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();
            }
        }
    

Metoden TapHandler() ökar antalet tryck som samlas in från användaren och använder den aktuella markörpositionen för att avgöra var en ny etikett ska placeras.

Den här metoden anropar sedan metoden ExecuteImageCaptureAndAnalysis() för att påbörja kärnfunktionerna i det här programmet.

  1. När en avbildning har avbildats och lagrats anropas följande hanterare. Om processen lyckas skickas resultatet till VisionManager (som du ännu inte har skapat) för analys.

        /// <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. Lägg sedan till den metod som programmet använder för att starta avbildningsprocessen och lagra avbildningen.

        /// <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;
                });   
            });    
        }
    

Varning

Nu ser du ett fel som visas i konsolpanelen för Unity-redigeraren. Det beror på att koden refererar till klassen VisionManager som du skapar i nästa kapitel.

Kapitel 7 – Samtal till Azure och bildanalys

Det sista skriptet du behöver skapa är klassen VisionManager .

Den här klassen ansvarar för:

  • Läser in den senaste avbildningen som tagits som en matris med byte.
  • Skicka bytematrisen till din Azure Computer Vision API Service-instans för analys.
  • Tar emot svaret som en JSON-sträng.
  • Deserialisera svaret och skicka de resulterande taggarna till klassen ResultsLabel .

Så här skapar du den här klassen:

  1. Dubbelklicka på mappen Skript för att öppna den.

  2. Högerklicka i mappen Skript och klicka på Skapa > C#-skript. Ge skriptet namnet VisionManager.

  3. Dubbelklicka på det nya skriptet för att öppna det med Visual Studio.

  4. Uppdatera namnrymderna så att de är samma som följande överst i klassen VisionManager :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Överst i skriptet i klassen VisionManager (ovanför metoden Start() måste du nu skapa två klasser som representerar det deserialiserade JSON-svaret från 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;
        }
    

    Kommentar

    Klasserna TagData och AnalysedObject måste ha attributet [System.Serializable] tillagt före deklarationen för att kunna deserialiseras med Unity-biblioteken.

  6. I klassen VisionManager bör du lägga till följande variabler:

        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;
    

    Varning

    Se till att du infogar autentiseringsnyckeln i variabeln authorizationKey. Du kommer att ha noterat din autentiseringsnyckel i början av den här kursen, kapitel 1.

    Varning

    Variabeln visionAnalysisEndpoint kan skilja sig från den som anges i det här exemplet. West-us refererar strikt till tjänstinstanser som skapats för regionen USA, västra. Uppdatera detta med din slutpunkts-URL. Här är några exempel på hur det kan se ut:

    • Europa, västra: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Sydostasien: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Australien, östra: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Kod för Vaken nu måste läggas till.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Lägg sedan till coroutine (med den statiska strömmetoden under den), som hämtar resultatet av analysen av bilden som tagits av ImageCapture-klassen .

        /// <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. Se till att spara ändringarna i Visual Studio innan du återvänder till Unity.

  10. Tillbaka i Unity-redigeraren klickar och drar du klasserna VisionManager och ImageCapture från mappen Skript till huvudkameraobjektet i hierarkipanelen.

Kapitel 8 – Innan du bygger

För att utföra ett grundligt test av ditt program måste du läsa in det separat på HoloLens. Innan du gör det kontrollerar du att:

  • Alla inställningar som anges i kapitel 2 är korrekt inställda.
  • Alla skript är kopplade till huvudkameraobjektet .
  • Alla fält i huvudpanelen för kamerakontroll tilldelas korrekt.
  • Se till att du infogar autentiseringsnyckeln i variabeln authorizationKey.
  • Kontrollera att du också har kontrollerat slutpunkten i ditt VisionManager-skript och att den justeras till din region (det här dokumentet använder west-us som standard).

Kapitel 9 – Skapa UWP-lösningen och läs in programmet separat

Allt som behövs för Unity-avsnittet i det här projektet har nu slutförts, så det är dags att bygga det från Unity.

  1. Gå till Build Settings - File > Build Settings...

  2. I fönstret Bygginställningar klickar du på Skapa.

    Skapa appen från Unity

  3. Om inte redan markerar du Unity C#-projekt.

  4. Klicka på Skapa. Unity startar ett Istraživač datoteka fönster där du behöver skapa och väljer sedan en mapp som appen ska byggas in i. Skapa mappen nu och ge den namnet App. Tryck sedan på Välj mapp med appmappen markerad.

  5. Unity börjar skapa projektet i mappen App .

  6. När Unity har byggt klart (det kan ta lite tid) öppnas ett Istraživač datoteka fönster på platsen för bygget (kontrollera aktivitetsfältet eftersom det kanske inte alltid visas ovanför dina fönster, men meddelar dig om att ett nytt fönster har lagts till).

Kapitel 10 – Distribuera till HoloLens

Så här distribuerar du på HoloLens:

  1. Du behöver IP-adressen för dina HoloLens (för fjärrdistribution) och för att säkerställa att HoloLens är i utvecklarläge. Så här gör du:

    1. Öppna inställningarna när du använder HoloLens.
    2. Gå till Avancerade alternativ för nätverks- och Internet-Wi-Fi > >
    3. Observera IPv4-adressen.
    4. Gå sedan tillbaka till Inställningar och sedan till Uppdatera och säkerhet > för utvecklare
    5. Ange utvecklarläge på.
  2. Gå till din nya Unity-version (appmappen) och öppna lösningsfilen med Visual Studio.

  3. I Lösningskonfiguration väljer du Felsök.

  4. I Lösningsplattformen väljer du x86, Fjärrdator.

    Distribuera lösningen från Visual Studio.

  5. Gå till menyn Skapa och klicka på Distribuera lösning för att separat läsa in programmet till dina HoloLens.

  6. Din app bör nu visas i listan över installerade appar på HoloLens, redo att startas!

Kommentar

Om du vill distribuera till ett uppslukande headset ställer du in Lösningsplattformen på Lokal dator och ställer in konfigurationen Felsökning med x86 som plattform. Distribuera sedan till den lokala datorn med hjälp av menyn Skapa och välj Distribuera lösning.

Ditt färdiga API-program för visuellt innehåll

Grattis, du har skapat en app för mixad verklighet som använder Azures API för visuellt innehåll för att identifiera verkliga objekt och visa förtroende för vad som har setts.

labbresultat

Bonusövningar

Övning 1

Precis som du har använt parametern Taggar (vilket visas i slutpunkten som används i VisionManager) utökar du appen för att identifiera annan information. Ta en titt på vilka andra parametrar du har åtkomst till HÄR.

Övning 2

Visa returnerade Azure-data på ett mer konversationsbart och läsbart sätt, kanske dölja siffrorna. Som om en robot kan tala med användaren.