使用 C# 和網路攝影機建立條碼掃描器
使用 C# 中的網路攝影機編寫的條碼掃描器,透過將任何連接的攝影機變成功能強大的條碼讀取器,消除了對實體條碼掃描器的需求。 在本文中,我們將引導您建立一個基於控制台的網路攝影機頭條碼掃描器,它可以捕獲即時視訊幀並即時解碼條碼和二維碼,而這一切只需幾行程式碼即可完成。
無論您是在為庫存系統製作原型、建立自助登記終端,還是只是好奇條碼掃描的底層工作原理,本指南都將提供您可以立即運行的工作源代碼。
!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101 01000101111101010011010101000100000101010010010101000100010101000100010111110101011101001000110 1010101000100100001011111010100000101001001001111010001000101010101010000110101010100101010101011 10101010001010010010010010010000010100110001011111010000100100110001001111101000011010010111111010000110100101110--
網路攝影機可以取代專用條碼掃描器嗎?
絕對地。 任何連接到 Windows、macOS 或 Linux 電腦的標準網路攝影機或 USB 視訊擷取設備,只要搭配合適的軟體,都可以用作條碼掃描器。 該過程的工作原理是:從攝影機捕獲視訊幀,將每一幀轉換為點陣圖影像,然後將該影像傳遞給條碼讀取器庫進行解碼。
傳統的條碼掃描設置,例如使用 Dynamsoft 條碼閱讀器 SDK 或 DirectShow.NET 等工具,通常需要手動配置過濾器圖、設置捕獲圖,並將幀回調管道連接起來,才能從相機獲取幀。 IronBarcode 大大簡化了這個過程,無需建造複雜的視訊串流基礎架構。 你提供圖像數據,BarcodeReader 類別處理其餘部分,透過一個讀取方法即可支援從標準條碼到二維碼的一切內容。
如何設定攝影機並安裝依賴項?
將網路攝影機中的視訊幀導入 .NET 控制台應用程式需要一個攝影機存取庫。 OpenCvSharp4是一個輕量級的、跨平台的 .NET OpenCV 封裝庫,它使這一切變得簡單易行。 結合 IronBarcode,它為您提供了創建即時條碼掃描器所需的一切,而無需費力進行底層視訊擷取裝置枚舉或幀速率配置。
透過 NuGet 安裝這兩個軟體包:
dotnet add package OpenCvSharp4.Windows
dotnet add package OpenCvSharp4.Extensions
dotnet add package BarCode
dotnet add package OpenCvSharp4.Windows
dotnet add package OpenCvSharp4.Extensions
dotnet add package BarCode
```
dotnet add package OpenCvSharp4.Windows
dotnet add package OpenCvSharp4.Extensions
dotnet add package BarCode
```
安裝這三個軟體包後,您的專案將可以透過 OpenCvSharp 獲得攝影機存取權限,並透過 IronBarcode 獲得條碼解碼功能。 無需配置額外的系統相依性或外部 SDK,只需安裝即可使用。
如何即時擷取視訊幀並讀取條碼資料?
以下程式碼範例在 Visual Studio 中建立一個基於控制台的條碼掃描器,它會打開你的預設網路攝影機,連續捕捉幀,並掃描每個幀中的條碼。 偵測到條碼後,資料會寫入控制台,並將該訊框儲存為快照。
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.");
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#
用 C# 和網路攝影機建立條碼掃描器:圖 1 - 使用我們的 C# 網路攝影機頭條碼掃描器
這段程式碼使用頂層語句來保持程式碼的簡潔性。 VideoCapture 物件開啟第一個連接的攝影機來源,並開始循環讀取影格。每個畫面都從 OpenCvSharp Mat 轉換為 Bitmap,然後封裝在 AnyBitmap 中,AnyBitmap 是 IronBarcode 的 BarcodeReader.Read 方法接受的跨平台影像格式。
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}");
}
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
讀取不同條碼的輸出結果:以二維碼為例
用 C# 和網路攝影機建立條碼掃描器:圖 2 - 使用我們的條碼掃描器讀取二維碼
將速度切換為 ReadingSpeed.Detailed 會告訴解碼器應用更徹底的影像分析,這非常適合處理雜訊或傾斜的輸入資料。 啟用自動旋轉功能後,IronBarcode 可以自動校正影像中旋轉的條碼,這是使用者在相機前以奇怪的角度拿著物品時常見的情況。 IronBarcode 作為二維碼庫和條碼閱讀器,其優點之一就在於:其內建的影像預處理功能可應對這些挑戰,而無需連接外部影像校正濾鏡。
您還可以使用相同的 BarcodeReader API 掃描已儲存的影像檔案、PDF 和多幀 TIFF 中的條碼,使其用途遠不止於網路攝影機的使用場景。 如果您要建立的是基於 Web 的掃描器, IronBarcode Blazor 整合指南涵蓋了使用 JavaScript 互通透過瀏覽器進行網路攝影機掃描。
與其他方法相比,這種方法有哪些更簡單之處?
許多 C# 網路攝影機頭條碼掃描器教學依賴多庫組合,通常使用ZXing.NET進行解碼,並搭配AForge.NET或DirectShow.NET進行攝影機存取。 這種方法需要設定視訊擷取的過濾器圖,手動配置幀回調以從視訊串流中提取幀,並透過底層 Windows API 處理設備枚舉。 Dynamsoft 條碼讀取器 SDK 也遵循類似的模式,需要DirectShow.NET底層機制來存取網路攝影機。
IronBarcode 簡化了這種複雜性。 條碼掃描邏輯完全位於 BarcodeReader.Read 中,它接受 Bitmap、位元組數組、檔案路徑或 Stream。 無需建立捕獲圖,無需物件發送器和 EventArgs 事件連接進行幀捕獲,只需提供影像資料並獲取條碼資訊即可。 這意味著需要編寫的程式碼更少,需要維護的依賴項更少,可以將更多的時間花在應用程式中真正重要的功能上。
對於使用 .NET Core、.NET Framework 或 .NET 8+ 進行開發的團隊,IronBarcode 可在 Windows、macOS、Linux、Docker、Azure 和 AWS 上提供一致的跨平台支援。 探索全部功能或瀏覽更多程式碼範例,了解還有哪些可能性。
準備好打造自己的條碼掃描器了嗎?
使用合適的工具,用 C# 將網路攝影機變成條碼掃描器只需要編寫極少的程式碼。 IronBarcode 負責處理繁重的解碼工作,從標準條碼到二維碼,而 OpenCvSharp 則負責清楚管理攝影機存取。 他們共同打造了一款易於建造、易於擴展且可投入生產的掃描器。
常見問題解答
如何使用 C# 和網路攝影機建立一個條碼掃描器?
您可以使用 IronBarcode 庫,在 C# 中利用網路攝影機建立一個條碼掃描器。這包括從網路攝影機捕獲視訊幀,並用最少的代碼行即時解碼條碼和二維碼。
使用網路攝影機進行條碼掃描有哪些好處?
使用網路攝影機進行條碼掃描無需專用硬件,任何連接的攝影機都能變成功能強大的條碼讀取器。這種方式經濟高效,用途廣泛。
是否可以使用 C# 中的網路攝影機解碼二維碼?
是的,使用 IronBarcode,您可以在 C# 中使用網路攝影機解碼二維碼。該庫可以捕獲即時視訊幀並進行處理,從而無縫提取二維碼資料。
在 C# 中,哪些類型的應用程式可以從網路攝影機頭條碼掃描器中受益?
零售、庫存管理和物流等應用程式可以從 C# 編寫的網路攝影機頭條碼掃描器中受益。它為掃描條碼和二維碼提供了一種靈活且經濟高效的解決方案。
IronBarcode是否支援即時條碼解碼?
是的,IronBarcode支援即時條碼解碼。它處理來自網路攝影機的即時視訊幀,即時解碼條碼和二維碼。
是否有用於構建網路攝影機頭條碼掃描器的源代碼?
是的,我們提供了使用 C# 建立基於控制台的網路攝影機頭條碼掃描器的完整原始程式碼。這有助於開發人員有效率地理解和實現該解決方案。
使用 IronBarcode 和網路攝影機可以解碼哪些類型的條碼?
IronBarcode 可以使用網路攝影機在 C# 中解碼各種類型的條碼,包括 QR 碼、UPC 碼、EAN 碼和 Code 128 碼等。
我是否需要高階程式設計技能才能使用 IronBarcode 來建立條碼掃描器?
不,您無需具備進階程式設計技能即可使用 IronBarcode 建立條碼掃描器。整個過程只需幾行程式碼,因此各種技能水平的開發人員都可以輕鬆上手。

