When building a .NET application to read barcodes on Windows via camera, you need two types of SDKs – one for webcam, and the other for barcodes. In this post, I want to share how to use .Net webcam and barcode SDKs to create a simple WinForm barcode reader application in C#.
WinForm Barcode Reader
.NET Webcam SDK – Touchless
Touchless SDK is a free and open source SDK for .NET applications. It enables developers to create multi-touch based applications using a webcam for input. The SDK simplified the camera interface by wrapping DirectShow API.
.NET Barcode SDK – Dynamsoft Barcode Reader
Dynamsoft Barcode Reader SDK is a commercial barcode SDK developed by Dynamsoft. If you do not have a valid license, you can use the trial version for evaluation. As for free barcode SDK, ZXing.NET is a good option.
How to build a Windows barcode app
Launch Visual Studio 2015 to create a WinForm project.
Add Dynamsoft Barcode Reader to the project via Nuget:
Add TouchlessLib.dll to reference:
Add WebCamLib.dll to project. Set ‘Copy always’ to ‘Copy to Output Directory’ in order to automatically copy the dll to output directory when building the project.
Initialize Touchless and Dynamsoft Barcode Reader:
// Initialize Dynamsoft Barcode Reader _barcodeReader = new BarcodeReader(); // Initialize Touchless _touch = new TouchlessMgr();
Show a system dialog to load an image into 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); } }
Start webcam to acquire images and register a callback function for receiving frames:
// 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
The frame event is triggered in camera thread. You have to render results in UI thread:
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); }); }
Read bitmap and display results on TextBox:
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"); } }
Build and run the WinForm barcode application:
How to monitor .NET API performance
When using an algorithm API, you may care about the time cost more than accuracy. To calculate the elapsed time, use the code as follows:
Stopwatch sw = Stopwatch.StartNew(); sw.Start(); BarcodeResult[] results = _barcodeReader.DecodeBitmap(bitmap); sw.Stop(); Console.WriteLine(sw.Elapsed.TotalMilliseconds + "ms");
Source Code
https://github.com/yushulx/windows-webcam-barcode-reader
The post WinForm Barcode Reader with Webcam and C# appeared first on Code Pool.