您的位置:首页 > 编程语言 > Python开发

Feature Matching by using opencv(Python)-使用opencv进行图像特征匹配

2018-02-05 01:45 2226 查看
图像特征匹配是什么就不具体介绍了,今天写一下用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中对很多函
4000
数的声明进行了修改,一定要留意!!

测试图像:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息