2011-11-09 175 views
15

我想從一個典型的記分牌中提取數字,你會發現在高中健身房。我有一個數字「鬧鐘」字型每個數字和設法透視校正,閾值和從視頻源使用OpenCV記分牌數字識別

Sample input

這裏提取一個給定的數字是我的模板輸入的樣本

Template input

我的問題是沒有一個分類方法會準確確定所有數字0-9。我已經嘗試了幾種方法

1)Tesseract OCR - 這一個一直在4上搞砸,並經常返回奇怪的結果。只需使用命令行版本。如果我真的試圖用「鬧鐘」字體來訓練它,我每次都會得到未知的角色。

2)k最接近OpenCV - 我搜索一個由我的模板圖像(0-9)組成的數據庫,並查看哪一個數據庫最近。我經常得到混亂3/1和7/1之間

3)cvMatchShapes - 這是一個相當糟糕的,它通常不能告訴的數字2之差爲每個輸入數字

4)切線距離 - 這是最接近的,但輸入和我的模板之間的最小切線距離結束映射「7」到「1」每次

我真的很茫然,得到這樣一個分類算法簡單的問題。我覺得我已經很好地清理了輸入,對於分類來說這是一個相當簡單的例子,但我無法獲得足夠可靠的任何實際應用。任何關於在哪裏尋找分類算法,或如何正確使用它們的想法,將不勝感激。我沒有清理輸入嗎?更好的輸入數據庫呢?我不知道我還會用什麼來輸入,每個數字和模板在這一點上看起來都很有用。

回答

9

經典的數字識別(在這種情況下應該可以很好地工作)是在圖像的周圍裁剪圖像,將其大小調整爲4x4像素,最後應用dct進一步縮小搜索空間(然後,您可以選擇前4-6個值)。用這些價值觀來訓練一個分類器。 SVM是一個很好的例子,可以在OpenCV中使用。

它不像艾瑪或馬丁的建議那麼簡單,但更優雅,我認爲,更強大。

編輯

鑑於你輸入的寬/高比,您可以選擇一些不同的小分辨率。如3x4

+0

我使用了3x5圖像(類似於數字顯示中的行/列),它在k最近搜索時效果很好。死了。謝謝! – pyromanfo

+0

很高興聽到!繼續! – Sam

3

聽起來可能聽起來很愚蠢,但是您是否嘗試過直接檢查黑色條,然後水平地在頂部和底部半部 - 中心線的左側和右側進行檢查?

3

鑑於輸入的高度規律性,您可以定義一組要檢查的圖像的7個目標區域。每個區域應該包含顯示器每個數字的7段中的一段的重要部分,但不重疊。

然後,您可以檢查每個區域並平均像素的顏色/亮度以生成給定二進制狀態的概率。如果你在所有領域的可能性很高,你可以很容易地找出數字是什麼。

它不像純粹的ML型算法那麼優雅,但ML更適合於不規則的輸入,在這種情況下似乎並不適用 - 所以您爲了準確性而交易優雅。

2

如果您嘗試使用Tesseract進行文本識別,請嘗試傳遞未輸入一位數字,但輸入一些重複的數字,有時可能會產生更好的結果,here's the example。 但是,如果您計劃使用商業軟件,則可能需要查看商業OCR SDK。例如,嘗試ABBYY FineReader Engine。免費使用應用程序並不便宜,但對於商業來說,它可以爲您的產品帶來很好的價值。據我所知,ABBYY提供了最好的OCR質量,例如檢出http://www.splitbrain.org/blog/2010-06/15-linux_ocr_software_comparison