大家好,我是1024小神,技术群 / 私活群 / 股票群 或 交朋友 都可以私信我。
如果你觉得本文有用,一键三连 (点赞、评论、关注),就是对我最大的支持~

marker有两种,osd marker和2d marker
osd marker
微信小程序文档:单样本检测 | 微信开放文档
单样本检测(One-shot Detection, OSD)只使用一张待检测类别的图片,就能检测到输入图像中该类别的物体。 待检测类别图片被称为OSD marker
。 与一般物体检测不同,OSD 理论上可以检测任意用户指定的类别。该方法允许 OSD marker
与输入图像中的物体有视角差异或一定程度的外形差异。
应用场景:标志性建筑检测。Logo检测。商品检测。宠物检测。动漫形象检测等
2D/3D物体AR能力 (2D/3D Marker AR)
微信小程序文档:2D/3D物体AR能力 (2D/3D Marker AR) | 微信开放文档
2D/3D Marker AR能力,能够识别预先设定的目标物体(定义为Marker,包括2D平面物体和3D物体),进行视觉跟踪与定位,通过在目标物体周围渲染虚拟物体,从而实现AR功能。
方法区别
2D Marker
,仅适用于平面类物体,用户上传一张平面物体的俯视图像作为目标物体,算法运行时识别该平面物品,并渲染出相关虚拟物体。2D Marker可以理解为特殊的3D Marker。
3D Marker
,相比于2D Marker,能够识别3D物体,不局限与平面物体,具有更广的使用范围,算法运行前,需要手动制作3D Marker的识别目标文件(.map文件),然后算法运行时载入该文件用于识别。
OSDMarker,给现实物体做标记
人体之外还有的能力就是两个marker
了。其一是OSD Marker,一般以一个现实中物体的照片作为识别源,来识别出这个物体的在屏幕中的二维区域,我们已经做好了到三维空间的转换,但开发者需要自己保证tracker
下模型的比例是符合识别源的。OSD模式在识别那些二维的、特征清晰的物体效果最好,比如广告牌。
这里是默认示例资源,你可以换成自己的照片和视频,如果只是想要尝试,直接复制访问
src
的地址到浏览器打开即可。
html
<xr-scene ar-system="modes:OSD" bind:ready="handleReady">
<xr-assets bind:loaded="handleAssetsLoaded">
<xr-asset-material asset-id="mat" effect="simple" uniforms="u_baseColorFactor: 0.8 0.6 0.4 0.7" states="alphaMode:BLEND" />
</xr-assets>
<xr-node>
<xr-ar-tracker
mode="OSD" src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/marker/osdmarker-test.jpg"
>
<xr-mesh geometry="plane" material="mat" rotation="-90 0 0" />
</xr-ar-tracker>
</xr-node>
<xr-camera clear-color="0.4 0.8 0.6 1" background="ar" is-ar-camera />
</xr-scene>
这里我们把ar-system
的模式改为了OSD
,相应的ar-tracker
的模式也改为了OSD
,这种模式下需要提供src
,也就是要识别的图像。并且这次我们使用了一个效果为simple
的材质,因为不需要灯光,同时为了更好看效果,在material
的states
设置了alphaMode:BLEND
,即开启透明混合,然后将uniforms
设置颜色u_baseColorFactor
,并且注意其透明度为0.7
。最终效果如下:

2DMarker+视频,让照片动起来
最后的能力就是2D Marker,其用于精准识别有一定纹理的矩形平面,我们可以将其配合视频纹理,只需要非常简单的代码就可以完成一个效果,首先是wxml
:
这里是默认示例资源,你可以换成自己的照片和视频,如果只是想要尝试,直接复制访问
src
的地址到浏览器打开即可。
html
<xr-scene ar-system="modes:Marker" bind:ready="handleReady">
<xr-assets bind:loaded="handleAssetsLoaded">
<xr-asset-load
type="video-texture" asset-id="hikari" options="loop:true"
src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari-v.mp4"
/>
<xr-asset-material asset-id="mat" effect="simple" uniforms="u_baseColorMap: video-hikari" />
</xr-assets>
<xr-node wx:if="{{loaded}}">
<xr-ar-tracker
mode="Marker" bind:ar-tracker-switch="handleTrackerSwitch"
src="https://mmbizwxaminiprogram-1258344707.cos.ap-guangzhou.myqcloud.com/xr-frame/demo/xr-frame-team/2dmarker/hikari.jpg"
>
<xr-mesh node-id="mesh-plane" geometry="plane" material="mat" />
</xr-ar-tracker>
</xr-node>
<xr-camera clear-color="0.4 0.8 0.6 1" background="ar" is-ar-camera />
</xr-scene>
这里我们把ar-system
的模式改成了Marker
,随后将ar-tracker
的类型也改为了Marker
,并且换了一个识别源,然后加载一个准备好的视频纹理,并将simple
材质的颜色换为了纹理u_baseColorMap
,同时关闭了混合。注意我们使用了变量loaded
来控制ar-tracker
的显示并绑定了事件ar-tracker-switch
,这是为了在脚本中处理:
html
handleAssetsLoaded: function ({detail}) {
this.setData({loaded: true});
},
handleTrackerSwitch: function ({detail}) {
const active = detail.value;
const video = this.scene.assets.getAsset('video-texture', 'hikari');
active ? video.play() : video.stop();
}
在视频加载完成后再显示内容,并且在ar-tracker-switch
事件也就是识别成功后在播放视频,优化体验,最终效果如下:

如果你有好的想法或需求,可以私信我,我这里有很多程序员朋友可以帮你实现你的想法。