Bagikan melalui


HoloLens (generasi ke-1) dan Azure 302: Visi komputer


Catatan

Tutorial Mixed Reality Academy dirancang dengan HoloLens (generasi ke-1) dan Mixed Reality Immersive Headsets dalam pikiran. Dengan demikian, kami merasa penting untuk meninggalkan tutorial ini di tempat bagi pengembang yang masih mencari panduan dalam mengembangkan untuk perangkat tersebut. Tutorial ini tidak akan diperbarui dengan toolset atau interaksi terbaru yang digunakan untuk HoloLens 2. Mereka akan dipertahankan untuk terus bekerja pada perangkat yang didukung. Akan ada serangkaian tutorial baru yang akan diposting di masa depan yang akan menunjukkan cara mengembangkan untuk HoloLens 2. Pemberitahuan ini akan diperbarui dengan tautan ke tutorial tersebut ketika diposting.


Dalam kursus ini, Anda akan mempelajari cara mengenali konten visual dalam gambar yang disediakan, menggunakan kemampuan Azure Computer Vision dalam aplikasi realitas campuran.

Hasil pengenalan akan ditampilkan sebagai tag deskriptif. Anda dapat menggunakan layanan ini tanpa perlu melatih model pembelajaran mesin. Jika implementasi Anda memerlukan pelatihan model pembelajaran mesin, lihat MR dan Azure 302b.

hasil lab

Microsoft Computer Vision adalah sekumpulan API yang dirancang untuk memberi pengembang pemrosesan dan analisis gambar (dengan informasi pengembalian), menggunakan algoritma tingkat lanjut, semuanya dari cloud. Pengembang mengunggah URL gambar atau gambar, dan algoritma Microsoft Computer Vision API menganalisis konten visual, berdasarkan input yang dipilih pengguna, yang kemudian dapat mengembalikan informasi, termasuk, mengidentifikasi jenis dan kualitas gambar, mendeteksi wajah manusia (mengembalikan koordinatnya), dan memberi tag, atau mengategorikan gambar. Untuk informasi selengkapnya, kunjungi halaman Azure Computer Vision API.

Setelah menyelesaikan kursus ini, Anda akan memiliki aplikasi HoloLens realitas campuran, yang akan dapat melakukan hal berikut:

  1. Menggunakan gerakan Ketuk, kamera HoloLens akan mengambil gambar.
  2. Gambar akan dikirim ke Azure Computer Vision API Service.
  3. Objek yang dikenali akan dicantumkan dalam grup UI sederhana yang diposisikan di Adegan Unity.

Dalam aplikasi Anda, terserah Anda tentang bagaimana Anda akan mengintegrasikan hasilnya dengan desain Anda. Kursus ini dirancang untuk mengajari Anda cara mengintegrasikan Layanan Azure dengan proyek Unity Anda. Ini adalah tugas Anda untuk menggunakan pengetahuan yang Anda peroleh dari kursus ini untuk meningkatkan aplikasi realitas campuran Anda.

Dukungan perangkat

Kursus HoloLens Headset imersif
MR dan Azure 302: Computer vision ✔️ ✔️

Catatan

Meskipun kursus ini terutama berfokus pada HoloLens, Anda juga dapat menerapkan apa yang Anda pelajari dalam kursus ini ke headset imersif (VR) Windows Mixed Reality. Karena headset imersif (VR) tidak memiliki kamera yang dapat diakses, Anda akan memerlukan kamera eksternal yang terhubung ke PC Anda. Saat mengikuti kursus, Anda akan melihat catatan tentang perubahan apa pun yang mungkin perlu Anda gunakan untuk mendukung headset imersif (VR).

Prasyarat

Catatan

Tutorial ini dirancang untuk pengembang yang memiliki pengalaman dasar dengan Unity dan C#. Perlu diketahui juga bahwa prasyarat dan instruksi tertulis dalam dokumen ini mewakili apa yang telah diuji dan diverifikasi pada saat penulisan (Mei 2018). Anda bebas menggunakan perangkat lunak terbaru, seperti yang tercantum dalam artikel instal alat , meskipun tidak boleh diasumsikan bahwa informasi dalam kursus ini akan sangat cocok dengan apa yang akan Anda temukan di perangkat lunak yang lebih baru daripada apa yang tercantum di bawah ini.

Kami merekomendasikan perangkat keras dan perangkat lunak berikut untuk kursus ini:

Sebelum memulai

  1. Untuk menghindari masalah saat membangun proyek ini, sangat disarankan agar Anda membuat proyek yang disebutkan dalam tutorial ini di folder root atau near-root (jalur folder panjang dapat menyebabkan masalah pada build-time).
  2. Siapkan dan uji HoloLens Anda. Jika Anda memerlukan dukungan untuk menyiapkan HoloLens Anda, pastikan untuk mengunjungi artikel penyiapan HoloLens.
  3. Sebaiknya lakukan Kalibrasi dan Penyetelan Sensor saat mulai mengembangkan Aplikasi HoloLens baru (terkadang dapat membantu melakukan tugas tersebut untuk setiap pengguna).

Untuk bantuan tentang Kalibrasi, silakan ikuti tautan ini ke artikel Kalibrasi HoloLens.

Untuk bantuan tentang Penyetelan Sensor, silakan ikuti tautan ini ke artikel Penyetelan Sensor HoloLens.

Bab 1 – Portal Microsoft Azure

Untuk menggunakan layanan Computer Vision API di Azure, Anda harus mengonfigurasi instans layanan agar tersedia untuk aplikasi Anda.

  1. Pertama, masuk ke Portal Microsoft Azure.

    Catatan

    Jika Anda belum memiliki akun Azure, Anda harus membuatnya. Jika Anda mengikuti tutorial ini dalam situasi ruang kelas atau lab, mintalah instruktur atau salah satu proktor untuk membantu menyiapkan akun baru Anda.

  2. Setelah Anda masuk, klik Baru di sudut kiri atas, dan cari Computer Vision API, dan klik Enter.

    Membuat sumber daya baru di Azure

    Catatan

    Kata Baru mungkin telah diganti dengan Buat sumber daya, di portal yang lebih baru.

  3. Halaman baru akan memberikan deskripsi layanan Computer Vision API . Di kiri bawah halaman ini, pilih tombol Buat , untuk membuat asosiasi dengan layanan ini.

    Tentang layanan api visi komputer

  4. Setelah Anda mengklik Buat:

    1. Sisipkan Nama yang Anda inginkan untuk instans layanan ini.

    2. Pilih Langganan.

    3. Pilih Tingkat Harga yang sesuai untuk Anda, jika ini pertama kalinya membuat Computer Vision API Service, tingkat gratis (bernama F0) harus tersedia untuk Anda.

    4. Pilih Grup Sumber Daya atau buat yang baru. Grup sumber daya menyediakan cara untuk memantau, mengontrol akses, menyediakan, dan mengelola penagihan untuk kumpulan aset Azure. Disarankan untuk menyimpan semua layanan Azure yang terkait dengan satu proyek (misalnya seperti lab ini) di bawah grup sumber daya umum).

      Jika Anda ingin membaca selengkapnya tentang Grup Sumber Daya Azure, silakan kunjungi artikel grup sumber daya.

    5. Tentukan Lokasi untuk grup sumber daya Anda (jika Anda membuat Grup Sumber Daya baru). Lokasi idealnya akan berada di wilayah tempat aplikasi akan berjalan. Beberapa aset Azure hanya tersedia di wilayah tertentu.

    6. Anda juga perlu mengonfirmasi bahwa Anda telah memahami Syarat dan Ketentuan yang diterapkan pada Layanan ini.

    7. Klik Buat.

      Informasi pembuatan layanan

  5. Setelah mengklik Buat, Anda harus menunggu layanan dibuat, ini mungkin memakan waktu satu menit.

  6. Pemberitahuan akan muncul di portal setelah instans Layanan dibuat.

    Lihat pemberitahuan baru untuk layanan baru Anda

  7. Klik pemberitahuan untuk menjelajahi instans Layanan baru Anda.

    Pilih tombol Buka Sumber Daya.

  8. Klik tombol Buka sumber daya di pemberitahuan untuk menjelajahi instans Layanan baru Anda. Anda akan dibawa ke instans layanan Computer Vision API baru Anda.

    Gambar layanan Computer Vision API baru Anda

  9. Dalam tutorial ini, aplikasi Anda harus melakukan panggilan ke layanan Anda, yang dilakukan melalui menggunakan Kunci Langganan layanan Anda.

  10. Dari halaman Mulai cepat, layanan Computer Vision API Anda, navigasikan ke langkah pertama, Ambil kunci Anda, dan klik Kunci (Anda juga dapat mencapainya dengan mengklik Kunci hyperlink biru, yang terletak di menu navigasi layanan, ditandai dengan ikon kunci). Ini akan mengungkapkan Kunci layanan Anda.

  11. Ambil salinan salah satu kunci yang ditampilkan, karena Anda akan membutuhkannya nanti dalam proyek Anda.

  12. Kembali ke halaman Mulai cepat, dan dari sana, ambil titik akhir Anda. Ketahuilah bahwa Anda mungkin berbeda, tergantung pada wilayah Anda (yang jika ya, Anda harus membuat perubahan pada kode Anda nanti). Ambil salinan titik akhir ini untuk digunakan nanti:

    Layanan Computer Vision API baru Anda

    Tip

    Anda dapat memeriksa apa berbagai titik akhir di SINI.

Bab 2 – Menyiapkan proyek Unity

Berikut ini adalah pengaturan khas untuk mengembangkan dengan realitas campuran, dan dengan demikian, adalah templat yang baik untuk proyek lain.

  1. Buka Unity dan klik Baru.

    Mulai proyek Unity baru.

  2. Anda sekarang perlu memberikan nama Proyek Unity. Sisipkan MR_ComputerVision. Pastikan jenis proyek diatur ke 3D. Atur Lokasi ke tempat yang sesuai untuk Anda (ingat, lebih dekat ke direktori akar lebih baik). Lalu, klik Buat proyek.

    Berikan detail untuk proyek Unity baru.

  3. Dengan Unity terbuka, ada baiknya memeriksa Editor Skrip default diatur ke Visual Studio. Buka Edit > Preferensi lalu dari jendela baru, navigasikan ke Alat Eksternal. Ubah Editor Skrip Eksternal ke Visual Studio 2017. Tutup jendela Preferensi .

    Perbarui preferensi editor skrip.

  4. Selanjutnya, buka Pengaturan Build File > dan pilih Platform Windows Universal, lalu klik tombol Beralih Platform untuk menerapkan pilihan Anda.

    Jendela Pengaturan Build, alihkan platform ke UWP.

  5. Saat masih dalam Pengaturan Penyusunan File > dan pastikan bahwa:

    1. Perangkat Target diatur ke HoloLens

      Untuk headset imersif, atur Perangkat Target ke Perangkat Apa Pun.

    2. Jenis Build diatur ke D3D

    3. SDK diatur ke Terbaru diinstal

    4. Versi Visual Studio diatur ke Terbaru diinstal

    5. Build and Run diatur ke Komputer Lokal

    6. Simpan adegan dan tambahkan ke build.

      1. Lakukan ini dengan memilih Tambahkan Adegan Terbuka. Jendela penyimpanan akan muncul.

        Klik tombol tambahkan adegan terbuka

      2. Buat folder baru untuk ini, dan adegan di masa mendatang, lalu pilih tombol Folder baru, untuk membuat folder baru, beri nama Adegan.

        Membuat folder skrip baru

      3. Buka folder Adegan yang baru dibuat, lalu di bidang Nama file: teks, ketik MR_ComputerVisionScene, lalu klik Simpan.

        Beri nama adegan baru.

        Ketahuilah, Anda harus menyimpan adegan Unity Anda dalam folder Aset , karena harus dikaitkan dengan Proyek Unity. Membuat folder adegan (dan folder serupa lainnya) adalah cara umum untuk menyusun proyek Unity.

    7. Pengaturan yang tersisa, di Pengaturan Build, harus dibiarkan sebagai default untuk saat ini.

  6. Di jendela Pengaturan Build, klik tombol Pengaturan Pemutar, ini akan membuka panel terkait di ruang tempat Pemeriksa berada.

    Buka pengaturan pemutar.

  7. Di panel ini, beberapa pengaturan perlu diverifikasi:

    1. Di tab Pengaturan Lainnya:

      1. Versi Runtime Pembuatan Skrip harus Stabil (Setara.NET 3.5).

      2. Scripting Backend harus .NET

      3. Tingkat Kompatibilitas API harus .NET 4.6

        Perbarui pengaturan lain.

    2. Dalam tab Pengaturan Penerbitan, di bawah Kemampuan, periksa:

      1. InternetClient

      2. Webcam

        Memperbarui pengaturan penerbitan.

    3. Selanjutnya di bawah panel, di Pengaturan XR (ditemukan di bawah Pengaturan Penerbitan), centang Realitas Virtual yang Didukung, pastikan Windows Mixed Reality SDK ditambahkan.

      Perbarui Pengaturan X R.

  8. Kembali ke Pengaturan Build Proyek Unity C# tidak lagi berwarna abu-abu; centang kotak di samping ini.

  9. Tutup jendela Pengaturan Build.

  10. Simpan Adegan dan Proyek Anda (FILE > SAVE SCENE / FILE > SAVE PROJECT).

Bab 3 – Penyiapan Kamera Utama

Penting

Jika Anda ingin melewati komponen Unity Siapkan kursus ini, dan lanjutkan langsung ke kode, jangan ragu untuk mengunduh .unitypackage ini, impor ke proyek Anda sebagai Paket Kustom, dan kemudian lanjutkan dari Bab 5.

  1. Di Panel Hierarki, pilih Kamera Utama.

  2. Setelah dipilih, Anda akan dapat melihat semua komponen Kamera Utama di Panel Inspektur.

    1. Objek Kamera harus diberi nama Kamera Utama (perhatikan ejaan!)

    2. Tag Kamera Utama harus diatur ke MainCamera (perhatikan ejaan!)

    3. Pastikan Posisi Transformasi diatur ke 0, 0, 0

    4. Atur Hapus Bendera ke Warna Solid (abaikan ini untuk headset imersif).

    5. Atur Warna Latar Belakang Komponen Kamera ke Hitam, Alpha 0 (Kode Hex: #00000000) (abaikan ini untuk headset imersif).

      Perbarui Komponen Kamera.

  3. Selanjutnya, Anda harus membuat objek "Kursor" sederhana yang terpasang pada Kamera Utama, yang akan membantu Anda memosisikan output analisis gambar saat aplikasi berjalan. Kursor ini akan menentukan titik tengah fokus kamera.

Untuk membuat Kursor:

  1. Di Panel Hierarki, klik kanan pada Kamera Utama. Di bawah Objek 3D, klik Sphere.

    Pilih Objek Kursor.

  2. Ganti nama Sphere menjadi Kursor (klik dua kali objek Kursor atau tekan tombol keyboard 'F2' dengan objek yang dipilih), dan pastikan objek tersebut terletak sebagai anak dari Kamera Utama.

  3. Di Panel Hierarki, klik kiri pada Kursor. Dengan Kursor dipilih, sesuaikan variabel berikut di Panel Inspektur:

    1. Atur Posisi Transformasi ke 0, 0, 5

    2. Atur Skala ke 0,02, 0,02, 0,02

      Perbarui Posisi dan Skala Transformasi.

Bab 4 – Menyiapkan sistem Label

Setelah Anda mengambil gambar dengan kamera HoloLens, gambar tersebut akan dikirim ke instans Azure Computer Vision API Service Anda untuk analisis.

Hasil analisis tersebut akan menjadi daftar objek yang dikenali yang disebut Tag.

Anda akan menggunakan Label (sebagai teks 3D di ruang dunia) untuk menampilkan Tag ini di lokasi foto diambil.

Langkah-langkah berikut akan menunjukkan cara menyiapkan objek Label .

  1. Klik kanan di mana saja di Panel Hierarki (lokasi tidak masalah pada saat ini), di bawah Objek 3D, tambahkan Teks 3D. Beri nama LabelText.

    Buat objek Teks 3D.

  2. Di Panel Hierarki, klik kiri pada LabelText. Dengan LabelText dipilih, sesuaikan variabel berikut di Panel Pemeriksa:

    1. Atur Posisi ke 0,0,0
    2. Atur Skala ke 0,01, 0,01, 0,01
    3. Dalam komponen Text Mesh:
    4. Ganti semua teks dalam Teks, dengan "..."
    5. Mengatur Jangkar ke Tengah Tengah
    6. Atur Perataan ke Tengah
    7. Atur Ukuran Tab ke 4
    8. Atur Ukuran Font ke 50
    9. Atur Warna ke #FFFFFFFF

    Komponen Teks

  3. Seret LabelText dari Panel Hierarki, ke folder Aset, di dalam Panel Proyek. Ini akan membuat LabelText menjadi Prefab, sehingga dapat dibuat dalam kode.

    Buat prefab objek LabelText.

  4. Anda harus menghapus LabelText dari Panel Hierarki, sehingga tidak akan ditampilkan di adegan pembukaan. Seperti sekarang adalah prefab, yang akan Anda panggil untuk instans individual dari folder Aset Anda, tidak perlu menyimpannya dalam adegan.

  5. Struktur objek akhir di Panel Hierarki harus seperti yang ditunjukkan pada gambar di bawah ini:

    Struktur akhir panel hierarki.

Bab 5 – Buat kelas ResultsLabel

Skrip pertama yang perlu Anda buat adalah kelas ResultsLabel , yang bertanggung jawab atas hal berikut:

  • Membuat Label di ruang dunia yang sesuai, relatif terhadap posisi Kamera.
  • Menampilkan Tag dari Anaysis Gambar.

Untuk membuat kelas ini:

  1. Klik kanan di Panel Proyek, lalu Buat > Folder. Beri nama folder Skrip.

    Membuat folder skrip.

  2. Dengan membuat folder Skrip, klik dua kali untuk membukanya. Kemudian di dalam folder tersebut, klik kanan, dan pilih Buat > lalu Skrip C#. Beri nama skrip ResultsLabel.

  3. Klik dua kali pada skrip ResultsLabel baru untuk membukanya dengan Visual Studio.

  4. Di dalam Kelas sisipkan kode berikut di kelas 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. Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.

  6. Kembali ke Editor Unity, klik dan seret kelas ResultsLabel dari folder Skrip ke objek Kamera Utama di Panel Hierarki.

  7. Klik Kamera Utama dan lihat Panel Inspektur.

Anda akan melihat bahwa dari skrip yang baru saja Anda seret ke Kamera, ada dua bidang: Kursor dan Prefab Label.

  1. Seret objek yang disebut Kursor dari Panel Hierarki ke slot bernama Kursor, seperti yang ditunjukkan pada gambar di bawah ini.

  2. Seret objek yang disebut LabelText dari Folder Aset di Panel Proyek ke slot bernama Label Prefab, seperti yang ditunjukkan pada gambar di bawah ini.

    Atur target referensi dalam Unity.

Bab 6 – Buat kelas ImageCapture

Kelas berikutnya yang akan Anda buat adalah kelas ImageCapture . Kelas ini bertanggung jawab untuk:

  • Menangkap Gambar menggunakan Kamera HoloLens dan menyimpannya di Folder Aplikasi.
  • Menangkap gerakan Ketuk dari pengguna.

Untuk membuat kelas ini:

  1. Buka folder Skrip yang Anda buat sebelumnya.

  2. Klik kanan di dalam folder, Buat > Skrip C#. Panggil skrip ImageCapture.

  3. Klik dua kali pada skrip ImageCapture baru untuk membukanya dengan Visual Studio.

  4. Tambahkan namespace berikut ke bagian atas file:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Kemudian tambahkan variabel berikut di dalam kelas ImageCapture, di atas metode Start():

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

Variabel tapsCount akan menyimpan jumlah gerakan ketuk yang diambil dari pengguna. Jumlah ini digunakan dalam penamaan gambar yang diambil.

  1. Kode untuk metode Awake() dan Start() sekarang perlu ditambahkan. Ini akan dipanggil ketika kelas menginisialisasi:

        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. Terapkan handler yang akan dipanggil saat gerakan Ketuk terjadi.

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

Metode TapHandler() meningkatkan jumlah ketukan yang diambil dari pengguna dan menggunakan posisi Kursor saat ini untuk menentukan tempat menempatkan Label baru.

Metode ini kemudian memanggil metode ExecuteImageCaptureAndAnalysis() untuk memulai fungsionalitas inti aplikasi ini.

  1. Setelah Gambar diambil dan disimpan, handler berikut akan dipanggil. Jika proses berhasil, hasilnya diteruskan ke VisionManager (yang belum Anda buat) untuk analisis.

        /// <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. Kemudian tambahkan metode yang digunakan aplikasi untuk memulai proses pengambilan Gambar dan menyimpan gambar.

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

Peringatan

Pada titik ini Anda akan melihat kesalahan yang muncul di Panel Konsol Editor Unity. Ini karena kode mereferensikan kelas VisionManager yang akan Anda buat di Bab berikutnya.

Bab 7 – Panggilan ke Azure dan Analisis Gambar

Skrip terakhir yang perlu Anda buat adalah kelas VisionManager .

Kelas ini bertanggung jawab untuk:

  • Memuat gambar terbaru yang diambil sebagai array byte.
  • Mengirim array byte ke instans Azure Computer Vision API Service Anda untuk analisis.
  • Menerima respons sebagai string JSON.
  • Mendeserialisasi respons dan meneruskan Tag yang dihasilkan ke kelas ResultsLabel .

Untuk membuat kelas ini:

  1. Klik dua kali pada folder Skrip , untuk membukanya.

  2. Klik kanan di dalam folder Skrip , klik Buat > Skrip C#. Beri nama skrip VisionManager.

  3. Klik dua kali pada skrip baru untuk membukanya dengan Visual Studio.

  4. Perbarui namespace agar sama dengan yang berikut ini, di bagian atas kelas VisionManager :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. Di bagian atas skrip Anda, di dalam kelas VisionManager (di atas metode Start(), Anda sekarang perlu membuat dua Kelas yang akan mewakili respons JSON yang dideserialisasi dari 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;
        }
    

    Catatan

    Kelas TagData dan AnalysedObject harus memiliki atribut [System.Serializable] yang ditambahkan sebelum deklarasi untuk dapat dideserialisasi dengan pustaka Unity.

  6. Di kelas VisionManager, Anda harus menambahkan variabel berikut:

        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;
    

    Peringatan

    Pastikan Anda memasukkan Kunci Autentikasi ke dalam variabel authorizationKey . Anda akan mencatat Kunci Autentikasi Anda di awal kursus ini, Bab 1.

    Peringatan

    Variabel visionAnalysisEndpoint mungkin berbeda dari yang ditentukan dalam contoh ini. Barat-as secara ketat mengacu pada instans Layanan yang dibuat untuk wilayah US Barat. Perbarui ini dengan URL titik akhir Anda; berikut adalah beberapa contoh tampilannya:

    • Eropa Barat: https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Asia Tenggara: https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
    • Australia Timur: https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
  7. Kode untuk Awake sekarang perlu ditambahkan.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Selanjutnya, tambahkan koroutine (dengan metode aliran statis di bawahnya), yang akan mendapatkan hasil analisis gambar yang diambil oleh Kelas 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. Pastikan untuk menyimpan perubahan Anda di Visual Studio sebelum kembali ke Unity.

  10. Kembali ke Editor Unity, klik dan seret kelas VisionManager dan ImageCapture dari folder Skrip ke objek Kamera Utama di Panel Hierarki.

Bab 8 – Sebelum membangun

Untuk melakukan pengujian menyeluruh aplikasi Anda, Anda harus membongkarnya ke HoloLens Anda. Sebelum melakukannya, pastikan bahwa:

  • Semua pengaturan yang disebutkan dalam Bab 2 diatur dengan benar.
  • Semua skrip dilampirkan ke objek Kamera Utama.
  • Semua bidang di Panel Pemeriksa Kamera Utama ditetapkan dengan benar.
  • Pastikan Anda memasukkan Kunci Autentikasi ke dalam variabel authorizationKey .
  • Pastikan Anda juga telah memeriksa titik akhir di skrip VisionManager Anda, dan bahwa titik akhir tersebut selaras dengan wilayah Anda (dokumen ini menggunakan west-us secara default).

Bab 9 – Bangun Solusi UWP dan muat sisi aplikasi

Semua yang diperlukan untuk bagian Unity dari proyek ini sekarang telah selesai, jadi sekarang saatnya untuk membangunnya dari Unity.

  1. Navigasi ke Pengaturan Build Pengaturan - Build File...>

  2. Dari jendela Pengaturan Build, klik Bangun.

    Membangun aplikasi dari Unity

  3. Jika belum, centang Proyek Unity C#.

  4. Klik Bangun. Unity akan meluncurkan jendela File Explorer , tempat Anda perlu membuat lalu memilih folder untuk membangun aplikasi. Buat folder tersebut sekarang, dan beri nama Aplikasi. Kemudian dengan folder Aplikasi dipilih, tekan Pilih Folder.

  5. Unity akan mulai membangun proyek Anda ke folder Aplikasi .

  6. Setelah Unity selesai membangun (mungkin perlu waktu), Unity akan membuka jendela File Explorer di lokasi build Anda (periksa bilah tugas Anda, karena mungkin tidak selalu muncul di atas jendela Anda, tetapi akan memberi tahu Anda tentang penambahan jendela baru).

Bab 10 - Menyebarkan ke HoloLens

Untuk menyebarkan di HoloLens:

  1. Anda akan memerlukan Alamat IP HoloLens Anda (untuk Penyebaran Jarak Jauh), dan untuk memastikan HoloLens Anda berada dalam Mode Pengembang. Untuk melakukan ini:

    1. Sementara mengenakan HoloLens Anda, buka Pengaturan.
    2. Buka Opsi Tingkat Lanjut Wi-Fi Jaringan & > Internet >
    3. Perhatikan alamat IPv4.
    4. Selanjutnya, navigasikan kembali ke Pengaturan, lalu ke Pembaruan & Keamanan > Untuk Pengembang
    5. Atur Mode Pengembang Aktif.
  2. Navigasi ke build Unity baru Anda ( folder Aplikasi ) dan buka file solusi dengan Visual Studio.

  3. Di Konfigurasi Solusi pilih Debug.

  4. Di Platform Solusi, pilih x86, Komputer Jarak Jauh.

    Sebarkan solusi dari Visual Studio.

  5. Buka menu Build dan klik Sebarkan Solusi, untuk memuat samping aplikasi ke HoloLens Anda.

  6. Aplikasi Anda sekarang akan muncul dalam daftar aplikasi yang diinstal di HoloLens Anda, siap untuk diluncurkan!

Catatan

Untuk menyebarkan ke headset imersif, atur Platform Solusi ke Komputer Lokal, dan atur Konfigurasi ke Debug, dengan x86 sebagai Platform. Kemudian sebarkan ke komputer lokal, menggunakan menu Build, memilih Sebarkan Solusi.

Aplikasi Computer Vision API Anda yang sudah selesai

Selamat, Anda membangun aplikasi realitas campuran yang memanfaatkan Azure Computer Vision API untuk mengenali objek dunia nyata, dan menampilkan keyakinan tentang apa yang telah dilihat.

hasil lab

Latihan bonus

Latihan 1

Sama seperti Anda telah menggunakan parameter Tag (sebagaimana dibuktikan dalam titik akhir yang digunakan dalam VisionManager), perluas aplikasi untuk mendeteksi informasi lain; lihat parameter lain apa yang dapat Anda akses ke SINI.

Latihan 2

Tampilkan data Azure yang dikembalikan, dengan cara yang lebih percakapan, dan dapat dibaca, mungkin menyembunyikan angka. Seolah-olah bot mungkin berbicara kepada pengguna.