【问题标题】:How to Decode QRCode from WebCamera using Aforge.NET and ZXing.NET in C#如何在 C# 中使用 Aforge.NET 和 ZXing.NET 从 WebCamera 解码 QRCode
【发布时间】:2017-12-11 20:28:02
【问题描述】:

我正在尝试开发一个 WindowsForm 应用程序,它将使用网络摄像头检测 QRCode 并解码消息。为此,我使用 AForge.NET 和 ZXing.NET。

到目前为止,我已经能够弄清楚如何从 URI 中解码 QRCode,但我想从网络摄像头中检测 QRCode,并对其进行解码。

以下是我的代码示例。

public String Decode(Uri uri)
{
    Bitmap image;
    try
    {
        image = (Bitmap)Bitmap.FromFile(uri.LocalPath);
    }
    catch (Exception ex)
    {
        throw new FileNotFoundException("Resource not found: " + uri);
    }

    using (image)
    {
        String text = "";
        LuminanceSource source = new BitmapLuminanceSource(image);

        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        Result result = new MultiFormatReader().decode(bitmap);

        if (result != null)
        {
            text = result.Text;
            return text;
        }

        text = "Provided QR couldn't be read.";
        return text;
    }
}

【问题讨论】:

  • 也许您需要捕获相机图像,然后调用解码库

标签: c# zxing aforge


【解决方案1】:
    private FilterInfoCollection videoDevices;
    private VideoCaptureDevice videoSource;
    private Bitmap capturedImage;
    private String message = "";

    public FormQRCodeScanner()
    {
        InitializeComponent();
    }

    private void FormQRCodeScanner_Load(object sender, EventArgs e)
    {
        videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
        foreach (FilterInfo device in videoDevices)
        {
            comboBoxCameraSource.Items.Add(device.Name);
        }
        comboBoxCameraSource.SelectedIndex = 0;

        videoSource = new VideoCaptureDevice();

        buttonStartStop.Text = "Start";
        buttonCapture.Enabled = false;
        buttonDecode.Enabled = false;
    }

    private void FormQRCodeScanner_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (videoSource.IsRunning)
        {
            videoSource.Stop();
        }
    }

    void videoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap image = (Bitmap) eventArgs.Frame.Clone();
        pictureBoxSource.Image = image;
    }

    private void buttonStartStop_Click(object sender, EventArgs e)
    {
        if (videoSource.IsRunning)
        {
            videoSource.Stop();
            pictureBoxSource.Image = null;
            pictureBoxCaptured.Image = null;
            pictureBoxSource.Invalidate();
            pictureBoxCaptured.Invalidate();

            buttonStartStop.Text = "Start";
            buttonCapture.Enabled = false;
            buttonDecode.Enabled = false;
        }
        else
        {
            videoSource = new VideoCaptureDevice(videoDevices[comboBoxCameraSource.SelectedIndex].MonikerString);
            videoSource.NewFrame += new NewFrameEventHandler(videoSource_NewFrame);
            videoSource.Start();

            buttonStartStop.Text = "Stop";
            buttonCapture.Enabled = true;
            buttonDecode.Enabled = true;
        }
    }

    private void buttonCapture_Click(object sender, EventArgs e)
    {
        if (videoSource.IsRunning)
        {
            pictureBoxCaptured.Image = (Bitmap)pictureBoxSource.Image.Clone();
            capturedImage = (Bitmap)pictureBoxCaptured.Image;
        }
    }

    private void buttonDecode_Click(object sender, EventArgs e)
    {
        if (capturedImage != null)
        {
            ExtractQRCodeMessageFromImage(capturedImage);
            richTextBoxMessage.Text = message;
            richTextBoxMessage.ReadOnly = true;
        }
    }

    private string ExtractQRCodeMessageFromImage(Bitmap bitmap)
    {
        try
        {
            BarcodeReader reader = new BarcodeReader
                (null, newbitmap => new BitmapLuminanceSource(bitmap), luminance => new GlobalHistogramBinarizer(luminance));

            reader.AutoRotate = true;
            reader.TryInverted = true;
            reader.Options = new DecodingOptions { TryHarder = true };

            var result = reader.Decode(bitmap);

            if (result != null)
            {
                message = result.Text;
                return message;
            }
            else
            {
                message = "QRCode couldn't be decoded.";
                return message;
            }
        }
        catch (Exception ex)
        {
            message = "QRCode couldn't be detected.";
            return message;
        }
    }

【讨论】:

    【解决方案2】:
    **For this you should install these packages
    Install-Package AForge
    Install-Package AForge.Video
    Install-Package AForge.Video.DirectShow
    Install-Package ZXing.Net
    
    you can watch this video for more help
    https://www.youtube.com/watch?v=wcoy0Gwxr50**
    
    
    
    
        using System.IO;
        using AForge;
        using AForge.Video;
        using AForge.Video.DirectShow;
        using ZXing;
        using ZXing.Aztec;
    
    
          private void Form1_Load(object sender, EventArgs e)
                {
                    CaptureDevice = new FilterInfoCollection(FilterCategory.VideoInputDevice);
                    foreach (FilterInfo Device in CaptureDevice)
                    {
                        comboBox1.Items.Add(Device.Name);
                    }
    
                    comboBox1.SelectedIndex = 0;
                    FinalFrame = new VideoCaptureDevice();
                }
    
                private void button1_Click(object sender, EventArgs e)
                {
                    FinalFrame = new VideoCaptureDevice(CaptureDevice[comboBox1.SelectedIndex].MonikerString);
                    FinalFrame.NewFrame += new NewFrameEventHandler(FinalFrame_NewFrame);
                    FinalFrame.Start();
    
                }
    
                private void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs)
                {
                    pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();
                }
    
                private void timer1_Tick(object sender, EventArgs e)
                {
                    BarcodeReader Reader = new BarcodeReader();
                    Result result = Reader.Decode((Bitmap)pictureBox1.Image);
                    try
                    {
                        string decoded = result.ToString().Trim();
                        if (decoded != "")
                        {
                            timer1.Stop();
                            MessageBox.Show(decoded);
                            Form2 form = new Form2();
                            form.Show();
                            this.Hide();
    
                        }
                    }
                    catch(Exception ex){
    
                    }
                }
    
                private void button2_Click(object sender, EventArgs e)
                {
                    timer1.Enabled = true;
                    timer1.Start();
                }
    
                private void Form1_FormClosing(object sender, FormClosingEventArgs e)
                {
                    if (FinalFrame.IsRunning == true)
                    {
                        FinalFrame.Stop();
                    }
                }
    

    【讨论】:

      猜你喜欢
      • 2019-11-06
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多