之前我们已经介绍了SIFT算法,以及SURF算法,但是由于计算速度较慢的原因。人们提出了使用ORB来替代SIFT和SURF。与前两者相比,ORB有更快的速度。ORB在2011年才首次发布。在前面小节中,我们已经提到了ORB算法。ORB算法将基于FAST关键点的技术和基于BRIEF描述符的技术相结合,但是ORB并没有解决尺度不一致的问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能,我们通过构建高斯金字塔,然后在每一层金字塔图像上检测角点,来实现尺度不变性。ORB主要解决了BRIEF描述子不具备旋转不变性的问题.
ORB中有很多参数可以设置,在OpenCV中它可以通过ORB来创建一个ORB检测器。
cv2.ORB([nfeatures[, scaleFactor[, nlevels[, edgeThreshold[, firstLevel[, WTA_K[, scoreType[, patchSize]]]]]]]]) →
参数说明:
完整代码如下:
# -*- coding:utf-8 -*-
import os
import cv2
import numpy as np
'''
created on 09:05:10 2018-11-22
@author ren_dong
使用ORB特征匹配
'''
def orb_test():
# 加载图片 灰色
img1 = cv2.imread('orb1.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2 = cv2.imread('orb2.jpg')
img2 = cv2.resize(img2, dsize=(450, 300))
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
image1 = gray1.copy()
image2 = gray2.copy()
'''
1.使用ORB算法检测特征点、描述符
'''
orb = cv2.ORB_create(128)
keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
keypoints2, descriptors2 = orb.detectAndCompute(image2, None)
# 在图像上绘制关键点
image1 = cv2.drawKeypoints(image=image1, keypoints=keypoints1, outImage=image1, color=(255, 0, 255),
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
image2 = cv2.drawKeypoints(image=image2, keypoints=keypoints2, outImage=image2, color=(255, 0, 255),
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# 显示图像
cv2.imshow('orb_keypoints1', image1)
cv2.imshow('orb_keypoints2', image2)
cv2.waitKey(20)
'''
2、匹配
'''
##使用暴力匹配进行描述符的匹配
matcher = cv2.BFMatcher_create(cv2.HAMMING_NORM_TYPE, crossCheck=True)
matchePoints = matcher.match(descriptors1, descriptors2)
print(type(matchePoints), len(matchePoints), matchePoints[0])
# 按照距离从小到大排序,选取最优匹配的
sorted(matchePoints, key=lambda x: x.distance)
# 绘制最优匹配点
outImg = None
outImg = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matchePoints[:40], outImg, matchColor=(0, 255, 0),
flags=cv2.DRAW_MATCHES_FLAGS_DEFAULT)
cv2.imshow('matche', outImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
orb_test()
运行结果如图:
因为选择的图标相似性很明显,所以这里调用ORB进行特征匹配的效果还不错,另外想要了解更多原理的小伙伴可以去大神博客围观哦,下面是地址https://www.cnblogs.com/zyly/p/9622873.html
因为呢好不容易有点空闲时间,所以赶紧把之前几天看到相关特征匹配算法进行了汇总发布,好记性不如烂博客啊,所以可能有些地方有瑕疵,欢迎指正,另外还是要感谢一下大神哦...