gpt4 book ai didi

ocr - 需要Tesseract收据扫描建议

转载 作者:行者123 更新时间:2023-12-03 12:40:59 31 4
gpt4 key购买 nike

我在Tesseract的各种OCR项目中反复挣扎,今天发现了一个用例,我认为这是一个灌篮,但是经过许多小时,我仍然感到不满意。我想在这里提出问题,看看是否有人对如何解决此任务有任何建议。

我妻子今天早上来找我,问她是否可以轻松地扫描沃尔玛的收据,并随着时间的流逝建立起类别和特定物品的价格历史记录,以便我们进行一些趋势分析并轻松地深入了解支出的去向。最初,我觉得这是一个非常艰巨的任务,但是在进行了一些挖掘之后,我发现了一些让我感到这触手可及的东西:


沃尔玛的收据总体而言结构合理且易于阅读。它们甚至包括每个项目的UPC(可能会查询UPC数据库吗?),并且似乎用F或I对食品进行分类(不确定有什么区别),并且还有一个税号列,这可能会证明是有用的。我了解了密码含义的秘密。
我进一步发现,我可以访问某种沃尔玛商品查询API,这在UPC查询中被证明是有用的。
他们有一个用于智能手机的应用程序,可让您扫描印在每张收据上的QR码。该应用会从收据中查找“ TC”代码,并从其服务器中拉出完整的分项收据。它为您显示了收据的出色图形表示,包括所有项目的缩略图和成本等。如果此应用程序仅对收据进行分类和汇总,就可以完成!但是可惜,这不是应用程序的目的.....
最后一个难题是,您可以导出计算机生成的收据的PNG图像,以防万一您想保存它并丢弃纸质版本。对我来说,这是赚钱的机会,因为这些PNG是计算机创建的,因此不受拍照或扫描纸质收据的影响


这里的一个示例(略作编辑以使某些区域变白,但从应用程序中获得的其他区域则完全相同)如下:

https://postimg.cc/image/s56o0wbzf/

您会看到文本的重要部分在5列中完全对齐,这最终就是这个问题的含义。如何使Tesseract准确地对此文本进行OCR处理。我有很多想法可以从这里获取,但是所有这些都始于OCR!

我最近来的就是这个例子:

http://pastebin.com/nuZJBVg8

我使用psm6和一个字符限制集来强制它只执行大写+数字+几个符号:

tessedit_char_whitelist 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ#()/*@%-.


乍一看,OCR几乎匹配。但是当您深入研究时,您会发现它总体上非常糟糕。 3s和8s几乎总是错误的。与6s和5s相同。有时候,它会完全跳过字符或开始崩溃(例如示例中的第31+行)。它开始将2s视为1s,甚至只是丢失字符。第33行的SO PIZZA应该为“ 2.82”,但显示为“ 32”。

我尝试对图像进行一些预处理以加粗字符并确保它是纯黑白的,但是我的努力没有比沃尔玛+以上命令提供的原始图像更接近的了。

理想情况下,由于这是一种结构良好的PNG,如果我可以按像素宽度定义列,以便Tesseract可以独立对待每列,那么大概总是我喜欢的宽度。我试图对此进行研究,但是就像素宽度而言,我所见过的UZN文件并没有转化为我,而且似乎高度是一个因素,对它们而言,这是行不通的,因为高度始终是可变的。

另外,我需要弄清楚如何训练Tesseract以100%准确地识别数字(字母并不是很重要)。我开始研究如何训练该程序,但老实说,由于文档中的培训范围更多,是因为它可以识别全部语言而不仅仅是10位数字,所以很快就使我感到头疼。

最终的最终游戏解决方案是一条命令的管道链,该管道从应用程序中获取原始的PNG,并从收据的重要部分为我提供了CSV格式的5列数据。我并不希望这个问题能解决,但是对我的指导将不胜感激!在这一点上,我只是不想再被Tesseract鞭打,所以我决心找到一种方法来掌握她!

最佳答案

我最终将其完全冲洗掉,并对结果感到非常满意,因此我认为我会把它发布出来,以防其他人发现它有用。

由于沃尔玛的收据非常可预测,因此我不必进行任何图像拆分,而使用了正则表达式。

我在Windows上,因此我创建了一个powershell脚本来运行转换命令以及regex查找和替换:

# -----------------------------------------------------------------
# Script: ParseReceipt.ps1
# Author: Jim Sanders
# Date: 7/27/2015
# Keywords: tesseract OCR ImageMagick CSV
# Comments:
# Used to convert a Wal-mart receipt image to a CSV file
# -----------------------------------------------------------------
param(
[Parameter(Mandatory=$true)] [string]$image
) # end param

# create output and temporary files based on input name
$base = (Get-ChildItem -Filter $image -File).BaseName
$csvOutfile = $base + ".txt"
$upscaleImage = $base + "_150.png"
$ocrFile = $base + "_ocr"

# upscale by 150% to ensure OCR works consistently
convert $image -resize 150% $upscaleImage

# perform the OCR to a temporary file
tesseract $upscaleImage -psm 6 $ocrFile

# column headers for the CSV
$newline = "Description,UPC,Type,Cost,TaxType`n"
$newline | Out-File $csvOutfile

# read in the OCR file and write back out the CSV (Tesseract automatically adds .txt to the file name)
$lines = Get-Content "$ocrFile.txt"

Foreach ($line in $lines) {
# This wraps the 12 digit UPC code and the price with commas, giving us our 5 columns for CSV
$newline = $line -replace '\s\d{12}\s',',$&,' -replace '.\d+\.\d{2}.',',$&,' -replace ',\s',',' -replace '\s,',','
$newline | Out-File -Append $csvOutfile
}

# clean up temporary files
del $upscaleImage
del "$ocrFile.txt"


需要在Excel中打开生成的文件,然后运行“文本到列”功能,以便它不会通过自动将UPC代码转换为数字来破坏UPC代码。这是我不会涉及的众所周知的问题,但是有很多方法可以解决,因此我选择了稍微手动的方法。

我本来会很高兴以一个简单的.csv结尾,但我可以双击它,但是我找不到找到一个很好的方法来处理UPC代码,而不是像这样包装UPC代码:

 "=""12345"""


确实可以,但是我希望UPC代码仅仅是Excel中的文本,以防万一我以后可以对Wal-mart API进行查找。

无论如何,这是它们在导入和快速格式化后的外观:

https://s3.postimg.cc/b6cjsb4bn/Receipt_Excel.png

我仍然需要对不是行项目的行进行一些垃圾清理,但是所有这些仅需要几秒钟,因此不会给我带来太多麻烦。

感谢朝着正确的方向@RevJohn轻推,我不会想尝试简单地缩放图像,但是Tesseract改变了世界!

关于ocr - 需要Tesseract收据扫描建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31633403/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com