SigSys16 Einkaufsausgaben Tracking: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(17 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
'''Betreuer:''' [[Benutzer:Ulrich_Schneider | Prof. Schneider]]
'''Betreuer:''' [[Benutzer:Ulrich_Schneider | Prof. Schneider]]


[[Datei:Excelbild_Einkaufszettel.png|gerahmt|Projekt Rechnungsbetrag einlesen]]
[[Datei:Kassenzettel1.jpg|gerahmt|x400px|Projekt Rechnungsbetrag Beispiele]]


== Motivation ==
== Motivation ==
Zeile 33: Zeile 35:
=== Schrittweises Vorgehen ===
=== Schrittweises Vorgehen ===


====Schritt 1====
'''Schritt 1'''<br />
Programm Parameter festlegen
Programm Parameter festlegen


====Schritt 2====
'''Schritt 2'''<br />
Bild mit Betrag aufrufen und laden
Bild mit Betrag aufrufen und laden


====Schritt 3====
'''Schritt 3'''<br />
OCR auf das Bild ausführen
OCR auf das Bild ausführen


====Schritt 4====
'''Schritt 4'''<br />
Die Zeichenkette mit dem Betrag einlesen.
Die Zeichenkette mit dem Betrag einlesen.


====Schritt 5====
'''Schritt 5'''<br />
Die Zeichenkette wird in zwei Teile geteilt. Teil 1 , Teil 2. Da Matlab nicht direkt Dezimalzahlen einlesen kann.
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.  
Die einzelnen Zeichenketten (Teil 1 und 2) werden in eine Fließkommazahl umgewandelt.  


====Schritt 6====
'''Schritt 6'''<br />
Daten in eine CSV-Datei eintragen.
Daten in eine CSV-Datei eintragen.


====Schritt 7====
'''Schritt 7'''<br />
Die Datei mit einer Lese-Berechtigung öffnen, um zu prüfen ob die Datei vorhanden ist.
Die Datei mit einer Lese-Berechtigung öffnen, um zu prüfen ob die Datei vorhanden ist.


====Schritt 8====
'''Schritt 8'''<br />
Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.
Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.


====Schritt 9====
'''Schritt 9'''<br />
Wenn die Datei nicht vorhanden ist: Neue Datei erstellen und die Spalten (Datum, leere Spalte für Kommentare, Betrag) in die Exceldatei eintragen.
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====
'''Schritt 10'''<br />
Datei mit Schreib-Berechtigung öffnen.
Datei mit Schreib-Berechtigung öffnen.


====Schritt 11====
'''Schritt 11'''<br />
Daten in die CSV Datei schreiben.
Daten in die CSV Datei schreiben.


====Schritt 12====
'''Schritt 12'''<br />
Programm abschließen.
Programm abschließen.


=== Benötigte Matlab-Befehle ===
=== Benötigte Matlab-Befehle ===
Zeile 77: Zeile 77:
* Befehr ''imread''
* Befehr ''imread''
Die Funktion imread ermöglicht es Daten aus einer Grafikdatei in MATLAB zu importieren.  Einlesen von Pixelgrafiken aus Bilddateien.
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.
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''
* Befehr ''ocr''
Zeile 100: Zeile 100:
Schreibt formatierte Daten in eine Datei.
Schreibt formatierte Daten in eine Datei.
fprintf (fid, format, A, …)
fprintf (fid, format, A, …)
„fid“ kennzeichnet die Datei, „formate“ gibt die Formatvorschrift für die Ausgabe wieder und „A“ ist die zu schreibende Matrix.
„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) ==
== Matlab-Programm (Durchführung) ==
Zeile 106: Zeile 106:
Der Quelltext der oben beschriebenen Schritte ist im folgenden abgebildet:
Der Quelltext der oben beschriebenen Schritte ist im folgenden abgebildet:


=== Schritt 1 ===
'''Schritt 1''' <br />


<source lang="matlab">
<source lang="matlab">
Zeile 115: Zeile 115:
</source>
</source>


=== Schritt 2 ===
'''Schritt 2'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 122: Zeile 122:
</source>
</source>


=== Schritt 3 ===
'''Schritt 3'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 129: Zeile 129:
</source>
</source>


=== Schritt 4 ===
'''Schritt 4'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 136: Zeile 136:
</source>
</source>


=== Schritt 5 ===
'''Schritt 5'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 156: Zeile 156:
</source>
</source>


=== Schritt 6 ===
'''Schritt 6'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 164: Zeile 164:
</source>
</source>


=== Schritt 7 ===
'''Schritt 7'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 173: Zeile 173:
</source>
</source>


=== Schritt 8 ===
'''Schritt 8'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 181: Zeile 181:
</source>
</source>


=== Schritt 9 ===
'''Schritt 9'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 189: Zeile 189:
</source>
</source>


=== Schritt 10 ===
'''Schritt 10 '''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 196: Zeile 196:
</source>
</source>


=== Schritt 11 ===
'''Schritt 11'''<br />


Vgl. ''Schritt 6''
Vgl. ''Schritt 6''


=== Schritt 12 ===
'''Schritt 12'''<br />


<source lang="matlab">
<source lang="matlab">
Zeile 206: Zeile 206:
fclose(fileID);
fclose(fileID);
</source>
</source>


== Ergebnis ==
== Ergebnis ==
Zeile 216: Zeile 215:


== Ausblick ==
== 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.


Das im Rahmen des Projektes entwickelte Programm ermöglicht einen Betrag aus einem entsprechenden Bildausschnitt einzulesen. In einem nächsten Schritt müsste nun eine Programm entwickelt werden, in dem das manuelle zuschneiden dieses Ausschnittes nicht automatisch geschieht. Dies würde die Nutzung des Ausgabentrackers stark vereinfachen. In Zukunft könnte dieses Programm erweitert werden indem ein gesamter Kassenzettel mit allen Positionen eingelesen werden kann. Die einzelnen Positionen würden entsprechend alle in eine Exceldatei eingetragen.
== Video ==
[Youtube[https://youtu.be/9xudnHE-m08]]


== Weblinks und Literatur ==
== Weblinks und Literatur ==
Zeile 226: Zeile 228:
*[http://de.mathworks.com/help/ref/num2str.html] http://de.mathworks.com/help/ref/num2str.html
*[http://de.mathworks.com/help/ref/num2str.html] http://de.mathworks.com/help/ref/num2str.html
*[http://de.mathworks.com/help/ref/cellstr.html] http://de.mathworks.com/help/ref/cellstr.html
*[http://de.mathworks.com/help/ref/cellstr.html] http://de.mathworks.com/help/ref/cellstr.html
*[7]Prof. Dr. Schweizer, W. (2009). ''MATLAB kompakt''. Oldenbourg Wissenschaftsverlag
*[7] Prof. Dr. Schweizer, W. (2009). ''MATLAB kompakt''. Oldenbourg Wissenschaftsverlag
 
 
----
→ zurück zum Hauptartikel: [[SigSys_SoSe2016| Signalverarbeitende Systeme SoSe2016]]

Aktuelle Version vom 12. Juli 2016, 14:30 Uhr

Autor: Theresa Wunsch | Anna Neuhaus

Betreuer: Prof. Schneider

Projekt Rechnungsbetrag einlesen
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 im Rahmen des Projektes entwickelte Programm ermöglicht einen Betrag aus einem entsprechenden Bildausschnitt einzulesen. In einem nächsten Schritt müsste nun eine Programm entwickelt werden, in dem das manuelle zuschneiden dieses Ausschnittes nicht automatisch geschieht. Dies würde die Nutzung des Ausgabentrackers stark vereinfachen. In Zukunft könnte dieses Programm erweitert werden indem ein gesamter Kassenzettel mit allen Positionen eingelesen werden kann. Die einzelnen Positionen würden entsprechend alle in eine Exceldatei eingetragen.

Video

[Youtube[1]]

Weblinks und Literatur



→ zurück zum Hauptartikel: Signalverarbeitende Systeme SoSe2016