Unity AR+ 百度AI 實現 物體識別與對應英文翻譯

一、前言

我目前實現了拍照保存到手機的功能

我想進一步優化,實現通過手機攝像頭實時識別眼前的物體,顯示對應的英文的功能。

1.項目技術棧:Unity 2022.3.53+ Vuforia 11+ 百度物體識別API + 百度翻譯API

2.功能目標:使用手機攝像頭識別現實中的物體,返回物體識別結果和物體英文翻譯,UI 實時展示翻譯結果。

二、實現思路

用戶點擊按鈕 → 截圖當前畫面 → 上傳到百度物體識別API ?→ 獲取中文物體名稱 →

調用百度翻譯API ?→ 得到英文單詞 → 在 UI 顯示英文 + 中文。

三、實現代碼

腳本名功能說明應該掛在哪個物體上
CameraCapture.cs采集 AR 攝像頭畫面截圖ARCamera(Vuforia 默認相機)
BaiduAuth.cs獲取百度 Access Token新建空物體 BaiduManager
BaiduObjectRecognition.cs調用百度物體識別 APIBaiduAuth.cs 放同一個物體即可
BaiduTranslate.cs調用百度翻譯 API也放在同一個? BaiduManager 上
ARRecognitionController.cs管理完整識別邏輯和 UI 更新新建空物體掛載 RecognitionController

1.CameraCapture.cs

using UnityEngine;public class CameraCapture : MonoBehaviour
{public Camera arCamera;public Texture2D CaptureImage(){int captureWidth = 1280;int captureHeight = 720;RenderTexture rt = new RenderTexture(captureWidth, captureHeight, 24);arCamera.targetTexture = rt;arCamera.Render();RenderTexture.active = rt;Texture2D screenShot = new Texture2D(captureWidth, captureHeight, TextureFormat.RGB24, false);screenShot.ReadPixels(new Rect(0, 0, captureWidth, captureHeight), 0, 0);screenShot.Apply();arCamera.targetTexture = null;RenderTexture.active = null;Destroy(rt);return screenShot;}
}

2.BaiduAuth.cs

public class BaiduAuth : MonoBehaviour
{public string clientId = "你的API Key";public string clientSecret = "你的Secret Key";public string accessToken;public IEnumerator GetAccessToken(System.Action onSuccess){string url = $"https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={clientId}&client_secret={clientSecret}";UnityWebRequest www = UnityWebRequest.Get(url);yield return www.SendWebRequest();if (!www.result.Equals(UnityWebRequest.Result.ConnectionError)){var response = JsonUtility.FromJson<TokenResponse>(www.downloadHandler.text);accessToken = response.access_token;onSuccess?.Invoke();}else{Debug.LogError(www.error);}}[System.Serializable]public class TokenResponse { public string access_token; }
}

3.BaiduObjectRecognition.cs

public class BaiduObjectRecognition : MonoBehaviour
{public string accessToken;public IEnumerator RecognizeObject(Texture2D image, System.Action<string> callback){byte[] imageData = image.EncodeToJPG();string imageBase64 = System.Convert.ToBase64String(imageData);string url = $"https://aip.baidubce.com/rest/2.0/image-classify/v2/advanced_general?access_token={accessToken}";WWWForm form = new WWWForm();form.AddField("image", imageBase64);UnityWebRequest www = UnityWebRequest.Post(url, form);www.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded");yield return www.SendWebRequest();if (!www.result.Equals(UnityWebRequest.Result.ConnectionError)){callback?.Invoke(www.downloadHandler.text);}else{Debug.LogError(www.error);}}
}

4.BaiduTranslate.cs

public class BaiduTranslate : MonoBehaviour
{public string appId = "你的翻譯AppId";public string secretKey = "你的翻譯密鑰";public IEnumerator Translate(string query, System.Action<string> callback){string salt = Random.Range(10000, 99999).ToString();string sign = GetMD5(appId + query + salt + secretKey);string url = $"https://fanyi-api.baidu.com/api/trans/vip/translate?q={UnityWebRequest.EscapeURL(query)}&from=zh&to=en&appid={appId}&salt={salt}&sign={sign}";UnityWebRequest www = UnityWebRequest.Get(url);yield return www.SendWebRequest();if (!www.result.Equals(UnityWebRequest.Result.ConnectionError)){callback?.Invoke(www.downloadHandler.text);}else{Debug.LogError(www.error);}}string GetMD5(string str){using var md5 = System.Security.Cryptography.MD5.Create();byte[] inputBytes = System.Text.Encoding.UTF8.GetBytes(str);byte[] hashBytes = md5.ComputeHash(inputBytes);return System.BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();}
}

5.ARRecognitionController.cs

public class ARRecognitionController : MonoBehaviour
{public CameraCapture cameraCapture;public BaiduAuth auth;public BaiduObjectRecognition recognition;public BaiduTranslate translator;public TextMeshProUGUI resultText;public void StartRecognition(){StartCoroutine(auth.GetAccessToken(() =>{StartCoroutine(StartRecognitionFlow());}));}IEnumerator StartRecognitionFlow(){yield return new WaitForSeconds(0.3f);Texture2D img = cameraCapture.CaptureImage();if (img == null){resultText.text = "無法獲取圖像";yield break;}yield return recognition.RecognizeObject(img, json =>{var result = JObject.Parse(json);string chineseName = result["result"]?[0]?["keyword"]?.ToString();if (!string.IsNullOrEmpty(chineseName)){StartCoroutine(translator.Translate(chineseName, transJson =>{var transResult = JObject.Parse(transJson);string english = transResult["trans_result"]?[0]?["dst"]?.ToString();resultText.text = $"{english}\n({chineseName})";}));}else{resultText.text = "未識別出物體";}});}
}

四、unity中具體實現

1.最終ARRecognitionController上的內容參考如下:

2.UI設計(最基本的就是一個按鈕,一個text)

(1)TextMeshProUGUI

a.在 Canvas 里創建一個 TextMeshPro - Text 組件

命名為 ResultText。設置一個大點的字體、顏色醒目一些。

b.在 Canvas 創建一個 Button

命名為識別按鈕

按鈕點擊事件綁定 RecognitionController.StartRecognition() 方法。

五、最終實現效果

操作系統行為
用戶點擊“識別”按鈕調用百度授權,獲取 access token(如果已有可跳過)
系統截圖 AR 相機當前畫面使用 RenderTexture 穩定截圖
后端自動處理,上傳截圖至百度物體識別 API返回識別出的中文關鍵詞
中文詞匯傳給翻譯 API得到對應英文單詞
顯示 UI 結果Monitor screen??顯示器屏幕” 這樣顯示在界面上

六、探索過程的一些問題

整個流程的串通其實實現的比較順利。

一直卡在拍照的圖片效果不好,百度識別不出來或者不準確上。

????????一個就是要處理好ar camera的攝像頭像素幀,之前博客提到的gallery screenshot我沒有用,直接新寫了腳本。

????????第二個報錯是百度返回 access token 無效,需要每次識別前先動態獲取 access token。

? ? ? ? 第三個是照片圖像老是重復,每次點擊時重新采圖,延時 0.3 秒防止攝像頭卡幀。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/85204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/85204.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/85204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue.js第二節

計算屬性、事件綁定、條件判斷、遍歷循環 計算屬性&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

從開源代碼入場無人機學術研究到商業化市場的全路徑指南-優雅草卓伊凡

從開源代碼入場無人機學術研究到商業化市場的全路徑指南-優雅草卓伊凡 引言&#xff1a;開源代碼在無人機研究中的重要性 優雅草卓伊凡在這里告訴大家&#xff0c;如果真的要開始進入無人機領域&#xff0c;我們需要一步步開始研究。目前先去看看開源無人機代碼是尤為重要的&…

window11中開啟ubuntu22.04子系統

一、啟用Windows子系統 打開控制面板 選擇程序然后點擊“啟用或關閉Windows功能” 勾選如下2項&#xff0c;點擊確定 二、安裝內核升級包 打開鏈接https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi下載內核升級包&#xff0c;打開后安裝、重啟電腦…

80Qt窗口_對話框

目錄 5. 對話框 5.1 對話框介紹 用例1&#xff1a; 用例2&#xff1a; 用例3&#xff1a; 用例4&#xff1a; 5.2 對話框的分類 5.2.1 模態對話框 5.2.2 ?模態對話框 5. 對話框 5.1 對話框介紹 對話框是 GUI 程序中不可或缺的組成部分。?些不適合在主窗?實現的功…

Pyenv 跟 Conda 還有 Poetry 有什么區別?各有什么不同?

pyenv、Conda 和 Poetry 是 Python 生態中常用的工具&#xff0c;但它們的核心功能和用途不同&#xff0c;通常可以結合使用。以下是它們的區別和特點&#xff1a; 1. pyenv 用途&#xff1a;管理多個 Python 解釋器版本。 核心功能&#xff1a; 安裝不同版本的 Python&#x…

數學符號和標識中英文列表(含義與示例)

數學符號和標識的參考&#xff0c;涵蓋了數學的各個主要分支&#xff0c;并提供清晰的定義和示例&#xff0c;方便快速查找和學習收藏。 目錄 基礎數學符號幾何符號代數符號線性代數符號概率與統計符號集合論符號邏輯符號微積分與分析符號數字與字母符號 特點 中英對照&…

「Java流程控制」switch結構

知識點解析 1.switch結構的核心概念 switch語句是一種多分支選擇結構,它根據表達式的值來選擇執行不同的代碼塊。與if-else結構相比,switch更適合處理離散的、有限個值的比較。 2.switch結構的基本語法 switch (表達式) {case 值1:// 代碼塊1[break;]case 值2:// 代碼塊…

從0開始學習R語言--Day27--空間自相關

有的時候&#xff0c;我們在數據進行分組時&#xff0c;會發現用正常的聚類分析的方法和思維&#xff0c;分組的情況不是很理想。其實這是因為我們常常會忽略一個問題&#xff1a;假設我們正在分析的數據是真實的&#xff0c;那么它也肯定在一定程度上符合客觀規律。而如果我們…

Excel將表格文件由寬數據轉為長數據的方法

本文介紹基于Excel軟件的Power Query模塊&#xff0c;實現表格數據由寬數據轉為長數據的具體方法。 長數據和寬數據是數據分析中的2種基本數據組織形式&#xff0c;二者在結構、用途、適用場景等方面各有特點。其中&#xff0c;寬數據 &#xff08;Wide Format&#xff09;以“…

SpringAI + DeepSeek大模型應用開發 - 入門篇

三、SpringAI Spring AILangChain4jChat支持支持Function支持支持RAG支持支持對話模型1515向量模型1015向量數據庫1520多模態模型51JDK178 1. 對話機器人 1.1 快速入門 步驟①&#xff1a;引入依賴&#xff08;先去掉openai的starter依賴&#xff0c;因為要配置API_KEY&#…

ROS docker使用顯卡驅動rviz gazebo,以及接入外設和雷達

ROS docker使用顯卡驅動rviz gazebo&#xff0c;以及接入外設和雷達 由于我的電腦裝ubuntu22.04系統&#xff0c;想使用ros noetic開發&#xff0c;使用魚香ros一鍵安裝docker安裝。但是啟動dockek中rviz無法使用顯卡驅動&#xff0c;usb相機端口不顯示&#xff0c;網口雷達無…

ruoyi后端框架的mapper層復雜字段數據獲取問題

背景。如下是復雜字段。需要在mapper.java類注解中聲明autoResultMap true才會進行處理。前提是&#xff0c;創建后端程序代碼沒有添加mapp.xml文件。故用注解簡化代替。

產品推薦|一款具有單光子級探測能力的科學相機千眼狼Gloria 1605

在生命科學超分辨率成像、量子物理單光子探測、交叉領域單分子追蹤等應用場景中&#xff0c;具有單光子級探測能力的科學相機是科學實驗的關鍵設備。 千眼狼Gloria 1605采用16μm16μm大像元尺寸設計&#xff0c;基于Gpixel科學級背照式CMOS芯片&#xff0c;集成千眼狼底層圖像…

JS.Day2-堆選(Py)/三路快排-快速選擇-215,11,560,21,128,20,121

目錄 215.找第k大元素 三路的快速排序 快速選擇 法2.堆選 &#xff08;堆排序&#xff09; 11.盛更多水的容器 代碼1 代碼2 560.和為K的子數組&#xff08;題意&#xff01;&#xff09; 慣性思維 正解 21.合并生序鏈表 遞歸寫法 128.最長連續序列 20.有效的括號…

第8章 處理幾何圖形 面向 ArcGIS的Python腳本編程

一、折點坐標(.txt 或 .xlsx 或 .xls) > 點線面圖層(.shp) &#xff08;一&#xff09;.xlsx 或 .xls > .shp 新建一個文件夾&#xff0c;連接到該文件夾&#xff0c;并將其設置為工作空間 在該文件夾下&#xff0c;新建一個pts.xlsx的文件&#xff0c;并輸入下圖內容 …

使用(h3.js)繪制六角網格碼

今天來記錄一篇關于h3.js插件庫的使用&#xff0c;他可以很高效的計算出地球上某個經緯度坐標六邊形頂點。 前段時間領導突然給我個售前功能&#xff0c;要求是使用h3.js插件在地球上繪制出六邊形網格碼&#xff0c;本來以為挺棘手的&#xff0c;結果看完文檔后發現也挺簡單的…

GO 1.25

Go 1.25 發布說明&#xff08;草案&#xff09; Go 1.25 尚未發布。 本文檔是正在編寫中的發布說明。Go 1.25 預計于 2025 年 8 月發布。 語言變更 Go 1.25 中沒有影響 Go 程序的語法變更。然而&#xff0c;在語言規范中&#xff0c;“核心類型”&#xff08;core types&…

解析Android SETUP_DATA_CALL 鏈路信息字段

Android 對象返回的log信息經常都不是標準的JSON字符串,排查字段不直觀,比如下面的日志: 06-13 15:56:36.204 8076 8407 D RILJ : [1655]> SETUP_DATA_CALL,reason=NORMAL,accessNetworkType=EUTRAN,dataProfile=[DataProfile=[ApnSetting] IMS, 2318, 310260, ims,…

跨語言RPC:使用Java客戶端調用Go服務端的HTTP-RPC服務

在構建分布式系統時&#xff0c;實現不同編程語言之間的無縫通信是一個常見的需求。本文將詳細介紹如何使用Go語言創建一個HTTP-RPC服務&#xff0c;并通過Java客戶端進行遠程調用。我們將探索整個過程&#xff0c;包括服務端的實現、客戶端的編寫以及測試驗證。 一、背景介紹…

CVPR2024遷移學習《Unified Language-driven Zero-shot Domain Adaptation》

摘要 本文提出了一個名為 Unified Language-driven Zero-shot Domain Adaptation&#xff08;ULDA&#xff09;的新任務設置&#xff0c;旨在使單一模型能夠適應多種目標領域&#xff0c;而無需明確的領域標識&#xff08;domain-ID&#xff09;知識。現有語言驅動的零樣本領域…