一:安装OpenCV
参考博客:https://blog.youkuaiyun.com/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