原文:简单的Windows Webcam应用:Barcode Reader

在Windows上用WinForm创建一个Webcam应用需要用到DirectShow。DirectShow没有提供C#的接口。如果要用C#开发,需要创建一个桥接DLL。Touchless SDK是一个免费开源的.NET库,对DirectShow进行了简单的封装。使用Touchless可以很方便的在WinForm应用中调用camera。这里分享下如何创建一个调用webcam的barcode
reader。

参考原文:WinForm Barcode Reader with Webcam and C#

作者:Xiao Ling

翻译:yushulx

WinForm Barcode Reader

下载Touchless SDK

Dynamsoft Barcode Reader SDK用于barcode识别. 如要想用免费开源的,可以选择ZXing.NET

打开Visual Studio 2015创建一个WinForm工程.

通过Nuget可以在工程中直接下载安装Dynamsoft Barcode Reader:

在引用中添加TouchlessLib.dll:

把WebCamLib.dll添加到工程中。属性中设置拷贝。这样工程编译之后就会把DLL拷贝到输出目录中,不需要再手动拷贝。

初始化Touchless和Dynamsoft Barcode Reader:

// Initialize Dynamsoft Barcode Reader
_barcodeReader = new BarcodeReader();
// Initialize Touchless
_touch = new TouchlessMgr();

通过系统对话框把图片加载到PictureBox中:

using (OpenFileDialog dlg = new OpenFileDialog())
{
dlg.Title = "Open Image"; if (dlg.ShowDialog() == DialogResult.OK)
{
Bitmap bitmap = null; try
{
bitmap = new Bitmap(dlg.FileName);
}
catch (Exception exception)
{
MessageBox.Show("File not supported.");
return;
} pictureBox1.Image = new Bitmap(dlg.FileName);
}
}

设置回调函数启动webcam:

// Start to acquire images
_touch.CurrentCamera = _touch.Cameras[0];
_touch.CurrentCamera.CaptureWidth = _previewWidth; // Set width
_touch.CurrentCamera.CaptureWidth = _previewHight; // Set height
_touch.CurrentCamera.OnImageCaptured += new EventHandler<CameraEventArgs>(OnImageCaptured); // Set preview callback function

camera的数据返回不是在UI线程。要显示结果,需要调用UI线程:

private void OnImageCaptured(object sender, CameraEventArgs args)
{
// Get the bitmap
Bitmap bitmap = args.Image; // Read barcode and show results in UI thread
this.Invoke((MethodInvoker)delegate
{
pictureBox1.Image = bitmap;
ReadBarcode(bitmap);
});
}

识别barcode:

private void ReadBarcode(Bitmap bitmap)
{
// Read barcodes with Dynamsoft Barcode Reader
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
BarcodeResult[] results = _barcodeReader.DecodeBitmap(bitmap);
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds + "ms"); // Clear previous results
textBox1.Clear(); if (results == null)
{
textBox1.Text = "No barcode detected!";
return;
} // Display barcode results
foreach (BarcodeResult result in results)
{
textBox1.AppendText(result.BarcodeText + "\n");
textBox1.AppendText("\n");
}
}

运行程序:

使用算法接口的时候需要注意一下性能。可以使用Stopwatch来计算时间消耗:

Stopwatch sw = Stopwatch.StartNew();
sw.Start();
BarcodeResult[] results = _barcodeReader.DecodeBitmap(bitmap);
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds + "ms");

源码

https://github.com/yushulx/windows-webcam-barcode-reader

最新文章

  1. static与并发
  2. 转 strace
  3. spring代理模式 service远程调用,插件执行
  4. oracle:sql函数
  5. html和css知识总结
  6. GET和POST测试(支持需要登录的接口调用:高级功能-&gt;填写cookie)
  7. 高通/苹果/联发科:手机CPU那些事
  8. 使用Python拼接多张图片
  9. c语言编译预处理和条件编译执行过程的理解
  10. Library string type(2)——关于String的操作
  11. Mysql删除数据后磁盘空间未释放的解决办法【转】
  12. P1629 邮递员送信
  13. python常用的一些东西——sys、os等(转)
  14. 对于程序员在boss直聘求职的建议
  15. Redis数据结构之skiplist(续)
  16. stl stack用法
  17. bzoj1791[IOI2008]Island岛屿(基环树+DP)
  18. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
  19. 【转载】我为什么弃用OpenStack转向VMware vsphere
  20. SD从零开始29-30

热门文章

  1. spring 技巧集锦
  2. 一起学Python:协程
  3. spark rdd持久化的简单对比
  4. 原生H5页面模拟APP左侧滑动删除效果
  5. 【心情】2016ICPC青岛站打铁记
  6. hadoop 3.x 关闭安全模式
  7. 【23.24%】【codeforces 629C】Famil Door and Brackets
  8. Android菜鸟的成长笔记(20)——IntentService
  9. Diffie-Hellman Key Exchange – A Non-Mathematician’s Explanation
  10. WPF 自定义控件的坑(蠢的:自定义控件内容不显示)