Интеграция сканера QR-кода Unity Zxing
Мне нужно интегрировать Zxing с vuforia, чтобы сделать приложение сканирования QR-кода в Unity? Я понятия не имею, как интегрировать Zxing с Vuforia в unity.Кто-нибудь может подсказать мне, как это сделать?У меня есть Zxing .dll-файлы и пакет Vuforia unity.Спасибо заранее.
3 ответов
Я искал интеграцию Zxing с vuforia в Unity сегодня.
первое, что нужно сделать, это загрузить dll из:https://zxingnet.codeplex.com/ и скопируйте dll unity в папку плагинов (которая должна быть в папке Assets)
затем мне удалось найти несколько примеров (некоторые из тезисов устарели) :
http://ydaira.blogspot.fr/2012/09/how-to-decode-qr-codes-using-unity3d.html
https://github.com/Redth/ZXing.Net/blob/master/Clients/VuforiaDemo/Assets/VuforiaScanner.cs
после объединения примеров тезисов и их упрощения я получил что-то вроде этого (который размещен в сборке 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);
}
}
}
}
мне удается заставить его работать в AVD (Android Virtual Device), поэтому он будет работать на реальном устройстве.
если вы используете Unity 5.x и 64-битные окна вы можете получить сообщение об ошибке
не удалось загрузить активы / Плагины / QCARWrapper.dll файлы
решение просто, как указано в вопросе Unity3d-не удалось загрузить " активы / Плагины / QCARWrapper.библиотеки DLL'
чтобы использовать Vuforia с Unity 64 бит, просто переместите библиотеки Qcarwrapper из
/Plugins
до/Plugins/x86.
Это библиотеки DLL:выберите
QCARWrapper.bundle
in представление проекта Unity (находится в разделе Активы > плагины), чтобы его настройки отображались в Инспекторе Unity, измените настройкиQCARWrapper.bundle
в инспекторе Unity с любой платформы на автономный + редактор.
чем это работает как шарм.
Если у вас есть лаги во время сканирования, этот код должен помочь вам. Я использовал ответ KDelli и использовал другой поток для кода декодирования 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 !");
}
}
}