You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iot/projects/IoTClient/Assets/Scripts/BarcodeCam.cs

143 lines
3.2 KiB

using System.Threading;
using UnityEngine;
using ZXing;
using ZXing.QrCode;
public class BarcodeCam : MonoBehaviour
{
// Texture for encoding test
public Texture2D encoded;
private WebCamTexture camTexture;
private Thread qrThread;
private Color32[] c;
private int W, H;
private Rect screenRect;
private bool isQuit;
public string LastResult;
private bool shouldEncodeNow;
void OnGUI()
{
GUI.DrawTexture(screenRect, camTexture, ScaleMode.ScaleToFit);
}
void OnEnable()
{
camTexture = new WebCamTexture(WebCamTexture.devices[0].name, 400, 300);
camTexture.Play();
if (camTexture != null)
{
camTexture.Play();
W = camTexture.width;
H = camTexture.height;
}
}
void OnDisable()
{
if (camTexture != null)
{
camTexture.Pause();
}
}
void OnDestroy()
{
qrThread.Abort();
camTexture.Stop();
}
// It's better to stop the thread by itself rather than abort it.
void OnApplicationQuit()
{
isQuit = true;
}
void Start()
{
encoded = new Texture2D(256, 256);
LastResult = "http://www.google.com";
shouldEncodeNow = true;
screenRect = new Rect(0, 0, Screen.width, Screen.height);
camTexture = new WebCamTexture();
camTexture.requestedHeight = Screen.height; // 480;
camTexture.requestedWidth = Screen.width; //640;
OnEnable();
qrThread = new Thread(DecodeQR);
qrThread.Start();
}
void Update()
{
if (c == null)
{
c = camTexture.GetPixels32();
}
// encode the last found
var textForEncoding = LastResult;
if (shouldEncodeNow &&
textForEncoding != null)
{
var color32 = Encode(textForEncoding, encoded.width, encoded.height);
encoded.SetPixels32(color32);
encoded.Apply();
shouldEncodeNow = false;
}
}
void DecodeQR()
{
// create a reader with a custom luminance source
var barcodeReader = new BarcodeReader { AutoRotate = false, TryHarder = false };
while (true)
{
if (isQuit)
break;
try
{
// decode the current frame
var result = barcodeReader.Decode(c, W, H);
if (result != null)
{
LastResult = result.Text;
shouldEncodeNow = true;
print(result.Text);
}
// Sleep a little bit and set the signal to get the next frame
Thread.Sleep(200);
c = null;
}
catch
{
}
}
}
private static Color32[] Encode(string textForEncoding, int width, int height)
{
var writer = new BarcodeWriter
{
Format = BarcodeFormat.QR_CODE,
Options = new QrCodeEncodingOptions
{
Height = height,
Width = width
}
};
return writer.Write(textForEncoding);
}
}