注意事項
Mixed Reality學院的教學課程是以第一代) 和Mixed Reality沉浸式頭戴裝置 (HoloLens設計的。 因此,我們認為保留這些教學對於仍在尋找開發指引的開發者來說非常重要。 這些教學並未更新 HoloLens 2 所使用的最新工具組或互動方式。 它們會被維護以持續支援的裝置。 未來將發布一系列新的教學,示範如何為 HoloLens 2 開發。 當這些教學發布時,此公告會更新並附上連結。
在本課程中,您將學習如何在混合實境應用中運用Azure 電腦視覺功能,辨識所提供影像中的視覺內容。
識別結果會以描述性標籤形式顯示。 你可以使用這項服務,而不需要訓練機器學習模型。 如果你的實作需要訓練機器學習模型,請參考 MR 和 Azure 302b。
Microsoft 電腦視覺 是一套 API,旨在為開發者提供影像處理與分析 (回傳資訊) ,並運用先進演算法,全部從雲端進行。 開發者上傳圖片或圖片網址,Microsoft 電腦視覺 API 演算法會根據使用者選擇的輸入分析視覺內容,進而回傳資訊,包括識別圖片的類型與品質、 (回傳人臉) 座標,以及標記或分類圖片。 欲了解更多資訊,請造訪 Azure 電腦視覺 API 頁面。
完成本課程後,您將擁有一個混合實境 HoloLens 應用程式,該應用程式可:
- 透過輕觸手勢,全息鏡頭的相機捕捉影像。
- 映像檔會傳送到 Azure 電腦視覺 API 服務。
- 識別到的物件會列在 Unity 場景中一個簡單的 UI 群組中。
在你的申請中,如何將結果與設計整合,取決於你自己。 本課程旨在教你如何將 Azure 服務整合到你的 Unity 專案中。 你的工作是運用從這門課程獲得的知識,來提升你的混合實境應用。
裝置支援
| 河道 | (/前版本/混合實境/hololens-1/hololens1-hardware) HoloLens | 沉浸式頭戴裝置 |
|---|---|---|
| MR 與 Azure 302:電腦視覺 | ✔️ | ✔️ |
注意事項
雖然本課程主要聚焦於全息鏡頭,但你也可以將課程中所學應用於Windows Mixed Reality沉浸式 (VR) 頭戴裝置。 由於沉浸式 (VR) 頭戴裝置沒有可用的攝影機,你需要外接攝影機連接到你的電腦。 隨著課程進行,你會看到關於可能需要採用的任何變更說明,以支援沉浸式 (VR) 頭戴裝置。
先決條件
注意事項
這個教學是為有基本 Unity 和 C# 經驗的開發者設計的。 此外,本文件中的前提條件與書面指示,皆為撰寫時 (測試與驗證) 內容。 你可以自由使用安裝 工具文章中 列出的最新軟體,但不應假設本課程的資訊與你在新軟體中找到的完全相同,而非以下列出的內容。
我們建議本課程使用以下硬體與軟體:
- 一台開發用電腦,支援Windows Mixed Reality,用於沉浸式 (VR) 頭戴裝置開發
- Windows 10 Fall Creators Update (或更高版本) 啟用開發者模式
- 最新的 Windows 10 SDK
- Unity 2017.4
- Visual Studio 2017
- Windows Mixed Reality沉浸式 (VR) 頭戴裝置或啟用開發者模式的Microsoft HoloLens
- 連接電腦的攝影機 (進行沉浸式頭戴裝置開發)
- Internet access for Azure setup and 電腦視覺 API retrieval
開始之前
- 為避免在建置此專案時遇到問題,建議你將本教學提到的專案建立在根目錄或近根資料夾中, (長的資料夾路徑在建置時) 會造成問題。
- 設置並測試你的全息鏡頭。 如果你需要協助設定 HoloLens,請務必造訪 HoloLens 設定文章。
- 在開始開發新的 HoloLens 應用程式時,建議先進行校準與感測器調整, (有時針對每位使用者) 執行這些任務會有幫助。
如需校正相關協助,請點此 連結至HoloLens校正文章。
如需感測器調校的幫助,請點此 連結至《HoloLens 感測器調校》文章。
第一章 – Azure 傳送門
要在 Azure 中使用電腦視覺 API 服務,你需要設定該服務的實例,才能提供給你的應用程式使用。
首先,登入 Azure 入口網站。
注意事項
如果你還沒有 Azure 帳號,就需要自己建立一個。 如果你在教室或實驗室裡跟著這個教學做,請請你的老師或監考人員幫忙設定新帳號。
登入後,點選左上角的「新」,搜尋「電腦視覺 API」,然後點擊 Enter。
注意事項
在較新的入口網站中,「 新」 這個詞可能會被 「建立資源」取代。
新頁面提供了電腦視覺 API 服務的描述。 在頁面左下角,選擇 「建立 」按鈕,以建立與此服務的關聯。
選擇 建立後:
輸入你想要的 服務實例名稱 。
選擇 訂閱。
請選擇適合您的定價層級,如果這是第一次建立 電腦視覺 API 服務,應該會有一個名為 F0) 的免費 (。
選擇資源群組或建立一個新的 群組 。 資源群組提供一種監控、控制存取、配置及管理 Azure 資產集合帳單的方式。 建議將單一專案的所有Azure服務 (,例如這些實驗室,) 在共同資源群組下。
如果您想了解更多關於 Azure 資源群組的資訊,請造訪資源群組文章。
如果你要建立新的資源群) , (確定你的資源群組的位置。 理想地點應該位於該應用程式執行的區域。 部分 Azure 資產僅在特定區域可用。
您也需確認您理解本服務適用的條款與條件。
按一下 [建立]。
選擇 建立後,你必須等待服務建立,可能需要一分鐘。
服務實例建立後,入口網站會顯示通知。
點擊通知以探索您的新服務實例。
點擊通知中的 「前往資源 」按鈕,探索您的新服務實例。 你會被帶到新的電腦視覺 API 服務實例。
在這個教學中,你的應用程式需要透過服務的訂閱金鑰來呼叫服務。
從您的 電腦視覺 API 服務快速開始頁面,導引至第一步「取得你的金鑰」,並點擊「金鑰」 (您也可以點擊服務導覽選單中的藍色超連結「Keys」,該連結以金鑰圖示標示) 來實現。 它會顯示你的服務 鑰匙。
拿一份顯示的鑰匙副本,因為你在專案後面會需要它。
返回快速開始頁面,然後從那裡取得你的終端。 請注意,你的版本可能不同,視地區而定,如果是, () 後續需要修改程式碼。 請取得此端點副本以備日後使用:
提示
你可以在這裡查看各個端點。
第二章 – 建立 Unity 專案
以下是混合實境開發的典型架構,因此是其他專案的良好範本。
打開 Unity 並點 選新檔。
你現在需要提供 Unity 專案名稱。 插入 MR_ComputerVision。 確保專案類型設定為 3D。 請將 位置 設定在適合你的位置, (記得,靠近根目錄會比較) 。 然後,點擊 「建立專案」。
打開 Unity 時,值得檢查預設的 腳本編輯器 是否設定為 Visual Studio。 進入 編輯 > 偏好設定 ,然後從新視窗中切換到 外部工具。 將 外部腳本編輯器 改為 Visual Studio 2017。 關閉 偏好設定 視窗。
接著,前往檔案>建置設定,選擇通用 Windows 平台,然後點選 Switch Platform 按鈕套用你的選擇。
在檔案建置設定中>,確保:
目標裝置 設定為 HoloLens
對於沉浸式耳機,將 目標裝置 設為 任意裝置。
建構類型 設定為 D3D
SDK 設定為 最新安裝
Visual Studio 版本 設定為 最新安裝
建置與執行 設定為 本地機器
儲存場景並加入建構。
選擇 新增開啟場景。 存檔視窗會出現。
建立一個新資料夾,以及未來的場景,然後選擇 新資料夾 按鈕,要建立新資料夾,命名 為 Scenes。
打開你新建立 的 Scenes 資料夾,然後在 檔案名稱:文字欄位輸入 MR_ComputerVisionScene,然後點 選儲存。
請注意,你必須將 Unity 場景儲存在 Assets 資料夾中,因為它們必須與 Unity 專案相關聯。 建立 scenes 資料夾 (及其他類似資料夾) 是結構化 Unity 專案的典型方式。
剩下的設定,在 建構設定裡,暫時應該保持預設。
在 建構設定 視窗中,點擊 玩家設定 按鈕,會在 檢查器 所在的空間開啟相關面板。
在這個面板中,需要驗證幾個設定:
在 其他設定 標籤中:
腳本執行時版本應該是穩定 (.NET 3.5 等效) 。
腳本後端應該是 .NET
API 相容等級 應該是 .NET 4.6
在 發佈設定 標籤中 ,功能欄下勾選:
網際網路用戶端
網路攝影機
在面板下方,在 XR 設定 (「發布設定) 」下方,勾選支援虛擬實境,確保已新增 Windows Mixed Reality SDK。
回到建置設定,Unity C# 專案不再是灰色的;勾選旁邊的勾選框。
關閉建構設定視窗。
在 檔案 > 儲存場景/檔案 > 儲存專案 (儲存你的場景和專案) 。
第三章 – 主攝影機設置
重要事項
如果你想跳過課程中的 Unity 設定 組件,直接寫程式碼,可以下載 .unitypackage,匯入你的專案中作為 自訂套件,然後從 第 5 章繼續。
在 層級面板中,選擇 主攝影機。
選擇後,你可以在檢查面板中看到主攝影機的所有元件。
攝影機 物件 必須命名 為主攝影機 (注意拼法!) 。
主攝影機 標籤 必須設為 主攝影機 (注意拼字!) 。
確保 轉換位置 設定為 0, 0, 0。
將 透明旗 幟設為 純色 (忽略,以享受沉浸式頭戴裝置) 。
將攝影機元件的 背景 色設為 黑色,alpha 0 (十六進位代碼:#000000000) (忽略,以實現沉浸式頭戴裝置) 。
接著,你必須建立一個簡單的「游標」物件,連接在 主攝影機上,幫助你在應用程式執行時定位影像分析輸出。 這個游標決定了相機對焦的中心點。
要建立游標:
在 層級面板中,右鍵點擊 主攝影機。 在 3D 物件下,點選 Sphere。
將 球 體重新命名為 游標 , (雙擊游標物件,或按下「F2」鍵盤鍵並選取物件) ,並確保它位於 主攝影機的子機。
在 層級面板中,左鍵點擊 游標。 選擇游標後,請在 檢查面板中調整以下變數:
將 轉換位置 設為 0、0、5
將刻度設定為 0.02、0.02、0.02
第四章 – 建立標籤系統
一旦你用 HoloLens 的相機拍攝影像,該影像會傳送到你的 Azure 電腦視覺 API 服務實例進行分析。
該分析結果即為一份稱為 標籤的可識別物件清單。
你可以在世界空間中將標籤 (當作 3D 文字,) 在照片拍攝地點顯示這些標籤。
以下步驟說明如何設定 Label 物件。
在階層面板中任意右鍵點擊, (位置已無差別) 在 3D 物件中新增 3D 文字。 叫它 標籤文字。
在 階層面板中,左鍵點擊 LabelText。 選擇標籤 文字 後,請在 檢查面板中調整以下變數:
- 將位置設定為 0,0,0
- 將刻度設定為 0.01、0.01、0.01
- 在元件 文字網格中:
- 將 文字中的所有文字替換成「...」
- 將 錨點 設為 中間中心
- 將 對齊 設定為 中心
- 把分頁大小設為 4
- 將 字體大小 設為 50
- 將 顏色 設定為 #FFFFFFFF
將 LabelText 從 階層面板拖曳到 Asset 資料夾,然後在 專案面板裡。 它讓 LabelText 成為預製件,因此可以用程式碼實例化。
你應該從層級面板刪除 LabelText,這樣它就不會顯示在開場場景中。 因為現在是預製件,你可以從 Assets 資料夾中呼叫個別實例,所以不需要把它放在場景裡。
階層 面板 中的最終物件結構應與下圖所示相同:
第五章 – 建立 ResultsLabel 類別
你需要建立的第一個腳本是 ResultsLabel 類別,它負責:
- 在相對於攝影機位置的適當世界空間中建立標籤。
- 顯示影像分析中的標籤。
要建立這個類別:
在專案面板中右鍵點擊,然後>建立資料夾。 把資料夾命名 為 Scripts。
建立好 Scripts 資料夾後,雙擊開啟。 接著在該資料夾裡,右鍵點選「 建立 > 」,再選 C# 腳本。 將腳本命名 為 ResultsLabel。
雙擊新的 ResultsLabel 腳本,用 Visual Studio 開啟它。
在類別中,插入以下程式碼於 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"); } } }記得在回到 Unity 前先把你的更改存到 Visual Studio。
回到 Unity 編輯器,點擊並拖曳 Scripts 資料夾的 ResultsLabel 類別到階層面板中的主攝影機物件。
點擊 主攝影機 ,查看 檢查面板。
你會注意到,從你剛拖入相機的腳本中,有兩個欄位: 游標 和 標籤預製件。
將名為 游標 的物件從 階層面板 拖曳到名為 游標的槽位,如下圖所示。
將專案面板中的 Assets 資料夾中名為 LabelText 的物件拖曳到名為 Label Prefab 的欄位,如下圖所示。
第六章 – 建立 ImageCapture 類別
你接下來要建立的類別是 ImageCapture 類別。 此類別負責:
- 使用 HoloLens 相機拍攝影像並儲存在應用程式資料夾中。
- 捕捉使用者的輕觸手勢。
要建立這個類別:
回到你之前建立的 Scripts 資料夾。
在資料夾內點右鍵,建立 > C# 腳本。 將腳本命名為 ImageCapture。
雙擊新的 ImageCapture 腳本,可以用 Visual Studio 開啟它。
在檔案頂端新增以下命名空間:
using System.IO; using System.Linq; using UnityEngine; using UnityEngine.XR.WSA.Input; using UnityEngine.XR.WSA.WebCam;接著在 ImageCapture 類別中,位於 Start () 方法上方,加入以下變數:
public static ImageCapture instance; public int tapsCount; private PhotoCapture photoCaptureObject = null; private GestureRecognizer recognizer; private bool currentlyCapturing = false;tapsCount 變數儲存從使用者捕捉的點擊手勢數量。 這個數字用於拍攝影像的命名。
現在需要新增 Awake () 和 Start () 方法的程式碼。 當類別初始化時,這些會被呼叫:
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(); }實作一個當 Tap 手勢發生時會被呼叫的處理器。
/// <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(); } }TapHandler () 方法會增加從使用者擷取的點擊次數,並利用當前游標位置決定新標籤的位置。
此方法接著呼叫 ExecuteImageCaptureAndAnalysis () 方法,開始此應用程式的核心功能。
一旦影像被擷取並儲存,以下處理器就會被呼叫。 如果過程成功,結果會傳給你尚未建立) 用於分析的 VisionManager (。
/// <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()); }接著,加入應用程式啟動影像擷取流程並儲存影像的方法。
/// <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; }); }); }
警告
此時,你會注意到 Unity 編輯器主控台面板出現錯誤。 因為程式碼參考了 VisionManager 類別,而你將在下一章中建立這個類別。
第七章 – 呼喚 Azure 與影像分析
你最後需要建立的腳本是 VisionManager 類別。
此類別負責:
- 載入以位元組陣列形式擷取的最新影像。
- 將位元組陣列傳送到你的 Azure 電腦視覺 API Service 實例進行分析。
- 收到以 JSON 字串形式回應的回應。
- 將回應反序列化,並將產生的標籤傳遞給 ResultsLabel 類別。
要建立這個類別:
雙擊 Scripts 資料夾,打開它。
在 Scripts 資料夾內右鍵點擊「 建立 > C# 腳本」。 把腳本命名 為 VisionManager。
雙擊新腳本,可以用 Visual Studio 開啟。
將命名空間更新為 VisionManager 類別頂端的以下內容:
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking;在腳本頂端,VisionManager 類別 ( 開始 () 方法) 上方,你需要建立兩個類別,分別代表 Azure 的反序列化 JSON 回應:
[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; }
注意事項
TagData 和 AnalysedObject 類別必須在宣告前先加上 [System.Serializable] 屬性,才能用 Unity 函式庫進行反序列化。
在 VisionManager 類別中,你應該加入以下變數:
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;
警告
務必將你的 Auth Key 插入 authorizationKey 變數。 你應該在本課程第一章開始時就已經註明了你的認證金鑰。
警告
visionAnalysisEndpoint 變數可能與此範例中指定的變數不同。 west-us 嚴格指的是為西美國區域建立的服務實例。 更新你的 端點網址;以下是一些可能的範例:
- 西歐:
https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags - 東南亞:
https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags - 澳洲東部:
https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
現在必須加入《覺醒代碼》。
private void Awake() { // allows this instance to behave like a singleton instance = this; }接著,加入與其下方靜態串流方法的協程 (,) ,取得 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); }記得在回到 Unity 前先把你的更改存到 Visual Studio。
回到 Unity 編輯器,點擊並拖曳 Scripts 資料夾中的 VisionManager 和 ImageCapture 類別到層級面板的主攝影機物件。
第八章 – 建造之前
要徹底測試你的應用程式,你需要將它側載到 HoloLens 上。 在此之前,請確保:
- 第二章提到的所有設定都設定得正確。
- 所有腳本都附著到 主攝影機 物件上。
- 主攝影機檢查面板中的所有欄位均已正確分配。
- 務必將你的 Auth Key 插入 authorizationKey 變數。
- 請確保你也在 VisionManager 腳本中檢查端點,並且它與 你的 區域對齊, (本文件預設使用 west-us) 。
第九章 – 建置 UWP 解決方案並側載應用程式
這個專案 Unity 部分所需的一切現已完成,現在是時候從 Unity 上建構它。
請導覽至 建構設定 - 檔案 > 建置設定...。
從 建置設定 視窗點選 建置。
如果還沒,記得點選 Unity C# 專案。
點擊 「建造」。 Unity 會啟動一個檔案總管視窗,你需要在那裡建立並選擇一個資料夾來建置應用程式。 現在就建立那個資料夾,並命名為 App。 然後選擇 應用程式 資料夾,按下 選擇資料夾。
Unity 開始將你的專案建置到 App 資料夾。
Unity 完成建置 (可能需要一些時間) ,它會在建置地點開啟一個檔案總管視窗 (查看工作列,因為這個視窗不一定總是出現在視窗上方,但會通知你新增了一個新視窗) 。
第十章 – 部署至全息鏡頭
在 HoloLens 上部署:
你需要 HoloLens (的 IP 位址,才能進行遠端部署) ,並確保你的 HoloLens 處於 開發者模式。 若要執行這項作業:
- 戴著全息鏡片時, 打開設定。
- 前往 網路 & 網路 > Wi-Fi > 進階選項
- 請注意 IPv4 位址。
- 接著,回到 設定,再到 更新開發者安全 > &
- 開啟開發者模式。
) App 資料夾 (新的 Unity 建置,並用 Visual Studio 開啟解決方案檔案。
在解決方案設定中選擇 除錯。
在解決方案平台中,選擇 x86, 遠端機器。
到 建置選單 ,點選 部署解決方案,將應用程式側載到你的 HoloLens。
你的應用程式現在應該會出現在 HoloLens 已安裝的應用程式清單中,準備啟動!
注意事項
若要部署到沉浸式耳機,請將解決方案平台設為本地機器,並將配置設為除錯,平台為 x86。 接著在本地機器上部署,使用 建置選單,選擇 部署解決方案。
您完成的電腦視覺 API 應用程式
恭喜你,你打造了一個結合Azure 電腦視覺 API的混合實境應用程式,能辨識真實世界的物件,並展現對所見事物的信心。
額外練習
練習一
就像你在 VisionManager) 中使用端點中所證明的 Tags 參數 (一樣,擴展應用程式以偵測其他資訊;看看你還能使用哪些參數,請點此。
練習二
以更對話且易讀的方式顯示回傳的 Azure 資料,或許還能隱藏數字。 彷彿有機器人在跟使用者說話。