Search code examples
c#unity-game-engineqr-codevuforiaimage-scanner

Integrate Unity3D with XZing


I have been working on a project which provides Augmented Reality with Unity3D and Vuforia. Now I want to integrate XZing to get data from a QR-Code and display these information in one of my Unity assets/objects.

After including the XZing assets and laying the VuforiaScanner.cs Script onto the ARCamera the image can not be loaded from the camera device object.

Do you know how to fix this problem or know some tutorials which implement XZing into Vuforia/Unity3D ?

Here is the Code Snippet of VuforiaScanner.cs

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
            {
                /** 
                 * AT THIS POINT CAMERAFEED IS NULL 
                 **/
                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);
            }
        }
    }    
}

Thanks in advance.


Solution

  • Did you google

    "Unity3D ZXing"

    ? There are a huge amount of discussions, example:

    http://forum.unity3d.com/threads/zxing-library-with-unity.335017/

    Note that as it says there,

    iOS's WebCamTexture doesn't return its proper width and height...

    This is a considerable issue with Unity3D, and has been for years,

    http://answers.unity3d.com/answers/687987/view.html

     private IEnumerator _workAroundRisibleUnityBug()
         {
         while ( frontCam.width < 100 )
             {
             Debug.Log("the width/height values are not yet ready.");
             Debug.Log( frontCam.width +" " +frontCam.height);
             yield return null;
             }
    
         Debug.Log("the width/height values are now meaningful.");
         Debug.Log( frontCam.width +" " +frontCam.height);