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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;知识。现有语言驱动的零样本领域…