- OpenCV Python 教程
- OpenCV Python - 首页
- OpenCV Python - 概述
- OpenCV Python - 环境配置
- OpenCV Python - 读取图像
- OpenCV Python - 写入图像
- OpenCV Python - 使用Matplotlib
- OpenCV Python - 图像属性
- OpenCV Python - 位运算
- OpenCV Python - 形状和文本
- OpenCV Python - 鼠标事件
- OpenCV Python - 添加轨迹条
- OpenCV Python - 缩放和旋转
- OpenCV Python - 图像阈值
- OpenCV Python - 图像滤波
- OpenCV Python - 边缘检测
- OpenCV Python - 直方图
- OpenCV Python - 颜色空间
- OpenCV Python - 图像变换
- OpenCV Python - 图像轮廓
- OpenCV Python - 模板匹配
- OpenCV Python - 图像金字塔
- OpenCV Python - 图像加法
- OpenCV Python - 图像混合
- OpenCV Python - 傅里叶变换
- OpenCV Python - 捕捉视频
- OpenCV Python - 播放视频
- OpenCV Python - 从视频中提取图像
- OpenCV Python - 从图像生成视频
- OpenCV Python - 人脸检测
- OpenCV Python - 均值漂移/CamShift
- OpenCV Python - 特征检测
- OpenCV Python - 特征匹配
- OpenCV Python - 数字识别
- OpenCV Python 资源
- OpenCV Python - 快速指南
- OpenCV Python - 资源
- OpenCV Python - 讨论
OpenCV Python - 基于KNN的数字识别
KNN,代表**K近邻**,是一种基于监督学习的机器学习算法。它试图将一个新的数据点归类到与现有类别最相似的类别中。所有现有的数据都被分类到不同的类别中,一个新的数据点根据相似性被归类到其中一个类别中。
KNN算法基于以下原则:
- 选择一个奇数作为K,表示要检查的邻居数量。
- 计算它们的欧氏距离。
- 根据计算出的欧氏距离,获取K个最近邻。
- 统计每个类别中数据点的数量。
- 数据点数量最多的类别就是新的数据点被归类的类别。
作为使用OpenCV实现KNN算法的示例,我们将使用以下图像digits.png,它包含5000张手写数字的图像,每张图像大小为20X20像素。
第一个任务是将此图像分割成5000个数字。这是我们的特征集。将其转换为NumPy数组。程序如下:
import numpy as np import cv2 image = cv2.imread('digits.png') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) fset=[] for i in np.vsplit(gray,50): x=np.hsplit(i,100) fset.append(x) NP_array = np.array(fset)
现在我们将这些数据分成训练集和测试集,每个大小为(2500,20x20),如下所示:
trainset = NP_array[:,:50].reshape(-1,400).astype(np.float32) testset = NP_array[:,50:100].reshape(-1,400).astype(np.float32)
接下来,我们必须为每个数字创建10个不同的标签,如下所示:
k = np.arange(10) train_labels = np.repeat(k,250)[:,np.newaxis] test_labels = np.repeat(k,250)[:,np.newaxis]
现在我们可以开始KNN分类了。创建分类器对象并训练数据。
knn = cv2.ml.KNearest_create() knn.train(trainset, cv2.ml.ROW_SAMPLE, train_labels)
选择k值为3,获取分类器的输出。
ret, output, neighbours, distance = knn.findNearest(testset, k = 3)
将输出与测试标签进行比较,以检查分类器的性能和准确性。
该程序显示在准确检测手写数字方面,准确率为91.64%。
result = output==test_labels correct = np.count_nonzero(result) accuracy = (correct*100.0)/(output.size) print(accuracy)
广告