opencv - 如何从收据中提取相关信息

标签 opencv machine-learning keras tesseract opencv3.0

我正在尝试结合使用 Opencv、Tesseract 和 Keras 从一系列不同的收据中提取信息。该项目的最终结果是我应该能够使用手机拍摄收据照片,并从该照片中获取商店名称、支付类型(卡或现金)、支付金额和找零。

到目前为止,我已经使用 Opencv 对一系列不同的样本收据进行了一些不同的预处理步骤,例如去除背景、去噪和转换为二值图像,并留下如下图像:

receipt-scanned

然后我使用 Tesseract 对收据执行 ocr,并将结果写入文本文件。我已经设法让 ocr 以可接受的水平执行,因此我现在可以拍一张收据的照片并在上面运行我的程序,我将得到一个包含收据上所有文本的文本文件。

我的问题是我不想要收据上的所有文字,我只想要某些信息,例如上面列出的参数。我不确定如何训练一个模型来提取我需要的数据。

我认为应该使用 Keras 对图像的不同部分进行分割和分类,然后将我的模型分类为包含相关数据的部分中的文本写入文件,这样的想法是否正确?或者对于我需要做的事情有更好的解决方案吗?

很抱歉,如果这是一个愚蠢的问题,这是我的第一个 Opencv/机器学习项目,我的理解力还远远不够。任何建设性的批评将不胜感激。

最佳答案

我的回答不像现在流行的那样花哨,但我认为它适用于您的情况,特别是如果这是用于产品(不是用于研究和出版目的)。

Example steps

我会实现论文 Text/Graphics Separation Revisited .我已经在 Matlab 和 C++ 中实现了它,我从你的描述中保证它不会花你很长时间。总结:

  1. 获取所有具有统计信息的连接组件。您对每个字符的边界框特别感兴趣。

  2. 这篇论文从连通分量属性的直方图中获取阈值,这使得它有点稳健。在连接组件的几何属性上使用这些阈值(效果出奇地好),丢弃任何不是字符的内容。

  3. 对于您的角色,获取其所有边界框的质心,并根据您自己的标准(高度、垂直位置、欧几里得距离等)对最接近的质心进行分组。使用获得的质心簇创建矩形文本区域。

  4. 关联相同高度和垂直位置的文本区域。

  5. 对您的文本区域运行 OCR 并查找诸如“现金”之类的关键字。老实说,我认为你可以不用带文本文件的字典,也可以不用为移动设备完成计算机视觉,我知道你的资源是有限的(也受隐私保护)。

老实说,我认为神经网络不会比某种关键字匹配(例如使用 Levenshtein 距离或类似的东西来增加一点稳健性)好多少,因为无论如何你都需要手动创建和标记这些词创建您的训练数据集,那么...为什么不直接写下来呢?

基本上就是这样。你很快就能得到一些东西(特别是如果你想使用手机并且你不能将图像发送到服务器)并且它可以正常工作。不需要机器学习,因此也不需要数据集。

但如果这是为了学校...抱歉我太粗鲁了。请使用具有 10,000 张手动标记的收据图像和自然语言处理方法的 TensorFlow,您的教授会很高兴。

关于opencv - 如何从收据中提取相关信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45796771/

相关文章:

c++ - 如何访问加载图像的各个 R/G/B 组件(较新的 C++ API)

java - Mat.dump() 的 OpenCV java 实现返回不准确的数据

python - 允许概率作为黄金标准的逻辑回归

python - 带有 TimeSeriesGenerator 的 Keras LSTM 自定义数据生成器

python - 如何在 Keras/TensorFlow 的自定义层中应用内核正则化?

C#/EmguCV - 将上传的 HttpPostedFileBase 转换为 Emgu.CV.Mat

c++ - 来自 opencv gpu::convolve 的 cuda convnet equvilent 方法

machine-learning - 用于机器学习的纸牌游戏建模

image - 过滤 numpy 数组并将数组重新堆叠为多维矩阵

python - key 错误 : "Unable to open object (object ' imgs' doesn't exist)"