HoloLens (1e generatie) en Azure 302: Computer Vision


Notitie

De Mixed Reality Academy-zelfstudies zijn ontworpen met het oog op HoloLens (1e generatie) en Mixed Reality Immersive Headsets. Daarom vinden we het belangrijk om deze zelfstudies te laten staan voor ontwikkelaars die nog steeds op zoek zijn naar hulp bij het ontwikkelen van deze apparaten. Deze zelfstudies worden niet bijgewerkt met de nieuwste hulpprogrammasets of interacties die worden gebruikt voor HoloLens 2. Ze worden onderhouden om te blijven werken op de ondersteunde apparaten. Er komt een nieuwe reeks zelfstudies die in de toekomst worden gepost, waarin wordt gedemonstreerd hoe u kunt ontwikkelen voor HoloLens 2. Deze kennisgeving wordt bijgewerkt met een koppeling naar deze zelfstudies wanneer deze worden gepost.


In deze cursus leert u hoe u visuele inhoud binnen een opgegeven afbeelding kunt herkennen met behulp van Azure Computer Vision-mogelijkheden in een mixed reality-toepassing.

Herkenningsresultaten worden weergegeven als beschrijvende tags. U kunt deze service gebruiken zonder dat u een machine learning-model hoeft te trainen. Als voor uw implementatie een machine learning-model moet worden getraind, raadpleegt u MR en Azure 302b.

labresultaat

De Microsoft Computer Vision is een set API's die is ontworpen om ontwikkelaars te voorzien van afbeeldingsverwerking en -analyse (met retourinformatie), met behulp van geavanceerde algoritmen, allemaal vanuit de cloud. Ontwikkelaars uploaden een afbeelding of afbeeldings-URL en de Microsoft Computer Vision API-algoritmen analyseren de visuele inhoud op basis van invoer die de gebruiker heeft gekozen, die vervolgens informatie kan retourneren, waaronder het identificeren van het type en de kwaliteit van een afbeelding, het detecteren van menselijke gezichten (het retourneren van hun coördinaten) en het taggen of categoriseren van afbeeldingen. Ga naar de pagina Azure Computer Vision API voor meer informatie.

Nadat u deze cursus hebt voltooid, hebt u een HoloLens-toepassing voor mixed reality, die het volgende kan doen:

  1. Met behulp van de tikbeweging legt de camera van de HoloLens een afbeelding vast.
  2. De installatiekopieën worden verzonden naar de Azure Computer Vision API-service.
  3. De objecten die worden herkend, worden weergegeven in een eenvoudige gebruikersinterfacegroep die in de Unity-scène wordt geplaatst.

In uw toepassing bepaalt u zelf hoe u de resultaten integreert met uw ontwerp. In deze cursus leert u hoe u een Azure-service integreert met uw Unity-project. Het is uw taak om de kennis die u uit deze cursus opdoet te gebruiken om uw mixed reality-toepassing te verbeteren.

Ondersteuning voor apparaten

Cursus HoloLens Immersive headsets
MR en Azure 302: Computer Vision ✔️ ✔️

Notitie

Hoewel deze cursus zich voornamelijk richt op HoloLens, kunt u wat u in deze cursus leert ook toepassen op Windows Mixed Reality immersive (VR) headsets. Omdat insluitende (VR)-headsets geen toegankelijke camera's hebben, hebt u een externe camera nodig die is aangesloten op uw pc. Terwijl u de cursus volgt, ziet u notities over eventuele wijzigingen die u mogelijk moet toepassen om insluitende (VR)-headsets te ondersteunen.

Vereisten

Notitie

Deze zelfstudie is bedoeld voor ontwikkelaars die basiservaring hebben met Unity en C#. Houd er ook rekening mee dat de vereisten en schriftelijke instructies in dit document overeenkomen met wat is getest en geverifieerd op het moment van schrijven (mei 2018). U bent vrij om de nieuwste software te gebruiken, zoals vermeld in het artikel over het installeren van de hulpprogramma's , hoewel niet mag worden aangenomen dat de informatie in deze cursus perfect overeenkomt met wat u in nieuwere software vindt dan wat hieronder wordt vermeld.

Voor deze cursus raden we de volgende hardware en software aan:

Voordat u begint

  1. Om problemen met het bouwen van dit project te voorkomen, wordt u sterk aangeraden het project te maken dat in deze zelfstudie wordt vermeld in een hoofdmap of een bijna-hoofdmap (lange mappaden kunnen problemen veroorzaken tijdens het bouwen).
  2. Stel uw HoloLens in en test deze. Als u ondersteuning nodig hebt bij het instellen van uw HoloLens, raadpleegt u het artikel Over het instellen van HoloLens.
  3. Het is een goed idee om kalibratie en sensorafstemming uit te voeren wanneer u begint met het ontwikkelen van een nieuwe HoloLens-app (soms kan het helpen om deze taken voor elke gebruiker uit te voeren).

Volg deze koppeling naar het artikel HoloLens-kalibratie voor hulp bij kalibratie.

Volg deze koppeling naar het artikel HoloLens Sensor Tuning voor hulp bij sensorafstemming.

Hoofdstuk 1: De Azure-portal

Als u de Computer Vision API-service in Azure wilt gebruiken, moet u een exemplaar van de service configureren dat beschikbaar moet worden gesteld aan uw toepassing.

  1. Meld u eerst aan bij Azure Portal.

    Notitie

    Als u nog geen Azure-account hebt, moet u er een maken. Als u deze zelfstudie volgt in een leslokaal- of labsituatie, vraagt u uw docent of een van de docenten om hulp bij het instellen van uw nieuwe account.

  2. Zodra u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek, zoekt u Computer Vision API en klikt u op Enter.

    Een nieuwe resource maken in Azure

    Notitie

    Het woord Nieuw is mogelijk vervangen door Een resource maken in nieuwere portals.

  3. De nieuwe pagina bevat een beschrijving van de Computer Vision API-service. Selecteer linksonder op deze pagina de knop Maken om een koppeling met deze service te maken.

    Over de Computer Vision-API-service

  4. Nadat u op Maken hebt geklikt:

    1. Voeg de gewenste naam in voor dit service-exemplaar.

    2. Selecteer een Abonnement.

    3. Selecteer de prijscategorie die geschikt is voor u. Als dit de eerste keer is dat u een Computer Vision API-service maakt, moet er een gratis laag (met de naam F0) voor u beschikbaar zijn.

    4. Kies een resourcegroep of maak een nieuwe. Een resourcegroep biedt een manier om een verzameling Azure-assets te bewaken, toegang te beheren, in te richten en facturering te beheren. Het wordt aanbevolen om alle Azure-services die zijn gekoppeld aan één project (bijvoorbeeld deze labs) onder een gemeenschappelijke resourcegroep te houden.

      Als u meer wilt lezen over Azure-resourcegroepen, gaat u naar het artikel over resourcegroepen.

    5. Bepaal de locatie voor uw resourcegroep (als u een nieuwe resourcegroep maakt). De locatie bevindt zich idealiter in de regio waar de toepassing wordt uitgevoerd. Sommige Azure-assets zijn alleen beschikbaar in bepaalde regio's.

    6. U moet ook bevestigen dat u de voorwaarden hebt begrepen die van toepassing zijn op deze Service.

    7. Klik op Maken.

      Informatie over het maken van de service

  5. Nadat u op Maken hebt geklikt, moet u wachten tot de service is gemaakt. Dit kan een minuut duren.

  6. Er wordt een melding weergegeven in de portal zodra het service-exemplaar is gemaakt.

    Zie de nieuwe melding voor uw nieuwe service

  7. Klik op de melding om uw nieuwe service-exemplaar te verkennen.

    Selecteer de knop Ga naar resource.

  8. Klik op de knop Ga naar resource in de melding om uw nieuwe service-exemplaar te verkennen. U wordt naar uw nieuwe Computer Vision API-service-exemplaar gebracht.

    De nieuwe installatiekopieën van de Computer Vision API-service

  9. In deze zelfstudie moet uw toepassing uw service aanroepen doen. Dit gebeurt met behulp van de abonnementssleutel van uw service.

  10. Ga op de pagina Snel starten van uw Computer Vision API-service naar de eerste stap, Uw sleutels ophalen en klik op Sleutels (u kunt dit ook doen door te klikken op de blauwe hyperlink Sleutels, die zich in het navigatiemenu van de services bevindt, aangegeven met het sleutelpictogram). Hiermee worden uw servicesleutels weergegeven.

  11. Maak een kopie van een van de weergegeven sleutels, omdat u deze later in uw project nodig hebt.

  12. Terug naar de pagina Snel starten en haal uw eindpunt op. Houd er rekening mee dat die van u kan verschillen, afhankelijk van uw regio (als dat zo is, moet u later een wijziging aanbrengen in uw code). Maak een kopie van dit eindpunt voor later gebruik:

    Uw nieuwe Computer Vision API-service

    Tip

    U kunt hier controleren wat de verschillende eindpunten zijn.

Hoofdstuk 2 : Het Unity-project instellen

Het volgende is een typische set-up voor het ontwikkelen met mixed reality en is daarom een goede sjabloon voor andere projecten.

  1. Open Unity en klik op Nieuw.

    Start een nieuw Unity-project.

  2. U moet nu een unity-projectnaam opgeven. Voeg MR_ComputerVision in. Zorg ervoor dat het projecttype is ingesteld op 3D. Stel de locatie in op een locatie die geschikt is voor u (houd er rekening mee dat dichter bij hoofdmappen beter is). Klik vervolgens op Project maken.

    Geef details op voor het nieuwe Unity-project.

  3. Als Unity is geopend, is het de moeite waard om te controleren of de standaardscripteditor is ingesteld op Visual Studio. Ga naar Voorkeuren bewerken > en navigeer vervolgens vanuit het nieuwe venster naar Externe hulpprogramma's. Wijzig De externe scripteditor in Visual Studio 2017. Sluit het venster Voorkeuren .

    Voorkeur scripteditor bijwerken.

  4. Ga vervolgens naar File > Build Settings en selecteer Universeel Windows-platform en klik vervolgens op de knop Switch Platform om uw selectie toe te passen.

    Venster Instellingen bouwen, platform overschakelen naar UWP.

  5. Terwijl u zich nog steeds in de instellingen voor het > maken van bestanden hebt en controleert u of:

    1. Doelapparaat is ingesteld op HoloLens

      Voor de immersive headsets stelt u Doelapparaat in op Elk apparaat.

    2. Buildtype is ingesteld op D3D

    3. SDK is ingesteld op Laatst geïnstalleerd

    4. Visual Studio-versie is ingesteld op Laatst geïnstalleerd

    5. Bouwen en uitvoeren is ingesteld op Lokale computer

    6. Sla de scène op en voeg deze toe aan de build.

      1. U doet dit door Open scènes toevoegen te selecteren. Er wordt een venster voor opslaan weergegeven.

        Klik op de knop Geopende scènes toevoegen

      2. Maak hiervoor een nieuwe map en een toekomstige scène en selecteer vervolgens de knop Nieuwe map om een nieuwe map te maken, geef deze de naam Scènes.

        Nieuwe map met scripts maken

      3. Open de zojuist gemaakte map Scènes en typ in het tekstveld Bestandsnaam: MR_ComputerVisionScene en klik vervolgens op Opslaan.

        Geef de nieuwe scène een naam.

        Houd er rekening mee dat u uw Unity-scènes moet opslaan in de map Assets , omdat deze moeten worden gekoppeld aan het Unity-project. Het maken van de scènemap (en andere vergelijkbare mappen) is een typische manier om een Unity-project te structureren.

    7. De overige instellingen in Build-instellingen moeten voorlopig als standaard worden ingesteld.

  6. Klik in het venster Build-instellingen op de knop Spelerinstellingen . Hiermee opent u het gerelateerde deelvenster in de ruimte waar de Inspector zich bevindt.

    Spelerinstellingen openen.

  7. In dit deelvenster moeten enkele instellingen worden geverifieerd:

    1. Op het tabblad Overige instellingen :

      1. Scripting Runtime-versie moet stabiel zijn (equivalent van.NET 3.5).

      2. De back-end van scripts moet .NET zijn

      3. API-compatibiliteitsniveau moet .NET 4.6 zijn

        Andere instellingen bijwerken.

    2. Schakel op het tabblad Publicatie-instellingen onder Mogelijkheden het volgende in:

      1. InternetClient

      2. Webcam

        Publicatie-instellingen bijwerken.

    3. Verderop in het deelvenster, in XR-instellingen (onder Publicatie-instellingen), vinkt u Virtual Reality Ondersteund aan en controleert u of de Windows Mixed Reality SDK is toegevoegd.

      Werk de X R-instellingen bij.

  8. Terug in build-instellingenwordt Unity C# -projecten niet langer grijs weergegeven; schakel het selectievakje naast dit selectievakje in.

  9. Sluit het venster Build Settings.

  10. Sla uw scène en project op (SCÈNE OPSLAAN/ > PROJECT OPSLAAN >BESTAND).

Hoofdstuk 3 – Hoofdcamera instellen

Belangrijk

Als u het Unity Set up-onderdeel van deze cursus wilt overslaan en direct verder wilt gaan met code, kunt u dit .unitypackage downloaden, het in uw project importeren als een aangepast pakket en vervolgens doorgaan vanaf Hoofdstuk 5.

  1. Selecteer in het deelvenster Hiërarchie de hoofdcamera.

  2. Eenmaal geselecteerd, kunt u alle onderdelen van de hoofdcamera in het deelvenster Inspector zien.

    1. Het object Camera moet de naam Hoofdcamera hebben (let op de spelling!)

    2. Het hoofdcameralabel moet zijn ingesteld op MainCamera (let op de spelling!)

    3. Zorg ervoor dat de transformatiepositie is ingesteld op 0, 0, 0

    4. Stel Markeringen wissen in op Effen kleur (negeer dit voor immersive headset).

    5. Stel de achtergrondkleur van het cameraonderdeel in op Black, Alpha 0 (Hex Code: #000000000) (negeer dit voor immersive headset).

      Cameraonderdelen bijwerken.

  3. Vervolgens moet u een eenvoudig 'Cursor'-object maken dat is gekoppeld aan de hoofdcamera, waarmee u de uitvoer van de afbeeldingsanalyse kunt positioneert wanneer de toepassing wordt uitgevoerd. Deze cursor bepaalt het middelpunt van de camerafocus.

De cursor maken:

  1. Klik in het deelvenster Hiërarchie met de rechtermuisknop op de hoofdcamera. Klik onder 3D-object op Bol.

    Selecteer het cursorobject.

  2. Wijzig de naam van de bol in Cursor (dubbelklik op het cursorobject of druk op de toetsenbordknop F2 met het object geselecteerd) en zorg ervoor dat het object zich bevindt als onderliggend element van de hoofdcamera.

  3. Klik in het deelvenster Hiërarchie met de linkermuisknop op de cursor. Terwijl de cursor is geselecteerd, past u de volgende variabelen aan in het deelvenster Inspector:

    1. De transformatiepositie instellen op 0, 0, 5

    2. De schaal instellen op 0,02, 0,02, 0,02

      Werk de positie en schaal van de transformatie bij.

Hoofdstuk 4 : Het labelsysteem instellen

Zodra u een afbeelding hebt gemaakt met de camera van de HoloLens, wordt die afbeelding voor analyse naar uw Azure Computer Vision API Service-exemplaar verzonden.

De resultaten van die analyse zijn een lijst met herkende objecten met de naam Tags.

U gebruikt Labels (als een 3D-tekst in de wereldruimte) om deze tags weer te geven op de locatie waar de foto is gemaakt.

In de volgende stappen ziet u hoe u het labelobject instelt.

  1. Klik met de rechtermuisknop op een willekeurige plaats in het deelvenster Hiërarchie (de locatie doet er op dit moment niet toe). Voeg onder 3D-object een 3D-tekst toe. Geef het de naam LabelText.

    3D Text-object maken.

  2. Klik in het deelvenster Hiërarchie met de linkermuisknop op LabelTekst. Terwijl LabelText is geselecteerd, past u de volgende variabelen aan in het deelvenster Inspector:

    1. Stel de positie in op 0,0,0
    2. De schaal instellen op 0,01, 0,01, 0,01
    3. In het onderdeel Text Mesh:
    4. Vervang alle tekst in Text door '...'
    5. Het anker instellen op Midden midden
    6. De uitlijning instellen op Centreren
    7. De tabgrootte instellen op 4
    8. De tekengrootte instellen op 50
    9. Stel de kleur in op #FFFFFFFF

    Tekstonderdeel

  3. Sleep labeltekst vanuit het deelvenster Hiërarchie naar de map Activa, binnen in het deelvenster Project. Hierdoor wordt de LabelText een prefab, zodat deze in code kan worden geïnstantieerd.

    Maak een prefab van het object LabelText.

  4. U moet labeltekst verwijderen uit het deelvenster Hiërarchie, zodat deze niet wordt weergegeven in de openingsscène. Omdat het nu een prefab is, die u aanroept voor afzonderlijke exemplaren vanuit de map Assets, hoeft u deze niet binnen de scène te houden.

  5. De uiteindelijke objectstructuur in het deelvenster Hiërarchie moet er als volgt uitzien:

    Definitieve structuur van het deelvenster Hiërarchie.

Hoofdstuk 5: De klasse ResultsLabel maken

Het eerste script dat u moet maken, is de klasse ResultsLabel , die verantwoordelijk is voor het volgende:

  • Het maken van de labels in de juiste wereldruimte, ten opzichte van de positie van de camera.
  • De tags van de afbeeldings-Anaysis weergeven.

Ga als volgt te werk om deze klasse te maken:

  1. Klik met de rechtermuisknop in het deelvenster Project en klik vervolgens op Map maken>. Geef de map de naam Scripts.

    Map scripts maken.

  2. Dubbelklik op de map Scripts maken om de map te openen. Klik vervolgens in die map met de rechtermuisknop en selecteer Maken > en vervolgens C#-script. Geef het script de naam ResultsLabel.

  3. Dubbelklik op het nieuwe script ResultsLabel om het te openen met Visual Studio.

  4. Voeg in de klasse Klasse de volgende code in de klasse ResultsLabel in:

        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. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

  6. Terug in de Unity-editor klikt u op de klasse ResultsLabel en sleept u deze vanuit de map Scripts naar het object Hoofdcamera in het deelvenster Hierarchy.

  7. Klik op de hoofdcamera en kijk naar het deelvenster Inspector.

U zult merken dat er in het script dat u zojuist naar de camera hebt gesleept, twee velden zijn: Cursor en Label Prefab.

  1. Sleep het object Met de naam Cursor van het deelvenster Hiërarchie naar de sleuf met de naam Cursor, zoals wordt weergegeven in de onderstaande afbeelding.

  2. Sleep het object met de naam LabelText van de map Assets in het projectvenster naar de site met de naam Label Prefab, zoals wordt weergegeven in de onderstaande afbeelding.

    Stel de referentiedoelen in Unity in.

Hoofdstuk 6: De klasse ImageCapture maken

De volgende klasse die u gaat maken, is de klasse ImageCapture . Deze klasse is verantwoordelijk voor:

  • Een afbeelding vastleggen met behulp van de HoloLens-camera en deze opslaan in de map App.
  • Tikbewegingen van de gebruiker vastleggen.

Ga als volgt te werk om deze klasse te maken:

  1. Ga naar de map Scripts die u eerder hebt gemaakt.

  2. Klik met de rechtermuisknop in de map C#-script maken>. Roep het script ImageCapture aan.

  3. Dubbelklik op het nieuwe ImageCapture-script om het te openen met Visual Studio.

  4. Voeg de volgende naamruimten toe aan het begin van het bestand:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Voeg vervolgens de volgende variabelen toe in de klasse ImageCapture , boven de methode Start( ):

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

Met de variabele tapsCount wordt het aantal tikbewegingen opgeslagen dat door de gebruiker is vastgelegd. Dit nummer wordt gebruikt bij de naamgeving van de vastgelegde afbeeldingen.

  1. Code voor de methoden Awake() en Start() moet nu worden toegevoegd. Deze worden aangeroepen wanneer de klasse initialiseert:

        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. Implementeer een handler die wordt aangeroepen wanneer een tikbeweging optreedt.

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

Met de methode TapHandler() wordt het aantal tikken van de gebruiker verhoogd en wordt de huidige positie van de cursor gebruikt om te bepalen waar een nieuw label moet worden weergegeven.

Met deze methode wordt vervolgens de methode ExecuteImageCaptureAndAnalysis() aangeroepen om de kernfunctionaliteit van deze toepassing te starten.

  1. Zodra een installatiekopieën zijn vastgelegd en opgeslagen, worden de volgende handlers aangeroepen. Als het proces is geslaagd, wordt het resultaat doorgegeven aan de VisionManager (die u nog moet maken) voor analyse.

        /// <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. Voeg vervolgens de methode toe die door de toepassing wordt gebruikt om het proces voor het vastleggen van afbeeldingen te starten en de installatiekopieën op te slaan.

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

Waarschuwing

Op dit moment ziet u een fout die wordt weergegeven in het consolepaneel van de Unity-editor. Dit komt doordat de code verwijst naar de VisionManager-klasse die u in het volgende hoofdstuk gaat maken.

Hoofdstuk 7: Aanroepen naar Azure en afbeeldingsanalyse

Het laatste script dat u moet maken, is de klasse VisionManager .

Deze klasse is verantwoordelijk voor:

  • De meest recente installatiekopieën laden die zijn vastgelegd als een matrix van bytes.
  • De bytematrix verzenden naar uw Azure Computer Vision API Service-exemplaar voor analyse.
  • Het antwoord ontvangen als een JSON-tekenreeks.
  • Het antwoord deserialiseren en de resulterende tags doorgeven aan de klasse ResultsLabel .

Ga als volgt te werk om deze klasse te maken:

  1. Dubbelklik op de map Scripts om deze te openen.

  2. Klik met de rechtermuisknop in de map Scripts en klik op C#-script maken>. Geef het script de naam VisionManager.

  3. Dubbelklik op het nieuwe script om het te openen met Visual Studio.

  4. Werk de naamruimten bij zodat deze gelijk zijn aan de volgende bovenaan de VisionManager-klasse :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Bovenaan het script, in de visionmanagerklasse (boven de methode Start(), moet u nu twee klassen maken die het gedeserialiseerde JSON-antwoord van Azure vertegenwoordigen:

        [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;
        }
    

    Notitie

    De klassen TagData en AnalysedObject moeten het kenmerk [System.Serializable] vóór de declaratie hebben toegevoegd om te kunnen worden gedeserialiseerd met de Unity-bibliotheken.

  6. In de klasse VisionManager moet u de volgende variabelen toevoegen:

        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;
    

    Waarschuwing

    Zorg ervoor dat u uw verificatiesleutel in de variabele authorizationKey invoegt . U hebt uw verificatiesleutel genoteerd aan het begin van deze cursus, hoofdstuk 1.

    Waarschuwing

    De variabele visionAnalysisEndpoint kan afwijken van de variabele die in dit voorbeeld is opgegeven. Us - west verwijst strikt naar service-exemplaren die zijn gemaakt voor de regio VS - west. Werk dit bij met uw eindpunt-URL; hier volgen enkele voorbeelden van hoe dat eruit kan zien:

    • Europa - west: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Azië - zuidoost: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Australië - oost: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Code voor Wakker moet nu worden toegevoegd.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Voeg vervolgens de coroutine toe (met de statische stroommethode eronder), waarmee de resultaten worden verkregen van de analyse van de afbeelding die is vastgelegd met de klasse ImageCapture .

        /// <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. Zorg ervoor dat u uw wijzigingen opslaat in Visual Studio voordat u terugkeert naar Unity.

  10. Terug in de Unity-editor klikt u op de klassen VisionManager en ImageCapture en sleept u deze van de map Scripts naar het object Hoofdcamera in het deelvenster Hiërarchie.

Hoofdstuk 8 – Voor de bouw

Als u een grondige test van uw toepassing wilt uitvoeren, moet u deze sideloaden op uw HoloLens. Voordat u dit doet, moet u ervoor zorgen dat:

  • Alle instellingen die in Hoofdstuk 2 worden vermeld, zijn correct ingesteld.
  • Alle scripts zijn gekoppeld aan het object Hoofdcamera .
  • Alle velden in het hoofdvenster cameracontrole zijn correct toegewezen.
  • Zorg ervoor dat u uw verificatiesleutel in de variabele authorizationKey invoegt .
  • Zorg ervoor dat u ook uw eindpunt in uw VisionManager-script hebt gecontroleerd en dat het overeenkomt met uw regio (dit document gebruikt standaard west-us ).

Hoofdstuk 9: De UWP-oplossing bouwen en de toepassing sideloaden

Alles wat nodig is voor de Unity-sectie van dit project is nu voltooid, dus het is tijd om het te bouwen vanuit Unity.

  1. Navigeer naar Build-instellingen - Bestand > Build-instellingen...

  2. Klik in het venster Build-instellingen op Bouwen.

    De app bouwen vanuit Unity

  3. Als u dit nog niet hebt, selecteert u Unity C#-projecten.

  4. Klik op Build. Unity start een Bestandenverkenner-venster, waarin u een map moet maken en selecteren om de app in te bouwen. Maak die map nu en geef deze de naam App. Druk vervolgens op Map selecteren terwijl de map App is geselecteerd.

  5. Unity begint met het bouwen van uw project in de map App .

  6. Zodra Unity klaar is met bouwen (dit kan enige tijd duren), wordt er een Bestandenverkenner venster geopend op de locatie van uw build (controleer de taakbalk, omdat deze mogelijk niet altijd boven uw vensters wordt weergegeven, maar u op de hoogte wordt gesteld van de toevoeging van een nieuw venster).

Hoofdstuk 10 : Implementeren naar HoloLens

Implementeren op HoloLens:

  1. U hebt het IP-adres van uw HoloLens nodig (voor remote deploy) en om ervoor te zorgen dat uw HoloLens zich in de ontwikkelaarsmodus bevindt. Om dit te doen:

    1. Open de Instellingen terwijl u uw HoloLens draagt.
    2. Ga naar Netwerk & Internet > Wi-Fi > Geavanceerde opties
    3. Noteer het IPv4-adres .
    4. Ga vervolgens terug naar Instellingen en vervolgens naar Update & Security > for Developers
    5. Stel de ontwikkelaarsmodus in.
  2. Navigeer naar uw nieuwe Unity-build (de map App ) en open het oplossingsbestand met Visual Studio.

  3. Selecteer foutopsporing in oplossingsconfiguratie.

  4. Selecteer in solution platform x86, Remote Machine.

    Implementeer de oplossing vanuit Visual Studio.

  5. Ga naar het menu Bouwen en klik op Oplossing implementeren om de toepassing te sideloaden naar uw HoloLens.

  6. Uw app wordt nu weergegeven in de lijst met geïnstalleerde apps op uw HoloLens, klaar om te worden gestart.

Notitie

Als u een insluitende headset wilt implementeren, stelt u Solution Platform in op Lokale computer en stelt u configuratie in op Foutopsporing, met x86als platform. Implementeer vervolgens op de lokale computer met behulp van het menu Build en selecteer Oplossing implementeren.

Uw voltooide Computer Vision API-toepassing

Gefeliciteerd, u hebt een mixed reality-app gebouwd die gebruikmaakt van de Azure Computer Vision API om objecten uit de echte wereld te herkennen en vertrouwen te tonen van wat er is gezien.

labresultaat

Bonusoefeningen

Oefening 1

Net zoals u de parameter Tags hebt gebruikt (zoals blijkt uit het eindpunt dat in VisionManager wordt gebruikt), breidt u de app uit om andere informatie te detecteren; Bekijk hier welke andere parameters u nog meer toegang hebt.

Oefening 2

De geretourneerde Azure-gegevens weergeven op een meer gespreks- en leesbare manier, waarbij de getallen mogelijk worden verborgen. Alsof een bot tegen de gebruiker spreekt.