本實驗代碼已上傳面包多,請點擊購買,或者關注[全都是碼農]公眾號,回復[最近鄰],限時免費獲取!
實驗概述
本實驗皆在運用OpenCV、Python等工具采用適當的算法對手寫體數字進行識別與檢測,可以提供訓練集與測試集進行訓練,並可以輸入手寫字體進行測試檢驗。
通過獨立的完成本實驗,可以極大地提高本人對於Python、OpenCV的理解,掌握手寫數字的特征提取技術和最近鄰模板匹配法。
環境說明
系統:window 10
軟件:PyCharm Community Edition 2020.2.2 x64
語言:python 3.6
環境:cv2,numpy,matplotlib.pyplot,time
數據集
本數據集為100張圖片,分別為數字0-9,每個數字10張圖片,8張訓練集,2張測試集。如下:
圖 1 數字零 |
圖 2 數字一 |
|---|---|
圖 3 數字二 |
圖 4 數字三 |
術語定義
訓練集:可以訓練模型參數,使模型擬合於正確的預測函數。
測試集:通過訓練過的模型進行檢驗,評估最終模型泛化能力。
驗證集:用於調超參數,監控模型是否發生過擬合。
需求說明
實驗內容
\1. 學習利用行列掃描的方法獲取手寫數字的上、下、左、右位置的子程序。
\2. 設計手寫數字的特征提取算法,並編寫對應特征提取程序。
\3. 編寫基於最近鄰模板匹配的手寫數字識別程序。
實驗結果與分析
記錄輸入數字0-9各10個,程序運行后相應的識別結果,並對結果進行深入分析。
\1. 記錄每個樣品的特征提取效果圖。
\2. 記錄該樣品對應的歸一化后的特征值。
\3. 統計每個數字正確識別率。並對錯誤識別的情況進行深入分析。
軟件設計
一、體系設計圖
函數清單
| 函數名 | 函數功能簡述 | 函數接口簡述 |
|---|---|---|
| ImgToNp() | 將圖片的路徑導入到矩陣中。 | 輸入:無 輸出:圖片路徑矩陣 |
| outFeature() | 處理特征函數並貼標簽。 | 輸入:圖片路徑矩陣 輸出:訓練圖片矩陣集與標簽集 |
| star() | 程序按照預設好的結構進行循環測試與輸出。 | 輸入:訓練圖片矩陣集與標簽集 輸出:訓練結果 |
| TestImgToNp() | 輸入測試圖片,並轉化為矩陣。 | 輸入:測試圖片地址。 輸出:測試圖片矩陣。 |
| outfeatureImg() | 輸出特征圖與特征值。 | 輸入:訓練圖片矩陣集 輸出:保存特征圖與特征值為文件。\ |
代碼介紹
(一)Mainapp.py代碼
mainapp.py為主程序,表1函數清單中的函數均包含於其中。
運行程序后,程序先行運用ImgToNp()函數將img文件夾中0-9文件夾里的80個樣本圖片轉化為矩陣保存於變量中並將其返回。
四、實驗結果
運行mainapp.py后,輸出框如下所示:
\1. 圖片地址以導入矩陣......
\2. 准備提取特征......
\3. 特征以存儲於feature矩陣......
\4. 准備貼標簽......
\5. 標簽以貼完......
\6. 是否輸出特征圖與特征值?y/n:
輸入y時,程序將輸出80張樣本的特征值與特征圖,分別存儲於”./fandimg/{0-9}”,以及”./fandimg/featureArray/{0-9}”中。如下圖:


程序繼續運行,輸出框輸出:
1. 3-9.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[3. 7. 1.]]但是正確結果為:3
2. 4-9.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[1. 1. 1.]]但是正確結果為:4
3. 5-10.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[5. 1. 1.]]但是正確結果為:5
4. 6-10.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[1. 1. 1.]]但是正確結果為:6
5. 7-9.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[1. 1. 1.]]但是正確結果為:7
6. 8-9.bmp 這張圖判斷錯誤了,系統判斷為:3 最接近的三個結果為:[[8. 9. 3.]]但是正確結果為:8
7. 8-10.bmp 這張圖判斷錯誤了,系統判斷為:9 最接近的三個結果為:[[8. 9. 9.]]但是正確結果為:8
8. 9-9.bmp 這張圖判斷錯誤了,系統判斷為:1 最接近的三個結果為:[[9. 7. 1.]]但是正確結果為:9
f

圖 1 數字零
圖 2 數字一
圖 3 數字二
圖 4 數字三