Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Tesseract OCR输出错误_C#_Bitmap_Tesseract - Fatal编程技术网

C# Tesseract OCR输出错误

C# Tesseract OCR输出错误,c#,bitmap,tesseract,C#,Bitmap,Tesseract,我正在为Tesseract库使用c#包装器(如果我没有弄错的话,请使用3.02)()。我已经让它运行并给出输出,但输出本质上是垃圾。通常它什么也不给,而当它确实给了一些东西时,它往往是一团糟。我知道这在理论上是可行的,因为我已经在一些非常完美的图像上尝试过了,而且效果很好。我想知道是否有人能帮我诊断这些问题,并提出一些提高Tesseract准确性的方法。我已经将所有图像转换为黑白,分辨率设置为300x300。我不做任何直线矫直编程,但正如你可以看到下面他们是相当直 这张照片效果很好 这一个根本不

我正在为Tesseract库使用c#包装器(如果我没有弄错的话,请使用3.02)()。我已经让它运行并给出输出,但输出本质上是垃圾。通常它什么也不给,而当它确实给了一些东西时,它往往是一团糟。我知道这在理论上是可行的,因为我已经在一些非常完美的图像上尝试过了,而且效果很好。我想知道是否有人能帮我诊断这些问题,并提出一些提高Tesseract准确性的方法。我已经将所有图像转换为黑白,分辨率设置为300x300。我不做任何直线矫直编程,但正如你可以看到下面他们是相当直

这张照片效果很好

这一个根本不起作用,要么胡言乱语,要么什么都没有

我尝试翻转颜色,认为它可能会提供更大的对比度(因为大多数文本在白色背景上是黑色的,而工作文本在黑色背景上是白色的)。但是:

根本不起作用,然而

再次完美地工作


我怀疑这与“发票”中字母之间的额外间距有关。但一定有办法通过更紧凑的字体获得令人满意的结果。任何建议都是受欢迎的,我是这里的相对人。

< P>如果你有可能的话,你应该考虑使用更高分辨率的图片。洛克希德·马丁公司和支付图片的另一个问题可能是字母之间的差距太小。如果单个字母(几乎)连接到单词的下一个字母,则Tesseract无法检测它们。 我建议使用像openCV这样的图像处理库来改进您的结果。 你可以试试侵蚀/扩张。如果内核使用了正确的参数,这将分隔字母。使用不同的内核看看什么最适合你

Mat element = getStructuringElement( erosion_type,
                                   Size( 2*erosion_size + 1, 2*erosion_size+1 ),
                                   Point( erosion_size, erosion_size ) );

erode( src, erosion_dst, element );
当我在我的项目中工作时,使用自适应阈值对我帮助很大。我发现这比把它转换成灰度或二值图像更有效。 注意:Java代码应该与C非常相似

Imgproc.adaptiveThreshold(cropedIm, cropedIm, 255,  Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 29, 10);
这是我在我的android项目Pixtern(github上的源代码)中选择一幅图像后得到的结果。我使用了一个自适应阈值,但没有膨胀/侵蚀,结果已经很好了

(图片=洛克希德马丁航空公司)

对于付款图像和类似图像: 尝试使用正常阈值并反转图像(黑色字体,白色背景)。同样,膨胀/侵蚀可在之后使用。Java代码:

//results in binary image
Imgproc.threshold(cropedIm,cropedIm,127,255,Imgproc.THRESH_BINARY);
//Inverting image
Core.bitwise_not(cropedIm, cropedIm);

谢谢你的帮助。图像是从设备摄像机上拍摄下来的,然后用户将其裁剪出来,因此除了告诉用户使用更好的摄像机之外,我真的没有办法提高分辨率,而这实际上不是一个选项。我会尝试你提到的其他方法,看看效果如何。另一个选择是训练Tesseract。如果字体总是一样的话,这可能会有很大帮助。不幸的是,字体并不总是一样的(事实上通常是不同的)。