web-dev-qa-db-fra.com

Intégration du scanner de code QR Unity Zxing

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. 

7
Hussey123

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):

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.

8
KDelli

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'

  1. Pour utiliser Vuforia avec Unity 64 bits, il suffit de déplacer les DLL QCAR de /Plugins à /Plugins/x86.. Voici les DLL:

  2. 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.

1
Mashiska

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 !");
        }
}    
}
1
Ruslan Leshchenko