私たちは、Unity 5.3.4f1のZXing.dllとVuforia Unity SDK 5.5.9を使用して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カメラが再ロードされた後、常にヌルデータを受け取ります。 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);
}
}
}
}