Feature Matching by using opencv(Python)-使用opencv进行图像特征匹配
图像特征匹配是什么就不具体介绍了,今天写一下用opencv进行图像特征匹配,一起解读下官方文档,写写代码来实践实践。
Docs:
http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html
官方文档说明了封装函数的用法和基本的概念:
首先:
Brute-Force(暴力算法,BF):
wiki:https://en.wikipedia.org/wiki/Brute-force_search
也就是目标模式和模版模式进行逐一比对(特征距离计算)的算法:
c ← first(P) while c ≠ Λ do if valid(P,c) then output(P, c) c ← next(P,c) end while
所以在opencv中封装了:cv.BFMatcher( )这个函数。这个函数里面有两个参数,一个是normType,一个是crossCheck。
首先第一个参数是距离的计算方法,根据匹配算法的不同,而选择不同的计算方法,默认参数为cv2.NORM_L2。
推荐的选择方法如下图:
crossCheck是一个布尔参数,当它为false的时候是默认值。当为true时返回(i,j)数值。设置好了以上参数之后,就需要注目一下BFMatcher.match() 函数了,它返回最佳的匹配结果。使用cv2.drawKeypoints() 来描绘特征点,cv2.drawMatches()可以表现出匹配结果 。使用cv2.drawMatchesKnn()当k=2时可以描绘出匹配的关系线。
接下来我们使用图片来测试一下匹配效果:
# -*- coding: utf-8 -*- import numpy as np import cv2 img = cv2.imread('imagePath1') img2 = cv2.imread('imagePath2') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #特徴量 detector = cv2.ORB_create() kp1, des1 = detector.detectAndCompute(gray, None) kp2, des2 = detector.detectAndCompute(gray2, None) #比较器 bf = cv2.BFMatcher(cv2.NORM_HAMMING) # 载入特征点 matches = bf.match(des1, des2) matches = sorted(matches, key = lambda x:x.distance) # 表示结果 h1, w1, c1 = img.shape[:3] h2, w2, c2 = img2.shape[:3] height = max([h1,h2]) width = w1 + w2 out = np.zeros((height, width, 3), np.uint8) cv2.drawMatches(img, kp1, img2, kp2, matches[:50],out, flags=0) cv2.imshow("out.jpg", out) cv2.waitKey(0)
注意:
opencv3.1.0中对很多函数的声明进行了修改,一定要留意!!
测试图像: