Delen via


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


Notitie

De Mixed Reality Academy-zelfstudies zijn ontworpen met HoloLens (1e generatie) en Mixed Reality Immersive Headsets in gedachten. Daarom vinden we het belangrijk om deze zelfstudies te behouden voor ontwikkelaars die nog steeds op zoek zijn naar richtlijnen bij het ontwikkelen voor die apparaten. Deze zelfstudies worden niet bijgewerkt met de nieuwste toolsets of interacties die worden gebruikt voor HoloLens 2. Ze blijven behouden om door te gaan met het werken op de ondersteunde apparaten. Er is een nieuwe reeks zelfstudies die in de toekomst zullen worden gepost en die laten zien hoe u zich ontwikkelt voor HoloLens 2. Deze kennisgeving wordt bijgewerkt met een koppeling naar deze zelfstudies wanneer ze worden gepost.


In deze cursus leert u hoe u visuele inhoud binnen een opgegeven afbeelding kunt herkennen met behulp van De mogelijkheden van Azure Computer Vision 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 uw implementatie een machine learning-model moet trainen, raadpleegt u MR en Azure 302b.

labresultaat

Microsoft Computer Vision is een set API's die zijn ontworpen om ontwikkelaars afbeeldingsverwerking en -analyse (met retourgegevens) te bieden met behulp van geavanceerde algoritmen, allemaal vanuit de cloud. Ontwikkelaars uploaden een afbeeldings- 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 azure Computer Vision-API-pagina voor meer informatie.

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

  1. Met de tikbeweging legt de camera van de HoloLens een afbeelding vast.
  2. De afbeelding wordt verzonden naar de Azure Computer Vision-API-service.
  3. De herkende objecten worden weergegeven in een eenvoudige UI-groep die in de Unity-scène wordt geplaatst.

In uw toepassing is het aan u om te bepalen hoe u de resultaten integreert met uw ontwerp. Deze cursus is ontworpen om u te leren hoe u een Azure Service integreert met uw Unity-project. Het is uw taak om de kennis die u uit deze cursus krijgt te gebruiken om uw mixed reality-toepassing te verbeteren.

Ondersteuning voor apparaten

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

Notitie

Hoewel deze cursus voornamelijk gericht is op HoloLens, kunt u ook toepassen wat u in deze cursus leert op Vr-headsets (Windows Mixed Reality immersive). Omdat insluitende headsets (VR) 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 gebruiken om insluitende headsets (VR) te ondersteunen.

Vereisten

Notitie

Deze zelfstudie is ontworpen voor ontwikkelaars die basiservaring hebben met Unity en C#. Houd er ook rekening mee dat de vereisten en schriftelijke instructies in dit document staan voor wat is getest en geverifieerd op het moment van schrijven (mei 2018). U kunt de nieuwste software gebruiken, zoals vermeld in het artikel over de installatie van de hulpprogramma's , hoewel er niet van wordt uitgegaan dat de informatie in deze cursus perfect overeenkomt met wat u vindt in nieuwere software dan 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 genoemd in een hoofdmap of in een near-rootmap (lange mappaden kunnen problemen veroorzaken tijdens de build).
  2. Uw HoloLens instellen en testen. Als u ondersteuning nodig hebt voor het instellen van uw HoloLens, gaat u naar het installatieartikel van HoloLens.
  3. Het is een goed idee om kalibratie en sensorafstemming uit te voeren bij het ontwikkelen van een nieuwe HoloLens-app (soms kan het helpen om deze taken voor elke gebruiker uit te voeren).

Voor hulp bij kalibratie volgt u deze koppeling naar het HoloLens-kalibratieartikel.

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

Hoofdstuk 1: 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 voor 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 proctors voor hulp bij het instellen van uw nieuwe account.

  2. Zodra u bent aangemeld, klikt u op Nieuw in de linkerbovenhoek en zoekt u naar de 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. Zodra u op Maken hebt geklikt:

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

    2. Selecteer een abonnement.

    3. Selecteer de prijscategorie die voor u geschikt is. 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 de toegang te bewaken, te beheren, facturering in te richten en te beheren voor een verzameling Azure-assets. Het wordt aanbevolen om alle Azure-services die zijn gekoppeld aan één project (zoals deze labs) onder een gemeenschappelijke resourcegroep te houden.

      Als u meer wilt weten over Azure-resourcegroepen, gaat u naar het artikel over de resourcegroep.

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

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

    7. Klik op Create.

      Informatie over het maken van services

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

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

    Bekijk 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 de resource in de melding om uw nieuwe service-exemplaar te verkennen. U wordt naar uw nieuwe Exemplaar van de Computer Vision-API-service gebracht.

    De nieuwe afbeelding van de Computer Vision-API-service

  9. In deze zelfstudie moet uw toepassing aanroepen doen naar uw service, wat wordt gedaan 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, pak uw sleutels en klik op Sleutels (u kunt dit ook bereiken door te klikken op de blauwe hyperlinksleutels in het navigatiemenu van de services, aangeduid door het sleutelpictogram). Hiermee worden uw servicesleutels weergegeven.

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

  12. Ga terug naar de pagina Snel starten en haal uw eindpunt op. Houd er rekening mee dat uw gegevens mogelijk verschillen, afhankelijk van uw regio (als dat het 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

Hier volgt een typische opzet voor het ontwikkelen met mixed reality en is als zodanig 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 (vergeet niet, dichter bij hoofdmappen is beter). 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 .

    De voorkeur van scripteditor bijwerken.

  4. Ga vervolgens naar Instellingen voor bestandsbuild > en selecteer Universeel Windows-platform en klik vervolgens op de knop Platform wisselen om uw selectie toe te passen.

    Venster Instellingen bouwen, platform overschakelen naar UWP.

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

    1. Doelapparaat is ingesteld op HoloLens

      Voor de insluitende 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 Meest recent 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. Doe dit door Open Scènes toevoegen te selecteren. Er wordt een venster voor opslaan weergegeven.

        Klik op de knop Open scènes toevoegen

      2. Maak hiervoor een nieuwe map, en voor elke toekomst scène, 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 klik vervolgens in het tekstvak Bestandsnaam, typ MR_ComputerVisionScene en klik vervolgens op Opslaan.

        Geef een nieuwe scène een naam.

        Houd er rekening mee dat u uw Unity-scènes in de map Assets moet opslaan, 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 standaard blijven staan.

  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.

    Open de spelerinstellingen.

  7. In dit deelvenster moeten enkele instellingen worden geverifieerd:

    1. Op het tabblad Overige instellingen :

      1. De runtimeversie van scripting moet stabiel zijn (equivalent van.NET 3.5).

      2. Back-end voor 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. Schakel verderop in het deelvenster in XR-instellingen (hieronder Publicatie-instellingen) het selectievakje Virtual Reality Ondersteund in, zorg ervoor dat de Windows Mixed Reality SDK is toegevoegd.

      Werk de X R-instellingen bij.

  8. Terug in Build Settings Unity C# Projects wordt niet meer grijs weergegeven. Schakel het selectievakje naast dit selectievakje in.

  9. Sluit het venster Build Settings.

  10. Sla uw scène en project op (FILE > SAVE SCENE/ FILE > SAVE PROJECT).

Hoofdstuk 3 – Hoofdcamera instellen

Belangrijk

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

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

  2. Zodra deze optie is geselecteerd, kunt u alle onderdelen van de hoofdcamera in het inspectorpaneel zien.

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

    2. De hoofdcamera-tag moet worden ingesteld op MainCamera (let op de spelling!)

    3. Zorg ervoor dat de positie van de transformatie is ingesteld op 0, 0, 0

    4. Stel Clear Flags in op Solid Color (negeer dit voor insluitende headset).

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

      Cameraonderdelen bijwerken.

  3. Vervolgens moet u een eenvoudig cursorobject maken dat is gekoppeld aan de hoofdcamera, waarmee u de uitvoer van de afbeeldingsanalyse kunt positioneren 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 Sphere.

    Selecteer het cursorobject.

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

  3. Klik in het deelvenster Hiërarchie met de linkermuisknop op de cursor. Als 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 met de HoloLens-camera hebt vastgelegd, wordt die afbeelding verzonden naar uw Azure Computer Vision API Service-exemplaar voor analyse.

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

U gebruikt labels (als 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 maakt op dit moment niet uit), voeg onder 3D-object een 3D-tekst toe. Geef het labeltekst een naam.

    Maak een 3D-tekstobject.

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

    1. De positie instellen 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 Tekst door '...'
    5. Het anker instellen op middencentrum
    6. De uitlijning instellen op midden
    7. De tabgrootte instellen op 4
    8. De tekengrootte instellen op 50
    9. De kleur instellen op #FFFFFFFF

    Tekstonderdeel

  3. Sleep de LabelText van het deelvenster Hiërarchie naar de assetmap in het deelvenster Project. Hierdoor wordt LabelText een prefab gemaakt, zodat deze kan worden geïnstantieerd in code.

    Maak een prefab van het LabelText-object.

  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 uit de map Assets, hoeft u deze niet binnen de scène te bewaren.

  5. De uiteindelijke objectstructuur in het deelvenster Hiërarchie moet eruitzien als de structuur die wordt weergegeven in de onderstaande afbeelding:

    Uiteindelijke 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 uit de afbeeldings-anaysis weergeven.

Ga als volgt te werk om deze klasse te maken:

  1. Klik met de rechtermuisknop in het projectvenster en klik vervolgens op Map maken>. Geef de mapscripts een naam.

    Maak de map Scripts.

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

  3. Dubbelklik op het nieuwe ResultsLabel-script 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. Sla uw wijzigingen op in Visual Studio voordat u terugkeert naar Unity.

  6. Klik in de Unity Editor en sleep de klasse ResultsLabel van de map Scripts naar het object Main Camera in het deelvenster Hierarchy.

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

U zult merken dat er vanuit 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 site met de naam Cursor, zoals wordt weergegeven in de onderstaande afbeelding.

  2. Sleep het object LabelText vanuit 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 app-map.
  • 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. De methoden Code for Awake() en Start() moeten nu worden toegevoegd. Deze worden aangeroepen wanneer de klasse wordt geïnitialiseerd:

        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 plaatsvindt.

        /// <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 dat is vastgelegd door de gebruiker verhoogd en wordt de huidige cursorpositie 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 de toepassing gebruikt om het opnameproces voor installatiekopieën 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 VisionManager-klasse .

Deze klasse is verantwoordelijk voor:

  • Het laden van de meest recente afbeelding die is 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 VisionManager een naam.

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

  4. Werk de naamruimten bij zodat deze hetzelfde zijn als de volgende, boven aan de VisionManager-klasse :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Boven aan uw script, in de VisionManager-klasse (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] hebben toegevoegd voordat de declaratie kan 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 invoegt in de authorizationKey-variabele . U hebt uw verificatiesleutel aan het begin van deze cursus, hoofdstuk 1, genoteerd.

    Waarschuwing

    De variabele visionAnalysisEndpoint kan afwijken van de variabele die in dit voorbeeld is opgegeven. De vs - 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 dit eruit kan zien:

    • Europa - west: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Zuidoost-Azië: 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 for Awake 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 opgehaald van de analyse van de afbeelding die is vastgelegd door 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. Sla uw wijzigingen op in Visual Studio voordat u terugkeert naar Unity.

  10. Klik en sleep in de Unity Editor de klassen VisionManager en ImageCapture van de map Scripts naar het object Main Camera in het deelvenster Hierarchy.

Hoofdstuk 8 – Voor het gebouw

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 genoemd, zijn correct ingesteld.
  • Alle scripts zijn gekoppeld aan het object Main Camera .
  • Alle velden in het configuratiescherm van de hoofdcamera zijn correct toegewezen.
  • Zorg ervoor dat u uw verificatiesleutel invoegt in de authorizationKey-variabele .
  • Zorg ervoor dat u uw eindpunt ook hebt gecontroleerd in uw VisionManager-script en dat het wordt uitgelijnd op uw regio (dit document maakt standaard gebruik van 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 Settings File > Build Settings - ...

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

    De app bouwen vanuit Unity

  3. Als dat nog niet zo is, tikt u op Unity C#-projecten.

  4. Klik op Opbouwen. Unity start een Bestandenverkenner-venster waarin u een map moet maken en vervolgens een map selecteert waarin u de app wilt inbouwen. Maak die map nu en noem deze app. Druk vervolgens op Map selecteren terwijl de app-map is geselecteerd.

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

  6. Zodra Unity klaar is met bouwen (het 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 ontvangt een melding over de toevoeging van een nieuw venster).

Hoofdstuk 10 – Implementeren in HoloLens

Implementeren op HoloLens:

  1. U hebt het IP-adres van uw HoloLens nodig (voor Extern implementeren) en om ervoor te zorgen dat uw HoloLens zich in de ontwikkelaarsmodus bevindt. Dit doet u als volgt:

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

  3. Selecteer foutopsporing in de oplossingsconfiguratie.

  4. Selecteer x86, Remote Machine in het Solution Platform.

    Implementeer de oplossing vanuit Visual Studio.

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

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

Notitie

Als u wilt implementeren op een insluitende headset, stelt u het Solution Platform in op de lokale computer en stelt u de configuratie in op Foutopsporing, met x86 als 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 echte wereldobjecten te herkennen en het vertrouwen weer te geven van wat er is gezien.

labresultaat

Bonusoefeningen

Oefening 1

Net zoals u de parameter Tags hebt gebruikt (zoals wordt aangetoond binnen het eindpunt dat in VisionManager wordt gebruikt), kunt u de app uitbreiden om andere informatie te detecteren. Bekijk welke andere parameters u hier kunt openen.

Oefening 2

Geef de geretourneerde Azure-gegevens weer, op een meer gespreks- en leesbare manier, waardoor de getallen mogelijk worden verborgen. Alsof een bot misschien met de gebruiker praat.