最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF實現(xiàn)可視化掃碼器的示例代碼

 更新時間:2022年11月17日 16:30:02   作者:黑夜中的潛行者  
AForge.NET 是一個專門為開發(fā)者和研究者基于C#框架設(shè)計的,他包括計算機(jī)視覺與人工智能,圖像處理,神經(jīng)網(wǎng)絡(luò),遺傳算法,機(jī)器學(xué)習(xí),模糊系統(tǒng),機(jī)器人控制等領(lǐng)域。本文就將用它編寫一個可視化掃碼器,感興趣的可以了解一下

概述

以識別粵康碼識別為例?,F(xiàn)在的深圳進(jìn)出小區(qū)、商場、辦公樓、乘坐公共交通工具等都需要出示并掃描健康碼,也被稱之為“電子哨兵”。不多說那個用的是一般的掃碼槍。

攝像頭調(diào)度

調(diào)度攝像頭選擇使用 AForge.NET

AForge.NET 是一個專門為開發(fā)者和研究者基于C#框架設(shè)計的,他包括計算機(jī)視覺與人工智能,圖像處理,神經(jīng)網(wǎng)絡(luò),遺傳算法,機(jī)器學(xué)習(xí),模糊系統(tǒng),機(jī)器人控制等領(lǐng)域。AForge.Net 是C#的一個圖像計算機(jī)視覺庫,該庫是一個開源項目,提供很多圖像的處理,和視頻處理功能。

官方地址:http://www.aforgenet.com/

需要引入三個NuGet包:

  • AForge
  • AForge.Video
  • AForge.Video.DirectShow

如何使用這里先不介紹,后面有完整代碼

二維碼識別

需要的NuGet包:ZXing.Net

ZXing.Net 是由 Google ZXing 移植并優(yōu)化改進(jìn)而來的。

Google ZXing 是目前一個常用的基于Java實現(xiàn)的多種格式的1D/2D條碼圖像處理庫。

這支持的編碼方式種類相對齊全,并且支持可移植庫。

如何使用這里先不介紹,后面有完整代碼

源代碼

<Window
    x:Class="HealthCodeIdentification.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:local="clr-namespace:HealthCodeIdentification"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    Title="MainWindow"
    Width="800"
    Height="450"
    WindowStartupLocation="CenterScreen"
    mc:Ignorable="d">
    <Grid Background="AliceBlue">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <StackPanel
            Grid.Column="0"
            Margin="10"
            VerticalAlignment="Center">
            <TextBlock
                x:Name="txtTips"
                Margin="0,10"
                HorizontalAlignment="Center" />
            <Image x:Name="imageVideo" />
        </StackPanel>

        <Grid Grid.Column="1" Margin="10">
            <Grid.RowDefinitions>
                <RowDefinition />
                <RowDefinition />
            </Grid.RowDefinitions>

            <TextBox
                x:Name="txtInfo"
                BorderThickness="0"
                TextWrapping="Wrap" />

            <TextBlock
                x:Name="txtCodeColor"
                Grid.Row="1"
                FontSize="32">
                <TextBlock.Style>
                    <Style TargetType="TextBlock">
                        <Style.Triggers>
                            <Trigger Property="Text" Value="綠碼">
                                <Setter Property="Foreground" Value="#0d0" />
                            </Trigger>
                            <Trigger Property="Text" Value="黃碼">
                                <Setter Property="Foreground" Value="Yellow" />
                            </Trigger>
                            <Trigger Property="Text" Value="紅碼">
                                <Setter Property="Foreground" Value="Red" />
                            </Trigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
            </TextBlock>

        </Grid>
    </Grid>
</Window>
using AForge.Video.DirectShow;
using Newtonsoft.Json;
using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media.Imaging;
using ZXing;

namespace HealthCodeIdentification
{
    /// <summary>
    /// MainWindow.xaml 的交互邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        private FilterInfoCollection _videoDevices;
        private VideoCaptureDevice _videoSource;

        public MainWindow()
        {
            InitializeComponent();
            Loaded += MainWindow_Loaded;
            Closed += MainWindow_Closed;
        }

        private void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            OpenVideoCaptureDevice();
        }

        private void MainWindow_Closed(object sender, EventArgs e)
        {
            if (_videoSource is null) return;
            _videoSource.SignalToStop();
        }

        /// <summary>
        /// 查找并打開攝像頭
        /// </summary>
        private void OpenVideoCaptureDevice()
        {
            _videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);

            if (_videoDevices.Count > 0)
            {
                _videoSource = new VideoCaptureDevice(_videoDevices[0].MonikerString);
                _videoSource.NewFrame += _camera_NewFrame;
                _videoSource.Start();
                txtTips.Text = "AI掃描已啟動,請將健康碼對準(zhǔn)攝像頭";
                return;
            }

            MessageBox.Show("請連接攝像頭!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
        }

        /// <summary>
        /// 加載視頻
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="eventArgs"></param>
        private async void _camera_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
        {
            var image = eventArgs.Frame.Clone();
            Image videoImage = (Bitmap)image;
            Bitmap bitmapImage = (Bitmap)image;

            //image.RotateFlip(RotateFlipType.RotateNoneFlipX); // 設(shè)置圖像旋轉(zhuǎn)

            Graphics g = Graphics.FromImage(videoImage);

            //SolidBrush brush = new SolidBrush(Color.Red);
            //g.DrawString($"時間:{DateTime.Now:yyyy年MM月dd日 HH時mm分ss秒}", new Font("Arial", 18), brush, new PointF(5, 5));
            //brush.Dispose();
            //g.Dispose();

            MemoryStream ms = new MemoryStream();
            videoImage.Save(ms, ImageFormat.Bmp);
            ms.Seek(0, SeekOrigin.Begin);

            BitmapImage bi = new BitmapImage();
            bi.BeginInit();
            bi.StreamSource = ms;
            bi.EndInit();
            bi.Freeze();

            await Dispatcher.BeginInvoke(new ThreadStart(async delegate
             {
                 imageVideo.Source = bi;
                 await QRCodeReader(bitmapImage);
             }));
        }

        private async Task<Task> QRCodeReader(Bitmap bitmap)
        {
            await Dispatcher.BeginInvoke(new ThreadStart(delegate
            {
                BarcodeReader barcodeReader = new BarcodeReader();
                var result = barcodeReader.Decode(bitmap);
                if (result != null)
                {
                    txtInfo.Text = result.ToString();
                    if (result.ToString().StartsWith("{"))
                    {
                        var data = JsonConvert.DeserializeObject<CodeData>(result.ToString());
                        switch (data.c.ToUpper())
                        {
                            case "G":
                                txtCodeColor.Text = "綠碼";
                                break;
                            case "Y":
                                txtCodeColor.Text = "黃碼";
                                break;
                            case "R":
                                txtCodeColor.Text = "紅碼";
                                break;
                        }
                    }
                }
            }));
            return Task.CompletedTask;
        }
    }

    public class CodeData
    {
        public string label { get; set; }
        public string cid { get; set; }
        public string cidtype { get; set; }
        public string name { get; set; }
        public string phone { get; set; }
        public string encode { get; set; }
        /// <summary>
        /// 顏色,綠碼G,黃碼Y,紅碼R
        /// </summary>
        public string c { get; set; }
        public string t { get; set; }
        public string v { get; set; }
        public string s { get; set; }
    }
}

以上就是WPF實現(xiàn)可視化掃碼器的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于WPF可視化掃碼器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c# winform 解決PictureBox 無法打印全部圖片的問題

    c# winform 解決PictureBox 無法打印全部圖片的問題

    這篇文章主要介紹了c# winform 解決PictureBox 無法打印全部圖片的問題,幫助大家更好進(jìn)行c# winform開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • C# .NET 中的緩存實現(xiàn)詳情

    C# .NET 中的緩存實現(xiàn)詳情

    軟件開發(fā)中最常用的模式之一是 緩存 ,其包括進(jìn)程內(nèi)緩存、持久性進(jìn)程內(nèi)緩存和分布式緩存,本文我們將主要介紹進(jìn)程內(nèi)緩存,需要的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C# Split函數(shù)根據(jù)特定分隔符分割字符串的操作

    C# Split函數(shù)根據(jù)特定分隔符分割字符串的操作

    這篇文章主要介紹了C# Split函數(shù)根據(jù)特定分隔符分割字符串的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • WinForm單例窗體用法實例

    WinForm單例窗體用法實例

    這篇文章主要介紹了WinForm單例窗體,結(jié)合實例形式分析了窗體的單例模式定義、實現(xiàn)與使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • 在WinForm應(yīng)用程序中快速實現(xiàn)多語言的處理的方法

    在WinForm應(yīng)用程序中快速實現(xiàn)多語言的處理的方法

    在國際化環(huán)境下,越來越多的程序需要做多語言版本,這篇文章主要介紹了在WinForm應(yīng)用程序中快速實現(xiàn)多語言的處理的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2018-07-07
  • C#基礎(chǔ)語法:方法參數(shù)詳解

    C#基礎(chǔ)語法:方法參數(shù)詳解

    這篇文章主要介紹了C#基礎(chǔ)語法:方法參數(shù)詳解,本文講解了值參數(shù)、引用參數(shù)、輸出參數(shù)、參數(shù)數(shù)組等參數(shù)類型,并分別給出代碼實例,需要的朋友可以參考下
    2015-06-06
  • C#中如何分割字符串

    C#中如何分割字符串

    這篇文章主要介紹了C#中如何分割字符串問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • C#調(diào)用和實現(xiàn)WebService,純手工打造!

    C#調(diào)用和實現(xiàn)WebService,純手工打造!

    C#調(diào)用和實現(xiàn)WebService,純手工打造! 需要的朋友可以參考一下
    2013-02-02
  • 基于WPF簡單實現(xiàn)Meesage消息提醒

    基于WPF簡單實現(xiàn)Meesage消息提醒

    這篇文章主要介紹了如何利用WPF簡單實現(xiàn)Meesage消息提醒,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定幫助,需要的可以參考一下
    2023-07-07
  • C#實現(xiàn)滑動開關(guān)效果

    C#實現(xiàn)滑動開關(guān)效果

    這篇文章主要為大家詳細(xì)介紹了C#實現(xiàn)滑動開關(guān)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論

武鸣县| 黄骅市| 东乌珠穆沁旗| 临邑县| 曲阳县| 呼图壁县| 洛浦县| 朝阳县| 梁平县| 安康市| 晋中市| 吴江市| 钟祥市| 大埔县| 綦江县| 西昌市| 宝兴县| 永宁县| 上饶县| 新宁县| 灵台县| 巧家县| 江口县| 綦江县| 左云县| 扎鲁特旗| 安溪县| 永定县| 洪泽县| 堆龙德庆县| 阿克苏市| 定日县| 祁东县| 乐安县| 金山区| 农安县| 辽阳市| 昌图县| 玛多县| 平江县| 银川市|