來源:小白學視覺
作者:努比
綜述
2012年iOS應用商店中發布了一個名為FuelMate的Gas跟蹤應用。小伙伴們可以使用該應用程序跟蹤汽油行駛里程,以及有一些有趣的功能,例如Apple Watch應用程序、vin.li集成以及基于趨勢mpg的視覺效果。
燃料伴侶
對此我們有一個新想法,該如何添加一個功能幫助我們在泵中掃描燃油,并在應用程序中輸入燃油信息?讓我們深入研究如何實現這一目標。
技術
對于這個項目的我們首先應該編寫一個簡單的Python應用程序以拍攝汽油泵的圖像,然后嘗試從中讀取數字。OpenCV是用于計算機視覺應用程序的流行的跨平臺庫。它包括各種圖像處理實用程序以及某些機器學習功能。除此之外我們希望可以先使用Python對其進行原型設計,然后將處理代碼轉換為C ++以在iOS應用程序上運行。
目標
我們首先要考慮以下兩個問題:
1.我們可以從圖像中分離出數字嗎?
2.我們可以確定圖像代表哪個數字嗎?
數字分割
如何確定圖像中的數字有多種方法,但是我提出了使用簡單的圖像閾值法來嘗試查找數字的方法。
圖像閾值化的基本思想是將圖像轉換為灰度,然后說灰度值小于某個常數的任何像素,則該像素為一個值,否則為另一個。最后,您得到的二進制圖像只有兩種顏色,在大多數情況下只是黑白圖像。
這個概念在OCR應用中非常有效,但是主要問題是決定對該閾值使用什么。我們可以選擇一些常量,也可以使用OpenCV選擇其他一些選項。我們可以使用自適應閾值而不是使用常數,這將使用圖像的較小部分并確定要使用的不同閾值。這在具有不同照明情況的應用中特別有用,特別是在掃描氣泵中。
將圖像設置為閾值后,可以使用OpenCV的findContours方法查找圖像中連接了白色像素部分的區域。繪制輪廓后,便可以裁剪出這些區域并確定它們是否可能是數字以及它是什么數字。
基本圖像處理流程
這是我在測試圖像處理中使用的原始圖像。它有一些眩光點,但是圖像相當干凈。讓我們逐步完成獲取此源圖像的過程,并嘗試將其分解為單個數字。
原始圖片
影像準備
在開始圖像處理流程之前,我們決定先調整一些圖像屬性,然后再繼續。這有點試驗和錯誤,但注意到,當我們調整圖像的曝光度時,可以獲得更好的結果。下面是使用Python調整后的圖像,相當于曝光(阿爾法)的圖像cv::Mat::convertTo這是剛剛在圖像墊乘法操作cv2.multiply(some/_img, np.array([some/_alpha]),
調整曝光
灰階
將圖像轉換為灰度。
轉換為灰度
模糊
模糊圖像以減少噪點。我們嘗試了許多不同的模糊選項,但僅用輕微的模糊就找到了最佳結果。
稍微模糊
閾值圖像轉換為黑白圖像
在下圖中,使用cv2.adaptiveThreshold帶有cv2.ADAPTIVE/_THRES/_GAUSSIAN/_C選項的方法。此方法采用兩個參數,塊大小和要調整的常數。確定這兩者需要一些試驗和錯誤,更多有關優化部分的內容。
閾值為黑/白
填補空白
由于大多數燃油泵都使用某種7段LCD顯示屏,因此數字中存在一些細微的間隙,無法使用輪廓繪制方法,因此我們需要使這些段看起來相連。在這種情況下,我們將轉到erode圖像來彌補這些差距。由于大家可能希望使用,所以這似乎向后看,dilate但是這些方法通常適用于圖像的白色部分。在我們的案例中,我們正在“侵蝕”白色背景以使數字看起來更大。
反轉圖像
在嘗試在圖像中查找輪廓之前,我們需要反轉顏色,因為該findContours方法將找到白色的連接部分,而當前的數字是黑色。
顏色反轉
在圖像上找到輪廓
下圖顯示了我們的原始圖像,該圖像在上圖的每個輪廓上都有包圍框。大家可以看到它找到了數字,但也找到了一堆不是數字的東西,因此我們需要將它們過濾掉。
輪廓過濾
1.現在我們有了許多輪廓,我們需要找出我們關心的輪廓。瀏覽了一堆氣泵的顯示和場景后,使用一套適用于輪廓的快速規則。
2.收集所有我們將分類為潛在小數的正方形輪廓。
3.扔掉任何不是正方形或高矩形的東西。
4.使輪廓與某些長寬比匹配。LCD顯示屏中的十個數字中有九個數字的長寬比類似于下面的藍色框高光之一。該規則的例外是數字“ 1”,其長寬比略有不同。通過使用一些樣本輪廓,我將0–9!1方面確定為0.6,將1方面確定為0.3。它將使用這些比率和+/-緩沖區來確定輪廓是否是我們想要的東西,并收集這些輪廓。
5.對潛在數字應用一組附加規則,在這里我們將確定輪廓邊界是否偏離所有其他潛在數字的平均高度或垂直位置。由于數字的大小應相同,并且在相同的Y上對齊,因此我們可以丟棄它認為是數字的任何輪廓,但不能像其他輪廓那樣將其對齊和調整大小。
預測
有兩個等高線輪廓,一個帶潛在位數,一個帶潛在小數位,我們可以使用這些輪廓邊界裁剪圖像,并將其輸入經過訓練的系統中以預測其值。有關此過程的更多信息,請參見“數字培訓”部分。
查找小數
在圖像中查找小數點是要解決的另一個問題。由于它很小,有時會連接到它旁邊的手指,因此使用我們在手指上使用的方法來確定它似乎有問題。當我們過濾輪廓時,我們收集了可能是十進制的正方形輪廓。從上一步獲得經過驗證的數字輪廓之后,我們將找到數字的最左x位置和最右x位置,以確定我們期望的小數位數。然后,我們將遍歷那些潛在的小數,確定它是否在該空間以及該空間的下半部分,并將其分類為小數。找到小數點后,我們可以將其插入到我們上面預測的數字字符串中。
數字培訓
在機器學習的世界中,解決OCR問題是一個分類問題。我們建立了一組訓練有素的數據,例如圖像處理中的數字,將它們分類為某種東西,然后使用該數據來匹配任何新圖像。一旦基本的圖像隔離功能開始工作,我就創建了一個腳本,該腳本可以遍歷圖像文件夾,運行數字隔離代碼,然后將裁剪的數字保存到新文件夾中供我查看。運行完之后,我會有一個未經訓練的數字文件夾,然后可以用來訓練系統。
由于OpenCV已經包含了k近鄰(k-NN)實現,因此無需引入任何其他庫。為了進行訓練,我們瀏覽了數字作物的文件夾,然后將其放入標有0–9的新文件夾中,因此每個文件夾中都有一個數字的不同版本的集合。我們沒有大量的這些圖像,但是有足夠的證據來證明這是可行的。由于這些數字是相當標準的,我認為我不需要大量訓練有素的圖像就可以相當準確。
k-NN工作原理的基礎是,我們將以黑白方式加載每個圖像,將該圖像存儲在每個像素處于打開或關閉狀態的數組中,然后將這些打開/關閉像素與特定的數字相關聯。然后,當我們要預測一個新圖像時,它將找出哪個訓練圖像與這些像素最匹配,然后向我們返回最接近的值。
整理好數字后,將創建一個新的腳本,該腳本將遍歷這些文件夾,獲取每個圖像并將該圖像與數字關聯。到目前為止,在大多數代碼中,一般的圖像處理概念在Python和C ++中都應用相同,但是在這里會有細微的差別。
在大多數此類應用程序的Python示例中,分類被寫入兩個文件,一個包含分類,另一個包含該分類的圖像內容。通常使用NumPy和標準文本文件完成此操作。但是,由于我想在iOS應用程序上重用該系統,因此我需要想出一種可以擁有跨平臺分類文件的方式。當時,我什么都找不到,因此最終編寫了一個快速實用程序,該實用程序將從Python中獲取分類數據并將其序列化為JSON文件,我可以在OpenCV的FileStorage系統的C ++端使用它。這不漂亮,但是我寫了一個簡單的MatPython中的序列化方法,它將為OpenCV創建合適的結構以在iOS端讀取。現在,當我訓練數字時,我將獲得NumPy文件供我的Python測試使用,然后獲取一個JSON文檔,我可以將其拖到我的iOS應用程序中。您可以在此處看到該代碼。
優化
一旦確定了數字隔離和預測的兩個目標,就需要對算法進行優化,以預測泵的新圖像上的數字。
在優化的初始階段,創建了一個簡單的Playground應用程序,其中使用了OpenCV提供的一些簡單的UI組件。使用這些組件,可以創建一些簡單的軌跡欄,以左右滑動并更改不同的值并重新處理圖像。圍繞該cv2.imshow方法創建了一個小包裝程序,該方法可以平鋪顯示的窗口,因為我討厭總是重新放置它們,
嘗試不同的變量
我們可以加載不同的圖像,并在圖像處理中嘗試變量的不同變化,并確定最佳的組合。
自動化
在每個圖像上測試不同的變量是上手的好方法,但是我們想要一種更好的方法來驗證是否更改了一個圖像的變量是否會對其他任何圖像產生影響。為此,我們想出了針對這些圖像進行一些自動化測試的系統。
我拍攝了每個測試圖像,并將它們放在文件夾中。然后,我用圖像中期望的數字來命名每個文件,并用小數點“ A”表示。應用程序可以加載該目錄中的每個圖像并預測數字,然后將其與文件名中的數字進行比較以確定是否匹配。這使我們可以針對所有不同的圖像快速嘗試更改。
自動測試輸出
更進一步,我創建了此腳本的不同版本,該腳本將嘗試對這組圖像進行模糊,閾值等變量的幾乎每種組合,并找出最優化的變量集將具有最佳的性能。準確性。該腳本在計算機上花費了相當長的時間才能運行,大約需要7個小時,但是最后提出了一組不同的變量,這些變量在我們手動測試時找不到。
結論
這是否是任何人實際上都會使用的功能尚待確定,但這在實現某些機器學習概念和使用OpenCV方面是一個有趣的練習。到目前為止,在我們的測試中,應用程序最大的問題是泵顯示屏上的眩光。根據泵上的照明和手機的角度,可能會導致某些掃描失效。
代碼鏈接:https://github.com/kazmiekr/G...
聲明:轉載請說明出處
推薦專欄文章
- 基于OpenCV的實時睡意檢測系統
- 【CUDA學習筆記】第一篇:一個基本的CUDA C程序(附配置方法和安裝包下載方式)
- 【最強模型之道】AWS Auto-Aug:通過Weight共享改進自動數據增廣,打造最高精度單模型
審核編輯:符乾江
-
人工智能
+關注
關注
1791文章
47183瀏覽量
238266 -
數字識別
+關注
關注
2文章
19瀏覽量
10140
發布評論請先 登錄
相關推薦
評論