C#中輕鬆實現二維碼和條形碼識別:OpenCvSharp和ZXing詳細教程

架构师老卢發表於2024-03-08
C#中輕鬆實現二維碼和條形碼識別:OpenCvSharp和ZXing詳細教程

概述:本教程使用OpenCvSharp和ZXing庫,詳細介紹了在C#中識別二維碼和條形碼的步驟。透過匯入必要的名稱空間、載入影像,並使用ZXing庫進行二維碼和條形碼的識別,提供了清晰的示例程式碼。這方便了開發人員在專案中整合二維碼和條形碼識別功能。

要使用OpenCvSharp來分別識別二維碼和條形碼,首先需要確保已經安裝了OpenCvSharp庫。你可以透過以下步驟在C#中使用OpenCvSharp來實現這兩種識別。

步驟 1:安裝 OpenCvSharp

在 Visual Studio 中,透過 NuGet 包管理器安裝 OpenCvSharp。右擊專案 -> NuGet 包管理器 -> 管理 NuGet 包,搜尋 OpenCvSharp 並安裝。

步驟 2:匯入必要的名稱空間

在程式碼檔案的開頭,匯入必要的名稱空間。

using OpenCvSharp;
using OpenCvSharp.Extensions;
using ZXing;

步驟 3:載入影像

載入包含二維碼或條形碼的影像。

Mat image = new Mat("path_to_your_image.jpg");

步驟 4:二維碼識別

使用 ZXing 庫來識別二維碼。

        /// <summary>
        /// 只識別二維碼
        /// </summary>
        static void DecodeQRCodes()
        {
            var img = Cv2.ImRead("2.jpg");
            string[] qrCodeTexts = null;
            //二維碼識別
            using (QRCodeDetector qRCodeDetector = new QRCodeDetector())
            {
                Point2f[] points;
                var hasQRCode = qRCodeDetector.DetectMulti(img, out points);
                if (hasQRCode)
                {
                    qRCodeDetector.DecodeMulti(img, points, out qrCodeTexts);
                }
            }

            if (qrCodeTexts != null)
            {
                Console.WriteLine($"檢測到{qrCodeTexts.Length}個二維碼:");
                for (int i = 0; i < qrCodeTexts.Length; i++)
                {
                    Console.WriteLine($"第{(i + 1)}個的內容為:{qrCodeTexts[i]}");
                }
            }
        }

步驟 5:條形碼識別

使用 ZXing 庫來識別條形碼。

        /// <summary>
        /// 識別條碼(也可以識別二維碼)
        /// </summary>
        static void DecodeBarCodes()
        {
            // 讀取影像
            var img = Cv2.ImRead("1.jpg");

            BarcodeReader barcodeReader = new BarcodeReader
            {
                Options = new DecodingOptions
                {
                    TryHarder = true,
                    PossibleFormats = new[]
                    {
                        BarcodeFormat.CODE_128,
                        BarcodeFormat.QR_CODE,//這個是二維碼
                        BarcodeFormat.EAN_13,
                        BarcodeFormat.EAN_8,
                        BarcodeFormat.CODE_39,
                        BarcodeFormat.CODE_93
                    }
                },
                AutoRotate = true,
            };

            // 進行條形碼解碼
            var barcodes = barcodeReader.DecodeMultiple(img);

            if (barcodes != null)
            {
                Console.WriteLine($"檢測到{barcodes.Length}個條碼:");
                for (int i = 0; i < barcodes.Length; i++)
                {
                    Console.WriteLine($"第{(i + 1)}個的內容為:{barcodes[i].Text},格式為:{barcodes[i].BarcodeFormat}");
                }
            }
        }

示例程式碼

下面是完整的示例程式碼,其中包括了載入影像、二維碼識別和條形碼識別的步驟:

using System;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using ZXing;

class Program
{
        static void Main()
        {
            Action action = () =>
            {
                DecodeQRCodes();
            };

            Action action2 = () =>
            {
                DecodeBarCodes();
            };

            long executionTime_qrcode = action.GetExecutionTimer();

            Console.WriteLine();

            long executionTime_barcode = action2.GetExecutionTimer();

            Console.WriteLine();
            Console.WriteLine($"識別二維碼用時{executionTime_qrcode}毫秒,條件用時{executionTime_barcode}毫秒");
            Console.ReadKey();
        }
}

執行效果:

C#中輕鬆實現二維碼和條形碼識別:OpenCvSharp和ZXing詳細教程

請注意,示例中的路徑 "path_to_your_image.jpg" 應替換為你實際影像檔案的路徑。此外,確保影像中包含有效的二維碼或條形碼。

相關文章