我正在編寫OCR應用程序以從屏幕截圖圖像中讀取字符。目前,我只關注數字。我部分基於我的方法在這篇博文中:http://blog.damiles.com/2008/11/basic-ocr-in-opencv/。來自屏幕截圖的低分辨率文本的OCR
我可以使用一些聰明的閾值成功地提取每個單獨的字符。有些棘手的地方是匹配字符。即使使用固定的字體和大小,也會有一些變量,例如背景顏色和字距,這些變量會導致相同的數字以不同的形狀出現。例如,下面的圖像分割成3個部分:
- 上:我成功地從截圖中提取的對象位的
- 中東:模板:從我訓練的一個數字設置
- 下圖:頂部和中間圖像之間的誤差(絕對差值)
零件已全部縮放(兩條綠色水平線之間的距離表示一個像素)。
你可以看到,儘管頂部和中間圖像清晰表示2,它們之間的誤差是相當高的。這會導致在匹配其他數字時出現誤報 - 例如,不難看出放置良好的7可以如何匹配圖像中的目標數字比中間圖像更好。
目前,我正在處理這個問題的方法是爲每個數字設置一堆訓練圖像,並將目標數字與這些圖像相匹配,一一對應。我嘗試了訓練集的平均圖像,但這並不能解決問題(其他數字上的誤報)。
我有點不願意使用移位模板執行匹配(它與我現在所做的基本相同)。有沒有比簡單的絕對差異更好地比較兩幅圖像的方法?我想到的可能是類似於2D中的EMD(推土機距離,http://en.wikipedia.org/wiki/Earth_mover's_distance):基本上,我需要一種比較方法,它不像全局移動和局部小變化那樣敏感(白色像素旁邊的像素變爲白色,或黑色像素旁邊的像素變爲黑色),但對全局變化敏感(黑色像素遠不及白色像素變爲黑色,反之亦然)。
任何人都可以提出一個比絕對差異更有效的匹配方法嗎?
我使用C風格的Python包裝(import cv
)在OpenCV中完成所有這些工作。
謝謝!我一定會看看哈爾瀑布。你認爲它將與簡單圖像減法相比有多高效?我預計它會變慢。但是,如果速度慢5倍,但取代10個圖像檢查以獲得相同的效果,那麼它肯定值得。 – misha 2012-01-02 05:03:38
您必須生成級聯,這是一個非常耗時的過程(但也是愚蠢的可並行化)。它還需要大量的輸入數據(我會使用桌面上每種字體的數字)。 – rsaxvc 2012-01-02 05:17:04
慢於減法,但您可以一次搜索特定級聯的所有實例的圖像。 – rsaxvc 2012-01-02 05:19:19