本期题目

在给出的10000张图片中,有一个单词重复出现了两次,请找出这个单词~

来源:千里码 → 传送门

正经

首先当然是下载文件包,看看需要识别的都是什么图片啦。发现大部分都经过了旋转,变形倒没有,所以可以说是省下很大一笔功夫,然后调用开源的Tesseract-OCR愉快地识别。所以重点应该就是在如何把图片旋转回来:p

先交代下我旋转前的前置步骤,放大->灰度->二值,OpenCV轻松完成。

然后来个巨模糊的高斯模糊,主要就是为了让图片糊在一起,二值化后就只剩一个椭圆形轮廓。然后找到该轮廓的最小外接矩形,如果该矩形旋转度数为0,则不进行后续操作。否则,我们就去找矩形的上方、下方、左方、右方顶点。

有了这四个顶点后,根据上方和下方顶点的相对位置,我们就能判定矩形到底是怎么斜的了,无非两种情况:k > 0 || k < 0。这个斜率k呢,我们可以用两条短边的中点算出来,这样倒着旋转度数,就可以开心地得到正常角度的单词啦(≧▽≦)/这里要注意OpenCV的坐标系,否则容易搞错顶点,如下图:

坐标系

最后就是愉快的识别啦,首先直接拿下载的Tesseract-OCR进行识别,结果惨不忍睹,然后发现可以限定只识别小写字母以及单行处理,结果也是bad。无奈ㄟ( ▔, ▔ )ㄏ,只好自己动手,丰衣足食,进行训练,训练要记住的要点就是:找到26个字母都在训练集里就行!哇,我随机找了50张,标完了才发现还少了几个字母,被自己蠢哭TAT

闲谈

17年年末的夙愿=。=,结果拖到了现在才做完。当初大一数字识别各种网上找资料,MFC简直反人类。工作后接触比较多的就是OCR了,证照识别,验证码识别,不过仅仅都如前文所说,只是尽力做些预处理,真正核心的识别原理还没时间去了解,这个下来自己也想好好看看,嘿嘿😜

本期代码链接 → 传送门


广告时间

Java学习网站: how2j

VPS: VPS