opencv-python下简单KNN分类识别

KNN是数据挖掘中一种简单算法常用来分类,此次用来聚类实现对4种花的简单识别。

环境:python2.7+opencv3.0+windows10

原理:在使用KNN函数提取出4种花特征点以后,对需要辨认的图片提取体征点,与图库中4类花进行比较,匹配点最多的一类即视为同类。

代码:

读入图像数据:

 1
 2     img =cv2.imread(name)
 3
 4     q_img=[1]*10
 5     q_img[0] = cv2.imread("images/qiangwei1.jpg")
 6     q_img[1] = cv2.imread("images/qiangwei2.jpg")
 7     q_img[2] = cv2.imread("images/qiangwei3.jpg")
 8     q_img[3] = cv2.imread("images/qiangwei4.jpg")
 9     q_img[4] = cv2.imread("images/qiangwei5.jpg")
10
11     x_img=[1]*10
12     x_img[0] = cv2.imread("images/xinghua1.jpg")
13     x_img[1] = cv2.imread("images/xinghua2.jpg")
14     x_img[2] = cv2.imread("images/xinghua3.jpg")
15     x_img[3] = cv2.imread("images/xinghua4.jpg")
16     x_img[4] = cv2.imread("images/xinghua5.jpg")
17
18     t_img=[1]*10
19     t_img[0] = cv2.imread("images/taohua1.jpg")
20     t_img[1] = cv2.imread("images/taohua2.jpg")
21     t_img[2] = cv2.imread("images/taohua3.jpg")
22     t_img[3] = cv2.imread("images/taohua4.jpg")
23     t_img[4] = cv2.imread("images/taohua5.jpg")
24
25     y_img=[1]*10
26     y_img[0] = cv2.imread("images/yinghua1.jpg")
27     y_img[1] = cv2.imread("images/yinghua2.jpg")
28     y_img[2] = cv2.imread("images/yinghua3.jpg")
29     y_img[3] = cv2.imread("images/yinghua4.jpg")
30     y_img[4] = cv2.imread("images/yinghua5.jpg")

获取灰度图:

    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    q_gray=[1]*10
    q_gray[0] = cv2.cvtColor(q_img[0],cv2.COLOR_BGR2GRAY)
    q_gray[1] = cv2.cvtColor(q_img[1],cv2.COLOR_BGR2GRAY)
    q_gray[2] = cv2.cvtColor(q_img[2],cv2.COLOR_BGR2GRAY)
    q_gray[3] = cv2.cvtColor(q_img[3],cv2.COLOR_BGR2GRAY)
    q_gray[4] = cv2.cvtColor(q_img[4],cv2.COLOR_BGR2GRAY)

    x_gray=[1]*10
    x_gray[0] = cv2.cvtColor(x_img[0],cv2.COLOR_BGR2GRAY)
    x_gray[1] = cv2.cvtColor(x_img[1],cv2.COLOR_BGR2GRAY)
    x_gray[2] = cv2.cvtColor(x_img[2],cv2.COLOR_BGR2GRAY)
    x_gray[3] = cv2.cvtColor(x_img[3],cv2.COLOR_BGR2GRAY)
    x_gray[4] = cv2.cvtColor(x_img[4],cv2.COLOR_BGR2GRAY)

    t_gray=[1]*10
    t_gray[0] = cv2.cvtColor(t_img[0],cv2.COLOR_BGR2GRAY)
    t_gray[1] = cv2.cvtColor(t_img[1],cv2.COLOR_BGR2GRAY)
    t_gray[2] = cv2.cvtColor(t_img[2],cv2.COLOR_BGR2GRAY)
    t_gray[3] = cv2.cvtColor(t_img[3],cv2.COLOR_BGR2GRAY)
    t_gray[4] = cv2.cvtColor(t_img[4],cv2.COLOR_BGR2GRAY)

    y_gray=[1]*10
    y_gray[0] = cv2.cvtColor(y_img[0],cv2.COLOR_BGR2GRAY)
    y_gray[1] = cv2.cvtColor(y_img[1],cv2.COLOR_BGR2GRAY)
    y_gray[2] = cv2.cvtColor(y_img[2],cv2.COLOR_BGR2GRAY)
    y_gray[3] = cv2.cvtColor(y_img[3],cv2.COLOR_BGR2GRAY)
    y_gray[4] = cv2.cvtColor(y_img[4],cv2.COLOR_BGR2GRAY)

获取keypoints,descriptor:

    detect = cv2.xfeatures2d.SIFT_create(800)

    kp,des = detect.detectAndCompute(gray,None)

    q_kp=[1]*10
    q_des=[1]*10
    q_kp[0],q_des[0] = detect.detectAndCompute(q_gray[0],None)
    q_kp[1],q_des[1] = detect.detectAndCompute(q_gray[1],None)
    q_kp[2],q_des[2] = detect.detectAndCompute(q_gray[2],None)
    q_kp[3],q_des[3] = detect.detectAndCompute(q_gray[3],None)
    q_kp[4],q_des[4] = detect.detectAndCompute(q_gray[4],None)

    x_kp=[1]*10
    x_des=[1]*10
    x_kp[0],x_des[0] = detect.detectAndCompute(x_gray[0],None)
    x_kp[1],x_des[1] = detect.detectAndCompute(x_gray[1],None)
    x_kp[2],x_des[2] = detect.detectAndCompute(x_gray[2],None)
    x_kp[3],x_des[3] = detect.detectAndCompute(x_gray[3],None)
    x_kp[4],x_des[4] = detect.detectAndCompute(x_gray[4],None)

    t_kp=[1]*10
    t_des=[1]*10
    t_kp[0],t_des[0] = detect.detectAndCompute(t_gray[0],None)
    t_kp[1],t_des[1] = detect.detectAndCompute(t_gray[1],None)
    t_kp[2],t_des[2] = detect.detectAndCompute(t_gray[2],None)
    t_kp[3],t_des[3] = detect.detectAndCompute(t_gray[3],None)
    t_kp[4],t_des[4] = detect.detectAndCompute(t_gray[4],None)

    y_kp=[1]*10
    y_des=[1]*10
    y_kp[0],y_des[0] = detect.detectAndCompute(y_gray[0],None)
    y_kp[1],y_des[1] = detect.detectAndCompute(y_gray[1],None)
    y_kp[2],y_des[2] = detect.detectAndCompute(y_gray[2],None)
    y_kp[3],y_des[3] = detect.detectAndCompute(y_gray[3],None)
    y_kp[3],y_des[4] = detect.detectAndCompute(y_gray[4],None)

使用Knn匹配类进行匹配:

  bf = cv2.BFMatcher()
    q_matches=[1]*10
    q_matches[0]= bf.knnMatch(des,q_des[0],k=2)
    q_matches[1]= bf.knnMatch(des,q_des[1],k=2)
    q_matches[2]= bf.knnMatch(des,q_des[2],k=2)
    q_matches[3]= bf.knnMatch(des,q_des[3],k=2)
    q_matches[4]= bf.knnMatch(des,q_des[4],k=2)

    x_matches=[1]*10
    x_matches[0]= bf.knnMatch(des,x_des[0],k=2)
    x_matches[1]= bf.knnMatch(des,x_des[1],k=2)
    x_matches[2]= bf.knnMatch(des,x_des[2],k=2)
    x_matches[3]= bf.knnMatch(des,x_des[3],k=2)
    x_matches[4]= bf.knnMatch(des,x_des[4],k=2)

    t_matches=[1]*10
    t_matches[0]= bf.knnMatch(des,t_des[0],k=2)
    t_matches[1]= bf.knnMatch(des,t_des[1],k=2)
    t_matches[2]= bf.knnMatch(des,t_des[2],k=2)
    t_matches[3]= bf.knnMatch(des,t_des[3],k=2)
    t_matches[4]= bf.knnMatch(des,t_des[4],k=2)

    y_matches=[1]*10
    y_matches[0]= bf.knnMatch(des,y_des[0],k=2)
    y_matches[1]= bf.knnMatch(des,y_des[1],k=2)
    y_matches[2]= bf.knnMatch(des,y_des[2],k=2)
    y_matches[3]= bf.knnMatch(des,y_des[3],k=2)
    y_matches[4]= bf.knnMatch(des,y_des[4],k=2)
  

记录并对匹配点进行筛选:

sum1=0
    sum2=0
    sum3=0
    sum4=0
    for i in range(5):
      for m,n in q_matches[i]:
        if m.distance < 0.55*n.distance:
          sum1=sum1+1

    for i in range(5):
      for m,n in x_matches[i]:
        if m.distance < 0.55*n.distance:
          sum2=sum2+1

    for i in range(5):
      for m,n in t_matches[i]:
        if m.distance < 0.55*n.distance:
          sum3=sum3+1

    for i in range(5):
      for m,n in y_matches[i]:
        if m.distance < 0.55*n.distance:
          sum4=sum4+1

返回结果:

if max(sum1,sum2,sum3,sum4)==sum1:
      return "蔷薇"

    if max(sum1,sum2,sum3,sum4)==sum2:
      return "杏花"

    if max(sum1,sum2,sum3,sum4)==sum3:
      return "桃花"

    if max(sum1,sum2,sum3,sum4)==sum4:
      return "樱花"

gui使用利用wxformbuilder+wxpython开发的简单页面

最终文件:

效果图如下:

由于图库图片较少且算法较为简单,识别率不会很高。

原文地址:https://www.cnblogs.com/Aiden-/p/8871954.html

时间: 2024-10-22 07:22:06

opencv-python下简单KNN分类识别的相关文章

python实现简单kNN

注释写得很清楚了,熟悉了一下python的一些基本语法和numpy中的一些操作. 1 from numpy import * 2 import operator 3 4 def createDataSet(): 5 # generate the samples and labels. 6 group = array([[1.0,1.1], [1.0,1.0], [0,0], [0,0.1]]) 7 labels = ['A', 'A', 'B', 'B'] 8 print group 9 ret

python实现简单knn算法

原理:计算当前点(无label,一般为测试集)和其他每个点(有label,一般为训练集)的距离并升序排序,选取k个最小距离的点,根据这k个点对应的类别进行投票,票数最多的类别的即为该点所对应的类别.代码实现(数据集采用的是iris): 1 import numpy as np 2 from sklearn.datasets import load_iris 3 from sklearn.model_selection import train_test_split 4 from sklearn

Python下opencv使用笔记(一)(图像简单读取、显示与储存)

写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大.能够处理很多不同的问题,同一时候它的很多开源免费的库使得python的使用也是十分的广泛. 在科学计算.数据处理与图像领域,自己以前一直在使用matlab.感觉matlab也是一个语言优美.简单方便的编程语言,都说matlab与python在某些领域是非常类似的,确实是这样,就科学计算.数据处理上真

KNN分类算法实现手写数字识别

需求: 利用一个手写数字"先验数据"集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ?数据维度比较大,样本数比较多. ? 数据集包括数字0-9的手写体. ?每个数字大约有200个样本. ?每个样本保持在一个txt文件中. ?手写体图像本身的大小是32x32的二值图,转换到txt文件保存后,内容也是32x32个数字,0或者1,如下: 数据集压缩包解压后有两个目录:(将这两个目录文件夹拷贝的项目路径下E:/KNNCase/digits/) ?目录trainingD

【python下使用OpenCV实现计算机视觉读书笔记3】读写视频文件

Lua可以调用C函数的能力将极大的提高Lua的可扩展性和可用性. 对于有些和操作系统相关的功能,或者是对效率要求较高的模块,我们完全可以通过C函数来实现,之后再通过Lua调用指定的C函数. 对于那些可被Lua调用的C函数而言,其接口必须遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L). 简单说明一下,该函数类型仅仅包含一个表示Lua环境的指针作为其唯一的参数,实现者可以通过该指针进一步获取Lua代码中实际传入的参数.返回值是整型,表示该

python下PCA算法与人脸识别

关于这部分主要是想在python下试验一下主成分分析(PCA)算法以及简单的人脸识别.曾经详述过matlab下的PCA以及SVM算法进行人脸识别技术,参考如下: 主成分分析法-简单人脸识别(一) 主成分分析-简单人脸识别(二) PCA实验人脸库-人脸识别(四) PCA+支持向量机-人脸识别(五) 主成分分析(PCA)算法主要是对高维数据进行降维,最大限度的找到数据间的相互关系,在机器学习.数据挖掘上很有用.在机器学习领域算法众多,贴一个: 大神博客索引 关于PCA的核心思想与原理介绍上述已经给出

Python下opencv库的安装过程与一些问题汇总

本文主要内容是python下opencv库的安装过程,涉及我在安装时遇到的问题,并且,将从网上搜集并试用的一些解决方案进行了简单的汇总,记录下来. 由于记录的是我第一次安装opencv库的过程,所以内容涵盖可能不全面,如果有出错的地方请务必指正.下面进入主题. 关于python的下载安装不再赘述,python的版本号是我们在opencv库的安装过程中需要用到的,cmd运行python可以进行查看. 通常,我们使用pip命令来安装扩展库. 打开cmd运行 pip install opencv-py

python opencv linux下合作操作摄像头

设想: 之前使用C#控制摄像头的,现在厌烦了windows,决定转移到linux下玩耍.感觉能够python语言特有的好入手,正好替代C#,选择了deepin2014.1作为试验品.现在的设想是第一步实现在自己电脑上对视频的采集,第二步实现视频传输.慢慢来吧.百度说python想操作摄像头,VideoCapture是windows特有的,linux要用opencv才行. 下载: 百度下载了最新的opencv,2.4.9版本,正好和deepin2014.1自带的python2.7般配,不冲突.且发

【python下使用OpenCV实现计算机视觉读书笔记1】输入输出

亲爱的网友,我这里有套课程想和大家分享,如果对这个课程有兴趣的,可以加我的QQ2059055336和我联系. 课程内容简介 我们软件是基于移动设备的.所以我们必然的选择了安卓作为我们的开发工具.课程中,我们将简要的介绍Android的基本概念,然后进行我们的实战开发.在开发中,大家讲学习到基本的组件,适配UI,数据的存储,多线程下载,开机广播,闹钟提醒,短信发送等实际项目开发中碰到的有用的知识点.通过课程学习,让大家能够掌握Android软件开发的流程,注意点,及优化.帮助大家迅速的掌握Andr