Sdílet prostřednictvím


HoloLens (1. generace) a Azure 302: Počítačové zpracování obrazu


Poznámka:

Kurzy Mixed Reality Academy byly navrženy s HoloLensem (1. generace) a imerzivními náhlavními soupravami hybridní reality. Proto máme pocit, že je důležité nechat tyto kurzy zavedené pro vývojáře, kteří stále hledají pokyny při vývoji těchto zařízení. Tyto kurzy nebudou aktualizovány nejnovějšími sadami nástrojů ani interakcemi používanými pro HoloLens 2. Budou zachovány, aby pokračovaly v práci na podporovaných zařízeních. Bude k dispozici nová série kurzů, které budou publikovány v budoucnu, které předvádějí, jak vyvíjet pro HoloLens 2. Toto oznámení se při publikování aktualizuje odkazem na tyto kurzy.


V tomto kurzu se dozvíte, jak rozpoznávat vizuální obsah v rámci poskytnutého obrázku pomocí funkcí Azure Počítačové zpracování obrazu v aplikaci hybridní reality.

Výsledky rozpoznávání se zobrazí jako popisné značky. Tuto službu můžete použít, aniž byste museli trénovat model strojového učení. Pokud vaše implementace vyžaduje trénování modelu strojového učení, přečtěte si téma MR a Azure 302b.

Výsledek testovacího prostředí

Microsoft Počítačové zpracování obrazu je sada rozhraní API navržená tak, aby vývojářům poskytovala zpracování a analýzu obrázků (s návratovými informacemi) pomocí pokročilých algoritmů, a to vše z cloudu. Vývojáři nahrají adresu URL obrázku nebo obrázku a algoritmy rozhraní API Microsoft Počítačové zpracování obrazu analyzují vizuální obsah na základě vstupů zvolených uživatelem, které pak můžou vrátit informace, včetně identifikace typu a kvality obrázku, rozpoznání lidských tváří (vrácení jejich souřadnic) a označování nebo kategorizace obrázků. Další informace najdete na stránce rozhraní API služby Azure Počítačové zpracování obrazu.

Po dokončení tohoto kurzu budete mít aplikaci HoloLens pro hybridní realitu, která bude moct provést následující akce:

  1. Pomocí gesta klepnutí bude fotoaparát HoloLens zachytit obrázek.
  2. Image se odešle do služby azure Počítačové zpracování obrazu API.
  3. Rozpoznané objekty budou uvedeny v jednoduché skupině uživatelského rozhraní umístěné ve scéně Unity.

V aplikaci je na vás, jak integrovat výsledky s návrhem. Tento kurz je navržený tak, aby vás naučil, jak integrovat službu Azure s projektem Unity. Vaším úkolem je využít znalosti získané z tohoto kurzu k vylepšení aplikace hybridní reality.

Podpora zařízení

Kurz HoloLens Imerzivní náhlavní soupravy
MR a Azure 302: Počítačové zpracování obrazu ✔️ ✔️

Poznámka:

I když se tento kurz primárně zaměřuje na HoloLens, můžete také použít to, co se v tomto kurzu naučíte, na imerzivní náhlavní soupravy Windows Mixed Reality (VR). Vzhledem k tomu, že imerzivní náhlavní soupravy (VR) nemají přístupné kamery, budete potřebovat externí kameru připojenou k počítači. Jak budete postupovat podle kurzu, uvidíte poznámky o všech změnách, které možná budete muset použít pro podporu imerzivních náhlavních souprav (VR).

Požadavky

Poznámka:

Tento kurz je určený pro vývojáře, kteří mají základní zkušenosti s Unity a C#. Mějte také na paměti, že požadavky a písemné pokyny v tomto dokumentu představují to, co bylo otestováno a ověřeno v době psaní (květen 2018). Můžete používat nejnovější software, jak je uvedeno v článku o instalaci nástrojů , i když by se nemělo předpokládat, že informace v tomto kurzu budou dokonale odpovídat tomu, co najdete v novějším softwaru, než je uvedeno níže.

Pro tento kurz doporučujeme následující hardware a software:

Než začnete

  1. Abyste se vyhnuli problémům při sestavování tohoto projektu, důrazně doporučujeme vytvořit projekt uvedený v tomto kurzu v kořenové nebo téměř kořenové složce (dlouhé cesty ke složkám můžou způsobovat problémy v době sestavení).
  2. Nastavte a otestujte HoloLens. Pokud potřebujete podporu k nastavení HoloLens, nezapomeňte navštívit článek o nastavení HoloLens.
  3. Při vývoji nové aplikace HoloLens je vhodné provést kalibraci a ladění senzorů (někdy může pomoct tyto úlohy provádět pro každého uživatele).

Nápovědu k kalibraci najdete v tomto odkazu na článek o kalibraci HoloLens.

Nápovědu k ladění senzorů najdete v tomto odkazu na článek o ladění snímačů HoloLens.

Kapitola 1 – Azure Portal

Pokud chcete používat službu Počítačové zpracování obrazu API v Azure, budete muset nakonfigurovat instanci služby, která bude zpřístupněna vaší aplikaci.

  1. Nejprve se přihlaste k webu Azure Portal.

    Poznámka:

    Pokud ještě nemáte účet Azure, budete ho muset vytvořit. Pokud tento kurz sledujete v situaci v učebně nebo testovacím prostředí, požádejte svého instruktora nebo některého z proktorů, aby vám pomohli nastavit nový účet.

  2. Po přihlášení klikněte v levém horním rohu na Nový a vyhledejte Počítačové zpracování obrazu rozhraní API a klikněte na Enter.

    Vytvoření nového prostředku v Azure

    Poznámka:

    Slovo Nový mohlo být nahrazeno vytvořením prostředku na novějších portálech.

  3. Na nové stránce se zobrazí popis služby Počítačové zpracování obrazu API. V levém dolním rohu této stránky vyberte tlačítko Vytvořit a vytvořte přidružení k této službě.

    Informace o službě api pro počítačové zpracování obrazu

  4. Po kliknutí na Vytvořit:

    1. Vložte požadovaný název pro tuto instanci služby.

    2. Vyberte nějaké předplatné.

    3. Vyberte cenovou úroveň, která je pro vás vhodná, pokud se jedná o první vytvoření služby rozhraní API Počítačové zpracování obrazu, měla by vám být k dispozici bezplatná úroveň (s názvem F0).

    4. Zvolte skupinu prostředků nebo vytvořte novou. Skupina prostředků poskytuje způsob, jak monitorovat, řídit přístup, zřizovat a spravovat fakturaci pro kolekci prostředků Azure. Doporučujeme zachovat všechny služby Azure přidružené k jednomu projektu (například k těmto testovacím prostředím) v rámci společné skupiny prostředků).

      Pokud si chcete přečíst další informace o skupinách prostředků Azure, navštivte prosím článek o skupině prostředků.

    5. Určete umístění vaší skupiny prostředků (pokud vytváříte novou skupinu prostředků). Umístění by ideálně bylo v oblasti, ve které by aplikace běžela. Některé prostředky Azure jsou dostupné jenom v určitých oblastech.

    6. Budete také muset potvrdit, že jste porozuměli podmínkám a ujednáním použitým pro tuto službu.

    7. Klikněte na Vytvořit.

      Informace o vytvoření služby

  5. Jakmile kliknete na Vytvořit, budete muset počkat, až se služba vytvoří, může to chvíli trvat.

  6. Po vytvoření instance služby se na portálu zobrazí oznámení.

    Podívejte se na nové oznámení o nové službě.

  7. Kliknutím na oznámení můžete prozkoumat novou instanci služby.

    Vyberte tlačítko Přejít k prostředku.

  8. Kliknutím na tlačítko Přejít k prostředku v oznámení můžete prozkoumat novou instanci služby. Přejdete do nové instance služby api Počítačové zpracování obrazu.

    Image vaší nové služby rozhraní API Počítačové zpracování obrazu

  9. V tomto kurzu bude vaše aplikace muset volat vaši službu, která se provádí pomocí klíče předplatného vaší služby.

  10. Na stránce Rychlý start přejděte ke službě Počítačové zpracování obrazu API, přejděte k prvnímu kroku, uchopte klíče a klikněte na Klíče (můžete toho dosáhnout také tak, že kliknete na modré hypertextové odkazy Klíče, které se nacházejí v navigační nabídce služeb označené ikonou klíče). Tím se zobrazí klíče služby.

  11. Pořídit kopii jednoho ze zobrazených klíčů, protože ho budete potřebovat později v projektu.

  12. Vraťte se na úvodní stránku Rychlý start a odtud načtěte koncový bod. Mějte na paměti, že vaše údaje se můžou lišit v závislosti na vaší oblasti (pokud ano, budete muset později provést změnu kódu). Zkopírujte si kopii tohoto koncového bodu pro pozdější použití:

    Vaše nová služba rozhraní API Počítačové zpracování obrazu

    Tip

    Tady můžete zkontrolovat, jaké jsou různé koncové body.

Kapitola 2 – Nastavení projektu Unity

Následuje typická sada pro vývoj s hybridní realitou a jako taková je vhodná šablona pro jiné projekty.

  1. Otevřete Unity a klikněte na Nový.

    Spusťte nový projekt Unity.

  2. Teď budete muset zadat název projektu Unity. Vložit MR_ComputerVision Ujistěte se, že je typ projektu nastavený na 3D. Nastavte umístění na místo, které je pro vás vhodné (nezapomeňte, že blíže ke kořenovým adresářům je lepší). Potom klikněte na Vytvořit projekt.

    Zadejte podrobnosti o novém projektu Unity.

  3. Při otevření Unity stojí za to zkontrolovat, jestli je výchozí editor skriptů nastavený na Visual Studio. Přejděte na Upravit předvolby a pak v novém okně přejděte na Externí nástroje. > Změňte editor externích skriptů na Visual Studio 2017. Zavřete okno Předvolby.

    Aktualizujte předvolbu editoru skriptů.

  4. Dále přejděte do Nastavení sestavení souboru > a vyberte Univerzální platforma Windows a kliknutím na tlačítko Přepnout platformu použijte svůj výběr.

    Okno Nastavení sestavení, přepnutí platformy na UPW

  5. Zůstaňte v nastavení sestavení souboru > a ujistěte se, že:

    1. Cílové zařízení je nastavené na HoloLens.

      U imerzivních náhlavních souprav nastavte cílové zařízení na libovolné zařízení.

    2. Typ sestavení je nastavený na D3D.

    3. Sada SDK je nastavená na nejnovější nainstalovanou verzi.

    4. Verze sady Visual Studio je nastavená na nejnovější nainstalovanou verzi.

    5. Sestavení a spuštění je nastavené na místní počítač.

    6. Uložte scénu a přidejte ji do sestavení.

      1. Uděláte to tak, že vyberete Přidat otevřené scény. Zobrazí se okno pro uložení.

        Kliknutí na tlačítko Pro přidání otevřených scén

      2. Vytvořte novou složku pro tuto a jakoukoli budoucí scénu a pak vyberte tlačítko Nová složka a vytvořte novou složku, pojmenujte ji Scény.

        Vytvoření nové složky skriptů

      3. Otevřete nově vytvořenou složku Scény a potom v názvu souboru: textové pole, zadejte MR_ComputerVisionScene a klikněte na uložit.

        Pojmenujte novou scénu.

        Mějte na paměti, že scény Unity musíte uložit do složky Assets , protože musí být přidružené k projektu Unity. Vytvoření složky scén (a dalších podobných složek) je typický způsob strukturování projektu Unity.

    7. Zbývající nastavení v nastavení sestavení by teď měla zůstat ve výchozím nastavení.

  6. V okně Nastavení sestavení klikněte na tlačítko Nastavení přehrávače, otevře se související panel v prostoru, kde se nachází inspektor.

    Otevřete nastavení přehrávače.

  7. Na tomto panelu je potřeba ověřit několik nastavení:

    1. Na kartě Další nastavení:

      1. Skriptovací verze modulu runtime by měla být stabilní (ekvivalent .NET 3.5).

      2. Back-end skriptování by měl být .NET.

      3. Úroveň kompatibility rozhraní API by měla být .NET 4.6

        Aktualizujte další nastavení.

    2. Na kartě Nastavení publikování v části Možnosti zaškrtněte:

      1. InternetClient

      2. Webová kamera

        Aktualizace nastavení publikování

    3. Dále na panelu v nastavení XR (v části Nastavení publikování níže) zaškrtněte možnost Podpora virtuální reality a ujistěte se, že je přidaná sada SDK pro Windows Mixed Reality.

      Aktualizujte nastavení X R.

  8. Zpět v projektech Unity Nastavení sestavení v jazyce C# se už nezobrazuje šedě. Zaškrtněte políčko vedle tohoto příkazu.

  9. Zavřete okno Nastavení sestavení.

  10. Uložte scénu a projekt (FILE SAVE SCENE / FILE > > SAVE PROJECT).

Kapitola 3 – Nastavení hlavní kamery

Důležité

Pokud chcete přeskočit komponentu Nastavení Unity v tomto kurzu a pokračovat přímo do kódu, můžete si stáhnout tento balíček .unitypackage, importovat ho do projektu jako vlastní balíček a pokračovat z kapitoly 5.

  1. Na panelu hierarchie vyberte hlavní kameru.

  2. Po výběru uvidíte všechny součásti hlavní kamery na panelu inspektoru.

    1. Objekt Fotoaparát musí mít název Hlavní kamera (všimněte si pravopisu!)

    2. Hlavní značka fotoaparátu musí být nastavená na MainCamera (všimněte si pravopisu!)

    3. Ujistěte se, že je pozice transformace nastavená na hodnotu 0, 0, 0.

    4. Nastavte vymazat příznaky na plnou barvu (ignorujte to pro imerzivní náhlavní soupravu).

    5. Nastavte barvu pozadí komponenty fotoaparátu na černou, alfa 0 (šestnáctkový kód: #00000000) (ignorujte ji pro imerzivní náhlavní soupravu).

      Aktualizujte součásti fotoaparátu.

  3. Dále budete muset vytvořit jednoduchý objekt Kurzor připojený k hlavní kameře, který vám pomůže umístit výstup analýzy obrázků při spuštění aplikace. Tento kurzor určí střed fokusu kamery.

Vytvoření kurzoru:

  1. Na panelu hierarchie klikněte pravým tlačítkem myši na hlavní kameru. V části 3D objekt klikněte na Sphere.

    Vyberte objekt kurzoru.

  2. Přejmenujte objekt Sphere na Kurzor (poklikejte na objekt Kurzor nebo stiskněte tlačítko klávesnice F2 s vybraným objektem) a ujistěte se, že je umístěn jako podřízený objekt hlavní kamery.

  3. V panelu hierarchie klikněte levým tlačítkem myši na kurzor. Když je vybraný kurzor, upravte na panelu inspektoru následující proměnné:

    1. Nastavení pozice transformace na 0, 0, 5

    2. Nastavení měřítka na 0.02, 0.02, 0.02

      Aktualizujte pozici transformace a měřítko.

Kapitola 4 – Nastavení systému popisků

Po zachycení obrázku s kamerou HoloLens se tento obrázek odešle do vaší instance služby API azure Počítačové zpracování obrazu k analýze.

Výsledky této analýzy budou seznam rozpoznaných objektů s názvem Značky.

Popisky (jako 3D text ve světě) použijete k zobrazení těchto značek na místě, kde byla fotka pořízena.

Následující kroky ukazují, jak nastavit objekt Label .

  1. Klikněte pravým tlačítkem na libovolné místo v panelu hierarchie (umístění v tomto okamžiku nezáleží) v části 3D objekt přidejte 3D text. Pojmenujte ho LabelText.

    Vytvoření 3D textového objektu

  2. V panelu hierarchie klikněte levým tlačítkem na Popisek. Když vyberete LabelText, na panelu inspektoru upravte následující proměnné:

    1. Nastavení pozice na 0,0,0
    2. Nastavení měřítka na 0.01, 0.01, 0.01
    3. V komponentě Text Mesh:
    4. Nahraďte veškerý text v textu textem "..."
    5. Nastavení ukotvení na střed
    6. Nastavení zarovnání na střed
    7. Nastavení velikosti tabulátoru na 4
    8. Nastavení velikosti písma na 50
    9. Nastavení barvy na #FFFFFFFF

    Textová komponenta

  3. Přetáhněte text LabelText z panelu hierarchie do složky Asset v panelu projektu. Díky tomu bude LabelText předfabem, aby se mohl vytvořit instance v kódu.

    Vytvořte předfab objektu LabelText.

  4. Text LabelText byste měli odstranit z panelu hierarchie, aby se nezobrazovat v úvodní scéně. Vzhledem k tomu, že se jedná o prefab, který budete volat pro jednotlivé instance ze složky Assets, není nutné ho ve scéně uchovávat.

  5. Konečná struktura objektu v panelu hierarchie by měla být podobná té, která je znázorněna na následujícím obrázku:

    Konečná struktura panelu hierarchie

Kapitola 5 – Vytvoření třídy ResultsLabel

Prvním skriptem, který potřebujete vytvořit, je třída ResultsLabel , která je zodpovědná za následující:

  • Vytvoření popisků v příslušném světovém prostoru vzhledem k poloze kamery.
  • Zobrazení značek z anaysis obrázku

Vytvoření této třídy:

  1. Pravým tlačítkem myši klikněte na panel projektu a pak na Vytvořit > složku. Pojmenujte složky Skripty.

    Vytvořte složku skriptů.

  2. Když vytvoříte složku Scripts , poklikejte na ni a otevřete ji. Potom v této složce klikněte pravým tlačítkem myši a vyberte Vytvořit > a potom skript jazyka C#. Pojmenujte skript ResultsLabel.

  3. Poklikáním otevřete nový skript ResultsLabel v sadě Visual Studio.

  4. Do třídy vložte následující kód do třídy 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. Než se vrátíte do Unity, nezapomeňte změny uložit v sadě Visual Studio.

  6. Zpět v Unity Editoru klikněte a přetáhněte třídu ResultsLabel ze složky Scripts do objektu Hlavní kamera na panelu hierarchie.

  7. Klikněte na hlavní kameru a podívejte se na panel inspektoru.

Všimněte si, že ze skriptu, který jste právě přetáhli do kamery, jsou dvě pole: Kurzor a Předfab popisku.

  1. Přetáhněte objekt s názvem Kurzor z panelu hierarchie do slotu s názvem Kurzor, jak je znázorněno na obrázku níže.

  2. Přetáhněte objekt s názvem LabelText ze složky Assets na panelu projektu do slotu s názvem Prefab popisku, jak je znázorněno na obrázku níže.

    Nastavte referenční cíle v Rámci Unity.

Kapitola 6 – Vytvoření třídy ImageCapture

Další třídou, kterou vytvoříte, je Třída ImageCapture . Tato třída zodpovídá za:

  • Zachycení obrázku pomocí fotoaparátu HoloLens a jeho uložení do složky aplikace
  • Zachytávání gest klepnutím od uživatele

Vytvoření této třídy:

  1. Přejděte do složky Scripts , kterou jste vytvořili dříve.

  2. Klikněte pravým tlačítkem do složky a vytvořte > skript jazyka C#. Volání skriptu ImageCapture.

  3. Poklikáním otevřete nový skript ImageCapture v sadě Visual Studio.

  4. Do horní části souboru přidejte následující obory názvů:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Pak přidejte následující proměnné do třídy ImageCapture nad Metodu Start():

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

Proměnná tapsCount uloží počet gest klepnutí zachycených uživatelem. Toto číslo se používá při pojmenování zachycených imagí.

  1. Teď je potřeba přidat kód pro metody Awake() a Start(). Tyto se budou volat při inicializaci třídy:

        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. Implementujte obslužnou rutinu, která bude volána, když dojde k gestu klepnutí.

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

Metoda TapHandler() zvýší počet klepnutí zachycených od uživatele a použije aktuální pozici kurzoru k určení umístění nového popisku.

Tato metoda pak volá ExecuteImageCaptureAndAnalysis() metoda, která zahájí základní funkce této aplikace.

  1. Jakmile se image zachytí a uloží, zavolá se následující obslužné rutiny. Pokud je proces úspěšný, výsledek se předá správci VisionManager (který jste ještě vytvořili) pro analýzu.

        /// <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. Pak přidejte metodu, kterou aplikace používá ke spuštění procesu zachycení image a uložení image.

        /// <summary>    
        /// Begin process of Image Capturing and send To Azure     
        /// Computer Vision service.   
        /// </summary>    
        private void ExecuteImageCaptureAndAnalysis()  
        {    
            // Set the camera resolution to be the highest possible    
            Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First();    
    
            Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
    
            // Begin capture process, set the image format    
            PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)    
            {    
                photoCaptureObject = captureObject;    
                CameraParameters camParameters = new CameraParameters();    
                camParameters.hologramOpacity = 0.0f;    
                camParameters.cameraResolutionWidth = targetTexture.width;    
                camParameters.cameraResolutionHeight = targetTexture.height;    
                camParameters.pixelFormat = CapturePixelFormat.BGRA32;
    
                // Capture the image from the camera and save it in the App internal folder    
                captureObject.StartPhotoModeAsync(camParameters, delegate (PhotoCapture.PhotoCaptureResult result)
                {    
                    string filename = string.Format(@"CapturedImage{0}.jpg", tapsCount);
    
                    string filePath = Path.Combine(Application.persistentDataPath, filename);
    
                    VisionManager.instance.imagePath = filePath;
    
                    photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);
    
                    currentlyCapturing = false;
                });   
            });    
        }
    

Upozorňující

V tuto chvíli si všimnete chyby, která se zobrazí na panelu konzoly Unity Editoru. Důvodem je to, že kód odkazuje na třídu VisionManager , kterou vytvoříte v další kapitole.

Kapitola 7 – Volání do Azure a analýzy obrázků

Posledním skriptem, který potřebujete vytvořit, je třída VisionManager .

Tato třída zodpovídá za:

  • Načtení nejnovější image zachycené jako pole bajtů
  • Odeslání pole bajtů do instance služby AZURE Počítačové zpracování obrazu API pro účely analýzy
  • Přijetí odpovědi jako řetězce JSON
  • Deserializace odpovědi a předání výsledných značek do Třídy ResultsLabel .

Vytvoření této třídy:

  1. Poklikáním otevřete složku Skripty .

  2. Klikněte pravým tlačítkem do složky Scripts (Skripty ) a klikněte na Create C# Script (Vytvořit > skript jazyka C#). Pojmenujte skript VisionManager.

  3. Poklikáním na nový skript ho otevřete v sadě Visual Studio.

  4. Aktualizujte obory názvů tak, aby byly stejné jako v horní části třídy VisionManager :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. V horní části skriptu uvnitř třídy VisionManager (nad metodou Start() teď potřebujete vytvořit dvě třídy , které budou představovat deserializovanou odpověď JSON z 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;
        }
    

    Poznámka:

    Třídy TagData a Object musí mít atribut [System.Serializable] přidaný před deklaraci, aby bylo možné deserializovat s knihovnami Unity.

  6. Do třídy VisionManager byste měli přidat následující proměnné:

        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;
    

    Upozorňující

    Ujistěte se, že do proměnné authorizationKey vložíte ověřovací klíč. Na začátku tohoto kurzu jste si poznamenali svůj ověřovací klíč , kapitola 1.

    Upozorňující

    Proměnná visionAnalysisEndpoint se může lišit od proměnné zadané v tomto příkladu. Usa – západ výhradně odkazují na instance služby vytvořené pro oblast USA – západ. Aktualizujte tuto adresu URL koncového bodu. Tady je několik příkladů, jak by to mohlo vypadat:

    • Západní Evropa: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Jihovýchodní Asie: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Austrálie – východ: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Teď je potřeba přidat kód pro probuzení.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Dále přidejte korutin (se statickou metodou streamu pod ní), která získá výsledky analýzy obrázku zachyceného třídou 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. Než se vrátíte do Unity, nezapomeňte změny uložit v sadě Visual Studio.

  10. Zpět v Unity Editoru klikněte a přetáhněte třídy VisionManager a ImageCapture ze složky Scripts do objektu Main Camera na panelu hierarchie.

Kapitola 8 – Před budovou

Pokud chcete provést důkladný test aplikace, budete ji muset načíst na HoloLens bokem. Než to uděláte, ujistěte se, že:

  • Všechna nastavení uvedená v kapitole 2 jsou správně nastavena.
  • Všechny skripty jsou připojené k objektu Hlavní kamera .
  • Všechna pole na hlavním panelu kontroly kamery jsou správně přiřazena.
  • Ujistěte se, že do proměnné authorizationKey vložíte ověřovací klíč.
  • Ujistěte se, že jste také zkontrolovali koncový bod ve skriptu VisionManager a že je zarovnaný s vaší oblastí (tento dokument ve výchozím nastavení používá usa – západ ).

Kapitola 9 – Sestavení řešení pro UPW a zkušební načtení aplikace

Všechno potřebné pro oddíl Unity tohoto projektu bylo dokončeno, takže je čas ho sestavit z Unity.

  1. Přejděte do nastavení sestavení souboru > nastavení - sestavení...

  2. V okně Nastavení sestavení klikněte na Sestavit.

    Sestavení aplikace z Unity

  3. Pokud ještě ne, zaškrtněte projekty Unity C#.

  4. Klikněte na Sestavit. Unity spustí okno Průzkumník souborů, ve kterém potřebujete vytvořit a pak vybrat složku pro sestavení aplikace. Vytvořte teď složku a pojmenujte ji App. Pak s vybranou složkou Aplikace stiskněte vybrat složku.

  5. Unity začne sestavovat projekt do složky Aplikace .

  6. Po dokončení sestavování Unity (může to nějakou dobu trvat), otevře se okno Průzkumník souborů na místě sestavení (zkontrolujte hlavní panel, protože se nemusí vždy zobrazovat nad okny, ale upozorní vás na přidání nového okna).

Kapitola 10 – Nasazení do HoloLens

Nasazení na HoloLens:

  1. Budete potřebovat IP adresu vašeho HoloLensu (pro vzdálené nasazení) a zajistit, aby byl HoloLens v režimu vývojáře. Akce:

    1. Když nosíte HoloLens, otevřete Nastavení.
    2. Přejít na možnosti Rozšířené možnosti sítě a internetu > Wi-Fi >
    3. Poznamenejte si adresu IPv4 .
    4. Pak přejděte zpět na Nastavení a pak přejděte na Aktualizovat a zabezpečení > pro vývojáře.
    5. Nastavte režim vývojáře.
  2. Přejděte do nového sestavení Unity ( složka aplikace ) a otevřete soubor řešení v sadě Visual Studio.

  3. V konfiguraci řešení vyberte Ladit.

  4. Na platformě řešení vyberte x86, Vzdálený počítač.

    Nasaďte řešení ze sady Visual Studio.

  5. Přejděte do nabídky Sestavení a kliknutím na Nasadit řešení načtěte aplikaci do holoLensu bokem.

  6. Vaše aplikace by se teď měla zobrazit v seznamu nainstalovaných aplikací na vašem HoloLensu, připravených ke spuštění!

Poznámka:

Pokud chcete nasadit do imerzivní náhlavní soupravy, nastavte platformu řešení na místní počítač a nastavte konfiguraci na Ladění s platformou x86. Potom nasaďte na místní počítač pomocí nabídky Sestavení a vyberte Nasadit řešení.

Dokončená aplikace rozhraní API Počítačové zpracování obrazu

Blahopřejeme, vytvořili jste aplikaci hybridní reality, která využívá rozhraní API Počítačové zpracování obrazu Azure k rozpoznávání reálných objektů a zobrazení spolehlivosti toho, co bylo vidět.

Výsledek testovacího prostředí

Bonusová cvičení

Cvičení 1

Stejně jako jste použili parametr Tags (jak je uvedeno v koncovém bodu použitém v rámci VisionManager), rozšiřte aplikaci o detekci dalších informací. Podívejte se, k jakým dalším parametrům máte přístup tady.

Cvičení 2

Zobrazte vrácená data Azure v konverzačním a čitelnějším způsobem, třeba skryjete čísla. Jako by robot mohl mluvit s uživatelem.