【问题标题】:Finding bounding box of text within JPG image在 JPG 图像中查找文本的边界框
【发布时间】:2011-07-14 19:59:14
【问题描述】:

我的问题类似于this one,但范围更具体。

在我的纸牌游戏应用程序中,我希望用户能够单击扫描的 jpeg 图像中的单词。请参阅此示例Pokemon trading card

在这种情况下,用户应该能够将鼠标悬停在文本“Scratch”上,文本周围会出现一个脉动的矩形边框,表明它是可点击的。问题是如何检测文本的边界。将有一组用户可以点击的事先知道的单词(这些单词将逐张从数据库中检索)。继续我们的示例,本例中的数组将是 ["Scratch", "Live Coal"]。一旦用户点击“Scratch”,应用程序必须通过回调知道选择了“Scratch”而不是“Live Coal”。

我曾考虑使用光学字符识别库来解决此问题,但用于此问题的开源选项质量较差(例如 GOCR)和/或未在多个平台上经过良好测试(例如 Tesseract)。我只关心 Windows 和 Mac 的兼容性。我是否缺少不需要 OCR 的明显/更简单的解决方案/算法?我不能简单地在每张卡片的边界框中手动编码,因为我的数据库中将有数千张扫描的卡片。用户还可以上传自己的自定义卡片扫描,并附带一系列可点击的文本。

文本颜色并不总是黑色。请参阅此panorama,了解允许的不同卡片和文本样式。黑色卡片有白色文字,倒数第三张卡片 (Zekrom) 有黑色文字和白色轮廓。

任何编程语言的解决方案都值得赞赏。但是,请注意,我正在寻找开源算法和/或库。如果有 Ruby 或 Java 的解决方案,那就更好了,因为我的代码主要使用这两种语言。

编辑:我忘了提到数组中单词/短语的顺序与卡片上的顺序相同。因此,数组将是 ["Scratch", "Live Coal"] 而不是 ["Live Coal", "Scratch"]。我之所以提到这一点,是因为它可能会简化任务。因此,对于这个例子,我可以简单地寻找黑色像素(尽管我必须注意白色圆圈中的黑色星星)。但是,在攻击名称下方以较小字体显示描述性文本的情况会更加困难(同样,请参见全景图示例)。

【问题讨论】:

  • 如果您允许用户上传图片随附的文字,您打算如何验证他们输入的内容是否与文字实际匹配?此外,卡片的方向是否重要(如果卡片横向显示或以某个奇怪的角度显示会发生什么情况)?您可能希望做的是将现有文本清空,然后 generate 文本就地 - 更容易生成边界框,更容易翻译(根据需要),没有(或很少,取决于)OCR。唯一要做的真实图像处理是确定“移动”部分的边界框(您可能无论如何都想这样做,以预先限制 OCR 区域)。
  • @X-Zero 谢谢,这听起来像是一个可行的解决方案。您如何建议我检测“移动”部分的边界框?
  • 取决于其他什么东西应该是可点击的,它基本上是所有不是主要图片的东西——所有这些(似乎)都有一个相当明确的边界。在卡片的中点附近还有一个水平条,它似乎具有不错的对比度(抱歉,我从未做过图像分析)。无论如何,如果用户可以上传(并且可能制作)他们自己的卡片,您可能只希望制作一个卡片创建器,他们可以在其中输入自己的文本,并包含某种自定义的口袋妖怪图像;那应该更简单。目前,您必须识别卡..

标签: java ruby image ocr text-recognition


【解决方案1】:

为了简单起见,我只想编写一个程序,允许您在文本周围直观地绘制一个边界框,但可以通过检测像素颜色的差异来做到这一点。由于文本是黑色的,您可以看到最左上角的黑色像素在没有大缩进的情况下位于卡片的下半部分。

【讨论】:

  • 这个问题是卡片格式差异很大。我还需要识别card 上的短语“Pokemon Power: Matter Exchange”和“Mind Shock”
【解决方案2】:

当光标静止时,检查光标下方或周围 4 像素处是否有黑色像素。如果是,请检查光标左侧、右侧、顶部和底部的前三个连续(因为字母之间可能还有非黑色像素)非黑色像素。如果是,请使用这些位置绘制一个正方形。你可以使用OpenCV

【讨论】:

  • 好主意,但是应该在整个单词或短语周围画一个矩形边框。例如,在您链接的 OpenCV 页面中,第一张图中的“将 <...>\OpenCV\bin 添加到系统 PATH”周围有一个红色矩形。
  • 这个怎么样。您事先在每个文本区域周围绘制透明矩形。因此,对于每个卡片对象,都有一个关联的矩形数组列表,其中包含矩形的坐标。现在,每当用户移动鼠标时,检查用户是否在这些“隐藏”矩形之一内。如果他/她是,只需将该矩形的颜色更改为黑色或其他什么?
  • 如果您事先不知道卡片,只需保存预定义单词的图像,例如“scratch”以及用户扫描新卡片时 - 检查卡片是否包含任何您存储的图像。如果是这样,您可以检测图像的位置并在其周围画一条线...
  • 这可能有效,但我不制作卡片,因此没有我要识别的文本字体。此外,我如何检查卡片是否包含图像?有背景纹理要处理。
  • 在 OpenCV 中,您可以将图像转换为黑白或灰度。这使得比较图像更容易。所以你不必担心背景。不过,这听起来很酷:与人在线玩口袋妖怪卡片,使用网络摄像头展示卡片或其他东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2017-02-22
  • 2014-02-19
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多