Archiv verlassen und diese Seite im Standarddesign anzeigen : (BASH) - QR-Code per Shell/CMD auslesen
Moin,
arbeite aktuell an einem Archivier-/Sortiersystem für gescannte Dokumente. Gehen wir davon aus, dass 1000 Seiten eingescannt werden woraus ein 1000 seitiges PDF entsteht. Jetzt gehe ich her, zerteile das PDF auf seine einzelnen Seiten, konvertiere jede in ein TIF und lese die QR-Codes aus um zusammengehörige Seiten wieder zu einem einzelnen PDF zu mergen. Da die zu scannenden Seiten nicht immer von mir selbst gedruckt werden und sich daher die Qualität stark unterscheiden kann kommt es vor, dass nicht immer der QR-Code erkannt bzw. ausgelesen wird.
Jetzt habe ich allerdings eine Webseite gefunden, die so ein Beispiel für ein nicht auslesbaren QR, trotzdem korrekt auslesen konnte (online-barcode-reader.inliteresearch.com). Da würde ich auch gern hin kommen.
Mein Vorgehen aktuell ist wie folgt:
1. PDF zerteilen
pdftk ${PDF_TEMP} burst output ${HOMEDIR}/${PDF_REAL_FILENAME}_%05d.pdf
2. PDF in TIF konvertieren
convert -monochrome -density 495 ${line_temp} ${HOMEDIR}/${TIFF_FILENAME}.tif
3. QR-Code aus TIF auslesen
zbarimg "${line}"
4. TIF in TXT konvertieren*
tesseract ${line} ${HOMEDIR}/${FILENAME_BLANK}
(*) Sollte 3. fehlschlagen, wird versucht in TXT zu konvertieren und daraus per REGEX die gewünschten Inhalte zu finden/auszulesen. Funktioniert gut aber nicht zuverlässig genug.
Da es sich um sehr sensitive Daten handelt, kommt ein externer Dienstleister (API) nicht in Frage.
Jetzt ist die Frage... welche Möglichkeiten bleiben mir um das ganze noch weiter zu optimieren und alle QR-Codes zuverlässig ausgelesen zu bekommen.
Danke vorab!
Gruß
Jetzt ist die Frage... welche Möglichkeiten bleiben mir um das ganze noch weiter zu optimieren und alle QR-Codes zuverlässig ausgelesen zu bekommen.
Ich würde jetzt einfach mal Stumpf mit der Auflösung (Eingabedaten vergrößern/verkleiner) oder mit Filtern/Kontrast/Helligkeit rumspielen um zu sehen, ob meine Ergebnisse besser werden.
Alternativ könnte man mit OpenCV den QR-Code extrahieren (+ eventuell überarbeiten) bevor man ihn ausließt.
Durch etwas Spielen mit den Parametern bin ich jetzt schon weiter gekommen.
convert -density 300 file.pdf -blur 1x0.9 file.tif
zbarimg -q --raw file.tif
Durch das runterschrauben der Dichte und aktivieren des Blur-Effekt, lassen sich die weißen Pixel stopfen und es klappt bisher mit dem Auslesen.
Vorher: Screenshot by Lightshot (http://prntscr.com/m8giyo)
Nachher: Screenshot by Lightshot (http://prntscr.com/m8gj32)
masterholdy
18.01.2019, 09:48
statt blur zu benutzen um die löcher zu schließen würde ich mir eventuell mal morphologische filter angucken
ich bin mir nicht mehr sicher welcher filter nochmal genau auf solch ein problem angewendet werden habe aber gerade "closing" im kopf
einfach aus dem bild ein schwarz weiß bild machen => dann https://de.wikipedia.org/wiki/Schwellenwertverfahren anwenden => dann ?closing? dann solltest du die löcher noch etwas besser geschlossen haben
vllt helfen dir die begriffe ja irgendwie weiter, habe gerade nicht soviel zeit sonst hätte ich dir das noch etwas genauer geschrieben
- - - - - - - - - - Beitrag nachträglich erweitert - - - - - - - - - -
source:
https://www.szenebox.org/images/_imported/2019/01/14.jpg
binary:
https://www.szenebox.org/images/_imported/2019/01/15.jpg
binary + closing:
https://www.szenebox.org/images/_imported/2019/01/16.jpg
binary + closing +dilate (mehrere unterschiedliche kernel verwendet):
kernel größe 3
https://www.szenebox.org/images/_imported/2019/01/17.jpg
kernel größe 5
https://www.szenebox.org/images/_imported/2019/01/18.jpg
kernel größe 7
https://www.szenebox.org/images/_imported/2019/01/19.jpg
bsp code.
https://pastebin.com/RrUpuGaZ
Danke euch beiden!
Mit dem Spielen der Qualität sowie mit der weiteren Unterstützung von masterholdy konnten nun deutlich mehr QR-Codes ausgelesen werden. Es geht zwar nicht alles mit einem Oneliner aber besser als nichts und Zeit spielt für diesen Prozess weniger eine Rolle.
Arbeite derzeit damit:
if [ -z "${qrcode}" ]; then convert -density 310 $line -blur 1x0.9 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 320 $line -blur 1x1.0 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 350 $line -blur 1x0.9 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 300 $line -blur 2x3.0 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 400 $line -blur 2x1.5 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 200 $line -blur 2x0.5 file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then convert -density 450 $line -negate -morphology Close Disk -negate file.tif; qrcode=`zbarimg -q --raw file.tif | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
Es gibt zwar von 1020 Seiten aktuell noch 8 Stück die nicht funktionieren aber das sollte auch noch werden.
Folgendes funktioniert jetzt für mich. Habe darüber 3774 Seiten ohne einen Fehler auslesen können.
if [ ! -f "${homedir}/file.tif" ]; then debug_scan="#00"; echo "Check #00"; convert -density 300 "$line" -blur 1x0.9 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#01"; echo "Check #01"; convert -density 350 "$line" -morphology Smooth Octagon:2 -blur 1x0.8 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#02"; echo "Check #02"; convert -density 350 "$line" -morphology Smooth Octagon:1 -blur 1x0.9 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#03"; echo "Check #03"; convert -density 310 "$line" -blur 1x0.9 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#04"; echo "Check #04"; convert -density 320 "$line" -blur 1x1.0 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#05"; echo "Check #05"; convert -density 350 "$line" -blur 1x0.9 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#06"; echo "Check #06"; convert -density 300 "$line" -blur 2x3.0 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#07"; echo "Check #07"; convert -density 400 "$line" -blur 2x1.5 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#08"; echo "Check #08"; convert -density 200 "$line" -blur 2x0.5 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#09"; echo "Check #09"; convert -density 400 "$line" -morphology Smooth Octagon:1 -blur 1x0.8 "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
if [ -z "${qrcode}" ]; then debug_scan="#10"; echo "Check #10"; convert -density 450 "$line" -negate -morphology Close Disk -negate "${homedir}/file.tif"; qrcode=`zbarimg -q --raw "${homedir}/file.tif" | grep -i "vertrag" | grep -o "[0-9]*$" | grep -E '\<[0-9]{6}\>'`; fi
Fertig ist das ganze noch nicht. Mit $debug_scan wird die Häufigkeit der genutzten Methoden gemessen um später weiter zu optimieren.
Powered by vBulletin® Version 4.2.2 Copyright ©2026 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.