HoloLens (1. gen) i Azure 302: przetwarzanie obrazów


Uwaga

Samouczki dotyczące akademii Mixed Reality zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji) i Mixed Reality immersywnych zestawów słuchawkowych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków w miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania tych urządzeń. Te samouczki nie zostaną zaktualizowane przy użyciu najnowszych zestawów narzędzi ani interakcji używanych do HoloLens 2. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. W przyszłości zostanie opublikowana nowa seria samouczków, które pokażą, jak opracowywać HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.


W tym kursie dowiesz się, jak rozpoznawać zawartość wizualną na podanym obrazie przy użyciu funkcji usługi Azure przetwarzanie obrazów w aplikacji rzeczywistości mieszanej.

Wyniki rozpoznawania będą wyświetlane jako tagi opisowe. Tej usługi można używać bez konieczności trenowania modelu uczenia maszynowego. Jeśli implementacja wymaga trenowania modelu uczenia maszynowego, zobacz MR i Azure 302b.

wynik laboratorium

Microsoft przetwarzanie obrazów to zestaw interfejsów API zaprojektowanych w celu zapewnienia deweloperom przetwarzania i analizy obrazów (z informacjami zwrotnymi), przy użyciu zaawansowanych algorytmów— wszystkich z chmury. Deweloperzy przekazują adres URL obrazu lub obrazu, a algorytmy interfejsu API przetwarzanie obrazów firmy Microsoft analizują zawartość wizualną na podstawie danych wejściowych wybranych przez użytkownika, które następnie mogą zwracać informacje, w tym identyfikowanie typu i jakości obrazu, wykrywanie ludzkich twarzy (zwracanie ich współrzędnych) oraz tagowanie lub kategoryzowanie obrazów. Aby uzyskać więcej informacji, odwiedź stronę interfejsu API usługi Azure przetwarzanie obrazów.

Po ukończeniu tego kursu będziesz mieć aplikację HoloLens rzeczywistości mieszanej, która będzie mogła wykonać następujące czynności:

  1. Za pomocą gestu Naciśnij aparat urządzenia HoloLens przechwyci obraz.
  2. Obraz zostanie wysłany do usługi azure przetwarzanie obrazów API Service.
  3. Rozpoznane obiekty zostaną wyświetlone w prostej grupie interfejsu użytkownika umieszczonej w scenie aparatu Unity.

W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs został zaprojektowany, aby nauczyć cię, jak zintegrować usługę platformy Azure z projektem aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy uzyskanych z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej.

Obsługa urządzeń

Kurs HoloLens Immersyjne zestawy słuchawkowe
MR i Azure 302: przetwarzanie obrazów ✔️ ✔️

Uwaga

Chociaż ten kurs koncentruje się przede wszystkim na holoLens, możesz również zastosować to, czego nauczysz się w tym kursie, aby Windows Mixed Reality immersyjne zestawy słuchawkowe (VR). Ponieważ immersyjne zestawy nagłowne (VR) nie mają dostępnych kamer, potrzebny będzie zewnętrzny aparat podłączony do komputera. Wraz z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być potrzebne do obsługi immersyjnych zestawów słuchawkowych (VR).

Wymagania wstępne

Uwaga

Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Możesz bezpłatnie korzystać z najnowszego oprogramowania, jak pokazano w artykule dotyczącym instalacji narzędzi , choć nie należy zakładać, że informacje w tym kursie doskonale pasują do tego, co znajdziesz w nowszym oprogramowaniu niż wymienione poniżej.

Na potrzeby tego kursu zalecamy następujące oprogramowanie i sprzęt:

Przed rozpoczęciem

  1. Aby uniknąć problemów z kompilowaniem tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
  2. Skonfiguruj i przetestuj urządzenie HoloLens. Jeśli potrzebujesz pomocy technicznej dotyczącej konfigurowania urządzenia HoloLens, zapoznaj się z artykułem dotyczącym konfiguracji urządzenia HoloLens.
  3. Dobrym pomysłem jest wykonanie kalibracji i dostrajania czujników podczas tworzenia nowej aplikacji HoloLens (czasami może to pomóc w wykonywaniu tych zadań dla każdego użytkownika).

Aby uzyskać pomoc dotyczącą kalibracji, skorzystaj z tego linku do artykułu Kalibracja urządzenia HoloLens.

Aby uzyskać pomoc dotyczącą dostrajania czujników, skorzystaj z tego linku do artykułu Dostrajanie czujników holoLens.

Rozdział 1 — witryna Azure Portal

Aby korzystać z usługi interfejsu API przetwarzanie obrazów na platformie Azure, należy skonfigurować wystąpienie usługi, które ma zostać udostępnione aplikacji.

  1. Najpierw zaloguj się do witryny Azure Portal.

    Uwaga

    Jeśli nie masz jeszcze konta platformy Azure, musisz go utworzyć. Jeśli obserwujesz ten samouczek w sytuacji w klasie lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc w skonfigurowaniu nowego konta.

  2. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj interfejs API przetwarzanie obrazów, a następnie kliknij przycisk Enter.

    Tworzenie nowego zasobu na platformie Azure

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.

  3. Nowa strona zawiera opis usługi interfejsu API przetwarzanie obrazów. W lewym dolnym rogu tej strony wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.

    Informacje o usłudze interfejsu API przetwarzania obrazów

  4. Po kliknięciu pozycji Utwórz:

    1. Wstaw żądaną nazwę dla tego wystąpienia usługi.

    2. Wybierz subskrypcję.

    3. Wybierz odpowiednią dla Ciebie warstwę cenową, jeśli po raz pierwszy utworzysz usługę interfejsu API przetwarzanie obrazów, powinna być dostępna warstwa bezpłatna (o nazwie F0).

    4. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się przechowywanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, odwiedź artykuł dotyczący grupy zasobów.

    5. Określ lokalizację grupy zasobów (jeśli tworzysz nową grupę zasobów). Lokalizacja najlepiej byłaby znajdować się w regionie, w którym aplikacja zostanie uruchomiona. Niektóre zasoby platformy Azure są dostępne tylko w niektórych regionach.

    6. Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.

    7. Kliknij pozycję Utwórz.

      Informacje o tworzeniu usługi

  5. Po kliknięciu pozycji Utwórz trzeba będzie poczekać, aż usługa zostanie utworzona, może to potrwać minutę.

  6. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.

    Zobacz nowe powiadomienie dotyczące nowej usługi

  7. Kliknij powiadomienie, aby zapoznać się z nowym wystąpieniem usługi.

    Wybierz przycisk Przejdź do zasobu.

  8. Kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi. Nastąpi przekierowanie do nowego wystąpienia usługi interfejsu API przetwarzanie obrazów.

    Obraz nowej usługi interfejsu API przetwarzanie obrazów

  9. W ramach tego samouczka aplikacja będzie musiała wykonywać wywołania usługi, co odbywa się za pomocą klucza subskrypcji usługi.

  10. Na stronie Szybki start usługi interfejsu API przetwarzanie obrazów przejdź do pierwszego kroku, Pobierz klucze i kliknij pozycję Klucze (możesz to również osiągnąć, klikając niebieskie klucze hiperłącza, znajdujące się w menu nawigacji usług, oznaczone ikoną klucza). Spowoduje to ujawnienie kluczy usługi.

  11. Utwórz kopię jednego z wyświetlanych kluczy, ponieważ będzie to potrzebne później w projekcie.

  12. Wstecz do strony Szybki start, a następnie pobierz punkt końcowy. Należy pamiętać, że Twoje dane mogą się różnić w zależności od regionu (co oznacza, że konieczne będzie późniejsze wprowadzenie zmiany w kodzie). Utwórz kopię tego punktu końcowego do późniejszego użycia:

    Nowa usługa interfejsu API przetwarzanie obrazów

    Porada

    Możesz sprawdzić, jakie są różne punkty końcowe TUTAJ.

Rozdział 2 — Konfigurowanie projektu aparatu Unity

Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.

  1. Otwórz aparat Unity i kliknij pozycję Nowy.

    Uruchom nowy projekt aparatu Unity.

  2. Teraz musisz podać nazwę projektu aparatu Unity. Wstaw MR_ComputerVision. Upewnij się, że typ projektu ma ustawioną wartość 3D. Ustaw lokalizację na odpowiednią dla Ciebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.

    Podaj szczegóły nowego projektu aparatu Unity.

  3. Po otwarciu aparatu Unity warto sprawdzić domyślny edytor skryptów ustawiony na program Visual Studio. Przejdź do pozycji Edytuj > preferencje , a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje .

    Aktualizowanie preferencji edytora skryptów.

  4. Następnie przejdź do pozycji Ustawienia kompilacji plików > i wybierz pozycję platforma uniwersalna systemu Windows, a następnie kliknij przycisk Przełącz platformę, aby zastosować wybór.

    Okno Ustawienia kompilacji, przełącz platformę na platformę UWP.

  5. Nadal w obszarze Ustawienia kompilacji pliku > i upewnij się, że:

    1. Urządzenie docelowe ma ustawioną wartość HoloLens

      W przypadku immersyjnych zestawów słuchawkowych ustaw wartość Urządzenie docelowe na Dowolne urządzenie.

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną

    4. Wersja programu Visual Studio jest ustawiona na najnowszą zainstalowaną

    5. Kompilowanie i uruchamianie jest ustawione na komputer lokalny

    6. Zapisz scenę i dodaj ją do kompilacji.

      1. Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.

        Kliknij przycisk Dodaj otwarte sceny

      2. Utwórz nowy folder dla tego i dowolnego przyszłego sceny, a następnie wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.

        Tworzenie nowego folderu skryptów

      3. Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz MR_ComputerVisionScene, a następnie kliknij przycisk Zapisz.

        Nadaj nowej scenie nazwę.

        Pamiętaj, że musisz zapisać sceny aparatu Unity w folderze Assets , ponieważ muszą być skojarzone z projektem aparatu Unity. Tworzenie folderu scen (i innych podobnych folderów) to typowy sposób tworzenia struktury projektu aparatu Unity.

    7. Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.

  6. W oknie Ustawienia kompilacji kliknij przycisk Ustawienia odtwarzacza , spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor .

    Otwórz ustawienia odtwarzacza.

  7. W tym panelu należy zweryfikować kilka ustawień:

    1. Na karcie Inne ustawienia :

      1. Wersja środowiska uruchomieniowego skryptów powinna być stabilna (odpowiednik platformy.NET 3.5).

      2. Zaplecze skryptów powinno mieć wartość .NET

      3. Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6

        Zaktualizuj inne ustawienia.

    2. Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:

      1. InternetClient

      2. Kamerka internetowa

        Aktualizowanie ustawień publikowania.

    3. W dalszej części panelu w obszarze Ustawienia XR (znajdujące się poniżej ustawień publikowania) zaznacz opcję Virtual Reality Supported (Obsługa rzeczywistości wirtualnej), upewnij się, że dodano zestaw SDK Windows Mixed Reality.

      Zaktualizuj ustawienia X R.

  8. W obszarze Ustawienia kompilacji Projekty aparatu Unity C# nie są już wyszarzone; zaznacz pole wyboru obok tego.

  9. Zamknij okno Build Settings (Ustawienia kompilacji).

  10. Zapisz scenę i projekt (PLIK > ZAPISZ SCENĘ / PLIK > ZAPISZ PROJEKT).

Rozdział 3 — Konfiguracja głównej kamery

Ważne

Jeśli chcesz pominąć składnik Unity Set up tego kursu i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage, zaimportować go do projektu jako pakiet niestandardowy, a następnie kontynuować z rozdziału 5.

  1. W panelu hierarchii wybierz aparat główny.

  2. Po wybraniu opcji będzie można zobaczyć wszystkie składniki głównego aparatu w Panelu inspektora.

    1. Obiekt Camera musi mieć nazwę Main Camera (zanotuj pisownię!)

    2. Główny tag aparatu musi być ustawiony na MainCamera (zanotuj pisownię!)

    3. Upewnij się, że pozycja przekształcania jest ustawiona na 0, 0, 0

    4. Ustaw opcję Clear Flags na Solid Color (ignoruj tę opcję dla immersywnych zestawów słuchawkowych).

    5. Ustaw kolor tła składnika aparatu na Czarny, Alfa 0 (kod szesnastkowy: #00000000) ( zignoruj to dla immersyjnego zestawu słuchawkowego).

      Aktualizowanie składników aparatu.

  3. Następnie należy utworzyć prosty obiekt "Kursor" dołączony do aparatu głównego, co pomoże w ustawieniu danych wyjściowych analizy obrazu podczas działania aplikacji. Ten kursor określi środkowy punkt fokusu aparatu.

Aby utworzyć kursor:

  1. W panelu hierarchii kliknij prawym przyciskiem myszy kamerę główną. W obszarze Obiekt 3D kliknij pozycję Sphere.

    Wybierz obiekt kursora.

  2. Zmień nazwę sphere na Cursor (kliknij dwukrotnie obiekt Kursor lub naciśnij przycisk klawiatury "F2" z wybranym obiektem) i upewnij się, że znajduje się jako element podrzędny głównego aparatu.

  3. W panelu hierarchii kliknij kursor po lewej stronie. Po wybraniu kursora dostosuj następujące zmienne w Panelu inspektora:

    1. Ustaw pozycję przekształcania na 0, 0, 5

    2. Ustaw wartość Skala na 0.02, 0.02, 0.02

      Zaktualizuj pozycję przekształcania i skalowanie.

Rozdział 4 — Konfigurowanie systemu etykiet

Po przechwyceniu obrazu z aparatem HoloLens ten obraz zostanie wysłany do wystąpienia usługi Azure przetwarzanie obrazów API Service na potrzeby analizy.

Wyniki tej analizy będą listą rozpoznanych obiektów o nazwie Tagi.

Użyjesz etykiet (jako tekstu 3D w przestrzeni światowej), aby wyświetlić te tagi w miejscu, na którym zostało zrobione zdjęcie.

W poniższych krokach pokazano, jak skonfigurować obiekt Label .

  1. Kliknij prawym przyciskiem myszy dowolne miejsce w panelu hierarchii (lokalizacja nie ma znaczenia w tym momencie), w obszarze Obiekt 3D dodaj tekst 3D. Nadaj jej nazwę LabelText.

    Utwórz obiekt tekstowy 3D.

  2. W panelu hierarchii kliknij pozycję LabelText po lewej stronie. Po wybraniu opcji LabelText dostosuj następujące zmienne w Panelu inspektora:

    1. Ustaw pozycję na 0,0,0
    2. Ustaw wartość Skala na 0.01, 0.01, 0.01
    3. W składniku Text Mesh:
    4. Zastąp cały tekst tekst tekstem tekstowym tekstem "..."
    5. Ustawianie zakotwiczenia na Środkowe centrum
    6. Ustawianie wyrównania na środek
    7. Ustaw rozmiar karty na 4
    8. Ustaw rozmiar czcionki na 50
    9. Ustaw kolor na #FFFFFFFF

    Składnik tekstowy

  3. Przeciągnij element LabelText z panelu hierarchii do folderu elementów zawartości w panelu projektu. Spowoduje to utworzenie wystąpienia elementu LabelText jako prefab, aby można było utworzyć wystąpienie w kodzie.

    Utwórz prefab obiektu LabelText.

  4. Należy usunąć obiekt LabelText z panelu hierarchii, aby nie był wyświetlany w scenie otwierania. Ponieważ jest to teraz prefab, który będzie wywoływany dla poszczególnych wystąpień z folderu Assets, nie ma potrzeby przechowywania go w scenie.

  5. Ostateczna struktura obiektu w panelu hierarchii powinna przypominać strukturę pokazaną na poniższej ilustracji:

    Końcowa struktura panelu hierarchii.

Rozdział 5 — Tworzenie klasy ResultsLabel

Pierwszym skryptem, który należy utworzyć, jest klasa ResultsLabel , która jest odpowiedzialna za następujące kwestie:

  • Tworzenie etykiet w odpowiedniej przestrzeni świata względem położenia aparatu.
  • Wyświetlanie tagów z analizy obrazu.

Aby utworzyć tę klasę:

  1. Kliknij prawym przyciskiem myszy w panelu projektu, a następnie utwórz > folder. Nadaj folderowi nazwę Scripts( Skrypty).

    Utwórz folder skryptów.

  2. Po utworzeniu folderu Scripts kliknij go dwukrotnie, aby go otworzyć. Następnie w tym folderze kliknij prawym przyciskiem myszy i wybierz polecenie Utwórz > , a następnie pozycję Skrypt języka C#. Nadaj skryptowi nazwę ResultsLabel.

  3. Kliknij dwukrotnie nowy skrypt ResultsLabel , aby otworzyć go za pomocą programu Visual Studio.

  4. Wewnątrz klasy wstaw następujący kod w klasie 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. Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.

  6. W Edytorze aparatu Unity kliknij i przeciągnij klasę ResultsLabel z folderu Scripts do obiektu Main Camera w panelu hierarchii.

  7. Kliknij kamerę główną i przyjrzyj się panelowi inspektora.

Zauważysz, że na podstawie skryptu przeciągniętego do aparatu znajdują się dwa pola: Kursor i Etykieta Prefab.

  1. Przeciągnij obiekt o nazwie Cursor z panelu hierarchii do miejsca o nazwie Cursor, jak pokazano na poniższej ilustracji.

  2. Przeciągnij obiekt o nazwie LabelText z folderu Assets w panelu projektu do miejsca o nazwie Label Prefab, jak pokazano na poniższej ilustracji.

    Ustaw elementy docelowe odwołania w a także w aucie Unity.

Rozdział 6 — Tworzenie klasy ImageCapture

Następną klasą, którą zamierzasz utworzyć, jest klasa ImageCapture . Ta klasa jest odpowiedzialna za:

  • Przechwytywanie obrazu przy użyciu aparatu HoloLens i przechowywanie go w folderze aplikacji.
  • Przechwytywanie gestów Naciśnięcie od użytkownika.

Aby utworzyć tę klasę:

  1. Przejdź do utworzonego wcześniej folderu Skrypty .

  2. Kliknij prawym przyciskiem myszy wewnątrz folderu Utwórz > skrypt języka C#. Wywołaj skrypt ImageCapture.

  3. Kliknij dwukrotnie nowy skrypt ImageCapture , aby otworzyć go za pomocą programu Visual Studio.

  4. Dodaj następujące przestrzenie nazw na początku pliku:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Następnie dodaj następujące zmienne wewnątrz klasy ImageCapture powyżej metody Start():

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

Zmienna tapsCount będzie przechowywać liczbę gestów naciśnięcia przechwyconych od użytkownika. Ta liczba jest używana w nazewnictwie przechwyconych obrazów.

  1. Teraz należy dodać kod dla metod Awake() i Start( ). Będą one wywoływane, gdy klasa inicjuje:

        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. Zaimplementuj procedurę obsługi, która będzie wywoływana po wystąpieniu gestu naciśnięcia.

        /// <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() zwiększa liczbę naciśnięć przechwyconych od użytkownika i używa bieżącej pozycji kursora, aby określić, gdzie umieścić nową etykietę.

Następnie ta metoda wywołuje metodę ExecuteImageCaptureAndAnalysis(), aby rozpocząć podstawowe funkcje tej aplikacji.

  1. Po przechwyceniu i zapisie obrazu zostaną wywołane następujące programy obsługi. Jeśli proces zakończy się pomyślnie, wynik zostanie przekazany do narzędzia VisionManager (który nie został jeszcze utworzony) do analizy.

        /// <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. Następnie dodaj metodę używaną przez aplikację do uruchomienia procesu przechwytywania obrazów i zapisania obrazu.

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

Ostrzeżenie

W tym momencie w panelu konsoli edytora aparatu Unity zostanie wyświetlony błąd. Jest to spowodowane tym, że kod odwołuje się do klasy VisionManager , która zostanie utworzona w następnym rozdziale.

Rozdział 7 — wywoływanie platformy Azure i analiza obrazów

Ostatnim skryptem, który należy utworzyć, jest klasa VisionManager .

Ta klasa jest odpowiedzialna za:

  • Ładowanie najnowszego obrazu przechwyconego jako tablica bajtów.
  • Wysyłanie tablicy bajtów do wystąpienia usługi Api Service usługi Azure przetwarzanie obrazów na potrzeby analizy.
  • Odbieranie odpowiedzi jako ciągu JSON.
  • Deserializowanie odpowiedzi i przekazanie wynikowych tagów do klasy ResultsLabel .

Aby utworzyć tę klasę:

  1. Kliknij dwukrotnie folder Scripts ( Skrypty ), aby go otworzyć.

  2. Kliknij prawym przyciskiem myszy wewnątrz folderu Scripts (Skrypty ), a następnie kliknij polecenie Create C# Script (Utwórz > skrypt języka C#). Nadaj skryptowi nazwę VisionManager.

  3. Kliknij dwukrotnie nowy skrypt, aby otworzyć go za pomocą programu Visual Studio.

  4. Zaktualizuj przestrzenie nazw tak samo jak w przypadku następujących elementów w górnej części klasy VisionManager :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. W górnej części skryptu wewnątrz klasy VisionManager (powyżej metody Start() należy teraz utworzyć dwie klasy , które będą reprezentować deserializowaną odpowiedź JSON z platformy 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;
        }
    

    Uwaga

    Klasy TagData i AnalysedObject muszą mieć dodany atrybut [System.Serializable] przed deklaracją, aby można było wykonać deserializacji za pomocą bibliotek aparatu Unity.

  6. W klasie VisionManager należy dodać następujące zmienne:

        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;
    

    Ostrzeżenie

    Upewnij się, że wstawisz klucz uwierzytelniania do zmiennej authorizationKey . Klucz uwierzytelniania został zanotowany na początku tego kursu, rozdział 1.

    Ostrzeżenie

    Zmienna visionAnalysisEndpoint może się różnić od zmiennej określonej w tym przykładzie. Zachodnie stany USA ściśle odnoszą się do wystąpień usługi utworzonych dla regionu Zachodnie stany USA. Zaktualizuj to przy użyciu adresu URL punktu końcowego; Oto kilka przykładów tego, jak może to wyglądać:

    • Europa Zachodnia: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Azja Południowo-Wschodnia: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Australia Wschodnia: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Teraz należy dodać kod dla aplikacji Awake.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Następnie dodaj koprocedurę (przy użyciu metody strumienia statycznego poniżej), która uzyska wyniki analizy obrazu przechwyconego przez klasę 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. Pamiętaj, aby zapisać zmiany w programie Visual Studio przed powrotem do aparatu Unity.

  10. W edytorze aparatu Unity kliknij i przeciągnij klasy VisionManager i ImageCapture z folderu Scripts do obiektu Main Camera w panelu hierarchii.

Rozdział 8 – Przed budynkiem

Aby przeprowadzić dokładny test aplikacji, należy załadować ją bezpośrednio na urządzenie HoloLens. Przed wykonaniem tej czynności upewnij się, że:

  • Wszystkie ustawienia wymienione w rozdziale 2 są ustawione poprawnie.
  • Wszystkie skrypty są dołączone do obiektu Main Camera .
  • Wszystkie pola w panelu Główny inspektor kamery są prawidłowo przypisane.
  • Upewnij się, że wstawisz klucz uwierzytelniania do zmiennej authorizationKey .
  • Upewnij się, że punkt końcowy został również sprawdzony w skrypcie VisionManager i że jest on zgodny z regionem (ten dokument domyślnie używa regionu west-us ).

Rozdział 9 — tworzenie rozwiązania platformy UWP i ładowanie bezpośrednie aplikacji

Wszystko, co jest potrzebne w sekcji aparatu Unity tego projektu, zostało ukończone, więc nadszedł czas, aby utworzyć go z poziomu aparatu Unity.

  1. Przejdź do ustawień - kompilacji pliku > ustawień kompilacji...

  2. W oknie Ustawienia kompilacji kliknij pozycję Kompiluj.

    Kompilowanie aplikacji z poziomu aparatu Unity

  3. Jeśli jeszcze tego nie zrobiono, zaznacz pozycję Projekty języka C# aparatu Unity.

  4. Kliknij pozycję Kompiluj. Aparat Unity uruchomi okno Eksplorator plików, w którym należy utworzyć, a następnie wybierz folder do skompilowania aplikacji. Utwórz ten folder teraz i nadaj mu nazwę Aplikacja. Następnie po wybraniu folderu Aplikacja naciśnij pozycję Wybierz folder.

  5. Aparat Unity rozpocznie kompilowanie projektu w folderze Aplikacja .

  6. Po zakończeniu kompilowania aparatu Unity (może to zająć trochę czasu), zostanie otwarte okno Eksplorator plików w lokalizacji kompilacji (sprawdź pasek zadań, ponieważ może nie zawsze pojawić się nad oknami, ale powiadomi Cię o dodaniu nowego okna).

Rozdział 10 — wdrażanie na urządzeniu HoloLens

Aby wdrożyć na urządzeniu HoloLens:

  1. Będziesz potrzebować adresu IP urządzenia HoloLens (na potrzeby zdalnego wdrażania) i upewnić się, że urządzenie HoloLens jest w trybie dewelopera. W tym celu:

    1. Podczas noszenia urządzenia HoloLens otwórz pozycję Ustawienia.
    2. Przejdź do pozycji Sieć & Opcje zaawansowane Wi-Fi > Internetowych >
    3. Zanotuj adres IPv4 .
    4. Następnie przejdź z powrotem do pozycji Ustawienia, a następnie przejdź do obszaru Aktualizowanie zabezpieczeń > & dla deweloperów
    5. Ustaw tryb dewelopera na włączony.
  2. Przejdź do nowej kompilacji aparatu Unity (folderu App ) i otwórz plik rozwiązania za pomocą programu Visual Studio.

  3. W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.

  4. W obszarze Platforma rozwiązania wybierz pozycję x86, Maszyna zdalna.

    Wdróż rozwiązanie z poziomu programu Visual Studio.

  5. Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie, aby załadować aplikację bezpośrednio do urządzenia HoloLens.

  6. Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji na urządzeniu HoloLens, gotowych do uruchomienia.

Uwaga

Aby wdrożyć na immersywny zestaw słuchawkowy, ustaw wartość Platforma rozwiązania na Komputer lokalny i ustaw wartość Konfiguracja na Debugowanie z x86 jako platformą. Następnie wdróż na komputerze lokalnym przy użyciu menu Kompilacja, wybierając pozycję Wdróż rozwiązanie.

Zakończona aplikacja interfejsu API przetwarzanie obrazów

Gratulacje, utworzono aplikację rzeczywistości mieszanej, która wykorzystuje interfejs API przetwarzanie obrazów platformy Azure do rozpoznawania obiektów w świecie rzeczywistym i zapewnia pewność, co zostało zaobserwowane.

wynik laboratorium

Ćwiczenia dodatkowe

Ćwiczenie 1

Podobnie jak w przypadku użycia parametru Tagi (jak pokazano w punkcie końcowym używanym w usłudze VisionManager), rozszerz aplikację, aby wykryć inne informacje; Zapoznaj się z innymi parametrami, do których masz dostęp TUTAJ.

Ćwiczenie 2

Wyświetl zwrócone dane platformy Azure, w bardziej konwersacyjny i czytelny sposób, być może ukrywając liczby. Jakby bot mógł rozmawiać z użytkownikiem.