OpenCV-FLANN识别

一:安装OpenCV

参考博客:https://blog.csdn.net/qq_33508087/article/details/83310357

二:学习Flann 匹配算法 

参考书籍:OpenCV3 计算机视觉-python语言实现

原理:提取数据库信息,与待匹配的数据进行 特征检测和特征匹配

需要学习SIF、ORB、Knn等算法,比较各种优点和缺点

用这个算法,可以做一个数据库搜索引擎,简单的图像识别,相似度匹配等。

三:代码

import numpy as np
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(0)

queryImage = cv2.imread('17.pgm',0)  #数据库
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(queryImage,None)

# FLANN匹配器参数
# FLANN_INDEX_KDTREE = 0
indexParams = dict(algorithm = 0, trees = 5)
searchParams = dict(checks=50)   # 或者传递空字典

flann = cv2.FlannBasedMatcher(indexParams,searchParams)
while 1:
    read,img = cap.read()
    cv2.imshow('rol',img)
    if cv2.waitKey(1000 // 12) & 0xff == ord("q"):
        cv2.imwrite('duibi.jpg',img)
        break
    trainingImage = img    #待匹配的数据

    kp2, des2 = sift.detectAndCompute(trainingImage,None)
    matches = flann.knnMatch(des1,des2,k=2)
    #print (len(matches))    #得到数据库 的轮廓数
    good = 0

    matchesMask = [[0,0] for i in range(len(matches))]

    #David G. Lowe's比值测试,填充掩模
    for i,(m,n) in enumerate(matches):
        if m.distance < 0.7*n.distance:
            good += 1               #得到匹配到的线
            matchesMask[i]=[1,0]      #掩模
            
    print (good)
    drawParams = dict(matchColor = (0,255,0),
                       singlePointColor = (255,0,0),
                       matchesMask = matchesMask,
                       flags = 0)

    resultImage = cv2.drawMatchesKnn(queryImage,kp1,trainingImage,kp2,matches,None,**drawParams)
    cv2.imshow('duibi',resultImage)
    #plt.imshow(resultImage,),plt.show()

cap.release()
cv2.destroyAllWindows()

效果展示:

缺点:速度相对人脸分类器慢,相同背景可能会造成误匹配,所以数据库一定要做好。

优点:此算法可以识别畸变的图形,类似于投影,无论待识别的图形x,y,z,轴做出怎样的变化,都能提取其特征,根据特征进行相似度匹配。而分类器中识倾斜的图形时,是根据训练数据库做比较,所以存在弊端。

有疑问者请联系:QQ:1735915513

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值