基于MindAR实现的网页端WebAR图片识别叠加动作模型追踪功能(含源码)

news2024/11/13 7:53:39

前言

由于之前一直在做这个AR/VR 相关的功能开发,大部分的时候实现方式都是基于高通Vuforia或者EasyAR等基于Unity3d的引擎的开发,这样开发的程序大部分都是运行在APP上,安卓或者ios的开发也能一次性搞定。不过当时大部分的需求都是需要在网页端的功能,特别在WX打开连接就能体验功能的需求很强烈。不过在这些功能鄙人还都没有实现过,而且跳槽后基本不再做文旅相关的开发,前几天在逛GitHub时发现了现在很火的开源库AR.js(4.4k星星),用于 Web 增强现实的轻量级库,具有图像跟踪、基于位置的 AR 和标记跟踪等功能(自行搜索查看)----于是整了体验一下,效果还是很不错,不过就在该库的介绍页中发现了更叼的、更出色的图像跟踪功能(也是多个图像跟踪)和面部跟踪(MindAR,GitHub站内1.5k星星),在经过了node.js和npm的数次捣鼓和安装操作后,终于制作出了一个自己的案例,在此将过程分享出来。

效果

识别:
在这里插入图片描述

跟随:
在这里插入图片描述

准备工作

大致流程是将github上的代码下载到本地,准备目标识别图,目标图像编译,准备模型等准备工作。

下载源码

本地如果安装了git工具可以直接git下来,这个我就不交了,没有的可以直接下载压缩包:

code > Download ZIP
在这里插入图片描述

下载完成的压缩包,进行解压后就获得了源码。

安装包体

这里需要node.js的环境(个人也是这么编译和操作的),具体自行进行搜索配置吧。Cmd切换到源码的根路径,安装关联的包体:

npm install

然后再进行执行构建操作:

npm run build dist

模型&目标图

由于本人也不太会建模和画画,就直接在网上找了现成的素材进行。

编译目标图

编译图的地址该项目的仓库地址有介绍,在说明文档的工具页,我也是直接使用在线的方式进行的,为了不外链就自己找一下吧。打开网页后会按提示可以将图片拖到对应的位置,就会上传识别图(按文档说的是可以多选图片,这样就可以实现多目标检测和跟踪的功能)。
过程如下图:
在这里插入图片描述

等待编译完成后会有一些大小不一可供选择的带特征点的识别图可供预览:
在这里插入图片描述

个人认为特征点越多识别精准度会越高(仅个人认为,需验证自行测试)。

点击下载后,将会得到一个targets.mind的文件,这个文件需要放到工程中,后续会使用到。

编写代码

需要快速上手,我也不从头进行编码了,直接在“mind-ar-js-master\examples\image-tracking、example1.html”的基础上进行了修改,然后完成自己的功能。
这里的主要修改了body中的内容,即替换了识别图、识别后的模型等。

<body>
 <div class="example-container">
 <a-scene mindar-image="imageTargetSrc: ./assets/card-example/card.mind; showStats: true;" embedded color-space="sRGB" renderer="colorManagement: true, physicallyCorrectLights" vr-mode-ui="enabled: false" device-orientation-permission-ui="enabled: false">
 <a-assets>
 <img id="card" src="./assets/card-example/card.png" />
 <a-asset-item id="avatarModel" src="./assets/card-example/softmind/scene.gltf"></a-asset-item>
 </a-assets>

 <a-camera position="0 0 0" look-controls="enabled: false"></a-camera>

 <a-entity mindar-image-target="targetIndex: 0">
 <a-plane src="#card" position="0 0 0" height="0.552" width="1" rotation="0 0 0"></a-plane>

<a-gltf-model rotation="0 0 0 " position="0 0 0.1" scale="0.005 0.005 0.005" src="#avatarModel"
 animation="property: position; to: 0 0.1 0.1; dur: 1000; easing: easeInOutQuad; loop: true; dir: alternate" >
 </a-entity>
 </a-scene>
 </div>
 </body>

修改为:

<body>
<div class="example-container">
 <a-scene mindar-image="imageTargetSrc: ./ImgTarget/kfgirl.mind; showStats: true;" embedded color-space="sRGB" renderer="colorManagement: true, physicallyCorrectLights" vr-mode-ui="enabled: false" device-orientation-permission-ui="enabled: false">
 <a-assets>
 <img id="kfgirlimg" src="./ImgTarget/kfgirl.png" />
 <a-asset-item id="kfgirlmodel" src="./ImgTarget/scene.gltf"></a-asset-item>
 </a-assets>

 <a-camera position="0 0 0" look-controls="enabled: false"></a-camera>

<a-entity mindar-image-target="targetIndex: 0">
<a-gltf-model rotation="0 0 0 " position="0 0.5 0" scale="0.005 0.005 0.005" src="#kfgirlmodel" animation-mixer></a-gltf-model>
 </a-entity>
 </a-scene>
</div>
</body>

这里的a-scene 的mindar-image = imageTargetSrc是识别目标的路径,其它属性感觉无关痛痒,暂时未研究。

a-assets是场景中的资源,图片和模型,我也是按案例中进行了id 和src的替换。

a-gltf-model是识别后的模型展示,src属性需要和a-assets中模型(a-asset-item)的id一致,同时rotation="0 0 0 " position=“0 0.5 0” scale=“0.005 0.005 0.005” 这些的赋值,主要是依次控制模型的旋转、位置、缩放属性,这些根据不同的模型进行设置;我这里删除了animation属性,不要了场景默认的动画。添加了animation-mixer 这个是控制模型自带动作的,不添加模型将没有对应的动作。

服务器设置

我这里直接使用了IIS作为了本地的服务器,在打开网页测试之前还需要进行MIME类型的添加:
.mind:
在这里插入图片描述

.bin
在这里插入图片描述

如果有其它的后缀名类型,需要自行添加上去,不然没办法运行网页或者功能不正常。

同时需要配置SSL证书(这个教程网上多,自行搜索配置吧):
在这里插入图片描述

最后通过https://IP地址/网页进行访问。

源码

https://download.csdn.net/download/qq_33789001/87537647
(打不开说明暂未通过审核)

总结

这个摸索了几天弄出来的效果,在手机和电脑上都能顺利运行,但是不知什么原因感觉帧率是有点低,就像效果图上的显示一样,只有个位数的帧率,所以要用这个开发测试还需要进行充分的测试。还有部分脚本库是托管在了cdn服务器,直接调用会比较的慢,还有可能出现脚本库加载不成功的情况,如果直接使用仓库中的案例可能需要科学上网。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/391933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Xshell的下载、使用、配置【ssh、telnet、串口】

目录 一、概述 二、Xshell的使用  2.1 Xshell使用ssh协议远程连接Linux主机或服务器  2.2 Xshell使用telnet协议远程连接Linux开发板  2.3 Xshell使用SERIAL协议远程连接Linux开发板 三、Xshell常用配置  3.1 配置默认会话属性 一、概述 Xshell是由NetSarang公司开发的强大…

【Linux】-- 进程间通讯

目录 进程间通讯概念的引入 意义&#xff08;手段&#xff09; 思维构建 进程间通信方式 管道 站在用户角度-浅度理解管道 匿名管道 pipe函数 站在文件描述符角度-深度理解管道 管道的特点总结 管道的拓展 单机版的负载均衡 匿名管道读写规则 命名管道 前言 原理…

深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制

深入理解java虚拟机精华总结&#xff1a;性能监控和故障处理工具、类加载机制性能监控和故障处理工具、类加载机制jpsjstatjinfojmapjhatjstackVisualVM类加载机制类加载的时机类加载的过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型破坏双亲委派模型往期内容&am…

HTML5的新特性

前言 为了更好地处理今天的互联网应用&#xff0c;HTML5添加了很多新元素及功能&#xff0c;比如: 图形的绘制&#xff0c;多媒体内容&#xff0c;更好的页面结构&#xff0c;更好的形式 处理&#xff0c;和几个api拖放元素&#xff0c;定位&#xff0c;包括网页 应用程序缓存…

八股总结(二)计算机网络与网络编程

layout: post title: 八股总结&#xff08;二&#xff09;计算机网络与网络编程 description: 八股总结&#xff08;二&#xff09;计算机网络与网络编程 tag: 八股总结 文章目录计算机网络网络模型网络体系结构在浏览器输入一个网址后回车&#xff0c;背后都发生了什么&#x…

C/C++每日一练(20230306)

目录 1. 判断素数的个数 ☆ 2. 分隔链表 ★★ 3. 数据流的中位数 ★★ 1. 判断素数的个数 在一个数组A中存放100个数据&#xff0c;用子函数判断该数组中哪些是素数&#xff0c;并统计该素数的个数&#xff0c;在主函数中输出该素数的个数。 代码&#xff1a; #includ…

三、Spark 内存管理

文章目录Spark 内存管理堆内和堆外内存堆内内存堆外内存堆外与堆内的平衡内存空间分配静态内存管理&#xff08;早期版本&#xff09;统一内存管理Spark 内存管理 堆内和堆外内存 Spark 引入了堆外&#xff08;Off-heap&#xff09;内存&#xff0c;使之可以直接在工作节点的…

Java——打开轮盘锁

题目链接 leetcode在线oj题——打开轮盘锁 题目描述 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字&#xff1a; ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转&#xff1a;例如把 ‘9’ 变为 ‘0’&#xff0…

对话镕铭微电子蔡媛:深入理解用户痛点,满足差异化需求

“芯片不仅仅是一个硬件产品&#xff0c;为了更好的贴近用户、服务用户&#xff0c;我们需要在固件和软件的框架上投入足够的研发资源&#xff0c;与客户同步迭代更新&#xff0c;以适应其快速的业务迭代要求。在深入理解用户需求和痛点的基础上&#xff0c;满足用户差异化的功…

【STL】模拟实现list

目录 1、list介绍 所要实现类及其成员函数接口总览 2、结点类的模拟实现 基本框架 构造函数 3、迭代器类的模拟实现 迭代器类存在的意义 3.1、正向迭代器 基本框架 默认成员函数 构造函数 运算符重载 --运算符重载 !运算符重载 运算符重载 *运算符重载 …

MapReduce全排序和二次排序

排序是MapReduce框架中最重要的操作之一。MapTask和ReduceTask均会对数据按照key进行排序。该操作属于Hadoop的默认行为。任何应用程序中的数据均会被排序&#xff0c;而不管逻辑上是否需要。默认排序是按照字典顺序排序&#xff0c;且实现该排序的方法是快速排序。对于MapTask…

考研复试——操作系统

文章目录操作系统1. 操作系统的特征&#xff1a;2. 进程与线程的关系以及区别3. 简述进程和程序的区别4. 进程的常见状态&#xff1f;以及各种状态之间的转换条件&#xff1f;5. 进程的调度算法有哪些&#xff1f;6. 什么是死锁&#xff1f;产生条件&#xff1f;如何避免死锁&a…

【强化学习】强化学习数学基础:随机近似理论与随机梯度下降

强化学习数学基础&#xff1a;随机近似理论与随机梯度下降Stochastic Approximation and Stochastic Gradient Descent举个例子Robbins-Monro algorithm算法描述举个例子收敛性分析将RM算法用于mean estimationStochastic gradient descent算法描述示例和应用收敛性分析收敛模式…

Rainbond V5.12 版本发布,支持平台级插件和能力扩展

在这个版本中&#xff0c;我们主要支持了平台级的插件和能力扩展。希望能通过外部插件扩展平台能力&#xff0c;实现微内核的效果&#xff1b;同时以后将会继续精简安装&#xff0c;能让用户按需扩展平台功能。在 Kubernetes 兼容性这方面&#xff0c;我们也通过平台级的能力将…

详解JAVA类加载

目录 1.概述 2.双亲委派 3.ServiceClassLoader 4.URLClassLoader 5.加载冲突 1.概述 概念&#xff1a; 类加载器&#xff08;Class Loader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组件&#xff0c;负责加载Java类到内存中并使其可以被JVM执行。类…

2023/3/6 VUE - 组件传值【通信】方式

1 父亲传子代传值【子代使用父代的数据】 1.1 props传值 父亲给儿子传值&#xff1a; 爷爷给孙子传值&#xff1a; 这个props传值的方式&#xff0c;只能一代一代的往下传&#xff0c;不能跨代传值。 有一个问题&#xff1a;子组件不能修改父组件的值&#xff1a; 1.2 …

MyBatis学习笔记(十) —— 动态SQL

10、动态SQL MyBatis框架的动态SQL技术是一种根据特定条件动态拼装SQL语句的功能&#xff0c;它存在的意义是为了解决拼接SQL语句字符串的痛点问题。 动态SQL&#xff1a; 1、if 标签&#xff1a;通过test属性中的表达式判断标签中的内容是否有效&#xff08;是否会拼接到sql中…

RTOS中相对延时和绝对延时的区别

相信许多朋友都有过这么一个需求&#xff1a;固定一个时间&#xff08;周期&#xff09;去处理某一件事情。 比如&#xff1a;固定间隔10ms去采集传感器的数据&#xff0c;然后通过一种算法计算出一个结果&#xff0c;最后通过指令发送出去。 你会通过什么方式解决呢&#xf…

Redis缓存击穿,缓存穿透,缓存雪崩,附解决方案

前言在日常的项目中&#xff0c;缓存的使用场景是比较多的。缓存是分布式系统中的重要组件&#xff0c;主要解决在高并发、大数据场景下&#xff0c;热点数据访问的性能问题&#xff0c;提高性能的数据快速访问。本文以Redis作为缓存时&#xff0c;针对常见的缓存击穿、缓存穿透…

Java中 new Integer 与 Integer.valueOf 的区别

引入&#xff1a;new Integer(18) 与 Integer.valueOf(18) 有区别吗&#xff1f;有的话&#xff0c;有什么区别&#xff1f; 我们都知道&#xff0c;使用 new 关键字的时候&#xff0c;每次都会新创建一个对象。但是&#xff0c;Integer.valueOf() 会新创建一个对象吗&#xf…