Распознавание 2D штрих-кодов с пространственными искажениями в .NET

Категория: Штрих-коды.NET

6 мая 2020

VintaSoft Barcode .NET SDK может быть использован в .NET/C# приложении для распознавания двумерных штрих-кодов Aztec, QR и Han Xin Code с произвольными гладкими искажениями. На практике это означает существенное облегчение распознавания штрих-кодов, которые получены с фотоаппарата, веб-камеры или камеры смартфона. Теперь не нужно точно выравнивать штрих-код относительно камеры, а также возможно распознавание штрих-кода с неровных поверхностей.

Штрих-код Aztec с пространственными искажениями


Используя веб-камеры и фотоаппараты наши разработчики провели много увлекательных часов совершенствуя алгоритмы коррекции искажений. Предлагаю посмотреть на такие штрих-коды "глазами" нашего распознавателя штрих-кодов:

Вид на 2D матричный штрих-код с пространственными искажениями 'глазами' распознавателя штрихкодов VintaSoft Barcode .NET SDK

С некоторого момента и наши разработчики начали видеть штрих-коды именно так. :)


Вот C# код, который позволяет распознавать Aztec, QR и Han Xin Code штрих-коды с пространственными искажениями:
/// <summary>
/// Распознает 2D матричные штрих-коды (Aztec, QR Code и Han Xin Code) с пространственными изображениями.
/// </summary>
public void Recognize2dBarcodeWithSpatialDistortions()
{
    // создать распознаватель штрих-кодов
    using (Vintasoft.Barcode.BarcodeReader reader = new Vintasoft.Barcode.BarcodeReader())
    {
        // указать, что распознаватель должен искать штрих-коды Aztec, QR и Han Xin Code
        reader.Settings.ScanBarcodeTypes = Vintasoft.Barcode.BarcodeType.Aztec |
            Vintasoft.Barcode.BarcodeType.QR |
            Vintasoft.Barcode.BarcodeType.HanXinCode;

        // указать, что распознаватель должен искать только горизонтальные и вертикальные штрих-коды
        reader.Settings.ScanDirection = Vintasoft.Barcode.ScanDirection.Horizontal | Vintasoft.Barcode.ScanDirection.Vertical;

        // распознать штрих-коды в изображении
        Vintasoft.Barcode.IBarcodeInfo[] barcodeInfos = reader.ReadBarcodes("barcodes.png");

        // если штрих-коды не обнаружены
        if (barcodeInfos.Length == 0)
        {
            System.Console.WriteLine("Barcodes are not found.");
        }
        // если штрих-коды обнаружены
        else
        {
            // получить информацию о распознанных штрих-кодах

            System.Console.WriteLine(string.Format("{0} barcode(s) found:", barcodeInfos.Length));
            System.Console.WriteLine();
            for (int i = 0; i &lt; barcodeInfos.Length; i++)
            {
                Vintasoft.Barcode.IBarcodeInfo barcodeInfo = barcodeInfos[i];
                System.Console.WriteLine(string.Format("[{0}:{1}]", i + 1, barcodeInfo.BarcodeType));
                System.Console.WriteLine(string.Format("Value:      {0}", barcodeInfo.Value));
                System.Console.WriteLine(string.Format("Region:     {0}", barcodeInfo.Region));
                System.Console.WriteLine();
            }
        }
    }
}


Тесты показали что распознаватель успешно справляется с одним, а также сразу с несколькими типами искажений:

Вот несколько изображений с искаженными штрих-кодами, которые могут быть распознаны с помощью SDK:
Штрих-код Aztec с пространственными искажениями

Штрих-код Aztec с пространственными искажениями

Штрих-код Han Xin Code с пространственными искажениями

Штрих-код Han Xin Code с пространственными искажениями

Штрих-код QR с пространственными искажениями

Штрих-код QR с пространственными искажениями


Изображения с реальными примерами искажений также можно посмотреть в дистрибутиве VintaSoft Barcode .NET SDK.

Если у Вас возникли проблемы связанные с распознаванием штрих-кодов, присылайте свои тестовые изображения нам для анализа на электронную почту support@vintasoft.com и мы обязательно постараемся улучшить алгоритм распознавания штрих-кодов.