Descripción del ejemplo de reconocimiento de imágenes en la nube para mini programas de WeChat
Este artículo le guiará por un análisis en profundidad del código sample para ayudarle a comprenderlo y desarrollar sus propios ejemplos sobre esta base.
Para la descarga y configuración del sample, consulte Inicio rápido.
Configuración del objetivo de reconocimiento
En la gestión de reconocimiento en la nube, suba una imagen de reconocimiento.
Nombre de la imagen de reconocimiento: asigne un nombre al objetivo de reconocimiento, por ejemplo "Panda".
Subir imagen de reconocimiento: seleccione y suba una imagen. La imagen usada en este sample es:

Ancho: ancho de la imagen de reconocimiento (cm). El sistema calculará automáticamente la altura según la imagen subida. El tamaño de la imagen de reconocimiento corresponde al tamaño del contenido virtual; este sample no lo usa.
Meta: información adicional, generalmente usada para almacenar información de contenido AR. El contenido usado en este sample es:
{"modelUrl": "https://sightp-assets.sightp.com/crs-mini/xiaoxiongmao.glb", "scale": 0.4}

Obtención del objetivo de reconocimiento
Después de llamar a la API de reconocimiento en la nube y reconocer el objetivo, se devuelve la información del objetivo con la siguiente estructura:
{
"statusCode" : 0,
"result" : {
"target" : {
"targetId" : "375a4c2e********915ebc93c400",
"meta" : "eyJtb2RlbFVybCI6ICJhc3NldC9tb2RlbC90cmV4X3YzLmZieCIsICJzY2FsZSI6IDAuMDJ9",
"name" : "demo",
"trackingImage": "/9j/4AAQSkZJRgABAQ************/9k=",
"modified" : 1746609056804
}
},
"date" : "2026-01-05T05:50:36.484Z",
"timestamp" : 1767592236484
}
Consejo
Para ver la información completa de los campos, consulte la Referencia de API
Decodifique meta con base64 para obtener la información original de meta.
// data son los datos devueltos
const meta = data.result.target.meta;
const modelInfo = JSON.parse(atob(meta));
Nota
En los mini programas de WeChat no existe el método atob, por lo que debe implementarlo usted mismo.
La implementación se encuentra en el archivo libs/atob.js del directorio del ejemplo.
Descripción del código principal
components/easyar-cloud/easyar-cloud.js
Métodos para usar
wx.createCameraContextpara abrir la cámara, capturar imágenes y acceder al reconocimiento en la nube.components/easyar-ar/easyar-ar.js
Métodos para usar xr-frame para abrir la cámara, capturar imágenes, acceder al reconocimiento en la nube, reproducir video y renderizar plantillas.
components/libs/crs-client.js
Métodos para generar Token y acceder al reconocimiento en la nube.
Advertencia
No use API Key ni API Secret directamente en aplicaciones cliente (como Web, mini programas de WeChat, etc.).
Esto es solo para demostración. En producción, genere Token en el servidor.
Comprensión profunda del código
Si desea aprender con más profundidad el desarrollo de reconocimiento en la nube, se recomienda encarecidamente leer el código fuente del sample. Sobre esta base, puede intentar modificar y ampliar el código fuente.
Consejo
La siguiente explicación asume que ya tiene cierto nivel de capacidad de desarrollo en HTML y JavaScript. Si aún no domina estas bases, se recomienda aprender sistemáticamente estos conocimientos para comprender mejor el contenido posterior.
El motor XR/3D usado en mini programas de WeChat es XR-FRAME. Si no lo conoce, se recomienda consultar primero la documentación.
Usaremos el renderizado de un modelo 3D como ejemplo para explicar el código fuente principal del sample.
UI y procesamiento de escena
Descripción del archivo components\easyar-ar\easyar-ar.wxml.
Configuración de la escena XR y Marker.
<xr-scene ar-system="modes:Marker" id="xr-scene" bind:ready="handleReady" bind:ar-ready="handleARReady" bind:tick="handleTick">
<xr-node>
<xr-ar-tracker wx:if="{{markerImg != ''}}" mode="Marker" src="{{markerImg}}" id="arTracker"></xr-ar-tracker>
<xr-camera id="camera" node-id="camera" position="0.8 2.2 -5" clear-color="0.925 0.925 0.925 1" background="ar" is-ar-camera></xr-camera>
</xr-node>
<xr-shadow id="shadow-root"></xr-shadow>
<xr-node node-id="lights">
<xr-light type="ambient" color="1 1 1" intensity="2" />
<xr-light type="directional" rotation="180 0 0" color="1 1 1" intensity="1" />
</xr-node>
</xr-scene>
Consejo
markerImg es la dirección de la imagen de reconocimiento, que se devuelve cuando el reconocimiento en la nube identifica un objetivo.
Procesamiento de negocio
Descripción del código principal del archivo components\easyar-ar\easyar-ar.js.
handleTick() {
// Capturar imagen y enviarla al servicio de reconocimiento en la nube
this.capture().then(base64 => this.crsClient.searchByBase64(base64.split('base64,').pop())).then(res => {
// Resultado devuelto por el reconocimiento en la nube
console.info(res)
// Si devuelve 0, indica que no se reconoció ningún objetivo
if (res.statusCode != 0) {
return;
}
const target = res.result.target;
// Configurar marker
this.loadTrackingImage(target.trackingImage.replace(/[\r\n]/g, ''));
// Detectar en la información meta si es un modelo o un video
try {
const setting = JSON.parse(atob(target.meta));
if (setting.modelUrl) {
this.loadModel(target.targetId, setting);
} else if (setting.videoUrl) {
this.loadVideo(target.targetId, setting);
}
} catch (e) {
console.error(e);
}
}).catch(err => {
console.info(err)
});
},
capture() {
// Obtener imagen de la cámara
const opt = { type: 'jpg', quality: this.properties.config.jpegQuality };
if (this.scene.share.captureToDataURLAsync) {
return this.scene.share.captureToDataURLAsync(opt);
}
return Promise.resolve(this.scene.share.captureToDataURL(opt));
},
Consejo
Consulte el archivo fuente del ejemplo para ver el código completo.
Procesamiento de reconocimiento en la nube
Descripción de los métodos principales del archivo components/libs/crs-client.js.
Enviar datos base64 de la imagen a la API del servicio de reconocimiento en la nube.
searchByBase64(img) {
const params = {
image: img,
notracking: 'false',
appId: this.config.crsAppId,
};
return this.queryToken().then(token => {
return new Promise((resolve, reject) => {
wx.request({
url: `${this.config.clientEndUrl}/search`,
method: 'POST',
data: params,
header: {
'Authorization': token,
'content-type': 'application/json'
},
success: res => resolve(res.data),
fail: err => reject(err),
});
});
});
}
Efecto esperado
- Página inicial del ejemplo

- Efecto de renderizado del modelo