跳至页脚内容
USING IRONBARCODE

使用 C# 和网络摄像头构建条形码扫描器

使用 C# 中的网络摄像头编写的条形码扫描器,通过将任何连接的摄像头变成功能强大的条形码读取器,消除了对物理条形码扫描器的需求。 在本文中,我们将引导您构建一个基于控制台的网络摄像头条形码扫描器,它可以捕获实时视频帧并实时解码条形码和二维码,而这一切只需几行代码即可完成。

无论您是在为库存系统制作原型、构建自助登记终端,还是只是好奇条形码扫描的底层工作原理,本指南都将提供您可以立即运行的工作源代码。

立即开始使用 IronBarcode。
green arrow pointer

网络摄像头可以取代专用条形码扫描器吗?

绝对地。 任何连接到 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
```
$vbLabelText   $csharpLabel

安装这三个软件包后,您的项目将通过 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.")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

读取不同条形码的输出结果:以二维码为例

用 C# 和网络摄像头构建条形码扫描器:图 2 - 使用我们的条形码扫描器读取二维码

将速度切换为 ReadingSpeed.Detailed 会告诉解码器应用更彻底的图像分析,这非常适合处理噪声或倾斜的输入数据。 启用自动旋转功能后, IronBarcode可以自动校正图像中旋转的条形码,这是用户在相机前以奇怪的角度拿着物品时常见的情况。 IronBarcode作为二维码库和条形码阅读器,其优势之一就在于:其内置的图像预处理功能可以应对这些挑战,而无需连接外部图像校正滤镜。

您还可以使用相同的 BarcodeReader API 扫描已保存的图像文件、PDF 和多帧 TIFF 中的条形码,使其用途远不止于网络摄像头的使用场景。 如果您要构建的是基于 Web 的扫描器, IronBarcode Blazor集成指南涵盖了使用JavaScript互操作通过浏览器进行网络摄像头扫描。

与其他方法相比,这种方法有哪些更简便之处?

许多 C# 网络摄像头条形码扫描器教程依赖于多库组合,通常使用ZXing .NET进行解码,并搭配AForge .NETDirectShow .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 构建条形码扫描器。整个过程只需几行代码,因此各种技能水平的开发人员都可以轻松上手。

Jordi Bardia
软件工程师
Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我