魏老师学生——Cecil:学习OpenCV-机器视觉之旅
手写数字的OCR
- OpenCV安装包中提供一张图片,上面有5000个手写数字,每个数字重复500次。把图片拆分为20×20的单独数字。这就是特征集。
- 每个数字的前250个样本做训练数据,剩余250个样本做测试数据。测试准确率高于90%
- 改善准确率:提供更多训练数据。
- 保留分类器:避免每次运行程序都需要准备。
- 降低内存:将灰度值(uint8)特征转为np.uint8格式。加载数据时转回float32。
代码演示
import cv2
import numpy as np
from matplotlib import pyplot as plt
img=cv2.imread('.image2/classification.jpg')
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cells=[np.hsplit(row,100) for row in np.vsplit(gray,50)]
x=np.array(cells)
train=x[:,:50].reshape(-1,400).astype(np.float32)
test=x[:,50:100].reshape(-1,400).astype(np.float32)
k=np.arange(10)
train_labels=np.repeat(k,250)[:,np.newaxis]
test_labels=train_labels.copy()
knn=cv2.KNearest()
knn.train(train,train_labels)
ret,result,neighbours,dist=knn.find_nearest(test,k=5)
matches=result==test_labels
correct=np.count_nonzero(matches)
accuracy=correct*100.0/result.size
print(accuracy)
np.savez('knn_data.npz',train=train,train_labels=train_labels)
with np.load('knn_data.npz') as data:
print(data.files)
train=data['train']
train_labels=data['train_labels']
英文字母的OCR
- 一部分作为训练样本,一部分作为测试样本。先把字母表转换为ASC码,因为无法直接处理字母。
代码演示
import cv2
import numpy as np
from matplotlib import pyplot as plt
data=np.loadtxt('letter_recognition.data',dtype='float32',delimiter=',',converters={0:lambda ch:ord(ch)-ord('A')})
train,test=np.vsplit(data,2)
responses,trainData=np.hsplit(train,[1])
labels,testData=np.hsplit(test,[1])
knn=cv2.KNearset()
knn.train=(trainData,responses)
ret,result,neighbours,dist=knn.find_nearset(testData,k=5)
correct=np.count_nonzero(result==labels)
accuracy=correct*100.0/10000
print(accuracy)