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

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

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

代码:

读入图像数据:

     img =cv2.imread(name)

     q_img=[1]*10
q_img[0] = cv2.imread("images/qiangwei1.jpg")
q_img[1] = cv2.imread("images/qiangwei2.jpg")
q_img[2] = cv2.imread("images/qiangwei3.jpg")
q_img[3] = cv2.imread("images/qiangwei4.jpg")
q_img[4] = cv2.imread("images/qiangwei5.jpg") x_img=[1]*10
x_img[0] = cv2.imread("images/xinghua1.jpg")
x_img[1] = cv2.imread("images/xinghua2.jpg")
x_img[2] = cv2.imread("images/xinghua3.jpg")
x_img[3] = cv2.imread("images/xinghua4.jpg")
x_img[4] = cv2.imread("images/xinghua5.jpg") t_img=[1]*10
t_img[0] = cv2.imread("images/taohua1.jpg")
t_img[1] = cv2.imread("images/taohua2.jpg")
t_img[2] = cv2.imread("images/taohua3.jpg")
t_img[3] = cv2.imread("images/taohua4.jpg")
t_img[4] = cv2.imread("images/taohua5.jpg") y_img=[1]*10
y_img[0] = cv2.imread("images/yinghua1.jpg")
y_img[1] = cv2.imread("images/yinghua2.jpg")
y_img[2] = cv2.imread("images/yinghua3.jpg")
y_img[3] = cv2.imread("images/yinghua4.jpg")
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开发的简单页面

最终文件:

效果图如下:

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

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

  1. 有关python下二维码识别用法及识别率对比分析

    最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...

  2. 10分钟手把手教你运用Python实现简单的人脸识别

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 前言:让我的电脑认识我 我的电脑只有认识我,才配称之为我的电脑! 今天,我们用Python实现高大上的人脸识别技术! Python里,简单的 ...

  3. Python机器学习算法 — KNN分类

    KNN简介 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.KNN分类算法属于监督学习. 最简单最初级的分类器是将全部的训练 ...

  4. python3+opencv+tkinter开发简单的人脸识别小程序

    学校里有门图像处理的课程最终需要提交一个图像处理系统, 正好之前对于opencv有些了解,就简单的写一个人脸识别小程序吧 效果图如下 笔者IDE使用Pycharm,GUI编程直接使用内置的tkinte ...

  5. 基于opencv+python的二维码识别

    花了2天时间终于把二维码识别做出来了,不过效果一般,后面会应用在ROS辅助定位上,废话少说先上图: 具体过程参考了这位大神的博客:http://blog.csdn.net/qq_25491201/ar ...

  6. python实现简单kNN

    注释写得很清楚了,熟悉了一下python的一些基本语法和numpy中的一些操作. from numpy import * import operator def createDataSet(): # ...

  7. 用python打造简单的cms识别

    代码 #!/usr/bin/env python3 # coding:utf-8 #lanxing #判断代码,判断是否安装requests库 try: import requests except: ...

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

    写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大. ...

  9. OpenCV 玩九宫格数独(二):knn 数字识别

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:刘潇龙 前言 首先需要说明,这里所说的数字识别不是手写数字识别! 但凡对机器学习有所了解的人,相信看到数 ...

随机推荐

  1. Mysql增量写入Hdfs(二) --Storm+hdfs的流式处理

    一. 概述 上一篇我们介绍了如何将数据从mysql抛到kafka,这次我们就专注于利用storm将数据写入到hdfs的过程,由于storm写入hdfs的可定制东西有些多,我们先不从kafka读取,而先 ...

  2. SQL查询获得指定格式内容

    Oracle中通过修改SQL语句,达到将查询的内容拼接为指定的字符串格式 eg: select '<ta:datagridItem id="' || lower(column_name ...

  3. 前后端分离djangorestframework——ContentType组件表

    ContentType ContentType其实django自带的,但是平时的话很少会用到,所以还是放在Djangorestframework这个部分 作用: 在实际的开发中,由于数据库量级大,所以 ...

  4. 写入Log错误日志

    第一步创建ApplicationLog类 代码: using System;using System.Collections.Generic;using System.Linq;using Syste ...

  5. VS根据数据库生成实体类

    一.在类库项目上添加新项 二. 三.依次填入数据库连接 选择数据库 就可以生成数据库实体

  6. 转:sql server锁知识及锁应用

    sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...

  7. Vue-Router的Hash说起的URL相关知识

    最近被问到VueRouter的两种模式的区别,答:Hash模式url上有#号,History模式url上没有#.完! 也不知道这么回答对不对,就看了看资料,发现也就是这个意思吧! Vue-Router ...

  8. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  9. Elastic Stack初篇-Logstash

     一.Logstash简介      Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 二.Log ...

  10. 基于 HTML5 的 WebGL 自定义 3D 摄像头监控模型

    前言 随着视频监控联网系统的不断普及和发展, 网络摄像机更多的应用于监控系统中,尤其是高清时代的来临,更加快了网络摄像机的发展和应用. 在监控摄像机数量的不断庞大的同时,在监控系统中面临着严峻的现状问 ...