Потопете се в матрицата: Структурен анализ и техники за разпознаване на QR код

Съдържанието на статията

Вездесъщият баркод вече не е изненадващ. В реалния живот представянето на информация под формата на поредица от черно-бели ивици стана толкова разпространено, колкото стана закупуването на продукт в супермаркет. Информацията за даден продукт (държава на произход, директно производител на стоките, вид стоки и т.н.) се кодира, за да се опрости по-нататъшното му извличане чрез автоматизирани средства. Точно за това е подходящ баркод, който поради своята линейна структура е добре четим в хоризонтална посока.

За да не се получи в крайна сметка „бъркотия“ от дефинициите, предлагам да се придържате към общата класификация на методите за кодиране на информация. Както бе споменато в началото, има два фундаментално различни типа кодиране:

  1. Линейна (едномерна). Най-често срещаният представител - (популярно наричан "баркод").
  2. Двуизмерни. На свой ред тя се разделя на:
    1. многостепенна (подредена);
    2. матрица.

Ние не се интересуваме от многостепенни кодове, тъй като те са просто „многослоен“ линеен код. На свой ред матричните кодирания „опаковат“ информация както хоризонтално, така и вертикално, което ви позволява радикално да увеличите обема на съхраняваните данни и съответно да премахнете ограниченията върху техния тип - сега става възможно кодирането на текстови данни.

От цялото разнообразие от матрични кодове, ние се интересуваме от QR кода. Неговата повсеместност (само Япония използва тези кодирания с такава завидна популярност, като например ние използваме табели, указващи името на улицата и номера на къщата) се дължи главно на високата степен на разпознаване и, като следствие, на простотата на разпознаването оборудване. Между другото, съкращението QR е получено от английския. „Бърза реакция“, което в превод на страхотен и мощен означава „бърза реакция“.

Xakep Online: https://xakep.ru

Какво да направите с получената информация (следвайте връзката към уеб ресурс, запазете връзката в бележки или контакти и т.н.), вие решавате сами.

Повечето от софтуера са свободно достъпни и безплатни, но малко разработчици споделят изходния код на своя софтуер. Може би този факт се дължи на липсата на интерес на крайния потребител, а може би производителят не иска да разкрие подробностите за алгоритъма за разпознаване. По един или друг начин, ние ще разберем самостоятелно подробностите за разпознаване на QR код програмно, като напишем пълноценно приложение, което в буквалния смисъл ще ни позволи да получим съдържащата се в него текстова информация от снимката.

Инструменти за готвене

Ще разработим приложението за платформата .NET в C #. Изборът на този набор от инструменти се основава не само на удобството и скоростта на разработване на приложения, но и на получаването на резултат от много платформи. По дефиниция проект, компилиран за .NET Framework, е снабден с междуплатформени свойства поради редица функции. Освен това, ако компилираме получения проект с поддръжка на средата .NET Compact Framework, получаваме приложение с висока производителност, специално пригодено за работа на мобилни платформи. Посочената съвместимост без допълнителни разходи за труд се обяснява със следната функция: Microsoft .NET Compact Framework е донякъде премахната версия на .NET Framework, поради което в повечето случаи разработчикът на приложения за мобилни устройства не се нуждае от допълнителни стъпки с изходни кодове за прехвърляне на функционалност към настолни платформи.

Въпреки че всичко е почти очевидно с избора на инструмента за създаване на софтуер, ситуацията с инструментите за манипулиране на QR кода е малко по-сложна. В .NET Framework няма „местни“ инструменти за работа с матрични кодировки.

В процеса на търсене на библиотеки на трети страни за работа с матрични кодове попаднах на уеб ресурс на източна компания, занимаваща се с професионална работа с изображения и обработка на баркодове (двуизмерни кодове, които включват и QR). Разработчиците на компанията любезно споделят резултатите от своите дейности под формата на демо версии на компоненти за кодиране/декодиране на редица двуизмерни представители на баркод с посетителите. SDK е достъпен за изтегляне и съдържа библиотеки за различни платформи: Windows, * NIX, Windows Mobile, Symbian и iPhone (Mac OS). За платформата на Windows, която ни интересува, както и за Windows Mobile, SDK се предоставя заедно с динамична библиотека (.dll), което го прави лесен за използване в проекти на .NET/VC/VB. В допълнение към манипулирането на QRCode, библиотеката може да работи и с DataMatrix и PDF417. Така че, ако имате желание да разширите хоризонтите си и да играете с други видове кодиране, тогава всички действия, описани по-долу, обикновено са подходящи за посочените кодировки.

Анализирайте матрицата

Нека да разгледаме общата структура на приложение, което трябва да декодира QR код. Първата и може би най-голямата част от изходния код е заета от описанието на основния програмен клас: дефиниция на константи, структурни раздели, раздели за описване на функции, предоставени от библиотека на трети страни. Представянето на първоначалните данни под формата на картина е описано от структурата PTIMAGE.

Структура, описваща параметрите на изображението

небезопасна публична структура PTIMAGE
public int dwWidth; // ширина на изображението в пиксели
public int dwHeight; // височина на изображението в пиксели
публичен байт * pBits; // указател към данни за изображението на източника
публичен байт * pPalette; // указател към данните за палитрата с изображения (1,4,8 бита)
публичен кратък wBitsPerPixel; // брой битове на пиксел
>

SDK поддържа повечето формати на графични файлове. Като се има предвид факта, че повечето камери експортират изображения в най-често срещаните формати, не би трябвало да има проблеми с несъвместимостта. Следва раздел, описващ функциите, които експортират библиотеките, включени в SDK. Няма да се фокусираме върху тяхната връзка.

Следващата стъпка е да се опишат параметрите на библиотеката за декодиране на баркод в структурата PTDECODEPARA:

Структурата PTDECODEPARA се използва за определяне на параметри при декодиране на баркод върху изображение

публична опасна структура PTDECODEPARA
public int dwStartX; // начало на координата X в пиксели
в полето за търсене на изображения за декодиране
публичен int dwStartY;
публичен int dwEndX;
публичен int dwEndY;
public int dwMaxCount; // максимален брой знаци за търсене; ако стойността е 0, тогава търсим всички знаци
>;

Чрез манипулиране на стойността на променливата dwMaxCount, ние получаваме възможността да контролираме производителността на приложението, като фокусираме нашия „декодер“ върху специфични области на оригиналното изображение и избягваме празен ход. Следващата структура се попълва веднага след определяне на областта на изображението, в която се намира баркодът:

След декодирането структурата PTBARCODEINFO съдържа баркод с информация

публична опасна структура PTBARCODEINFO
/координати на четирите ъгъла на баркода в пиксели/
публичен int dwX1, dwY1;
публичен int dwX2, dwY2;
публичен int dwX3, dwY3;
публичен int dwX4, dwY4;
публичен байт * pData; // указател към буфера, който съдържа данните от баркода
публичен int dwDataLen; // дължина на данните (в байтове) на баркода
>;

Ако се вгледате внимателно в картината с QR кода, веднага ще забележите три изпъкнали квадратни области - това са ориентири за инструменти за разпознаване, един вид „указател“ към програмата, който наред с други неща, набор от пиксели в картината съдържа QR код.

Основната функция на нашето приложение е проста до позор, така че няма да го даваме изцяло, а ще се съсредоточим върху следните инструкции:

static void Main (низ [] аргументи)
PtQRDecodeRegister ("12345678901234567890"); // използване на ключа за демо версия
PtInitImage (реф. Изображение); // инициализиране на структурата на изображението
...
if (OpenFileDlg.FileName! = ")
FileName = OpenFileDlg.FileName;
DecodeQR ();
>
...
>

Както вече разбрахте, самият процес на разпознаване е скрит в инструкциите на функцията DecodeQR (), която, след като дефинира областта на QR кода, изпраща инструкции на манипулатора на баркод и той от своя страна показва на потребителя информацията, съдържаща се в картината:

статична частна празнота DecodeQR ()
...
/ ако операциите по зареждане и дефиниране на изображения
наличието на баркод в него успешно/
if (PtLoadImage (FileName, ref image, 0) ==
PT_IMAGERW_SUCCESS)
if (PtQRDecode (ref image, ref DecodePara,
ref BarCodeInfo)! = PT_QRDECODE_SUCCESS)
MessageBox.Show ("Възникна грешка при рокогниция");
друго
ShowBarCodeInfo (ref BarCodeInfo); // предаване на получената структура на функцията манипулатор
>
...
>
// описание на функцията манипулатор, която връща низ от QR код
статична обществена опасна празнота ShowBarCodeInfo (
ref PTTOTALBARCODEINFO BarCodeInfo)
if (BarCodeInfo.dwTotalCount

Изглежда резултатът е постигнат. Лесният „краш тест“ на полученото приложение даде възможност да се идентифицират неговите силни и слаби страни.

  • процесът на разпознаване не зависи от позицията на QR кода на снимката;
  • процесът на разпознаване не зависи от степента на завъртане на QR кода и неговия мащаб.

С разпознаването на кодове в 3D обаче всичко е малко по-лошо: изкривяването в пропорциите на QR кода може да повлияе отрицателно на качеството на определяне на съдържанието му.

Като цяло можем да кажем, че тази библиотека предоставя на разработчика широки възможности за работа с матрични кодове. Той има вградени инструменти за коригиране на грешки и възстановяване на повредени области на оригиналните изображения, а възможността за промяна на параметрите за точност на разпознаване позволява на програмиста да намери златната среда в тандема на параметрите за производителност/ефективност.

Перспектива .Decode ()

Или вижте разписанието за преминаване на градския транспорт, което съдържа „полезна картина“. Алтернативно кодиране на информация може да бъде полезно в неща, които имат стеганографски произход. Например QR код може да бъде скрит в някакво изображение и да обхожда, когато е обезцветен. Е, информацията, която се появява, когато бъде разпозната, разбира се, ще бъде криптирана. Тъй като стеганографията е добра, комбинирането й с криптография е по-добро.