如何使用网络摄像头扫描 WinUI 3 中的二维码?

2023-11-29

我正在尝试在 WinUI 3 中从网络摄像头扫描 QR 码。我已经安装了 ZXing 和 AForge Video,但这些库在 WinUI 3 中无法正常工作。是否有任何解决方案或更兼容的替代方案?


ZXing (中兴网是一个端口)完全与平台无关,因此只要您可以捕获某种“位图”(RGB 等),无论它在给定平台上意味着什么,它都可以很好地适用于任何技术。

这是 WinUI3(确保您安装了最新的 WinUI3 nuget)示例应用程序,它执行两件事:

  • 它捕获(首先在您的 PC 上)网络摄像头输出并将其显示在 WinUI3 中媒体播放器元素.
  • 对于每一帧,它都会运行 ZXing 条形码阅读器解码,尝试查找 QR 码,并在找到时显示它。

可以轻松更改代码以读取 XZing 支持的任何条形码(EAN13 等)。它包含 XZing 和 WinRT 的 SoftwareBitmap 之间的薄适配层(我从 XZing.NET 代码复制):

以下是 WinUI3 页面的 XAML:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30" />
        <RowDefinition Height="30" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Button Click="Button_Click">Toggle Capture</Button>
    <TextBox x:Name="textBox" Grid.Row="1" />
    <MediaPlayerElement
        x:Name="player"
        Grid.Row="2"
        Width="600"
        Height="600"
        AutoPlay="True" />
</Grid>

WinUI3页面中的代码(您需要安装XZing.NET nuget包):

public sealed partial class MainPage : Page
{
    private readonly SoftwareBitmapBarcodeReader _reader;
    private MediaCapture _capture;
    private MediaFrameReader _frameReader;
    private MediaSource _mediaSource;

    public MainPage()
    {
        InitializeComponent();

        // set various xzing options (beware, all formats like All_1D can divide perf by orders of magnitude)
        _reader = new SoftwareBitmapBarcodeReader
        {
            AutoRotate = true
        };
        _reader.Options.PossibleFormats = new[] { BarcodeFormat.QR_CODE };
        _reader.Options.TryHarder = true;
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        if (_capture == null)
        {
            await InitializeCaptureAsync();
            return;
        }
        await TerminateCaptureAsync();
    }

    private async Task InitializeCaptureAsync()
    {
        // get first capture device (change this if you want)
        var sourceGroup = (await MediaFrameSourceGroup.FindAllAsync())?.FirstOrDefault();
        if (sourceGroup == null)
            return; // not found!

        // init capture & initialize
        _capture = new MediaCapture();
        await _capture.InitializeAsync(new MediaCaptureInitializationSettings
        {
            SourceGroup = sourceGroup,
            SharingMode = MediaCaptureSharingMode.SharedReadOnly,
            MemoryPreference = MediaCaptureMemoryPreference.Cpu, // to ensure we get SoftwareBitmaps
        });

        // initialize source
        var source = _capture.FrameSources[sourceGroup.SourceInfos[0].Id];

        // create reader to get frames & pass reader to player to visualize the webcam
        _frameReader = await _capture.CreateFrameReaderAsync(source, MediaEncodingSubtypes.Bgra8);
        _frameReader.FrameArrived += OnFrameArrived;
        await _frameReader.StartAsync();

        _mediaSource = MediaSource.CreateFromMediaFrameSource(source);
        player.Source = _mediaSource;
    }

    private void OnFrameArrived(MediaFrameReader sender, MediaFrameArrivedEventArgs args)
    {
        var bmp = sender.TryAcquireLatestFrame()?.VideoMediaFrame?.SoftwareBitmap;
        if (bmp == null)
            return;

        var result = _reader.Decode(bmp);
        if (result != null)
        {
            // found a QR CODE
            DispatcherQueue.TryEnqueue(() =>
            {
                textBox.Text = result.BarcodeFormat + ": " + result.Text;
            });
        }
    }

    private async Task TerminateCaptureAsync()
    {
        player.Source = null;

        _mediaSource?.Dispose();
        _mediaSource = null;

        if (_frameReader != null)
        {
            _frameReader.FrameArrived -= OnFrameArrived;
            await _frameReader.StopAsync();
            _frameReader?.Dispose();
            _frameReader = null;
        }

        _capture?.Dispose();
        _capture = null;
    }
}

// this is the thin layer that allows you to use XZing over WinRT's SoftwareBitmap
public class SoftwareBitmapBarcodeReader : BarcodeReader<SoftwareBitmap>
{
    public SoftwareBitmapBarcodeReader()
        : base(bmp => new SoftwareBitmapLuminanceSource(bmp))
    {
    }
}

// from https://github.com/micjahn/ZXing.Net/blob/master/Source/lib/BitmapLuminanceSource.SoftwareBitmap.cs
public class SoftwareBitmapLuminanceSource : BaseLuminanceSource
{
    protected SoftwareBitmapLuminanceSource(int width, int height)
      : base(width, height)
    {
    }

    public SoftwareBitmapLuminanceSource(SoftwareBitmap softwareBitmap)
        : base(softwareBitmap.PixelWidth, softwareBitmap.PixelHeight)
    {
        if (softwareBitmap.BitmapPixelFormat != BitmapPixelFormat.Gray8)
        {
            using SoftwareBitmap convertedSoftwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Gray8);
            convertedSoftwareBitmap.CopyToBuffer(luminances.AsBuffer());
            return;
        }
        softwareBitmap.CopyToBuffer(luminances.AsBuffer());
    }

    protected override LuminanceSource CreateLuminanceSource(byte[] newLuminances, int width, int height)
        => new SoftwareBitmapLuminanceSource(width, height) { luminances = newLuminances };
}

以下是编码“Hello World”的 QR 码的结果:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用网络摄像头扫描 WinUI 3 中的二维码? 的相关文章

  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • C 预处理器库

    我的任务是开发源分析工具C程序 并且我需要在分析本身之前预处理代码 我想知道什么是最好的图书馆 我需要一些重量轻 便于携带的东西 与其推出自己的 为什么不使用cpp这是的一部分gcc suite http gcc gnu org onlin
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 如何将图像路径保存到Live Tile的WP8本地文件夹

    我正在更新我的 Windows Phone 应用程序以使用新的 WP8 文件存储 API 本地文件夹 而不是 WP7 API 隔离存储文件 旧的工作方法 这是我如何成功地将图像保存到 共享 ShellContent文件夹使用隔离存储文件方法
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 将 unsigned char * (uint8_t *) 转换为 const char *

    我有一个带有 uint8 t 参数的函数 uint8 t ihex decode uint8 t in size t len uint8 t out uint8 t i hn ln for i 0 i lt len i 2 hn in i
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 在 Dynamics CRM 插件中访问电子邮件发件人地址

    我正在编写一个 Dynamics CRM 2011 插件 该插件挂钩到电子邮件实体的更新后事件 阶段 40 pipeline http msdn microsoft com en us library gg327941 aspx 并且在此阶
  • WCF:将随机数添加到 UsernameToken

    我正在尝试连接到用 Java 编写的 Web 服务 但有些东西我无法弄清楚 使用 WCF 和 customBinding 几乎一切似乎都很好 除了 SOAP 消息的一部分 因为它缺少 Nonce 和 Created 部分节点 显然我错过了一
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 如何在 C++ BOOST 中像图形一样加载 TIFF 图像

    我想要加载一个 tiff 图像 带有带有浮点值的像素的 GEOTIFF 例如 boost C 中的图形 我是 C 的新手 我的目标是使用从源 A 到目标 B 的双向 Dijkstra 来获得更高的性能 Boost GIL load tiif
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • GitLab HTTP URL 上的 504 网关超时

    我已经在 Linux 机器上安装了 GitLab 6 0 并创建了许多项目 我可以使用 SSH URL 创建每个项目的本地克隆 但是当我尝试使用 HTTP URL 时 我得到一个504 网关超时 秒 当我将 HTTP URL 粘贴到 Sou
  • C#中的Double类型精度不是15位吗?

    我正在测试这段代码脑筋急转弯 double d1 1 000001 double d2 0 000001 Console WriteLine d1 d2 1 0 结果是 假 当我更改数据类型时 decimal d1 1 000001M de
  • PyPy 显示的基准测试结果不准确?

    我正在研究欧拉计划并想知道我是否可以使用 PyPy 加速我的解决方案 然而 我发现结果非常令人失望 因为计算需要更多时间 d projeuler gt pypy problem204 py 3462 08630405 mseconds d
  • SQL Server 2016 始终加密 - 使用视图中始终加密的列进行比较和计算表达式

    我有一个专栏 Amount numeric 18 2 我已使用 SSMS v17 的加密列向导对其进行了加密 列数据现已加密 但是 我有一个使用类似以下内容的视图 create SampleView as Select Amount Rat
  • 使 git diff --stat 显示完整文件路径

    关于做git diff stat一些文件列出了存储库库的完整路径 但一些文件列出为 short path to filename 这就是路径开始于 并且仅显示短路径 我想git diff列出所有文件的完整文件路径 以便脚本轻松处理 有什么办
  • 如何合并多个未知长度的平面数组,转置它们,然后形成一维数组?

    我有 3 个这样的数组 a array 0 gt a1 1 gt a2 2 gt a3 b array 0 gt b1 1 gt b2 2 gt b3 c array 0 gt c1 1 gt c2 2 gt c3 我喜欢这样的东西 r a
  • 将参数传递给 Rails 路径助手

    我正在尝试将参数传递到我的 Rails 路径助手中 但我当前的尝试不起作用 这是我现在正在做的事情 控制器 def pause binding pry end 在控制器中 我正在寻找传入的参数 但没有找到它们 这是返回的内容
  • WebThread JavaScriptCore 崩溃 - 此崩溃报告意味着什么

    我需要测试用户的帮助来理解此崩溃日志 我没有在我的应用程序中编写任何 JavaScriptCore 相关代码 我仍然不知道如何重现这次崩溃 关于这个问题的任何见解都将有助于我找到这个问题 Thanks 附言 我的应用程序正在使用 Admob
  • ASP.NET MVC:使用递归助手生成多级菜单

    我使用此代码生成菜单 此菜单使用数据库 类别表 填充项目这项技术 部分视图 using SarbarzDarb Helper model IEnumerable
  • 选择行号 = rownum

    我一直在尝试运行此查询以按行号选择行 但我不断在 where 子句中收到未知的列 行 这个查询可以吗 SELECT row row 1 AS row pi FROM ci patient info pi where row 2 将其包裹在一
  • 在mfc中绘制背景

    我正在尝试使用 MFC 库在 C 中绘制窗口的背景 我必须使用这个框架 因为我正在开发 MFC 应用程序 我尝试了几种不同的方法 但无法使其发挥作用 所以我最近打开了一个空白项目 只是想弄清楚如何绘制背景 但它不起作用 任何帮助都会很棒 这
  • 如何解决从另一个实体(JPA)继承的实体的“未指定主键”?

    我想要一个所有文档类型都通用的超类 Entity public abstract class Doc implements Serializable Id GeneratedValue strategy GenerationType IDE
  • 如何在单个图中绘制多个seaborn.distplot

    我想绘制多个seaborndistplot在同一窗口下 每个图都有相同的 x 和 y 网格 我的尝试如下所示 但不起作用 function to plot the density curve of the 200 Median Stn MC
  • 避免打开模板参数

    简化后我有以下类层次结构 class BaseVec public BaseVec virtual BaseVec virtual double get double int i const 0 template
  • 在 R 中绘制连续函数

    我会如何绘制类似的东西y a b在 R 中 其中y等于某个常数并且a b gt 0 So a b 5例如 它绘制该线的位置 我只见过传递值列表a and b和绘图y根据这些值 不绘制连续曲线 f lt function a b a b 我该
  • ModuleNotFoundError:没有名为“psycopg2._psycopg”的模块

    我正在使用进口 导入psycopg2 但是在本地运行代码时 我面临一个问题 从 psycopg2 psycopg 导入 ModuleNotFoundError 没有名为 psycopg2 psycopg 的模块 我已经使用 cmd pip
  • 如何修复应用程序不响应?

    我已经准备好了绘画应用程序 我的应用程序包含一个用于绘画的自定义视图 当我们在自定义视图中绘制任何内容时 只需收集绘制的像素并存储在数组列表中 第一次它工作正常 但需要很多时间 第二次 活动 MyAlphabets 在应用程序 MyAlph
  • C# - 网站 - SQL Select 语句

    我想使用 select 语句来查找是否存在已存在的记录 我已将代码放在下面 但它在 dReader comm ExecuteReader 处引发错误我不确定为什么 有什么帮助吗 string connString Data Source K
  • 在 AS3 中隐藏按钮?

    我有一个名为 myBtn 的按钮 在第一帧的操作中 我尝试了以下两种方法 myBtn visibility false myBtn enabled false 两者都给我同样的错误 1120 访问未定义的属性 myBtn 好的 有几种方法可
  • 如何使用网络摄像头扫描 WinUI 3 中的二维码?

    我正在尝试在 WinUI 3 中从网络摄像头扫描 QR 码 我已经安装了 ZXing 和 AForge Video 但这些库在 WinUI 3 中无法正常工作 是否有任何解决方案或更兼容的替代方案 ZXing 中兴网是一个端口 完全与平台无