DSB18: Barcode erzeugen und lesen
Autor: Tobias Brandt
Betreuer: Prof. Schneider
Motivation
Barcodes begleiten unseren Alltag bereits seid Jahrzehnten. Sie codieren Preise im Einzelhandel, ermöglichen das Verfolgen von Briefen und Paketen oder sind als Teil der Stempelkarte Teil der Zeiterfassung in der Industrie. Doch wie werden Barcodes erzeugt und gelesen? Dieser Artikel soll einen kurzen Einblick in die Notation, die Erstellung und das letzlich das Lesen des speziellen CODE39 geben. Integration des Programms erfolgt in Matlab.
Aufgabenstellung
Erzeugen Sie ein Matlab Executable, welches ein Barcode erzeugt. Mit einer Webcam soll ein beliebiger Barcode auf einem Dokument unabhängig von Position und Lage eingescannt werden können.
Prinzip Code39
Der Code 39 ist ein diskreter Code mit variabler Codelänge (Wenn mehr Zeichen dargestllt werden sollen, verlängert sich auch der Code). Der Code wurde 1973 erfunden und war somit der erste alphanumerische Barcode. Im Grundsatz besteht der barcode aus weißen und schwarzen Strichen.
Der Name ("Code 3 of 9") geht auf die Struktur der Kodierung zurück. Dabei werden die Zeichen der zu kodierenden Nachricht durch 9 schwarze und weiße Balken repräsentiert. Drei dieser Balken sind breit und der rest schmal. Jeder Block, dieser ein Zeichen darstellt, besteht aus 5 Strichen und 4 Lücken. Getrennt sind die Blöcke durch eine schmale weiße Lücke. Eine nachricht im Code39 beginnt und endet jeweils mit einem Sternchen '*'. Dies wird auch als Start-oder Stoppzeichen bezeichnet.
Der Standartcode verfügt über keine Prüfziffern und kann folgende Zeichen darstellen:
0123456789[Space]ABCDEFGHIJKLMNOPQRSTUVWXYZ-.$/+%
Die Kodierung der einzelnen Zeichen ist in der rechts abgebildeten Zeichentabelle festgelegt.
In der Folgenden Auflistung werden die Vor-und Nachteile Stichpunktartig aufgeführt:
Vorteile:
- große Lesesicherheit
- sehr weit verbreitet
- einfach in der Produktion
Nachteile:
- geringe Code Dichte
- keine Prüfsumme
Implementierung Barcode erstellen
Um einen Barcode zu erstellen wird zunächst die erforderliche Höhe und Breite des Bilds was benötigt wird berechnet. Danach wird als Grundlage ein weißes Bild als JPG erstellt.
function barcode_erstellen (eingabe,s_element,b_element)
%%Funktionsbeschreibung
%--------------------------------------------------------------------------
% Programmname: barcode_erstellen(eingabe,s_element,b_breite)
% Version: 1.0.0
% Datum: 12.05.2018
% Beschreibung: Das Programm erstellt einen 1D Barcode in CODE39 Format
%
% Autor: Tobias Brandt
%
% INPUT: eingabe: Zeichen die in einen Code39 umgewandelt werden
% sollen. (Nur Großbuchstaben, Zahlen und
% Sonderzeichen '-';'.';' ';'$';'+';'%')
% s_element: Dicke eines schmalen Elments in Pixel
% b_element: Dicke eines breiten Elements in Pixel
%
% Die Relation von Höhe und Breite muss 1:2 sein.
%
% OUTPUT: Das Programm erstellt einen Bracode mit den
% eingegebenen Daten als .jpg.
% Der Code beginnt und endet jeweils mit einem *
%
% Beispiel: barcode_erstellen('HSHL',10,20)
%
%
%--------------------------------------------------------------------------
%% Leeres Bild erzeuegen
% Länge des Barcode in Pixel bestimmen
%(length(eingabe)+2)=Anzahl der Zeichen, wegen 2x Sterne
%*(6*schmal+3*breit) wegen 3 schmalen Strichen, 3schmalen Lücken, 2 breite Striche, 1 breiten Lücke
%((length(eingabe)+1))= Anzahl der Lücken
Laenge = ((length(eingabe)+2)*(6*s_element+3*b_element))+((length(eingabe)+1)*s_element);
% Höhe des Barcodes damit evtl. noch Platz ist für einen Text
Hoehe = 10*b_element;
Breite= b_element*6 + Hoehe;
% Schwarzes Bild erzeugen
Barcode = zeros(Breite,Laenge,3);
% schwarzes Bild zu weiß konvertieren
for k=1:3
for i=1:Breite
for j=1:Laenge+(4*b_element+s_element)
Barcode(i,j,k)=255;
end
end
end
Hier nach wird als Anfangszeichen ein Sternchen gezeichnet. Das bilden der Striche übernehmen hierfür extra angelegte Funktionen. Darauf folgen abfragen welches Zeichen codiert werden muss. dementsprechen werden die Funktionen um Striche und Lücken zu bilden aufgerufen. Aus Gründen der Übersichtlichkeit wird nur die Abfrage für den Buchstaben A dargestellt.
% "*" als erstes Zeichen einfügen
%Startzeichen "*" einfügen
[xkoordinate,Barcode] = breit_luecke(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = breit_luecke(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = breit_luecke(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = breit_strich(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode,] = breit_strich(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
for i=1:length(eingabe)
%Bei Eingabe von A wird der Code generiert
if eingabe(i) == 'A'
[xkoordinate,Barcode] = breit_strich(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = breit_luecke(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_strich(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
[xkoordinate,Barcode] = breit_strich(xkoordinate,Barcode,b_element,Hoehe);
[xkoordinate,Barcode] = schmal_luecke(xkoordinate,Barcode,s_element,Hoehe);
end
Anschließend wird der Barcode abgespeichert und angezeigt
%% Dateiname erstellen
a{1} = eingabe;
a{2} = '.JPG';
Dateiname = [a{1} a{2}];
%% Barcode speichern
imwrite(Barcode,Dateiname)
Ausgabetext=['Erstellen und Speichern von ',Dateiname,' fertig gestellt'];
disp('-----------------------------------------------------------')
disp(Ausgabetext)
disp('-----------------------------------------------------------')
%%Barcode anzeigen
imshow(Barcode);
end
Implementierung Barcode lesen
Verwendete Geräte
Für das Einlesen des Barcodes wurde die Webcam Logitec HD Webcam C310 verwendet. Die Videoauflösung beträgt 1.280 x 720 Pixel.
Beispielbilder
Folgende Bilder wurden mit dem Programm Barcode_erstellen erstellt.
-
(1)*HSHL*
-
(2)*TEST*
-
(3)*123456789*
-
(4)*ABCDEFGHIJKLMNOPQRSTUVWXYZ*
Für das Einlesen der Barcodes wurden diese ausgedruckt und teilweise mit Störungen versehen. Im folgenden sind einige davon dargestellt. Es wird immer der HSHL Barcode dargestellt. Die Störungen sind unter den Bildern beschrieben.
-
(1) original
-
(2) Text oben und unten
-
(3) Objekte rings herum
-
(4) Striche durch den Code
Anforderungen
- Arbeiten Sie sich in die Erstellung von Barcodes ein.
- Erzeugen Sie ein Matlab Executable, welches aus einen Barcode erzeugt.
- Lesen Sie mit Matlab über eine Webcam diesen Barcode ein, so dass die dahinterliegenden Daten angezeigt werden.
- Wissenschaftliche Dokumentation als HSHL-Wiki Artikel
- Softwareentwicklung nach SDE Standard in SVN
- Funktionsnachweis als YouTube-Video (vgl. Veranstaltungsregeln)
Youtube Video
Weblinks
- Wikipedia: Strichcode
- Barcodes for Mobile Devices
- Steffen Schulze Middendorf: Barcode erzeugen und lesen
- Mobile Tagging
- A New Method for Bar Code Localization and Recognition
- Barcode recognition
- Barcode Recognition Using Live Video Acquisition
- Universal Product Code - UPC
- Barcode Recognition
- YouTube: How Barcodes Work
Literatur
- Bernhard Lenk: Handbuch der automatischen Identifikation. Band 1-3: 2D-Codes, Matrixcodes, Stapelcodes, Composite Codes, Dotcodes. Lenk Monika Fachbuchverlag, Kirchheim unter Teck 2002, ISBN 978-3-935551-01-4.
- ten Hompel, M., u.A.: Identifikationssysteme und Automatisierung. Heidelberg: Springer, 2008. ISBN 978-3-540-75880-8
BSD-Lizenzbedingung BSD-Lizenz
Copyright (c) 2018, Hochschule Hamm-Lippstadt, Dep. Lip. 1, Prof. Schneider
Hochschule Hamm-Lippstadt. Alle Rechte vorbehalten.
→ zurück zum Hauptartikel: Digitale Signal- und Bildverarbeitung SoSe2018