UNITY QR Scanning App für HoloLens 2 Doen't Detect QR -CodeC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 UNITY QR Scanning App für HoloLens 2 Doen't Detect QR -Code

Post by Anonymous »

Ich arbeite an einem Projekt und ich muss eine App für Hololens 2 erstellen, die die QR-Codes direkt scannen kann. Ich bin mit dieser AR-Entwicklung nicht vertraut, also habe ich versucht, das Beispiel von Microsoft (https://learn.microsoft.com/en-us/windo ... s/qoncepts) zu verwenden. Auf den HoloLens 2, aber es scannt die Codes nicht. Wenn Sie dieses Beispiel verwenden, wird Ihre App angenommen, den QR -Code zu erkennen und eine Art Rechteck um sie zu erstellen, aber ich bekomme dieses Rechteck nicht und ja, ich habe versucht, es auf Papier zu tun, und sogar auf meinem Laptop -Bildschirm war es groß genug, um zu erfassen (der implementierte QR -Scanner in Hololens 2 entdeckt den QR -Code). Also habe ich die Microsoft.MixedReality.qr von Nuget installiert und das Projekt auch in meinem Visual Studio für Community MRTK -Ding hinzugefügt. Kann mir jemand sagen, was ich tun kann, damit das Ding funktioniert?

Code: Select all

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using Microsoft.MixedReality.QR;
using System;
using System.Collections.Generic;
using UnityEngine;

namespace Microsoft.MixedReality.SampleQRCodes
{
public static class QRCodeEventArgs
{
public static QRCodeEventArgs Create(TData data)
{
return new QRCodeEventArgs(data);
}
}

[Serializable]
public class QRCodeEventArgs : EventArgs
{
public TData Data { get; private set; }

public QRCodeEventArgs(TData data)
{
Data = data;
}
}

public class QRCodesManager : Singleton
{
[Tooltip("Determines if the QR codes scanner should be automatically started.")]
public bool AutoStartQRTracking = true;

public bool IsTrackerRunning { get; private set; }

public bool IsSupported { get; private set; }

public event EventHandler QRCodesTrackingStateChanged;
public event EventHandler QRCodeAdded;
public event EventHandler QRCodeUpdated;
public event EventHandler QRCodeRemoved;

private System.Collections.Generic.SortedDictionary qrCodesList = new SortedDictionary();

private QRCodeWatcher qrTracker;
private bool capabilityInitialized = false;
private QRCodeWatcherAccessStatus accessStatus;
private System.Threading.Tasks.Task capabilityTask;

public System.Guid GetIdForQRCode(string qrCodeData)
{
lock (qrCodesList)
{
foreach (var ite in qrCodesList)
{
if (ite.Value.Data == qrCodeData)
{
return ite.Key;
}
}
}
return new System.Guid();
}

public System.Collections.Generic.IList GetList()
{
lock (qrCodesList)
{
return new List(qrCodesList.Values);
}
}
protected void Awake()
{

}

// Use this for initialization
async protected virtual void Start()
{
IsSupported = QRCodeWatcher.IsSupported();
capabilityTask = QRCodeWatcher.RequestAccessAsync();
accessStatus = await capabilityTask;
capabilityInitialized = true;
}

private void SetupQRTracking()
{
try
{
qrTracker = new QRCodeWatcher();
IsTrackerRunning = false;
qrTracker.Added += QRCodeWatcher_Added;
qrTracker.Updated += QRCodeWatcher_Updated;
qrTracker.Removed += QRCodeWatcher_Removed;
qrTracker.EnumerationCompleted += QRCodeWatcher_EnumerationCompleted;
}
catch (Exception ex)
{
Debug.Log("QRCodesManager : exception starting the tracker " + ex.ToString());
}

if (AutoStartQRTracking)
{
StartQRTracking();
}
}

public void StartQRTracking()
{
if (qrTracker != null && !IsTrackerRunning)
{
Debug.Log("QRCodesManager starting QRCodeWatcher");
try
{
qrTracker.Start();
IsTrackerRunning = true;
Debug.Log("QRCodeManager started!");
QRCodesTrackingStateChanged?.Invoke(this, true);
}
catch (Exception ex)
{
Debug.Log("QRCodesManager starting QRCodeWatcher Exception:"  + ex.ToString());
}
}
}

public void StopQRTracking()
{
if (IsTrackerRunning)
{
IsTrackerRunning = false;
if (qrTracker != null)
{
qrTracker.Stop();
qrCodesList.Clear();
}

var handlers = QRCodesTrackingStateChanged;
if (handlers != null)
{
handlers(this, false);
}
}
}

private void QRCodeWatcher_Removed(object sender, QRCodeRemovedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Removed");

bool found = false;
lock (qrCodesList)
{
if (qrCodesList.ContainsKey(args.Code.Id))
{
qrCodesList.Remove(args.Code.Id);
found = true;
}
}
if (found)
{
var handlers = QRCodeRemoved;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}
}

private void QRCodeWatcher_Updated(object sender, QRCodeUpdatedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Updated");

bool found = false;
lock (qrCodesList)
{
if (qrCodesList.ContainsKey(args.Code.Id))
{
found = true;
qrCodesList[args.Code.Id] = args.Code;
}
}
if (found)
{
var handlers = QRCodeUpdated;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}
}

private void QRCodeWatcher_Added(object sender, QRCodeAddedEventArgs args)
{
Debug.Log("QRCodesManager QRCodeWatcher_Added");

lock (qrCodesList)
{
qrCodesList[args.Code.Id] = args.Code;
}
var handlers = QRCodeAdded;
if (handlers != null)
{
handlers(this, QRCodeEventArgs.Create(args.Code));
}
}

private void QRCodeWatcher_EnumerationCompleted(object sender, object e)
{
Debug.Log("QRCodesManager QrTracker_EnumerationCompleted");
}

private void Update()
{
if (qrTracker == null && capabilityInitialized && IsSupported)
{
if (accessStatus == QRCodeWatcherAccessStatus.Allowed)
{
SetupQRTracking();
}
else
{
Debug.Log("Capability access status : " + accessStatus);
}
}
}
}
}
< /code>
Und dieser Code für QrCodeVisualizer: < /p>
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

using System.Collections.Generic;
using UnityEngine;

namespace Microsoft.MixedReality.SampleQRCodes
{
public class QRCodesVisualizer : MonoBehaviour
{
public GameObject qrCodePrefab;

private SortedDictionary qrCodesObjectsList;
private bool clearExisting = false;

struct ActionData
{
public enum Type
{
Added,
Updated,
Removed
};
public Type type;
public Microsoft.MixedReality.QR.QRCode qrCode;

public ActionData(Type type, Microsoft.MixedReality.QR.QRCode qRCode) : this()
{
this.type = type;
qrCode = qRCode;
}
}

private Queue  pendingActions = new Queue();

// Use this for initialization
void Start()
{
Debug.Log("QRCodesVisualizer start");
qrCodesObjectsList = new SortedDictionary();

QRCodesManager.Instance.QRCodesTrackingStateChanged += Instance_QRCodesTrackingStateChanged;
QRCodesManager.Instance.QRCodeAdded += Instance_QRCodeAdded;
QRCodesManager.Instance.QRCodeUpdated += Instance_QRCodeUpdated;
QRCodesManager.Instance.QRCodeRemoved += Instance_QRCodeRemoved;
if (qrCodePrefab == null)
{
throw new System.Exception("Prefab not assigned");
}
}
private void Instance_QRCodesTrackingStateChanged(object sender, bool status)
{
if (!status)
{
clearExisting = true;
}
}

private void Instance_QRCodeAdded(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeAdded");

lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Added, e.Data));
}
}

private void Instance_QRCodeUpdated(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeUpdated");

lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Updated, e.Data));
}
}

private void Instance_QRCodeRemoved(object sender, QRCodeEventArgs e)
{
Debug.Log("QRCodesVisualizer Instance_QRCodeRemoved");

lock (pendingActions)
{
pendingActions.Enqueue(new ActionData(ActionData.Type.Removed, e.Data));
}
}

private void HandleEvents()
{
lock (pendingActions)
{
while (pendingActions.Count > 0)
{
var action = pendingActions.Dequeue();
if (action.type == ActionData.Type.Added)
{
GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity);
qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId;
qrCodeObject.GetComponent().qrCode = action.qrCode;
qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject);
}
else if (action.type == ActionData.Type.Updated)
{
if (!qrCodesObjectsList.ContainsKey(action.qrCode.Id))
{
GameObject qrCodeObject = Instantiate(qrCodePrefab, new Vector3(0, 0, 0), Quaternion.identity);
qrCodeObject.GetComponent().Id = action.qrCode.SpatialGraphNodeId;
qrCodeObject.GetComponent().qrCode = action.qrCode;
qrCodesObjectsList.Add(action.qrCode.Id, qrCodeObject);
}
}
else if (action.type == ActionData.Type.Removed)
{
if (qrCodesObjectsList.ContainsKey(action.qrCode.Id))
{
Destroy(qrCodesObjectsList[action.qrCode.Id]);
qrCodesObjectsList.Remove(action.qrCode.Id);
}
}
}
}
if (clearExisting)
{
clearExisting = false;
foreach (var obj in qrCodesObjectsList)
{
Destroy(obj.Value);
}
qrCodesObjectsList.Clear();

}
}

// Update is called once per frame
void Update()
{
HandleEvents();
}
}
}
Diese beiden Skripte sind an ein leeres Ding in Unity Engine angehängt. Außerdem gibt es einen QR-Code-Prefab an das QrCodeVisualizer-Skript.>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post