
Build a Barcode Scanner Using Webcam in C#
C#でWebカメラを使用したバーコードスキャナーは、接続されたカメラを強力なバーコードリーダーに変えることで、物理的なバーコードスキャナーの必要性をなくします。 この記事では、わずか数行のコードで、ライブビデオフレームをキャプチャし、バーコードとQRコードをリアルタイムでデコードする、コンソールベースのウェブカメラバーコードスキャナの構築方法を解説します。
在庫管理システムのプロトタイプを作成している場合でも、チェックインキオスクを構築している場合でも、あるいはバーコードスキャンが内部でどのように動作するのかに興味がある場合でも、このガイドではすぐに実行できる動作するソースコードを提供します。
ウェブカメラは専用のバーコードスキャナーの代わりになるか?
絶対に。 Windows、macOS、またはLinuxマシンに接続された標準的なウェブカメラやUSBビデオキャプチャデバイスは、適切なソフトウェアと組み合わせることで、バーコードスキャナーとして機能します。 このプロセスは、カメラからビデオフレームをキャプチャし、各フレームをビットマップ画像に変換し、その画像をバーコードリーダーライブラリに渡してデコードするという仕組みで機能します。
Dynamsoft Barcode Reader SDKやDirectShow .NETなどのツールを使用した従来のバーコードスキャン設定では、カメラからフレームを取得するためだけに、フィルタグラフを手動で構成し、キャプチャグラフを設定し、フレームコールバックパイプラインを接続する必要があることがよくあります。 IronBarcodeはこれを劇的に簡素化し、複雑なビデオストリームインフラストラクチャを構築する必要はありません。 画像データを提供するだけで、BarcodeReader クラスが残りの処理を行い、単一の読み取りメソッドで標準バーコードから QR コードまであらゆるものをサポートします。
カメラの設定方法と依存関係のインストール方法
ウェブカメラからビデオフレームを.NETコンソールアプリケーションに取り込むには、カメラアクセスライブラリが必要です。 OpenCvSharp4は、OpenCVをラップした軽量でクロスプラットフォームな.NETライブラリであり、これを簡単に実現します。 IronBarcodeと組み合わせることで、低レベルのビデオキャプチャデバイスの列挙やフレームレートの設定に苦労することなく、リアルタイムのバーコードスキャナを作成するために必要なすべてが揃います。
NuGet経由で両方のパッケージをインストールしてください。
これら3つのパッケージをインストールすると、プロジェクトはOpenCvSharpを介してカメラにアクセスし、 IronBarcodeを介してバーコードをデコードできるようになります。 追加のシステム依存関係や外部SDKの設定は不要です。インストールするだけで使用できます。
ビデオフレームをキャプチャしてリアルタイムでバーコードデータを読み取るには?
以下のコード例は、Visual Studio でコンソールベースのバーコードスキャナを作成します。このスキャナは、デフォルトの Web カメラを起動し、フレームを連続的にキャプチャして、各フレームからバーコードをスキャンします。 バーコードが検出されると、データがコンソールに書き込まれ、フレームがスナップショットとして保存されます。
using OpenCvSharp;
using OpenCvSharp.Extensions;
using IronBarCode;
using IronSoftware.Drawing;
// Open the default camera (device index 0)
using var capture = new VideoCapture(0);
if (!capture.IsOpened())
{
Console.WriteLine("No camera found. Check connected devices.");
return;
}
// Configure the barcode reader for real-time scanning
var options = new BarcodeReaderOptions
{
ExpectMultipleBarcodes = false,
ExpectBarcodeTypes = BarcodeEncoding.All,
Speed = ReadingSpeed.Faster
};
Console.WriteLine("Barcode scanner active. Press 'Q' to quit.");
using var frame = new Mat();
bool scanning = true;
while (scanning)
{
capture.Read(frame);
if (frame.Empty())
continue;
// Convert the captured frame to a bitmap for barcode processing
var bitmap = BitmapConverter.ToBitmap(frame);
var anyBitmap = new AnyBitmap(bitmap);
// Scan the frame for barcodes
var results = BarcodeReader.Read(anyBitmap, options);
foreach (var result in results)
{
Console.WriteLine($"Barcode detected: {result.Value}");
Console.WriteLine($" Format: {result.BarcodeType}");
// Save a snapshot of the frame where the barcode was found
bitmap.Save("barcode_snapshot.png");
Console.WriteLine(" Snapshot saved to barcode_snapshot.png");
}
// Check for quit key
if (Cv2.WaitKey(1) == 'q')
scanning = false;
}
Console.WriteLine("Scanner stopped.");Imports OpenCvSharp
Imports OpenCvSharp.Extensions
Imports IronBarCode
Imports IronSoftware.Drawing
' Open the default camera (device index 0)
Using capture As New VideoCapture(0)
If Not capture.IsOpened() Then
Console.WriteLine("No camera found. Check connected devices.")
Return
End If
' Configure the barcode reader for real-time scanning
Dim options As New BarcodeReaderOptions With {
.ExpectMultipleBarcodes = False,
.ExpectBarcodeTypes = BarcodeEncoding.All,
.Speed = ReadingSpeed.Faster
}
Console.WriteLine("Barcode scanner active. Press 'Q' to quit.")
Using frame As New Mat()
Dim scanning As Boolean = True
While scanning
capture.Read(frame)
If frame.Empty() Then
Continue While
End If
' Convert the captured frame to a bitmap for barcode processing
Dim bitmap = BitmapConverter.ToBitmap(frame)
Dim anyBitmap As New AnyBitmap(bitmap)
' Scan the frame for barcodes
Dim results = BarcodeReader.Read(anyBitmap, options)
For Each result In results
Console.WriteLine($"Barcode detected: {result.Value}")
Console.WriteLine($" Format: {result.BarcodeType}")
' Save a snapshot of the frame where the barcode was found
bitmap.Save("barcode_snapshot.png")
Console.WriteLine(" Snapshot saved to barcode_snapshot.png")
Next
' Check for quit key
If Cv2.WaitKey(1) = AscW("q"c) Then
scanning = False
End If
End While
End Using
End Using
Console.WriteLine("Scanner stopped.")Using Webcam for Barcode Scanning in C#

このコードは、トップレベルのステートメントを使用してコードを簡潔に保っています。 VideoCapture オブジェクトは、最初に接続されたカメラソースを開き、ループでフレームの取得を開始します。各フレームは OpenCvSharp Mat から Bitmap に変換され、その後、IronBarcode の BarcodeReader.Read メソッドが受け入れるクロスプラットフォーム画像フォーマットである AnyBitmap でラップされます。
BarcodeReaderOptionsオブジェクトは、スキャン動作を制御します。 速度を"ReadingSpeed.Faster"に設定すると、フレームごとに素早い応答が必要なリアルタイムビデオに最適化されます。 ExpectBarcodeTypes プロパティは BarcodeEncoding.All に設定されています。これは、スキャナーが Code 128 や EAN-13 から Data Matrix や QR コードまで、サポートされているすべてのフォーマットを検出することを意味します。 使用目的が特定のフォーマットのみである場合、フォーマットを絞り込むことでスキャン性能が向上します。 これらのオプションの設定方法の詳細については、 BarcodeReaderOptions のリファレンスを参照してください。
foreachループは、返されたコレクション内の各BarcodeResultを反復処理します。 Valueプロパティにはデコードされたバーコードデータが含まれ、BarcodeTypeプロパティはフォーマットを識別します。 このメソッドはBarcodeResultsコレクションを返すため、必要に応じて複数のバーコードを簡単に処理できます。
さまざまな使用状況に合わせてバーコードリーダーを微調整するにはどうすればよいでしょうか?
実際のバーコードスキャンでは、多くの場合、条件が完璧ではなかったり、照明が不十分だったり、角度がずれていたり、ラベルが破損していたりといった問題が発生する。 IronBarcodeのリーダーオプションを使えば、扱うデータに応じて速度と精度をバランスよく調整できます。
using IronBarCode;
// Optimized options for scanning QR codes from a camera feed
var qrOptions = new BarcodeReaderOptions
{
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.PDF417,
Speed = ReadingSpeed.Detailed,
AutoRotate = true
};
// Decode barcodes from a saved image captured by the webcam
var imageResults = BarcodeReader.Read("barcode_snapshot.png", qrOptions);
foreach (var barcode in imageResults)
{
Console.WriteLine($"Data: {barcode.Value}");
Console.WriteLine($"Type: {barcode.BarcodeType}");
Console.WriteLine($"Page: {barcode.PageNumber}");
}Imports IronBarCode
' Optimized options for scanning QR codes from a camera feed
Dim qrOptions As New BarcodeReaderOptions With {
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.PDF417,
.Speed = ReadingSpeed.Detailed,
.AutoRotate = True
}
' Decode barcodes from a saved image captured by the webcam
Dim imageResults = BarcodeReader.Read("barcode_snapshot.png", qrOptions)
For Each barcode In imageResults
Console.WriteLine($"Data: {barcode.Value}")
Console.WriteLine($"Type: {barcode.BarcodeType}")
Console.WriteLine($"Page: {barcode.PageNumber}")
Next異なるバーコードを読み取った場合の出力例:QRコードの例

速度を ReadingSpeed.Detailed に切り替えると、デコーダーはより徹底的な画像解析を実行するようになり、ノイズの多い入力データや歪んだ入力データの処理に最適です。 自動回転機能を有効にすると、 IronBarcodeは画像内の回転したバーコードを自動的に補正します。これは、ユーザーがカメラの前で商品を不自然な角度で持った場合によく発生する現象です。 これは、 IronBarcodeがQRコードライブラリおよびバーコードリーダーとして真に際立っている点の1つです。内蔵の画像前処理機能により、外部の画像補正フィルターを接続する必要なく、これらの課題を解決できます。
同じ BarcodeReader API を使用して、保存された画像ファイル、PDF、およびマルチフレーム TIFF からバーコードをスキャンすることもできるため、Web カメラの使用例にとどまらず、幅広い用途に利用できます。 ウェブベースのスキャナを構築する場合は、 IronBarcode Blazor統合ガイドで、 JavaScript相互運用機能を使用してブラウザ経由でウェブカメラをスキャンする方法について解説しています。
このアプローチが他の方法よりもシンプルな理由は?
C# で記述された多くのウェブカメラバーコードスキャナーのチュートリアルは、複数のライブラリの組み合わせに依存しており、一般的にはデコードにZXing .NETを使用し、カメラへのアクセスにはAForge .NETまたはDirectShow .NETを組み合わせています。 このアプローチでは、ビデオキャプチャ用のフィルタグラフを設定し、ビデオストリームからフレームを抽出するためにフレームコールバックを手動で構成し、低レベルのWindows APIを介してデバイス列挙を処理する必要があります。Dynamsoft Barcode Reader SDKも同様のパターンに従っており、WebカメラにアクセスするためにDirectShow .NETの仕組みが必要です。
IronBarcodeは、そうした複雑さを解消します。 バーコードスキャンロジックはすべて BarcodeReader.Read に実装されており、このメソッドは Bitmap、バイト配列、ファイルパス、または Stream を受け取ります。 キャプチャグラフの構築も、オブジェクト送信機やEventArgsイベント配線によるフレームキャプチャも不要です。画像データを渡すだけで、バーコード情報が返されます。 これはつまり、書くコード量が減り、維持管理する依存関係も減り、アプリケーションにとって本当に重要な機能に費やす時間が増えるということです。
IronBarcodeは、.NET Core、 .NET Framework、または.NET 8以降で開発を行うチーム向けに、Windows、macOS、Linux、Docker、Azure、およびAWS上で一貫したクロスプラットフォームサポートを提供します。 全機能をご覧いただくか、追加のコード例を参照して、他にどのようなことが可能かをご確認ください。
自分だけのバーコードスキャナーを作ってみませんか?
適切なツールがあれば、C# を使ってウェブカメラをバーコードスキャナーに変えるのに必要なコードは最小限で済みます。 IronBarcodeは、標準バーコードからQRコードまで、デコード処理の面倒な作業をすべて担い、OpenCvSharpはカメラへのアクセスをスムーズに管理します。 これら2つの要素が組み合わさることで、組み立てやすく、拡張しやすく、すぐに量産可能なスキャナーが実現する。
無料トライアルを開始してご自身のプロジェクトでお試しください。導入準備が整ったら、ライセンスオプションをご検討ください。

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。
関連する記事


