WP二维码识别

Windows phone SDK 从7.5版本(即mango)开始有提供访问手机摄像头的接口。这里我们使用开源的图像识别库Zxing lib的silverlight/WP7版本来做二维码图像的识别。基本原理为:每隔一定时间从摄像头的视频流截取一张图片,获取其亮度信息,由于二维码只有黑白两色,所以只从亮度信息就可以获取图片里的信息。下面介绍下具体方法:

具体过程可以参考:http://jonas.follesoe.no/2011/07/22/qr-code-scanning-on-windows-phone-75-using-zxlib/

  (1)扫描界面的XAML代码包括三个主要组件。Rectangle 组件用来作为视频流的取景器,通过VideoBrush可以自定义视频流为各种XAML元素。使用CompositeTransform来对摄像头的选择自适应地旋转VideoBrush。

(2)在Properties/WMAppManifest.xml文件中的节点下添加,使应用程序有访问摄像头的权限。
(3)在后台代码的构造函数里添加定时器DispatcherTimer,每250毫秒执行一次。在每次时钟滴答(tick)时刻去获取视频流缓存区的图片亮度信息并解析。
private readonly DispatcherTimer_timer;//定时器
private PhotoCameraLuminanceSource _luminance;//存储图片亮度信息
private QRCodeReader _reader;//二维码解析器对象
private PhotoCamera _photoCamera;//摄像头对象

public MainPage()
{
InitializeComponent();
/*初始化定时器对象,每250毫秒调用ScanPreviewBuffer*/
_timer = new DispatcherTimer();
_timer.Interval = TimeSpan.FromMilliseconds(250);
_timer.Tick += (o, arg) => ScanPreviewBuffer();
}

protected override void OnNavigatedTo(NavigationEventArgs e)
{
/*初始化摄像头对象*/
_photoCamera = new PhotoCamera();
_photoCamera.Initialized += OnPhotoCameraInitialized;

/*将XAML的VideoBrush的源设置为摄像头*/
_previewVideo.SetSource(_photoCamera);

base.OnNavigatedTo(e);
}
/*做初始化摄像头的工作*/
Private void OnPhotoCameraInitialized(object sender, CameraOperationCompletedEventArgs e)
{
int width = Convert.ToInt32(_photoCamera.PreviewResolution.Width);
int height = Convert.ToInt32(_photoCamera.PreviewResolution.Height);

_luminance = new PhotoCameraLuminanceSource(width, height);
_reader = new QRCodeReader();

Dispatcher.BeginInvoke(() => {
_previewTransform.Rotation = _photoCamera.Orientation;
_timer.Start();
});
}

/*负责从摄像头的图片缓存区获取图片亮度信息,构造为BinaryBitmap对象,使用QRCodeReader对其尝试进行解析,若解析成功则调用DisplayResult方法做后续处理*/
Private void ScanPreviewBuffer()
{
/*QRCodeReader 如果无法解析图片(即图片中没有二维码)会抛出异常,所以这里添加对异常的捕获*/
try
{
_photoCamera.GetPreviewBufferY(_luminance.PreviewBufferY);
var binarizer = new HybridBinarizer(_luminance);
var binBitmap = new BinaryBitmap(binarizer);
var result = _reader.decode(binBitmap);
Dispatcher.BeginInvoke(() => DisplayResult(result.Text));
}
catch
{
}
}

Private void DisplayResult(stringtext)
{
/*stringtext为解析二维码后的信息*/
Do something…
}

(4)用于获取图片亮度信息的类PhotoCameraLuminanceSource,由于PhotoCamera对象会提供图片的亮度信息,所以在这个列里面只需要一个属性和一个方法:Matrix属性存储图片的亮度信息,getRow方法获取指定行的亮度信息
publicclassPhotoCameraLuminanceSource:LuminanceSource
{
public byte[] PreviewBufferY { get; private set; }

public PhotoCameraLuminanceSource(int width, int height) : base(width, height)
{
PreviewBufferY = new byte[width * height];
}

public override sbyte[] Matrix
{
get { return (sbyte[])(Array)PreviewBufferY; }
}

public override sbyte[] getRow(int y, sbyte[] row)
{
if (row == null || row.Length < Width)
{
row = new sbyte[Width];
}

for (int i = 0; i < Height; i++)
row[i] = (sbyte)PreviewBufferY[i * Width + y];

return row;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值