SigSys16 Einkaufsausgaben Tracking

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen

Autor: Theresa Wunsch | Anna Neuhaus

Betreuer: Prof. Schneider

Projekt Rechnungsbetrag einlesen
Datei:Kassenzettel1.png
Projekt Rechnungsbetrag Beispiele

Motivation

Im alltäglichen Leben, besonders als Student, möchte man den Überblick über seine Finanzen wahren. Ein manuelles Erfassen, jeder einzelnen Ausgabe, in einer Excel Tabelle, führt jedoch zu erhöhten Zeitaufwand. Mittels Bildverarbeitung soll erreicht werden, dass ein Kassenbeleg abfotografiert werden kann und die Summe direkt in eine Excel-Tabelle übernommen wird. So ist es möglich seine Finanzen, mit geringem Zeitaufwand, auf einfache Art und Weise einzulesen und genau zu überblicken.


Ziel

Ziel ist es ein Programm zu schreiben, dass den Rechnungsbetrag, von einem abfotografierten Kassenzettel, einließt und in eine Excel Tabelle überträgt.


Aufgabe

  1. Erkennen eines Kassenzettels und dessen Endbetrag mit Hilfe einer Kamera
  2. Einlesen der .png-Datei in Matlab
  3. Auslesen der .png-Datei und weiterleiten der Datei, aus den definierten Bereichen, in eine Excel-Datei


Model

Model Rechnungsbetrag erfassen

Als Kunde erhält man nach einem Einkauf einen Kassenzettel mit allen Positionen. Relevant für eine Ausgabenübersicht ist nur der Endbetrag. Der Kunde fotografiert deshalb den Endbetrag ab. Die entstandene Bilddatei wird über eine Namenskonvention in Matlab eingelesen. Mittels des in Kapitel 6 beschriebenen Programms werden die Daten der Bilddatei verarbeitet und der Betrag in eine .exe Datei mit dem aktuellen Datum eingetragen. Existiert bisher keine .exe-Datei wird diese mit entsprechender Spaltenbeschriftung automatisch durch das Programm angelegt. Um dies zu überprüfen wird die Datei zu Anfang nur mit Leseberechtigung geöffnet, wieder geschlossen und erneut mit Schreibberechtigung geöffnet.


Lösung

Schrittweises Vorgehen

Schritt 1

Programm Parameter festlegen

Schritt 2

Bild mit Betrag aufrufen und laden

Schritt 3

OCR auf das Bild ausführen

Schritt 4

Die Zeichenkette mit dem Betrag einlesen.

Schritt 5

Die Zeichenkette wird in zwei Teile geteilt. Teil 1 , Teil 2. Da Matlab nicht direkt Dezimalzahlen einlesen kann.

Die einzelnen Zeichenketten (Teil 1 und 2) werden in eine Fließkommazahl umgewandelt.

Schritt 6

Daten in eine CSV-Datei eintragen.

Schritt 7

Die Datei mit einer Lese-Berechtigung öffnen, um zu prüfen ob die Datei vorhanden ist.

Schritt 8

Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.

Schritt 9

Wenn die Datei nicht vorhanden ist: Neue Datei erstellen und die Spalten (Datum, leere Spalte für Kommentare, Betrag) in die Exceldatei eintragen.

Schritt 10

Datei mit Schreib-Berechtigung öffnen.

Schritt 11

Daten in die CSV Datei schreiben.

Schritt 12

Programm abschließen.


Benötigte Matlab-Befehle

  • Befehr imread

Die Funktion imread ermöglicht es Daten aus einer Grafikdatei in MATLAB zu importieren. Einlesen von Pixelgrafiken aus Bilddateien. A = imread (filename,fmt) liest Pixelgrafiken aus der Datei „filename“ mit dem Format „fmt“ ein. Unterstützte Formate sind bmp, cur, gif, hdf, ico, jpg, jpeg, pbm, pcx, pgm, png, pnm, ppm, ras, tif, tiff, xwd. [7]

  • Befehr ocr

Mittels Zeichenerkennung kann ein Text in der eingelesenen Grafikdatei erkannt und verarbeitet werden.

  • Befehl result.words

Results.words definiert die genaue Position eines bestimmten Textes auf der Bild-Datei.

  • Befehl strsplit

Mittels dieser Funktion kann eine Zeichenkette in einzelne Zeichenketten geteilt werden

  • Befehl str2double

Wandelt den „string“ (Text) in eine Darstellung mit double-Genauigkeit (16 BIT Zahl). Der „string“ kann Ziffern, Tausender-Trennzeichen, Komma, ein Vorzeichen.

  • Befehl num2str

Wandelt eine Nummer in einen String um. Also in einen Text bzw. eine Zeichenkette.

  • Befehl cellstr

Wandelt einen Array (Vektor) in einen Zellen-Vektor. Jede Zeile vom Array wird eine Zelle im Zellen-Vektor.

  • Befehl fprintf

Schreibt formatierte Daten in eine Datei. fprintf (fid, format, A, …) „fid“ kennzeichnet die Datei, „formate“ gibt die Formatvorschrift für die Ausgabe wieder und „A“ ist die zu schreibende Matrix. [7]

Matlab-Programm (Durchführung)

Der Quelltext der oben beschriebenen Schritte ist im folgenden abgebildet:

Schritt 1

%Bilddatei
bildDatei = 'betrag.png';
%Exceldatei
ExcelDateiname = 'Rechnungen.csv';

Schritt 2

%Bild mit Betrag aufrufen und laden
I = imread (bildDatei);

Schritt 3

%OCR auf das Bild ausführen
results = ocr(I);

Schritt 4

%Die Zeichenkette mit dem Betrag einlesen. { } veranlasst dass ein string zurückgegeben wird. 
betragString = results.Words{1};

Schritt 5

%Die Zeichenkette wird in zwei Teile geteilt. Teil 1 , Teil 2. Da Matlap
%nicht direkt dezimal Zahlen einlesen kann.
stringVektor = strsplit(betragString,',');
%Zeichenkette vor dem Komma und Zeichenkette nach dem Komma wird eingelesen.
Vorkomma = stringVektor(1);
Nachkomma = stringVektor(2);
%Die einzelnen Zeichenketten (Teil 1 und 2) werden in eine Fließkommazahl
%umgewandelt. 
betrag = str2double(Vorkomma) + (str2double(Nachkomma) / 100);

Schritt 6

datum = date;
excelBetragString = num2str(betrag,'%10.2f');
ExcelSpalten = [cellstr(datum); cellstr(excelBetragString)];

Schritt 7

%Die Datei mit einer Lese-Berechtigung öffnen, um zu prüfen ob die Datei vorhanden ist.
    fileID = fopen(ExcelDateiname, 'a');
    ExcelKopf = [cellstr('Datum'); cellstr('Notiz'); cellstr('Betrag')];
    fprintf(fileID, '%s; %s; %s \r\n', ExcelKopf{1}, ExcelKopf{2}, ExcelKopf{3});

Schritt 8

else
    %Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.
    fclose(fileID);

Schritt 9

    %Datei mit Schreib-Berechtigung öffnen.
    fileID = fopen(ExcelDateiname, 'a');
end

Schritt 10

%Die Spalten (Datum, leere Spalte für Kommentare, Betrag) in die Exceldatei eintragen.
fprintf(fileID, '%s; %s; %s \r\n', ExcelSpalten{1}, ' ', ExcelSpalten{2});

Schritt 11

Vgl. Schritt 6

Schritt 12

%Datei schließen
fclose(fileID);


Ergebnis

Das Ergebnis des Programmes stellt eine Excel Tabelle, ausgefüllt mit den jeweilig eingelesenen Rechnungsbeträgen, dar.

Excel Tabelle mit Rechnungsbeträgen


Ausblick

Das Programm, zur Einlese eines Rechnungsbetrages, stellt ein recht einfaches und simples Lösungsbeispiel dar. Eine angemessene Verbesserung wäre es, den gesamten Kassenzettel als Eingabe verwenden zu können. In diesem Programm ist es nur möglich den Rechnungsbetrag einzulesen, wenn das Bild einzig diesen Ausschnitt des Beleges zeigt. Es soll daher im nächsten Schritt versucht werden, ein Programm zu erstellen, das es ermöglicht einen gesamten Kassenzettel einzulesen, den Rechnungsbetrag selbstständig findet und ihn in eine Excel Tabelle überträgt.


Weblinks und Literatur