使用OpenCV

时间:2017-04-24 21:53:59

标签: python opencv image-processing ocr tesseract

我正在尝试开发一种系统,该系统可以将旧模拟压力输出系统上的七段显示转换为文本,这样数据就可以由LabVIEW处理。我一直致力于图像处理,以获得Tesseract(使用v3.02)正确识别数字,但已经遇到了一些障碍,并且不太了解如何继续。这是我到目前为止所得到的:

  • 图像需要在50-100像素之间,以便Tesseract正确读取。我找到了最好的结果,高度为50.
  • 需要裁剪图像,以便只有一行文字。
  • 图片应该是黑白的
  • 图像应该从左到右相对水平。

我一直在使用七段训练数据' letsgodigital'。这是我到目前为止所做的图像处理的代码:

  ret, i = video.read()
  h,width,channels = i.shape #get dimensions

  g = cv2.cvtColor(i,cv2.COLOR_BGR2GRAY)
  histeq=cv2.equalizeHist(g) #spreads pixel values across entire spectrum
  _,t = cv2.threshold(histeq,150,225,cv2.THRESH_BINARY) #thresholds histeq

  cropped = t[int(0.4*h):int(.6*h), int(0.1*width):int(0.9*width)]
  rotated = imutils.rotate_bound(cropped, angle)
  resized = imutils.resize(rotated,height=resizing_height)

有些数字比其他数字效果更好 - 例如,' 1'似乎有很多麻烦。这些数字发生在' +'之后。或者' - '通常不会出现,而且' +'经常出现在' - '。我也玩了一些阈值值。

最后三部分是因为我拍摄的视频样本略显歪斜。我可以尝试使用一些更好的数据来处理,我也可以尝试使用标准版本来制作我自己的培训数据' letsgodigital'郎。我觉得我不是以最好的方式进行图像处理,并且会很感激一些指导。

我计划使用某种程度的边缘检测来自动切换到显示器,但是现在我一直试图保持简单并手动获得我想要的结果。我已经上传了在http://imgur.com/a/vnqgP处应用了不同程度图像处理的样本图像。这很困难,因为有时候我会从tesseract得到准确的答案,而其他时候什么也得不到。虽然相机或灯光水平并没有真正改变,但这让我觉得这对我的训练数据来说是一个问题。任何建议或指示我应该去哪里将非常感谢!!谢谢

1 个答案:

答案 0 :(得分:1)

对于读取七段数字,正常的OCR程序如tesseract通常不能很好地工作,因为各个段之间的空间。您应该尝试ssocr,它专门用于读取七个段数字。但是,您的预处理需要更好,因为ssocr期望输入是七行数字的单行。

参考文献 - https://www.unix-ag.uni-kl.de/~auerswal/ssocr/

用法示例 - http://www.instructables.com/id/Raspberry-Pi-Reading-7-Segment-Displays/