Javascript 将OCR非结构化文本转换为正确的文本

Javascript 将OCR非结构化文本转换为正确的文本,javascript,node.js,vb6,ocr,modi,Javascript,Node.js,Vb6,Ocr,Modi,我在VB6中使用MicrosoftMODI对图像进行OCR。(我知道其他OCR工具,如tesseract等,但我发现MODI比其他工具更准确) 要进行OCR的图像如下所示 LeftPos = Img.Layout.Words(0).Rects(0).Left TopPos = Img.Layout.Words(0).Rects(0).Top OCR后得到的文本如下所示 Text1 Text2 Text3 Number1 Number2 Number3 这里的问题是没有维护来自相反列的相应文

我在
VB6
中使用Microsoft
MODI
对图像进行OCR。(我知道其他OCR工具,如tesseract等,但我发现MODI比其他工具更准确)

要进行OCR的图像如下所示

LeftPos = Img.Layout.Words(0).Rects(0).Left
TopPos = Img.Layout.Words(0).Rects(0).Top

OCR后得到的文本如下所示

Text1
Text2
Text3
Number1
Number2
Number3
这里的问题是没有维护来自相反列的相应文本。如何将数字1映射为文本1

我只能想出这样的解决办法

莫迪提供了所有像这样的OCR单词的坐标

LeftPos = Img.Layout.Words(0).Rects(0).Left
TopPos = Img.Layout.Words(0).Rects(0).Top
所以,为了对齐同一行中的单词,我们可以匹配每个单词的TopPos,然后按LeftPos对它们进行排序。我们将得到完整的线路。所以我循环遍历了所有的单词,并将它们的文本以及left和top存储在一个mysql表中。然后运行这个查询

SELECT group_concat(word ORDER BY `left` SEPARATOR ' ')
FROM test_copy
GROUP BY `top`
我的问题是,每个单词的顶部位置并不完全相同,显然会有几个像素的差异

我尝试添加
div5
,用于合并5像素范围内的单词,但在某些情况下不起作用。我还尝试在node.js中计算每个单词的容差,然后按LeftPos排序,但我仍然觉得这不是最好的方法

更新:js代码完成了这项工作,但Number1有5个像素的差异,Text2在该行中没有对应的情况除外


有更好的方法吗?

我不能100%确定如何识别“左”列中的单词,但一旦识别出该单词,您就可以在该行中找到其他单词,方法不仅是投影顶部坐标,还投影整个矩形(顶部和底部)。确定与其他单词的重叠(相交)。注意下面用红色标记的区域

这是可以用来检测是否有东西在同一条线上的公差。如果某个东西只重叠了一个像素,那么它可能来自较低或较高的线条。但如果它重叠了,比如说,50%或更多的高度“Text1”,那么它很可能在同一行上


基于上下坐标查找“行”中所有单词的SQL示例

select 
    word.id, word.Top, word.Left, word.Right, word.Bottom 
from 
    word
where 
    (word.Top >= @leftColWordTop and word.Top <= @leftColWordBottom)
    or (word.Bottom >= @leftColWordTop  and word.Bottom <= @leftColWordBottom)
选择
word.id,word.Top,word.Left,word.Right,word.Bottom
从…起
单词
哪里

(word.Top>=@leftColWordTop和word.Top=@leftColWordTop和word.Bottom是始终存在的
Text1
Number1
(没有间隙或缺少值)?OCR软件是否将
单词
按任何顺序排列?不,任何东西都可能存在,间隙,特殊字符等。一旦单词排成一行,我就有其他逻辑来解析其中有意义的信息。我不确定顺序,但无论如何,按LeftPos排序都无关紧要。问题是TopPos的例:顶部4-6(考虑到公差为3)的单词应该放在同一行。感谢您阅读整个问题:)。我理解这个概念,我也有制作矩形投影的所有坐标,但我如何合乎逻辑地做到这一点?我的意思是我只需要用他们的X和Y来表达。我认为在单词之间寻找重叠太慢了。你可以在代码或数据库中完成。我不知道你的数据库,但看看上面的编辑。