.NET 6에서 Windows 데스크톱 바코드 및 QR 코드 스캐너를 빌드하는 방법

몇 주 전에 BarcodeQRCodeSDK 으로 구현된 .NET 6Dynamsoft C/C++ Barcode SDK 패키지를 릴리스했습니다. 이 문서에서는 .NET WinForms, OpenCvSharp 및 BarcodeQRCodeSDK를 사용하여 Windows 데스크톱 바코드 및 QR 코드 스캐너를 빌드하는 방법을 보여줍니다.

종속성 설치



  • OpenCvSharp4.Windows

    웹캠에서 비디오 스트림을 캡처하는 데 사용됩니다.

    dotnet add package OpenCvSharp4.Windows
    


  • OpenCvSharp4.Extensions

    OpenCvSharp 매트를 비트맵으로 변환하는 데 사용됩니다.

    dotnet add package OpenCvSharp4.Extensions
    


  • BarcodeQRCodeSDK
    Mat 또는 Bitmap 에서 바코드 및 QR 코드를 디코딩하는 데 사용됩니다.

    dotnet add package BarcodeQRCodeSDK
    


  • .NET 6에서 Windows 데스크톱 바코드 및 QR 코드 스캐너를 개발하는 단계



    응용 프로그램을 처음부터 빌드해 보겠습니다.

    1단계: Windows Forms 앱 만들기:



    터미널에서 다음 명령을 통해 새 프로젝트를 빠르게 생성하고 종속성을 설치할 수 있습니다.

    dotnet new winforms -o desktop-barcode-qrcode-scanner
    cd desktop-barcode-qrcode-scanner
    dotnet add package OpenCvSharp4.Windows
    dotnet add package OpenCvSharp4.Extensions
    dotnet add package BarcodeQRCodeSDK
    


    그런 다음 Form1.cs 파일에서 관련 네임스페이스 및 클래스를 가져옵니다.

    using Dynamsoft;
    using Result = Dynamsoft.BarcodeQRCodeReader.Result;
    using OpenCvSharp;
    using OpenCvSharp.Extensions;
    


    생성자에서 BarcodeQRCodeReaderVideoCapture 인스턴스를 초기화합니다. 30-day trial license을 신청하여 바코드 SDK를 활성화할 수 있습니다.

    public Form1()
    {
        InitializeComponent();
        BarcodeQRCodeReader.InitLicense("DLS2eyJoYW5kc2hha2VDb2RlIjoiMjAwMDAxLTE2NDk4Mjk3OTI2MzUiLCJvcmdhbml6YXRpb25JRCI6IjIwMDAwMSIsInNlc3Npb25QYXNzd29yZCI6IndTcGR6Vm05WDJrcEQ5YUoifQ=="); // Get a license key from https://www.dynamsoft.com/customer/license/trialLicense?product=dbr
        reader = BarcodeQRCodeReader.Create();
        capture = new VideoCapture(0);
    }
    


    2단계: UI 구성 요소 추가



    양식 디자이너에 PictureBoxButton를 추가합니다. PictureBox는 카메라 비디오 스트림을 표시하는 데 사용되며 Button는 비디오 프레임에서 바코드 및 QR 코드 스캔을 시작 및 중지하는 데 사용됩니다. Visual Studio Code 를 사용하는 경우 Form1.Designer.cs 에 구성 요소를 수동으로 추가해야 합니다. 반면 Visual Studio 를 사용하는 경우 도구 상자에서 양식으로 구성 요소를 끌 수 있습니다.

    this.pictureBox1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
    this.pictureBox1.Location = new System.Drawing.Point(13, 12);
    this.pictureBox1.Margin = new System.Windows.Forms.Padding(4);
    this.pictureBox1.Name = "pictureBox1";
    this.pictureBox1.Size = new System.Drawing.Size(640, 640);
    this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom;
    this.pictureBox1.TabIndex = 0;
    this.pictureBox1.TabStop = false;
    
    this.button1.AllowDrop = true;
    this.button1.AutoEllipsis = true;
    this.button1.Font = new System.Drawing.Font("Microsoft Sans Serif", 20.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
    this.button1.Location = new System.Drawing.Point(667, 12);
    this.button1.Margin = new System.Windows.Forms.Padding(4);
    this.button1.Name = "button1";
    this.button1.Size = new System.Drawing.Size(333, 79);
    this.button1.TabIndex = 1;
    this.button1.Text = "Camera Scan";
    this.button1.UseVisualStyleBackColor = true;
    this.button1.Click += new System.EventHandler(this.button_Click);
    


    버튼 클릭 이벤트 핸들러는 다음과 같이 구현됩니다.

    private void button_Click(object sender, EventArgs e)
    {
        if (!capture.IsOpened())
        {
            MessageBox.Show("Failed to open video stream or file");
            return;
        }
    
        if (button2.Text == "Camera Scan")
        {
            StartScan();
        }
        else {
            StopScan();
        }
    }
    


    3단계: PictureBox에 카메라 비디오 스트림 표시



    UI 스레드 차단을 방지하기 위해 백그라운드 스레드에서 비디오 스트림을 캡처합니다. 캡처된 이미지의 유형은 Mat 이며 PictureBox에 직접 전달할 수 없습니다. 따라서 BitmapConverter를 사용하여 MatBitmap로 변환합니다.

    private void StartScan() {
        button2.Text = "Stop";
        isCapturing = true;
        thread = new Thread(new ThreadStart(FrameCallback));
        thread.Start();
    }
    
    private void StopScan() {
        button2.Text = "Camera Scan";
        isCapturing = false;
        if (thread != null) thread.Join();
    }
    
    private void FrameCallback() {
        while (isCapturing) {
            Mat frame = new Mat();
            capture.Read(frame);
            pictureBox1.Image = BitmapConverter.ToBitmap(frame);
        }
    }
    


    4단계: 카메라 비디오 스트림에서 바코드 및 QR 코드 디코딩



    다음은 Mat에서 바코드 및 QR 코드를 디코딩하는 데 사용되는 코드입니다.

    Result[]? results = reader.DecodeBuffer(mat.Data, mat.Cols, mat.Rows, (int)mat.Step(), BarcodeQRCodeReader.ImagePixelFormat.IPF_RGB_888);
    


    결과를 얻으면 이미지에 텍스트와 윤곽선을 그립니다.

    private Bitmap DecodeMat(Mat mat)
    {
        Result[]? results = reader.DecodeBuffer(mat.Data, mat.Cols, mat.Rows, (int)mat.Step(), BarcodeQRCodeReader.ImagePixelFormat.IPF_RGB_888);
        if (results != null)
        {
            foreach (Result result in results)
            {
                string output = "Text: " + result.Text + Environment.NewLine + "Format: " + result.Format1 + Environment.NewLine;
                textBox1.AppendText(output);
                textBox1.AppendText(Environment.NewLine);
                int[]? points = result.Points;
                if (points != null)
                {
                    OpenCvSharp.Point[] all = new OpenCvSharp.Point[4];
                    int xMin = points[0], yMax = points[1];
                    all[0] = new OpenCvSharp.Point(xMin, yMax);
                    for (int i = 2; i < 7; i += 2)
                    {
                        int x = points[i];
                        int y = points[i + 1];
                        OpenCvSharp.Point p = new OpenCvSharp.Point(x, y);
                        xMin = x < xMin ? x : xMin;
                        yMax = y > yMax ? y : yMax;
                        all[i / 2] = p;
                    }
                    OpenCvSharp.Point[][] contours = new OpenCvSharp.Point[][] { all };
                    Cv2.DrawContours(mat, contours, 0, new Scalar(0, 0, 255), 2);
                    if (result.Text != null) Cv2.PutText(mat, result.Text, new OpenCvSharp.Point(xMin, yMax), HersheyFonts.HersheySimplex, 1, new Scalar(0, 0, 255), 2);
                }
            }
        }
        else
        {
            textBox1.AppendText("No barcode detected!" + Environment.NewLine);
        }
    
        Bitmap bitmap = BitmapConverter.ToBitmap(mat);
        return bitmap;
    }
    


    바코드 및 QR 코드 결과를 표시하려면 다음 행을 업데이트하십시오.

    - pictureBox1.Image = BitmapConverter.ToBitmap(frame);
    + pictureBox1.Image = DecodeMat(mat);
    


    이제 프로그램을 실행하여 바코드 및 QR 코드를 스캔할 수 있습니다.

    dotnet run
    




    소스 코드



    https://github.com/yushulx/dotnet-barcode-qr-code-sdk/tree/main/example/desktop-gui

    Subversion으로 소스 코드 다운로드:

    svn checkout https://github.com/yushulx/dotnet-barcode-qr-code-sdk/trunk/example/desktop-gui
    

    좋은 웹페이지 즐겨찾기