OpenCV簡單標準數(shù)字識別的完整實例
在學(xué)習(xí)openCV時,看到一個問答做數(shù)字識別,里面配有代碼,應(yīng)用到了openCV里面的ml包,很有學(xué)習(xí)價值。
https://stackoverflow.com/questions/9413216/simple-digit-recognition-ocr-in-opencv-python#
import sys
import numpy as np
import cv2
im = cv2.imread('t.png')
im3 = im.copy()
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) #先轉(zhuǎn)換為灰度圖才能夠使用圖像閾值化
thresh = cv2.adaptiveThreshold(gray,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2) #自適應(yīng)閾值化
################## Now finding Contours ###################
#
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
#邊緣查找,找到數(shù)字框,但存在誤判
samples = np.empty((0,900)) #將每一個識別到的數(shù)字所有像素點作為特征,儲存到一個30*30的矩陣內(nèi)
responses = [] #label
keys = [i for i in range(48,58)] #48-58為ASCII碼
count =0
for cnt in contours:
if cv2.contourArea(cnt)>80: #使用邊緣面積過濾較小邊緣框
[x,y,w,h] = cv2.boundingRect(cnt)
if h>25 and h < 30: #使用高過濾小框和大框
count+=1
cv2.rectangle(im,(x,y),(x+w,y+h),(0,0,255),2)
roi = thresh[y:y+h,x:x+w]
roismall = cv2.resize(roi,(30,30))
cv2.imshow('norm',im)
key = cv2.waitKey(0)
if key == 27: # (escape to quit)
sys.exit()
elif key in keys:
responses.append(int(chr(key)))
sample = roismall.reshape((1,900))
samples = np.append(samples,sample,0)
if count == 100: #過濾一下過多邊緣框,后期可能會嘗試極大抑制
break
responses = np.array(responses,np.float32)
responses = responses.reshape((responses.size,1))
print ("training complete")
np.savetxt('generalsamples.data',samples)
np.savetxt('generalresponses.data',responses)
#
cv2.waitKey()
cv2.destroyAllWindows()
訓(xùn)練數(shù)據(jù)為:

測試數(shù)據(jù)為:

使用openCV自帶的ML包,KNearest算法
import sys
import cv2
import numpy as np
####### training part ###############
samples = np.loadtxt('generalsamples.data',np.float32)
responses = np.loadtxt('generalresponses.data',np.float32)
responses = responses.reshape((responses.size,1))
model = cv2.ml.KNearest_create()
model.train(samples,cv2.ml.ROW_SAMPLE,responses)
def getNum(path):
im = cv2.imread(path)
out = np.zeros(im.shape,np.uint8)
gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
#預(yù)處理一下
for i in range(gray.__len__()):
for j in range(gray[0].__len__()):
if gray[i][j] == 0:
gray[i][j] == 255
else:
gray[i][j] == 0
thresh = cv2.adaptiveThreshold(gray,255,1,1,11,2)
image,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
count = 0
numbers = []
for cnt in contours:
if cv2.contourArea(cnt)>80:
[x,y,w,h] = cv2.boundingRect(cnt)
if h>25:
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
roi = thresh[y:y+h,x:x+w]
roismall = cv2.resize(roi,(30,30))
roismall = roismall.reshape((1,900))
roismall = np.float32(roismall)
retval, results, neigh_resp, dists = model.findNearest(roismall, k = 1)
string = str(int((results[0][0])))
numbers.append(int((results[0][0])))
cv2.putText(out,string,(x,y+h),0,1,(0,255,0))
count += 1
if count == 10:
break
return numbers
numbers = getNum('1.png')

總結(jié)
到此這篇關(guān)于OpenCV簡單標準數(shù)字識別的文章就介紹到這了,更多相關(guān)OpenCV標準數(shù)字識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python3調(diào)用ansible?api使用實例例說明
這篇文章主要為大家介紹了python3?調(diào)用ansible?api使用說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
Pytorch中torch.repeat_interleave()函數(shù)使用及說明
這篇文章主要介紹了Pytorch中torch.repeat_interleave()函數(shù)使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01
python?PyQt5中QButtonGroup的詳細用法解析與應(yīng)用實戰(zhàn)記錄
在PyQt5中,QButtonGroup是一個用于管理按鈕互斥性和信號槽連接的類,它可以將多個按鈕劃分為一個組,管理按鈕的選中狀態(tài)和ID,本文詳細介紹了QButtonGroup的創(chuàng)建、使用方法和實際應(yīng)用案例,適合需要在PyQt5項目中高效管理按鈕組的開發(fā)者2024-10-10
Centos5.x下升級python到python2.7版本教程
這篇文章主要介紹了Centos5.x下升級python到python2.7版本教程,本文使用編譯安裝方式,并配置了一系列需要更改的配置項,需要的朋友可以參考下2015-02-02

