惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
C
Cybersecurity and Infrastructure Security Agency CISA
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
爱范儿
爱范儿
Spread Privacy
Spread Privacy
P
Palo Alto Networks Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
T
The Blog of Author Tim Ferriss
The Cloudflare Blog
WordPress大学
WordPress大学
小众软件
小众软件
H
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
H
Hacker News: Front Page
Last Week in AI
Last Week in AI
D
DataBreaches.Net
V
V2EX
S
Securelist
C
CXSECURITY Database RSS Feed - CXSecurity.com
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
Cloudbric
Cloudbric
月光博客
月光博客
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
N
News and Events Feed by Topic
K
Kaspersky official blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
S
Secure Thoughts
S
Security Affairs
W
WeLiveSecurity
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Last Watchdog
The Last Watchdog
AI
AI
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 【当耐特】
罗磊的独立博客
Google DeepMind News
Google DeepMind News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
N
Netflix TechBlog - Medium
PCI Perspectives
PCI Perspectives
SecWiki News
SecWiki News
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
V
Visual Studio Blog

元视角

.NET 生态下的 Agent 框架选型:从 ReAct 到原生推理 - 元视角 从「能用」到「好用」:LLM 流式响应实现方式的探索之路 - 元视角 当我用 2000 条聊天记录,让 AI 为我画一幅自画像 - 元视角 基于 Supabase 的 AI 应用开发探索 - 元视角 微博 × MCP:社交媒体新玩法解锁 - 元视角 四点钟海棠花未眠 - 元视角 Semantic Kernel × MCP:智能体的上下文增强探索 - 元视角 基于 K-Means 聚类分析实现人脸照片的快速分类 - 元视角 容器技术驱动下的代码沙箱实践与思考 - 元视角 温故而知新:后端通用查询方案的再思考 - 元视角 浅议 CancellationToken 在前后端协同取消场景中的应用 - 元视角 Semantic Kernel 视角下的 Text2SQL 实践与思考 - 元视角 关于 ChatGPT 的流式传输,你需要知道的一切 - 元视角 RAG 的是与非、Rewrite 和 Rerank - 元视角 使用 EFCore 和 PostgreSQL 实现向量存储及检索 - 元视角 基于 LLaMA 和 LangChain 实践本地 AI 知识库 - 元视角 使用 llama.cpp 在本地部署 AI 大模型的一次尝试 - 元视角 如何为 Git 配置多个 SSH Key - 元视角 C# 使用 LibUsbDotNet 实现 USB 设备检测 - 元视角 基于 C# 实现样式与数据分离的打印方案 - 元视角 基于 SVG 的图形交互方案实践 - 元视角 前端视频播放技术概览 - 元视角 温故而知新,再话 Python 动态导入 - 元视角 后 GPT 时代,NLP 不存在了? - 元视角 视频是不能 P 的系列:使用 Milvus 实现海量人脸快速检索 - 元视角 GDI+下字体大小自适应方案初探 - 元视角 小爱音箱集成 ChatGPT 的不完全教程 - 元视角 程序员视角下的三体世界随想 - 元视角 关于 Docker 容器配置信息的渐进式思考 - 元视角 在 Docker 容器内集成 Crontab 定时任务 - 元视角 为你的服务器集成 LDAP 认证 - 元视角 似花还似非花 - 元视角 视频是不能 P 的系列:使用 Dlib 实现人脸识别 - 元视角 浅议分布式链路追踪与日志的整合 - 元视角 关于 Git 大文件上传这件小事 - 元视角 .NET 进程内队列 Channel 的入门与应用 - 元视角 使用 Fody 实现 .NET 的静态编织 - 元视角 .NET Core + ELK 搭建可视化日志分析平台(下) - 元视角 聊一聊前端图片懒加载背后的故事 - 元视角 支持外部链接跳转的 Vue Router 扩展实现 - 元视角 视频是不能 P 的系列:OpenCV 和 Dlib 实现表情包 - 元视角 不得不说的 ASP.NET Core 集成测试 - 元视角 再议 DDD 视角下的 EFCore 与 领域事件 - 元视角 Vue.js 前端项目容器化部署实践极简教程 - 元视角 再见,人间四月天 - 元视角 Python 图像风格化迁移助力画家梦想 - 元视角 利用 ASP.NET Core 中的标头传播实现分布式链路追踪 - 元视角 利用 gRPC 实现文件的上传与下载 - 元视角 七种武器:延迟队列的原理和实现总结 - 元视角 gRPC 流式传输极简入门指南 - 元视角 Envoy 集成 Jaeger 实现分布式链路追踪 - 元视角 浅议非典型 Web 应用场景下的身份认证 - 元视角 gRPC 借助 Any 类型实现接口的泛化调用 - 元视角 分布式丛林探险系列之 Redis 集群模式 - 元视角 分布式丛林探险系列之 Redis 主从复制模式 - 元视角 通过 Python 预测 2021 年双十一交易额 - 元视角 gRPC 搭配 Swagger 实现微服务文档化 - 元视角 SSL/TLS 加密传输与数字证书的前世今生 - 元视角 使用 Python 自动识别防疫健康码 - 元视角 你不可不知的容器编排进阶技巧 - 元视角 ASP.NET Core 搭载 Envoy 实现 gRPC 服务代理 - 元视角 再话 AOP,从简化缓存操作说起 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务身份认证(JWT) - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的监控预警 - 元视角 ASP.NET Core 搭载 Envoy 实现微服务的反向代理 - 元视角 ASP.NET Core gRPC 打通前端世界的尝试 - 元视角 EFCore 实体命名约定库:EFCore.NamingConventions - 元视角 ASP.NET Core gRPC 集成 Polly 实现优雅重试 - 元视角 ASP.NET Core gRPC 健康检查的探索与实现 - 元视角 ASP.NET Core gRPC 拦截器的使用技巧分享 - 元视角 SnowNLP 使用自定义语料进行模型训练 - 元视角 使用 HttpMessageHandler 实现 HttpClient 请求管道自定义 - 元视角 ABP vNext 的实体与服务扩展技巧分享 - 元视角 ABP vNext 对接 Ant Design Vue 实现分页查询 - 元视角 源代码探案系列之 .NET Core 跨域中间件 CORS - 元视角 源代码探案系列之 .NET Core 限流中间件 AspNetCoreRateLimit - 元视角 源代码探案系列之 .NET Core 并发限制中间件 ConcurrencyLimiter - 元视角 通过 EmbededFileProvider 实现 Blazor 的静态文件访问 - 元视角 低代码,想说爱你不容易 - 元视角 记一次失败的 ThoughtWorks 面试经历 - 元视角 从 C# 1.0 到 C# 9.0,历代 C# 语言特性一览 - 元视角 通过 Python 分析 2020 年全年微博热搜数据 - 元视角 基于 Python 和 Selenium 实现 CSDN 一键三连自动化 - 元视角 使用多线程为你的 Python 爬虫提速的 N 种姿势,你会几种? - 元视角 实现网页长截图的常见思路总结 - 元视角 温故而知新,由 ADO.NET 与 Dapper 所联想到的 - 元视角 视频是不能 P 的系列:OpenCV 人脸检测 - 元视角 作为技术宅的我,是这样追鬼滅の刃的 - 元视角 使用 Python 抽取《半泽直树》原著小说人物关系 - 元视角 厉害了!打工人用 Python 分析西安市职位信息 - 元视角 使用 dotTrace 对 .NET 应用进行性能分析与优化 - 元视角 一道 HashSet 面试题引发的蝴蝶效应 - 元视角 基于选项模式实现.NET Core 的配置热更新 - 元视角 Dapper.Contrib 在 Oracle 环境下引发 ORA-00928 异常问题的解决 - 元视角 .NET Core 中对象池(Object Pool)的使用 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(下):EventBus 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(中):RabbitMQ 篇 - 元视角 利用 MySQL 的 Binlog 实现数据同步与订阅(上):基础篇 - 元视角 记一次从已损坏的 Git 仓库中找回代码的经历 - 元视角 .NET Core 原生 DI 扩展之属性注入实现 - 元视角
EasyAR 尝鲜系列教程之自定义 Marker 的实现 - 元视角
飞鸿踏雪 · 2015-11-03 · via 元视角

各位朋友大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是:http://blog.yuanpei.me。通过本系列第一篇文章,我们初步了解了 EasyAR 这个增强现实引擎,这次我们来尝试自己定义一个 Marker,这样我们就可以用自己喜欢的图片来作为 Marker。因为目前 EasyAR 文档并不完善,所以下面的这些内容可能更多的是我个人的尝试和探索。如果大家对此感兴趣的话继续往下看否则就不要往下看了,因为我担心在官方正式文档出来以后大家可能会骂我啊。好了,对这个话题感兴趣的朋友就请继续往下看吧!

EasyAR 的基本流程

首先我们来看看官方给出的一张 EasyAR 的基本流程示意图:

EasyAR基本流程示意图 EasyAR基本流程示意图

在这张流程图,当中作为开发者的我们此刻需要关注的 Target 这一条线和 Frame 这条线。前者对应的是如何将普通的图片,例如 .jpg、.png 等配合 JSON 文件转化为系统可以识别的 Target,后者对应的是我们在识别到 Target 后要去处理哪些逻辑。在官方文档中我们可以找到这样一段话:

  • 创建相机设备、图像追踪器和增强对象(Create CameraDevice and ImageTracker and Augmenter objects).
  • 打开相机设备(Open CameraDevice).
  • 给相机设备附加图像追踪器(Attach ImageTracker to CameraDevice).
  • 开始执行相机设备和图形追踪器的相关逻辑(Start CameraDevice and ImageTracker).
  • 获得从图像追踪器增强后的帧画面(New frame using Augmenter from ImageTracker).
  • 绘制视频和其它的内容(Draw video background and other stuffs).

这段话基本上就是 EasyAR 流程示意图的全面解读了,所以我们学习 EasyAR 可以从这个基本流程来入手,了解这个流程能帮助我们更快地理解 API 接口,虽然现在官方的 API 文档依然处在预览状态下,想到这里简直各种不开心啊!

创建自定义 Marker

在了解了 EasyAR 的基本流程后,我们就来说说如何在 EasyAR 中创建自定义 Marker 吧!相信使用过 Vuforia 的人都知道要创建一个自定义的 Marker 需要到开发者后台去创建然后下载资源包,这种方式虽然高效、直接,可是因为没有人为地干预过程,所以我们对 AR 引擎内部究竟做了怎样的处理基本上是一无所知的,换句话说我们大部分的工作都是在做黑箱测试。到了 EasyAR 这里,一切就变得特别简单,这一点要给 EasyAR 点个赞。首先在 EasyAR 中配置 Marker 是通过 StreamingAssets 目录下的 dataset.json 这个文件来实现的:

{
  "images" :
  [
    {
      "image" : "mousepad.jpg",
      "name" : "mousepad"
    },
    {
      "image" : "idback.jpg",
      "name" : "idback",
      "size" : [8.56, 5.4],
      "uid" : "todo=uid-string"
    }
  ]
}

从这个文件中我们可以发现每一张图片都具有某些不同的属性,从目前博主掌握的资料来看,每张图片最重要的两个属性是 image 和 name。其中 image 是指图片的相对路径,该路径相对于 StreamingAssets 目录,因为我们做 Unity3D 游戏开发的时候都知道这个目录下的资源在编译的时候不会被压缩,当导出 APK 安装包的时候它会被完整的保留到根目录下的 assets 目录中。同样地,name 是指图片的名称即 ID,EasyAR 正是通过这个 ID 来和图片资源关联起来的。比如在默认的 SDK 项目中身份证背面这张图片是和 idback 这个 ID 对应的,如图所示,在这里 Easy 提供了四种存储方案即 Assets、App、Absolute、Json。和官方的人交流的时候说可以支持路径和 Json 字符串两种形式,但是对更加具体的这四种存储方案上的区别和优缺点目前并没有一个确切的说法,所以在这里我们就继续沿用 Assets 这种存储方案吧!我们可以注意到 idback 这张图片和 mousepad 这张图片相比增加了两个属性,即 uid 和 size。size 目前基本可以了解为 Unity3D 中的缩放,因为这个值表示的是在物理空间里的范围大小,单位是米,而我们知道 Unity3D 里默认的单位就是米,所以这个数值可以暂时理解为 Unity3D 里的缩放,它对应到下图里的 Size,我已经用红色字体标示出来。对于 uid 这个属性嘛,既然配置文件里都有 todo 标识出来了,那么我们就姑且认为这是一个暂时没有启用的属性值吧!

配置文件和ImagTarget的对应关系 配置文件和ImagTarget的对应关系

好了,下面我们来具体看看如何创建一个自定义 Marker:

  • 首先我们在 StreamingAssets 目录中添加一张图片 ziying.jpg,然后在 dataset.json 文件中增加该图片的信息。此时 ziying.jpg 的位置是在 StreamingAssets 根目录下。如果我们希望把它放在一个自定义的文件夹中,如 StreamingAssets/ziying 目录下,则需要将 ziying 的 image 属性值改为 ziying/ziying.jpg,以此类推。
{
  "images" :
  [
    {
      "image" : "mousepad.jpg",
      "name" : "mousepad"
    },
    {
      "image" : "ziying.jpg",
      "name" : "ziying"
    },
    {
      "image" : "idback.jpg",
      "name" : "idback",
      "size" : [8.56, 5.4],
      "uid" : "todo=uid-string"
    }
  ]
}
  • 在 Materials 目录下新建一个材质,然后找到 ziying.jpg 将其作为该材质的纹理贴图。
  • 在场景中找到 ImageTargetDataSet-idback 节点,修改其附加的 SimpleImageTargetBehaviour 脚本下的 Name 属性,将其修改为 ziying,同时将第二步创建的材质赋给 ImageTargetDataSet-idback 节点。此时场景效果如图所示,这意味着我们使用手机摄像头来扫描这张图片就可以看到场景中的这个模型啦!

自定义Markder效果 自定义Markder效果

  • 好了,现在编译这个项目并部署到手机上可以得到我们期望的结果,哈哈,慕容紫英站在桌面上和我一起玩对一个仙剑迷来说是不是特别有趣呢?

站在手机上的慕容紫英 站在手机上的慕容紫英

总结

到目前为止,EasyAR 官方还没有给出一个完整的 API 文档,所以我们目前能做的研究依然十分有限,在本文中涉及到的部分没有解决的问题,博主会在官方给出文档后第一时间给予解决,希望大家继续关注我的博客!我们现在使用的都是 SDK 中现成的脚本,如果我们希望自己来设计脚本来满足自己的要求实现某些定制的功能或者是想用原生代码来减少 Unity3D 这类游戏引擎带来的性能上的损耗以及实现播放视频的功能等等。这些内容博主在稍后会陆续写出来,好了,今天的内容就是这个样子啦!希望大家喜欢。