Je dois intégrer Zxing à Vuforia pour créer une application d'analyse de code QR dans Unity? Je ne sais pas comment intégrer Zxing à Vuforia dans l'unité. Est-ce que quelqu'un peut me guider, comment faire cela? et le paquet Vuforia.Merci d’avance.
Je cherchais à intégrer Zxing à Vuforia dans Unity aujourd'hui.
La première chose à faire est de télécharger le fichier DLL à partir de: https://zxingnet.codeplex.com/ et de copier le fichier DLL dans le dossier Plugins (qui devrait se trouver dans le dossier Assets).
Ensuite, j'ai réussi à trouver quelques exemples (certaines de ces thèses sont périmées):
http://ydaira.blogspot.fr/2012/09/how-to-decode-qr-codes-using-unity3d.html
https://github.com/Redth/ZXing.Net/blob/master/Clients/VuforiaDemo/Assets/VuforiaScanner.cs
Après avoir fusionné et simplifié ces exemples, j'ai obtenu quelque chose comme ceci (qui est placé dans le préfabriqué ARCamera):
using UnityEngine;
using System;
using System.Collections;
using Vuforia;
using System.Threading;
using ZXing;
using ZXing.QrCode;
using ZXing.Common;
[AddComponentMenu("System/VuforiaScanner")]
public class VuforiaScanner : MonoBehaviour
{
private bool cameraInitialized;
private BarcodeReader barCodeReader;
void Start()
{
barCodeReader = new BarcodeReader();
StartCoroutine(InitializeCamera());
}
private IEnumerator InitializeCamera()
{
// Waiting a little seem to avoid the Vuforia's crashes.
yield return new WaitForSeconds(1.25f);
var isFrameFormatSet = CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
Debug.Log(String.Format("FormatSet : {0}", isFrameFormatSet));
// Force autofocus.
var isAutoFocus = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
if (!isAutoFocus)
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL);
}
Debug.Log(String.Format("AutoFocus : {0}", isAutoFocus));
cameraInitialized = true;
}
private void Update()
{
if (cameraInitialized)
{
try
{
var cameraFeed = CameraDevice.Instance.GetCameraImage(Image.PIXEL_FORMAT.RGB888);
if (cameraFeed == null)
{
return;
}
var data = barCodeReader.Decode(cameraFeed.Pixels, cameraFeed.BufferWidth, cameraFeed.BufferHeight, RGBLuminanceSource.BitmapFormat.RGB24);
if (data != null)
{
// QRCode detected.
Debug.Log(data.Text);
}
else
{
Debug.Log("No QR code detected !");
}
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}
}
}
Je parviens à le faire fonctionner dans un AVD (Android Virtual Device), donc ça fonctionnera sur un vrai appareil.
Si vous utilisez Unity 5.x et Windows 64 bits, un message d'erreur peut s'afficher.
Impossible de charger Assets/Plugins/QCARWrapper.dll
La solution est simple, comme indiqué dans la question Unity3d - Échec de chargement de 'Assets/Plugins/QCARWrapper.dll'
Pour utiliser Vuforia avec Unity 64 bits, il suffit de déplacer les DLL QCAR de /Plugins
à /Plugins/x86.
. Voici les DLL:
Sélectionnez le QCARWrapper.bundle
dans la vue Projet Unity (sous Actifs> Plug-ins), afin que ses paramètres soient affichés dans l'inspecteur Unity. Modifiez les paramètres de QCARWrapper.bundle
dans l'inspecteur Unity à partir de N'importe quelle plate-forme en autonome + éditeur.
Alors cela fonctionne comme un charme.
Si vous rencontrez des retards lors de la numérisation, ce code devrait vous aider. J'ai utilisé la réponse de KDelli et un autre thread pour le code de décodage qr.
using UnityEngine;
using System;
using System.Collections;
using Vuforia;
using System.Threading;
using ZXing;
using ZXing.QrCode;
using ZXing.Common;
[AddComponentMenu("System/VuforiaCamera")]
public class VuforiaCamera : MonoBehaviour
{
private bool cameraInitialized;
private BarcodeReader barCodeReader;
private bool isDecoding = false;
void Start()
{
barCodeReader = new BarcodeReader();
StartCoroutine(InitializeCamera());
}
private IEnumerator InitializeCamera()
{
// Waiting a little seem to avoid the Vuforia's crashes.
yield return new WaitForSeconds(1.25f);
// var isFrameFormatSet = CameraDevice.Instance.SetFrameFormat(Image.PIXEL_FORMAT.RGB888, true);
// Debug.Log(String.Format("FormatSet : {0}", isFrameFormatSet));
// Force autofocus.
var isAutoFocus = CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
if (!isAutoFocus)
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL);
}
Debug.Log(String.Format("AutoFocus : {0}", isAutoFocus));
cameraInitialized = true;
}
private void Update()
{
if (cameraInitialized && !isDecoding)
{
try
{
var cameraFeed = CameraDevice.Instance.GetCameraImage(Image.PIXEL_FORMAT.RGB888);
if (cameraFeed == null)
{
return;
}
ThreadPool.QueueUserWorkItem(new WaitCallback(DecodeQr), cameraFeed);
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}
}
private void DecodeQr(object state){
isDecoding = true;
var cameraFeed = (Image)state;
var data = barCodeReader.Decode(cameraFeed.Pixels, cameraFeed.BufferWidth, cameraFeed.BufferHeight, RGBLuminanceSource.BitmapFormat.RGB24);
if (data != null)
{
// QRCode detected.
isDecoding = false;
}
else
{
isDecoding = false;
Debug.Log("No QR code detected !");
}
}
}