2016-06-22 2 views
3

우리는 Vuforia Unity SDK 5.5.9가 적용된 Unity 5.3.4f1의 ZXing.dll을 사용하여 QR 감지 기능을 구현했습니다. 우리는 GameObject에 QR 탐지 스크립트를 가지고 있습니다.이 스크립트는 앱 전체에서 계속 사용되며 아래 언급 된 (QRScanner.cs) 코드 (Unity Zxing QR code scanner integration에서 언급 됨)를 사용합니다.Unity에서 Vuforia를 사용하여 ZXing을 사용한 QR 감지

우리는 또한 QR 검출이 예상되는 동일한 장면에서 이미지 검출 (50 이미지 타겟)을 위해 Vuforia를 사용하고 있습니다. Vuforia 플러그인은 우리의 요구 사항에 따라 여러 번 활성화/비활성화됩니다. 앱에 집중할 때까지 Android 및 iOS 기기에서 이미지와 QR 감지가 완벽하게 작동합니다. VuforiaBehaviour가 비활성화되고 활성화 될 때마다 QR 감지가 작동을 멈 춥니 다. QRScanner 스크립트는 앱 재개 후 또는 AR 카메라가 다시로드 된 후에 항상 null 데이터를받습니다. 우리는 AR 카메라 조립식에 QR 탐지 스크립트를 보관하려고 시도했으며 시도했습니다.

qcarBehaviour.RegisterTrackablesUpdatedCallback (OnTrackablesUpdated); qcarBehaviour.RegisterQCARStartedCallback (OnTrackablesUpdated);

AR 카메라가 시작될 때마다 콜백되지만 성공하지 못합니다. 어떤 이유로 든 Vuforia 플러그인을 일시 중지 한 후 QR 검색이 완전히 중지됩니다.

아무도이 문제를 해결하는 방법을 알고 있습니까?

QRScanner.cs 

    using UnityEngine; 
    using System; 
    using System.Collections; 
    using Vuforia; 
    using System.Threading; 
    using ZXing; 
    using ZXing.QrCode; 
    using ZXing.Common; 

    /*  ///////////////// QR detection does not work in editor //////////////// */ 

    [AddComponentMenu("System/QRScanner")] 
    public class QRScanner : MonoBehaviour 
    { 
    private bool cameraInitialized; 
    private BarcodeReader barCodeReader; 
    public AppManager camScript; 

    void Start() 
    { 
     barCodeReader = new BarcodeReader(); 
     StartCoroutine(InitializeCamera()); 
    } 

    private IEnumerator InitializeCamera() 
    { 
     // Waiting a little seem to avoid the Vuforia's crashes. 
     yield return new WaitForSeconds(3f); 

     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); 
        Application.OpenURL (data.Text); // our function to call and pass url as text 
        data = null;  // clear data 
       } 
       else 
       { 
        Debug.Log("No QR code detected !"); 
       } 
      } 
      catch (Exception e) 
      { 
       Debug.LogError(e.Message); 
      } 
     } 
    } 
    } 

답변

0

내가 이 문제를 가지고 있지만 난 수정이

using UnityEngine; 
using System.Collections; 
using Vuforia; 

public class CameraSettings : MonoBehaviour 
{ 
    #region PRIVATE_MEMBERS 
    private bool mVuforiaStarted = false; 
    private bool mAutofocusEnabled = true; 
    private bool mFlashTorchEnabled = false; 
    private CameraDevice.CameraDirection mActiveDirection = CameraDevice.CameraDirection.CAMERA_DEFAULT; 
    #endregion //PRIVATE_MEMBERS 


    #region MONOBEHAVIOUR_METHODS 
    void Start() { 
     Debug.Log("CameraSettings Start"); 
     VuforiaAbstractBehaviour vuforia = FindObjectOfType<VuforiaAbstractBehaviour>(); 
     VuforiaARController.Instance.RegisterVuforiaStartedCallback(OnVuforiaStarted); 
     VuforiaARController.Instance.RegisterOnPauseCallback(OnPaused); 
     VuforiaARController.Instance.RegisterTrackablesUpdatedCallback (OnTrack); 
     //VuforiaARController.Instance.RegisterVideoBgEventHandler(BgEventHandler); 
    } 
    #endregion // MONOBEHAVIOUR_METHODS 


    #region PUBLIC_METHODS 
    public bool IsFlashTorchEnabled() 
    { 
     return mFlashTorchEnabled; 
    } 

    public void SwitchFlashTorch(bool ON) 
    { 
     if (CameraDevice.Instance.SetFlashTorchMode(ON)) 
     { 
      Debug.Log("Successfully turned flash " + ON); 
      mFlashTorchEnabled = ON; 
     } 
     else 
     { 
      Debug.Log("Failed to set the flash torch " + ON); 
      mFlashTorchEnabled = false; 
     } 
    } 

    public bool IsAutofocusEnabled() 
    { 
     return mAutofocusEnabled; 
    } 

    public void SwitchAutofocus(bool ON) 
    { 
     if (ON) 
     { 
      if (CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO)) 
      { 
       Debug.Log("Successfully enabled continuous autofocus."); 
       mAutofocusEnabled = true; 
      } 
      else 
      { 
       // Fallback to normal focus mode 
       Debug.Log("Failed to enable continuous autofocus, switching to normal focus mode"); 
       mAutofocusEnabled = false; 
       CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL); 
      } 
     } 
     else 
     { 
      Debug.Log("Disabling continuous autofocus (enabling normal focus mode)."); 
      mAutofocusEnabled = false; 
      CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL); 
     } 
    } 

    public void TriggerAutofocusEvent() 
    { 
     // Trigger an autofocus event 
     CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_TRIGGERAUTO); 

     // Then restore original focus mode 
     StartCoroutine(RestoreOriginalFocusMode()); 
    } 

    public void SelectCamera(CameraDevice.CameraDirection camDir) 
    { 
     if (RestartCamera (camDir)) 
     { 
      mActiveDirection = camDir; 

      // Upon camera restart, flash is turned off 
      mFlashTorchEnabled = false; 
     } 
    } 

    public bool IsFrontCameraActive() 
    { 
     return (mActiveDirection == CameraDevice.CameraDirection.CAMERA_FRONT); 
    } 
    #endregion // PUBLIC_METHODS 


    #region PRIVATE_METHODS 
    private void OnTrack() { 
     //Debug.Log("CameraSettings OnTrack"); 
    } 
    private void BgEventHandler() { 
     //Debug.Log("CameraSettings BgEventHandler"); 
    } 
    private void OnVuforiaStarted() { 
     //Debug.Log("CameraSettings OnVuforiaStarted"); 
     mVuforiaStarted = true; 
     // Try enabling continuous autofocus 
     SwitchAutofocus(true); 
     //RestartCamera (CameraDevice.CameraDirection.CAMERA_DEFAULT); 
    } 

    private void OnPaused(bool paused) { 
     bool appResumed = !paused; 
     //Debug.Log("CameraSettings OnPaused"); 
     if (appResumed && mVuforiaStarted) 
     { 
      // Restore original focus mode when app is resumed 
      if (mAutofocusEnabled) 
       CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO); 
      else 
       CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL); 

      // Set the torch flag to false on resume (cause the flash torch is switched off by the OS automatically) 
      mFlashTorchEnabled = false; 
     } 
    } 

    private IEnumerator RestoreOriginalFocusMode() 
    { 
     // Wait 1.5 seconds 
     yield return new WaitForSeconds(1.5f); 

     // Restore original focus mode 
     if (mAutofocusEnabled) 
      CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO); 
     else 
      CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_NORMAL); 
    } 

    private bool RestartCamera(CameraDevice.CameraDirection direction) 
    { 
     ObjectTracker tracker = TrackerManager.Instance.GetTracker<ObjectTracker>(); 
     if (tracker != null) 
      tracker.Stop(); 

     CameraDevice.Instance.Stop(); 
     CameraDevice.Instance.Deinit(); 

     if (!CameraDevice.Instance.Init(direction)) 
     { 
      Debug.Log("Failed to init camera for direction: " + direction.ToString()); 
      return false; 
     } 
     if (!CameraDevice.Instance.Start()) 
     { 
      Debug.Log("Failed to start camera for direction: " + direction.ToString()); 
      return false; 
     } 

     if (tracker != null) 
     { 
      if (!tracker.Start()) 
      { 
       Debug.Log("Failed to restart the Tracker."); 
       return false; 
      } 
     } 

     return true; 
    } 
    #endregion // PRIVATE_METHODS 
} 
아캄

에 자리 코드