基于C#实现照片条形码识别

简介: 基于C#实现照片条形码识别

基于C#实现照片条形码识别,结合主流开源库和工业级优化策略:


一、技术选型对比

库名称 支持格式 识别速度 准确率 开源协议
ZXing.NET QR/Code128/EAN13等30+格式 中等 MIT
ZBar QR/Code128等主流格式 极高 LGPL
TencentOCR 通用条码+文字识别 极高 闭源

二、核心实现方案(ZXing.NET)

1. 环境配置

Install-Package ZXing.Net
Install-Package ZXing.Net.Bindings.SkiaSharp  # 图像处理增强

2. 基础识别代码

using ZXing;
using ZXing.Common;
using SkiaSharp;

public class BarcodeScanner
{
   
    public string Scan(string imagePath)
    {
   
        using var bitmap = SKBitmap.Decode(imagePath);
        var luminanceSource = new SKBitmapLuminanceSource(bitmap);

        var reader = new BarcodeReader
        {
   
            AutoRotate = true,
            TryHarder = true,
            Options = new DecodingOptions
            {
   
                PossibleFormats = new[] {
    BarcodeFormat.CODE_128, BarcodeFormat.EAN_13 },
                CharacterSet = "UTF-8",
                PureBarcode = false
            }
        };

        var result = reader.Decode(luminanceSource);
        return result?.Text ?? "未识别到条码";
    }
}

三、图像预处理优化

1. 灰度化与二值化

public static SKBitmap Preprocess(SKBitmap src)
{
   
    var dst = new SKBitmap(src.Width, src.Height);
    using var canvas = new SKCanvas(dst);

    // 转换为灰度图
    canvas.DrawBitmap(src, 0, 0, new SKPaint
    {
   
        ColorFilter = SKColorFilter.CreateColorMatrix(new float[]
        {
   
            0.299f, 0.587f, 0.114f, 0, 0,
            0.299f, 0.587f, 0.114f, 0, 0,
            0.299f, 0.587f, 0.114f, 0, 0,
            0,      0,      0,      1, 0
        })
    });

    // 自适应阈值二值化
    var threshold = new AdaptiveThreshold(0.5f, 5);
    canvas.DrawBitmap(dst, 0, 0, threshold);

    return dst;
}

2. 图像增强

public static SKBitmap Enhance(SKBitmap src)
{
   
    using var filter = new SKImageFilter.Shadow(SKRect.MakeXYWH(0,0,0,0), 3, 3, 0.5f);
    return SKBitmap.Decode(src.Encode(SKEncodedImageFormat.Png, 100), filter);
}

参考项目 C# 根据照片识别条形码 www.youwenfan.com/contentald/49545.html

四、高级功能实现

1. 批量识别

public List<string> BatchScan(IEnumerable<string> paths)
{
   
    var results = new ConcurrentBag<string>();
    Parallel.ForEach(paths, path => 
    {
   
        var scanner = new BarcodeScanner();
        var result = scanner.Scan(path);
        if (!string.IsNullOrEmpty(result)) 
            results.Add($"{Path.GetFileName(path)}: {result}");
    });
    return results.ToList();
}

2. 实时摄像头扫描

public class CameraScanner : IDisposable
{
   
    private VideoCaptureDevice _capture;
    private BarcodeReader _reader;

    public event Action<string> CodeDetected;

    public CameraScanner()
    {
   
        _reader = new BarcodeReader
        {
   
            AutoRotate = true,
            TryHarder = true
        };

        _capture = new VideoCaptureDevice(GetBestDevice());
        _capture.FrameCaptured += OnFrameCaptured;
    }

    private void OnFrameCaptured(object sender, FrameEventArgs e)
    {
   
        var frame = e.Frame;
        var result = _reader.Decode(frame);
        if (result != null) CodeDetected?.Invoke(result.Text);
    }

    private static VideoCaptureDevice GetBestDevice()
    {
   
        var devices = CaptureDeviceManager.GetDeviceList(DeviceType.VideoCapture);
        return devices.FirstOrDefault(d => d.MonikerString.Contains("USB")) ?? devices;
    }

    public void Start() => _capture.Start();
    public void Stop() => _capture.Stop();
    public void Dispose() => _capture?.Dispose();
}

五、常见问题解决方案

1. 中文乱码

// 生成时指定编码
var options = new QrCodeEncodingOptions
{
   
    CharacterSet = "UTF-8",
    ErrorCorrection = ErrorCorrectionLevel.H
};

2. 低质量图片识别

// 图像预处理流水线
var processed = image
    .Resize(800, 600)       // 统一尺寸
    .Contrast(1.2f)         // 增强对比度
    .Despeckle(3)           // 去噪
    .ToBitmap();

3. 多码同图识别

var results = reader.DecodeMultiple(bitmap);
foreach (var result in results)
{
   
    Console.WriteLine($"类型:{result.BarcodeFormat}, 内容:{result.Text}");
}

六、部署建议

  1. 硬件要求

    • 最低配置:i5-8代+8GB内存+USB3.0接口
    • 推荐配置:i7-12代+16GB内存+独立显卡
  2. 依赖项管理

    <!-- NuGet依赖 -->
    <PackageReference Include="ZXing.Net" Version="0.16.9" />
    <PackageReference Include="SkiaSharp" Version="2.88.4" />
    
  3. 安装包制作

    • 使用MSIX打包工具
    • 包含.NET运行时6.0
    • 添加设备驱动签名
相关文章
|
自然语言处理 Java 开发工具
使用KIbana测试IK分词器
使用KIbana测试IK分词器
|
3月前
|
缓存 监控 搜索推荐
电商生态协同的关键:API接口在电商数据对接中的应用与实践
电商数据对接API接口是连接电商平台与外部系统的智慧桥梁,通过标准化协议实现商品管理、订单处理、支付结算、物流追踪及数据分析等全链路支持。本文从核心功能、对接流程、应用场景和优化策略四个方面解析其技术逻辑与实践路径。API接口助力店铺管理自动化、精准营销与跨境电商全链路管理,同时通过安全防护、性能调优与合规管理提升效能,推动电商行业向智能化、高效化发展。
|
3月前
|
SQL 分布式计算 Hadoop
别再云里雾里了!一文带你整明白Hadoop生态到底是啥玩意儿
别再云里雾里了!一文带你整明白Hadoop生态到底是啥玩意儿
163 0
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
7340 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
7月前
|
UED
产品经理-用户体验五要素 - AxureMost
《用户体验五要素》介绍了构建成功用户体验设计的五个层面:战略层、范围层、结构层、框架层和表现层。战略层明确产品目标与用户需求;范围层定义功能和内容需求;结构层规划交互与信息架构;框架层设计界面、导航和信息布局;表现层则通过视觉设计创造感知体验。每一层都依赖于其下一层,形成自下而上的连锁效应,确保各要素相互作用,共同实现用户体验目标。
|
11月前
|
关系型数据库 C# 数据库
.NET 8.0 开源在线考试系统(支持移动端)
【10月更文挑战第27天】以下是适用于 .NET 8.0 的开源在线考试系统(支持移动端)的简介: 1. **基于 .NET Core**:跨平台,支持多种数据库,前后端分离,适用于多操作系统。 2. **结合 Blazor**:使用 C# 开发 Web 应用,支持响应式设计,优化移动端体验。 3. **基于 .NET MAUI**:跨平台移动应用开发,一套代码多平台运行,提高开发效率。 开发时需关注界面设计、安全性与稳定性。
266 4
|
JavaScript 前端开发 数据处理
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
这篇文章讨论了Vue中实现权限管理的策略,包括接口权限、路由权限、菜单权限和按钮权限的控制方法,并提供了不同的实现方案及代码示例,以确保用户只能访问被授权的资源。
【Vue面试题二十八】、vue要做权限管理该怎么做?如果控制到按钮级别的权限怎么做?
|
SQL Oracle 关系型数据库
SqlSugar
【8月更文挑战第1天】
312 3
|
11月前
|
C# 数据安全/隐私保护 计算机视觉
C#开发者的新选择:使用ImageSharp进行图像处理
C#开发者的新选择:使用ImageSharp进行图像处理
1365 8
|
SQL 存储 Oracle
Oracle 代码异常查询(三)
Oracle 代码异常查询
847 0