SigSys16 Einkaufsausgaben Tracking: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(40 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 23: Zeile 25:
== Model ==
== Model ==


[[Datei:Model.png|gerahmt|x400px]]
[[Datei:Model.png|gerahmt||zentriert|x450px| 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'''<br />
Programm Parameter festlegen
 
'''Schritt 2'''<br />
Bild mit Betrag aufrufen und laden
 
'''Schritt 3'''<br />
OCR auf das Bild ausführen
 
'''Schritt 4'''<br />
Die Zeichenkette mit dem Betrag einlesen.
 
'''Schritt 5'''<br />
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'''<br />
Daten in eine CSV-Datei eintragen.
 
'''Schritt 7'''<br />
Die Datei mit einer Lese-Berechtigung öffnen, um zu prüfen ob die Datei vorhanden ist.
 
'''Schritt 8'''<br />
Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.
 
'''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.
 
'''Schritt 10'''<br />
Datei mit Schreib-Berechtigung öffnen.
 
'''Schritt 11'''<br />
Daten in die CSV Datei schreiben.
 
'''Schritt 12'''<br />
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''' <br />
 
<source lang="matlab">
%Bilddatei
bildDatei = 'betrag.png';
%Exceldatei
ExcelDateiname = 'Rechnungen.csv';
</source>
 
'''Schritt 2'''<br />
 
<source lang="matlab">
%Bild mit Betrag aufrufen und laden
I = imread (bildDatei);
</source>
 
'''Schritt 3'''<br />
 
<source lang="matlab">
%OCR auf das Bild ausführen
results = ocr(I);
</source>
 
'''Schritt 4'''<br />
 
<source lang="matlab">
%Die Zeichenkette mit dem Betrag einlesen. { } veranlasst dass ein string zurückgegeben wird.
betragString = results.Words{1};
</source>
 
'''Schritt 5'''<br />
 
<source lang="matlab">
%Die Zeichenkette wird in zwei Teile geteilt. Teil 1 , Teil 2. Da Matlap
%nicht direkt dezimal Zahlen einlesen kann.
stringVektor = strsplit(betragString,',');
</source>
 
<source lang="matlab">
%Zeichenkette vor dem Komma und Zeichenkette nach dem Komma wird eingelesen.
Vorkomma = stringVektor(1);
Nachkomma = stringVektor(2);
</source>
 
<source lang="matlab">
%Die einzelnen Zeichenketten (Teil 1 und 2) werden in eine Fließkommazahl
%umgewandelt.
betrag = str2double(Vorkomma) + (str2double(Nachkomma) / 100);
</source>
 
'''Schritt 6'''<br />
 
<source lang="matlab">
datum = date;
excelBetragString = num2str(betrag,'%10.2f');
ExcelSpalten = [cellstr(datum); cellstr(excelBetragString)];
</source>
 
'''Schritt 7'''<br />
 
<source lang="matlab">
%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});
</source>
 
'''Schritt 8'''<br />
 
<source lang="matlab">
else
    %Wenn die Datei bereits vorhanden ist: Die Datei schließen und erneut mit Schreib-Berechtigung öffnen.
    fclose(fileID);
</source>
 
'''Schritt 9'''<br />
 
<source lang="matlab">
    %Datei mit Schreib-Berechtigung öffnen.
    fileID = fopen(ExcelDateiname, 'a');
end
</source>
 
'''Schritt 10 '''<br />
 
<source lang="matlab">
%Die Spalten (Datum, leere Spalte für Kommentare, Betrag) in die Exceldatei eintragen.
fprintf(fileID, '%s; %s; %s \r\n', ExcelSpalten{1}, ' ', ExcelSpalten{2});
</source>
 
'''Schritt 11'''<br />
 
Vgl. ''Schritt 6''
 
'''Schritt 12'''<br />
 
<source lang="matlab">
%Datei schließen
fclose(fileID);
</source>
 
== Ergebnis ==
 
Das Ergebnis des Programmes stellt eine Excel Tabelle, ausgefüllt mit den jeweilig eingelesenen Rechnungsbeträgen, dar.
 
[[Datei:Excelbild_Einkaufszettel.png|gerahmt|zentriert|x450px|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[https://youtu.be/9xudnHE-m08]]
 
== Weblinks und Literatur ==
*[http://de.mathworks.com/help/ref/orc.html]  http://de.mathworks.com/help/ref/orc.html
*[http://de.mathworks.com/help/ref/result.words.html] http://de.mathworks.com/help/ref/result.words.html
*[http://de.mathworks.com/help/ref/strsplit.html] http://de.mathworks.com/help/ref/strsplit.html
*[http://de.mathworks.com/help/ref/str2double.html] http://de.mathworks.com/help/ref/str2double.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
*[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, 15: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